OpenCoverage

ec_asn1.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/ec/ec_asn1.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: ec_asn1.c,v 1.31 2018/09/01 16:23:15 tb Exp $ */-
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-
61#include <openssl/opensslconf.h>-
62-
63#include "ec_lcl.h"-
64#include <openssl/err.h>-
65#include <openssl/asn1t.h>-
66#include <openssl/objects.h>-
67-
68int -
69EC_GROUP_get_basis_type(const EC_GROUP * group)-
70{-
71 int i = 0;-
72-
73 if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) !=
EC_METHOD_get_...group)) != 407Description
TRUEnever evaluated
FALSEnever evaluated
0
74 NID_X9_62_characteristic_two_field)
EC_METHOD_get_...group)) != 407Description
TRUEnever evaluated
FALSEnever evaluated
0
75 /* everything else is currently not supported */-
76 return 0;
never executed: return 0;
0
77-
78 while (group->poly[i] != 0)
group->poly[i] != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
79 i++;
never executed: i++;
0
80-
81 if (i == 4)
i == 4Description
TRUEnever evaluated
FALSEnever evaluated
0
82 return NID_X9_62_ppBasis;
never executed: return 683;
0
83 else if (i == 2)
i == 2Description
TRUEnever evaluated
FALSEnever evaluated
0
84 return NID_X9_62_tpBasis;
never executed: return 682;
0
85 else-
86 /* everything else is currently not supported */-
87 return 0;
never executed: return 0;
0
88}-
89-
90#ifndef OPENSSL_NO_EC2M-
91int -
92EC_GROUP_get_trinomial_basis(const EC_GROUP * group, unsigned int *k)-
93{-
94 if (group == NULL)
group == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
95 return 0;
never executed: return 0;
0
96-
97 if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) !=
EC_METHOD_get_...group)) != 407Description
TRUEnever evaluated
FALSEnever evaluated
0
98 NID_X9_62_characteristic_two_field
EC_METHOD_get_...group)) != 407Description
TRUEnever evaluated
FALSEnever evaluated
0
99 || !((group->poly[0] != 0) && (group->poly[1] != 0) && (group->poly[2] == 0))) {
(group->poly[0] != 0)Description
TRUEnever evaluated
FALSEnever evaluated
(group->poly[1] != 0)Description
TRUEnever evaluated
FALSEnever evaluated
(group->poly[2] == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
100 ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);-
101 return 0;
never executed: return 0;
0
102 }-
103 if (k)
kDescription
TRUEnever evaluated
FALSEnever evaluated
0
104 *k = group->poly[1];
never executed: *k = group->poly[1];
0
105-
106 return 1;
never executed: return 1;
0
107}-
108-
109int -
110EC_GROUP_get_pentanomial_basis(const EC_GROUP * group, unsigned int *k1,-
111 unsigned int *k2, unsigned int *k3)-
112{-
113 if (group == NULL)
group == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
114 return 0;
never executed: return 0;
0
115-
116 if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) !=
EC_METHOD_get_...group)) != 407Description
TRUEnever evaluated
FALSEnever evaluated
0
117 NID_X9_62_characteristic_two_field
EC_METHOD_get_...group)) != 407Description
TRUEnever evaluated
FALSEnever evaluated
0
118 || !((group->poly[0] != 0) && (group->poly[1] != 0) && (group->poly[2] != 0) && (group->poly[3] != 0) && (group->poly[4] == 0))) {
(group->poly[0] != 0)Description
TRUEnever evaluated
FALSEnever evaluated
(group->poly[1] != 0)Description
TRUEnever evaluated
FALSEnever evaluated
(group->poly[2] != 0)Description
TRUEnever evaluated
FALSEnever evaluated
(group->poly[3] != 0)Description
TRUEnever evaluated
FALSEnever evaluated
(group->poly[4] == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
119 ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);-
120 return 0;
never executed: return 0;
0
121 }-
122 if (k1)
k1Description
TRUEnever evaluated
FALSEnever evaluated
0
123 *k1 = group->poly[3];
never executed: *k1 = group->poly[3];
0
124 if (k2)
k2Description
TRUEnever evaluated
FALSEnever evaluated
0
125 *k2 = group->poly[2];
never executed: *k2 = group->poly[2];
0
126 if (k3)
k3Description
TRUEnever evaluated
FALSEnever evaluated
0
127 *k3 = group->poly[1];
never executed: *k3 = group->poly[1];
0
128-
129 return 1;
never executed: return 1;
0
130}-
131#endif-
132-
133/* some structures needed for the asn1 encoding */-
134typedef struct x9_62_pentanomial_st {-
135 long k1;-
136 long k2;-
137 long k3;-
138} X9_62_PENTANOMIAL;-
139-
140typedef struct x9_62_characteristic_two_st {-
141 long m;-
142 ASN1_OBJECT *type;-
143 union {-
144 char *ptr;-
145 /* NID_X9_62_onBasis */-
146 ASN1_NULL *onBasis;-
147 /* NID_X9_62_tpBasis */-
148 ASN1_INTEGER *tpBasis;-
149 /* NID_X9_62_ppBasis */-
150 X9_62_PENTANOMIAL *ppBasis;-
151 /* anything else */-
152 ASN1_TYPE *other;-
153 } p;-
154} X9_62_CHARACTERISTIC_TWO;-
155-
156typedef struct x9_62_fieldid_st {-
157 ASN1_OBJECT *fieldType;-
158 union {-
159 char *ptr;-
160 /* NID_X9_62_prime_field */-
161 ASN1_INTEGER *prime;-
162 /* NID_X9_62_characteristic_two_field */-
163 X9_62_CHARACTERISTIC_TWO *char_two;-
164 /* anything else */-
165 ASN1_TYPE *other;-
166 } p;-
167} X9_62_FIELDID;-
168-
169typedef struct x9_62_curve_st {-
170 ASN1_OCTET_STRING *a;-
171 ASN1_OCTET_STRING *b;-
172 ASN1_BIT_STRING *seed;-
173} X9_62_CURVE;-
174-
175typedef struct ec_parameters_st {-
176 long version;-
177 X9_62_FIELDID *fieldID;-
178 X9_62_CURVE *curve;-
179 ASN1_OCTET_STRING *base;-
180 ASN1_INTEGER *order;-
181 ASN1_INTEGER *cofactor;-
182} ECPARAMETERS;-
183-
184struct ecpk_parameters_st {-
185 int type;-
186 union {-
187 ASN1_OBJECT *named_curve;-
188 ECPARAMETERS *parameters;-
189 ASN1_NULL *implicitlyCA;-
190 } value;-
191} /* ECPKPARAMETERS */ ;-
192-
193/* SEC1 ECPrivateKey */-
194typedef struct ec_privatekey_st {-
195 long version;-
196 ASN1_OCTET_STRING *privateKey;-
197 ECPKPARAMETERS *parameters;-
198 ASN1_BIT_STRING *publicKey;-
199} EC_PRIVATEKEY;-
200-
201/* the OpenSSL ASN.1 definitions */-
202static const ASN1_TEMPLATE X9_62_PENTANOMIAL_seq_tt[] = {-
203 {-
204 .flags = 0,-
205 .tag = 0,-
206 .offset = offsetof(X9_62_PENTANOMIAL, k1),-
207 .field_name = "k1",-
208 .item = &LONG_it,-
209 },-
210 {-
211 .flags = 0,-
212 .tag = 0,-
213 .offset = offsetof(X9_62_PENTANOMIAL, k2),-
214 .field_name = "k2",-
215 .item = &LONG_it,-
216 },-
217 {-
218 .flags = 0,-
219 .tag = 0,-
220 .offset = offsetof(X9_62_PENTANOMIAL, k3),-
221 .field_name = "k3",-
222 .item = &LONG_it,-
223 },-
224};-
225-
226const ASN1_ITEM X9_62_PENTANOMIAL_it = {-
227 .itype = ASN1_ITYPE_SEQUENCE,-
228 .utype = V_ASN1_SEQUENCE,-
229 .templates = X9_62_PENTANOMIAL_seq_tt,-
230 .tcount = sizeof(X9_62_PENTANOMIAL_seq_tt) / sizeof(ASN1_TEMPLATE),-
231 .funcs = NULL,-
232 .size = sizeof(X9_62_PENTANOMIAL),-
233 .sname = "X9_62_PENTANOMIAL",-
234};-
235-
236X9_62_PENTANOMIAL *X9_62_PENTANOMIAL_new(void);-
237void X9_62_PENTANOMIAL_free(X9_62_PENTANOMIAL *a);-
238-
239X9_62_PENTANOMIAL *-
240X9_62_PENTANOMIAL_new(void)-
241{-
242 return (X9_62_PENTANOMIAL*)ASN1_item_new(&X9_62_PENTANOMIAL_it);
never executed: return (X9_62_PENTANOMIAL*)ASN1_item_new(&X9_62_PENTANOMIAL_it);
0
243}-
244-
245void-
246X9_62_PENTANOMIAL_free(X9_62_PENTANOMIAL *a)-
247{-
248 ASN1_item_free((ASN1_VALUE *)a, &X9_62_PENTANOMIAL_it);-
249}
never executed: end of block
0
250-
251static const ASN1_TEMPLATE char_two_def_tt = {-
252 .flags = 0,-
253 .tag = 0,-
254 .offset = offsetof(X9_62_CHARACTERISTIC_TWO, p.other),-
255 .field_name = "p.other",-
256 .item = &ASN1_ANY_it,-
257};-
258-
259static const ASN1_ADB_TABLE X9_62_CHARACTERISTIC_TWO_adbtbl[] = {-
260 {-
261 .value = NID_X9_62_onBasis,-
262 .tt = {-
263 .flags = 0,-
264 .tag = 0,-
265 .offset = offsetof(X9_62_CHARACTERISTIC_TWO, p.onBasis),-
266 .field_name = "p.onBasis",-
267 .item = &ASN1_NULL_it,-
268 },-
269 -
270 },-
271 {-
272 .value = NID_X9_62_tpBasis,-
273 .tt = {-
274 .flags = 0,-
275 .tag = 0,-
276 .offset = offsetof(X9_62_CHARACTERISTIC_TWO, p.tpBasis),-
277 .field_name = "p.tpBasis",-
278 .item = &ASN1_INTEGER_it,-
279 },-
280 -
281 },-
282 {-
283 .value = NID_X9_62_ppBasis,-
284 .tt = {-
285 .flags = 0,-
286 .tag = 0,-
287 .offset = offsetof(X9_62_CHARACTERISTIC_TWO, p.ppBasis),-
288 .field_name = "p.ppBasis",-
289 .item = &X9_62_PENTANOMIAL_it,-
290 },-
291 -
292 },-
293};-
294-
295static const ASN1_ADB X9_62_CHARACTERISTIC_TWO_adb = {-
296 .flags = 0,-
297 .offset = offsetof(X9_62_CHARACTERISTIC_TWO, type),-
298 .app_items = 0,-
299 .tbl = X9_62_CHARACTERISTIC_TWO_adbtbl,-
300 .tblcount = sizeof(X9_62_CHARACTERISTIC_TWO_adbtbl) / sizeof(ASN1_ADB_TABLE),-
301 .default_tt = &char_two_def_tt,-
302 .null_tt = NULL,-
303};-
304-
305static const ASN1_TEMPLATE X9_62_CHARACTERISTIC_TWO_seq_tt[] = {-
306 {-
307 .flags = 0,-
308 .tag = 0,-
309 .offset = offsetof(X9_62_CHARACTERISTIC_TWO, m),-
310 .field_name = "m",-
311 .item = &LONG_it,-
312 },-
313 {-
314 .flags = 0,-
315 .tag = 0,-
316 .offset = offsetof(X9_62_CHARACTERISTIC_TWO, type),-
317 .field_name = "type",-
318 .item = &ASN1_OBJECT_it,-
319 },-
320 {-
321 .flags = ASN1_TFLG_ADB_OID,-
322 .tag = -1,-
323 .offset = 0,-
324 .field_name = "X9_62_CHARACTERISTIC_TWO",-
325 .item = (const ASN1_ITEM *)&X9_62_CHARACTERISTIC_TWO_adb,-
326 },-
327};-
328-
329const ASN1_ITEM X9_62_CHARACTERISTIC_TWO_it = {-
330 .itype = ASN1_ITYPE_SEQUENCE,-
331 .utype = V_ASN1_SEQUENCE,-
332 .templates = X9_62_CHARACTERISTIC_TWO_seq_tt,-
333 .tcount = sizeof(X9_62_CHARACTERISTIC_TWO_seq_tt) / sizeof(ASN1_TEMPLATE),-
334 .funcs = NULL,-
335 .size = sizeof(X9_62_CHARACTERISTIC_TWO),-
336 .sname = "X9_62_CHARACTERISTIC_TWO",-
337};-
338-
339X9_62_CHARACTERISTIC_TWO *X9_62_CHARACTERISTIC_TWO_new(void);-
340void X9_62_CHARACTERISTIC_TWO_free(X9_62_CHARACTERISTIC_TWO *a);-
341-
342X9_62_CHARACTERISTIC_TWO *-
343X9_62_CHARACTERISTIC_TWO_new(void)-
344{-
345 return (X9_62_CHARACTERISTIC_TWO*)ASN1_item_new(&X9_62_CHARACTERISTIC_TWO_it);
never executed: return (X9_62_CHARACTERISTIC_TWO*)ASN1_item_new(&X9_62_CHARACTERISTIC_TWO_it);
0
346}-
347-
348void-
349X9_62_CHARACTERISTIC_TWO_free(X9_62_CHARACTERISTIC_TWO *a)-
350{-
351 ASN1_item_free((ASN1_VALUE *)a, &X9_62_CHARACTERISTIC_TWO_it);-
352}
never executed: end of block
0
353-
354static const ASN1_TEMPLATE fieldID_def_tt = {-
355 .flags = 0,-
356 .tag = 0,-
357 .offset = offsetof(X9_62_FIELDID, p.other),-
358 .field_name = "p.other",-
359 .item = &ASN1_ANY_it,-
360};-
361-
362static const ASN1_ADB_TABLE X9_62_FIELDID_adbtbl[] = {-
363 {-
364 .value = NID_X9_62_prime_field,-
365 .tt = {-
366 .flags = 0,-
367 .tag = 0,-
368 .offset = offsetof(X9_62_FIELDID, p.prime),-
369 .field_name = "p.prime",-
370 .item = &ASN1_INTEGER_it,-
371 },-
372 -
373 },-
374 {-
375 .value = NID_X9_62_characteristic_two_field,-
376 .tt = {-
377 .flags = 0,-
378 .tag = 0,-
379 .offset = offsetof(X9_62_FIELDID, p.char_two),-
380 .field_name = "p.char_two",-
381 .item = &X9_62_CHARACTERISTIC_TWO_it,-
382 },-
383 -
384 },-
385};-
386-
387static const ASN1_ADB X9_62_FIELDID_adb = {-
388 .flags = 0,-
389 .offset = offsetof(X9_62_FIELDID, fieldType),-
390 .app_items = 0,-
391 .tbl = X9_62_FIELDID_adbtbl,-
392 .tblcount = sizeof(X9_62_FIELDID_adbtbl) / sizeof(ASN1_ADB_TABLE),-
393 .default_tt = &fieldID_def_tt,-
394 .null_tt = NULL,-
395};-
396-
397static const ASN1_TEMPLATE X9_62_FIELDID_seq_tt[] = {-
398 {-
399 .flags = 0,-
400 .tag = 0,-
401 .offset = offsetof(X9_62_FIELDID, fieldType),-
402 .field_name = "fieldType",-
403 .item = &ASN1_OBJECT_it,-
404 },-
405 {-
406 .flags = ASN1_TFLG_ADB_OID,-
407 .tag = -1,-
408 .offset = 0,-
409 .field_name = "X9_62_FIELDID",-
410 .item = (const ASN1_ITEM *)&X9_62_FIELDID_adb,-
411 },-
412};-
413-
414const ASN1_ITEM X9_62_FIELDID_it = {-
415 .itype = ASN1_ITYPE_SEQUENCE,-
416 .utype = V_ASN1_SEQUENCE,-
417 .templates = X9_62_FIELDID_seq_tt,-
418 .tcount = sizeof(X9_62_FIELDID_seq_tt) / sizeof(ASN1_TEMPLATE),-
419 .funcs = NULL,-
420 .size = sizeof(X9_62_FIELDID),-
421 .sname = "X9_62_FIELDID",-
422};-
423-
424static const ASN1_TEMPLATE X9_62_CURVE_seq_tt[] = {-
425 {-
426 .flags = 0,-
427 .tag = 0,-
428 .offset = offsetof(X9_62_CURVE, a),-
429 .field_name = "a",-
430 .item = &ASN1_OCTET_STRING_it,-
431 },-
432 {-
433 .flags = 0,-
434 .tag = 0,-
435 .offset = offsetof(X9_62_CURVE, b),-
436 .field_name = "b",-
437 .item = &ASN1_OCTET_STRING_it,-
438 },-
439 {-
440 .flags = ASN1_TFLG_OPTIONAL,-
441 .tag = 0,-
442 .offset = offsetof(X9_62_CURVE, seed),-
443 .field_name = "seed",-
444 .item = &ASN1_BIT_STRING_it,-
445 },-
446};-
447-
448const ASN1_ITEM X9_62_CURVE_it = {-
449 .itype = ASN1_ITYPE_SEQUENCE,-
450 .utype = V_ASN1_SEQUENCE,-
451 .templates = X9_62_CURVE_seq_tt,-
452 .tcount = sizeof(X9_62_CURVE_seq_tt) / sizeof(ASN1_TEMPLATE),-
453 .funcs = NULL,-
454 .size = sizeof(X9_62_CURVE),-
455 .sname = "X9_62_CURVE",-
456};-
457-
458static const ASN1_TEMPLATE ECPARAMETERS_seq_tt[] = {-
459 {-
460 .flags = 0,-
461 .tag = 0,-
462 .offset = offsetof(ECPARAMETERS, version),-
463 .field_name = "version",-
464 .item = &LONG_it,-
465 },-
466 {-
467 .flags = 0,-
468 .tag = 0,-
469 .offset = offsetof(ECPARAMETERS, fieldID),-
470 .field_name = "fieldID",-
471 .item = &X9_62_FIELDID_it,-
472 },-
473 {-
474 .flags = 0,-
475 .tag = 0,-
476 .offset = offsetof(ECPARAMETERS, curve),-
477 .field_name = "curve",-
478 .item = &X9_62_CURVE_it,-
479 },-
480 {-
481 .flags = 0,-
482 .tag = 0,-
483 .offset = offsetof(ECPARAMETERS, base),-
484 .field_name = "base",-
485 .item = &ASN1_OCTET_STRING_it,-
486 },-
487 {-
488 .flags = 0,-
489 .tag = 0,-
490 .offset = offsetof(ECPARAMETERS, order),-
491 .field_name = "order",-
492 .item = &ASN1_INTEGER_it,-
493 },-
494 {-
495 .flags = ASN1_TFLG_OPTIONAL,-
496 .tag = 0,-
497 .offset = offsetof(ECPARAMETERS, cofactor),-
498 .field_name = "cofactor",-
499 .item = &ASN1_INTEGER_it,-
500 },-
501};-
502-
503const ASN1_ITEM ECPARAMETERS_it = {-
504 .itype = ASN1_ITYPE_SEQUENCE,-
505 .utype = V_ASN1_SEQUENCE,-
506 .templates = ECPARAMETERS_seq_tt,-
507 .tcount = sizeof(ECPARAMETERS_seq_tt) / sizeof(ASN1_TEMPLATE),-
508 .funcs = NULL,-
509 .size = sizeof(ECPARAMETERS),-
510 .sname = "ECPARAMETERS",-
511};-
512-
513ECPARAMETERS *ECPARAMETERS_new(void);-
514void ECPARAMETERS_free(ECPARAMETERS *a);-
515-
516ECPARAMETERS *-
517ECPARAMETERS_new(void)-
518{-
519 return (ECPARAMETERS*)ASN1_item_new(&ECPARAMETERS_it);
never executed: return (ECPARAMETERS*)ASN1_item_new(&ECPARAMETERS_it);
0
520}-
521-
522void-
523ECPARAMETERS_free(ECPARAMETERS *a)-
524{-
525 ASN1_item_free((ASN1_VALUE *)a, &ECPARAMETERS_it);-
526}
never executed: end of block
0
527-
528static const ASN1_TEMPLATE ECPKPARAMETERS_ch_tt[] = {-
529 {-
530 .flags = 0,-
531 .tag = 0,-
532 .offset = offsetof(ECPKPARAMETERS, value.named_curve),-
533 .field_name = "value.named_curve",-
534 .item = &ASN1_OBJECT_it,-
535 },-
536 {-
537 .flags = 0,-
538 .tag = 0,-
539 .offset = offsetof(ECPKPARAMETERS, value.parameters),-
540 .field_name = "value.parameters",-
541 .item = &ECPARAMETERS_it,-
542 },-
543 {-
544 .flags = 0,-
545 .tag = 0,-
546 .offset = offsetof(ECPKPARAMETERS, value.implicitlyCA),-
547 .field_name = "value.implicitlyCA",-
548 .item = &ASN1_NULL_it,-
549 },-
550};-
551-
552const ASN1_ITEM ECPKPARAMETERS_it = {-
553 .itype = ASN1_ITYPE_CHOICE,-
554 .utype = offsetof(ECPKPARAMETERS, type),-
555 .templates = ECPKPARAMETERS_ch_tt,-
556 .tcount = sizeof(ECPKPARAMETERS_ch_tt) / sizeof(ASN1_TEMPLATE),-
557 .funcs = NULL,-
558 .size = sizeof(ECPKPARAMETERS),-
559 .sname = "ECPKPARAMETERS",-
560};-
561-
562ECPKPARAMETERS *ECPKPARAMETERS_new(void);-
563void ECPKPARAMETERS_free(ECPKPARAMETERS *a);-
564ECPKPARAMETERS *d2i_ECPKPARAMETERS(ECPKPARAMETERS **a, const unsigned char **in, long len);-
565int i2d_ECPKPARAMETERS(const ECPKPARAMETERS *a, unsigned char **out);-
566-
567ECPKPARAMETERS *-
568d2i_ECPKPARAMETERS(ECPKPARAMETERS **a, const unsigned char **in, long len)-
569{-
570 return (ECPKPARAMETERS *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
never executed: return (ECPKPARAMETERS *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, &ECPKPARAMETERS_it);
0
571 &ECPKPARAMETERS_it);
never executed: return (ECPKPARAMETERS *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, &ECPKPARAMETERS_it);
0
572}-
573-
574int-
575i2d_ECPKPARAMETERS(const ECPKPARAMETERS *a, unsigned char **out)-
576{-
577 return ASN1_item_i2d((ASN1_VALUE *)a, out, &ECPKPARAMETERS_it);
never executed: return ASN1_item_i2d((ASN1_VALUE *)a, out, &ECPKPARAMETERS_it);
0
578}-
579-
580ECPKPARAMETERS *-
581ECPKPARAMETERS_new(void)-
582{-
583 return (ECPKPARAMETERS *)ASN1_item_new(&ECPKPARAMETERS_it);
never executed: return (ECPKPARAMETERS *)ASN1_item_new(&ECPKPARAMETERS_it);
0
584}-
585-
586void-
587ECPKPARAMETERS_free(ECPKPARAMETERS *a)-
588{-
589 ASN1_item_free((ASN1_VALUE *)a, &ECPKPARAMETERS_it);-
590}
never executed: end of block
0
591-
592static const ASN1_TEMPLATE EC_PRIVATEKEY_seq_tt[] = {-
593 {-
594 .flags = 0,-
595 .tag = 0,-
596 .offset = offsetof(EC_PRIVATEKEY, version),-
597 .field_name = "version",-
598 .item = &LONG_it,-
599 },-
600 {-
601 .flags = 0,-
602 .tag = 0,-
603 .offset = offsetof(EC_PRIVATEKEY, privateKey),-
604 .field_name = "privateKey",-
605 .item = &ASN1_OCTET_STRING_it,-
606 },-
607 {-
608 .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,-
609 .tag = 0,-
610 .offset = offsetof(EC_PRIVATEKEY, parameters),-
611 .field_name = "parameters",-
612 .item = &ECPKPARAMETERS_it,-
613 },-
614 {-
615 .flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,-
616 .tag = 1,-
617 .offset = offsetof(EC_PRIVATEKEY, publicKey),-
618 .field_name = "publicKey",-
619 .item = &ASN1_BIT_STRING_it,-
620 },-
621};-
622-
623const ASN1_ITEM EC_PRIVATEKEY_it = {-
624 .itype = ASN1_ITYPE_SEQUENCE,-
625 .utype = V_ASN1_SEQUENCE,-
626 .templates = EC_PRIVATEKEY_seq_tt,-
627 .tcount = sizeof(EC_PRIVATEKEY_seq_tt) / sizeof(ASN1_TEMPLATE),-
628 .funcs = NULL,-
629 .size = sizeof(EC_PRIVATEKEY),-
630 .sname = "EC_PRIVATEKEY",-
631};-
632-
633EC_PRIVATEKEY *EC_PRIVATEKEY_new(void);-
634void EC_PRIVATEKEY_free(EC_PRIVATEKEY *a);-
635EC_PRIVATEKEY *d2i_EC_PRIVATEKEY(EC_PRIVATEKEY **a, const unsigned char **in, long len);-
636int i2d_EC_PRIVATEKEY(const EC_PRIVATEKEY *a, unsigned char **out);-
637-
638EC_PRIVATEKEY *-
639d2i_EC_PRIVATEKEY(EC_PRIVATEKEY **a, const unsigned char **in, long len)-
640{-
641 return (EC_PRIVATEKEY *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
never executed: return (EC_PRIVATEKEY *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, &EC_PRIVATEKEY_it);
0
642 &EC_PRIVATEKEY_it);
never executed: return (EC_PRIVATEKEY *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, &EC_PRIVATEKEY_it);
0
643}-
644-
645int-
646i2d_EC_PRIVATEKEY(const EC_PRIVATEKEY *a, unsigned char **out)-
647{-
648 return ASN1_item_i2d((ASN1_VALUE *)a, out, &EC_PRIVATEKEY_it);
never executed: return ASN1_item_i2d((ASN1_VALUE *)a, out, &EC_PRIVATEKEY_it);
0
649}-
650-
651EC_PRIVATEKEY *-
652EC_PRIVATEKEY_new(void)-
653{-
654 return (EC_PRIVATEKEY *)ASN1_item_new(&EC_PRIVATEKEY_it);
never executed: return (EC_PRIVATEKEY *)ASN1_item_new(&EC_PRIVATEKEY_it);
0
655}-
656-
657void-
658EC_PRIVATEKEY_free(EC_PRIVATEKEY *a)-
659{-
660 ASN1_item_free((ASN1_VALUE *)a, &EC_PRIVATEKEY_it);-
661}
never executed: end of block
0
662-
663/* some declarations of internal function */-
664-
665/* ec_asn1_group2field() sets the values in a X9_62_FIELDID object */-
666static int ec_asn1_group2fieldid(const EC_GROUP *, X9_62_FIELDID *);-
667/* ec_asn1_group2curve() sets the values in a X9_62_CURVE object */-
668static int ec_asn1_group2curve(const EC_GROUP *, X9_62_CURVE *);-
669/* ec_asn1_parameters2group() creates a EC_GROUP object from a-
670 * ECPARAMETERS object */-
671static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *);-
672/* ec_asn1_group2parameters() creates a ECPARAMETERS object from a-
673 * EC_GROUP object */-
674static ECPARAMETERS *ec_asn1_group2parameters(const EC_GROUP *, ECPARAMETERS *);-
675/* ec_asn1_pkparameters2group() creates a EC_GROUP object from a-
676 * ECPKPARAMETERS object */-
677static EC_GROUP *ec_asn1_pkparameters2group(const ECPKPARAMETERS *);-
678/* ec_asn1_group2pkparameters() creates a ECPKPARAMETERS object from a-
679 * EC_GROUP object */-
680static ECPKPARAMETERS *ec_asn1_group2pkparameters(const EC_GROUP *,-
681 ECPKPARAMETERS *);-
682-
683/* the function definitions */-
684-
685static int-
686ec_asn1_group2fieldid(const EC_GROUP * group, X9_62_FIELDID * field)-
687{-
688 int ok = 0, nid;-
689 BIGNUM *tmp = NULL;-
690-
691 if (group == NULL || field == NULL)
group == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
field == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
692 return 0;
never executed: return 0;
0
693-
694 /* clear the old values (if necessary) */-
695 if (field->fieldType != NULL)
field->fieldTy...!= ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
696 ASN1_OBJECT_free(field->fieldType);
never executed: ASN1_OBJECT_free(field->fieldType);
0
697 if (field->p.other != NULL)
field->p.other != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
698 ASN1_TYPE_free(field->p.other);
never executed: ASN1_TYPE_free(field->p.other);
0
699-
700 nid = EC_METHOD_get_field_type(EC_GROUP_method_of(group));-
701 /* set OID for the field */-
702 if ((field->fieldType = OBJ_nid2obj(nid)) == NULL) {
(field->fieldT...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
703 ECerror(ERR_R_OBJ_LIB);-
704 goto err;
never executed: goto err;
0
705 }-
706 if (nid == NID_X9_62_prime_field) {
nid == 406Description
TRUEnever evaluated
FALSEnever evaluated
0
707 if ((tmp = BN_new()) == NULL) {
(tmp = BN_new(...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
708 ECerror(ERR_R_MALLOC_FAILURE);-
709 goto err;
never executed: goto err;
0
710 }-
711 /* the parameters are specified by the prime number p */-
712 if (!EC_GROUP_get_curve_GFp(group, tmp, NULL, NULL, NULL)) {
!EC_GROUP_get_... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
713 ECerror(ERR_R_EC_LIB);-
714 goto err;
never executed: goto err;
0
715 }-
716 /* set the prime number */-
717 field->p.prime = BN_to_ASN1_INTEGER(tmp, NULL);-
718 if (field->p.prime == NULL) {
field->p.prime == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
719 ECerror(ERR_R_ASN1_LIB);-
720 goto err;
never executed: goto err;
0
721 }-
722 } else /* nid == NID_X9_62_characteristic_two_field */
never executed: end of block
0
723#ifdef OPENSSL_NO_EC2M-
724 {-
725 ECerror(EC_R_GF2M_NOT_SUPPORTED);-
726 goto err;-
727 }-
728#else-
729 {-
730 int field_type;-
731 X9_62_CHARACTERISTIC_TWO *char_two;-
732-
733 field->p.char_two = X9_62_CHARACTERISTIC_TWO_new();-
734 char_two = field->p.char_two;-
735-
736 if (char_two == NULL) {
char_two == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
737 ECerror(ERR_R_MALLOC_FAILURE);-
738 goto err;
never executed: goto err;
0
739 }-
740 char_two->m = (long) EC_GROUP_get_degree(group);-
741-
742 field_type = EC_GROUP_get_basis_type(group);-
743-
744 if (field_type == 0) {
field_type == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
745 ECerror(ERR_R_EC_LIB);-
746 goto err;
never executed: goto err;
0
747 }-
748 /* set base type OID */-
749 if ((char_two->type = OBJ_nid2obj(field_type)) == NULL) {
(char_two->typ...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
750 ECerror(ERR_R_OBJ_LIB);-
751 goto err;
never executed: goto err;
0
752 }-
753 if (field_type == NID_X9_62_tpBasis) {
field_type == 682Description
TRUEnever evaluated
FALSEnever evaluated
0
754 unsigned int k;-
755-
756 if (!EC_GROUP_get_trinomial_basis(group, &k))
!EC_GROUP_get_...sis(group, &k)Description
TRUEnever evaluated
FALSEnever evaluated
0
757 goto err;
never executed: goto err;
0
758-
759 char_two->p.tpBasis = ASN1_INTEGER_new();-
760 if (!char_two->p.tpBasis) {
!char_two->p.tpBasisDescription
TRUEnever evaluated
FALSEnever evaluated
0
761 ECerror(ERR_R_MALLOC_FAILURE);-
762 goto err;
never executed: goto err;
0
763 }-
764 if (!ASN1_INTEGER_set(char_two->p.tpBasis, (long) k)) {
!ASN1_INTEGER_...sis, (long) k)Description
TRUEnever evaluated
FALSEnever evaluated
0
765 ECerror(ERR_R_ASN1_LIB);-
766 goto err;
never executed: goto err;
0
767 }-
768 } else if (field_type == NID_X9_62_ppBasis) {
never executed: end of block
field_type == 683Description
TRUEnever evaluated
FALSEnever evaluated
0
769 unsigned int k1, k2, k3;-
770-
771 if (!EC_GROUP_get_pentanomial_basis(group, &k1, &k2, &k3))
!EC_GROUP_get_...&k1, &k2, &k3)Description
TRUEnever evaluated
FALSEnever evaluated
0
772 goto err;
never executed: goto err;
0
773-
774 char_two->p.ppBasis = X9_62_PENTANOMIAL_new();-
775 if (!char_two->p.ppBasis) {
!char_two->p.ppBasisDescription
TRUEnever evaluated
FALSEnever evaluated
0
776 ECerror(ERR_R_MALLOC_FAILURE);-
777 goto err;
never executed: goto err;
0
778 }-
779 /* set k? values */-
780 char_two->p.ppBasis->k1 = (long) k1;-
781 char_two->p.ppBasis->k2 = (long) k2;-
782 char_two->p.ppBasis->k3 = (long) k3;-
783 } else { /* field_type == NID_X9_62_onBasis */
never executed: end of block
0
784 /* for ONB the parameters are (asn1) NULL */-
785 char_two->p.onBasis = ASN1_NULL_new();-
786 if (!char_two->p.onBasis) {
!char_two->p.onBasisDescription
TRUEnever evaluated
FALSEnever evaluated
0
787 ECerror(ERR_R_MALLOC_FAILURE);-
788 goto err;
never executed: goto err;
0
789 }-
790 }
never executed: end of block
0
791 }-
792#endif-
793-
794 ok = 1;-
795-
796 err:
code before this statement never executed: err:
0
797 BN_free(tmp);-
798 return (ok);
never executed: return (ok);
0
799}-
800-
801static int -
802ec_asn1_group2curve(const EC_GROUP * group, X9_62_CURVE * curve)-
803{-
804 int ok = 0, nid;-
805 BIGNUM *tmp_1 = NULL, *tmp_2 = NULL;-
806 unsigned char *buffer_1 = NULL, *buffer_2 = NULL, *a_buf = NULL,-
807 *b_buf = NULL;-
808 size_t len_1, len_2;-
809 unsigned char char_zero = 0;-
810-
811 if (!group || !curve || !curve->a || !curve->b)
!groupDescription
TRUEnever evaluated
FALSEnever evaluated
!curveDescription
TRUEnever evaluated
FALSEnever evaluated
!curve->aDescription
TRUEnever evaluated
FALSEnever evaluated
!curve->bDescription
TRUEnever evaluated
FALSEnever evaluated
0
812 return 0;
never executed: return 0;
0
813-
814 if ((tmp_1 = BN_new()) == NULL || (tmp_2 = BN_new()) == NULL) {
(tmp_1 = BN_ne...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
(tmp_2 = BN_ne...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
815 ECerror(ERR_R_MALLOC_FAILURE);-
816 goto err;
never executed: goto err;
0
817 }-
818 nid = EC_METHOD_get_field_type(EC_GROUP_method_of(group));-
819-
820 /* get a and b */-
821 if (nid == NID_X9_62_prime_field) {
nid == 406Description
TRUEnever evaluated
FALSEnever evaluated
0
822 if (!EC_GROUP_get_curve_GFp(group, NULL, tmp_1, tmp_2, NULL)) {
!EC_GROUP_get_... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
823 ECerror(ERR_R_EC_LIB);-
824 goto err;
never executed: goto err;
0
825 }-
826 }
never executed: end of block
0
827#ifndef OPENSSL_NO_EC2M-
828 else { /* nid == NID_X9_62_characteristic_two_field */-
829 if (!EC_GROUP_get_curve_GF2m(group, NULL, tmp_1, tmp_2, NULL)) {
!EC_GROUP_get_... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
830 ECerror(ERR_R_EC_LIB);-
831 goto err;
never executed: goto err;
0
832 }-
833 }
never executed: end of block
0
834#endif-
835 len_1 = (size_t) BN_num_bytes(tmp_1);-
836 len_2 = (size_t) BN_num_bytes(tmp_2);-
837-
838 if (len_1 == 0) {
len_1 == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
839 /* len_1 == 0 => a == 0 */-
840 a_buf = &char_zero;-
841 len_1 = 1;-
842 } else {
never executed: end of block
0
843 if ((buffer_1 = malloc(len_1)) == NULL) {
(buffer_1 = ma...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
844 ECerror(ERR_R_MALLOC_FAILURE);-
845 goto err;
never executed: goto err;
0
846 }-
847 if ((len_1 = BN_bn2bin(tmp_1, buffer_1)) == 0) {
(len_1 = BN_bn...uffer_1)) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
848 ECerror(ERR_R_BN_LIB);-
849 goto err;
never executed: goto err;
0
850 }-
851 a_buf = buffer_1;-
852 }
never executed: end of block
0
853-
854 if (len_2 == 0) {
len_2 == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
855 /* len_2 == 0 => b == 0 */-
856 b_buf = &char_zero;-
857 len_2 = 1;-
858 } else {
never executed: end of block
0
859 if ((buffer_2 = malloc(len_2)) == NULL) {
(buffer_2 = ma...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
860 ECerror(ERR_R_MALLOC_FAILURE);-
861 goto err;
never executed: goto err;
0
862 }-
863 if ((len_2 = BN_bn2bin(tmp_2, buffer_2)) == 0) {
(len_2 = BN_bn...uffer_2)) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
864 ECerror(ERR_R_BN_LIB);-
865 goto err;
never executed: goto err;
0
866 }-
867 b_buf = buffer_2;-
868 }
never executed: end of block
0
869-
870 /* set a and b */-
871 if (!ASN1_STRING_set(curve->a, a_buf, len_1) ||
!ASN1_STRING_s... a_buf, len_1)Description
TRUEnever evaluated
FALSEnever evaluated
0
872 !ASN1_STRING_set(curve->b, b_buf, len_2)) {
!ASN1_STRING_s... b_buf, len_2)Description
TRUEnever evaluated
FALSEnever evaluated
0
873 ECerror(ERR_R_ASN1_LIB);-
874 goto err;
never executed: goto err;
0
875 }-
876 /* set the seed (optional) */-
877 if (group->seed) {
group->seedDescription
TRUEnever evaluated
FALSEnever evaluated
0
878 if (!curve->seed)
!curve->seedDescription
TRUEnever evaluated
FALSEnever evaluated
0
879 if ((curve->seed = ASN1_BIT_STRING_new()) == NULL) {
(curve->seed =...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
880 ECerror(ERR_R_MALLOC_FAILURE);-
881 goto err;
never executed: goto err;
0
882 }-
883 curve->seed->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);-
884 curve->seed->flags |= ASN1_STRING_FLAG_BITS_LEFT;-
885 if (!ASN1_BIT_STRING_set(curve->seed, group->seed,
!ASN1_BIT_STRI...oup->seed_len)Description
TRUEnever evaluated
FALSEnever evaluated
0
886 (int) group->seed_len)) {
!ASN1_BIT_STRI...oup->seed_len)Description
TRUEnever evaluated
FALSEnever evaluated
0
887 ECerror(ERR_R_ASN1_LIB);-
888 goto err;
never executed: goto err;
0
889 }-
890 } else {
never executed: end of block
0
891 if (curve->seed) {
curve->seedDescription
TRUEnever evaluated
FALSEnever evaluated
0
892 ASN1_BIT_STRING_free(curve->seed);-
893 curve->seed = NULL;-
894 }
never executed: end of block
0
895 }
never executed: end of block
0
896-
897 ok = 1;-
898-
899 err:
code before this statement never executed: err:
0
900 free(buffer_1);-
901 free(buffer_2);-
902 BN_free(tmp_1);-
903 BN_free(tmp_2);-
904 return (ok);
never executed: return (ok);
0
905}-
906-
907static ECPARAMETERS *-
908ec_asn1_group2parameters(const EC_GROUP * group, ECPARAMETERS * param)-
909{-
910 int ok = 0;-
911 size_t len = 0;-
912 ECPARAMETERS *ret = NULL;-
913 BIGNUM *tmp = NULL;-
914 unsigned char *buffer = NULL;-
915 const EC_POINT *point = NULL;-
916 point_conversion_form_t form;-
917-
918 if ((tmp = BN_new()) == NULL) {
(tmp = BN_new(...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
919 ECerror(ERR_R_MALLOC_FAILURE);-
920 goto err;
never executed: goto err;
0
921 }-
922 if (param == NULL) {
param == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
923 if ((ret = ECPARAMETERS_new()) == NULL) {
(ret = ECPARAM...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
924 ECerror(ERR_R_MALLOC_FAILURE);-
925 goto err;
never executed: goto err;
0
926 }-
927 } else
never executed: end of block
0
928 ret = param;
never executed: ret = param;
0
929-
930 /* set the version (always one) */-
931 ret->version = (long) 0x1;-
932-
933 /* set the fieldID */-
934 if (!ec_asn1_group2fieldid(group, ret->fieldID)) {
!ec_asn1_group... ret->fieldID)Description
TRUEnever evaluated
FALSEnever evaluated
0
935 ECerror(ERR_R_EC_LIB);-
936 goto err;
never executed: goto err;
0
937 }-
938 /* set the curve */-
939 if (!ec_asn1_group2curve(group, ret->curve)) {
!ec_asn1_group...p, ret->curve)Description
TRUEnever evaluated
FALSEnever evaluated
0
940 ECerror(ERR_R_EC_LIB);-
941 goto err;
never executed: goto err;
0
942 }-
943 /* set the base point */-
944 if ((point = EC_GROUP_get0_generator(group)) == NULL) {
(point = EC_GR...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
945 ECerror(EC_R_UNDEFINED_GENERATOR);-
946 goto err;
never executed: goto err;
0
947 }-
948 form = EC_GROUP_get_point_conversion_form(group);-
949-
950 len = EC_POINT_point2oct(group, point, form, NULL, len, NULL);-
951 if (len == 0) {
len == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
952 ECerror(ERR_R_EC_LIB);-
953 goto err;
never executed: goto err;
0
954 }-
955 if ((buffer = malloc(len)) == NULL) {
(buffer = mall...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
956 ECerror(ERR_R_MALLOC_FAILURE);-
957 goto err;
never executed: goto err;
0
958 }-
959 if (!EC_POINT_point2oct(group, point, form, buffer, len, NULL)) {
!EC_POINT_poin... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
960 ECerror(ERR_R_EC_LIB);-
961 goto err;
never executed: goto err;
0
962 }-
963 if (ret->base == NULL && (ret->base = ASN1_OCTET_STRING_new()) == NULL) {
ret->base == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
(ret->base = A...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
964 ECerror(ERR_R_MALLOC_FAILURE);-
965 goto err;
never executed: goto err;
0
966 }-
967 if (!ASN1_OCTET_STRING_set(ret->base, buffer, len)) {
!ASN1_OCTET_ST..., buffer, len)Description
TRUEnever evaluated
FALSEnever evaluated
0
968 ECerror(ERR_R_ASN1_LIB);-
969 goto err;
never executed: goto err;
0
970 }-
971 /* set the order */-
972 if (!EC_GROUP_get_order(group, tmp, NULL)) {
!EC_GROUP_get_... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
973 ECerror(ERR_R_EC_LIB);-
974 goto err;
never executed: goto err;
0
975 }-
976 ret->order = BN_to_ASN1_INTEGER(tmp, ret->order);-
977 if (ret->order == NULL) {
ret->order == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
978 ECerror(ERR_R_ASN1_LIB);-
979 goto err;
never executed: goto err;
0
980 }-
981 /* set the cofactor (optional) */-
982 if (EC_GROUP_get_cofactor(group, tmp, NULL)) {
EC_GROUP_get_c... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
983 ret->cofactor = BN_to_ASN1_INTEGER(tmp, ret->cofactor);-
984 if (ret->cofactor == NULL) {
ret->cofactor == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
985 ECerror(ERR_R_ASN1_LIB);-
986 goto err;
never executed: goto err;
0
987 }-
988 }
never executed: end of block
0
989 ok = 1;-
990-
991 err:
code before this statement never executed: err:
0
992 if (!ok) {
!okDescription
TRUEnever evaluated
FALSEnever evaluated
0
993 if (ret && !param)
retDescription
TRUEnever evaluated
FALSEnever evaluated
!paramDescription
TRUEnever evaluated
FALSEnever evaluated
0
994 ECPARAMETERS_free(ret);
never executed: ECPARAMETERS_free(ret);
0
995 ret = NULL;-
996 }
never executed: end of block
0
997 BN_free(tmp);-
998 free(buffer);-
999 return (ret);
never executed: return (ret);
0
1000}-
1001-
1002ECPKPARAMETERS *-
1003ec_asn1_group2pkparameters(const EC_GROUP * group, ECPKPARAMETERS * params)-
1004{-
1005 int ok = 1, tmp;-
1006 ECPKPARAMETERS *ret = params;-
1007-
1008 if (ret == NULL) {
ret == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1009 if ((ret = ECPKPARAMETERS_new()) == NULL) {
(ret = ECPKPAR...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1010 ECerror(ERR_R_MALLOC_FAILURE);-
1011 return NULL;
never executed: return ((void *)0) ;
0
1012 }-
1013 } else {
never executed: end of block
0
1014 if (ret->type == 0 && ret->value.named_curve)
ret->type == 0Description
TRUEnever evaluated
FALSEnever evaluated
ret->value.named_curveDescription
TRUEnever evaluated
FALSEnever evaluated
0
1015 ASN1_OBJECT_free(ret->value.named_curve);
never executed: ASN1_OBJECT_free(ret->value.named_curve);
0
1016 else if (ret->type == 1 && ret->value.parameters)
ret->type == 1Description
TRUEnever evaluated
FALSEnever evaluated
ret->value.parametersDescription
TRUEnever evaluated
FALSEnever evaluated
0
1017 ECPARAMETERS_free(ret->value.parameters);
never executed: ECPARAMETERS_free(ret->value.parameters);
0
1018 }
never executed: end of block
0
1019-
1020 if (EC_GROUP_get_asn1_flag(group)) {
EC_GROUP_get_asn1_flag(group)Description
TRUEnever evaluated
FALSEnever evaluated
0
1021 /*-
1022 * use the asn1 OID to describe the elliptic curve-
1023 * parameters-
1024 */-
1025 tmp = EC_GROUP_get_curve_name(group);-
1026 if (tmp) {
tmpDescription
TRUEnever evaluated
FALSEnever evaluated
0
1027 ret->type = 0;-
1028 if ((ret->value.named_curve = OBJ_nid2obj(tmp)) == NULL)
(ret->value.na...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1029 ok = 0;
never executed: ok = 0;
0
1030 } else
never executed: end of block
0
1031 /* we don't kmow the nid => ERROR */-
1032 ok = 0;
never executed: ok = 0;
0
1033 } else {-
1034 /* use the ECPARAMETERS structure */-
1035 ret->type = 1;-
1036 if ((ret->value.parameters = ec_asn1_group2parameters(
(ret->value.pa...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1037 group, NULL)) == NULL)
(ret->value.pa...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1038 ok = 0;
never executed: ok = 0;
0
1039 }
never executed: end of block
0
1040-
1041 if (!ok) {
!okDescription
TRUEnever evaluated
FALSEnever evaluated
0
1042 ECPKPARAMETERS_free(ret);-
1043 return NULL;
never executed: return ((void *)0) ;
0
1044 }-
1045 return ret;
never executed: return ret;
0
1046}-
1047-
1048static EC_GROUP *-
1049ec_asn1_parameters2group(const ECPARAMETERS * params)-
1050{-
1051 int ok = 0, tmp;-
1052 EC_GROUP *ret = NULL;-
1053 BIGNUM *p = NULL, *a = NULL, *b = NULL;-
1054 EC_POINT *point = NULL;-
1055 long field_bits;-
1056-
1057 if (!params->fieldID || !params->fieldID->fieldType ||
!params->fieldIDDescription
TRUEnever evaluated
FALSEnever evaluated
!params->fieldID->fieldTypeDescription
TRUEnever evaluated
FALSEnever evaluated
0
1058 !params->fieldID->p.ptr) {
!params->fieldID->p.ptrDescription
TRUEnever evaluated
FALSEnever evaluated
0
1059 ECerror(EC_R_ASN1_ERROR);-
1060 goto err;
never executed: goto err;
0
1061 }-
1062 /* now extract the curve parameters a and b */-
1063 if (!params->curve || !params->curve->a ||
!params->curveDescription
TRUEnever evaluated
FALSEnever evaluated
!params->curve->aDescription
TRUEnever evaluated
FALSEnever evaluated
0
1064 !params->curve->a->data || !params->curve->b ||
!params->curve->a->dataDescription
TRUEnever evaluated
FALSEnever evaluated
!params->curve->bDescription
TRUEnever evaluated
FALSEnever evaluated
0
1065 !params->curve->b->data) {
!params->curve->b->dataDescription
TRUEnever evaluated
FALSEnever evaluated
0
1066 ECerror(EC_R_ASN1_ERROR);-
1067 goto err;
never executed: goto err;
0
1068 }-
1069 a = BN_bin2bn(params->curve->a->data, params->curve->a->length, NULL);-
1070 if (a == NULL) {
a == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1071 ECerror(ERR_R_BN_LIB);-
1072 goto err;
never executed: goto err;
0
1073 }-
1074 b = BN_bin2bn(params->curve->b->data, params->curve->b->length, NULL);-
1075 if (b == NULL) {
b == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1076 ECerror(ERR_R_BN_LIB);-
1077 goto err;
never executed: goto err;
0
1078 }-
1079 /* get the field parameters */-
1080 tmp = OBJ_obj2nid(params->fieldID->fieldType);-
1081 if (tmp == NID_X9_62_characteristic_two_field)
tmp == 407Description
TRUEnever evaluated
FALSEnever evaluated
0
1082#ifdef OPENSSL_NO_EC2M-
1083 {-
1084 ECerror(EC_R_GF2M_NOT_SUPPORTED);-
1085 goto err;-
1086 }-
1087#else-
1088 {-
1089 X9_62_CHARACTERISTIC_TWO *char_two;-
1090-
1091 char_two = params->fieldID->p.char_two;-
1092-
1093 field_bits = char_two->m;-
1094 if (field_bits > OPENSSL_ECC_MAX_FIELD_BITS) {
field_bits > 661Description
TRUEnever evaluated
FALSEnever evaluated
0
1095 ECerror(EC_R_FIELD_TOO_LARGE);-
1096 goto err;
never executed: goto err;
0
1097 }-
1098 if ((p = BN_new()) == NULL) {
(p = BN_new()) == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1099 ECerror(ERR_R_MALLOC_FAILURE);-
1100 goto err;
never executed: goto err;
0
1101 }-
1102 /* get the base type */-
1103 tmp = OBJ_obj2nid(char_two->type);-
1104-
1105 if (tmp == NID_X9_62_tpBasis) {
tmp == 682Description
TRUEnever evaluated
FALSEnever evaluated
0
1106 long tmp_long;-
1107-
1108 if (!char_two->p.tpBasis) {
!char_two->p.tpBasisDescription
TRUEnever evaluated
FALSEnever evaluated
0
1109 ECerror(EC_R_ASN1_ERROR);-
1110 goto err;
never executed: goto err;
0
1111 }-
1112 tmp_long = ASN1_INTEGER_get(char_two->p.tpBasis);-
1113-
1114 if (!(char_two->m > tmp_long && tmp_long > 0)) {
char_two->m > tmp_longDescription
TRUEnever evaluated
FALSEnever evaluated
tmp_long > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1115 ECerror(EC_R_INVALID_TRINOMIAL_BASIS);-
1116 goto err;
never executed: goto err;
0
1117 }-
1118 /* create the polynomial */-
1119 if (!BN_set_bit(p, (int) char_two->m))
!BN_set_bit(p,...) char_two->m)Description
TRUEnever evaluated
FALSEnever evaluated
0
1120 goto err;
never executed: goto err;
0
1121 if (!BN_set_bit(p, (int) tmp_long))
!BN_set_bit(p, (int) tmp_long)Description
TRUEnever evaluated
FALSEnever evaluated
0
1122 goto err;
never executed: goto err;
0
1123 if (!BN_set_bit(p, 0))
!BN_set_bit(p, 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1124 goto err;
never executed: goto err;
0
1125 } else if (tmp == NID_X9_62_ppBasis) {
never executed: end of block
tmp == 683Description
TRUEnever evaluated
FALSEnever evaluated
0
1126 X9_62_PENTANOMIAL *penta;-
1127-
1128 penta = char_two->p.ppBasis;-
1129 if (!penta) {
!pentaDescription
TRUEnever evaluated
FALSEnever evaluated
0
1130 ECerror(EC_R_ASN1_ERROR);-
1131 goto err;
never executed: goto err;
0
1132 }-
1133 if (!(char_two->m > penta->k3 && penta->k3 > penta->k2 && penta->k2 > penta->k1 && penta->k1 > 0)) {
char_two->m > penta->k3Description
TRUEnever evaluated
FALSEnever evaluated
penta->k3 > penta->k2Description
TRUEnever evaluated
FALSEnever evaluated
penta->k2 > penta->k1Description
TRUEnever evaluated
FALSEnever evaluated
penta->k1 > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1134 ECerror(EC_R_INVALID_PENTANOMIAL_BASIS);-
1135 goto err;
never executed: goto err;
0
1136 }-
1137 /* create the polynomial */-
1138 if (!BN_set_bit(p, (int) char_two->m))
!BN_set_bit(p,...) char_two->m)Description
TRUEnever evaluated
FALSEnever evaluated
0
1139 goto err;
never executed: goto err;
0
1140 if (!BN_set_bit(p, (int) penta->k1))
!BN_set_bit(p,...nt) penta->k1)Description
TRUEnever evaluated
FALSEnever evaluated
0
1141 goto err;
never executed: goto err;
0
1142 if (!BN_set_bit(p, (int) penta->k2))
!BN_set_bit(p,...nt) penta->k2)Description
TRUEnever evaluated
FALSEnever evaluated
0
1143 goto err;
never executed: goto err;
0
1144 if (!BN_set_bit(p, (int) penta->k3))
!BN_set_bit(p,...nt) penta->k3)Description
TRUEnever evaluated
FALSEnever evaluated
0
1145 goto err;
never executed: goto err;
0
1146 if (!BN_set_bit(p, 0))
!BN_set_bit(p, 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1147 goto err;
never executed: goto err;
0
1148 } else if (tmp == NID_X9_62_onBasis) {
never executed: end of block
tmp == 681Description
TRUEnever evaluated
FALSEnever evaluated
0
1149 ECerror(EC_R_NOT_IMPLEMENTED);-
1150 goto err;
never executed: goto err;
0
1151 } else { /* error */-
1152 ECerror(EC_R_ASN1_ERROR);-
1153 goto err;
never executed: goto err;
0
1154 }-
1155-
1156 /* create the EC_GROUP structure */-
1157 ret = EC_GROUP_new_curve_GF2m(p, a, b, NULL);-
1158 }
never executed: end of block
0
1159#endif-
1160 else if (tmp == NID_X9_62_prime_field) {
tmp == 406Description
TRUEnever evaluated
FALSEnever evaluated
0
1161 /* we have a curve over a prime field */-
1162 /* extract the prime number */-
1163 if (!params->fieldID->p.prime) {
!params->fieldID->p.primeDescription
TRUEnever evaluated
FALSEnever evaluated
0
1164 ECerror(EC_R_ASN1_ERROR);-
1165 goto err;
never executed: goto err;
0
1166 }-
1167 p = ASN1_INTEGER_to_BN(params->fieldID->p.prime, NULL);-
1168 if (p == NULL) {
p == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1169 ECerror(ERR_R_ASN1_LIB);-
1170 goto err;
never executed: goto err;
0
1171 }-
1172 if (BN_is_negative(p) || BN_is_zero(p)) {
((p)->neg != 0)Description
TRUEnever evaluated
FALSEnever evaluated
((p)->top == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1173 ECerror(EC_R_INVALID_FIELD);-
1174 goto err;
never executed: goto err;
0
1175 }-
1176 field_bits = BN_num_bits(p);-
1177 if (field_bits > OPENSSL_ECC_MAX_FIELD_BITS) {
field_bits > 661Description
TRUEnever evaluated
FALSEnever evaluated
0
1178 ECerror(EC_R_FIELD_TOO_LARGE);-
1179 goto err;
never executed: goto err;
0
1180 }-
1181 /* create the EC_GROUP structure */-
1182 ret = EC_GROUP_new_curve_GFp(p, a, b, NULL);-
1183 } else {
never executed: end of block
0
1184 ECerror(EC_R_INVALID_FIELD);-
1185 goto err;
never executed: goto err;
0
1186 }-
1187-
1188 if (ret == NULL) {
ret == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1189 ECerror(ERR_R_EC_LIB);-
1190 goto err;
never executed: goto err;
0
1191 }-
1192 /* extract seed (optional) */-
1193 if (params->curve->seed != NULL) {
params->curve-...!= ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1194 free(ret->seed);-
1195 if (!(ret->seed = malloc(params->curve->seed->length))) {
!(ret->seed = ...seed->length))Description
TRUEnever evaluated
FALSEnever evaluated
0
1196 ECerror(ERR_R_MALLOC_FAILURE);-
1197 goto err;
never executed: goto err;
0
1198 }-
1199 memcpy(ret->seed, params->curve->seed->data,-
1200 params->curve->seed->length);-
1201 ret->seed_len = params->curve->seed->length;-
1202 }
never executed: end of block
0
1203 if (!params->order || !params->base || !params->base->data) {
!params->orderDescription
TRUEnever evaluated
FALSEnever evaluated
!params->baseDescription
TRUEnever evaluated
FALSEnever evaluated
!params->base->dataDescription
TRUEnever evaluated
FALSEnever evaluated
0
1204 ECerror(EC_R_ASN1_ERROR);-
1205 goto err;
never executed: goto err;
0
1206 }-
1207 if ((point = EC_POINT_new(ret)) == NULL)
(point = EC_PO...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1208 goto err;
never executed: goto err;
0
1209-
1210 /* set the point conversion form */-
1211 EC_GROUP_set_point_conversion_form(ret, (point_conversion_form_t)-
1212 (params->base->data[0] & ~0x01));-
1213-
1214 /* extract the ec point */-
1215 if (!EC_POINT_oct2point(ret, point, params->base->data,
!EC_POINT_oct2... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
1216 params->base->length, NULL)) {
!EC_POINT_oct2... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
1217 ECerror(ERR_R_EC_LIB);-
1218 goto err;
never executed: goto err;
0
1219 }-
1220 /* extract the order */-
1221 if ((a = ASN1_INTEGER_to_BN(params->order, a)) == NULL) {
(a = ASN1_INTE...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1222 ECerror(ERR_R_ASN1_LIB);-
1223 goto err;
never executed: goto err;
0
1224 }-
1225 if (BN_is_negative(a) || BN_is_zero(a)) {
((a)->neg != 0)Description
TRUEnever evaluated
FALSEnever evaluated
((a)->top == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1226 ECerror(EC_R_INVALID_GROUP_ORDER);-
1227 goto err;
never executed: goto err;
0
1228 }-
1229 if (BN_num_bits(a) > (int) field_bits + 1) { /* Hasse bound */
BN_num_bits(a)...field_bits + 1Description
TRUEnever evaluated
FALSEnever evaluated
0
1230 ECerror(EC_R_INVALID_GROUP_ORDER);-
1231 goto err;
never executed: goto err;
0
1232 }-
1233 /* extract the cofactor (optional) */-
1234 if (params->cofactor == NULL) {
params->cofact...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1235 BN_free(b);-
1236 b = NULL;-
1237 } else if ((b = ASN1_INTEGER_to_BN(params->cofactor, b)) == NULL) {
never executed: end of block
(b = ASN1_INTE...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1238 ECerror(ERR_R_ASN1_LIB);-
1239 goto err;
never executed: goto err;
0
1240 }-
1241 /* set the generator, order and cofactor (if present) */-
1242 if (!EC_GROUP_set_generator(ret, point, a, b)) {
!EC_GROUP_set_..., point, a, b)Description
TRUEnever evaluated
FALSEnever evaluated
0
1243 ECerror(ERR_R_EC_LIB);-
1244 goto err;
never executed: goto err;
0
1245 }-
1246 ok = 1;-
1247-
1248 err:
code before this statement never executed: err:
0
1249 if (!ok) {
!okDescription
TRUEnever evaluated
FALSEnever evaluated
0
1250 EC_GROUP_clear_free(ret);-
1251 ret = NULL;-
1252 }
never executed: end of block
0
1253 BN_free(p);-
1254 BN_free(a);-
1255 BN_free(b);-
1256 EC_POINT_free(point);-
1257 return (ret);
never executed: return (ret);
0
1258}-
1259-
1260EC_GROUP *-
1261ec_asn1_pkparameters2group(const ECPKPARAMETERS * params)-
1262{-
1263 EC_GROUP *ret = NULL;-
1264 int tmp = 0;-
1265-
1266 if (params == NULL) {
params == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1267 ECerror(EC_R_MISSING_PARAMETERS);-
1268 return NULL;
never executed: return ((void *)0) ;
0
1269 }-
1270 if (params->type == 0) {/* the curve is given by an OID */
params->type == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1271 tmp = OBJ_obj2nid(params->value.named_curve);-
1272 if ((ret = EC_GROUP_new_by_curve_name(tmp)) == NULL) {
(ret = EC_GROU...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1273 ECerror(EC_R_EC_GROUP_NEW_BY_NAME_FAILURE);-
1274 return NULL;
never executed: return ((void *)0) ;
0
1275 }-
1276 EC_GROUP_set_asn1_flag(ret, OPENSSL_EC_NAMED_CURVE);-
1277 } else if (params->type == 1) { /* the parameters are given by a
never executed: end of block
params->type == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
1278 * ECPARAMETERS structure */-
1279 ret = ec_asn1_parameters2group(params->value.parameters);-
1280 if (!ret) {
!retDescription
TRUEnever evaluated
FALSEnever evaluated
0
1281 ECerror(ERR_R_EC_LIB);-
1282 return NULL;
never executed: return ((void *)0) ;
0
1283 }-
1284 EC_GROUP_set_asn1_flag(ret, 0x0);-
1285 } else if (params->type == 2) { /* implicitlyCA */
never executed: end of block
params->type == 2Description
TRUEnever evaluated
FALSEnever evaluated
0
1286 return NULL;
never executed: return ((void *)0) ;
0
1287 } else {-
1288 ECerror(EC_R_ASN1_ERROR);-
1289 return NULL;
never executed: return ((void *)0) ;
0
1290 }-
1291-
1292 return ret;
never executed: return ret;
0
1293}-
1294-
1295/* EC_GROUP <-> DER encoding of ECPKPARAMETERS */-
1296-
1297EC_GROUP *-
1298d2i_ECPKParameters(EC_GROUP ** a, const unsigned char **in, long len)-
1299{-
1300 EC_GROUP *group = NULL;-
1301 ECPKPARAMETERS *params = NULL;-
1302-
1303 if ((params = d2i_ECPKPARAMETERS(NULL, in, len)) == NULL) {
(params = d2i_...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1304 ECerror(EC_R_D2I_ECPKPARAMETERS_FAILURE);-
1305 goto err;
never executed: goto err;
0
1306 }-
1307 if ((group = ec_asn1_pkparameters2group(params)) == NULL) {
(group = ec_as...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1308 ECerror(EC_R_PKPARAMETERS2GROUP_FAILURE);-
1309 goto err;
never executed: goto err;
0
1310 }-
1311-
1312 if (a != NULL) {
a != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1313 EC_GROUP_clear_free(*a);-
1314 *a = group;-
1315 }
never executed: end of block
0
1316-
1317 err:
code before this statement never executed: err:
0
1318 ECPKPARAMETERS_free(params);-
1319 return (group);
never executed: return (group);
0
1320}-
1321-
1322int -
1323i2d_ECPKParameters(const EC_GROUP * a, unsigned char **out)-
1324{-
1325 int ret = 0;-
1326 ECPKPARAMETERS *tmp = ec_asn1_group2pkparameters(a, NULL);-
1327 if (tmp == NULL) {
tmp == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1328 ECerror(EC_R_GROUP2PKPARAMETERS_FAILURE);-
1329 return 0;
never executed: return 0;
0
1330 }-
1331 if ((ret = i2d_ECPKPARAMETERS(tmp, out)) == 0) {
(ret = i2d_ECP...mp, out)) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1332 ECerror(EC_R_I2D_ECPKPARAMETERS_FAILURE);-
1333 ECPKPARAMETERS_free(tmp);-
1334 return 0;
never executed: return 0;
0
1335 }-
1336 ECPKPARAMETERS_free(tmp);-
1337 return (ret);
never executed: return (ret);
0
1338}-
1339-
1340/* some EC_KEY functions */-
1341-
1342EC_KEY *-
1343d2i_ECPrivateKey(EC_KEY ** a, const unsigned char **in, long len)-
1344{-
1345 EC_KEY *ret = NULL;-
1346 EC_PRIVATEKEY *priv_key = NULL;-
1347-
1348 if ((priv_key = EC_PRIVATEKEY_new()) == NULL) {
(priv_key = EC...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1349 ECerror(ERR_R_MALLOC_FAILURE);-
1350 return NULL;
never executed: return ((void *)0) ;
0
1351 }-
1352 if ((priv_key = d2i_EC_PRIVATEKEY(&priv_key, in, len)) == NULL) {
(priv_key = d2...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1353 ECerror(ERR_R_EC_LIB);-
1354 EC_PRIVATEKEY_free(priv_key);-
1355 return NULL;
never executed: return ((void *)0) ;
0
1356 }-
1357 if (a == NULL || *a == NULL) {
a == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
*a == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1358 if ((ret = EC_KEY_new()) == NULL) {
(ret = EC_KEY_...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1359 ECerror(ERR_R_MALLOC_FAILURE);-
1360 goto err;
never executed: goto err;
0
1361 }-
1362 } else
never executed: end of block
0
1363 ret = *a;
never executed: ret = *a;
0
1364-
1365 if (priv_key->parameters) {
priv_key->parametersDescription
TRUEnever evaluated
FALSEnever evaluated
0
1366 EC_GROUP_clear_free(ret->group);-
1367 ret->group = ec_asn1_pkparameters2group(priv_key->parameters);-
1368 }
never executed: end of block
0
1369 if (ret->group == NULL) {
ret->group == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1370 ECerror(ERR_R_EC_LIB);-
1371 goto err;
never executed: goto err;
0
1372 }-
1373 ret->version = priv_key->version;-
1374-
1375 if (priv_key->privateKey) {
priv_key->privateKeyDescription
TRUEnever evaluated
FALSEnever evaluated
0
1376 ret->priv_key = BN_bin2bn(-
1377 ASN1_STRING_data(priv_key->privateKey),-
1378 ASN1_STRING_length(priv_key->privateKey),-
1379 ret->priv_key);-
1380 if (ret->priv_key == NULL) {
ret->priv_key == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1381 ECerror(ERR_R_BN_LIB);-
1382 goto err;
never executed: goto err;
0
1383 }-
1384 } else {
never executed: end of block
0
1385 ECerror(EC_R_MISSING_PRIVATE_KEY);-
1386 goto err;
never executed: goto err;
0
1387 }-
1388-
1389 if (ret->pub_key)
ret->pub_keyDescription
TRUEnever evaluated
FALSEnever evaluated
0
1390 EC_POINT_clear_free(ret->pub_key);
never executed: EC_POINT_clear_free(ret->pub_key);
0
1391 ret->pub_key = EC_POINT_new(ret->group);-
1392 if (ret->pub_key == NULL) {
ret->pub_key == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1393 ECerror(ERR_R_EC_LIB);-
1394 goto err;
never executed: goto err;
0
1395 }-
1396-
1397 if (priv_key->publicKey) {
priv_key->publicKeyDescription
TRUEnever evaluated
FALSEnever evaluated
0
1398 const unsigned char *pub_oct;-
1399 size_t pub_oct_len;-
1400-
1401 pub_oct = ASN1_STRING_data(priv_key->publicKey);-
1402 pub_oct_len = ASN1_STRING_length(priv_key->publicKey);-
1403 if (pub_oct == NULL || pub_oct_len <= 0) {
pub_oct == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
pub_oct_len <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1404 ECerror(EC_R_BUFFER_TOO_SMALL);-
1405 goto err;
never executed: goto err;
0
1406 }-
1407-
1408 /* save the point conversion form */-
1409 ret->conv_form = (point_conversion_form_t) (pub_oct[0] & ~0x01);-
1410 if (!EC_POINT_oct2point(ret->group, ret->pub_key,
!EC_POINT_oct2... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
1411 pub_oct, pub_oct_len, NULL)) {
!EC_POINT_oct2... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
1412 ECerror(ERR_R_EC_LIB);-
1413 goto err;
never executed: goto err;
0
1414 }-
1415 } else {
never executed: end of block
0
1416 if (!EC_POINT_mul(ret->group, ret->pub_key, ret->priv_key,
!EC_POINT_mul(... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
1417 NULL, NULL, NULL)) {
!EC_POINT_mul(... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
1418 ECerror(ERR_R_EC_LIB);-
1419 goto err;
never executed: goto err;
0
1420 }-
1421 /* Remember the original private-key-only encoding. */-
1422 ret->enc_flag |= EC_PKEY_NO_PUBKEY;-
1423 }
never executed: end of block
0
1424-
1425 EC_PRIVATEKEY_free(priv_key);-
1426 if (a != NULL)
a != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1427 *a = ret;
never executed: *a = ret;
0
1428 return (ret);
never executed: return (ret);
0
1429-
1430 err:-
1431 if (a == NULL || *a != ret)
a == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
*a != retDescription
TRUEnever evaluated
FALSEnever evaluated
0
1432 EC_KEY_free(ret);
never executed: EC_KEY_free(ret);
0
1433 if (priv_key)
priv_keyDescription
TRUEnever evaluated
FALSEnever evaluated
0
1434 EC_PRIVATEKEY_free(priv_key);
never executed: EC_PRIVATEKEY_free(priv_key);
0
1435-
1436 return (NULL);
never executed: return ( ((void *)0) );
0
1437}-
1438-
1439int -
1440i2d_ECPrivateKey(EC_KEY * a, unsigned char **out)-
1441{-
1442 int ret = 0, ok = 0;-
1443 unsigned char *buffer = NULL;-
1444 size_t buf_len = 0, tmp_len;-
1445 EC_PRIVATEKEY *priv_key = NULL;-
1446-
1447 if (a == NULL || a->group == NULL || a->priv_key == NULL ||
a == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
a->group == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
a->priv_key == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1448 (!(a->enc_flag & EC_PKEY_NO_PUBKEY) && a->pub_key == NULL)) {
!(a->enc_flag & 0x002)Description
TRUEnever evaluated
FALSEnever evaluated
a->pub_key == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1449 ECerror(ERR_R_PASSED_NULL_PARAMETER);-
1450 goto err;
never executed: goto err;
0
1451 }-
1452 if ((priv_key = EC_PRIVATEKEY_new()) == NULL) {
(priv_key = EC...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1453 ECerror(ERR_R_MALLOC_FAILURE);-
1454 goto err;
never executed: goto err;
0
1455 }-
1456 priv_key->version = a->version;-
1457-
1458 buf_len = (size_t) BN_num_bytes(a->priv_key);-
1459 buffer = malloc(buf_len);-
1460 if (buffer == NULL) {
buffer == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1461 ECerror(ERR_R_MALLOC_FAILURE);-
1462 goto err;
never executed: goto err;
0
1463 }-
1464 if (!BN_bn2bin(a->priv_key, buffer)) {
!BN_bn2bin(a->...v_key, buffer)Description
TRUEnever evaluated
FALSEnever evaluated
0
1465 ECerror(ERR_R_BN_LIB);-
1466 goto err;
never executed: goto err;
0
1467 }-
1468 if (!ASN1_STRING_set(priv_key->privateKey, buffer, buf_len)) {
!ASN1_STRING_s...ffer, buf_len)Description
TRUEnever evaluated
FALSEnever evaluated
0
1469 ECerror(ERR_R_ASN1_LIB);-
1470 goto err;
never executed: goto err;
0
1471 }-
1472 if (!(a->enc_flag & EC_PKEY_NO_PARAMETERS)) {
!(a->enc_flag & 0x001)Description
TRUEnever evaluated
FALSEnever evaluated
0
1473 if ((priv_key->parameters = ec_asn1_group2pkparameters(
(priv_key->par...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1474 a->group, priv_key->parameters)) == NULL) {
(priv_key->par...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1475 ECerror(ERR_R_EC_LIB);-
1476 goto err;
never executed: goto err;
0
1477 }-
1478 }
never executed: end of block
0
1479 if (!(a->enc_flag & EC_PKEY_NO_PUBKEY) && a->pub_key != NULL) {
!(a->enc_flag & 0x002)Description
TRUEnever evaluated
FALSEnever evaluated
a->pub_key != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1480 priv_key->publicKey = ASN1_BIT_STRING_new();-
1481 if (priv_key->publicKey == NULL) {
priv_key->publ...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1482 ECerror(ERR_R_MALLOC_FAILURE);-
1483 goto err;
never executed: goto err;
0
1484 }-
1485 tmp_len = EC_POINT_point2oct(a->group, a->pub_key,-
1486 a->conv_form, NULL, 0, NULL);-
1487-
1488 if (tmp_len > buf_len) {
tmp_len > buf_lenDescription
TRUEnever evaluated
FALSEnever evaluated
0
1489 unsigned char *tmp_buffer = realloc(buffer, tmp_len);-
1490 if (!tmp_buffer) {
!tmp_bufferDescription
TRUEnever evaluated
FALSEnever evaluated
0
1491 ECerror(ERR_R_MALLOC_FAILURE);-
1492 goto err;
never executed: goto err;
0
1493 }-
1494 buffer = tmp_buffer;-
1495 buf_len = tmp_len;-
1496 }
never executed: end of block
0
1497 if (!EC_POINT_point2oct(a->group, a->pub_key,
!EC_POINT_poin... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
1498 a->conv_form, buffer, buf_len, NULL)) {
!EC_POINT_poin... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
1499 ECerror(ERR_R_EC_LIB);-
1500 goto err;
never executed: goto err;
0
1501 }-
1502 priv_key->publicKey->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);-
1503 priv_key->publicKey->flags |= ASN1_STRING_FLAG_BITS_LEFT;-
1504 if (!ASN1_STRING_set(priv_key->publicKey, buffer,
!ASN1_STRING_s...ffer, buf_len)Description
TRUEnever evaluated
FALSEnever evaluated
0
1505 buf_len)) {
!ASN1_STRING_s...ffer, buf_len)Description
TRUEnever evaluated
FALSEnever evaluated
0
1506 ECerror(ERR_R_ASN1_LIB);-
1507 goto err;
never executed: goto err;
0
1508 }-
1509 }
never executed: end of block
0
1510 if ((ret = i2d_EC_PRIVATEKEY(priv_key, out)) == 0) {
(ret = i2d_EC_...ey, out)) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1511 ECerror(ERR_R_EC_LIB);-
1512 goto err;
never executed: goto err;
0
1513 }-
1514 ok = 1;-
1515 err:
code before this statement never executed: err:
0
1516 free(buffer);-
1517 if (priv_key)
priv_keyDescription
TRUEnever evaluated
FALSEnever evaluated
0
1518 EC_PRIVATEKEY_free(priv_key);
never executed: EC_PRIVATEKEY_free(priv_key);
0
1519 return (ok ? ret : 0);
never executed: return (ok ? ret : 0);
okDescription
TRUEnever evaluated
FALSEnever evaluated
0
1520}-
1521-
1522int -
1523i2d_ECParameters(EC_KEY * a, unsigned char **out)-
1524{-
1525 if (a == NULL) {
a == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1526 ECerror(ERR_R_PASSED_NULL_PARAMETER);-
1527 return 0;
never executed: return 0;
0
1528 }-
1529 return i2d_ECPKParameters(a->group, out);
never executed: return i2d_ECPKParameters(a->group, out);
0
1530}-
1531-
1532EC_KEY *-
1533d2i_ECParameters(EC_KEY ** a, const unsigned char **in, long len)-
1534{-
1535 EC_KEY *ret;-
1536-
1537 if (in == NULL || *in == NULL) {
in == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
*in == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1538 ECerror(ERR_R_PASSED_NULL_PARAMETER);-
1539 return NULL;
never executed: return ((void *)0) ;
0
1540 }-
1541 if (a == NULL || *a == NULL) {
a == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
*a == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1542 if ((ret = EC_KEY_new()) == NULL) {
(ret = EC_KEY_...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1543 ECerror(ERR_R_MALLOC_FAILURE);-
1544 return NULL;
never executed: return ((void *)0) ;
0
1545 }-
1546 } else
never executed: end of block
0
1547 ret = *a;
never executed: ret = *a;
0
1548-
1549 if (!d2i_ECPKParameters(&ret->group, in, len)) {
!d2i_ECPKParam...roup, in, len)Description
TRUEnever evaluated
FALSEnever evaluated
0
1550 ECerror(ERR_R_EC_LIB);-
1551 if (a == NULL || *a != ret)
a == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
*a != retDescription
TRUEnever evaluated
FALSEnever evaluated
0
1552 EC_KEY_free(ret);
never executed: EC_KEY_free(ret);
0
1553 return NULL;
never executed: return ((void *)0) ;
0
1554 }-
1555-
1556 if (a != NULL)
a != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1557 *a = ret;
never executed: *a = ret;
0
1558 return ret;
never executed: return ret;
0
1559}-
1560-
1561EC_KEY *-
1562o2i_ECPublicKey(EC_KEY ** a, const unsigned char **in, long len)-
1563{-
1564 EC_KEY *ret = NULL;-
1565-
1566 if (a == NULL || (*a) == NULL || (*a)->group == NULL) {
a == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
(*a) == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
(*a)->group == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1567 /* An EC_GROUP structure is necessary to set the public key. */-
1568 ECerror(ERR_R_PASSED_NULL_PARAMETER);-
1569 return 0;
never executed: return 0;
0
1570 }-
1571 ret = *a;-
1572 if (ret->pub_key == NULL &&
ret->pub_key == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1573 (ret->pub_key = EC_POINT_new(ret->group)) == NULL) {
(ret->pub_key ...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1574 ECerror(ERR_R_MALLOC_FAILURE);-
1575 return 0;
never executed: return 0;
0
1576 }-
1577 if (!EC_POINT_oct2point(ret->group, ret->pub_key, *in, len, NULL)) {
!EC_POINT_oct2... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
1578 ECerror(ERR_R_EC_LIB);-
1579 return 0;
never executed: return 0;
0
1580 }-
1581 /* save the point conversion form */-
1582 ret->conv_form = (point_conversion_form_t) (*in[0] & ~0x01);-
1583 *in += len;-
1584 return ret;
never executed: return ret;
0
1585}-
1586-
1587int -
1588i2o_ECPublicKey(const EC_KEY * a, unsigned char **out)-
1589{-
1590 size_t buf_len = 0;-
1591 int new_buffer = 0;-
1592-
1593 if (a == NULL) {
a == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1594 ECerror(ERR_R_PASSED_NULL_PARAMETER);-
1595 return 0;
never executed: return 0;
0
1596 }-
1597 buf_len = EC_POINT_point2oct(a->group, a->pub_key,-
1598 a->conv_form, NULL, 0, NULL);-
1599-
1600 if (out == NULL || buf_len == 0)
out == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
buf_len == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1601 /* out == NULL => just return the length of the octet string */-
1602 return buf_len;
never executed: return buf_len;
0
1603-
1604 if (*out == NULL) {
*out == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1605 if ((*out = malloc(buf_len)) == NULL) {
(*out = malloc...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1606 ECerror(ERR_R_MALLOC_FAILURE);-
1607 return 0;
never executed: return 0;
0
1608 }-
1609 new_buffer = 1;-
1610 }
never executed: end of block
0
1611 if (!EC_POINT_point2oct(a->group, a->pub_key, a->conv_form,
!EC_POINT_poin... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
1612 *out, buf_len, NULL)) {
!EC_POINT_poin... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
1613 ECerror(ERR_R_EC_LIB);-
1614 if (new_buffer) {
new_bufferDescription
TRUEnever evaluated
FALSEnever evaluated
0
1615 free(*out);-
1616 *out = NULL;-
1617 }
never executed: end of block
0
1618 return 0;
never executed: return 0;
0
1619 }-
1620 if (!new_buffer)
!new_bufferDescription
TRUEnever evaluated
FALSEnever evaluated
0
1621 *out += buf_len;
never executed: *out += buf_len;
0
1622 return buf_len;
never executed: return buf_len;
0
1623}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2