OpenCoverage

ec_ameth.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/ec/ec_ameth.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: ec_ameth.c,v 1.25 2018/08/24 20:22:15 tb Exp $ */-
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL-
3 * project 2006.-
4 */-
5/* ====================================================================-
6 * Copyright (c) 2006 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 <stdio.h>-
60-
61#include <openssl/opensslconf.h>-
62-
63#include <openssl/bn.h>-
64#include <openssl/ec.h>-
65#include <openssl/err.h>-
66#include <openssl/x509.h>-
67-
68-
69#include "asn1_locl.h"-
70-
71static int -
72eckey_param2type(int *pptype, void **ppval, EC_KEY * ec_key)-
73{-
74 const EC_GROUP *group;-
75 int nid;-
76 if (ec_key == NULL || (group = EC_KEY_get0_group(ec_key)) == NULL) {
ec_key == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
(group = EC_KE...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
77 ECerror(EC_R_MISSING_PARAMETERS);-
78 return 0;
never executed: return 0;
0
79 }-
80 if (EC_GROUP_get_asn1_flag(group) &&
EC_GROUP_get_asn1_flag(group)Description
TRUEnever evaluated
FALSEnever evaluated
0
81 (nid = EC_GROUP_get_curve_name(group))) {
(nid = EC_GROU...e_name(group))Description
TRUEnever evaluated
FALSEnever evaluated
0
82 /* we have a 'named curve' => just set the OID */-
83 *ppval = OBJ_nid2obj(nid);-
84 *pptype = V_ASN1_OBJECT;-
85 } else {
never executed: end of block
0
86 /* explicit parameters */-
87 ASN1_STRING *pstr = NULL;-
88 pstr = ASN1_STRING_new();-
89 if (!pstr)
!pstrDescription
TRUEnever evaluated
FALSEnever evaluated
0
90 return 0;
never executed: return 0;
0
91 pstr->length = i2d_ECParameters(ec_key, &pstr->data);-
92 if (pstr->length <= 0) {
pstr->length <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
93 ASN1_STRING_free(pstr);-
94 ECerror(ERR_R_EC_LIB);-
95 return 0;
never executed: return 0;
0
96 }-
97 *ppval = pstr;-
98 *pptype = V_ASN1_SEQUENCE;-
99 }
never executed: end of block
0
100 return 1;
never executed: return 1;
0
101}-
102-
103static int -
104eckey_pub_encode(X509_PUBKEY * pk, const EVP_PKEY * pkey)-
105{-
106 EC_KEY *ec_key = pkey->pkey.ec;-
107 void *pval = NULL;-
108 int ptype;-
109 unsigned char *penc = NULL, *p;-
110 int penclen;-
111-
112 if (!eckey_param2type(&ptype, &pval, ec_key)) {
!eckey_param2t...&pval, ec_key)Description
TRUEnever evaluated
FALSEnever evaluated
0
113 ECerror(ERR_R_EC_LIB);-
114 return 0;
never executed: return 0;
0
115 }-
116 penclen = i2o_ECPublicKey(ec_key, NULL);-
117 if (penclen <= 0)
penclen <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
118 goto err;
never executed: goto err;
0
119 penc = malloc(penclen);-
120 if (!penc)
!pencDescription
TRUEnever evaluated
FALSEnever evaluated
0
121 goto err;
never executed: goto err;
0
122 p = penc;-
123 penclen = i2o_ECPublicKey(ec_key, &p);-
124 if (penclen <= 0)
penclen <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
125 goto err;
never executed: goto err;
0
126 if (X509_PUBKEY_set0_param(pk, OBJ_nid2obj(EVP_PKEY_EC),
X509_PUBKEY_se...penc, penclen)Description
TRUEnever evaluated
FALSEnever evaluated
0
127 ptype, pval, penc, penclen))
X509_PUBKEY_se...penc, penclen)Description
TRUEnever evaluated
FALSEnever evaluated
0
128 return 1;
never executed: return 1;
0
129 err:
code before this statement never executed: err:
0
130 if (ptype == V_ASN1_OBJECT)
ptype == 6Description
TRUEnever evaluated
FALSEnever evaluated
0
131 ASN1_OBJECT_free(pval);
never executed: ASN1_OBJECT_free(pval);
0
132 else-
133 ASN1_STRING_free(pval);
never executed: ASN1_STRING_free(pval);
0
134 free(penc);-
135 return 0;
never executed: return 0;
0
136}-
137-
138static EC_KEY *-
139eckey_type2param(int ptype, const void *pval)-
140{-
141 EC_KEY *eckey = NULL;-
142-
143 if (ptype == V_ASN1_SEQUENCE) {
ptype == 16Description
TRUEnever evaluated
FALSEnever evaluated
0
144 const ASN1_STRING *pstr = pval;-
145 const unsigned char *pm = NULL;-
146 int pmlen;-
147-
148 pm = pstr->data;-
149 pmlen = pstr->length;-
150 if (!(eckey = d2i_ECParameters(NULL, &pm, pmlen))) {
!(eckey = d2i_..., &pm, pmlen))Description
TRUEnever evaluated
FALSEnever evaluated
0
151 ECerror(EC_R_DECODE_ERROR);-
152 goto ecerr;
never executed: goto ecerr;
0
153 }-
154 } else if (ptype == V_ASN1_OBJECT) {
never executed: end of block
ptype == 6Description
TRUEnever evaluated
FALSEnever evaluated
0
155 const ASN1_OBJECT *poid = pval;-
156 EC_GROUP *group;-
157-
158 /*-
159 * type == V_ASN1_OBJECT => the parameters are given by an-
160 * asn1 OID-
161 */-
162 if ((eckey = EC_KEY_new()) == NULL) {
(eckey = EC_KE...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
163 ECerror(ERR_R_MALLOC_FAILURE);-
164 goto ecerr;
never executed: goto ecerr;
0
165 }-
166 group = EC_GROUP_new_by_curve_name(OBJ_obj2nid(poid));-
167 if (group == NULL)
group == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
168 goto ecerr;
never executed: goto ecerr;
0
169 EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE);-
170 if (EC_KEY_set_group(eckey, group) == 0)
EC_KEY_set_gro...y, group) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
171 goto ecerr;
never executed: goto ecerr;
0
172 EC_GROUP_free(group);-
173 } else {
never executed: end of block
0
174 ECerror(EC_R_DECODE_ERROR);-
175 goto ecerr;
never executed: goto ecerr;
0
176 }-
177-
178 return eckey;
never executed: return eckey;
0
179-
180 ecerr:-
181 if (eckey)
eckeyDescription
TRUEnever evaluated
FALSEnever evaluated
0
182 EC_KEY_free(eckey);
never executed: EC_KEY_free(eckey);
0
183 return NULL;
never executed: return ((void *)0) ;
0
184}-
185-
186static int -
187eckey_pub_decode(EVP_PKEY * pkey, X509_PUBKEY * pubkey)-
188{-
189 const unsigned char *p = NULL;-
190 const void *pval;-
191 int ptype, pklen;-
192 EC_KEY *eckey = NULL;-
193 X509_ALGOR *palg;-
194-
195 if (!X509_PUBKEY_get0_param(NULL, &p, &pklen, &palg, pubkey))
!X509_PUBKEY_g...&palg, pubkey)Description
TRUEnever evaluated
FALSEnever evaluated
0
196 return 0;
never executed: return 0;
0
197 X509_ALGOR_get0(NULL, &ptype, &pval, palg);-
198-
199 eckey = eckey_type2param(ptype, pval);-
200-
201 if (!eckey) {
!eckeyDescription
TRUEnever evaluated
FALSEnever evaluated
0
202 ECerror(ERR_R_EC_LIB);-
203 return 0;
never executed: return 0;
0
204 }-
205 /* We have parameters now set public key */-
206 if (!o2i_ECPublicKey(&eckey, &p, pklen)) {
!o2i_ECPublicK...ey, &p, pklen)Description
TRUEnever evaluated
FALSEnever evaluated
0
207 ECerror(EC_R_DECODE_ERROR);-
208 goto ecerr;
never executed: goto ecerr;
0
209 }-
210 EVP_PKEY_assign_EC_KEY(pkey, eckey);-
211 return 1;
never executed: return 1;
0
212-
213 ecerr:-
214 if (eckey)
eckeyDescription
TRUEnever evaluated
FALSEnever evaluated
0
215 EC_KEY_free(eckey);
never executed: EC_KEY_free(eckey);
0
216 return 0;
never executed: return 0;
0
217}-
218-
219static int -
220eckey_pub_cmp(const EVP_PKEY * a, const EVP_PKEY * b)-
221{-
222 int r;-
223 const EC_GROUP *group = EC_KEY_get0_group(b->pkey.ec);-
224 const EC_POINT *pa = EC_KEY_get0_public_key(a->pkey.ec), *pb = EC_KEY_get0_public_key(b->pkey.ec);-
225-
226 r = EC_POINT_cmp(group, pa, pb, NULL);-
227 if (r == 0)
r == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
228 return 1;
never executed: return 1;
0
229 if (r == 1)
r == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
230 return 0;
never executed: return 0;
0
231 return -2;
never executed: return -2;
0
232}-
233-
234static int -
235eckey_priv_decode(EVP_PKEY * pkey, const PKCS8_PRIV_KEY_INFO * p8)-
236{-
237 const unsigned char *p = NULL;-
238 const void *pval;-
239 int ptype, pklen;-
240 EC_KEY *eckey = NULL;-
241 const X509_ALGOR *palg;-
242-
243 if (!PKCS8_pkey_get0(NULL, &p, &pklen, &palg, p8))
!PKCS8_pkey_ge...en, &palg, p8)Description
TRUEnever evaluated
FALSEnever evaluated
0
244 return 0;
never executed: return 0;
0
245 X509_ALGOR_get0(NULL, &ptype, &pval, palg);-
246-
247 eckey = eckey_type2param(ptype, pval);-
248-
249 if (!eckey)
!eckeyDescription
TRUEnever evaluated
FALSEnever evaluated
0
250 goto ecliberr;
never executed: goto ecliberr;
0
251-
252 /* We have parameters now set private key */-
253 if (!d2i_ECPrivateKey(&eckey, &p, pklen)) {
!d2i_ECPrivate...ey, &p, pklen)Description
TRUEnever evaluated
FALSEnever evaluated
0
254 ECerror(EC_R_DECODE_ERROR);-
255 goto ecerr;
never executed: goto ecerr;
0
256 }-
257 /* calculate public key (if necessary) */-
258 if (EC_KEY_get0_public_key(eckey) == NULL) {
EC_KEY_get0_pu...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
259 const BIGNUM *priv_key;-
260 const EC_GROUP *group;-
261 EC_POINT *pub_key;-
262 /*-
263 * the public key was not included in the SEC1 private key =>-
264 * calculate the public key-
265 */-
266 group = EC_KEY_get0_group(eckey);-
267 pub_key = EC_POINT_new(group);-
268 if (pub_key == NULL) {
pub_key == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
269 ECerror(ERR_R_EC_LIB);-
270 goto ecliberr;
never executed: goto ecliberr;
0
271 }-
272 if (!EC_POINT_copy(pub_key, EC_GROUP_get0_generator(group))) {
!EC_POINT_copy...erator(group))Description
TRUEnever evaluated
FALSEnever evaluated
0
273 EC_POINT_free(pub_key);-
274 ECerror(ERR_R_EC_LIB);-
275 goto ecliberr;
never executed: goto ecliberr;
0
276 }-
277 priv_key = EC_KEY_get0_private_key(eckey);-
278 if (!EC_POINT_mul(group, pub_key, priv_key, NULL, NULL, NULL)) {
!EC_POINT_mul(... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
279 EC_POINT_free(pub_key);-
280 ECerror(ERR_R_EC_LIB);-
281 goto ecliberr;
never executed: goto ecliberr;
0
282 }-
283 if (EC_KEY_set_public_key(eckey, pub_key) == 0) {
EC_KEY_set_pub... pub_key) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
284 EC_POINT_free(pub_key);-
285 ECerror(ERR_R_EC_LIB);-
286 goto ecliberr;
never executed: goto ecliberr;
0
287 }-
288 EC_POINT_free(pub_key);-
289 }
never executed: end of block
0
290 EVP_PKEY_assign_EC_KEY(pkey, eckey);-
291 return 1;
never executed: return 1;
0
292-
293 ecliberr:-
294 ECerror(ERR_R_EC_LIB);-
295 ecerr:
code before this statement never executed: ecerr:
0
296 if (eckey)
eckeyDescription
TRUEnever evaluated
FALSEnever evaluated
0
297 EC_KEY_free(eckey);
never executed: EC_KEY_free(eckey);
0
298 return 0;
never executed: return 0;
0
299}-
300-
301static int -
302eckey_priv_encode(PKCS8_PRIV_KEY_INFO * p8, const EVP_PKEY * pkey)-
303{-
304 EC_KEY *ec_key;-
305 unsigned char *ep, *p;-
306 int eplen, ptype;-
307 void *pval;-
308 unsigned int tmp_flags, old_flags;-
309-
310 ec_key = pkey->pkey.ec;-
311-
312 if (!eckey_param2type(&ptype, &pval, ec_key)) {
!eckey_param2t...&pval, ec_key)Description
TRUEnever evaluated
FALSEnever evaluated
0
313 ECerror(EC_R_DECODE_ERROR);-
314 return 0;
never executed: return 0;
0
315 }-
316 /* set the private key */-
317-
318 /*-
319 * do not include the parameters in the SEC1 private key see PKCS#11-
320 * 12.11-
321 */-
322 old_flags = EC_KEY_get_enc_flags(ec_key);-
323 tmp_flags = old_flags | EC_PKEY_NO_PARAMETERS;-
324 EC_KEY_set_enc_flags(ec_key, tmp_flags);-
325 eplen = i2d_ECPrivateKey(ec_key, NULL);-
326 if (!eplen) {
!eplenDescription
TRUEnever evaluated
FALSEnever evaluated
0
327 EC_KEY_set_enc_flags(ec_key, old_flags);-
328 ECerror(ERR_R_EC_LIB);-
329 return 0;
never executed: return 0;
0
330 }-
331 ep = malloc(eplen);-
332 if (!ep) {
!epDescription
TRUEnever evaluated
FALSEnever evaluated
0
333 EC_KEY_set_enc_flags(ec_key, old_flags);-
334 ECerror(ERR_R_MALLOC_FAILURE);-
335 return 0;
never executed: return 0;
0
336 }-
337 p = ep;-
338 if (!i2d_ECPrivateKey(ec_key, &p)) {
!i2d_ECPrivateKey(ec_key, &p)Description
TRUEnever evaluated
FALSEnever evaluated
0
339 EC_KEY_set_enc_flags(ec_key, old_flags);-
340 free(ep);-
341 ECerror(ERR_R_EC_LIB);-
342 return 0;
never executed: return 0;
0
343 }-
344 /* restore old encoding flags */-
345 EC_KEY_set_enc_flags(ec_key, old_flags);-
346-
347 if (!PKCS8_pkey_set0(p8, OBJ_nid2obj(NID_X9_62_id_ecPublicKey), 0,
!PKCS8_pkey_se...al, ep, eplen)Description
TRUEnever evaluated
FALSEnever evaluated
0
348 ptype, pval, ep, eplen))
!PKCS8_pkey_se...al, ep, eplen)Description
TRUEnever evaluated
FALSEnever evaluated
0
349 return 0;
never executed: return 0;
0
350-
351 return 1;
never executed: return 1;
0
352}-
353-
354static int -
355int_ec_size(const EVP_PKEY * pkey)-
356{-
357 return ECDSA_size(pkey->pkey.ec);
never executed: return ECDSA_size(pkey->pkey.ec);
0
358}-
359-
360static int -
361ec_bits(const EVP_PKEY * pkey)-
362{-
363 BIGNUM *order = BN_new();-
364 const EC_GROUP *group;-
365 int ret;-
366-
367 if (!order) {
!orderDescription
TRUEnever evaluated
FALSEnever evaluated
0
368 ERR_clear_error();-
369 return 0;
never executed: return 0;
0
370 }-
371 group = EC_KEY_get0_group(pkey->pkey.ec);-
372 if (!EC_GROUP_get_order(group, order, NULL)) {
!EC_GROUP_get_... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
373 BN_free(order);-
374 ERR_clear_error();-
375 return 0;
never executed: return 0;
0
376 }-
377 ret = BN_num_bits(order);-
378 BN_free(order);-
379 return ret;
never executed: return ret;
0
380}-
381-
382static int -
383ec_missing_parameters(const EVP_PKEY * pkey)-
384{-
385 if (EC_KEY_get0_group(pkey->pkey.ec) == NULL)
EC_KEY_get0_gr...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
386 return 1;
never executed: return 1;
0
387 return 0;
never executed: return 0;
0
388}-
389-
390static int -
391ec_copy_parameters(EVP_PKEY * to, const EVP_PKEY * from)-
392{-
393 return EC_KEY_set_group(to->pkey.ec, EC_KEY_get0_group(from->pkey.ec));
never executed: return EC_KEY_set_group(to->pkey.ec, EC_KEY_get0_group(from->pkey.ec));
0
394}-
395-
396static int -
397ec_cmp_parameters(const EVP_PKEY * a, const EVP_PKEY * b)-
398{-
399 const EC_GROUP *group_a = EC_KEY_get0_group(a->pkey.ec), *group_b = EC_KEY_get0_group(b->pkey.ec);-
400 if (EC_GROUP_cmp(group_a, group_b, NULL))
EC_GROUP_cmp(g... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
401 return 0;
never executed: return 0;
0
402 else-
403 return 1;
never executed: return 1;
0
404}-
405-
406static void -
407int_ec_free(EVP_PKEY * pkey)-
408{-
409 EC_KEY_free(pkey->pkey.ec);-
410}
never executed: end of block
0
411-
412static int -
413do_EC_KEY_print(BIO * bp, const EC_KEY * x, int off, int ktype)-
414{-
415 unsigned char *buffer = NULL;-
416 const char *ecstr;-
417 size_t buf_len = 0, i;-
418 int ret = 0, reason = ERR_R_BIO_LIB;-
419 BIGNUM *pub_key = NULL, *order = NULL;-
420 BN_CTX *ctx = NULL;-
421 const EC_GROUP *group;-
422 const EC_POINT *public_key;-
423 const BIGNUM *priv_key;-
424-
425 if (x == NULL || (group = EC_KEY_get0_group(x)) == NULL) {
x == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
(group = EC_KE...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
426 reason = ERR_R_PASSED_NULL_PARAMETER;-
427 goto err;
never executed: goto err;
0
428 }-
429 ctx = BN_CTX_new();-
430 if (ctx == NULL) {
ctx == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
431 reason = ERR_R_MALLOC_FAILURE;-
432 goto err;
never executed: goto err;
0
433 }-
434 if (ktype > 0) {
ktype > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
435 public_key = EC_KEY_get0_public_key(x);-
436 if (public_key != NULL) {
public_key != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
437 if ((pub_key = EC_POINT_point2bn(group, public_key,
(pub_key = EC_...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
438 EC_KEY_get_conv_form(x), NULL, ctx)) == NULL) {
(pub_key = EC_...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
439 reason = ERR_R_EC_LIB;-
440 goto err;
never executed: goto err;
0
441 }-
442 if (pub_key)
pub_keyDescription
TRUEnever evaluated
FALSEnever evaluated
0
443 buf_len = (size_t) BN_num_bytes(pub_key);
never executed: buf_len = (size_t) ((BN_num_bits(pub_key)+7)/8);
0
444 }
never executed: end of block
0
445 }
never executed: end of block
0
446 if (ktype == 2) {
ktype == 2Description
TRUEnever evaluated
FALSEnever evaluated
0
447 priv_key = EC_KEY_get0_private_key(x);-
448 if (priv_key && (i = (size_t) BN_num_bytes(priv_key)) > buf_len)
priv_keyDescription
TRUEnever evaluated
FALSEnever evaluated
(i = (size_t) .../8)) > buf_lenDescription
TRUEnever evaluated
FALSEnever evaluated
0
449 buf_len = i;
never executed: buf_len = i;
0
450 } else
never executed: end of block
0
451 priv_key = NULL;
never executed: priv_key = ((void *)0) ;
0
452-
453 if (ktype > 0) {
ktype > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
454 buf_len += 10;-
455 if ((buffer = malloc(buf_len)) == NULL) {
(buffer = mall...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
456 reason = ERR_R_MALLOC_FAILURE;-
457 goto err;
never executed: goto err;
0
458 }-
459 }
never executed: end of block
0
460 if (ktype == 2)
ktype == 2Description
TRUEnever evaluated
FALSEnever evaluated
0
461 ecstr = "Private-Key";
never executed: ecstr = "Private-Key";
0
462 else if (ktype == 1)
ktype == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
463 ecstr = "Public-Key";
never executed: ecstr = "Public-Key";
0
464 else-
465 ecstr = "ECDSA-Parameters";
never executed: ecstr = "ECDSA-Parameters";
0
466-
467 if (!BIO_indent(bp, off, 128))
!BIO_indent(bp, off, 128)Description
TRUEnever evaluated
FALSEnever evaluated
0
468 goto err;
never executed: goto err;
0
469 if ((order = BN_new()) == NULL)
(order = BN_ne...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
470 goto err;
never executed: goto err;
0
471 if (!EC_GROUP_get_order(group, order, NULL))
!EC_GROUP_get_... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
472 goto err;
never executed: goto err;
0
473 if (BIO_printf(bp, "%s: (%d bit)\n", ecstr,
BIO_printf(bp,...s(order)) <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
474 BN_num_bits(order)) <= 0)
BIO_printf(bp,...s(order)) <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
475 goto err;
never executed: goto err;
0
476-
477 if ((priv_key != NULL) && !ASN1_bn_print(bp, "priv:", priv_key,
(priv_key != ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
!ASN1_bn_print..., buffer, off)Description
TRUEnever evaluated
FALSEnever evaluated
0
478 buffer, off))
!ASN1_bn_print..., buffer, off)Description
TRUEnever evaluated
FALSEnever evaluated
0
479 goto err;
never executed: goto err;
0
480 if ((pub_key != NULL) && !ASN1_bn_print(bp, "pub: ", pub_key,
(pub_key != ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
!ASN1_bn_print..., buffer, off)Description
TRUEnever evaluated
FALSEnever evaluated
0
481 buffer, off))
!ASN1_bn_print..., buffer, off)Description
TRUEnever evaluated
FALSEnever evaluated
0
482 goto err;
never executed: goto err;
0
483 if (!ECPKParameters_print(bp, group, off))
!ECPKParameter...p, group, off)Description
TRUEnever evaluated
FALSEnever evaluated
0
484 goto err;
never executed: goto err;
0
485 ret = 1;-
486 err:
code before this statement never executed: err:
0
487 if (!ret)
!retDescription
TRUEnever evaluated
FALSEnever evaluated
0
488 ECerror(reason);
never executed: ERR_put_error(16,(0xfff),(reason),__FILE__,488);
0
489 BN_free(pub_key);-
490 BN_free(order);-
491 BN_CTX_free(ctx);-
492 free(buffer);-
493 return (ret);
never executed: return (ret);
0
494}-
495-
496static int -
497eckey_param_decode(EVP_PKEY * pkey,-
498 const unsigned char **pder, int derlen)-
499{-
500 EC_KEY *eckey;-
501 if (!(eckey = d2i_ECParameters(NULL, pder, derlen))) {
!(eckey = d2i_...pder, derlen))Description
TRUEnever evaluated
FALSEnever evaluated
0
502 ECerror(ERR_R_EC_LIB);-
503 return 0;
never executed: return 0;
0
504 }-
505 EVP_PKEY_assign_EC_KEY(pkey, eckey);-
506 return 1;
never executed: return 1;
0
507}-
508-
509static int -
510eckey_param_encode(const EVP_PKEY * pkey, unsigned char **pder)-
511{-
512 return i2d_ECParameters(pkey->pkey.ec, pder);
never executed: return i2d_ECParameters(pkey->pkey.ec, pder);
0
513}-
514-
515static int -
516eckey_param_print(BIO * bp, const EVP_PKEY * pkey, int indent,-
517 ASN1_PCTX * ctx)-
518{-
519 return do_EC_KEY_print(bp, pkey->pkey.ec, indent, 0);
never executed: return do_EC_KEY_print(bp, pkey->pkey.ec, indent, 0);
0
520}-
521-
522static int -
523eckey_pub_print(BIO * bp, const EVP_PKEY * pkey, int indent,-
524 ASN1_PCTX * ctx)-
525{-
526 return do_EC_KEY_print(bp, pkey->pkey.ec, indent, 1);
never executed: return do_EC_KEY_print(bp, pkey->pkey.ec, indent, 1);
0
527}-
528-
529-
530static int -
531eckey_priv_print(BIO * bp, const EVP_PKEY * pkey, int indent,-
532 ASN1_PCTX * ctx)-
533{-
534 return do_EC_KEY_print(bp, pkey->pkey.ec, indent, 2);
never executed: return do_EC_KEY_print(bp, pkey->pkey.ec, indent, 2);
0
535}-
536-
537static int -
538old_ec_priv_decode(EVP_PKEY * pkey,-
539 const unsigned char **pder, int derlen)-
540{-
541 EC_KEY *ec;-
542 if (!(ec = d2i_ECPrivateKey(NULL, pder, derlen))) {
!(ec = d2i_ECP...pder, derlen))Description
TRUEnever evaluated
FALSEnever evaluated
0
543 ECerror(EC_R_DECODE_ERROR);-
544 return 0;
never executed: return 0;
0
545 }-
546 EVP_PKEY_assign_EC_KEY(pkey, ec);-
547 return 1;
never executed: return 1;
0
548}-
549-
550static int -
551old_ec_priv_encode(const EVP_PKEY * pkey, unsigned char **pder)-
552{-
553 return i2d_ECPrivateKey(pkey->pkey.ec, pder);
never executed: return i2d_ECPrivateKey(pkey->pkey.ec, pder);
0
554}-
555-
556static int -
557ec_pkey_ctrl(EVP_PKEY * pkey, int op, long arg1, void *arg2)-
558{-
559 switch (op) {-
560 case ASN1_PKEY_CTRL_PKCS7_SIGN:
never executed: case 0x1:
0
561 if (arg1 == 0) {
arg1 == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
562 int snid, hnid;-
563 X509_ALGOR *alg1, *alg2;-
564 PKCS7_SIGNER_INFO_get0_algs(arg2, NULL, &alg1, &alg2);-
565 if (alg1 == NULL || alg1->algorithm == NULL)
alg1 == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
alg1->algorithm == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
566 return -1;
never executed: return -1;
0
567 hnid = OBJ_obj2nid(alg1->algorithm);-
568 if (hnid == NID_undef)
hnid == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
569 return -1;
never executed: return -1;
0
570 if (!OBJ_find_sigid_by_algs(&snid, hnid, EVP_PKEY_id(pkey)))
!OBJ_find_sigi...PKEY_id(pkey))Description
TRUEnever evaluated
FALSEnever evaluated
0
571 return -1;
never executed: return -1;
0
572 X509_ALGOR_set0(alg2, OBJ_nid2obj(snid), V_ASN1_UNDEF, 0);-
573 }
never executed: end of block
0
574 return 1;
never executed: return 1;
0
575-
576 case ASN1_PKEY_CTRL_DEFAULT_MD_NID:
never executed: case 0x3:
0
577 *(int *) arg2 = NID_sha1;-
578 return 2;
never executed: return 2;
0
579-
580 default:
never executed: default:
0
581 return -2;
never executed: return -2;
0
582-
583 }-
584-
585}-
586-
587const EVP_PKEY_ASN1_METHOD eckey_asn1_meth = {-
588 .pkey_id = EVP_PKEY_EC,-
589 .pkey_base_id = EVP_PKEY_EC,-
590-
591 .pem_str = "EC",-
592 .info = "OpenSSL EC algorithm",-
593-
594 .pub_decode = eckey_pub_decode,-
595 .pub_encode = eckey_pub_encode,-
596 .pub_cmp = eckey_pub_cmp,-
597 .pub_print = eckey_pub_print,-
598-
599 .priv_decode = eckey_priv_decode,-
600 .priv_encode = eckey_priv_encode,-
601 .priv_print = eckey_priv_print,-
602-
603 .pkey_size = int_ec_size,-
604 .pkey_bits = ec_bits,-
605-
606 .param_decode = eckey_param_decode,-
607 .param_encode = eckey_param_encode,-
608 .param_missing = ec_missing_parameters,-
609 .param_copy = ec_copy_parameters,-
610 .param_cmp = ec_cmp_parameters,-
611 .param_print = eckey_param_print,-
612-
613 .pkey_free = int_ec_free,-
614 .pkey_ctrl = ec_pkey_ctrl,-
615 .old_priv_decode = old_ec_priv_decode,-
616 .old_priv_encode = old_ec_priv_encode-
617};-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2