OpenCoverage

ecx_meth.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/openssl/src/crypto/ec/ecx_meth.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/*-
2 * Copyright 2006-2018 The OpenSSL Project Authors. All Rights Reserved.-
3 *-
4 * Licensed under the OpenSSL license (the "License"). You may not use-
5 * this file except in compliance with the License. You can obtain a copy-
6 * in the file LICENSE in the source distribution or at-
7 * https://www.openssl.org/source/license.html-
8 */-
9-
10#include <stdio.h>-
11#include "internal/cryptlib.h"-
12#include <openssl/x509.h>-
13#include <openssl/ec.h>-
14#include <openssl/rand.h>-
15#include "internal/asn1_int.h"-
16#include "internal/evp_int.h"-
17#include "ec_lcl.h"-
18-
19#define X25519_BITS 253-
20#define X25519_SECURITY_BITS 128-
21-
22#define ED25519_SIGSIZE 64-
23-
24#define X448_BITS 448-
25#define ED448_BITS 456-
26#define X448_SECURITY_BITS 224-
27-
28#define ED448_SIGSIZE 114-
29-
30#define ISX448(id) ((id) == EVP_PKEY_X448)-
31#define IS25519(id) ((id) == EVP_PKEY_X25519 || (id) == EVP_PKEY_ED25519)-
32#define KEYLENID(id) (IS25519(id) ? X25519_KEYLEN \-
33 : ((id) == EVP_PKEY_X448 ? X448_KEYLEN \-
34 : ED448_KEYLEN))-
35#define KEYLEN(p) KEYLENID((p)->ameth->pkey_id)-
36-
37-
38typedef enum {-
39 KEY_OP_PUBLIC,-
40 KEY_OP_PRIVATE,-
41 KEY_OP_KEYGEN-
42} ecx_key_op_t;-
43-
44/* Setup EVP_PKEY using public, private or generation */-
45static int ecx_key_op(EVP_PKEY *pkey, int id, const X509_ALGOR *palg,-
46 const unsigned char *p, int plen, ecx_key_op_t op)-
47{-
48 ECX_KEY *key = NULL;-
49 unsigned char *privkey, *pubkey;-
50-
51 if (op != KEY_OP_KEYGEN) {
op != KEY_OP_KEYGENDescription
TRUEevaluated 3347 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 6273 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
3347-6273
52 if (palg != NULL) {
palg != ((void *)0)Description
TRUEevaluated 194 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 3153 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
194-3153
53 int ptype;-
54-
55 /* Algorithm parameters must be absent */-
56 X509_ALGOR_get0(NULL, &ptype, NULL, palg);-
57 if (ptype != V_ASN1_UNDEF) {
ptype != -1Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 190 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
4-190
58 ECerr(EC_F_ECX_KEY_OP, EC_R_INVALID_ENCODING);-
59 return 0;
executed 4 times by 1 test: return 0;
Executed by:
  • libcrypto.so.1.1
4
60 }-
61 }
executed 190 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
190
62-
63 if (p == NULL || plen != KEYLENID(id)) {
(id) == 1035Description
TRUEevaluated 21 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 91 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
p == ((void *)0)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 3339 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
plen != (((id)...35 ? 56 : 57))Description
TRUEevaluated 14 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 3325 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
(id) == 1034Description
TRUEevaluated 3140 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 199 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
(id) == 1087Description
TRUEevaluated 87 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 112 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
4-3339
64 ECerr(EC_F_ECX_KEY_OP, EC_R_INVALID_ENCODING);-
65 return 0;
executed 18 times by 1 test: return 0;
Executed by:
  • libcrypto.so.1.1
18
66 }-
67 }
executed 3325 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
3325
68-
69 key = OPENSSL_zalloc(sizeof(*key));-
70 if (key == NULL) {
key == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 9598 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-9598
71 ECerr(EC_F_ECX_KEY_OP, ERR_R_MALLOC_FAILURE);-
72 return 0;
never executed: return 0;
0
73 }-
74 pubkey = key->pubkey;-
75-
76 if (op == KEY_OP_PUBLIC) {
op == KEY_OP_PUBLICDescription
TRUEevaluated 3237 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 6361 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
3237-6361
77 memcpy(pubkey, p, plen);-
78 } else {
executed 3237 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
3237
79 privkey = key->privkey = OPENSSL_secure_malloc(KEYLENID(id));-
80 if (privkey == NULL) {
privkey == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 6361 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-6361
81 ECerr(EC_F_ECX_KEY_OP, ERR_R_MALLOC_FAILURE);-
82 goto err;
never executed: goto err;
0
83 }-
84 if (op == KEY_OP_KEYGEN) {
op == KEY_OP_KEYGENDescription
TRUEevaluated 6273 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 88 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
88-6273
85 if (RAND_priv_bytes(privkey, KEYLENID(id)) <= 0) {
RAND_priv_byte...6 : 57))) <= 0Description
TRUEnever evaluated
FALSEevaluated 6273 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-6273
86 OPENSSL_secure_free(privkey);-
87 key->privkey = NULL;-
88 goto err;
never executed: goto err;
0
89 }-
90 if (id == EVP_PKEY_X25519) {
id == 1034Description
TRUEevaluated 6220 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 53 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
53-6220
91 privkey[0] &= 248;-
92 privkey[X25519_KEYLEN - 1] &= 127;-
93 privkey[X25519_KEYLEN - 1] |= 64;-
94 } else if (id == EVP_PKEY_X448) {
executed 6220 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
id == 1035Description
TRUEevaluated 53 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-6220
95 privkey[0] &= 252;-
96 privkey[X448_KEYLEN - 1] |= 128;-
97 }
executed 53 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
53
98 } else {
executed 6273 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
6273
99 memcpy(privkey, p, KEYLENID(id));-
100 }
executed 88 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
88
101 switch (id) {-
102 case EVP_PKEY_X25519:
executed 6229 times by 1 test: case 1034:
Executed by:
  • libcrypto.so.1.1
6229
103 X25519_public_from_private(pubkey, privkey);-
104 break;
executed 6229 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
6229
105 case EVP_PKEY_ED25519:
executed 35 times by 1 test: case 1087:
Executed by:
  • libcrypto.so.1.1
35
106 ED25519_public_from_private(pubkey, privkey);-
107 break;
executed 35 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
35
108 case EVP_PKEY_X448:
executed 59 times by 1 test: case 1035:
Executed by:
  • libcrypto.so.1.1
59
109 X448_public_from_private(pubkey, privkey);-
110 break;
executed 59 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
59
111 case EVP_PKEY_ED448:
executed 38 times by 1 test: case 1088:
Executed by:
  • libcrypto.so.1.1
38
112 ED448_public_from_private(pubkey, privkey);-
113 break;
executed 38 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
38
114 }-
115 }
executed 6361 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
6361
116-
117 EVP_PKEY_assign(pkey, id, key);-
118 return 1;
executed 9598 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
9598
119 err:-
120 OPENSSL_free(key);-
121 return 0;
never executed: return 0;
0
122}-
123-
124static int ecx_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey)-
125{-
126 const ECX_KEY *ecxkey = pkey->pkey.ecx;-
127 unsigned char *penc;-
128-
129 if (ecxkey == NULL) {
ecxkey == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
130 ECerr(EC_F_ECX_PUB_ENCODE, EC_R_INVALID_KEY);-
131 return 0;
never executed: return 0;
0
132 }-
133-
134 penc = OPENSSL_memdup(ecxkey->pubkey, KEYLEN(pkey));-
135 if (penc == NULL) {
penc == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
136 ECerr(EC_F_ECX_PUB_ENCODE, ERR_R_MALLOC_FAILURE);-
137 return 0;
never executed: return 0;
0
138 }-
139-
140 if (!X509_PUBKEY_set0_param(pk, OBJ_nid2obj(pkey->ameth->pkey_id),
!X509_PUBKEY_s...5 ? 56 : 57)))Description
TRUEnever evaluated
FALSEnever evaluated
0
141 V_ASN1_UNDEF, NULL, penc, KEYLEN(pkey))) {
!X509_PUBKEY_s...5 ? 56 : 57)))Description
TRUEnever evaluated
FALSEnever evaluated
0
142 OPENSSL_free(penc);-
143 ECerr(EC_F_ECX_PUB_ENCODE, ERR_R_MALLOC_FAILURE);-
144 return 0;
never executed: return 0;
0
145 }-
146 return 1;
never executed: return 1;
0
147}-
148-
149static int ecx_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey)-
150{-
151 const unsigned char *p;-
152 int pklen;-
153 X509_ALGOR *palg;-
154-
155 if (!X509_PUBKEY_get0_param(NULL, &p, &pklen, &palg, pubkey))
!X509_PUBKEY_g...&palg, pubkey)Description
TRUEnever evaluated
FALSEevaluated 118 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-118
156 return 0;
never executed: return 0;
0
157 return ecx_key_op(pkey, pkey->ameth->pkey_id, palg, p, pklen,
executed 118 times by 1 test: return ecx_key_op(pkey, pkey->ameth->pkey_id, palg, p, pklen, KEY_OP_PUBLIC);
Executed by:
  • libcrypto.so.1.1
118
158 KEY_OP_PUBLIC);
executed 118 times by 1 test: return ecx_key_op(pkey, pkey->ameth->pkey_id, palg, p, pklen, KEY_OP_PUBLIC);
Executed by:
  • libcrypto.so.1.1
118
159}-
160-
161static int ecx_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b)-
162{-
163 const ECX_KEY *akey = a->pkey.ecx;-
164 const ECX_KEY *bkey = b->pkey.ecx;-
165-
166 if (akey == NULL || bkey == NULL)
akey == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 82 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
bkey == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 82 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-82
167 return -2;
never executed: return -2;
0
168-
169 return CRYPTO_memcmp(akey->pubkey, bkey->pubkey, KEYLEN(a)) == 0;
executed 82 times by 1 test: return CRYPTO_memcmp(akey->pubkey, bkey->pubkey, ((((a)->ameth->pkey_id) == 1034 || ((a)->ameth->pkey_id) == 1087) ? 32 : (((a)->ameth->pkey_id) == 1035 ? 56 : 57))) == 0;
Executed by:
  • libcrypto.so.1.1
82
170}-
171-
172static int ecx_priv_decode(EVP_PKEY *pkey, const PKCS8_PRIV_KEY_INFO *p8)-
173{-
174 const unsigned char *p;-
175 int plen;-
176 ASN1_OCTET_STRING *oct = NULL;-
177 const X509_ALGOR *palg;-
178 int rv;-
179-
180 if (!PKCS8_pkey_get0(NULL, &p, &plen, &palg, p8))
!PKCS8_pkey_ge...en, &palg, p8)Description
TRUEnever evaluated
FALSEevaluated 76 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-76
181 return 0;
never executed: return 0;
0
182-
183 oct = d2i_ASN1_OCTET_STRING(NULL, &p, plen);-
184 if (oct == NULL) {
oct == ((void *)0)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 75 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
1-75
185 p = NULL;-
186 plen = 0;-
187 } else {
executed 1 time by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
1
188 p = ASN1_STRING_get0_data(oct);-
189 plen = ASN1_STRING_length(oct);-
190 }
executed 75 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
75
191-
192 rv = ecx_key_op(pkey, pkey->ameth->pkey_id, palg, p, plen, KEY_OP_PRIVATE);-
193 ASN1_OCTET_STRING_free(oct);-
194 return rv;
executed 76 times by 1 test: return rv;
Executed by:
  • libcrypto.so.1.1
76
195}-
196-
197static int ecx_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey)-
198{-
199 const ECX_KEY *ecxkey = pkey->pkey.ecx;-
200 ASN1_OCTET_STRING oct;-
201 unsigned char *penc = NULL;-
202 int penclen;-
203-
204 if (ecxkey == NULL || ecxkey->privkey == NULL) {
ecxkey == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
ecxkey->privkey == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-4
205 ECerr(EC_F_ECX_PRIV_ENCODE, EC_R_INVALID_PRIVATE_KEY);-
206 return 0;
never executed: return 0;
0
207 }-
208-
209 oct.data = ecxkey->privkey;-
210 oct.length = KEYLEN(pkey);
((pkey)->ameth...ey_id) == 1035Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
((pkey)->ameth...ey_id) == 1034Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
((pkey)->ameth...ey_id) == 1087Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
1-3
211 oct.flags = 0;-
212-
213 penclen = i2d_ASN1_OCTET_STRING(&oct, &penc);-
214 if (penclen < 0) {
penclen < 0Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-4
215 ECerr(EC_F_ECX_PRIV_ENCODE, ERR_R_MALLOC_FAILURE);-
216 return 0;
never executed: return 0;
0
217 }-
218-
219 if (!PKCS8_pkey_set0(p8, OBJ_nid2obj(pkey->ameth->pkey_id), 0,
!PKCS8_pkey_se...penc, penclen)Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-4
220 V_ASN1_UNDEF, NULL, penc, penclen)) {
!PKCS8_pkey_se...penc, penclen)Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-4
221 OPENSSL_clear_free(penc, penclen);-
222 ECerr(EC_F_ECX_PRIV_ENCODE, ERR_R_MALLOC_FAILURE);-
223 return 0;
never executed: return 0;
0
224 }-
225-
226 return 1;
executed 4 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
4
227}-
228-
229static int ecx_size(const EVP_PKEY *pkey)-
230{-
231 return KEYLEN(pkey);
never executed: return ((((pkey)->ameth->pkey_id) == 1034 || ((pkey)->ameth->pkey_id) == 1087) ? 32 : (((pkey)->ameth->pkey_id) == 1035 ? 56 : 57));
((pkey)->ameth...ey_id) == 1035Description
TRUEnever evaluated
FALSEnever evaluated
((pkey)->ameth...ey_id) == 1034Description
TRUEnever evaluated
FALSEnever evaluated
((pkey)->ameth...ey_id) == 1087Description
TRUEnever evaluated
FALSEnever evaluated
0
232}-
233-
234static int ecx_bits(const EVP_PKEY *pkey)-
235{-
236 if (IS25519(pkey->ameth->pkey_id)) {
(pkey->ameth->pkey_id) == 1034Description
TRUEevaluated 121 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
(pkey->ameth->pkey_id) == 1087Description
TRUEnever evaluated
FALSEnever evaluated
0-121
237 return X25519_BITS;
executed 121 times by 1 test: return 253;
Executed by:
  • libcrypto.so.1.1
121
238 } else if(ISX448(pkey->ameth->pkey_id)) {
((pkey->ameth-...y_id) == 1035)Description
TRUEnever evaluated
FALSEnever evaluated
0
239 return X448_BITS;
never executed: return 448;
0
240 } else {-
241 return ED448_BITS;
never executed: return 456;
0
242 }-
243}-
244-
245static int ecx_security_bits(const EVP_PKEY *pkey)-
246{-
247 if (IS25519(pkey->ameth->pkey_id)) {
(pkey->ameth->pkey_id) == 1034Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 75 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
(pkey->ameth->pkey_id) == 1087Description
TRUEevaluated 38 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 37 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
1-75
248 return X25519_SECURITY_BITS;
executed 39 times by 1 test: return 128;
Executed by:
  • libcrypto.so.1.1
39
249 } else {-
250 return X448_SECURITY_BITS;
executed 37 times by 1 test: return 224;
Executed by:
  • libcrypto.so.1.1
37
251 }-
252}-
253-
254static void ecx_free(EVP_PKEY *pkey)-
255{-
256 if (pkey->pkey.ecx != NULL)
pkey->pkey.ecx != ((void *)0)Description
TRUEevaluated 9598 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 22 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
22-9598
257 OPENSSL_secure_clear_free(pkey->pkey.ecx->privkey, KEYLEN(pkey));
executed 9598 times by 1 test: CRYPTO_secure_clear_free(pkey->pkey.ecx->privkey, ((((pkey)->ameth->pkey_id) == 1034 || ((pkey)->ameth->pkey_id) == 1087) ? 32 : (((pkey)->ameth->pkey_id) == 1035 ? 56 : 57)), __FILE__, 257);
Executed by:
  • libcrypto.so.1.1
9598
258 OPENSSL_free(pkey->pkey.ecx);-
259}
executed 9620 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
9620
260-
261/* "parameters" are always equal */-
262static int ecx_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b)-
263{-
264 return 1;
executed 3917 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
3917
265}-
266-
267static int ecx_key_print(BIO *bp, const EVP_PKEY *pkey, int indent,-
268 ASN1_PCTX *ctx, ecx_key_op_t op)-
269{-
270 const ECX_KEY *ecxkey = pkey->pkey.ecx;-
271 const char *nm = OBJ_nid2ln(pkey->ameth->pkey_id);-
272-
273 if (op == KEY_OP_PRIVATE) {
op == KEY_OP_PRIVATEDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
3-4
274 if (ecxkey == NULL || ecxkey->privkey == NULL) {
ecxkey == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
ecxkey->privkey == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-4
275 if (BIO_printf(bp, "%*s<INVALID PRIVATE KEY>\n", indent, "") <= 0)
BIO_printf(bp,...dent, "") <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
276 return 0;
never executed: return 0;
0
277 return 1;
never executed: return 1;
0
278 }-
279 if (BIO_printf(bp, "%*s%s Private-Key:\n", indent, "", nm) <= 0)
BIO_printf(bp,..., "", nm) <= 0Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-4
280 return 0;
never executed: return 0;
0
281 if (BIO_printf(bp, "%*spriv:\n", indent, "") <= 0)
BIO_printf(bp,...dent, "") <= 0Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-4
282 return 0;
never executed: return 0;
0
283 if (ASN1_buf_print(bp, ecxkey->privkey, KEYLEN(pkey),
ASN1_buf_print...dent + 4) == 0Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-4
284 indent + 4) == 0)
ASN1_buf_print...dent + 4) == 0Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-4
285 return 0;
never executed: return 0;
0
286 } else {
executed 4 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
4
287 if (ecxkey == NULL) {
ecxkey == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-3
288 if (BIO_printf(bp, "%*s<INVALID PUBLIC KEY>\n", indent, "") <= 0)
BIO_printf(bp,...dent, "") <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
289 return 0;
never executed: return 0;
0
290 return 1;
never executed: return 1;
0
291 }-
292 if (BIO_printf(bp, "%*s%s Public-Key:\n", indent, "", nm) <= 0)
BIO_printf(bp,..., "", nm) <= 0Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-3
293 return 0;
never executed: return 0;
0
294 }
executed 3 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
3
295 if (BIO_printf(bp, "%*spub:\n", indent, "") <= 0)
BIO_printf(bp,...dent, "") <= 0Description
TRUEnever evaluated
FALSEevaluated 7 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-7
296 return 0;
never executed: return 0;
0
297-
298 if (ASN1_buf_print(bp, ecxkey->pubkey, KEYLEN(pkey),
ASN1_buf_print...dent + 4) == 0Description
TRUEnever evaluated
FALSEevaluated 7 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-7
299 indent + 4) == 0)
ASN1_buf_print...dent + 4) == 0Description
TRUEnever evaluated
FALSEevaluated 7 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-7
300 return 0;
never executed: return 0;
0
301 return 1;
executed 7 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
7
302}-
303-
304static int ecx_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent,-
305 ASN1_PCTX *ctx)-
306{-
307 return ecx_key_print(bp, pkey, indent, ctx, KEY_OP_PRIVATE);
executed 4 times by 1 test: return ecx_key_print(bp, pkey, indent, ctx, KEY_OP_PRIVATE);
Executed by:
  • libcrypto.so.1.1
4
308}-
309-
310static int ecx_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent,-
311 ASN1_PCTX *ctx)-
312{-
313 return ecx_key_print(bp, pkey, indent, ctx, KEY_OP_PUBLIC);
executed 3 times by 1 test: return ecx_key_print(bp, pkey, indent, ctx, KEY_OP_PUBLIC);
Executed by:
  • libcrypto.so.1.1
3
314}-
315-
316static int ecx_ctrl(EVP_PKEY *pkey, int op, long arg1, void *arg2)-
317{-
318 switch (op) {-
319-
320 case ASN1_PKEY_CTRL_SET1_TLS_ENCPT:
executed 3125 times by 1 test: case 0x9:
Executed by:
  • libcrypto.so.1.1
3125
321 return ecx_key_op(pkey, pkey->ameth->pkey_id, NULL, arg2, arg1,
executed 3125 times by 1 test: return ecx_key_op(pkey, pkey->ameth->pkey_id, ((void *)0) , arg2, arg1, KEY_OP_PUBLIC);
Executed by:
  • libcrypto.so.1.1
3125
322 KEY_OP_PUBLIC);
executed 3125 times by 1 test: return ecx_key_op(pkey, pkey->ameth->pkey_id, ((void *)0) , arg2, arg1, KEY_OP_PUBLIC);
Executed by:
  • libcrypto.so.1.1
3125
323-
324 case ASN1_PKEY_CTRL_GET1_TLS_ENCPT:
executed 5759 times by 1 test: case 0xa:
Executed by:
  • libcrypto.so.1.1
5759
325 if (pkey->pkey.ecx != NULL) {
pkey->pkey.ecx != ((void *)0)Description
TRUEevaluated 5759 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-5759
326 unsigned char **ppt = arg2;-
327-
328 *ppt = OPENSSL_memdup(pkey->pkey.ecx->pubkey, KEYLEN(pkey));-
329 if (*ppt != NULL)
*ppt != ((void *)0)Description
TRUEevaluated 5759 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-5759
330 return KEYLEN(pkey);
executed 5759 times by 1 test: return ((((pkey)->ameth->pkey_id) == 1034 || ((pkey)->ameth->pkey_id) == 1087) ? 32 : (((pkey)->ameth->pkey_id) == 1035 ? 56 : 57));
Executed by:
  • libcrypto.so.1.1
((pkey)->ameth...ey_id) == 1035Description
TRUEevaluated 60 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
((pkey)->ameth...ey_id) == 1034Description
TRUEevaluated 5699 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 60 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
((pkey)->ameth...ey_id) == 1087Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-5759
331 }
never executed: end of block
0
332 return 0;
never executed: return 0;
0
333-
334 default:
never executed: default:
0
335 return -2;
never executed: return -2;
0
336-
337 }-
338}-
339-
340static int ecd_ctrl(EVP_PKEY *pkey, int op, long arg1, void *arg2)-
341{-
342 switch (op) {-
343 case ASN1_PKEY_CTRL_DEFAULT_MD_NID:
never executed: case 0x3:
0
344 /* We currently only support Pure EdDSA which takes no digest */-
345 *(int *)arg2 = NID_undef;-
346 return 2;
never executed: return 2;
0
347-
348 default:
never executed: default:
0
349 return -2;
never executed: return -2;
0
350-
351 }-
352}-
353-
354static int ecx_set_priv_key(EVP_PKEY *pkey, const unsigned char *priv,-
355 size_t len)-
356{-
357 return ecx_key_op(pkey, pkey->ameth->pkey_id, NULL, priv, len,
executed 13 times by 1 test: return ecx_key_op(pkey, pkey->ameth->pkey_id, ((void *)0) , priv, len, KEY_OP_PRIVATE);
Executed by:
  • libcrypto.so.1.1
13
358 KEY_OP_PRIVATE);
executed 13 times by 1 test: return ecx_key_op(pkey, pkey->ameth->pkey_id, ((void *)0) , priv, len, KEY_OP_PRIVATE);
Executed by:
  • libcrypto.so.1.1
13
359}-
360-
361static int ecx_set_pub_key(EVP_PKEY *pkey, const unsigned char *pub, size_t len)-
362{-
363 return ecx_key_op(pkey, pkey->ameth->pkey_id, NULL, pub, len,
executed 15 times by 1 test: return ecx_key_op(pkey, pkey->ameth->pkey_id, ((void *)0) , pub, len, KEY_OP_PUBLIC);
Executed by:
  • libcrypto.so.1.1
15
364 KEY_OP_PUBLIC);
executed 15 times by 1 test: return ecx_key_op(pkey, pkey->ameth->pkey_id, ((void *)0) , pub, len, KEY_OP_PUBLIC);
Executed by:
  • libcrypto.so.1.1
15
365}-
366-
367static int ecx_get_priv_key(const EVP_PKEY *pkey, unsigned char *priv,-
368 size_t *len)-
369{-
370 const ECX_KEY *key = pkey->pkey.ecx;-
371-
372 if (priv == NULL) {
priv == ((void *)0)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
4
373 *len = KEYLENID(pkey->ameth->pkey_id);
(pkey->ameth->pkey_id) == 1035Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
(pkey->ameth->pkey_id) == 1034Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
(pkey->ameth->pkey_id) == 1087Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
1-3
374 return 1;
executed 4 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
4
375 }-
376-
377 if (key == NULL
key == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-4
378 || key->privkey == NULL
key->privkey == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-4
379 || *len < (size_t)KEYLENID(pkey->ameth->pkey_id))
*len < (size_t...35 ? 56 : 57))Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-4
380 return 0;
never executed: return 0;
0
381-
382 *len = KEYLENID(pkey->ameth->pkey_id);
(pkey->ameth->pkey_id) == 1035Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
(pkey->ameth->pkey_id) == 1034Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
(pkey->ameth->pkey_id) == 1087Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
1-3
383 memcpy(priv, key->privkey, *len);-
384-
385 return 1;
executed 4 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
4
386}-
387-
388static int ecx_get_pub_key(const EVP_PKEY *pkey, unsigned char *pub,-
389 size_t *len)-
390{-
391 const ECX_KEY *key = pkey->pkey.ecx;-
392-
393 if (pub == NULL) {
pub == ((void *)0)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
4
394 *len = KEYLENID(pkey->ameth->pkey_id);
(pkey->ameth->pkey_id) == 1035Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
(pkey->ameth->pkey_id) == 1034Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
(pkey->ameth->pkey_id) == 1087Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
1-3
395 return 1;
executed 4 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
4
396 }-
397-
398 if (key == NULL
key == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-4
399 || *len < (size_t)KEYLENID(pkey->ameth->pkey_id))
*len < (size_t...35 ? 56 : 57))Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-4
400 return 0;
never executed: return 0;
0
401-
402 *len = KEYLENID(pkey->ameth->pkey_id);
(pkey->ameth->pkey_id) == 1035Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
(pkey->ameth->pkey_id) == 1034Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
(pkey->ameth->pkey_id) == 1087Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
1-3
403 memcpy(pub, key->pubkey, *len);-
404-
405 return 1;
executed 4 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
4
406}-
407-
408const EVP_PKEY_ASN1_METHOD ecx25519_asn1_meth = {-
409 EVP_PKEY_X25519,-
410 EVP_PKEY_X25519,-
411 0,-
412 "X25519",-
413 "OpenSSL X25519 algorithm",-
414-
415 ecx_pub_decode,-
416 ecx_pub_encode,-
417 ecx_pub_cmp,-
418 ecx_pub_print,-
419-
420 ecx_priv_decode,-
421 ecx_priv_encode,-
422 ecx_priv_print,-
423-
424 ecx_size,-
425 ecx_bits,-
426 ecx_security_bits,-
427-
428 0, 0, 0, 0,-
429 ecx_cmp_parameters,-
430 0, 0,-
431-
432 ecx_free,-
433 ecx_ctrl,-
434 NULL,-
435 NULL,-
436-
437 NULL,-
438 NULL,-
439 NULL,-
440-
441 NULL,-
442 NULL,-
443 NULL,-
444-
445 ecx_set_priv_key,-
446 ecx_set_pub_key,-
447 ecx_get_priv_key,-
448 ecx_get_pub_key,-
449};-
450-
451const EVP_PKEY_ASN1_METHOD ecx448_asn1_meth = {-
452 EVP_PKEY_X448,-
453 EVP_PKEY_X448,-
454 0,-
455 "X448",-
456 "OpenSSL X448 algorithm",-
457-
458 ecx_pub_decode,-
459 ecx_pub_encode,-
460 ecx_pub_cmp,-
461 ecx_pub_print,-
462-
463 ecx_priv_decode,-
464 ecx_priv_encode,-
465 ecx_priv_print,-
466-
467 ecx_size,-
468 ecx_bits,-
469 ecx_security_bits,-
470-
471 0, 0, 0, 0,-
472 ecx_cmp_parameters,-
473 0, 0,-
474-
475 ecx_free,-
476 ecx_ctrl,-
477 NULL,-
478 NULL,-
479-
480 NULL,-
481 NULL,-
482 NULL,-
483-
484 NULL,-
485 NULL,-
486 NULL,-
487-
488 ecx_set_priv_key,-
489 ecx_set_pub_key,-
490 ecx_get_priv_key,-
491 ecx_get_pub_key,-
492};-
493-
494static int ecd_size25519(const EVP_PKEY *pkey)-
495{-
496 return ED25519_SIGSIZE;
executed 10 times by 1 test: return 64;
Executed by:
  • libcrypto.so.1.1
10
497}-
498-
499static int ecd_size448(const EVP_PKEY *pkey)-
500{-
501 return ED448_SIGSIZE;
executed 10 times by 1 test: return 114;
Executed by:
  • libcrypto.so.1.1
10
502}-
503-
504static int ecd_item_verify(EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn,-
505 X509_ALGOR *sigalg, ASN1_BIT_STRING *str,-
506 EVP_PKEY *pkey)-
507{-
508 const ASN1_OBJECT *obj;-
509 int ptype;-
510 int nid;-
511-
512 /* Sanity check: make sure it is ED25519/ED448 with absent parameters */-
513 X509_ALGOR_get0(&obj, &ptype, NULL, sigalg);-
514 nid = OBJ_obj2nid(obj);-
515 if ((nid != NID_ED25519 && nid != NID_ED448) || ptype != V_ASN1_UNDEF) {
nid != 1087Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
nid != 1088Description
TRUEnever evaluated
FALSEnever evaluated
ptype != -1Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-1
516 ECerr(EC_F_ECD_ITEM_VERIFY, EC_R_INVALID_ENCODING);-
517 return 0;
never executed: return 0;
0
518 }-
519-
520 if (!EVP_DigestVerifyInit(ctx, NULL, NULL, NULL, pkey))
!EVP_DigestVer...d *)0) , pkey)Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-1
521 return 0;
never executed: return 0;
0
522-
523 return 2;
executed 1 time by 1 test: return 2;
Executed by:
  • libcrypto.so.1.1
1
524}-
525-
526static int ecd_item_sign25519(EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn,-
527 X509_ALGOR *alg1, X509_ALGOR *alg2,-
528 ASN1_BIT_STRING *str)-
529{-
530 /* Set algorithms identifiers */-
531 X509_ALGOR_set0(alg1, OBJ_nid2obj(NID_ED25519), V_ASN1_UNDEF, NULL);-
532 if (alg2)
alg2Description
TRUEnever evaluated
FALSEnever evaluated
0
533 X509_ALGOR_set0(alg2, OBJ_nid2obj(NID_ED25519), V_ASN1_UNDEF, NULL);
never executed: X509_ALGOR_set0(alg2, OBJ_nid2obj(1087), -1, ((void *)0) );
0
534 /* Algorithm idetifiers set: carry on as normal */-
535 return 3;
never executed: return 3;
0
536}-
537-
538static int ecd_sig_info_set25519(X509_SIG_INFO *siginf, const X509_ALGOR *alg,-
539 const ASN1_STRING *sig)-
540{-
541 X509_SIG_INFO_set(siginf, NID_undef, NID_ED25519, X25519_SECURITY_BITS,-
542 X509_SIG_INFO_TLS);-
543 return 1;
executed 7 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
7
544}-
545-
546static int ecd_item_sign448(EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn,-
547 X509_ALGOR *alg1, X509_ALGOR *alg2,-
548 ASN1_BIT_STRING *str)-
549{-
550 /* Set algorithm identifier */-
551 X509_ALGOR_set0(alg1, OBJ_nid2obj(NID_ED448), V_ASN1_UNDEF, NULL);-
552 if (alg2 != NULL)
alg2 != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
553 X509_ALGOR_set0(alg2, OBJ_nid2obj(NID_ED448), V_ASN1_UNDEF, NULL);
never executed: X509_ALGOR_set0(alg2, OBJ_nid2obj(1088), -1, ((void *)0) );
0
554 /* Algorithm identifier set: carry on as normal */-
555 return 3;
never executed: return 3;
0
556}-
557-
558static int ecd_sig_info_set448(X509_SIG_INFO *siginf, const X509_ALGOR *alg,-
559 const ASN1_STRING *sig)-
560{-
561 X509_SIG_INFO_set(siginf, NID_undef, NID_ED448, X448_SECURITY_BITS,-
562 X509_SIG_INFO_TLS);-
563 return 1;
executed 1 time by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
1
564}-
565-
566-
567const EVP_PKEY_ASN1_METHOD ed25519_asn1_meth = {-
568 EVP_PKEY_ED25519,-
569 EVP_PKEY_ED25519,-
570 0,-
571 "ED25519",-
572 "OpenSSL ED25519 algorithm",-
573-
574 ecx_pub_decode,-
575 ecx_pub_encode,-
576 ecx_pub_cmp,-
577 ecx_pub_print,-
578-
579 ecx_priv_decode,-
580 ecx_priv_encode,-
581 ecx_priv_print,-
582-
583 ecd_size25519,-
584 ecx_bits,-
585 ecx_security_bits,-
586-
587 0, 0, 0, 0,-
588 ecx_cmp_parameters,-
589 0, 0,-
590-
591 ecx_free,-
592 ecd_ctrl,-
593 NULL,-
594 NULL,-
595 ecd_item_verify,-
596 ecd_item_sign25519,-
597 ecd_sig_info_set25519,-
598-
599 NULL,-
600 NULL,-
601 NULL,-
602-
603 ecx_set_priv_key,-
604 ecx_set_pub_key,-
605 ecx_get_priv_key,-
606 ecx_get_pub_key,-
607};-
608-
609const EVP_PKEY_ASN1_METHOD ed448_asn1_meth = {-
610 EVP_PKEY_ED448,-
611 EVP_PKEY_ED448,-
612 0,-
613 "ED448",-
614 "OpenSSL ED448 algorithm",-
615-
616 ecx_pub_decode,-
617 ecx_pub_encode,-
618 ecx_pub_cmp,-
619 ecx_pub_print,-
620-
621 ecx_priv_decode,-
622 ecx_priv_encode,-
623 ecx_priv_print,-
624-
625 ecd_size448,-
626 ecx_bits,-
627 ecx_security_bits,-
628-
629 0, 0, 0, 0,-
630 ecx_cmp_parameters,-
631 0, 0,-
632-
633 ecx_free,-
634 ecd_ctrl,-
635 NULL,-
636 NULL,-
637 ecd_item_verify,-
638 ecd_item_sign448,-
639 ecd_sig_info_set448,-
640-
641 NULL,-
642 NULL,-
643 NULL,-
644-
645 ecx_set_priv_key,-
646 ecx_set_pub_key,-
647 ecx_get_priv_key,-
648 ecx_get_pub_key,-
649};-
650-
651static int pkey_ecx_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)-
652{-
653 return ecx_key_op(pkey, ctx->pmeth->pkey_id, NULL, NULL, 0, KEY_OP_KEYGEN);
executed 6273 times by 1 test: return ecx_key_op(pkey, ctx->pmeth->pkey_id, ((void *)0) , ((void *)0) , 0, KEY_OP_KEYGEN);
Executed by:
  • libcrypto.so.1.1
6273
654}-
655-
656static int validate_ecx_derive(EVP_PKEY_CTX *ctx, unsigned char *key,-
657 size_t *keylen,-
658 const unsigned char **privkey,-
659 const unsigned char **pubkey)-
660{-
661 const ECX_KEY *ecxkey, *peerkey;-
662-
663 if (ctx->pkey == NULL || ctx->peerkey == NULL) {
ctx->pkey == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 5856 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
ctx->peerkey == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 5856 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-5856
664 ECerr(EC_F_VALIDATE_ECX_DERIVE, EC_R_KEYS_NOT_SET);-
665 return 0;
never executed: return 0;
0
666 }-
667 ecxkey = ctx->pkey->pkey.ecx;-
668 peerkey = ctx->peerkey->pkey.ecx;-
669 if (ecxkey == NULL || ecxkey->privkey == NULL) {
ecxkey == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 5856 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
ecxkey->privkey == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 5856 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-5856
670 ECerr(EC_F_VALIDATE_ECX_DERIVE, EC_R_INVALID_PRIVATE_KEY);-
671 return 0;
never executed: return 0;
0
672 }-
673 if (peerkey == NULL) {
peerkey == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 5856 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-5856
674 ECerr(EC_F_VALIDATE_ECX_DERIVE, EC_R_INVALID_PEER_KEY);-
675 return 0;
never executed: return 0;
0
676 }-
677 *privkey = ecxkey->privkey;-
678 *pubkey = peerkey->pubkey;-
679-
680 return 1;
executed 5856 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
5856
681}-
682-
683static int pkey_ecx_derive25519(EVP_PKEY_CTX *ctx, unsigned char *key,-
684 size_t *keylen)-
685{-
686 const unsigned char *privkey, *pubkey;-
687-
688 if (!validate_ecx_derive(ctx, key, keylen, &privkey, &pubkey)
!validate_ecx_...vkey, &pubkey)Description
TRUEnever evaluated
FALSEevaluated 5832 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-5832
689 || (key != NULL
key != ((void *)0)Description
TRUEevaluated 2916 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 2916 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
2916
690 && X25519(key, privkey, pubkey) == 0))
X25519(key, pr..., pubkey) == 0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 2914 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
2-2914
691 return 0;
executed 2 times by 1 test: return 0;
Executed by:
  • libcrypto.so.1.1
2
692 *keylen = X25519_KEYLEN;-
693 return 1;
executed 5830 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
5830
694}-
695-
696static int pkey_ecx_derive448(EVP_PKEY_CTX *ctx, unsigned char *key,-
697 size_t *keylen)-
698{-
699 const unsigned char *privkey, *pubkey;-
700-
701 if (!validate_ecx_derive(ctx, key, keylen, &privkey, &pubkey)
!validate_ecx_...vkey, &pubkey)Description
TRUEnever evaluated
FALSEevaluated 24 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-24
702 || (key != NULL
key != ((void *)0)Description
TRUEevaluated 12 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 12 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
12
703 && X448(key, privkey, pubkey) == 0))
X448(key, priv..., pubkey) == 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 11 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
1-11
704 return 0;
executed 1 time by 1 test: return 0;
Executed by:
  • libcrypto.so.1.1
1
705 *keylen = X448_KEYLEN;-
706 return 1;
executed 23 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
23
707}-
708-
709static int pkey_ecx_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)-
710{-
711 /* Only need to handle peer key for derivation */-
712 if (type == EVP_PKEY_CTRL_PEER_KEY)
type == 2Description
TRUEevaluated 5856 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-5856
713 return 1;
executed 5856 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
5856
714 return -2;
never executed: return -2;
0
715}-
716-
717const EVP_PKEY_METHOD ecx25519_pkey_meth = {-
718 EVP_PKEY_X25519,-
719 0, 0, 0, 0, 0, 0, 0,-
720 pkey_ecx_keygen,-
721 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-
722 pkey_ecx_derive25519,-
723 pkey_ecx_ctrl,-
724 0-
725};-
726-
727const EVP_PKEY_METHOD ecx448_pkey_meth = {-
728 EVP_PKEY_X448,-
729 0, 0, 0, 0, 0, 0, 0,-
730 pkey_ecx_keygen,-
731 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-
732 pkey_ecx_derive448,-
733 pkey_ecx_ctrl,-
734 0-
735};-
736-
737static int pkey_ecd_digestsign25519(EVP_MD_CTX *ctx, unsigned char *sig,-
738 size_t *siglen, const unsigned char *tbs,-
739 size_t tbslen)-
740{-
741 const ECX_KEY *edkey = EVP_MD_CTX_pkey_ctx(ctx)->pkey->pkey.ecx;-
742-
743 if (sig == NULL) {
sig == ((void *)0)Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 11 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
6-11
744 *siglen = ED25519_SIGSIZE;-
745 return 1;
executed 6 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
6
746 }-
747 if (*siglen < ED25519_SIGSIZE) {
*siglen < 64Description
TRUEnever evaluated
FALSEevaluated 11 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-11
748 ECerr(EC_F_PKEY_ECD_DIGESTSIGN25519, EC_R_BUFFER_TOO_SMALL);-
749 return 0;
never executed: return 0;
0
750 }-
751-
752 if (ED25519_sign(sig, tbs, tbslen, edkey->pubkey, edkey->privkey) == 0)
ED25519_sign(s...>privkey) == 0Description
TRUEnever evaluated
FALSEevaluated 11 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-11
753 return 0;
never executed: return 0;
0
754 *siglen = ED25519_SIGSIZE;-
755 return 1;
executed 11 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
11
756}-
757-
758static int pkey_ecd_digestsign448(EVP_MD_CTX *ctx, unsigned char *sig,-
759 size_t *siglen, const unsigned char *tbs,-
760 size_t tbslen)-
761{-
762 const ECX_KEY *edkey = EVP_MD_CTX_pkey_ctx(ctx)->pkey->pkey.ecx;-
763-
764 if (sig == NULL) {
sig == ((void *)0)Description
TRUEevaluated 9 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 14 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
9-14
765 *siglen = ED448_SIGSIZE;-
766 return 1;
executed 9 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
9
767 }-
768 if (*siglen < ED448_SIGSIZE) {
*siglen < 114Description
TRUEnever evaluated
FALSEevaluated 14 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-14
769 ECerr(EC_F_PKEY_ECD_DIGESTSIGN448, EC_R_BUFFER_TOO_SMALL);-
770 return 0;
never executed: return 0;
0
771 }-
772-
773 if (ED448_sign(sig, tbs, tbslen, edkey->pubkey, edkey->privkey, NULL,
ED448_sign(sig...*)0) , 0) == 0Description
TRUEnever evaluated
FALSEevaluated 14 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-14
774 0) == 0)
ED448_sign(sig...*)0) , 0) == 0Description
TRUEnever evaluated
FALSEevaluated 14 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-14
775 return 0;
never executed: return 0;
0
776 *siglen = ED448_SIGSIZE;-
777 return 1;
executed 14 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
14
778}-
779-
780static int pkey_ecd_digestverify25519(EVP_MD_CTX *ctx, const unsigned char *sig,-
781 size_t siglen, const unsigned char *tbs,-
782 size_t tbslen)-
783{-
784 const ECX_KEY *edkey = EVP_MD_CTX_pkey_ctx(ctx)->pkey->pkey.ecx;-
785-
786 if (siglen != ED25519_SIGSIZE)
siglen != 64Description
TRUEnever evaluated
FALSEevaluated 10 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-10
787 return 0;
never executed: return 0;
0
788-
789 return ED25519_verify(tbs, tbslen, sig, edkey->pubkey);
executed 10 times by 1 test: return ED25519_verify(tbs, tbslen, sig, edkey->pubkey);
Executed by:
  • libcrypto.so.1.1
10
790}-
791-
792static int pkey_ecd_digestverify448(EVP_MD_CTX *ctx, const unsigned char *sig,-
793 size_t siglen, const unsigned char *tbs,-
794 size_t tbslen)-
795{-
796 const ECX_KEY *edkey = EVP_MD_CTX_pkey_ctx(ctx)->pkey->pkey.ecx;-
797-
798 if (siglen != ED448_SIGSIZE)
siglen != 114Description
TRUEnever evaluated
FALSEevaluated 9 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-9
799 return 0;
never executed: return 0;
0
800-
801 return ED448_verify(tbs, tbslen, sig, edkey->pubkey, NULL, 0);
executed 9 times by 1 test: return ED448_verify(tbs, tbslen, sig, edkey->pubkey, ((void *)0) , 0);
Executed by:
  • libcrypto.so.1.1
9
802}-
803-
804static int pkey_ecd_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)-
805{-
806 switch (type) {-
807 case EVP_PKEY_CTRL_MD:
executed 50 times by 1 test: case 1:
Executed by:
  • libcrypto.so.1.1
50
808 /* Only NULL allowed as digest */-
809 if (p2 == NULL || (const EVP_MD *)p2 == EVP_md_null())
p2 == ((void *)0)Description
TRUEevaluated 48 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
(const EVP_MD ... EVP_md_null()Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-48
810 return 1;
executed 48 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
48
811 ECerr(EC_F_PKEY_ECD_CTRL, EC_R_INVALID_DIGEST_TYPE);-
812 return 0;
executed 2 times by 1 test: return 0;
Executed by:
  • libcrypto.so.1.1
2
813-
814 case EVP_PKEY_CTRL_DIGESTINIT:
never executed: case 7:
0
815 return 1;
never executed: return 1;
0
816 }-
817 return -2;
never executed: return -2;
0
818}-
819-
820const EVP_PKEY_METHOD ed25519_pkey_meth = {-
821 EVP_PKEY_ED25519, EVP_PKEY_FLAG_SIGCTX_CUSTOM,-
822 0, 0, 0, 0, 0, 0,-
823 pkey_ecx_keygen,-
824 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-
825 pkey_ecd_ctrl,-
826 0,-
827 pkey_ecd_digestsign25519,-
828 pkey_ecd_digestverify25519-
829};-
830-
831const EVP_PKEY_METHOD ed448_pkey_meth = {-
832 EVP_PKEY_ED448, EVP_PKEY_FLAG_SIGCTX_CUSTOM,-
833 0, 0, 0, 0, 0, 0,-
834 pkey_ecx_keygen,-
835 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-
836 pkey_ecd_ctrl,-
837 0,-
838 pkey_ecd_digestsign448,-
839 pkey_ecd_digestverify448-
840};-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2