OpenSSL
1.0.1c
Main Page
Classes
Files
File List
File Members
All
Classes
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
crypto
ec
ecp_nist.c
Go to the documentation of this file.
1
/* crypto/ec/ecp_nist.c */
2
/*
3
* Written by Nils Larsch for the OpenSSL project.
4
*/
5
/* ====================================================================
6
* Copyright (c) 1998-2003 The OpenSSL Project. All rights reserved.
7
*
8
* Redistribution and use in source and binary forms, with or without
9
* modification, are permitted provided that the following conditions
10
* are met:
11
*
12
* 1. Redistributions of source code must retain the above copyright
13
* notice, this list of conditions and the following disclaimer.
14
*
15
* 2. Redistributions in binary form must reproduce the above copyright
16
* notice, this list of conditions and the following disclaimer in
17
* the documentation and/or other materials provided with the
18
* distribution.
19
*
20
* 3. All advertising materials mentioning features or use of this
21
* software must display the following acknowledgment:
22
* "This product includes software developed by the OpenSSL Project
23
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
24
*
25
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26
* endorse or promote products derived from this software without
27
* prior written permission. For written permission, please contact
28
*
[email protected]
.
29
*
30
* 5. Products derived from this software may not be called "OpenSSL"
31
* nor may "OpenSSL" appear in their names without prior written
32
* permission of the OpenSSL Project.
33
*
34
* 6. Redistributions of any form whatsoever must retain the following
35
* acknowledgment:
36
* "This product includes software developed by the OpenSSL Project
37
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
38
*
39
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50
* OF THE POSSIBILITY OF SUCH DAMAGE.
51
* ====================================================================
52
*
53
* This product includes cryptographic software written by Eric Young
54
* (
[email protected]
). This product includes software written by Tim
55
* Hudson (
[email protected]
).
56
*
57
*/
58
/* ====================================================================
59
* Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
60
* Portions of this software developed by SUN MICROSYSTEMS, INC.,
61
* and contributed to the OpenSSL project.
62
*/
63
64
#include <limits.h>
65
66
#include <
openssl/err.h
>
67
#include <
openssl/obj_mac.h
>
68
#include "
ec_lcl.h
"
69
70
#ifdef OPENSSL_FIPS
71
#include <openssl/fips.h>
72
#endif
73
74
const
EC_METHOD
*
EC_GFp_nist_method
(
void
)
75
{
76
#ifdef OPENSSL_FIPS
77
return
fips_ec_gfp_nist_method();
78
#else
79
static
const
EC_METHOD
ret = {
80
EC_FLAGS_DEFAULT_OCT
,
81
NID_X9_62_prime_field
,
82
ec_GFp_simple_group_init
,
83
ec_GFp_simple_group_finish
,
84
ec_GFp_simple_group_clear_finish
,
85
ec_GFp_nist_group_copy
,
86
ec_GFp_nist_group_set_curve
,
87
ec_GFp_simple_group_get_curve
,
88
ec_GFp_simple_group_get_degree
,
89
ec_GFp_simple_group_check_discriminant
,
90
ec_GFp_simple_point_init
,
91
ec_GFp_simple_point_finish
,
92
ec_GFp_simple_point_clear_finish
,
93
ec_GFp_simple_point_copy
,
94
ec_GFp_simple_point_set_to_infinity
,
95
ec_GFp_simple_set_Jprojective_coordinates_GFp
,
96
ec_GFp_simple_get_Jprojective_coordinates_GFp
,
97
ec_GFp_simple_point_set_affine_coordinates
,
98
ec_GFp_simple_point_get_affine_coordinates
,
99
0,0,0,
100
ec_GFp_simple_add
,
101
ec_GFp_simple_dbl
,
102
ec_GFp_simple_invert
,
103
ec_GFp_simple_is_at_infinity
,
104
ec_GFp_simple_is_on_curve
,
105
ec_GFp_simple_cmp
,
106
ec_GFp_simple_make_affine
,
107
ec_GFp_simple_points_make_affine
,
108
0
/* mul */
,
109
0
/* precompute_mult */
,
110
0
/* have_precompute_mult */
,
111
ec_GFp_nist_field_mul
,
112
ec_GFp_nist_field_sqr
,
113
0
/* field_div */
,
114
0
/* field_encode */
,
115
0
/* field_decode */
,
116
0
/* field_set_to_one */
};
117
118
return
&ret;
119
#endif
120
}
121
122
int
ec_GFp_nist_group_copy
(
EC_GROUP
*dest,
const
EC_GROUP
*src)
123
{
124
dest->
field_mod_func
= src->
field_mod_func
;
125
126
return
ec_GFp_simple_group_copy
(dest, src);
127
}
128
129
int
ec_GFp_nist_group_set_curve
(
EC_GROUP
*group,
const
BIGNUM
*
p
,
130
const
BIGNUM
*
a
,
const
BIGNUM
*
b
,
BN_CTX
*ctx)
131
{
132
int
ret = 0;
133
BN_CTX
*new_ctx = NULL;
134
BIGNUM
*tmp_bn;
135
136
if
(ctx == NULL)
137
if
((ctx = new_ctx =
BN_CTX_new
()) == NULL)
return
0;
138
139
BN_CTX_start
(ctx);
140
if
((tmp_bn =
BN_CTX_get
(ctx)) == NULL)
goto
err;
141
142
if
(
BN_ucmp
(
BN_get0_nist_prime_192
(), p) == 0)
143
group->
field_mod_func
=
BN_nist_mod_192
;
144
else
if
(
BN_ucmp
(
BN_get0_nist_prime_224
(), p) == 0)
145
group->
field_mod_func
=
BN_nist_mod_224
;
146
else
if
(
BN_ucmp
(
BN_get0_nist_prime_256
(), p) == 0)
147
group->
field_mod_func
=
BN_nist_mod_256
;
148
else
if
(
BN_ucmp
(
BN_get0_nist_prime_384
(), p) == 0)
149
group->
field_mod_func
=
BN_nist_mod_384
;
150
else
if
(
BN_ucmp
(
BN_get0_nist_prime_521
(), p) == 0)
151
group->
field_mod_func
=
BN_nist_mod_521
;
152
else
153
{
154
ECerr
(
EC_F_EC_GFP_NIST_GROUP_SET_CURVE
,
EC_R_NOT_A_NIST_PRIME
);
155
goto
err;
156
}
157
158
ret =
ec_GFp_simple_group_set_curve
(group, p, a, b, ctx);
159
160
err:
161
BN_CTX_end
(ctx);
162
if
(new_ctx != NULL)
163
BN_CTX_free
(new_ctx);
164
return
ret;
165
}
166
167
168
int
ec_GFp_nist_field_mul
(
const
EC_GROUP
*group,
BIGNUM
*r,
const
BIGNUM
*
a
,
169
const
BIGNUM
*
b
,
BN_CTX
*ctx)
170
{
171
int
ret=0;
172
BN_CTX
*ctx_new=NULL;
173
174
if
(!group || !r || !a || !b)
175
{
176
ECerr
(
EC_F_EC_GFP_NIST_FIELD_MUL
,
ERR_R_PASSED_NULL_PARAMETER
);
177
goto
err;
178
}
179
if
(!ctx)
180
if
((ctx_new = ctx =
BN_CTX_new
()) == NULL)
goto
err;
181
182
if
(!
BN_mul
(r, a, b, ctx))
goto
err;
183
if
(!group->
field_mod_func
(r, r, &group->
field
, ctx))
184
goto
err;
185
186
ret=1;
187
err:
188
if
(ctx_new)
189
BN_CTX_free
(ctx_new);
190
return
ret;
191
}
192
193
194
int
ec_GFp_nist_field_sqr
(
const
EC_GROUP
*group,
BIGNUM
*r,
const
BIGNUM
*
a
,
195
BN_CTX
*ctx)
196
{
197
int
ret=0;
198
BN_CTX
*ctx_new=NULL;
199
200
if
(!group || !r || !a)
201
{
202
ECerr
(
EC_F_EC_GFP_NIST_FIELD_SQR
,
EC_R_PASSED_NULL_PARAMETER
);
203
goto
err;
204
}
205
if
(!ctx)
206
if
((ctx_new = ctx =
BN_CTX_new
()) == NULL)
goto
err;
207
208
if
(!
BN_sqr
(r, a, ctx))
goto
err;
209
if
(!group->
field_mod_func
(r, r, &group->
field
, ctx))
210
goto
err;
211
212
ret=1;
213
err:
214
if
(ctx_new)
215
BN_CTX_free
(ctx_new);
216
return
ret;
217
}
Generated on Thu Jan 10 2013 09:53:36 for OpenSSL by
1.8.2