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