1 /* crypto/ec/ec_asn1.c */
3 * Written by Nils Larsch for the OpenSSL project.
5 /* ====================================================================
6 * Copyright (c) 2000-2003 The OpenSSL Project. All rights reserved.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
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
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/)"
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 * licensing@OpenSSL.org.
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.
34 * 6. Redistributions of any form whatsoever must retain the following
36 * "This product includes software developed by the OpenSSL Project
37 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
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 * ====================================================================
53 * This product includes cryptographic software written by Eric Young
54 * (eay@cryptsoft.com). This product includes software written by Tim
55 * Hudson (tjh@cryptsoft.com).
61 #include <openssl/err.h>
62 #include <openssl/asn1t.h>
63 #include <openssl/objects.h>
66 int EC_GROUP_get_basis_type(const EC_GROUP
*group
)
70 if (EC_METHOD_get_field_type(EC_GROUP_method_of(group
)) !=
71 NID_X9_62_characteristic_two_field
)
72 /* everything else is currently not supported */
75 while (group
->poly
[i
] != 0)
79 return NID_X9_62_ppBasis
;
81 return NID_X9_62_tpBasis
;
83 /* everything else is currently not supported */
86 #ifndef OPENSSL_NO_EC2M
87 int EC_GROUP_get_trinomial_basis(const EC_GROUP
*group
, unsigned int *k
)
92 if (EC_GROUP_method_of(group
)->group_set_curve
!= ec_GF2m_simple_group_set_curve
93 || !((group
->poly
[0] != 0) && (group
->poly
[1] != 0) && (group
->poly
[2] == 0)))
95 ECerr(EC_F_EC_GROUP_GET_TRINOMIAL_BASIS
, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED
);
104 int EC_GROUP_get_pentanomial_basis(const EC_GROUP
*group
, unsigned int *k1
,
105 unsigned int *k2
, unsigned int *k3
)
110 if (EC_GROUP_method_of(group
)->group_set_curve
!= ec_GF2m_simple_group_set_curve
111 || !((group
->poly
[0] != 0) && (group
->poly
[1] != 0) && (group
->poly
[2] != 0) && (group
->poly
[3] != 0) && (group
->poly
[4] == 0)))
113 ECerr(EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS
, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED
);
118 *k1
= group
->poly
[3];
120 *k2
= group
->poly
[2];
122 *k3
= group
->poly
[1];
129 /* some structures needed for the asn1 encoding */
130 typedef struct x9_62_pentanomial_st
{
136 typedef struct x9_62_characteristic_two_st
{
141 /* NID_X9_62_onBasis */
143 /* NID_X9_62_tpBasis */
144 ASN1_INTEGER
*tpBasis
;
145 /* NID_X9_62_ppBasis */
146 X9_62_PENTANOMIAL
*ppBasis
;
150 } X9_62_CHARACTERISTIC_TWO
;
152 typedef struct x9_62_fieldid_st
{
153 ASN1_OBJECT
*fieldType
;
156 /* NID_X9_62_prime_field */
158 /* NID_X9_62_characteristic_two_field */
159 X9_62_CHARACTERISTIC_TWO
*char_two
;
165 typedef struct x9_62_curve_st
{
166 ASN1_OCTET_STRING
*a
;
167 ASN1_OCTET_STRING
*b
;
168 ASN1_BIT_STRING
*seed
;
171 typedef struct ec_parameters_st
{
173 X9_62_FIELDID
*fieldID
;
175 ASN1_OCTET_STRING
*base
;
177 ASN1_INTEGER
*cofactor
;
180 struct ecpk_parameters_st
{
183 ASN1_OBJECT
*named_curve
;
184 ECPARAMETERS
*parameters
;
185 ASN1_NULL
*implicitlyCA
;
187 }/* ECPKPARAMETERS */;
189 /* SEC1 ECPrivateKey */
190 typedef struct ec_privatekey_st
{
192 ASN1_OCTET_STRING
*privateKey
;
193 ECPKPARAMETERS
*parameters
;
194 ASN1_BIT_STRING
*publicKey
;
197 /* the OpenSSL ASN.1 definitions */
198 ASN1_SEQUENCE(X9_62_PENTANOMIAL
) = {
199 ASN1_SIMPLE(X9_62_PENTANOMIAL
, k1
, LONG
),
200 ASN1_SIMPLE(X9_62_PENTANOMIAL
, k2
, LONG
),
201 ASN1_SIMPLE(X9_62_PENTANOMIAL
, k3
, LONG
)
202 } ASN1_SEQUENCE_END(X9_62_PENTANOMIAL
)
204 DECLARE_ASN1_ALLOC_FUNCTIONS(X9_62_PENTANOMIAL
)
205 IMPLEMENT_ASN1_ALLOC_FUNCTIONS(X9_62_PENTANOMIAL
)
207 ASN1_ADB_TEMPLATE(char_two_def
) = ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO
, p
.other
, ASN1_ANY
);
209 ASN1_ADB(X9_62_CHARACTERISTIC_TWO
) = {
210 ADB_ENTRY(NID_X9_62_onBasis
, ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO
, p
.onBasis
, ASN1_NULL
)),
211 ADB_ENTRY(NID_X9_62_tpBasis
, ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO
, p
.tpBasis
, ASN1_INTEGER
)),
212 ADB_ENTRY(NID_X9_62_ppBasis
, ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO
, p
.ppBasis
, X9_62_PENTANOMIAL
))
213 } ASN1_ADB_END(X9_62_CHARACTERISTIC_TWO
, 0, type
, 0, &char_two_def_tt
, NULL
);
215 ASN1_SEQUENCE(X9_62_CHARACTERISTIC_TWO
) = {
216 ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO
, m
, LONG
),
217 ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO
, type
, ASN1_OBJECT
),
218 ASN1_ADB_OBJECT(X9_62_CHARACTERISTIC_TWO
)
219 } ASN1_SEQUENCE_END(X9_62_CHARACTERISTIC_TWO
)
221 DECLARE_ASN1_ALLOC_FUNCTIONS(X9_62_CHARACTERISTIC_TWO
)
222 IMPLEMENT_ASN1_ALLOC_FUNCTIONS(X9_62_CHARACTERISTIC_TWO
)
224 ASN1_ADB_TEMPLATE(fieldID_def
) = ASN1_SIMPLE(X9_62_FIELDID
, p
.other
, ASN1_ANY
);
226 ASN1_ADB(X9_62_FIELDID
) = {
227 ADB_ENTRY(NID_X9_62_prime_field
, ASN1_SIMPLE(X9_62_FIELDID
, p
.prime
, ASN1_INTEGER
)),
228 ADB_ENTRY(NID_X9_62_characteristic_two_field
, ASN1_SIMPLE(X9_62_FIELDID
, p
.char_two
, X9_62_CHARACTERISTIC_TWO
))
229 } ASN1_ADB_END(X9_62_FIELDID
, 0, fieldType
, 0, &fieldID_def_tt
, NULL
);
231 ASN1_SEQUENCE(X9_62_FIELDID
) = {
232 ASN1_SIMPLE(X9_62_FIELDID
, fieldType
, ASN1_OBJECT
),
233 ASN1_ADB_OBJECT(X9_62_FIELDID
)
234 } ASN1_SEQUENCE_END(X9_62_FIELDID
)
236 ASN1_SEQUENCE(X9_62_CURVE
) = {
237 ASN1_SIMPLE(X9_62_CURVE
, a
, ASN1_OCTET_STRING
),
238 ASN1_SIMPLE(X9_62_CURVE
, b
, ASN1_OCTET_STRING
),
239 ASN1_OPT(X9_62_CURVE
, seed
, ASN1_BIT_STRING
)
240 } ASN1_SEQUENCE_END(X9_62_CURVE
)
242 ASN1_SEQUENCE(ECPARAMETERS
) = {
243 ASN1_SIMPLE(ECPARAMETERS
, version
, LONG
),
244 ASN1_SIMPLE(ECPARAMETERS
, fieldID
, X9_62_FIELDID
),
245 ASN1_SIMPLE(ECPARAMETERS
, curve
, X9_62_CURVE
),
246 ASN1_SIMPLE(ECPARAMETERS
, base
, ASN1_OCTET_STRING
),
247 ASN1_SIMPLE(ECPARAMETERS
, order
, ASN1_INTEGER
),
248 ASN1_OPT(ECPARAMETERS
, cofactor
, ASN1_INTEGER
)
249 } ASN1_SEQUENCE_END(ECPARAMETERS
)
251 DECLARE_ASN1_ALLOC_FUNCTIONS(ECPARAMETERS
)
252 IMPLEMENT_ASN1_ALLOC_FUNCTIONS(ECPARAMETERS
)
254 ASN1_CHOICE(ECPKPARAMETERS
) = {
255 ASN1_SIMPLE(ECPKPARAMETERS
, value
.named_curve
, ASN1_OBJECT
),
256 ASN1_SIMPLE(ECPKPARAMETERS
, value
.parameters
, ECPARAMETERS
),
257 ASN1_SIMPLE(ECPKPARAMETERS
, value
.implicitlyCA
, ASN1_NULL
)
258 } ASN1_CHOICE_END(ECPKPARAMETERS
)
260 DECLARE_ASN1_FUNCTIONS_const(ECPKPARAMETERS
)
261 DECLARE_ASN1_ENCODE_FUNCTIONS_const(ECPKPARAMETERS
, ECPKPARAMETERS
)
262 IMPLEMENT_ASN1_FUNCTIONS_const(ECPKPARAMETERS
)
264 ASN1_SEQUENCE(EC_PRIVATEKEY
) = {
265 ASN1_SIMPLE(EC_PRIVATEKEY
, version
, LONG
),
266 ASN1_SIMPLE(EC_PRIVATEKEY
, privateKey
, ASN1_OCTET_STRING
),
267 ASN1_EXP_OPT(EC_PRIVATEKEY
, parameters
, ECPKPARAMETERS
, 0),
268 ASN1_EXP_OPT(EC_PRIVATEKEY
, publicKey
, ASN1_BIT_STRING
, 1)
269 } ASN1_SEQUENCE_END(EC_PRIVATEKEY
)
271 DECLARE_ASN1_FUNCTIONS_const(EC_PRIVATEKEY
)
272 DECLARE_ASN1_ENCODE_FUNCTIONS_const(EC_PRIVATEKEY
, EC_PRIVATEKEY
)
273 IMPLEMENT_ASN1_FUNCTIONS_const(EC_PRIVATEKEY
)
275 /* some declarations of internal function */
277 /* ec_asn1_group2field() sets the values in a X9_62_FIELDID object */
278 static int ec_asn1_group2fieldid(const EC_GROUP
*, X9_62_FIELDID
*);
279 /* ec_asn1_group2curve() sets the values in a X9_62_CURVE object */
280 static int ec_asn1_group2curve(const EC_GROUP
*, X9_62_CURVE
*);
281 /* ec_asn1_parameters2group() creates a EC_GROUP object from a
282 * ECPARAMETERS object */
283 static EC_GROUP
*ec_asn1_parameters2group(const ECPARAMETERS
*);
284 /* ec_asn1_group2parameters() creates a ECPARAMETERS object from a
286 static ECPARAMETERS
*ec_asn1_group2parameters(const EC_GROUP
*,ECPARAMETERS
*);
287 /* ec_asn1_pkparameters2group() creates a EC_GROUP object from a
288 * ECPKPARAMETERS object */
289 static EC_GROUP
*ec_asn1_pkparameters2group(const ECPKPARAMETERS
*);
290 /* ec_asn1_group2pkparameters() creates a ECPKPARAMETERS object from a
292 static ECPKPARAMETERS
*ec_asn1_group2pkparameters(const EC_GROUP
*,
296 /* the function definitions */
298 static int ec_asn1_group2fieldid(const EC_GROUP
*group
, X9_62_FIELDID
*field
)
303 if (group
== NULL
|| field
== NULL
)
306 /* clear the old values (if necessary) */
307 if (field
->fieldType
!= NULL
)
308 ASN1_OBJECT_free(field
->fieldType
);
309 if (field
->p
.other
!= NULL
)
310 ASN1_TYPE_free(field
->p
.other
);
312 nid
= EC_METHOD_get_field_type(EC_GROUP_method_of(group
));
313 /* set OID for the field */
314 if ((field
->fieldType
= OBJ_nid2obj(nid
)) == NULL
)
316 ECerr(EC_F_EC_ASN1_GROUP2FIELDID
, ERR_R_OBJ_LIB
);
320 if (nid
== NID_X9_62_prime_field
)
322 if ((tmp
= BN_new()) == NULL
)
324 ECerr(EC_F_EC_ASN1_GROUP2FIELDID
, ERR_R_MALLOC_FAILURE
);
327 /* the parameters are specified by the prime number p */
328 if (!EC_GROUP_get_curve_GFp(group
, tmp
, NULL
, NULL
, NULL
))
330 ECerr(EC_F_EC_ASN1_GROUP2FIELDID
, ERR_R_EC_LIB
);
333 /* set the prime number */
334 field
->p
.prime
= BN_to_ASN1_INTEGER(tmp
,NULL
);
335 if (field
->p
.prime
== NULL
)
337 ECerr(EC_F_EC_ASN1_GROUP2FIELDID
, ERR_R_ASN1_LIB
);
341 else /* nid == NID_X9_62_characteristic_two_field */
342 #ifdef OPENSSL_NO_EC2M
344 ECerr(EC_F_EC_ASN1_GROUP2FIELDID
, EC_R_GF2M_NOT_SUPPORTED
);
350 X9_62_CHARACTERISTIC_TWO
*char_two
;
352 field
->p
.char_two
= X9_62_CHARACTERISTIC_TWO_new();
353 char_two
= field
->p
.char_two
;
355 if (char_two
== NULL
)
357 ECerr(EC_F_EC_ASN1_GROUP2FIELDID
, ERR_R_MALLOC_FAILURE
);
361 char_two
->m
= (long)EC_GROUP_get_degree(group
);
363 field_type
= EC_GROUP_get_basis_type(group
);
367 ECerr(EC_F_EC_ASN1_GROUP2FIELDID
, ERR_R_EC_LIB
);
370 /* set base type OID */
371 if ((char_two
->type
= OBJ_nid2obj(field_type
)) == NULL
)
373 ECerr(EC_F_EC_ASN1_GROUP2FIELDID
, ERR_R_OBJ_LIB
);
377 if (field_type
== NID_X9_62_tpBasis
)
381 if (!EC_GROUP_get_trinomial_basis(group
, &k
))
384 char_two
->p
.tpBasis
= ASN1_INTEGER_new();
385 if (!char_two
->p
.tpBasis
)
387 ECerr(EC_F_EC_ASN1_GROUP2FIELDID
, ERR_R_MALLOC_FAILURE
);
390 if (!ASN1_INTEGER_set(char_two
->p
.tpBasis
, (long)k
))
392 ECerr(EC_F_EC_ASN1_GROUP2FIELDID
,
397 else if (field_type
== NID_X9_62_ppBasis
)
399 unsigned int k1
, k2
, k3
;
401 if (!EC_GROUP_get_pentanomial_basis(group
, &k1
, &k2
, &k3
))
404 char_two
->p
.ppBasis
= X9_62_PENTANOMIAL_new();
405 if (!char_two
->p
.ppBasis
)
407 ECerr(EC_F_EC_ASN1_GROUP2FIELDID
, ERR_R_MALLOC_FAILURE
);
412 char_two
->p
.ppBasis
->k1
= (long)k1
;
413 char_two
->p
.ppBasis
->k2
= (long)k2
;
414 char_two
->p
.ppBasis
->k3
= (long)k3
;
416 else /* field_type == NID_X9_62_onBasis */
418 /* for ONB the parameters are (asn1) NULL */
419 char_two
->p
.onBasis
= ASN1_NULL_new();
420 if (!char_two
->p
.onBasis
)
422 ECerr(EC_F_EC_ASN1_GROUP2FIELDID
, ERR_R_MALLOC_FAILURE
);
436 static int ec_asn1_group2curve(const EC_GROUP
*group
, X9_62_CURVE
*curve
)
439 BIGNUM
*tmp_1
=NULL
, *tmp_2
=NULL
;
440 unsigned char *buffer_1
=NULL
, *buffer_2
=NULL
,
441 *a_buf
=NULL
, *b_buf
=NULL
;
443 unsigned char char_zero
= 0;
445 if (!group
|| !curve
|| !curve
->a
|| !curve
->b
)
448 if ((tmp_1
= BN_new()) == NULL
|| (tmp_2
= BN_new()) == NULL
)
450 ECerr(EC_F_EC_ASN1_GROUP2CURVE
, ERR_R_MALLOC_FAILURE
);
454 nid
= EC_METHOD_get_field_type(EC_GROUP_method_of(group
));
457 if (nid
== NID_X9_62_prime_field
)
459 if (!EC_GROUP_get_curve_GFp(group
, NULL
, tmp_1
, tmp_2
, NULL
))
461 ECerr(EC_F_EC_ASN1_GROUP2CURVE
, ERR_R_EC_LIB
);
465 #ifndef OPENSSL_NO_EC2M
466 else /* nid == NID_X9_62_characteristic_two_field */
468 if (!EC_GROUP_get_curve_GF2m(group
, NULL
, tmp_1
, tmp_2
, NULL
))
470 ECerr(EC_F_EC_ASN1_GROUP2CURVE
, ERR_R_EC_LIB
);
475 len_1
= (size_t)BN_num_bytes(tmp_1
);
476 len_2
= (size_t)BN_num_bytes(tmp_2
);
480 /* len_1 == 0 => a == 0 */
486 if ((buffer_1
= OPENSSL_malloc(len_1
)) == NULL
)
488 ECerr(EC_F_EC_ASN1_GROUP2CURVE
,
489 ERR_R_MALLOC_FAILURE
);
492 if ( (len_1
= BN_bn2bin(tmp_1
, buffer_1
)) == 0)
494 ECerr(EC_F_EC_ASN1_GROUP2CURVE
, ERR_R_BN_LIB
);
502 /* len_2 == 0 => b == 0 */
508 if ((buffer_2
= OPENSSL_malloc(len_2
)) == NULL
)
510 ECerr(EC_F_EC_ASN1_GROUP2CURVE
,
511 ERR_R_MALLOC_FAILURE
);
514 if ( (len_2
= BN_bn2bin(tmp_2
, buffer_2
)) == 0)
516 ECerr(EC_F_EC_ASN1_GROUP2CURVE
, ERR_R_BN_LIB
);
523 if (!M_ASN1_OCTET_STRING_set(curve
->a
, a_buf
, len_1
) ||
524 !M_ASN1_OCTET_STRING_set(curve
->b
, b_buf
, len_2
))
526 ECerr(EC_F_EC_ASN1_GROUP2CURVE
, ERR_R_ASN1_LIB
);
530 /* set the seed (optional) */
534 if ((curve
->seed
= ASN1_BIT_STRING_new()) == NULL
)
536 ECerr(EC_F_EC_ASN1_GROUP2CURVE
, ERR_R_MALLOC_FAILURE
);
539 curve
->seed
->flags
&= ~(ASN1_STRING_FLAG_BITS_LEFT
|0x07);
540 curve
->seed
->flags
|= ASN1_STRING_FLAG_BITS_LEFT
;
541 if (!ASN1_BIT_STRING_set(curve
->seed
, group
->seed
,
542 (int)group
->seed_len
))
544 ECerr(EC_F_EC_ASN1_GROUP2CURVE
, ERR_R_ASN1_LIB
);
552 ASN1_BIT_STRING_free(curve
->seed
);
560 OPENSSL_free(buffer_1
);
562 OPENSSL_free(buffer_2
);
570 static ECPARAMETERS
*ec_asn1_group2parameters(const EC_GROUP
*group
,
575 ECPARAMETERS
*ret
=NULL
;
577 unsigned char *buffer
=NULL
;
578 const EC_POINT
*point
=NULL
;
579 point_conversion_form_t form
;
581 if ((tmp
= BN_new()) == NULL
)
583 ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS
, ERR_R_MALLOC_FAILURE
);
589 if ((ret
= ECPARAMETERS_new()) == NULL
)
591 ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS
,
592 ERR_R_MALLOC_FAILURE
);
599 /* set the version (always one) */
600 ret
->version
= (long)0x1;
602 /* set the fieldID */
603 if (!ec_asn1_group2fieldid(group
, ret
->fieldID
))
605 ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS
, ERR_R_EC_LIB
);
610 if (!ec_asn1_group2curve(group
, ret
->curve
))
612 ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS
, ERR_R_EC_LIB
);
616 /* set the base point */
617 if ((point
= EC_GROUP_get0_generator(group
)) == NULL
)
619 ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS
, EC_R_UNDEFINED_GENERATOR
);
623 form
= EC_GROUP_get_point_conversion_form(group
);
625 len
= EC_POINT_point2oct(group
, point
, form
, NULL
, len
, NULL
);
628 ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS
, ERR_R_EC_LIB
);
631 if ((buffer
= OPENSSL_malloc(len
)) == NULL
)
633 ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS
, ERR_R_MALLOC_FAILURE
);
636 if (!EC_POINT_point2oct(group
, point
, form
, buffer
, len
, NULL
))
638 ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS
, ERR_R_EC_LIB
);
641 if (ret
->base
== NULL
&& (ret
->base
= ASN1_OCTET_STRING_new()) == NULL
)
643 ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS
, ERR_R_MALLOC_FAILURE
);
646 if (!ASN1_OCTET_STRING_set(ret
->base
, buffer
, len
))
648 ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS
, ERR_R_ASN1_LIB
);
653 if (!EC_GROUP_get_order(group
, tmp
, NULL
))
655 ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS
, ERR_R_EC_LIB
);
658 ret
->order
= BN_to_ASN1_INTEGER(tmp
, ret
->order
);
659 if (ret
->order
== NULL
)
661 ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS
, ERR_R_ASN1_LIB
);
665 /* set the cofactor (optional) */
666 if (EC_GROUP_get_cofactor(group
, tmp
, NULL
))
668 ret
->cofactor
= BN_to_ASN1_INTEGER(tmp
, ret
->cofactor
);
669 if (ret
->cofactor
== NULL
)
671 ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS
, ERR_R_ASN1_LIB
);
681 ECPARAMETERS_free(ret
);
687 OPENSSL_free(buffer
);
691 ECPKPARAMETERS
*ec_asn1_group2pkparameters(const EC_GROUP
*group
,
692 ECPKPARAMETERS
*params
)
695 ECPKPARAMETERS
*ret
= params
;
699 if ((ret
= ECPKPARAMETERS_new()) == NULL
)
701 ECerr(EC_F_EC_ASN1_GROUP2PKPARAMETERS
,
702 ERR_R_MALLOC_FAILURE
);
708 if (ret
->type
== 0 && ret
->value
.named_curve
)
709 ASN1_OBJECT_free(ret
->value
.named_curve
);
710 else if (ret
->type
== 1 && ret
->value
.parameters
)
711 ECPARAMETERS_free(ret
->value
.parameters
);
714 if (EC_GROUP_get_asn1_flag(group
))
716 /* use the asn1 OID to describe the
717 * the elliptic curve parameters
719 tmp
= EC_GROUP_get_curve_name(group
);
723 if ((ret
->value
.named_curve
= OBJ_nid2obj(tmp
)) == NULL
)
727 /* we don't kmow the nid => ERROR */
732 /* use the ECPARAMETERS structure */
734 if ((ret
->value
.parameters
= ec_asn1_group2parameters(
735 group
, NULL
)) == NULL
)
741 ECPKPARAMETERS_free(ret
);
747 static EC_GROUP
*ec_asn1_parameters2group(const ECPARAMETERS
*params
)
750 EC_GROUP
*ret
= NULL
;
751 BIGNUM
*p
= NULL
, *a
= NULL
, *b
= NULL
;
752 EC_POINT
*point
=NULL
;
755 if (!params
->fieldID
|| !params
->fieldID
->fieldType
||
756 !params
->fieldID
->p
.ptr
)
758 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, EC_R_ASN1_ERROR
);
762 /* now extract the curve parameters a and b */
763 if (!params
->curve
|| !params
->curve
->a
||
764 !params
->curve
->a
->data
|| !params
->curve
->b
||
765 !params
->curve
->b
->data
)
767 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, EC_R_ASN1_ERROR
);
770 a
= BN_bin2bn(params
->curve
->a
->data
, params
->curve
->a
->length
, NULL
);
773 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, ERR_R_BN_LIB
);
776 b
= BN_bin2bn(params
->curve
->b
->data
, params
->curve
->b
->length
, NULL
);
779 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, ERR_R_BN_LIB
);
783 /* get the field parameters */
784 tmp
= OBJ_obj2nid(params
->fieldID
->fieldType
);
785 if (tmp
== NID_X9_62_characteristic_two_field
)
786 #ifdef OPENSSL_NO_EC2M
788 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, EC_R_GF2M_NOT_SUPPORTED
);
793 X9_62_CHARACTERISTIC_TWO
*char_two
;
795 char_two
= params
->fieldID
->p
.char_two
;
797 field_bits
= char_two
->m
;
798 if (field_bits
> OPENSSL_ECC_MAX_FIELD_BITS
)
800 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, EC_R_FIELD_TOO_LARGE
);
804 if ((p
= BN_new()) == NULL
)
806 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, ERR_R_MALLOC_FAILURE
);
810 /* get the base type */
811 tmp
= OBJ_obj2nid(char_two
->type
);
813 if (tmp
== NID_X9_62_tpBasis
)
817 if (!char_two
->p
.tpBasis
)
819 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, EC_R_ASN1_ERROR
);
823 tmp_long
= ASN1_INTEGER_get(char_two
->p
.tpBasis
);
825 if (!(char_two
->m
> tmp_long
&& tmp_long
> 0))
827 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, EC_R_INVALID_TRINOMIAL_BASIS
);
831 /* create the polynomial */
832 if (!BN_set_bit(p
, (int)char_two
->m
))
834 if (!BN_set_bit(p
, (int)tmp_long
))
836 if (!BN_set_bit(p
, 0))
839 else if (tmp
== NID_X9_62_ppBasis
)
841 X9_62_PENTANOMIAL
*penta
;
843 penta
= char_two
->p
.ppBasis
;
846 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, EC_R_ASN1_ERROR
);
850 if (!(char_two
->m
> penta
->k3
&& penta
->k3
> penta
->k2
&& penta
->k2
> penta
->k1
&& penta
->k1
> 0))
852 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, EC_R_INVALID_PENTANOMIAL_BASIS
);
856 /* create the polynomial */
857 if (!BN_set_bit(p
, (int)char_two
->m
)) goto err
;
858 if (!BN_set_bit(p
, (int)penta
->k1
)) goto err
;
859 if (!BN_set_bit(p
, (int)penta
->k2
)) goto err
;
860 if (!BN_set_bit(p
, (int)penta
->k3
)) goto err
;
861 if (!BN_set_bit(p
, 0)) goto err
;
863 else if (tmp
== NID_X9_62_onBasis
)
865 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, EC_R_NOT_IMPLEMENTED
);
870 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, EC_R_ASN1_ERROR
);
874 /* create the EC_GROUP structure */
875 ret
= EC_GROUP_new_curve_GF2m(p
, a
, b
, NULL
);
878 else if (tmp
== NID_X9_62_prime_field
)
880 /* we have a curve over a prime field */
881 /* extract the prime number */
882 if (!params
->fieldID
->p
.prime
)
884 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, EC_R_ASN1_ERROR
);
887 p
= ASN1_INTEGER_to_BN(params
->fieldID
->p
.prime
, NULL
);
890 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, ERR_R_ASN1_LIB
);
894 if (BN_is_negative(p
) || BN_is_zero(p
))
896 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, EC_R_INVALID_FIELD
);
900 field_bits
= BN_num_bits(p
);
901 if (field_bits
> OPENSSL_ECC_MAX_FIELD_BITS
)
903 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, EC_R_FIELD_TOO_LARGE
);
907 /* create the EC_GROUP structure */
908 ret
= EC_GROUP_new_curve_GFp(p
, a
, b
, NULL
);
912 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, EC_R_INVALID_FIELD
);
918 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, ERR_R_EC_LIB
);
922 /* extract seed (optional) */
923 if (params
->curve
->seed
!= NULL
)
925 if (ret
->seed
!= NULL
)
926 OPENSSL_free(ret
->seed
);
927 if (!(ret
->seed
= OPENSSL_malloc(params
->curve
->seed
->length
)))
929 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
,
930 ERR_R_MALLOC_FAILURE
);
933 memcpy(ret
->seed
, params
->curve
->seed
->data
,
934 params
->curve
->seed
->length
);
935 ret
->seed_len
= params
->curve
->seed
->length
;
938 if (!params
->order
|| !params
->base
|| !params
->base
->data
)
940 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, EC_R_ASN1_ERROR
);
944 if ((point
= EC_POINT_new(ret
)) == NULL
) goto err
;
946 /* set the point conversion form */
947 EC_GROUP_set_point_conversion_form(ret
, (point_conversion_form_t
)
948 (params
->base
->data
[0] & ~0x01));
950 /* extract the ec point */
951 if (!EC_POINT_oct2point(ret
, point
, params
->base
->data
,
952 params
->base
->length
, NULL
))
954 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, ERR_R_EC_LIB
);
958 /* extract the order */
959 if ((a
= ASN1_INTEGER_to_BN(params
->order
, a
)) == NULL
)
961 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, ERR_R_ASN1_LIB
);
964 if (BN_is_negative(a
) || BN_is_zero(a
))
966 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, EC_R_INVALID_GROUP_ORDER
);
969 if (BN_num_bits(a
) > (int)field_bits
+ 1) /* Hasse bound */
971 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, EC_R_INVALID_GROUP_ORDER
);
975 /* extract the cofactor (optional) */
976 if (params
->cofactor
== NULL
)
985 if ((b
= ASN1_INTEGER_to_BN(params
->cofactor
, b
)) == NULL
)
987 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, ERR_R_ASN1_LIB
);
990 /* set the generator, order and cofactor (if present) */
991 if (!EC_GROUP_set_generator(ret
, point
, a
, b
))
993 ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP
, ERR_R_EC_LIB
);
1002 EC_GROUP_clear_free(ret
);
1013 EC_POINT_free(point
);
1017 EC_GROUP
*ec_asn1_pkparameters2group(const ECPKPARAMETERS
*params
)
1024 ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP
,
1025 EC_R_MISSING_PARAMETERS
);
1029 if (params
->type
== 0)
1030 { /* the curve is given by an OID */
1031 tmp
= OBJ_obj2nid(params
->value
.named_curve
);
1032 if ((ret
= EC_GROUP_new_by_curve_name(tmp
)) == NULL
)
1034 ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP
,
1035 EC_R_EC_GROUP_NEW_BY_NAME_FAILURE
);
1038 EC_GROUP_set_asn1_flag(ret
, OPENSSL_EC_NAMED_CURVE
);
1040 else if (params
->type
== 1)
1041 { /* the parameters are given by a ECPARAMETERS
1043 ret
= ec_asn1_parameters2group(params
->value
.parameters
);
1046 ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP
, ERR_R_EC_LIB
);
1049 EC_GROUP_set_asn1_flag(ret
, 0x0);
1051 else if (params
->type
== 2)
1052 { /* implicitlyCA */
1057 ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP
, EC_R_ASN1_ERROR
);
1064 /* EC_GROUP <-> DER encoding of ECPKPARAMETERS */
1066 EC_GROUP
*d2i_ECPKParameters(EC_GROUP
**a
, const unsigned char **in
, long len
)
1068 EC_GROUP
*group
= NULL
;
1069 ECPKPARAMETERS
*params
= NULL
;
1071 if ((params
= d2i_ECPKPARAMETERS(NULL
, in
, len
)) == NULL
)
1073 ECerr(EC_F_D2I_ECPKPARAMETERS
, EC_R_D2I_ECPKPARAMETERS_FAILURE
);
1074 ECPKPARAMETERS_free(params
);
1078 if ((group
= ec_asn1_pkparameters2group(params
)) == NULL
)
1080 ECerr(EC_F_D2I_ECPKPARAMETERS
, EC_R_PKPARAMETERS2GROUP_FAILURE
);
1081 ECPKPARAMETERS_free(params
);
1087 EC_GROUP_clear_free(*a
);
1091 ECPKPARAMETERS_free(params
);
1095 int i2d_ECPKParameters(const EC_GROUP
*a
, unsigned char **out
)
1098 ECPKPARAMETERS
*tmp
= ec_asn1_group2pkparameters(a
, NULL
);
1101 ECerr(EC_F_I2D_ECPKPARAMETERS
, EC_R_GROUP2PKPARAMETERS_FAILURE
);
1104 if ((ret
= i2d_ECPKPARAMETERS(tmp
, out
)) == 0)
1106 ECerr(EC_F_I2D_ECPKPARAMETERS
, EC_R_I2D_ECPKPARAMETERS_FAILURE
);
1107 ECPKPARAMETERS_free(tmp
);
1110 ECPKPARAMETERS_free(tmp
);
1114 /* some EC_KEY functions */
1116 EC_KEY
*d2i_ECPrivateKey(EC_KEY
**a
, const unsigned char **in
, long len
)
1120 EC_PRIVATEKEY
*priv_key
=NULL
;
1122 if ((priv_key
= EC_PRIVATEKEY_new()) == NULL
)
1124 ECerr(EC_F_D2I_ECPRIVATEKEY
, ERR_R_MALLOC_FAILURE
);
1128 if ((priv_key
= d2i_EC_PRIVATEKEY(&priv_key
, in
, len
)) == NULL
)
1130 ECerr(EC_F_D2I_ECPRIVATEKEY
, ERR_R_EC_LIB
);
1131 EC_PRIVATEKEY_free(priv_key
);
1135 if (a
== NULL
|| *a
== NULL
)
1137 if ((ret
= EC_KEY_new()) == NULL
)
1139 ECerr(EC_F_D2I_ECPRIVATEKEY
,
1140 ERR_R_MALLOC_FAILURE
);
1149 if (priv_key
->parameters
)
1152 EC_GROUP_clear_free(ret
->group
);
1153 ret
->group
= ec_asn1_pkparameters2group(priv_key
->parameters
);
1156 if (ret
->group
== NULL
)
1158 ECerr(EC_F_D2I_ECPRIVATEKEY
, ERR_R_EC_LIB
);
1162 ret
->version
= priv_key
->version
;
1164 if (priv_key
->privateKey
)
1166 ret
->priv_key
= BN_bin2bn(
1167 M_ASN1_STRING_data(priv_key
->privateKey
),
1168 M_ASN1_STRING_length(priv_key
->privateKey
),
1170 if (ret
->priv_key
== NULL
)
1172 ECerr(EC_F_D2I_ECPRIVATEKEY
,
1179 ECerr(EC_F_D2I_ECPRIVATEKEY
,
1180 EC_R_MISSING_PRIVATE_KEY
);
1184 if (priv_key
->publicKey
)
1186 const unsigned char *pub_oct
;
1190 EC_POINT_clear_free(ret
->pub_key
);
1191 ret
->pub_key
= EC_POINT_new(ret
->group
);
1192 if (ret
->pub_key
== NULL
)
1194 ECerr(EC_F_D2I_ECPRIVATEKEY
, ERR_R_EC_LIB
);
1197 pub_oct
= M_ASN1_STRING_data(priv_key
->publicKey
);
1198 pub_oct_len
= M_ASN1_STRING_length(priv_key
->publicKey
);
1199 /* save the point conversion form */
1200 ret
->conv_form
= (point_conversion_form_t
)(pub_oct
[0] & ~0x01);
1201 if (!EC_POINT_oct2point(ret
->group
, ret
->pub_key
,
1202 pub_oct
, pub_oct_len
, NULL
))
1204 ECerr(EC_F_D2I_ECPRIVATEKEY
, ERR_R_EC_LIB
);
1219 EC_PRIVATEKEY_free(priv_key
);
1224 int i2d_ECPrivateKey(EC_KEY
*a
, unsigned char **out
)
1227 unsigned char *buffer
=NULL
;
1228 size_t buf_len
=0, tmp_len
;
1229 EC_PRIVATEKEY
*priv_key
=NULL
;
1231 if (a
== NULL
|| a
->group
== NULL
|| a
->priv_key
== NULL
)
1233 ECerr(EC_F_I2D_ECPRIVATEKEY
,
1234 ERR_R_PASSED_NULL_PARAMETER
);
1238 if ((priv_key
= EC_PRIVATEKEY_new()) == NULL
)
1240 ECerr(EC_F_I2D_ECPRIVATEKEY
,
1241 ERR_R_MALLOC_FAILURE
);
1245 priv_key
->version
= a
->version
;
1247 buf_len
= (size_t)BN_num_bytes(a
->priv_key
);
1248 buffer
= OPENSSL_malloc(buf_len
);
1251 ECerr(EC_F_I2D_ECPRIVATEKEY
,
1252 ERR_R_MALLOC_FAILURE
);
1256 if (!BN_bn2bin(a
->priv_key
, buffer
))
1258 ECerr(EC_F_I2D_ECPRIVATEKEY
, ERR_R_BN_LIB
);
1262 if (!M_ASN1_OCTET_STRING_set(priv_key
->privateKey
, buffer
, buf_len
))
1264 ECerr(EC_F_I2D_ECPRIVATEKEY
, ERR_R_ASN1_LIB
);
1268 if (!(a
->enc_flag
& EC_PKEY_NO_PARAMETERS
))
1270 if ((priv_key
->parameters
= ec_asn1_group2pkparameters(
1271 a
->group
, priv_key
->parameters
)) == NULL
)
1273 ECerr(EC_F_I2D_ECPRIVATEKEY
, ERR_R_EC_LIB
);
1278 if (!(a
->enc_flag
& EC_PKEY_NO_PUBKEY
))
1280 priv_key
->publicKey
= M_ASN1_BIT_STRING_new();
1281 if (priv_key
->publicKey
== NULL
)
1283 ECerr(EC_F_I2D_ECPRIVATEKEY
,
1284 ERR_R_MALLOC_FAILURE
);
1288 tmp_len
= EC_POINT_point2oct(a
->group
, a
->pub_key
,
1289 a
->conv_form
, NULL
, 0, NULL
);
1291 if (tmp_len
> buf_len
)
1293 unsigned char *tmp_buffer
= OPENSSL_realloc(buffer
, tmp_len
);
1296 ECerr(EC_F_I2D_ECPRIVATEKEY
, ERR_R_MALLOC_FAILURE
);
1299 buffer
= tmp_buffer
;
1303 if (!EC_POINT_point2oct(a
->group
, a
->pub_key
,
1304 a
->conv_form
, buffer
, buf_len
, NULL
))
1306 ECerr(EC_F_I2D_ECPRIVATEKEY
, ERR_R_EC_LIB
);
1310 priv_key
->publicKey
->flags
&= ~(ASN1_STRING_FLAG_BITS_LEFT
|0x07);
1311 priv_key
->publicKey
->flags
|= ASN1_STRING_FLAG_BITS_LEFT
;
1312 if (!M_ASN1_BIT_STRING_set(priv_key
->publicKey
, buffer
,
1315 ECerr(EC_F_I2D_ECPRIVATEKEY
, ERR_R_ASN1_LIB
);
1320 if ((ret
= i2d_EC_PRIVATEKEY(priv_key
, out
)) == 0)
1322 ECerr(EC_F_I2D_ECPRIVATEKEY
, ERR_R_EC_LIB
);
1328 OPENSSL_free(buffer
);
1330 EC_PRIVATEKEY_free(priv_key
);
1334 int i2d_ECParameters(EC_KEY
*a
, unsigned char **out
)
1338 ECerr(EC_F_I2D_ECPARAMETERS
, ERR_R_PASSED_NULL_PARAMETER
);
1341 return i2d_ECPKParameters(a
->group
, out
);
1344 EC_KEY
*d2i_ECParameters(EC_KEY
**a
, const unsigned char **in
, long len
)
1348 if (in
== NULL
|| *in
== NULL
)
1350 ECerr(EC_F_D2I_ECPARAMETERS
, ERR_R_PASSED_NULL_PARAMETER
);
1354 if (a
== NULL
|| *a
== NULL
)
1356 if ((ret
= EC_KEY_new()) == NULL
)
1358 ECerr(EC_F_D2I_ECPARAMETERS
, ERR_R_MALLOC_FAILURE
);
1367 if (!d2i_ECPKParameters(&ret
->group
, in
, len
))
1369 ECerr(EC_F_D2I_ECPARAMETERS
, ERR_R_EC_LIB
);
1376 EC_KEY
*o2i_ECPublicKey(EC_KEY
**a
, const unsigned char **in
, long len
)
1380 if (a
== NULL
|| (*a
) == NULL
|| (*a
)->group
== NULL
)
1382 /* sorry, but a EC_GROUP-structur is necessary
1383 * to set the public key */
1384 ECerr(EC_F_O2I_ECPUBLICKEY
, ERR_R_PASSED_NULL_PARAMETER
);
1388 if (ret
->pub_key
== NULL
&&
1389 (ret
->pub_key
= EC_POINT_new(ret
->group
)) == NULL
)
1391 ECerr(EC_F_O2I_ECPUBLICKEY
, ERR_R_MALLOC_FAILURE
);
1394 if (!EC_POINT_oct2point(ret
->group
, ret
->pub_key
, *in
, len
, NULL
))
1396 ECerr(EC_F_O2I_ECPUBLICKEY
, ERR_R_EC_LIB
);
1399 /* save the point conversion form */
1400 ret
->conv_form
= (point_conversion_form_t
)(*in
[0] & ~0x01);
1405 int i2o_ECPublicKey(EC_KEY
*a
, unsigned char **out
)
1412 ECerr(EC_F_I2O_ECPUBLICKEY
, ERR_R_PASSED_NULL_PARAMETER
);
1416 buf_len
= EC_POINT_point2oct(a
->group
, a
->pub_key
,
1417 a
->conv_form
, NULL
, 0, NULL
);
1419 if (out
== NULL
|| buf_len
== 0)
1420 /* out == NULL => just return the length of the octet string */
1425 if ((*out
= OPENSSL_malloc(buf_len
)) == NULL
)
1427 ECerr(EC_F_I2O_ECPUBLICKEY
, ERR_R_MALLOC_FAILURE
);
1432 if (!EC_POINT_point2oct(a
->group
, a
->pub_key
, a
->conv_form
,
1433 *out
, buf_len
, NULL
))
1435 ECerr(EC_F_I2O_ECPUBLICKEY
, ERR_R_EC_LIB
);