diff options
Diffstat (limited to '')
-rw-r--r-- | src/lib/libcrypto/ec/ec_asn1.c | 1208 |
1 files changed, 503 insertions, 705 deletions
diff --git a/src/lib/libcrypto/ec/ec_asn1.c b/src/lib/libcrypto/ec/ec_asn1.c index 2bde9a6a3c..70670a4c75 100644 --- a/src/lib/libcrypto/ec/ec_asn1.c +++ b/src/lib/libcrypto/ec/ec_asn1.c | |||
@@ -10,7 +10,7 @@ | |||
10 | * are met: | 10 | * are met: |
11 | * | 11 | * |
12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
14 | * | 14 | * |
15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
@@ -63,12 +63,13 @@ | |||
63 | #include <openssl/objects.h> | 63 | #include <openssl/objects.h> |
64 | 64 | ||
65 | 65 | ||
66 | int EC_GROUP_get_basis_type(const EC_GROUP *group) | 66 | int |
67 | { | 67 | EC_GROUP_get_basis_type(const EC_GROUP * group) |
68 | int i=0; | 68 | { |
69 | int i = 0; | ||
69 | 70 | ||
70 | if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) != | 71 | if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) != |
71 | NID_X9_62_characteristic_two_field) | 72 | NID_X9_62_characteristic_two_field) |
72 | /* everything else is currently not supported */ | 73 | /* everything else is currently not supported */ |
73 | return 0; | 74 | return 0; |
74 | 75 | ||
@@ -82,40 +83,38 @@ int EC_GROUP_get_basis_type(const EC_GROUP *group) | |||
82 | else | 83 | else |
83 | /* everything else is currently not supported */ | 84 | /* everything else is currently not supported */ |
84 | return 0; | 85 | return 0; |
85 | } | 86 | } |
86 | #ifndef OPENSSL_NO_EC2M | 87 | #ifndef OPENSSL_NO_EC2M |
87 | int EC_GROUP_get_trinomial_basis(const EC_GROUP *group, unsigned int *k) | 88 | int |
88 | { | 89 | EC_GROUP_get_trinomial_basis(const EC_GROUP * group, unsigned int *k) |
90 | { | ||
89 | if (group == NULL) | 91 | if (group == NULL) |
90 | return 0; | 92 | return 0; |
91 | 93 | ||
92 | if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) != | 94 | if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) != |
93 | NID_X9_62_characteristic_two_field | 95 | NID_X9_62_characteristic_two_field |
94 | || !((group->poly[0] != 0) && (group->poly[1] != 0) && (group->poly[2] == 0))) | 96 | || !((group->poly[0] != 0) && (group->poly[1] != 0) && (group->poly[2] == 0))) { |
95 | { | ||
96 | ECerr(EC_F_EC_GROUP_GET_TRINOMIAL_BASIS, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 97 | ECerr(EC_F_EC_GROUP_GET_TRINOMIAL_BASIS, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
97 | return 0; | 98 | return 0; |
98 | } | 99 | } |
99 | |||
100 | if (k) | 100 | if (k) |
101 | *k = group->poly[1]; | 101 | *k = group->poly[1]; |
102 | 102 | ||
103 | return 1; | 103 | return 1; |
104 | } | 104 | } |
105 | int EC_GROUP_get_pentanomial_basis(const EC_GROUP *group, unsigned int *k1, | 105 | int |
106 | unsigned int *k2, unsigned int *k3) | 106 | EC_GROUP_get_pentanomial_basis(const EC_GROUP * group, unsigned int *k1, |
107 | { | 107 | unsigned int *k2, unsigned int *k3) |
108 | { | ||
108 | if (group == NULL) | 109 | if (group == NULL) |
109 | return 0; | 110 | return 0; |
110 | 111 | ||
111 | if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) != | 112 | if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) != |
112 | NID_X9_62_characteristic_two_field | 113 | NID_X9_62_characteristic_two_field |
113 | || !((group->poly[0] != 0) && (group->poly[1] != 0) && (group->poly[2] != 0) && (group->poly[3] != 0) && (group->poly[4] == 0))) | 114 | || !((group->poly[0] != 0) && (group->poly[1] != 0) && (group->poly[2] != 0) && (group->poly[3] != 0) && (group->poly[4] == 0))) { |
114 | { | ||
115 | ECerr(EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 115 | ECerr(EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
116 | return 0; | 116 | return 0; |
117 | } | 117 | } |
118 | |||
119 | if (k1) | 118 | if (k1) |
120 | *k1 = group->poly[3]; | 119 | *k1 = group->poly[3]; |
121 | if (k2) | 120 | if (k2) |
@@ -124,7 +123,7 @@ int EC_GROUP_get_pentanomial_basis(const EC_GROUP *group, unsigned int *k1, | |||
124 | *k3 = group->poly[1]; | 123 | *k3 = group->poly[1]; |
125 | 124 | ||
126 | return 1; | 125 | return 1; |
127 | } | 126 | } |
128 | #endif | 127 | #endif |
129 | 128 | ||
130 | 129 | ||
@@ -133,27 +132,27 @@ typedef struct x9_62_pentanomial_st { | |||
133 | long k1; | 132 | long k1; |
134 | long k2; | 133 | long k2; |
135 | long k3; | 134 | long k3; |
136 | } X9_62_PENTANOMIAL; | 135 | } X9_62_PENTANOMIAL; |
137 | 136 | ||
138 | typedef struct x9_62_characteristic_two_st { | 137 | typedef struct x9_62_characteristic_two_st { |
139 | long m; | 138 | long m; |
140 | ASN1_OBJECT *type; | 139 | ASN1_OBJECT *type; |
141 | union { | 140 | union { |
142 | char *ptr; | 141 | char *ptr; |
143 | /* NID_X9_62_onBasis */ | 142 | /* NID_X9_62_onBasis */ |
144 | ASN1_NULL *onBasis; | 143 | ASN1_NULL *onBasis; |
145 | /* NID_X9_62_tpBasis */ | 144 | /* NID_X9_62_tpBasis */ |
146 | ASN1_INTEGER *tpBasis; | 145 | ASN1_INTEGER *tpBasis; |
147 | /* NID_X9_62_ppBasis */ | 146 | /* NID_X9_62_ppBasis */ |
148 | X9_62_PENTANOMIAL *ppBasis; | 147 | X9_62_PENTANOMIAL *ppBasis; |
149 | /* anything else */ | 148 | /* anything else */ |
150 | ASN1_TYPE *other; | 149 | ASN1_TYPE *other; |
151 | } p; | 150 | } p; |
152 | } X9_62_CHARACTERISTIC_TWO; | 151 | } X9_62_CHARACTERISTIC_TWO; |
153 | 152 | ||
154 | typedef struct x9_62_fieldid_st { | 153 | typedef struct x9_62_fieldid_st { |
155 | ASN1_OBJECT *fieldType; | 154 | ASN1_OBJECT *fieldType; |
156 | union { | 155 | union { |
157 | char *ptr; | 156 | char *ptr; |
158 | /* NID_X9_62_prime_field */ | 157 | /* NID_X9_62_prime_field */ |
159 | ASN1_INTEGER *prime; | 158 | ASN1_INTEGER *prime; |
@@ -161,40 +160,40 @@ typedef struct x9_62_fieldid_st { | |||
161 | X9_62_CHARACTERISTIC_TWO *char_two; | 160 | X9_62_CHARACTERISTIC_TWO *char_two; |
162 | /* anything else */ | 161 | /* anything else */ |
163 | ASN1_TYPE *other; | 162 | ASN1_TYPE *other; |
164 | } p; | 163 | } p; |
165 | } X9_62_FIELDID; | 164 | } X9_62_FIELDID; |
166 | 165 | ||
167 | typedef struct x9_62_curve_st { | 166 | typedef struct x9_62_curve_st { |
168 | ASN1_OCTET_STRING *a; | 167 | ASN1_OCTET_STRING *a; |
169 | ASN1_OCTET_STRING *b; | 168 | ASN1_OCTET_STRING *b; |
170 | ASN1_BIT_STRING *seed; | 169 | ASN1_BIT_STRING *seed; |
171 | } X9_62_CURVE; | 170 | } X9_62_CURVE; |
172 | 171 | ||
173 | typedef struct ec_parameters_st { | 172 | typedef struct ec_parameters_st { |
174 | long version; | 173 | long version; |
175 | X9_62_FIELDID *fieldID; | 174 | X9_62_FIELDID *fieldID; |
176 | X9_62_CURVE *curve; | 175 | X9_62_CURVE *curve; |
177 | ASN1_OCTET_STRING *base; | 176 | ASN1_OCTET_STRING *base; |
178 | ASN1_INTEGER *order; | 177 | ASN1_INTEGER *order; |
179 | ASN1_INTEGER *cofactor; | 178 | ASN1_INTEGER *cofactor; |
180 | } ECPARAMETERS; | 179 | } ECPARAMETERS; |
181 | 180 | ||
182 | struct ecpk_parameters_st { | 181 | struct ecpk_parameters_st { |
183 | int type; | 182 | int type; |
184 | union { | 183 | union { |
185 | ASN1_OBJECT *named_curve; | 184 | ASN1_OBJECT *named_curve; |
186 | ECPARAMETERS *parameters; | 185 | ECPARAMETERS *parameters; |
187 | ASN1_NULL *implicitlyCA; | 186 | ASN1_NULL *implicitlyCA; |
188 | } value; | 187 | } value; |
189 | }/* ECPKPARAMETERS */; | 188 | } /* ECPKPARAMETERS */ ; |
190 | 189 | ||
191 | /* SEC1 ECPrivateKey */ | 190 | /* SEC1 ECPrivateKey */ |
192 | typedef struct ec_privatekey_st { | 191 | typedef struct ec_privatekey_st { |
193 | long version; | 192 | long version; |
194 | ASN1_OCTET_STRING *privateKey; | 193 | ASN1_OCTET_STRING *privateKey; |
195 | ECPKPARAMETERS *parameters; | 194 | ECPKPARAMETERS *parameters; |
196 | ASN1_BIT_STRING *publicKey; | 195 | ASN1_BIT_STRING *publicKey; |
197 | } EC_PRIVATEKEY; | 196 | } EC_PRIVATEKEY; |
198 | 197 | ||
199 | /* the OpenSSL ASN.1 definitions */ | 198 | /* the OpenSSL ASN.1 definitions */ |
200 | ASN1_SEQUENCE(X9_62_PENTANOMIAL) = { | 199 | ASN1_SEQUENCE(X9_62_PENTANOMIAL) = { |
@@ -219,10 +218,8 @@ ASN1_SEQUENCE(X9_62_CHARACTERISTIC_TWO) = { | |||
219 | ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO, type, ASN1_OBJECT), | 218 | ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO, type, ASN1_OBJECT), |
220 | ASN1_ADB_OBJECT(X9_62_CHARACTERISTIC_TWO) | 219 | ASN1_ADB_OBJECT(X9_62_CHARACTERISTIC_TWO) |
221 | } ASN1_SEQUENCE_END(X9_62_CHARACTERISTIC_TWO) | 220 | } ASN1_SEQUENCE_END(X9_62_CHARACTERISTIC_TWO) |
222 | |||
223 | DECLARE_ASN1_ALLOC_FUNCTIONS(X9_62_CHARACTERISTIC_TWO) | 221 | DECLARE_ASN1_ALLOC_FUNCTIONS(X9_62_CHARACTERISTIC_TWO) |
224 | IMPLEMENT_ASN1_ALLOC_FUNCTIONS(X9_62_CHARACTERISTIC_TWO) | 222 | IMPLEMENT_ASN1_ALLOC_FUNCTIONS(X9_62_CHARACTERISTIC_TWO) |
225 | |||
226 | ASN1_ADB_TEMPLATE(fieldID_def) = ASN1_SIMPLE(X9_62_FIELDID, p.other, ASN1_ANY); | 223 | ASN1_ADB_TEMPLATE(fieldID_def) = ASN1_SIMPLE(X9_62_FIELDID, p.other, ASN1_ANY); |
227 | 224 | ||
228 | ASN1_ADB(X9_62_FIELDID) = { | 225 | ASN1_ADB(X9_62_FIELDID) = { |
@@ -249,7 +246,6 @@ ASN1_SEQUENCE(ECPARAMETERS) = { | |||
249 | ASN1_SIMPLE(ECPARAMETERS, order, ASN1_INTEGER), | 246 | ASN1_SIMPLE(ECPARAMETERS, order, ASN1_INTEGER), |
250 | ASN1_OPT(ECPARAMETERS, cofactor, ASN1_INTEGER) | 247 | ASN1_OPT(ECPARAMETERS, cofactor, ASN1_INTEGER) |
251 | } ASN1_SEQUENCE_END(ECPARAMETERS) | 248 | } ASN1_SEQUENCE_END(ECPARAMETERS) |
252 | |||
253 | DECLARE_ASN1_ALLOC_FUNCTIONS(ECPARAMETERS) | 249 | DECLARE_ASN1_ALLOC_FUNCTIONS(ECPARAMETERS) |
254 | IMPLEMENT_ASN1_ALLOC_FUNCTIONS(ECPARAMETERS) | 250 | IMPLEMENT_ASN1_ALLOC_FUNCTIONS(ECPARAMETERS) |
255 | 251 | ||
@@ -258,7 +254,6 @@ ASN1_CHOICE(ECPKPARAMETERS) = { | |||
258 | ASN1_SIMPLE(ECPKPARAMETERS, value.parameters, ECPARAMETERS), | 254 | ASN1_SIMPLE(ECPKPARAMETERS, value.parameters, ECPARAMETERS), |
259 | ASN1_SIMPLE(ECPKPARAMETERS, value.implicitlyCA, ASN1_NULL) | 255 | ASN1_SIMPLE(ECPKPARAMETERS, value.implicitlyCA, ASN1_NULL) |
260 | } ASN1_CHOICE_END(ECPKPARAMETERS) | 256 | } ASN1_CHOICE_END(ECPKPARAMETERS) |
261 | |||
262 | DECLARE_ASN1_FUNCTIONS_const(ECPKPARAMETERS) | 257 | DECLARE_ASN1_FUNCTIONS_const(ECPKPARAMETERS) |
263 | DECLARE_ASN1_ENCODE_FUNCTIONS_const(ECPKPARAMETERS, ECPKPARAMETERS) | 258 | DECLARE_ASN1_ENCODE_FUNCTIONS_const(ECPKPARAMETERS, ECPKPARAMETERS) |
264 | IMPLEMENT_ASN1_FUNCTIONS_const(ECPKPARAMETERS) | 259 | IMPLEMENT_ASN1_FUNCTIONS_const(ECPKPARAMETERS) |
@@ -269,39 +264,38 @@ ASN1_SEQUENCE(EC_PRIVATEKEY) = { | |||
269 | ASN1_EXP_OPT(EC_PRIVATEKEY, parameters, ECPKPARAMETERS, 0), | 264 | ASN1_EXP_OPT(EC_PRIVATEKEY, parameters, ECPKPARAMETERS, 0), |
270 | ASN1_EXP_OPT(EC_PRIVATEKEY, publicKey, ASN1_BIT_STRING, 1) | 265 | ASN1_EXP_OPT(EC_PRIVATEKEY, publicKey, ASN1_BIT_STRING, 1) |
271 | } ASN1_SEQUENCE_END(EC_PRIVATEKEY) | 266 | } ASN1_SEQUENCE_END(EC_PRIVATEKEY) |
272 | |||
273 | DECLARE_ASN1_FUNCTIONS_const(EC_PRIVATEKEY) | 267 | DECLARE_ASN1_FUNCTIONS_const(EC_PRIVATEKEY) |
274 | DECLARE_ASN1_ENCODE_FUNCTIONS_const(EC_PRIVATEKEY, EC_PRIVATEKEY) | 268 | DECLARE_ASN1_ENCODE_FUNCTIONS_const(EC_PRIVATEKEY, EC_PRIVATEKEY) |
275 | IMPLEMENT_ASN1_FUNCTIONS_const(EC_PRIVATEKEY) | 269 | IMPLEMENT_ASN1_FUNCTIONS_const(EC_PRIVATEKEY) |
276 | |||
277 | /* some declarations of internal function */ | 270 | /* some declarations of internal function */ |
278 | 271 | ||
279 | /* ec_asn1_group2field() sets the values in a X9_62_FIELDID object */ | 272 | /* ec_asn1_group2field() sets the values in a X9_62_FIELDID object */ |
280 | static int ec_asn1_group2fieldid(const EC_GROUP *, X9_62_FIELDID *); | 273 | static int ec_asn1_group2fieldid(const EC_GROUP *, X9_62_FIELDID *); |
281 | /* ec_asn1_group2curve() sets the values in a X9_62_CURVE object */ | 274 | /* ec_asn1_group2curve() sets the values in a X9_62_CURVE object */ |
282 | static int ec_asn1_group2curve(const EC_GROUP *, X9_62_CURVE *); | 275 | static int ec_asn1_group2curve(const EC_GROUP *, X9_62_CURVE *); |
283 | /* ec_asn1_parameters2group() creates a EC_GROUP object from a | 276 | /* ec_asn1_parameters2group() creates a EC_GROUP object from a |
284 | * ECPARAMETERS object */ | 277 | * ECPARAMETERS object */ |
285 | static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *); | 278 | static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *); |
286 | /* ec_asn1_group2parameters() creates a ECPARAMETERS object from a | 279 | /* ec_asn1_group2parameters() creates a ECPARAMETERS object from a |
287 | * EC_GROUP object */ | 280 | * EC_GROUP object */ |
288 | static ECPARAMETERS *ec_asn1_group2parameters(const EC_GROUP *,ECPARAMETERS *); | 281 | static ECPARAMETERS *ec_asn1_group2parameters(const EC_GROUP *, ECPARAMETERS *); |
289 | /* ec_asn1_pkparameters2group() creates a EC_GROUP object from a | 282 | /* ec_asn1_pkparameters2group() creates a EC_GROUP object from a |
290 | * ECPKPARAMETERS object */ | 283 | * ECPKPARAMETERS object */ |
291 | static EC_GROUP *ec_asn1_pkparameters2group(const ECPKPARAMETERS *); | 284 | static EC_GROUP *ec_asn1_pkparameters2group(const ECPKPARAMETERS *); |
292 | /* ec_asn1_group2pkparameters() creates a ECPKPARAMETERS object from a | 285 | /* ec_asn1_group2pkparameters() creates a ECPKPARAMETERS object from a |
293 | * EC_GROUP object */ | 286 | * EC_GROUP object */ |
294 | static ECPKPARAMETERS *ec_asn1_group2pkparameters(const EC_GROUP *, | 287 | static ECPKPARAMETERS *ec_asn1_group2pkparameters(const EC_GROUP *, |
295 | ECPKPARAMETERS *); | 288 | ECPKPARAMETERS *); |
296 | 289 | ||
297 | 290 | ||
298 | /* the function definitions */ | 291 | /* the function definitions */ |
299 | 292 | ||
300 | static int ec_asn1_group2fieldid(const EC_GROUP *group, X9_62_FIELDID *field) | 293 | static int |
301 | { | 294 | ec_asn1_group2fieldid(const EC_GROUP * group, X9_62_FIELDID * field) |
302 | int ok=0, nid; | 295 | { |
303 | BIGNUM *tmp = NULL; | 296 | int ok = 0, nid; |
304 | 297 | BIGNUM *tmp = NULL; | |
298 | |||
305 | if (group == NULL || field == NULL) | 299 | if (group == NULL || field == NULL) |
306 | return 0; | 300 | return 0; |
307 | 301 | ||
@@ -313,248 +307,203 @@ static int ec_asn1_group2fieldid(const EC_GROUP *group, X9_62_FIELDID *field) | |||
313 | 307 | ||
314 | nid = EC_METHOD_get_field_type(EC_GROUP_method_of(group)); | 308 | nid = EC_METHOD_get_field_type(EC_GROUP_method_of(group)); |
315 | /* set OID for the field */ | 309 | /* set OID for the field */ |
316 | if ((field->fieldType = OBJ_nid2obj(nid)) == NULL) | 310 | if ((field->fieldType = OBJ_nid2obj(nid)) == NULL) { |
317 | { | ||
318 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_OBJ_LIB); | 311 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_OBJ_LIB); |
319 | goto err; | 312 | goto err; |
320 | } | 313 | } |
321 | 314 | if (nid == NID_X9_62_prime_field) { | |
322 | if (nid == NID_X9_62_prime_field) | 315 | if ((tmp = BN_new()) == NULL) { |
323 | { | ||
324 | if ((tmp = BN_new()) == NULL) | ||
325 | { | ||
326 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); | 316 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); |
327 | goto err; | 317 | goto err; |
328 | } | 318 | } |
329 | /* the parameters are specified by the prime number p */ | 319 | /* the parameters are specified by the prime number p */ |
330 | if (!EC_GROUP_get_curve_GFp(group, tmp, NULL, NULL, NULL)) | 320 | if (!EC_GROUP_get_curve_GFp(group, tmp, NULL, NULL, NULL)) { |
331 | { | ||
332 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_EC_LIB); | 321 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_EC_LIB); |
333 | goto err; | 322 | goto err; |
334 | } | 323 | } |
335 | /* set the prime number */ | 324 | /* set the prime number */ |
336 | field->p.prime = BN_to_ASN1_INTEGER(tmp,NULL); | 325 | field->p.prime = BN_to_ASN1_INTEGER(tmp, NULL); |
337 | if (field->p.prime == NULL) | 326 | if (field->p.prime == NULL) { |
338 | { | ||
339 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_ASN1_LIB); | 327 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_ASN1_LIB); |
340 | goto err; | 328 | goto err; |
341 | } | ||
342 | } | 329 | } |
343 | else /* nid == NID_X9_62_characteristic_two_field */ | 330 | } else /* nid == NID_X9_62_characteristic_two_field */ |
344 | #ifdef OPENSSL_NO_EC2M | 331 | #ifdef OPENSSL_NO_EC2M |
345 | { | 332 | { |
346 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, EC_R_GF2M_NOT_SUPPORTED); | 333 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, EC_R_GF2M_NOT_SUPPORTED); |
347 | goto err; | 334 | goto err; |
348 | } | 335 | } |
349 | #else | 336 | #else |
350 | { | 337 | { |
351 | int field_type; | 338 | int field_type; |
352 | X9_62_CHARACTERISTIC_TWO *char_two; | 339 | X9_62_CHARACTERISTIC_TWO *char_two; |
353 | 340 | ||
354 | field->p.char_two = X9_62_CHARACTERISTIC_TWO_new(); | 341 | field->p.char_two = X9_62_CHARACTERISTIC_TWO_new(); |
355 | char_two = field->p.char_two; | 342 | char_two = field->p.char_two; |
356 | 343 | ||
357 | if (char_two == NULL) | 344 | if (char_two == NULL) { |
358 | { | ||
359 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); | 345 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); |
360 | goto err; | 346 | goto err; |
361 | } | 347 | } |
362 | 348 | char_two->m = (long) EC_GROUP_get_degree(group); | |
363 | char_two->m = (long)EC_GROUP_get_degree(group); | ||
364 | 349 | ||
365 | field_type = EC_GROUP_get_basis_type(group); | 350 | field_type = EC_GROUP_get_basis_type(group); |
366 | 351 | ||
367 | if (field_type == 0) | 352 | if (field_type == 0) { |
368 | { | ||
369 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_EC_LIB); | 353 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_EC_LIB); |
370 | goto err; | 354 | goto err; |
371 | } | 355 | } |
372 | /* set base type OID */ | 356 | /* set base type OID */ |
373 | if ((char_two->type = OBJ_nid2obj(field_type)) == NULL) | 357 | if ((char_two->type = OBJ_nid2obj(field_type)) == NULL) { |
374 | { | ||
375 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_OBJ_LIB); | 358 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_OBJ_LIB); |
376 | goto err; | 359 | goto err; |
377 | } | 360 | } |
378 | 361 | if (field_type == NID_X9_62_tpBasis) { | |
379 | if (field_type == NID_X9_62_tpBasis) | ||
380 | { | ||
381 | unsigned int k; | 362 | unsigned int k; |
382 | 363 | ||
383 | if (!EC_GROUP_get_trinomial_basis(group, &k)) | 364 | if (!EC_GROUP_get_trinomial_basis(group, &k)) |
384 | goto err; | 365 | goto err; |
385 | 366 | ||
386 | char_two->p.tpBasis = ASN1_INTEGER_new(); | 367 | char_two->p.tpBasis = ASN1_INTEGER_new(); |
387 | if (!char_two->p.tpBasis) | 368 | if (!char_two->p.tpBasis) { |
388 | { | ||
389 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); | 369 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); |
390 | goto err; | 370 | goto err; |
391 | } | 371 | } |
392 | if (!ASN1_INTEGER_set(char_two->p.tpBasis, (long)k)) | 372 | if (!ASN1_INTEGER_set(char_two->p.tpBasis, (long) k)) { |
393 | { | ||
394 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, | 373 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, |
395 | ERR_R_ASN1_LIB); | 374 | ERR_R_ASN1_LIB); |
396 | goto err; | 375 | goto err; |
397 | } | ||
398 | } | 376 | } |
399 | else if (field_type == NID_X9_62_ppBasis) | 377 | } else if (field_type == NID_X9_62_ppBasis) { |
400 | { | ||
401 | unsigned int k1, k2, k3; | 378 | unsigned int k1, k2, k3; |
402 | 379 | ||
403 | if (!EC_GROUP_get_pentanomial_basis(group, &k1, &k2, &k3)) | 380 | if (!EC_GROUP_get_pentanomial_basis(group, &k1, &k2, &k3)) |
404 | goto err; | 381 | goto err; |
405 | 382 | ||
406 | char_two->p.ppBasis = X9_62_PENTANOMIAL_new(); | 383 | char_two->p.ppBasis = X9_62_PENTANOMIAL_new(); |
407 | if (!char_two->p.ppBasis) | 384 | if (!char_two->p.ppBasis) { |
408 | { | ||
409 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); | 385 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); |
410 | goto err; | 386 | goto err; |
411 | } | ||
412 | |||
413 | /* set k? values */ | ||
414 | char_two->p.ppBasis->k1 = (long)k1; | ||
415 | char_two->p.ppBasis->k2 = (long)k2; | ||
416 | char_two->p.ppBasis->k3 = (long)k3; | ||
417 | } | 387 | } |
418 | else /* field_type == NID_X9_62_onBasis */ | 388 | /* set k? values */ |
419 | { | 389 | char_two->p.ppBasis->k1 = (long) k1; |
390 | char_two->p.ppBasis->k2 = (long) k2; | ||
391 | char_two->p.ppBasis->k3 = (long) k3; | ||
392 | } else { /* field_type == NID_X9_62_onBasis */ | ||
420 | /* for ONB the parameters are (asn1) NULL */ | 393 | /* for ONB the parameters are (asn1) NULL */ |
421 | char_two->p.onBasis = ASN1_NULL_new(); | 394 | char_two->p.onBasis = ASN1_NULL_new(); |
422 | if (!char_two->p.onBasis) | 395 | if (!char_two->p.onBasis) { |
423 | { | ||
424 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); | 396 | ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); |
425 | goto err; | 397 | goto err; |
426 | } | ||
427 | } | 398 | } |
428 | } | 399 | } |
400 | } | ||
429 | #endif | 401 | #endif |
430 | 402 | ||
431 | ok = 1; | 403 | ok = 1; |
432 | 404 | ||
433 | err : if (tmp) | 405 | err: if (tmp) |
434 | BN_free(tmp); | 406 | BN_free(tmp); |
435 | return(ok); | 407 | return (ok); |
436 | } | 408 | } |
437 | 409 | ||
438 | static int ec_asn1_group2curve(const EC_GROUP *group, X9_62_CURVE *curve) | 410 | static int |
439 | { | 411 | ec_asn1_group2curve(const EC_GROUP * group, X9_62_CURVE * curve) |
440 | int ok=0, nid; | 412 | { |
441 | BIGNUM *tmp_1=NULL, *tmp_2=NULL; | 413 | int ok = 0, nid; |
442 | unsigned char *buffer_1=NULL, *buffer_2=NULL, | 414 | BIGNUM *tmp_1 = NULL, *tmp_2 = NULL; |
443 | *a_buf=NULL, *b_buf=NULL; | 415 | unsigned char *buffer_1 = NULL, *buffer_2 = NULL, *a_buf = NULL, |
444 | size_t len_1, len_2; | 416 | *b_buf = NULL; |
417 | size_t len_1, len_2; | ||
445 | unsigned char char_zero = 0; | 418 | unsigned char char_zero = 0; |
446 | 419 | ||
447 | if (!group || !curve || !curve->a || !curve->b) | 420 | if (!group || !curve || !curve->a || !curve->b) |
448 | return 0; | 421 | return 0; |
449 | 422 | ||
450 | if ((tmp_1 = BN_new()) == NULL || (tmp_2 = BN_new()) == NULL) | 423 | if ((tmp_1 = BN_new()) == NULL || (tmp_2 = BN_new()) == NULL) { |
451 | { | ||
452 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_MALLOC_FAILURE); | 424 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_MALLOC_FAILURE); |
453 | goto err; | 425 | goto err; |
454 | } | 426 | } |
455 | |||
456 | nid = EC_METHOD_get_field_type(EC_GROUP_method_of(group)); | 427 | nid = EC_METHOD_get_field_type(EC_GROUP_method_of(group)); |
457 | 428 | ||
458 | /* get a and b */ | 429 | /* get a and b */ |
459 | if (nid == NID_X9_62_prime_field) | 430 | if (nid == NID_X9_62_prime_field) { |
460 | { | 431 | if (!EC_GROUP_get_curve_GFp(group, NULL, tmp_1, tmp_2, NULL)) { |
461 | if (!EC_GROUP_get_curve_GFp(group, NULL, tmp_1, tmp_2, NULL)) | ||
462 | { | ||
463 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_EC_LIB); | 432 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_EC_LIB); |
464 | goto err; | 433 | goto err; |
465 | } | ||
466 | } | 434 | } |
435 | } | ||
467 | #ifndef OPENSSL_NO_EC2M | 436 | #ifndef OPENSSL_NO_EC2M |
468 | else /* nid == NID_X9_62_characteristic_two_field */ | 437 | else { /* nid == NID_X9_62_characteristic_two_field */ |
469 | { | 438 | if (!EC_GROUP_get_curve_GF2m(group, NULL, tmp_1, tmp_2, NULL)) { |
470 | if (!EC_GROUP_get_curve_GF2m(group, NULL, tmp_1, tmp_2, NULL)) | ||
471 | { | ||
472 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_EC_LIB); | 439 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_EC_LIB); |
473 | goto err; | 440 | goto err; |
474 | } | ||
475 | } | 441 | } |
442 | } | ||
476 | #endif | 443 | #endif |
477 | len_1 = (size_t)BN_num_bytes(tmp_1); | 444 | len_1 = (size_t) BN_num_bytes(tmp_1); |
478 | len_2 = (size_t)BN_num_bytes(tmp_2); | 445 | len_2 = (size_t) BN_num_bytes(tmp_2); |
479 | 446 | ||
480 | if (len_1 == 0) | 447 | if (len_1 == 0) { |
481 | { | ||
482 | /* len_1 == 0 => a == 0 */ | 448 | /* len_1 == 0 => a == 0 */ |
483 | a_buf = &char_zero; | 449 | a_buf = &char_zero; |
484 | len_1 = 1; | 450 | len_1 = 1; |
485 | } | 451 | } else { |
486 | else | 452 | if ((buffer_1 = malloc(len_1)) == NULL) { |
487 | { | ||
488 | if ((buffer_1 = malloc(len_1)) == NULL) | ||
489 | { | ||
490 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, | 453 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, |
491 | ERR_R_MALLOC_FAILURE); | 454 | ERR_R_MALLOC_FAILURE); |
492 | goto err; | 455 | goto err; |
493 | } | 456 | } |
494 | if ( (len_1 = BN_bn2bin(tmp_1, buffer_1)) == 0) | 457 | if ((len_1 = BN_bn2bin(tmp_1, buffer_1)) == 0) { |
495 | { | ||
496 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_BN_LIB); | 458 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_BN_LIB); |
497 | goto err; | 459 | goto err; |
498 | } | ||
499 | a_buf = buffer_1; | ||
500 | } | 460 | } |
461 | a_buf = buffer_1; | ||
462 | } | ||
501 | 463 | ||
502 | if (len_2 == 0) | 464 | if (len_2 == 0) { |
503 | { | ||
504 | /* len_2 == 0 => b == 0 */ | 465 | /* len_2 == 0 => b == 0 */ |
505 | b_buf = &char_zero; | 466 | b_buf = &char_zero; |
506 | len_2 = 1; | 467 | len_2 = 1; |
507 | } | 468 | } else { |
508 | else | 469 | if ((buffer_2 = malloc(len_2)) == NULL) { |
509 | { | ||
510 | if ((buffer_2 = malloc(len_2)) == NULL) | ||
511 | { | ||
512 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, | 470 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, |
513 | ERR_R_MALLOC_FAILURE); | 471 | ERR_R_MALLOC_FAILURE); |
514 | goto err; | 472 | goto err; |
515 | } | 473 | } |
516 | if ( (len_2 = BN_bn2bin(tmp_2, buffer_2)) == 0) | 474 | if ((len_2 = BN_bn2bin(tmp_2, buffer_2)) == 0) { |
517 | { | ||
518 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_BN_LIB); | 475 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_BN_LIB); |
519 | goto err; | 476 | goto err; |
520 | } | ||
521 | b_buf = buffer_2; | ||
522 | } | 477 | } |
523 | 478 | b_buf = buffer_2; | |
479 | } | ||
480 | |||
524 | /* set a and b */ | 481 | /* set a and b */ |
525 | if (!M_ASN1_OCTET_STRING_set(curve->a, a_buf, len_1) || | 482 | if (!M_ASN1_OCTET_STRING_set(curve->a, a_buf, len_1) || |
526 | !M_ASN1_OCTET_STRING_set(curve->b, b_buf, len_2)) | 483 | !M_ASN1_OCTET_STRING_set(curve->b, b_buf, len_2)) { |
527 | { | ||
528 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_ASN1_LIB); | 484 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_ASN1_LIB); |
529 | goto err; | 485 | goto err; |
530 | } | 486 | } |
531 | |||
532 | /* set the seed (optional) */ | 487 | /* set the seed (optional) */ |
533 | if (group->seed) | 488 | if (group->seed) { |
534 | { | ||
535 | if (!curve->seed) | 489 | if (!curve->seed) |
536 | if ((curve->seed = ASN1_BIT_STRING_new()) == NULL) | 490 | if ((curve->seed = ASN1_BIT_STRING_new()) == NULL) { |
537 | { | ||
538 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_MALLOC_FAILURE); | 491 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_MALLOC_FAILURE); |
539 | goto err; | 492 | goto err; |
540 | } | 493 | } |
541 | curve->seed->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07); | 494 | curve->seed->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); |
542 | curve->seed->flags |= ASN1_STRING_FLAG_BITS_LEFT; | 495 | curve->seed->flags |= ASN1_STRING_FLAG_BITS_LEFT; |
543 | if (!ASN1_BIT_STRING_set(curve->seed, group->seed, | 496 | if (!ASN1_BIT_STRING_set(curve->seed, group->seed, |
544 | (int)group->seed_len)) | 497 | (int) group->seed_len)) { |
545 | { | ||
546 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_ASN1_LIB); | 498 | ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_ASN1_LIB); |
547 | goto err; | 499 | goto err; |
548 | } | ||
549 | } | 500 | } |
550 | else | 501 | } else { |
551 | { | 502 | if (curve->seed) { |
552 | if (curve->seed) | ||
553 | { | ||
554 | ASN1_BIT_STRING_free(curve->seed); | 503 | ASN1_BIT_STRING_free(curve->seed); |
555 | curve->seed = NULL; | 504 | curve->seed = NULL; |
556 | } | ||
557 | } | 505 | } |
506 | } | ||
558 | 507 | ||
559 | ok = 1; | 508 | ok = 1; |
560 | 509 | ||
@@ -566,880 +515,729 @@ err: if (buffer_1) | |||
566 | BN_free(tmp_1); | 515 | BN_free(tmp_1); |
567 | if (tmp_2) | 516 | if (tmp_2) |
568 | BN_free(tmp_2); | 517 | BN_free(tmp_2); |
569 | return(ok); | 518 | return (ok); |
570 | } | 519 | } |
571 | 520 | ||
572 | static ECPARAMETERS *ec_asn1_group2parameters(const EC_GROUP *group, | 521 | static ECPARAMETERS * |
573 | ECPARAMETERS *param) | 522 | ec_asn1_group2parameters(const EC_GROUP * group, ECPARAMETERS * param) |
574 | { | 523 | { |
575 | int ok=0; | 524 | int ok = 0; |
576 | size_t len=0; | 525 | size_t len = 0; |
577 | ECPARAMETERS *ret=NULL; | 526 | ECPARAMETERS *ret = NULL; |
578 | BIGNUM *tmp=NULL; | 527 | BIGNUM *tmp = NULL; |
579 | unsigned char *buffer=NULL; | 528 | unsigned char *buffer = NULL; |
580 | const EC_POINT *point=NULL; | 529 | const EC_POINT *point = NULL; |
581 | point_conversion_form_t form; | 530 | point_conversion_form_t form; |
582 | 531 | ||
583 | if ((tmp = BN_new()) == NULL) | 532 | if ((tmp = BN_new()) == NULL) { |
584 | { | ||
585 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_MALLOC_FAILURE); | 533 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_MALLOC_FAILURE); |
586 | goto err; | 534 | goto err; |
587 | } | ||
588 | |||
589 | if (param == NULL) | ||
590 | { | ||
591 | if ((ret = ECPARAMETERS_new()) == NULL) | ||
592 | { | ||
593 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, | ||
594 | ERR_R_MALLOC_FAILURE); | ||
595 | goto err; | ||
596 | } | ||
597 | } | 535 | } |
598 | else | 536 | if (param == NULL) { |
537 | if ((ret = ECPARAMETERS_new()) == NULL) { | ||
538 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, | ||
539 | ERR_R_MALLOC_FAILURE); | ||
540 | goto err; | ||
541 | } | ||
542 | } else | ||
599 | ret = param; | 543 | ret = param; |
600 | 544 | ||
601 | /* set the version (always one) */ | 545 | /* set the version (always one) */ |
602 | ret->version = (long)0x1; | 546 | ret->version = (long) 0x1; |
603 | 547 | ||
604 | /* set the fieldID */ | 548 | /* set the fieldID */ |
605 | if (!ec_asn1_group2fieldid(group, ret->fieldID)) | 549 | if (!ec_asn1_group2fieldid(group, ret->fieldID)) { |
606 | { | ||
607 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB); | 550 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB); |
608 | goto err; | 551 | goto err; |
609 | } | 552 | } |
610 | |||
611 | /* set the curve */ | 553 | /* set the curve */ |
612 | if (!ec_asn1_group2curve(group, ret->curve)) | 554 | if (!ec_asn1_group2curve(group, ret->curve)) { |
613 | { | ||
614 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB); | 555 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB); |
615 | goto err; | 556 | goto err; |
616 | } | 557 | } |
617 | |||
618 | /* set the base point */ | 558 | /* set the base point */ |
619 | if ((point = EC_GROUP_get0_generator(group)) == NULL) | 559 | if ((point = EC_GROUP_get0_generator(group)) == NULL) { |
620 | { | ||
621 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, EC_R_UNDEFINED_GENERATOR); | 560 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, EC_R_UNDEFINED_GENERATOR); |
622 | goto err; | 561 | goto err; |
623 | } | 562 | } |
624 | |||
625 | form = EC_GROUP_get_point_conversion_form(group); | 563 | form = EC_GROUP_get_point_conversion_form(group); |
626 | 564 | ||
627 | len = EC_POINT_point2oct(group, point, form, NULL, len, NULL); | 565 | len = EC_POINT_point2oct(group, point, form, NULL, len, NULL); |
628 | if (len == 0) | 566 | if (len == 0) { |
629 | { | ||
630 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB); | 567 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB); |
631 | goto err; | 568 | goto err; |
632 | } | 569 | } |
633 | if ((buffer = malloc(len)) == NULL) | 570 | if ((buffer = malloc(len)) == NULL) { |
634 | { | ||
635 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_MALLOC_FAILURE); | 571 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_MALLOC_FAILURE); |
636 | goto err; | 572 | goto err; |
637 | } | 573 | } |
638 | if (!EC_POINT_point2oct(group, point, form, buffer, len, NULL)) | 574 | if (!EC_POINT_point2oct(group, point, form, buffer, len, NULL)) { |
639 | { | ||
640 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB); | 575 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB); |
641 | goto err; | 576 | goto err; |
642 | } | 577 | } |
643 | if (ret->base == NULL && (ret->base = ASN1_OCTET_STRING_new()) == NULL) | 578 | if (ret->base == NULL && (ret->base = ASN1_OCTET_STRING_new()) == NULL) { |
644 | { | ||
645 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_MALLOC_FAILURE); | 579 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_MALLOC_FAILURE); |
646 | goto err; | 580 | goto err; |
647 | } | 581 | } |
648 | if (!ASN1_OCTET_STRING_set(ret->base, buffer, len)) | 582 | if (!ASN1_OCTET_STRING_set(ret->base, buffer, len)) { |
649 | { | ||
650 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_ASN1_LIB); | 583 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_ASN1_LIB); |
651 | goto err; | 584 | goto err; |
652 | } | 585 | } |
653 | |||
654 | /* set the order */ | 586 | /* set the order */ |
655 | if (!EC_GROUP_get_order(group, tmp, NULL)) | 587 | if (!EC_GROUP_get_order(group, tmp, NULL)) { |
656 | { | ||
657 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB); | 588 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB); |
658 | goto err; | 589 | goto err; |
659 | } | 590 | } |
660 | ret->order = BN_to_ASN1_INTEGER(tmp, ret->order); | 591 | ret->order = BN_to_ASN1_INTEGER(tmp, ret->order); |
661 | if (ret->order == NULL) | 592 | if (ret->order == NULL) { |
662 | { | ||
663 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_ASN1_LIB); | 593 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_ASN1_LIB); |
664 | goto err; | 594 | goto err; |
665 | } | 595 | } |
666 | |||
667 | /* set the cofactor (optional) */ | 596 | /* set the cofactor (optional) */ |
668 | if (EC_GROUP_get_cofactor(group, tmp, NULL)) | 597 | if (EC_GROUP_get_cofactor(group, tmp, NULL)) { |
669 | { | ||
670 | ret->cofactor = BN_to_ASN1_INTEGER(tmp, ret->cofactor); | 598 | ret->cofactor = BN_to_ASN1_INTEGER(tmp, ret->cofactor); |
671 | if (ret->cofactor == NULL) | 599 | if (ret->cofactor == NULL) { |
672 | { | ||
673 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_ASN1_LIB); | 600 | ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_ASN1_LIB); |
674 | goto err; | 601 | goto err; |
675 | } | ||
676 | } | 602 | } |
677 | 603 | } | |
678 | ok = 1; | 604 | ok = 1; |
679 | 605 | ||
680 | err : if(!ok) | 606 | err: if (!ok) { |
681 | { | ||
682 | if (ret && !param) | 607 | if (ret && !param) |
683 | ECPARAMETERS_free(ret); | 608 | ECPARAMETERS_free(ret); |
684 | ret = NULL; | 609 | ret = NULL; |
685 | } | 610 | } |
686 | if (tmp) | 611 | if (tmp) |
687 | BN_free(tmp); | 612 | BN_free(tmp); |
688 | if (buffer) | 613 | if (buffer) |
689 | free(buffer); | 614 | free(buffer); |
690 | return(ret); | 615 | return (ret); |
691 | } | 616 | } |
692 | 617 | ||
693 | ECPKPARAMETERS *ec_asn1_group2pkparameters(const EC_GROUP *group, | 618 | ECPKPARAMETERS * |
694 | ECPKPARAMETERS *params) | 619 | ec_asn1_group2pkparameters(const EC_GROUP * group, ECPKPARAMETERS * params) |
695 | { | 620 | { |
696 | int ok = 1, tmp; | 621 | int ok = 1, tmp; |
697 | ECPKPARAMETERS *ret = params; | 622 | ECPKPARAMETERS *ret = params; |
698 | 623 | ||
699 | if (ret == NULL) | 624 | if (ret == NULL) { |
700 | { | 625 | if ((ret = ECPKPARAMETERS_new()) == NULL) { |
701 | if ((ret = ECPKPARAMETERS_new()) == NULL) | 626 | ECerr(EC_F_EC_ASN1_GROUP2PKPARAMETERS, |
702 | { | 627 | ERR_R_MALLOC_FAILURE); |
703 | ECerr(EC_F_EC_ASN1_GROUP2PKPARAMETERS, | ||
704 | ERR_R_MALLOC_FAILURE); | ||
705 | return NULL; | 628 | return NULL; |
706 | } | ||
707 | } | 629 | } |
708 | else | 630 | } else { |
709 | { | ||
710 | if (ret->type == 0 && ret->value.named_curve) | 631 | if (ret->type == 0 && ret->value.named_curve) |
711 | ASN1_OBJECT_free(ret->value.named_curve); | 632 | ASN1_OBJECT_free(ret->value.named_curve); |
712 | else if (ret->type == 1 && ret->value.parameters) | 633 | else if (ret->type == 1 && ret->value.parameters) |
713 | ECPARAMETERS_free(ret->value.parameters); | 634 | ECPARAMETERS_free(ret->value.parameters); |
714 | } | 635 | } |
715 | 636 | ||
716 | if (EC_GROUP_get_asn1_flag(group)) | 637 | if (EC_GROUP_get_asn1_flag(group)) { |
717 | { | 638 | /* |
718 | /* use the asn1 OID to describe the | 639 | * use the asn1 OID to describe the the elliptic curve |
719 | * the elliptic curve parameters | 640 | * parameters |
720 | */ | 641 | */ |
721 | tmp = EC_GROUP_get_curve_name(group); | 642 | tmp = EC_GROUP_get_curve_name(group); |
722 | if (tmp) | 643 | if (tmp) { |
723 | { | ||
724 | ret->type = 0; | 644 | ret->type = 0; |
725 | if ((ret->value.named_curve = OBJ_nid2obj(tmp)) == NULL) | 645 | if ((ret->value.named_curve = OBJ_nid2obj(tmp)) == NULL) |
726 | ok = 0; | 646 | ok = 0; |
727 | } | 647 | } else |
728 | else | ||
729 | /* we don't kmow the nid => ERROR */ | 648 | /* we don't kmow the nid => ERROR */ |
730 | ok = 0; | 649 | ok = 0; |
731 | } | 650 | } else { |
732 | else | ||
733 | { | ||
734 | /* use the ECPARAMETERS structure */ | 651 | /* use the ECPARAMETERS structure */ |
735 | ret->type = 1; | 652 | ret->type = 1; |
736 | if ((ret->value.parameters = ec_asn1_group2parameters( | 653 | if ((ret->value.parameters = ec_asn1_group2parameters( |
737 | group, NULL)) == NULL) | 654 | group, NULL)) == NULL) |
738 | ok = 0; | 655 | ok = 0; |
739 | } | 656 | } |
740 | 657 | ||
741 | if (!ok) | 658 | if (!ok) { |
742 | { | ||
743 | ECPKPARAMETERS_free(ret); | 659 | ECPKPARAMETERS_free(ret); |
744 | return NULL; | 660 | return NULL; |
745 | } | ||
746 | return ret; | ||
747 | } | 661 | } |
662 | return ret; | ||
663 | } | ||
748 | 664 | ||
749 | static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params) | 665 | static EC_GROUP * |
750 | { | 666 | ec_asn1_parameters2group(const ECPARAMETERS * params) |
751 | int ok = 0, tmp; | 667 | { |
752 | EC_GROUP *ret = NULL; | 668 | int ok = 0, tmp; |
753 | BIGNUM *p = NULL, *a = NULL, *b = NULL; | 669 | EC_GROUP *ret = NULL; |
754 | EC_POINT *point=NULL; | 670 | BIGNUM *p = NULL, *a = NULL, *b = NULL; |
755 | long field_bits; | 671 | EC_POINT *point = NULL; |
756 | 672 | long field_bits; | |
757 | if (!params->fieldID || !params->fieldID->fieldType || | 673 | |
758 | !params->fieldID->p.ptr) | 674 | if (!params->fieldID || !params->fieldID->fieldType || |
759 | { | 675 | !params->fieldID->p.ptr) { |
760 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); | 676 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); |
761 | goto err; | 677 | goto err; |
762 | } | 678 | } |
763 | |||
764 | /* now extract the curve parameters a and b */ | 679 | /* now extract the curve parameters a and b */ |
765 | if (!params->curve || !params->curve->a || | 680 | if (!params->curve || !params->curve->a || |
766 | !params->curve->a->data || !params->curve->b || | 681 | !params->curve->a->data || !params->curve->b || |
767 | !params->curve->b->data) | 682 | !params->curve->b->data) { |
768 | { | ||
769 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); | 683 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); |
770 | goto err; | 684 | goto err; |
771 | } | 685 | } |
772 | a = BN_bin2bn(params->curve->a->data, params->curve->a->length, NULL); | 686 | a = BN_bin2bn(params->curve->a->data, params->curve->a->length, NULL); |
773 | if (a == NULL) | 687 | if (a == NULL) { |
774 | { | ||
775 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_BN_LIB); | 688 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_BN_LIB); |
776 | goto err; | 689 | goto err; |
777 | } | 690 | } |
778 | b = BN_bin2bn(params->curve->b->data, params->curve->b->length, NULL); | 691 | b = BN_bin2bn(params->curve->b->data, params->curve->b->length, NULL); |
779 | if (b == NULL) | 692 | if (b == NULL) { |
780 | { | ||
781 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_BN_LIB); | 693 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_BN_LIB); |
782 | goto err; | 694 | goto err; |
783 | } | 695 | } |
784 | |||
785 | /* get the field parameters */ | 696 | /* get the field parameters */ |
786 | tmp = OBJ_obj2nid(params->fieldID->fieldType); | 697 | tmp = OBJ_obj2nid(params->fieldID->fieldType); |
787 | if (tmp == NID_X9_62_characteristic_two_field) | 698 | if (tmp == NID_X9_62_characteristic_two_field) |
788 | #ifdef OPENSSL_NO_EC2M | 699 | #ifdef OPENSSL_NO_EC2M |
789 | { | 700 | { |
790 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_GF2M_NOT_SUPPORTED); | 701 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_GF2M_NOT_SUPPORTED); |
791 | goto err; | 702 | goto err; |
792 | } | 703 | } |
793 | #else | 704 | #else |
794 | { | 705 | { |
795 | X9_62_CHARACTERISTIC_TWO *char_two; | 706 | X9_62_CHARACTERISTIC_TWO *char_two; |
796 | 707 | ||
797 | char_two = params->fieldID->p.char_two; | 708 | char_two = params->fieldID->p.char_two; |
798 | 709 | ||
799 | field_bits = char_two->m; | 710 | field_bits = char_two->m; |
800 | if (field_bits > OPENSSL_ECC_MAX_FIELD_BITS) | 711 | if (field_bits > OPENSSL_ECC_MAX_FIELD_BITS) { |
801 | { | ||
802 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_FIELD_TOO_LARGE); | 712 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_FIELD_TOO_LARGE); |
803 | goto err; | 713 | goto err; |
804 | } | 714 | } |
805 | 715 | if ((p = BN_new()) == NULL) { | |
806 | if ((p = BN_new()) == NULL) | ||
807 | { | ||
808 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_MALLOC_FAILURE); | 716 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_MALLOC_FAILURE); |
809 | goto err; | 717 | goto err; |
810 | } | 718 | } |
811 | |||
812 | /* get the base type */ | 719 | /* get the base type */ |
813 | tmp = OBJ_obj2nid(char_two->type); | 720 | tmp = OBJ_obj2nid(char_two->type); |
814 | 721 | ||
815 | if (tmp == NID_X9_62_tpBasis) | 722 | if (tmp == NID_X9_62_tpBasis) { |
816 | { | ||
817 | long tmp_long; | 723 | long tmp_long; |
818 | 724 | ||
819 | if (!char_two->p.tpBasis) | 725 | if (!char_two->p.tpBasis) { |
820 | { | ||
821 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); | 726 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); |
822 | goto err; | 727 | goto err; |
823 | } | 728 | } |
824 | |||
825 | tmp_long = ASN1_INTEGER_get(char_two->p.tpBasis); | 729 | tmp_long = ASN1_INTEGER_get(char_two->p.tpBasis); |
826 | 730 | ||
827 | if (!(char_two->m > tmp_long && tmp_long > 0)) | 731 | if (!(char_two->m > tmp_long && tmp_long > 0)) { |
828 | { | ||
829 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_TRINOMIAL_BASIS); | 732 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_TRINOMIAL_BASIS); |
830 | goto err; | 733 | goto err; |
831 | } | 734 | } |
832 | |||
833 | /* create the polynomial */ | 735 | /* create the polynomial */ |
834 | if (!BN_set_bit(p, (int)char_two->m)) | 736 | if (!BN_set_bit(p, (int) char_two->m)) |
835 | goto err; | 737 | goto err; |
836 | if (!BN_set_bit(p, (int)tmp_long)) | 738 | if (!BN_set_bit(p, (int) tmp_long)) |
837 | goto err; | 739 | goto err; |
838 | if (!BN_set_bit(p, 0)) | 740 | if (!BN_set_bit(p, 0)) |
839 | goto err; | 741 | goto err; |
840 | } | 742 | } else if (tmp == NID_X9_62_ppBasis) { |
841 | else if (tmp == NID_X9_62_ppBasis) | ||
842 | { | ||
843 | X9_62_PENTANOMIAL *penta; | 743 | X9_62_PENTANOMIAL *penta; |
844 | 744 | ||
845 | penta = char_two->p.ppBasis; | 745 | penta = char_two->p.ppBasis; |
846 | if (!penta) | 746 | if (!penta) { |
847 | { | ||
848 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); | 747 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); |
849 | goto err; | 748 | goto err; |
850 | } | 749 | } |
851 | 750 | if (!(char_two->m > penta->k3 && penta->k3 > penta->k2 && penta->k2 > penta->k1 && penta->k1 > 0)) { | |
852 | if (!(char_two->m > penta->k3 && penta->k3 > penta->k2 && penta->k2 > penta->k1 && penta->k1 > 0)) | ||
853 | { | ||
854 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_PENTANOMIAL_BASIS); | 751 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_PENTANOMIAL_BASIS); |
855 | goto err; | 752 | goto err; |
856 | } | ||
857 | |||
858 | /* create the polynomial */ | ||
859 | if (!BN_set_bit(p, (int)char_two->m)) goto err; | ||
860 | if (!BN_set_bit(p, (int)penta->k1)) goto err; | ||
861 | if (!BN_set_bit(p, (int)penta->k2)) goto err; | ||
862 | if (!BN_set_bit(p, (int)penta->k3)) goto err; | ||
863 | if (!BN_set_bit(p, 0)) goto err; | ||
864 | } | 753 | } |
865 | else if (tmp == NID_X9_62_onBasis) | 754 | /* create the polynomial */ |
866 | { | 755 | if (!BN_set_bit(p, (int) char_two->m)) |
756 | goto err; | ||
757 | if (!BN_set_bit(p, (int) penta->k1)) | ||
758 | goto err; | ||
759 | if (!BN_set_bit(p, (int) penta->k2)) | ||
760 | goto err; | ||
761 | if (!BN_set_bit(p, (int) penta->k3)) | ||
762 | goto err; | ||
763 | if (!BN_set_bit(p, 0)) | ||
764 | goto err; | ||
765 | } else if (tmp == NID_X9_62_onBasis) { | ||
867 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_NOT_IMPLEMENTED); | 766 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_NOT_IMPLEMENTED); |
868 | goto err; | 767 | goto err; |
869 | } | 768 | } else { /* error */ |
870 | else /* error */ | ||
871 | { | ||
872 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); | 769 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); |
873 | goto err; | 770 | goto err; |
874 | } | 771 | } |
875 | 772 | ||
876 | /* create the EC_GROUP structure */ | 773 | /* create the EC_GROUP structure */ |
877 | ret = EC_GROUP_new_curve_GF2m(p, a, b, NULL); | 774 | ret = EC_GROUP_new_curve_GF2m(p, a, b, NULL); |
878 | } | 775 | } |
879 | #endif | 776 | #endif |
880 | else if (tmp == NID_X9_62_prime_field) | 777 | else if (tmp == NID_X9_62_prime_field) { |
881 | { | ||
882 | /* we have a curve over a prime field */ | 778 | /* we have a curve over a prime field */ |
883 | /* extract the prime number */ | 779 | /* extract the prime number */ |
884 | if (!params->fieldID->p.prime) | 780 | if (!params->fieldID->p.prime) { |
885 | { | ||
886 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); | 781 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); |
887 | goto err; | 782 | goto err; |
888 | } | 783 | } |
889 | p = ASN1_INTEGER_to_BN(params->fieldID->p.prime, NULL); | 784 | p = ASN1_INTEGER_to_BN(params->fieldID->p.prime, NULL); |
890 | if (p == NULL) | 785 | if (p == NULL) { |
891 | { | ||
892 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB); | 786 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB); |
893 | goto err; | 787 | goto err; |
894 | } | 788 | } |
895 | 789 | if (BN_is_negative(p) || BN_is_zero(p)) { | |
896 | if (BN_is_negative(p) || BN_is_zero(p)) | ||
897 | { | ||
898 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_FIELD); | 790 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_FIELD); |
899 | goto err; | 791 | goto err; |
900 | } | 792 | } |
901 | |||
902 | field_bits = BN_num_bits(p); | 793 | field_bits = BN_num_bits(p); |
903 | if (field_bits > OPENSSL_ECC_MAX_FIELD_BITS) | 794 | if (field_bits > OPENSSL_ECC_MAX_FIELD_BITS) { |
904 | { | ||
905 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_FIELD_TOO_LARGE); | 795 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_FIELD_TOO_LARGE); |
906 | goto err; | 796 | goto err; |
907 | } | 797 | } |
908 | |||
909 | /* create the EC_GROUP structure */ | 798 | /* create the EC_GROUP structure */ |
910 | ret = EC_GROUP_new_curve_GFp(p, a, b, NULL); | 799 | ret = EC_GROUP_new_curve_GFp(p, a, b, NULL); |
911 | } | 800 | } else { |
912 | else | ||
913 | { | ||
914 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_FIELD); | 801 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_FIELD); |
915 | goto err; | 802 | goto err; |
916 | } | 803 | } |
917 | 804 | ||
918 | if (ret == NULL) | 805 | if (ret == NULL) { |
919 | { | ||
920 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_EC_LIB); | 806 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_EC_LIB); |
921 | goto err; | 807 | goto err; |
922 | } | 808 | } |
923 | |||
924 | /* extract seed (optional) */ | 809 | /* extract seed (optional) */ |
925 | if (params->curve->seed != NULL) | 810 | if (params->curve->seed != NULL) { |
926 | { | ||
927 | if (ret->seed != NULL) | 811 | if (ret->seed != NULL) |
928 | free(ret->seed); | 812 | free(ret->seed); |
929 | if (!(ret->seed = malloc(params->curve->seed->length))) | 813 | if (!(ret->seed = malloc(params->curve->seed->length))) { |
930 | { | 814 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, |
931 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, | 815 | ERR_R_MALLOC_FAILURE); |
932 | ERR_R_MALLOC_FAILURE); | ||
933 | goto err; | 816 | goto err; |
934 | } | ||
935 | memcpy(ret->seed, params->curve->seed->data, | ||
936 | params->curve->seed->length); | ||
937 | ret->seed_len = params->curve->seed->length; | ||
938 | } | 817 | } |
939 | 818 | memcpy(ret->seed, params->curve->seed->data, | |
940 | if (!params->order || !params->base || !params->base->data) | 819 | params->curve->seed->length); |
941 | { | 820 | ret->seed_len = params->curve->seed->length; |
821 | } | ||
822 | if (!params->order || !params->base || !params->base->data) { | ||
942 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); | 823 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); |
943 | goto err; | 824 | goto err; |
944 | } | 825 | } |
945 | 826 | if ((point = EC_POINT_new(ret)) == NULL) | |
946 | if ((point = EC_POINT_new(ret)) == NULL) goto err; | 827 | goto err; |
947 | 828 | ||
948 | /* set the point conversion form */ | 829 | /* set the point conversion form */ |
949 | EC_GROUP_set_point_conversion_form(ret, (point_conversion_form_t) | 830 | EC_GROUP_set_point_conversion_form(ret, (point_conversion_form_t) |
950 | (params->base->data[0] & ~0x01)); | 831 | (params->base->data[0] & ~0x01)); |
951 | 832 | ||
952 | /* extract the ec point */ | 833 | /* extract the ec point */ |
953 | if (!EC_POINT_oct2point(ret, point, params->base->data, | 834 | if (!EC_POINT_oct2point(ret, point, params->base->data, |
954 | params->base->length, NULL)) | 835 | params->base->length, NULL)) { |
955 | { | ||
956 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_EC_LIB); | 836 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_EC_LIB); |
957 | goto err; | 837 | goto err; |
958 | } | 838 | } |
959 | |||
960 | /* extract the order */ | 839 | /* extract the order */ |
961 | if ((a = ASN1_INTEGER_to_BN(params->order, a)) == NULL) | 840 | if ((a = ASN1_INTEGER_to_BN(params->order, a)) == NULL) { |
962 | { | ||
963 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB); | 841 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB); |
964 | goto err; | 842 | goto err; |
965 | } | 843 | } |
966 | if (BN_is_negative(a) || BN_is_zero(a)) | 844 | if (BN_is_negative(a) || BN_is_zero(a)) { |
967 | { | ||
968 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_GROUP_ORDER); | 845 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_GROUP_ORDER); |
969 | goto err; | 846 | goto err; |
970 | } | 847 | } |
971 | if (BN_num_bits(a) > (int)field_bits + 1) /* Hasse bound */ | 848 | if (BN_num_bits(a) > (int) field_bits + 1) { /* Hasse bound */ |
972 | { | ||
973 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_GROUP_ORDER); | 849 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_GROUP_ORDER); |
974 | goto err; | 850 | goto err; |
975 | } | 851 | } |
976 | |||
977 | /* extract the cofactor (optional) */ | 852 | /* extract the cofactor (optional) */ |
978 | if (params->cofactor == NULL) | 853 | if (params->cofactor == NULL) { |
979 | { | 854 | if (b) { |
980 | if (b) | ||
981 | { | ||
982 | BN_free(b); | 855 | BN_free(b); |
983 | b = NULL; | 856 | b = NULL; |
984 | } | ||
985 | } | 857 | } |
986 | else | 858 | } else if ((b = ASN1_INTEGER_to_BN(params->cofactor, b)) == NULL) { |
987 | if ((b = ASN1_INTEGER_to_BN(params->cofactor, b)) == NULL) | 859 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB); |
988 | { | 860 | goto err; |
989 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB); | 861 | } |
990 | goto err; | ||
991 | } | ||
992 | /* set the generator, order and cofactor (if present) */ | 862 | /* set the generator, order and cofactor (if present) */ |
993 | if (!EC_GROUP_set_generator(ret, point, a, b)) | 863 | if (!EC_GROUP_set_generator(ret, point, a, b)) { |
994 | { | ||
995 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_EC_LIB); | 864 | ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_EC_LIB); |
996 | goto err; | 865 | goto err; |
997 | } | 866 | } |
998 | |||
999 | ok = 1; | 867 | ok = 1; |
1000 | 868 | ||
1001 | err: if (!ok) | 869 | err: if (!ok) { |
1002 | { | 870 | if (ret) |
1003 | if (ret) | ||
1004 | EC_GROUP_clear_free(ret); | 871 | EC_GROUP_clear_free(ret); |
1005 | ret = NULL; | 872 | ret = NULL; |
1006 | } | 873 | } |
1007 | 874 | if (p) | |
1008 | if (p) | ||
1009 | BN_free(p); | 875 | BN_free(p); |
1010 | if (a) | 876 | if (a) |
1011 | BN_free(a); | 877 | BN_free(a); |
1012 | if (b) | 878 | if (b) |
1013 | BN_free(b); | 879 | BN_free(b); |
1014 | if (point) | 880 | if (point) |
1015 | EC_POINT_free(point); | 881 | EC_POINT_free(point); |
1016 | return(ret); | 882 | return (ret); |
1017 | } | 883 | } |
1018 | 884 | ||
1019 | EC_GROUP *ec_asn1_pkparameters2group(const ECPKPARAMETERS *params) | 885 | EC_GROUP * |
1020 | { | 886 | ec_asn1_pkparameters2group(const ECPKPARAMETERS * params) |
1021 | EC_GROUP *ret=NULL; | 887 | { |
1022 | int tmp=0; | 888 | EC_GROUP *ret = NULL; |
889 | int tmp = 0; | ||
1023 | 890 | ||
1024 | if (params == NULL) | 891 | if (params == NULL) { |
1025 | { | 892 | ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP, |
1026 | ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP, | 893 | EC_R_MISSING_PARAMETERS); |
1027 | EC_R_MISSING_PARAMETERS); | ||
1028 | return NULL; | 894 | return NULL; |
1029 | } | 895 | } |
1030 | 896 | if (params->type == 0) {/* the curve is given by an OID */ | |
1031 | if (params->type == 0) | ||
1032 | { /* the curve is given by an OID */ | ||
1033 | tmp = OBJ_obj2nid(params->value.named_curve); | 897 | tmp = OBJ_obj2nid(params->value.named_curve); |
1034 | if ((ret = EC_GROUP_new_by_curve_name(tmp)) == NULL) | 898 | if ((ret = EC_GROUP_new_by_curve_name(tmp)) == NULL) { |
1035 | { | 899 | ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP, |
1036 | ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP, | 900 | EC_R_EC_GROUP_NEW_BY_NAME_FAILURE); |
1037 | EC_R_EC_GROUP_NEW_BY_NAME_FAILURE); | ||
1038 | return NULL; | 901 | return NULL; |
1039 | } | ||
1040 | EC_GROUP_set_asn1_flag(ret, OPENSSL_EC_NAMED_CURVE); | ||
1041 | } | 902 | } |
1042 | else if (params->type == 1) | 903 | EC_GROUP_set_asn1_flag(ret, OPENSSL_EC_NAMED_CURVE); |
1043 | { /* the parameters are given by a ECPARAMETERS | 904 | } else if (params->type == 1) { /* the parameters are given by a |
1044 | * structure */ | 905 | * ECPARAMETERS structure */ |
1045 | ret = ec_asn1_parameters2group(params->value.parameters); | 906 | ret = ec_asn1_parameters2group(params->value.parameters); |
1046 | if (!ret) | 907 | if (!ret) { |
1047 | { | ||
1048 | ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP, ERR_R_EC_LIB); | 908 | ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP, ERR_R_EC_LIB); |
1049 | return NULL; | 909 | return NULL; |
1050 | } | ||
1051 | EC_GROUP_set_asn1_flag(ret, 0x0); | ||
1052 | } | 910 | } |
1053 | else if (params->type == 2) | 911 | EC_GROUP_set_asn1_flag(ret, 0x0); |
1054 | { /* implicitlyCA */ | 912 | } else if (params->type == 2) { /* implicitlyCA */ |
1055 | return NULL; | 913 | return NULL; |
1056 | } | 914 | } else { |
1057 | else | ||
1058 | { | ||
1059 | ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP, EC_R_ASN1_ERROR); | 915 | ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP, EC_R_ASN1_ERROR); |
1060 | return NULL; | 916 | return NULL; |
1061 | } | 917 | } |
1062 | 918 | ||
1063 | return ret; | 919 | return ret; |
1064 | } | 920 | } |
1065 | 921 | ||
1066 | /* EC_GROUP <-> DER encoding of ECPKPARAMETERS */ | 922 | /* EC_GROUP <-> DER encoding of ECPKPARAMETERS */ |
1067 | 923 | ||
1068 | EC_GROUP *d2i_ECPKParameters(EC_GROUP **a, const unsigned char **in, long len) | 924 | EC_GROUP * |
1069 | { | 925 | d2i_ECPKParameters(EC_GROUP ** a, const unsigned char **in, long len) |
1070 | EC_GROUP *group = NULL; | 926 | { |
1071 | ECPKPARAMETERS *params = NULL; | 927 | EC_GROUP *group = NULL; |
928 | ECPKPARAMETERS *params = NULL; | ||
1072 | 929 | ||
1073 | if ((params = d2i_ECPKPARAMETERS(NULL, in, len)) == NULL) | 930 | if ((params = d2i_ECPKPARAMETERS(NULL, in, len)) == NULL) { |
1074 | { | ||
1075 | ECerr(EC_F_D2I_ECPKPARAMETERS, EC_R_D2I_ECPKPARAMETERS_FAILURE); | 931 | ECerr(EC_F_D2I_ECPKPARAMETERS, EC_R_D2I_ECPKPARAMETERS_FAILURE); |
1076 | ECPKPARAMETERS_free(params); | 932 | ECPKPARAMETERS_free(params); |
1077 | return NULL; | 933 | return NULL; |
1078 | } | 934 | } |
1079 | 935 | if ((group = ec_asn1_pkparameters2group(params)) == NULL) { | |
1080 | if ((group = ec_asn1_pkparameters2group(params)) == NULL) | ||
1081 | { | ||
1082 | ECerr(EC_F_D2I_ECPKPARAMETERS, EC_R_PKPARAMETERS2GROUP_FAILURE); | 936 | ECerr(EC_F_D2I_ECPKPARAMETERS, EC_R_PKPARAMETERS2GROUP_FAILURE); |
1083 | ECPKPARAMETERS_free(params); | 937 | ECPKPARAMETERS_free(params); |
1084 | return NULL; | 938 | return NULL; |
1085 | } | 939 | } |
1086 | |||
1087 | |||
1088 | if (a && *a) | 940 | if (a && *a) |
1089 | EC_GROUP_clear_free(*a); | 941 | EC_GROUP_clear_free(*a); |
1090 | if (a) | 942 | if (a) |
1091 | *a = group; | 943 | *a = group; |
1092 | 944 | ||
1093 | ECPKPARAMETERS_free(params); | 945 | ECPKPARAMETERS_free(params); |
1094 | return(group); | 946 | return (group); |
1095 | } | 947 | } |
1096 | 948 | ||
1097 | int i2d_ECPKParameters(const EC_GROUP *a, unsigned char **out) | 949 | int |
1098 | { | 950 | i2d_ECPKParameters(const EC_GROUP * a, unsigned char **out) |
1099 | int ret=0; | 951 | { |
1100 | ECPKPARAMETERS *tmp = ec_asn1_group2pkparameters(a, NULL); | 952 | int ret = 0; |
1101 | if (tmp == NULL) | 953 | ECPKPARAMETERS *tmp = ec_asn1_group2pkparameters(a, NULL); |
1102 | { | 954 | if (tmp == NULL) { |
1103 | ECerr(EC_F_I2D_ECPKPARAMETERS, EC_R_GROUP2PKPARAMETERS_FAILURE); | 955 | ECerr(EC_F_I2D_ECPKPARAMETERS, EC_R_GROUP2PKPARAMETERS_FAILURE); |
1104 | return 0; | 956 | return 0; |
1105 | } | 957 | } |
1106 | if ((ret = i2d_ECPKPARAMETERS(tmp, out)) == 0) | 958 | if ((ret = i2d_ECPKPARAMETERS(tmp, out)) == 0) { |
1107 | { | ||
1108 | ECerr(EC_F_I2D_ECPKPARAMETERS, EC_R_I2D_ECPKPARAMETERS_FAILURE); | 959 | ECerr(EC_F_I2D_ECPKPARAMETERS, EC_R_I2D_ECPKPARAMETERS_FAILURE); |
1109 | ECPKPARAMETERS_free(tmp); | 960 | ECPKPARAMETERS_free(tmp); |
1110 | return 0; | 961 | return 0; |
1111 | } | ||
1112 | ECPKPARAMETERS_free(tmp); | ||
1113 | return(ret); | ||
1114 | } | 962 | } |
963 | ECPKPARAMETERS_free(tmp); | ||
964 | return (ret); | ||
965 | } | ||
1115 | 966 | ||
1116 | /* some EC_KEY functions */ | 967 | /* some EC_KEY functions */ |
1117 | 968 | ||
1118 | EC_KEY *d2i_ECPrivateKey(EC_KEY **a, const unsigned char **in, long len) | 969 | EC_KEY * |
1119 | { | 970 | d2i_ECPrivateKey(EC_KEY ** a, const unsigned char **in, long len) |
1120 | int ok=0; | 971 | { |
1121 | EC_KEY *ret=NULL; | 972 | int ok = 0; |
1122 | EC_PRIVATEKEY *priv_key=NULL; | 973 | EC_KEY *ret = NULL; |
974 | EC_PRIVATEKEY *priv_key = NULL; | ||
1123 | 975 | ||
1124 | if ((priv_key = EC_PRIVATEKEY_new()) == NULL) | 976 | if ((priv_key = EC_PRIVATEKEY_new()) == NULL) { |
1125 | { | ||
1126 | ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_MALLOC_FAILURE); | 977 | ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_MALLOC_FAILURE); |
1127 | return NULL; | 978 | return NULL; |
1128 | } | 979 | } |
1129 | 980 | if ((priv_key = d2i_EC_PRIVATEKEY(&priv_key, in, len)) == NULL) { | |
1130 | if ((priv_key = d2i_EC_PRIVATEKEY(&priv_key, in, len)) == NULL) | ||
1131 | { | ||
1132 | ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB); | 981 | ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB); |
1133 | EC_PRIVATEKEY_free(priv_key); | 982 | EC_PRIVATEKEY_free(priv_key); |
1134 | return NULL; | 983 | return NULL; |
1135 | } | 984 | } |
1136 | 985 | if (a == NULL || *a == NULL) { | |
1137 | if (a == NULL || *a == NULL) | 986 | if ((ret = EC_KEY_new()) == NULL) { |
1138 | { | ||
1139 | if ((ret = EC_KEY_new()) == NULL) | ||
1140 | { | ||
1141 | ECerr(EC_F_D2I_ECPRIVATEKEY, | 987 | ECerr(EC_F_D2I_ECPRIVATEKEY, |
1142 | ERR_R_MALLOC_FAILURE); | 988 | ERR_R_MALLOC_FAILURE); |
1143 | goto err; | 989 | goto err; |
1144 | } | 990 | } |
1145 | if (a) | 991 | if (a) |
1146 | *a = ret; | 992 | *a = ret; |
1147 | } | 993 | } else |
1148 | else | ||
1149 | ret = *a; | 994 | ret = *a; |
1150 | 995 | ||
1151 | if (priv_key->parameters) | 996 | if (priv_key->parameters) { |
1152 | { | ||
1153 | if (ret->group) | 997 | if (ret->group) |
1154 | EC_GROUP_clear_free(ret->group); | 998 | EC_GROUP_clear_free(ret->group); |
1155 | ret->group = ec_asn1_pkparameters2group(priv_key->parameters); | 999 | ret->group = ec_asn1_pkparameters2group(priv_key->parameters); |
1156 | } | 1000 | } |
1157 | 1001 | if (ret->group == NULL) { | |
1158 | if (ret->group == NULL) | ||
1159 | { | ||
1160 | ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB); | 1002 | ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB); |
1161 | goto err; | 1003 | goto err; |
1162 | } | 1004 | } |
1163 | |||
1164 | ret->version = priv_key->version; | 1005 | ret->version = priv_key->version; |
1165 | 1006 | ||
1166 | if (priv_key->privateKey) | 1007 | if (priv_key->privateKey) { |
1167 | { | ||
1168 | ret->priv_key = BN_bin2bn( | 1008 | ret->priv_key = BN_bin2bn( |
1169 | M_ASN1_STRING_data(priv_key->privateKey), | 1009 | M_ASN1_STRING_data(priv_key->privateKey), |
1170 | M_ASN1_STRING_length(priv_key->privateKey), | 1010 | M_ASN1_STRING_length(priv_key->privateKey), |
1171 | ret->priv_key); | 1011 | ret->priv_key); |
1172 | if (ret->priv_key == NULL) | 1012 | if (ret->priv_key == NULL) { |
1173 | { | ||
1174 | ECerr(EC_F_D2I_ECPRIVATEKEY, | 1013 | ECerr(EC_F_D2I_ECPRIVATEKEY, |
1175 | ERR_R_BN_LIB); | 1014 | ERR_R_BN_LIB); |
1176 | goto err; | 1015 | goto err; |
1177 | } | ||
1178 | } | 1016 | } |
1179 | else | 1017 | } else { |
1180 | { | 1018 | ECerr(EC_F_D2I_ECPRIVATEKEY, |
1181 | ECerr(EC_F_D2I_ECPRIVATEKEY, | 1019 | EC_R_MISSING_PRIVATE_KEY); |
1182 | EC_R_MISSING_PRIVATE_KEY); | ||
1183 | goto err; | 1020 | goto err; |
1184 | } | 1021 | } |
1185 | 1022 | ||
1186 | if (priv_key->publicKey) | 1023 | if (priv_key->publicKey) { |
1187 | { | ||
1188 | const unsigned char *pub_oct; | 1024 | const unsigned char *pub_oct; |
1189 | size_t pub_oct_len; | 1025 | size_t pub_oct_len; |
1190 | 1026 | ||
1191 | if (ret->pub_key) | 1027 | if (ret->pub_key) |
1192 | EC_POINT_clear_free(ret->pub_key); | 1028 | EC_POINT_clear_free(ret->pub_key); |
1193 | ret->pub_key = EC_POINT_new(ret->group); | 1029 | ret->pub_key = EC_POINT_new(ret->group); |
1194 | if (ret->pub_key == NULL) | 1030 | if (ret->pub_key == NULL) { |
1195 | { | ||
1196 | ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB); | 1031 | ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB); |
1197 | goto err; | 1032 | goto err; |
1198 | } | 1033 | } |
1199 | pub_oct = M_ASN1_STRING_data(priv_key->publicKey); | 1034 | pub_oct = M_ASN1_STRING_data(priv_key->publicKey); |
1200 | pub_oct_len = M_ASN1_STRING_length(priv_key->publicKey); | 1035 | pub_oct_len = M_ASN1_STRING_length(priv_key->publicKey); |
1201 | /* save the point conversion form */ | 1036 | /* save the point conversion form */ |
1202 | ret->conv_form = (point_conversion_form_t)(pub_oct[0] & ~0x01); | 1037 | ret->conv_form = (point_conversion_form_t) (pub_oct[0] & ~0x01); |
1203 | if (!EC_POINT_oct2point(ret->group, ret->pub_key, | 1038 | if (!EC_POINT_oct2point(ret->group, ret->pub_key, |
1204 | pub_oct, pub_oct_len, NULL)) | 1039 | pub_oct, pub_oct_len, NULL)) { |
1205 | { | ||
1206 | ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB); | 1040 | ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB); |
1207 | goto err; | 1041 | goto err; |
1208 | } | ||
1209 | } | 1042 | } |
1210 | 1043 | } | |
1211 | ok = 1; | 1044 | ok = 1; |
1212 | err: | 1045 | err: |
1213 | if (!ok) | 1046 | if (!ok) { |
1214 | { | ||
1215 | if (ret) | 1047 | if (ret) |
1216 | EC_KEY_free(ret); | 1048 | EC_KEY_free(ret); |
1217 | ret = NULL; | 1049 | ret = NULL; |
1218 | } | 1050 | } |
1219 | |||
1220 | if (priv_key) | 1051 | if (priv_key) |
1221 | EC_PRIVATEKEY_free(priv_key); | 1052 | EC_PRIVATEKEY_free(priv_key); |
1222 | 1053 | ||
1223 | return(ret); | 1054 | return (ret); |
1224 | } | 1055 | } |
1225 | 1056 | ||
1226 | int i2d_ECPrivateKey(EC_KEY *a, unsigned char **out) | 1057 | int |
1227 | { | 1058 | i2d_ECPrivateKey(EC_KEY * a, unsigned char **out) |
1228 | int ret=0, ok=0; | 1059 | { |
1229 | unsigned char *buffer=NULL; | 1060 | int ret = 0, ok = 0; |
1230 | size_t buf_len=0, tmp_len; | 1061 | unsigned char *buffer = NULL; |
1231 | EC_PRIVATEKEY *priv_key=NULL; | 1062 | size_t buf_len = 0, tmp_len; |
1063 | EC_PRIVATEKEY *priv_key = NULL; | ||
1232 | 1064 | ||
1233 | if (a == NULL || a->group == NULL || a->priv_key == NULL) | 1065 | if (a == NULL || a->group == NULL || a->priv_key == NULL) { |
1234 | { | ||
1235 | ECerr(EC_F_I2D_ECPRIVATEKEY, | 1066 | ECerr(EC_F_I2D_ECPRIVATEKEY, |
1236 | ERR_R_PASSED_NULL_PARAMETER); | 1067 | ERR_R_PASSED_NULL_PARAMETER); |
1237 | goto err; | 1068 | goto err; |
1238 | } | 1069 | } |
1239 | 1070 | if ((priv_key = EC_PRIVATEKEY_new()) == NULL) { | |
1240 | if ((priv_key = EC_PRIVATEKEY_new()) == NULL) | ||
1241 | { | ||
1242 | ECerr(EC_F_I2D_ECPRIVATEKEY, | 1071 | ECerr(EC_F_I2D_ECPRIVATEKEY, |
1243 | ERR_R_MALLOC_FAILURE); | 1072 | ERR_R_MALLOC_FAILURE); |
1244 | goto err; | 1073 | goto err; |
1245 | } | 1074 | } |
1246 | |||
1247 | priv_key->version = a->version; | 1075 | priv_key->version = a->version; |
1248 | 1076 | ||
1249 | buf_len = (size_t)BN_num_bytes(a->priv_key); | 1077 | buf_len = (size_t) BN_num_bytes(a->priv_key); |
1250 | buffer = malloc(buf_len); | 1078 | buffer = malloc(buf_len); |
1251 | if (buffer == NULL) | 1079 | if (buffer == NULL) { |
1252 | { | ||
1253 | ECerr(EC_F_I2D_ECPRIVATEKEY, | 1080 | ECerr(EC_F_I2D_ECPRIVATEKEY, |
1254 | ERR_R_MALLOC_FAILURE); | 1081 | ERR_R_MALLOC_FAILURE); |
1255 | goto err; | 1082 | goto err; |
1256 | } | 1083 | } |
1257 | 1084 | if (!BN_bn2bin(a->priv_key, buffer)) { | |
1258 | if (!BN_bn2bin(a->priv_key, buffer)) | ||
1259 | { | ||
1260 | ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_BN_LIB); | 1085 | ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_BN_LIB); |
1261 | goto err; | 1086 | goto err; |
1262 | } | 1087 | } |
1263 | 1088 | if (!M_ASN1_OCTET_STRING_set(priv_key->privateKey, buffer, buf_len)) { | |
1264 | if (!M_ASN1_OCTET_STRING_set(priv_key->privateKey, buffer, buf_len)) | ||
1265 | { | ||
1266 | ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_ASN1_LIB); | 1089 | ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_ASN1_LIB); |
1267 | goto err; | 1090 | goto err; |
1268 | } | 1091 | } |
1269 | 1092 | if (!(a->enc_flag & EC_PKEY_NO_PARAMETERS)) { | |
1270 | if (!(a->enc_flag & EC_PKEY_NO_PARAMETERS)) | ||
1271 | { | ||
1272 | if ((priv_key->parameters = ec_asn1_group2pkparameters( | 1093 | if ((priv_key->parameters = ec_asn1_group2pkparameters( |
1273 | a->group, priv_key->parameters)) == NULL) | 1094 | a->group, priv_key->parameters)) == NULL) { |
1274 | { | ||
1275 | ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_EC_LIB); | 1095 | ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_EC_LIB); |
1276 | goto err; | 1096 | goto err; |
1277 | } | ||
1278 | } | 1097 | } |
1279 | 1098 | } | |
1280 | if (!(a->enc_flag & EC_PKEY_NO_PUBKEY)) | 1099 | if (!(a->enc_flag & EC_PKEY_NO_PUBKEY)) { |
1281 | { | ||
1282 | priv_key->publicKey = M_ASN1_BIT_STRING_new(); | 1100 | priv_key->publicKey = M_ASN1_BIT_STRING_new(); |
1283 | if (priv_key->publicKey == NULL) | 1101 | if (priv_key->publicKey == NULL) { |
1284 | { | ||
1285 | ECerr(EC_F_I2D_ECPRIVATEKEY, | 1102 | ECerr(EC_F_I2D_ECPRIVATEKEY, |
1286 | ERR_R_MALLOC_FAILURE); | 1103 | ERR_R_MALLOC_FAILURE); |
1287 | goto err; | 1104 | goto err; |
1288 | } | 1105 | } |
1289 | 1106 | tmp_len = EC_POINT_point2oct(a->group, a->pub_key, | |
1290 | tmp_len = EC_POINT_point2oct(a->group, a->pub_key, | 1107 | a->conv_form, NULL, 0, NULL); |
1291 | a->conv_form, NULL, 0, NULL); | ||
1292 | 1108 | ||
1293 | if (tmp_len > buf_len) | 1109 | if (tmp_len > buf_len) { |
1294 | { | ||
1295 | unsigned char *tmp_buffer = realloc(buffer, tmp_len); | 1110 | unsigned char *tmp_buffer = realloc(buffer, tmp_len); |
1296 | if (!tmp_buffer) | 1111 | if (!tmp_buffer) { |
1297 | { | ||
1298 | ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_MALLOC_FAILURE); | 1112 | ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_MALLOC_FAILURE); |
1299 | goto err; | 1113 | goto err; |
1300 | } | 1114 | } |
1301 | buffer = tmp_buffer; | 1115 | buffer = tmp_buffer; |
1302 | buf_len = tmp_len; | 1116 | buf_len = tmp_len; |
1303 | } | 1117 | } |
1304 | 1118 | if (!EC_POINT_point2oct(a->group, a->pub_key, | |
1305 | if (!EC_POINT_point2oct(a->group, a->pub_key, | 1119 | a->conv_form, buffer, buf_len, NULL)) { |
1306 | a->conv_form, buffer, buf_len, NULL)) | ||
1307 | { | ||
1308 | ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_EC_LIB); | 1120 | ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_EC_LIB); |
1309 | goto err; | 1121 | goto err; |
1310 | } | 1122 | } |
1311 | 1123 | priv_key->publicKey->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); | |
1312 | priv_key->publicKey->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07); | ||
1313 | priv_key->publicKey->flags |= ASN1_STRING_FLAG_BITS_LEFT; | 1124 | priv_key->publicKey->flags |= ASN1_STRING_FLAG_BITS_LEFT; |
1314 | if (!M_ASN1_BIT_STRING_set(priv_key->publicKey, buffer, | 1125 | if (!M_ASN1_BIT_STRING_set(priv_key->publicKey, buffer, |
1315 | buf_len)) | 1126 | buf_len)) { |
1316 | { | ||
1317 | ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_ASN1_LIB); | 1127 | ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_ASN1_LIB); |
1318 | goto err; | 1128 | goto err; |
1319 | } | ||
1320 | } | 1129 | } |
1321 | 1130 | } | |
1322 | if ((ret = i2d_EC_PRIVATEKEY(priv_key, out)) == 0) | 1131 | if ((ret = i2d_EC_PRIVATEKEY(priv_key, out)) == 0) { |
1323 | { | ||
1324 | ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_EC_LIB); | 1132 | ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_EC_LIB); |
1325 | goto err; | 1133 | goto err; |
1326 | } | 1134 | } |
1327 | ok=1; | 1135 | ok = 1; |
1328 | err: | 1136 | err: |
1329 | if (buffer) | 1137 | if (buffer) |
1330 | free(buffer); | 1138 | free(buffer); |
1331 | if (priv_key) | 1139 | if (priv_key) |
1332 | EC_PRIVATEKEY_free(priv_key); | 1140 | EC_PRIVATEKEY_free(priv_key); |
1333 | return(ok?ret:0); | 1141 | return (ok ? ret : 0); |
1334 | } | 1142 | } |
1335 | 1143 | ||
1336 | int i2d_ECParameters(EC_KEY *a, unsigned char **out) | 1144 | int |
1337 | { | 1145 | i2d_ECParameters(EC_KEY * a, unsigned char **out) |
1338 | if (a == NULL) | 1146 | { |
1339 | { | 1147 | if (a == NULL) { |
1340 | ECerr(EC_F_I2D_ECPARAMETERS, ERR_R_PASSED_NULL_PARAMETER); | 1148 | ECerr(EC_F_I2D_ECPARAMETERS, ERR_R_PASSED_NULL_PARAMETER); |
1341 | return 0; | 1149 | return 0; |
1342 | } | ||
1343 | return i2d_ECPKParameters(a->group, out); | ||
1344 | } | 1150 | } |
1151 | return i2d_ECPKParameters(a->group, out); | ||
1152 | } | ||
1345 | 1153 | ||
1346 | EC_KEY *d2i_ECParameters(EC_KEY **a, const unsigned char **in, long len) | 1154 | EC_KEY * |
1347 | { | 1155 | d2i_ECParameters(EC_KEY ** a, const unsigned char **in, long len) |
1348 | EC_KEY *ret; | 1156 | { |
1157 | EC_KEY *ret; | ||
1349 | 1158 | ||
1350 | if (in == NULL || *in == NULL) | 1159 | if (in == NULL || *in == NULL) { |
1351 | { | ||
1352 | ECerr(EC_F_D2I_ECPARAMETERS, ERR_R_PASSED_NULL_PARAMETER); | 1160 | ECerr(EC_F_D2I_ECPARAMETERS, ERR_R_PASSED_NULL_PARAMETER); |
1353 | return NULL; | 1161 | return NULL; |
1354 | } | 1162 | } |
1355 | 1163 | if (a == NULL || *a == NULL) { | |
1356 | if (a == NULL || *a == NULL) | 1164 | if ((ret = EC_KEY_new()) == NULL) { |
1357 | { | ||
1358 | if ((ret = EC_KEY_new()) == NULL) | ||
1359 | { | ||
1360 | ECerr(EC_F_D2I_ECPARAMETERS, ERR_R_MALLOC_FAILURE); | 1165 | ECerr(EC_F_D2I_ECPARAMETERS, ERR_R_MALLOC_FAILURE); |
1361 | return NULL; | 1166 | return NULL; |
1362 | } | 1167 | } |
1363 | if (a) | 1168 | if (a) |
1364 | *a = ret; | 1169 | *a = ret; |
1365 | } | 1170 | } else |
1366 | else | ||
1367 | ret = *a; | 1171 | ret = *a; |
1368 | 1172 | ||
1369 | if (!d2i_ECPKParameters(&ret->group, in, len)) | 1173 | if (!d2i_ECPKParameters(&ret->group, in, len)) { |
1370 | { | ||
1371 | ECerr(EC_F_D2I_ECPARAMETERS, ERR_R_EC_LIB); | 1174 | ECerr(EC_F_D2I_ECPARAMETERS, ERR_R_EC_LIB); |
1372 | return NULL; | 1175 | return NULL; |
1373 | } | ||
1374 | |||
1375 | return ret; | ||
1376 | } | 1176 | } |
1177 | return ret; | ||
1178 | } | ||
1377 | 1179 | ||
1378 | EC_KEY *o2i_ECPublicKey(EC_KEY **a, const unsigned char **in, long len) | 1180 | EC_KEY * |
1379 | { | 1181 | o2i_ECPublicKey(EC_KEY ** a, const unsigned char **in, long len) |
1380 | EC_KEY *ret=NULL; | 1182 | { |
1183 | EC_KEY *ret = NULL; | ||
1381 | 1184 | ||
1382 | if (a == NULL || (*a) == NULL || (*a)->group == NULL) | 1185 | if (a == NULL || (*a) == NULL || (*a)->group == NULL) { |
1383 | { | 1186 | /* |
1384 | /* sorry, but a EC_GROUP-structur is necessary | 1187 | * sorry, but a EC_GROUP-structur is necessary to set the |
1385 | * to set the public key */ | 1188 | * public key |
1189 | */ | ||
1386 | ECerr(EC_F_O2I_ECPUBLICKEY, ERR_R_PASSED_NULL_PARAMETER); | 1190 | ECerr(EC_F_O2I_ECPUBLICKEY, ERR_R_PASSED_NULL_PARAMETER); |
1387 | return 0; | 1191 | return 0; |
1388 | } | 1192 | } |
1389 | ret = *a; | 1193 | ret = *a; |
1390 | if (ret->pub_key == NULL && | 1194 | if (ret->pub_key == NULL && |
1391 | (ret->pub_key = EC_POINT_new(ret->group)) == NULL) | 1195 | (ret->pub_key = EC_POINT_new(ret->group)) == NULL) { |
1392 | { | ||
1393 | ECerr(EC_F_O2I_ECPUBLICKEY, ERR_R_MALLOC_FAILURE); | 1196 | ECerr(EC_F_O2I_ECPUBLICKEY, ERR_R_MALLOC_FAILURE); |
1394 | return 0; | 1197 | return 0; |
1395 | } | 1198 | } |
1396 | if (!EC_POINT_oct2point(ret->group, ret->pub_key, *in, len, NULL)) | 1199 | if (!EC_POINT_oct2point(ret->group, ret->pub_key, *in, len, NULL)) { |
1397 | { | ||
1398 | ECerr(EC_F_O2I_ECPUBLICKEY, ERR_R_EC_LIB); | 1200 | ECerr(EC_F_O2I_ECPUBLICKEY, ERR_R_EC_LIB); |
1399 | return 0; | 1201 | return 0; |
1400 | } | 1202 | } |
1401 | /* save the point conversion form */ | 1203 | /* save the point conversion form */ |
1402 | ret->conv_form = (point_conversion_form_t)(*in[0] & ~0x01); | 1204 | ret->conv_form = (point_conversion_form_t) (*in[0] & ~0x01); |
1403 | *in += len; | 1205 | *in += len; |
1404 | return ret; | 1206 | return ret; |
1405 | } | 1207 | } |
1406 | 1208 | ||
1407 | int i2o_ECPublicKey(EC_KEY *a, unsigned char **out) | 1209 | int |
1408 | { | 1210 | i2o_ECPublicKey(EC_KEY * a, unsigned char **out) |
1409 | size_t buf_len=0; | 1211 | { |
1212 | size_t buf_len = 0; | ||
1410 | int new_buffer = 0; | 1213 | int new_buffer = 0; |
1411 | 1214 | ||
1412 | if (a == NULL) | 1215 | if (a == NULL) { |
1413 | { | ||
1414 | ECerr(EC_F_I2O_ECPUBLICKEY, ERR_R_PASSED_NULL_PARAMETER); | 1216 | ECerr(EC_F_I2O_ECPUBLICKEY, ERR_R_PASSED_NULL_PARAMETER); |
1415 | return 0; | 1217 | return 0; |
1416 | } | 1218 | } |
1417 | 1219 | buf_len = EC_POINT_point2oct(a->group, a->pub_key, | |
1418 | buf_len = EC_POINT_point2oct(a->group, a->pub_key, | 1220 | a->conv_form, NULL, 0, NULL); |
1419 | a->conv_form, NULL, 0, NULL); | ||
1420 | 1221 | ||
1421 | if (out == NULL || buf_len == 0) | 1222 | if (out == NULL || buf_len == 0) |
1422 | /* out == NULL => just return the length of the octet string */ | 1223 | /* out == NULL => just return the length of the octet string */ |
1423 | return buf_len; | 1224 | return buf_len; |
1424 | 1225 | ||
1425 | if (*out == NULL) | 1226 | if (*out == NULL) { |
1426 | { | 1227 | if ((*out = malloc(buf_len)) == NULL) { |
1427 | if ((*out = malloc(buf_len)) == NULL) | ||
1428 | { | ||
1429 | ECerr(EC_F_I2O_ECPUBLICKEY, ERR_R_MALLOC_FAILURE); | 1228 | ECerr(EC_F_I2O_ECPUBLICKEY, ERR_R_MALLOC_FAILURE); |
1430 | return 0; | 1229 | return 0; |
1431 | } | ||
1432 | new_buffer = 1; | ||
1433 | } | 1230 | } |
1434 | if (!EC_POINT_point2oct(a->group, a->pub_key, a->conv_form, | 1231 | new_buffer = 1; |
1435 | *out, buf_len, NULL)) | 1232 | } |
1436 | { | 1233 | if (!EC_POINT_point2oct(a->group, a->pub_key, a->conv_form, |
1234 | *out, buf_len, NULL)) { | ||
1437 | ECerr(EC_F_I2O_ECPUBLICKEY, ERR_R_EC_LIB); | 1235 | ECerr(EC_F_I2O_ECPUBLICKEY, ERR_R_EC_LIB); |
1438 | free(*out); | 1236 | free(*out); |
1439 | *out = NULL; | 1237 | *out = NULL; |
1440 | return 0; | 1238 | return 0; |
1441 | } | 1239 | } |
1442 | if (!new_buffer) | 1240 | if (!new_buffer) |
1443 | *out += buf_len; | 1241 | *out += buf_len; |
1444 | return buf_len; | 1242 | return buf_len; |
1445 | } | 1243 | } |