Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/openssl/src/crypto/dh/dh_ameth.c |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /* | - | ||||||||||||||||||
2 | * Copyright 2006-2016 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/asn1.h> | - | ||||||||||||||||||
14 | #include "dh_locl.h" | - | ||||||||||||||||||
15 | #include <openssl/bn.h> | - | ||||||||||||||||||
16 | #include "internal/asn1_int.h" | - | ||||||||||||||||||
17 | #include "internal/evp_int.h" | - | ||||||||||||||||||
18 | #include <openssl/cms.h> | - | ||||||||||||||||||
19 | - | |||||||||||||||||||
20 | /* | - | ||||||||||||||||||
21 | * i2d/d2i like DH parameter functions which use the appropriate routine for | - | ||||||||||||||||||
22 | * PKCS#3 DH or X9.42 DH. | - | ||||||||||||||||||
23 | */ | - | ||||||||||||||||||
24 | - | |||||||||||||||||||
25 | static DH *d2i_dhp(const EVP_PKEY *pkey, const unsigned char **pp, | - | ||||||||||||||||||
26 | long length) | - | ||||||||||||||||||
27 | { | - | ||||||||||||||||||
28 | if (pkey->ameth == &dhx_asn1_meth)
| 28-2183 | ||||||||||||||||||
29 | return d2i_DHxparams(NULL, pp, length); executed 2183 times by 1 test: return d2i_DHxparams( ((void *)0) , pp, length); Executed by:
| 2183 | ||||||||||||||||||
30 | return d2i_DHparams(NULL, pp, length); executed 28 times by 1 test: return d2i_DHparams( ((void *)0) , pp, length); Executed by:
| 28 | ||||||||||||||||||
31 | } | - | ||||||||||||||||||
32 | - | |||||||||||||||||||
33 | static int i2d_dhp(const EVP_PKEY *pkey, const DH *a, unsigned char **pp) | - | ||||||||||||||||||
34 | { | - | ||||||||||||||||||
35 | if (pkey->ameth == &dhx_asn1_meth)
| 0 | ||||||||||||||||||
36 | return i2d_DHxparams(a, pp); never executed: return i2d_DHxparams(a, pp); | 0 | ||||||||||||||||||
37 | return i2d_DHparams(a, pp); never executed: return i2d_DHparams(a, pp); | 0 | ||||||||||||||||||
38 | } | - | ||||||||||||||||||
39 | - | |||||||||||||||||||
40 | static void int_dh_free(EVP_PKEY *pkey) | - | ||||||||||||||||||
41 | { | - | ||||||||||||||||||
42 | DH_free(pkey->pkey.dh); | - | ||||||||||||||||||
43 | } executed 3321 times by 1 test: end of block Executed by:
| 3321 | ||||||||||||||||||
44 | - | |||||||||||||||||||
45 | static int dh_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey) | - | ||||||||||||||||||
46 | { | - | ||||||||||||||||||
47 | const unsigned char *p, *pm; | - | ||||||||||||||||||
48 | int pklen, pmlen; | - | ||||||||||||||||||
49 | int ptype; | - | ||||||||||||||||||
50 | const void *pval; | - | ||||||||||||||||||
51 | const ASN1_STRING *pstr; | - | ||||||||||||||||||
52 | X509_ALGOR *palg; | - | ||||||||||||||||||
53 | ASN1_INTEGER *public_key = NULL; | - | ||||||||||||||||||
54 | - | |||||||||||||||||||
55 | DH *dh = NULL; | - | ||||||||||||||||||
56 | - | |||||||||||||||||||
57 | if (!X509_PUBKEY_get0_param(NULL, &p, &pklen, &palg, pubkey))
| 0-2410 | ||||||||||||||||||
58 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
59 | X509_ALGOR_get0(NULL, &ptype, &pval, palg); | - | ||||||||||||||||||
60 | - | |||||||||||||||||||
61 | if (ptype != V_ASN1_SEQUENCE) {
| 211-2199 | ||||||||||||||||||
62 | DHerr(DH_F_DH_PUB_DECODE, DH_R_PARAMETER_ENCODING_ERROR); | - | ||||||||||||||||||
63 | goto err; executed 211 times by 1 test: goto err; Executed by:
| 211 | ||||||||||||||||||
64 | } | - | ||||||||||||||||||
65 | - | |||||||||||||||||||
66 | pstr = pval; | - | ||||||||||||||||||
67 | pm = pstr->data; | - | ||||||||||||||||||
68 | pmlen = pstr->length; | - | ||||||||||||||||||
69 | - | |||||||||||||||||||
70 | if ((dh = d2i_dhp(pkey, &pm, pmlen)) == NULL) {
| 310-1889 | ||||||||||||||||||
71 | DHerr(DH_F_DH_PUB_DECODE, DH_R_DECODE_ERROR); | - | ||||||||||||||||||
72 | goto err; executed 1889 times by 1 test: goto err; Executed by:
| 1889 | ||||||||||||||||||
73 | } | - | ||||||||||||||||||
74 | - | |||||||||||||||||||
75 | if ((public_key = d2i_ASN1_INTEGER(NULL, &p, pklen)) == NULL) {
| 44-266 | ||||||||||||||||||
76 | DHerr(DH_F_DH_PUB_DECODE, DH_R_DECODE_ERROR); | - | ||||||||||||||||||
77 | goto err; executed 266 times by 1 test: goto err; Executed by:
| 266 | ||||||||||||||||||
78 | } | - | ||||||||||||||||||
79 | - | |||||||||||||||||||
80 | /* We have parameters now set public key */ | - | ||||||||||||||||||
81 | if ((dh->pub_key = ASN1_INTEGER_to_BN(public_key, NULL)) == NULL) {
| 0-44 | ||||||||||||||||||
82 | DHerr(DH_F_DH_PUB_DECODE, DH_R_BN_DECODE_ERROR); | - | ||||||||||||||||||
83 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
84 | } | - | ||||||||||||||||||
85 | - | |||||||||||||||||||
86 | ASN1_INTEGER_free(public_key); | - | ||||||||||||||||||
87 | EVP_PKEY_assign(pkey, pkey->ameth->pkey_id, dh); | - | ||||||||||||||||||
88 | return 1; executed 44 times by 1 test: return 1; Executed by:
| 44 | ||||||||||||||||||
89 | - | |||||||||||||||||||
90 | err: | - | ||||||||||||||||||
91 | ASN1_INTEGER_free(public_key); | - | ||||||||||||||||||
92 | DH_free(dh); | - | ||||||||||||||||||
93 | return 0; executed 2366 times by 1 test: return 0; Executed by:
| 2366 | ||||||||||||||||||
94 | - | |||||||||||||||||||
95 | } | - | ||||||||||||||||||
96 | - | |||||||||||||||||||
97 | static int dh_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey) | - | ||||||||||||||||||
98 | { | - | ||||||||||||||||||
99 | DH *dh; | - | ||||||||||||||||||
100 | int ptype; | - | ||||||||||||||||||
101 | unsigned char *penc = NULL; | - | ||||||||||||||||||
102 | int penclen; | - | ||||||||||||||||||
103 | ASN1_STRING *str; | - | ||||||||||||||||||
104 | ASN1_INTEGER *pub_key = NULL; | - | ||||||||||||||||||
105 | - | |||||||||||||||||||
106 | dh = pkey->pkey.dh; | - | ||||||||||||||||||
107 | - | |||||||||||||||||||
108 | str = ASN1_STRING_new(); | - | ||||||||||||||||||
109 | if (str == NULL) {
| 0 | ||||||||||||||||||
110 | DHerr(DH_F_DH_PUB_ENCODE, ERR_R_MALLOC_FAILURE); | - | ||||||||||||||||||
111 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
112 | } | - | ||||||||||||||||||
113 | str->length = i2d_dhp(pkey, dh, &str->data); | - | ||||||||||||||||||
114 | if (str->length <= 0) {
| 0 | ||||||||||||||||||
115 | DHerr(DH_F_DH_PUB_ENCODE, ERR_R_MALLOC_FAILURE); | - | ||||||||||||||||||
116 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
117 | } | - | ||||||||||||||||||
118 | ptype = V_ASN1_SEQUENCE; | - | ||||||||||||||||||
119 | - | |||||||||||||||||||
120 | pub_key = BN_to_ASN1_INTEGER(dh->pub_key, NULL); | - | ||||||||||||||||||
121 | if (!pub_key)
| 0 | ||||||||||||||||||
122 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
123 | - | |||||||||||||||||||
124 | penclen = i2d_ASN1_INTEGER(pub_key, &penc); | - | ||||||||||||||||||
125 | - | |||||||||||||||||||
126 | ASN1_INTEGER_free(pub_key); | - | ||||||||||||||||||
127 | - | |||||||||||||||||||
128 | if (penclen <= 0) {
| 0 | ||||||||||||||||||
129 | DHerr(DH_F_DH_PUB_ENCODE, ERR_R_MALLOC_FAILURE); | - | ||||||||||||||||||
130 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
131 | } | - | ||||||||||||||||||
132 | - | |||||||||||||||||||
133 | if (X509_PUBKEY_set0_param(pk, OBJ_nid2obj(pkey->ameth->pkey_id),
| 0 | ||||||||||||||||||
134 | ptype, str, penc, penclen))
| 0 | ||||||||||||||||||
135 | return 1; never executed: return 1; | 0 | ||||||||||||||||||
136 | - | |||||||||||||||||||
137 | err: code before this statement never executed: err: | 0 | ||||||||||||||||||
138 | OPENSSL_free(penc); | - | ||||||||||||||||||
139 | ASN1_STRING_free(str); | - | ||||||||||||||||||
140 | - | |||||||||||||||||||
141 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
142 | } | - | ||||||||||||||||||
143 | - | |||||||||||||||||||
144 | /* | - | ||||||||||||||||||
145 | * PKCS#8 DH is defined in PKCS#11 of all places. It is similar to DH in that | - | ||||||||||||||||||
146 | * the AlgorithmIdentifier contains the parameters, the private key is | - | ||||||||||||||||||
147 | * explicitly included and the pubkey must be recalculated. | - | ||||||||||||||||||
148 | */ | - | ||||||||||||||||||
149 | - | |||||||||||||||||||
150 | static int dh_priv_decode(EVP_PKEY *pkey, const PKCS8_PRIV_KEY_INFO *p8) | - | ||||||||||||||||||
151 | { | - | ||||||||||||||||||
152 | const unsigned char *p, *pm; | - | ||||||||||||||||||
153 | int pklen, pmlen; | - | ||||||||||||||||||
154 | int ptype; | - | ||||||||||||||||||
155 | const void *pval; | - | ||||||||||||||||||
156 | const ASN1_STRING *pstr; | - | ||||||||||||||||||
157 | const X509_ALGOR *palg; | - | ||||||||||||||||||
158 | ASN1_INTEGER *privkey = NULL; | - | ||||||||||||||||||
159 | - | |||||||||||||||||||
160 | DH *dh = NULL; | - | ||||||||||||||||||
161 | - | |||||||||||||||||||
162 | if (!PKCS8_pkey_get0(NULL, &p, &pklen, &palg, p8))
| 0-14 | ||||||||||||||||||
163 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
164 | - | |||||||||||||||||||
165 | X509_ALGOR_get0(NULL, &ptype, &pval, palg); | - | ||||||||||||||||||
166 | - | |||||||||||||||||||
167 | if (ptype != V_ASN1_SEQUENCE)
| 1-13 | ||||||||||||||||||
168 | goto decerr; executed 1 time by 1 test: goto decerr; Executed by:
| 1 | ||||||||||||||||||
169 | if ((privkey = d2i_ASN1_INTEGER(NULL, &p, pklen)) == NULL)
| 1-12 | ||||||||||||||||||
170 | goto decerr; executed 1 time by 1 test: goto decerr; Executed by:
| 1 | ||||||||||||||||||
171 | - | |||||||||||||||||||
172 | pstr = pval; | - | ||||||||||||||||||
173 | pm = pstr->data; | - | ||||||||||||||||||
174 | pmlen = pstr->length; | - | ||||||||||||||||||
175 | if ((dh = d2i_dhp(pkey, &pm, pmlen)) == NULL)
| 1-11 | ||||||||||||||||||
176 | goto decerr; executed 1 time by 1 test: goto decerr; Executed by:
| 1 | ||||||||||||||||||
177 | - | |||||||||||||||||||
178 | /* We have parameters now set private key */ | - | ||||||||||||||||||
179 | if ((dh->priv_key = BN_secure_new()) == NULL
| 0-11 | ||||||||||||||||||
180 | || !ASN1_INTEGER_to_BN(privkey, dh->priv_key)) {
| 0-11 | ||||||||||||||||||
181 | DHerr(DH_F_DH_PRIV_DECODE, DH_R_BN_ERROR); | - | ||||||||||||||||||
182 | goto dherr; never executed: goto dherr; | 0 | ||||||||||||||||||
183 | } | - | ||||||||||||||||||
184 | /* Calculate public key */ | - | ||||||||||||||||||
185 | if (!DH_generate_key(dh))
| 0-11 | ||||||||||||||||||
186 | goto dherr; never executed: goto dherr; | 0 | ||||||||||||||||||
187 | - | |||||||||||||||||||
188 | EVP_PKEY_assign(pkey, pkey->ameth->pkey_id, dh); | - | ||||||||||||||||||
189 | - | |||||||||||||||||||
190 | ASN1_STRING_clear_free(privkey); | - | ||||||||||||||||||
191 | - | |||||||||||||||||||
192 | return 1; executed 11 times by 1 test: return 1; Executed by:
| 11 | ||||||||||||||||||
193 | - | |||||||||||||||||||
194 | decerr: | - | ||||||||||||||||||
195 | DHerr(DH_F_DH_PRIV_DECODE, EVP_R_DECODE_ERROR); | - | ||||||||||||||||||
196 | dherr: code before this statement executed 3 times by 1 test: dherr: Executed by:
| 3 | ||||||||||||||||||
197 | DH_free(dh); | - | ||||||||||||||||||
198 | ASN1_STRING_clear_free(privkey); | - | ||||||||||||||||||
199 | return 0; executed 3 times by 1 test: return 0; Executed by:
| 3 | ||||||||||||||||||
200 | } | - | ||||||||||||||||||
201 | - | |||||||||||||||||||
202 | static int dh_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey) | - | ||||||||||||||||||
203 | { | - | ||||||||||||||||||
204 | ASN1_STRING *params = NULL; | - | ||||||||||||||||||
205 | ASN1_INTEGER *prkey = NULL; | - | ||||||||||||||||||
206 | unsigned char *dp = NULL; | - | ||||||||||||||||||
207 | int dplen; | - | ||||||||||||||||||
208 | - | |||||||||||||||||||
209 | params = ASN1_STRING_new(); | - | ||||||||||||||||||
210 | - | |||||||||||||||||||
211 | if (params == NULL) {
| 0 | ||||||||||||||||||
212 | DHerr(DH_F_DH_PRIV_ENCODE, ERR_R_MALLOC_FAILURE); | - | ||||||||||||||||||
213 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
214 | } | - | ||||||||||||||||||
215 | - | |||||||||||||||||||
216 | params->length = i2d_dhp(pkey, pkey->pkey.dh, ¶ms->data); | - | ||||||||||||||||||
217 | if (params->length <= 0) {
| 0 | ||||||||||||||||||
218 | DHerr(DH_F_DH_PRIV_ENCODE, ERR_R_MALLOC_FAILURE); | - | ||||||||||||||||||
219 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
220 | } | - | ||||||||||||||||||
221 | params->type = V_ASN1_SEQUENCE; | - | ||||||||||||||||||
222 | - | |||||||||||||||||||
223 | /* Get private key into integer */ | - | ||||||||||||||||||
224 | prkey = BN_to_ASN1_INTEGER(pkey->pkey.dh->priv_key, NULL); | - | ||||||||||||||||||
225 | - | |||||||||||||||||||
226 | if (!prkey) {
| 0 | ||||||||||||||||||
227 | DHerr(DH_F_DH_PRIV_ENCODE, DH_R_BN_ERROR); | - | ||||||||||||||||||
228 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
229 | } | - | ||||||||||||||||||
230 | - | |||||||||||||||||||
231 | dplen = i2d_ASN1_INTEGER(prkey, &dp); | - | ||||||||||||||||||
232 | - | |||||||||||||||||||
233 | ASN1_STRING_clear_free(prkey); | - | ||||||||||||||||||
234 | prkey = NULL; | - | ||||||||||||||||||
235 | - | |||||||||||||||||||
236 | if (!PKCS8_pkey_set0(p8, OBJ_nid2obj(pkey->ameth->pkey_id), 0,
| 0 | ||||||||||||||||||
237 | V_ASN1_SEQUENCE, params, dp, dplen))
| 0 | ||||||||||||||||||
238 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
239 | - | |||||||||||||||||||
240 | return 1; never executed: return 1; | 0 | ||||||||||||||||||
241 | - | |||||||||||||||||||
242 | err: | - | ||||||||||||||||||
243 | OPENSSL_free(dp); | - | ||||||||||||||||||
244 | ASN1_STRING_free(params); | - | ||||||||||||||||||
245 | ASN1_STRING_clear_free(prkey); | - | ||||||||||||||||||
246 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
247 | } | - | ||||||||||||||||||
248 | - | |||||||||||||||||||
249 | static int dh_param_decode(EVP_PKEY *pkey, | - | ||||||||||||||||||
250 | const unsigned char **pder, int derlen) | - | ||||||||||||||||||
251 | { | - | ||||||||||||||||||
252 | DH *dh; | - | ||||||||||||||||||
253 | - | |||||||||||||||||||
254 | if ((dh = d2i_dhp(pkey, pder, derlen)) == NULL) {
| 0 | ||||||||||||||||||
255 | DHerr(DH_F_DH_PARAM_DECODE, ERR_R_DH_LIB); | - | ||||||||||||||||||
256 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
257 | } | - | ||||||||||||||||||
258 | EVP_PKEY_assign(pkey, pkey->ameth->pkey_id, dh); | - | ||||||||||||||||||
259 | return 1; never executed: return 1; | 0 | ||||||||||||||||||
260 | } | - | ||||||||||||||||||
261 | - | |||||||||||||||||||
262 | static int dh_param_encode(const EVP_PKEY *pkey, unsigned char **pder) | - | ||||||||||||||||||
263 | { | - | ||||||||||||||||||
264 | return i2d_dhp(pkey, pkey->pkey.dh, pder); never executed: return i2d_dhp(pkey, pkey->pkey.dh, pder); | 0 | ||||||||||||||||||
265 | } | - | ||||||||||||||||||
266 | - | |||||||||||||||||||
267 | static int do_dh_print(BIO *bp, const DH *x, int indent, int ptype) | - | ||||||||||||||||||
268 | { | - | ||||||||||||||||||
269 | int reason = ERR_R_BUF_LIB; | - | ||||||||||||||||||
270 | const char *ktype = NULL; | - | ||||||||||||||||||
271 | BIGNUM *priv_key, *pub_key; | - | ||||||||||||||||||
272 | - | |||||||||||||||||||
273 | if (ptype == 2)
| 0-63 | ||||||||||||||||||
274 | priv_key = x->priv_key; never executed: priv_key = x->priv_key; | 0 | ||||||||||||||||||
275 | else | - | ||||||||||||||||||
276 | priv_key = NULL; executed 63 times by 1 test: priv_key = ((void *)0) ; Executed by:
| 63 | ||||||||||||||||||
277 | - | |||||||||||||||||||
278 | if (ptype > 0)
| 10-53 | ||||||||||||||||||
279 | pub_key = x->pub_key; executed 10 times by 1 test: pub_key = x->pub_key; Executed by:
| 10 | ||||||||||||||||||
280 | else | - | ||||||||||||||||||
281 | pub_key = NULL; executed 53 times by 1 test: pub_key = ((void *)0) ; Executed by:
| 53 | ||||||||||||||||||
282 | - | |||||||||||||||||||
283 | if (x->p == NULL || (ptype == 2 && priv_key == NULL)
| 0-63 | ||||||||||||||||||
284 | || (ptype > 0 && pub_key == NULL)) {
| 0-53 | ||||||||||||||||||
285 | reason = ERR_R_PASSED_NULL_PARAMETER; | - | ||||||||||||||||||
286 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
287 | } | - | ||||||||||||||||||
288 | - | |||||||||||||||||||
289 | if (ptype == 2)
| 0-63 | ||||||||||||||||||
290 | ktype = "DH Private-Key"; never executed: ktype = "DH Private-Key"; | 0 | ||||||||||||||||||
291 | else if (ptype == 1)
| 10-53 | ||||||||||||||||||
292 | ktype = "DH Public-Key"; executed 10 times by 1 test: ktype = "DH Public-Key"; Executed by:
| 10 | ||||||||||||||||||
293 | else | - | ||||||||||||||||||
294 | ktype = "DH Parameters"; executed 53 times by 1 test: ktype = "DH Parameters"; Executed by:
| 53 | ||||||||||||||||||
295 | - | |||||||||||||||||||
296 | BIO_indent(bp, indent, 128); | - | ||||||||||||||||||
297 | if (BIO_printf(bp, "%s: (%d bit)\n", ktype, BN_num_bits(x->p)) <= 0)
| 0-63 | ||||||||||||||||||
298 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
299 | indent += 4; | - | ||||||||||||||||||
300 | - | |||||||||||||||||||
301 | if (!ASN1_bn_print(bp, "private-key:", priv_key, NULL, indent))
| 0-63 | ||||||||||||||||||
302 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
303 | if (!ASN1_bn_print(bp, "public-key:", pub_key, NULL, indent))
| 0-63 | ||||||||||||||||||
304 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
305 | - | |||||||||||||||||||
306 | if (!ASN1_bn_print(bp, "prime:", x->p, NULL, indent))
| 0-63 | ||||||||||||||||||
307 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
308 | if (!ASN1_bn_print(bp, "generator:", x->g, NULL, indent))
| 0-63 | ||||||||||||||||||
309 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
310 | if (x->q && !ASN1_bn_print(bp, "subgroup order:", x->q, NULL, indent))
| 0-41 | ||||||||||||||||||
311 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
312 | if (x->j && !ASN1_bn_print(bp, "subgroup factor:", x->j, NULL, indent))
| 0-56 | ||||||||||||||||||
313 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
314 | if (x->seed) {
| 13-50 | ||||||||||||||||||
315 | int i; | - | ||||||||||||||||||
316 | BIO_indent(bp, indent, 128); | - | ||||||||||||||||||
317 | BIO_puts(bp, "seed:"); | - | ||||||||||||||||||
318 | for (i = 0; i < x->seedlen; i++) {
| 13-3571 | ||||||||||||||||||
319 | if ((i % 15) == 0) {
| 246-3325 | ||||||||||||||||||
320 | if (BIO_puts(bp, "\n") <= 0
| 0-246 | ||||||||||||||||||
321 | || !BIO_indent(bp, indent + 4, 128))
| 0-246 | ||||||||||||||||||
322 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
323 | } executed 246 times by 1 test: end of block Executed by:
| 246 | ||||||||||||||||||
324 | if (BIO_printf(bp, "%02x%s", x->seed[i],
| 0-3571 | ||||||||||||||||||
325 | ((i + 1) == x->seedlen) ? "" : ":") <= 0)
| 0-3571 | ||||||||||||||||||
326 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
327 | } executed 3571 times by 1 test: end of block Executed by:
| 3571 | ||||||||||||||||||
328 | if (BIO_write(bp, "\n", 1) <= 0)
| 0-13 | ||||||||||||||||||
329 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
330 | } executed 13 times by 1 test: end of block Executed by:
| 13 | ||||||||||||||||||
331 | if (x->counter && !ASN1_bn_print(bp, "counter:", x->counter, NULL, indent))
| 0-48 | ||||||||||||||||||
332 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
333 | if (x->length != 0) {
| 10-53 | ||||||||||||||||||
334 | BIO_indent(bp, indent, 128); | - | ||||||||||||||||||
335 | if (BIO_printf(bp, "recommended-private-length: %d bits\n",
| 0-10 | ||||||||||||||||||
336 | (int)x->length) <= 0)
| 0-10 | ||||||||||||||||||
337 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
338 | } executed 10 times by 1 test: end of block Executed by:
| 10 | ||||||||||||||||||
339 | - | |||||||||||||||||||
340 | return 1; executed 63 times by 1 test: return 1; Executed by:
| 63 | ||||||||||||||||||
341 | - | |||||||||||||||||||
342 | err: | - | ||||||||||||||||||
343 | DHerr(DH_F_DO_DH_PRINT, reason); | - | ||||||||||||||||||
344 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
345 | } | - | ||||||||||||||||||
346 | - | |||||||||||||||||||
347 | static int int_dh_size(const EVP_PKEY *pkey) | - | ||||||||||||||||||
348 | { | - | ||||||||||||||||||
349 | return DH_size(pkey->pkey.dh); never executed: return DH_size(pkey->pkey.dh); | 0 | ||||||||||||||||||
350 | } | - | ||||||||||||||||||
351 | - | |||||||||||||||||||
352 | static int dh_bits(const EVP_PKEY *pkey) | - | ||||||||||||||||||
353 | { | - | ||||||||||||||||||
354 | return BN_num_bits(pkey->pkey.dh->p); executed 52 times by 1 test: return BN_num_bits(pkey->pkey.dh->p); Executed by:
| 52 | ||||||||||||||||||
355 | } | - | ||||||||||||||||||
356 | - | |||||||||||||||||||
357 | static int dh_security_bits(const EVP_PKEY *pkey) | - | ||||||||||||||||||
358 | { | - | ||||||||||||||||||
359 | return DH_security_bits(pkey->pkey.dh); executed 296 times by 1 test: return DH_security_bits(pkey->pkey.dh); Executed by:
| 296 | ||||||||||||||||||
360 | } | - | ||||||||||||||||||
361 | - | |||||||||||||||||||
362 | static int dh_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b) | - | ||||||||||||||||||
363 | { | - | ||||||||||||||||||
364 | if (BN_cmp(a->pkey.dh->p, b->pkey.dh->p) ||
| 0-246 | ||||||||||||||||||
365 | BN_cmp(a->pkey.dh->g, b->pkey.dh->g))
| 0-246 | ||||||||||||||||||
366 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
367 | else if (a->ameth == &dhx_asn1_meth) {
| 2-244 | ||||||||||||||||||
368 | if (BN_cmp(a->pkey.dh->q, b->pkey.dh->q))
| 0-2 | ||||||||||||||||||
369 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
370 | } executed 2 times by 1 test: end of block Executed by:
| 2 | ||||||||||||||||||
371 | return 1; executed 246 times by 1 test: return 1; Executed by:
| 246 | ||||||||||||||||||
372 | } | - | ||||||||||||||||||
373 | - | |||||||||||||||||||
374 | static int int_dh_bn_cpy(BIGNUM **dst, const BIGNUM *src) | - | ||||||||||||||||||
375 | { | - | ||||||||||||||||||
376 | BIGNUM *a; | - | ||||||||||||||||||
377 | - | |||||||||||||||||||
378 | /* | - | ||||||||||||||||||
379 | * If source is read only just copy the pointer, so | - | ||||||||||||||||||
380 | * we don't have to reallocate it. | - | ||||||||||||||||||
381 | */ | - | ||||||||||||||||||
382 | if (src == NULL)
| 2-556 | ||||||||||||||||||
383 | a = NULL; executed 2 times by 1 test: a = ((void *)0) ; Executed by:
| 2 | ||||||||||||||||||
384 | else if (BN_get_flags(src, BN_FLG_STATIC_DATA)
| 0-556 | ||||||||||||||||||
385 | && !BN_get_flags(src, BN_FLG_MALLOCED))
| 0 | ||||||||||||||||||
386 | a = (BIGNUM *)src; never executed: a = (BIGNUM *)src; | 0 | ||||||||||||||||||
387 | else if ((a = BN_dup(src)) == NULL)
| 0-556 | ||||||||||||||||||
388 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
389 | BN_clear_free(*dst); | - | ||||||||||||||||||
390 | *dst = a; | - | ||||||||||||||||||
391 | return 1; executed 558 times by 1 test: return 1; Executed by:
| 558 | ||||||||||||||||||
392 | } | - | ||||||||||||||||||
393 | - | |||||||||||||||||||
394 | static int int_dh_param_copy(DH *to, const DH *from, int is_x942) | - | ||||||||||||||||||
395 | { | - | ||||||||||||||||||
396 | if (is_x942 == -1)
| 2-275 | ||||||||||||||||||
397 | is_x942 = ! !from->q; executed 2 times by 1 test: is_x942 = ! !from->q; Executed by:
| 2 | ||||||||||||||||||
398 | if (!int_dh_bn_cpy(&to->p, from->p))
| 0-277 | ||||||||||||||||||
399 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
400 | if (!int_dh_bn_cpy(&to->g, from->g))
| 0-277 | ||||||||||||||||||
401 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
402 | if (is_x942) {
| 2-275 | ||||||||||||||||||
403 | if (!int_dh_bn_cpy(&to->q, from->q))
| 0-2 | ||||||||||||||||||
404 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
405 | if (!int_dh_bn_cpy(&to->j, from->j))
| 0-2 | ||||||||||||||||||
406 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
407 | OPENSSL_free(to->seed); | - | ||||||||||||||||||
408 | to->seed = NULL; | - | ||||||||||||||||||
409 | to->seedlen = 0; | - | ||||||||||||||||||
410 | if (from->seed) {
| 0-2 | ||||||||||||||||||
411 | to->seed = OPENSSL_memdup(from->seed, from->seedlen); | - | ||||||||||||||||||
412 | if (!to->seed)
| 0 | ||||||||||||||||||
413 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
414 | to->seedlen = from->seedlen; | - | ||||||||||||||||||
415 | } never executed: end of block | 0 | ||||||||||||||||||
416 | } else executed 2 times by 1 test: end of block Executed by:
| 2 | ||||||||||||||||||
417 | to->length = from->length; executed 275 times by 1 test: to->length = from->length; Executed by:
| 275 | ||||||||||||||||||
418 | return 1; executed 277 times by 1 test: return 1; Executed by:
| 277 | ||||||||||||||||||
419 | } | - | ||||||||||||||||||
420 | - | |||||||||||||||||||
421 | DH *DHparams_dup(DH *dh) | - | ||||||||||||||||||
422 | { | - | ||||||||||||||||||
423 | DH *ret; | - | ||||||||||||||||||
424 | ret = DH_new(); | - | ||||||||||||||||||
425 | if (ret == NULL)
| 0-2 | ||||||||||||||||||
426 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||
427 | if (!int_dh_param_copy(ret, dh, -1)) {
| 0-2 | ||||||||||||||||||
428 | DH_free(ret); | - | ||||||||||||||||||
429 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||
430 | } | - | ||||||||||||||||||
431 | return ret; executed 2 times by 1 test: return ret; Executed by:
| 2 | ||||||||||||||||||
432 | } | - | ||||||||||||||||||
433 | - | |||||||||||||||||||
434 | static int dh_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from) | - | ||||||||||||||||||
435 | { | - | ||||||||||||||||||
436 | if (to->pkey.dh == NULL) {
| 59-216 | ||||||||||||||||||
437 | to->pkey.dh = DH_new(); | - | ||||||||||||||||||
438 | if (to->pkey.dh == NULL)
| 0-59 | ||||||||||||||||||
439 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
440 | } executed 59 times by 1 test: end of block Executed by:
| 59 | ||||||||||||||||||
441 | return int_dh_param_copy(to->pkey.dh, from->pkey.dh, executed 275 times by 1 test: return int_dh_param_copy(to->pkey.dh, from->pkey.dh, from->ameth == &dhx_asn1_meth); Executed by:
| 275 | ||||||||||||||||||
442 | from->ameth == &dhx_asn1_meth); executed 275 times by 1 test: return int_dh_param_copy(to->pkey.dh, from->pkey.dh, from->ameth == &dhx_asn1_meth); Executed by:
| 275 | ||||||||||||||||||
443 | } | - | ||||||||||||||||||
444 | - | |||||||||||||||||||
445 | static int dh_missing_parameters(const EVP_PKEY *a) | - | ||||||||||||||||||
446 | { | - | ||||||||||||||||||
447 | if (a->pkey.dh == NULL || a->pkey.dh->p == NULL || a->pkey.dh->g == NULL)
| 0-721 | ||||||||||||||||||
448 | return 1; executed 275 times by 1 test: return 1; Executed by:
| 275 | ||||||||||||||||||
449 | return 0; executed 505 times by 1 test: return 0; Executed by:
| 505 | ||||||||||||||||||
450 | } | - | ||||||||||||||||||
451 | - | |||||||||||||||||||
452 | static int dh_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) | - | ||||||||||||||||||
453 | { | - | ||||||||||||||||||
454 | if (dh_cmp_parameters(a, b) == 0)
| 0-10 | ||||||||||||||||||
455 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
456 | if (BN_cmp(b->pkey.dh->pub_key, a->pkey.dh->pub_key) != 0)
| 0-10 | ||||||||||||||||||
457 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
458 | else | - | ||||||||||||||||||
459 | return 1; executed 10 times by 1 test: return 1; Executed by:
| 10 | ||||||||||||||||||
460 | } | - | ||||||||||||||||||
461 | - | |||||||||||||||||||
462 | static int dh_param_print(BIO *bp, const EVP_PKEY *pkey, int indent, | - | ||||||||||||||||||
463 | ASN1_PCTX *ctx) | - | ||||||||||||||||||
464 | { | - | ||||||||||||||||||
465 | return do_dh_print(bp, pkey->pkey.dh, indent, 0); never executed: return do_dh_print(bp, pkey->pkey.dh, indent, 0); | 0 | ||||||||||||||||||
466 | } | - | ||||||||||||||||||
467 | - | |||||||||||||||||||
468 | static int dh_public_print(BIO *bp, const EVP_PKEY *pkey, int indent, | - | ||||||||||||||||||
469 | ASN1_PCTX *ctx) | - | ||||||||||||||||||
470 | { | - | ||||||||||||||||||
471 | return do_dh_print(bp, pkey->pkey.dh, indent, 1); executed 10 times by 1 test: return do_dh_print(bp, pkey->pkey.dh, indent, 1); Executed by:
| 10 | ||||||||||||||||||
472 | } | - | ||||||||||||||||||
473 | - | |||||||||||||||||||
474 | static int dh_private_print(BIO *bp, const EVP_PKEY *pkey, int indent, | - | ||||||||||||||||||
475 | ASN1_PCTX *ctx) | - | ||||||||||||||||||
476 | { | - | ||||||||||||||||||
477 | return do_dh_print(bp, pkey->pkey.dh, indent, 2); never executed: return do_dh_print(bp, pkey->pkey.dh, indent, 2); | 0 | ||||||||||||||||||
478 | } | - | ||||||||||||||||||
479 | - | |||||||||||||||||||
480 | int DHparams_print(BIO *bp, const DH *x) | - | ||||||||||||||||||
481 | { | - | ||||||||||||||||||
482 | return do_dh_print(bp, x, 4, 0); executed 53 times by 1 test: return do_dh_print(bp, x, 4, 0); Executed by:
| 53 | ||||||||||||||||||
483 | } | - | ||||||||||||||||||
484 | - | |||||||||||||||||||
485 | #ifndef OPENSSL_NO_CMS | - | ||||||||||||||||||
486 | static int dh_cms_decrypt(CMS_RecipientInfo *ri); | - | ||||||||||||||||||
487 | static int dh_cms_encrypt(CMS_RecipientInfo *ri); | - | ||||||||||||||||||
488 | #endif | - | ||||||||||||||||||
489 | - | |||||||||||||||||||
490 | static int dh_pkey_ctrl(EVP_PKEY *pkey, int op, long arg1, void *arg2) | - | ||||||||||||||||||
491 | { | - | ||||||||||||||||||
492 | switch (op) { | - | ||||||||||||||||||
493 | #ifndef OPENSSL_NO_CMS | - | ||||||||||||||||||
494 | - | |||||||||||||||||||
495 | case ASN1_PKEY_CTRL_CMS_ENVELOPE: executed 2 times by 1 test: case 0x7: Executed by:
| 2 | ||||||||||||||||||
496 | if (arg1 == 1)
| 1 | ||||||||||||||||||
497 | return dh_cms_decrypt(arg2); executed 1 time by 1 test: return dh_cms_decrypt(arg2); Executed by:
| 1 | ||||||||||||||||||
498 | else if (arg1 == 0)
| 0-1 | ||||||||||||||||||
499 | return dh_cms_encrypt(arg2); executed 1 time by 1 test: return dh_cms_encrypt(arg2); Executed by:
| 1 | ||||||||||||||||||
500 | return -2; never executed: return -2; | 0 | ||||||||||||||||||
501 | - | |||||||||||||||||||
502 | case ASN1_PKEY_CTRL_CMS_RI_TYPE: executed 2 times by 1 test: case 0x8: Executed by:
| 2 | ||||||||||||||||||
503 | *(int *)arg2 = CMS_RECIPINFO_AGREE; | - | ||||||||||||||||||
504 | return 1; executed 2 times by 1 test: return 1; Executed by:
| 2 | ||||||||||||||||||
505 | #endif | - | ||||||||||||||||||
506 | default: never executed: default: | 0 | ||||||||||||||||||
507 | return -2; never executed: return -2; | 0 | ||||||||||||||||||
508 | } | - | ||||||||||||||||||
509 | - | |||||||||||||||||||
510 | } | - | ||||||||||||||||||
511 | - | |||||||||||||||||||
512 | static int dh_pkey_public_check(const EVP_PKEY *pkey) | - | ||||||||||||||||||
513 | { | - | ||||||||||||||||||
514 | DH *dh = pkey->pkey.dh; | - | ||||||||||||||||||
515 | - | |||||||||||||||||||
516 | if (dh->pub_key == NULL) {
| 0 | ||||||||||||||||||
517 | DHerr(DH_F_DH_PKEY_PUBLIC_CHECK, DH_R_MISSING_PUBKEY); | - | ||||||||||||||||||
518 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
519 | } | - | ||||||||||||||||||
520 | - | |||||||||||||||||||
521 | return DH_check_pub_key_ex(dh, dh->pub_key); never executed: return DH_check_pub_key_ex(dh, dh->pub_key); | 0 | ||||||||||||||||||
522 | } | - | ||||||||||||||||||
523 | - | |||||||||||||||||||
524 | static int dh_pkey_param_check(const EVP_PKEY *pkey) | - | ||||||||||||||||||
525 | { | - | ||||||||||||||||||
526 | DH *dh = pkey->pkey.dh; | - | ||||||||||||||||||
527 | - | |||||||||||||||||||
528 | return DH_check_ex(dh); never executed: return DH_check_ex(dh); | 0 | ||||||||||||||||||
529 | } | - | ||||||||||||||||||
530 | - | |||||||||||||||||||
531 | const EVP_PKEY_ASN1_METHOD dh_asn1_meth = { | - | ||||||||||||||||||
532 | EVP_PKEY_DH, | - | ||||||||||||||||||
533 | EVP_PKEY_DH, | - | ||||||||||||||||||
534 | 0, | - | ||||||||||||||||||
535 | - | |||||||||||||||||||
536 | "DH", | - | ||||||||||||||||||
537 | "OpenSSL PKCS#3 DH method", | - | ||||||||||||||||||
538 | - | |||||||||||||||||||
539 | dh_pub_decode, | - | ||||||||||||||||||
540 | dh_pub_encode, | - | ||||||||||||||||||
541 | dh_pub_cmp, | - | ||||||||||||||||||
542 | dh_public_print, | - | ||||||||||||||||||
543 | - | |||||||||||||||||||
544 | dh_priv_decode, | - | ||||||||||||||||||
545 | dh_priv_encode, | - | ||||||||||||||||||
546 | dh_private_print, | - | ||||||||||||||||||
547 | - | |||||||||||||||||||
548 | int_dh_size, | - | ||||||||||||||||||
549 | dh_bits, | - | ||||||||||||||||||
550 | dh_security_bits, | - | ||||||||||||||||||
551 | - | |||||||||||||||||||
552 | dh_param_decode, | - | ||||||||||||||||||
553 | dh_param_encode, | - | ||||||||||||||||||
554 | dh_missing_parameters, | - | ||||||||||||||||||
555 | dh_copy_parameters, | - | ||||||||||||||||||
556 | dh_cmp_parameters, | - | ||||||||||||||||||
557 | dh_param_print, | - | ||||||||||||||||||
558 | 0, | - | ||||||||||||||||||
559 | - | |||||||||||||||||||
560 | int_dh_free, | - | ||||||||||||||||||
561 | 0, | - | ||||||||||||||||||
562 | - | |||||||||||||||||||
563 | 0, 0, 0, 0, 0, | - | ||||||||||||||||||
564 | - | |||||||||||||||||||
565 | 0, | - | ||||||||||||||||||
566 | dh_pkey_public_check, | - | ||||||||||||||||||
567 | dh_pkey_param_check | - | ||||||||||||||||||
568 | }; | - | ||||||||||||||||||
569 | - | |||||||||||||||||||
570 | const EVP_PKEY_ASN1_METHOD dhx_asn1_meth = { | - | ||||||||||||||||||
571 | EVP_PKEY_DHX, | - | ||||||||||||||||||
572 | EVP_PKEY_DHX, | - | ||||||||||||||||||
573 | 0, | - | ||||||||||||||||||
574 | - | |||||||||||||||||||
575 | "X9.42 DH", | - | ||||||||||||||||||
576 | "OpenSSL X9.42 DH method", | - | ||||||||||||||||||
577 | - | |||||||||||||||||||
578 | dh_pub_decode, | - | ||||||||||||||||||
579 | dh_pub_encode, | - | ||||||||||||||||||
580 | dh_pub_cmp, | - | ||||||||||||||||||
581 | dh_public_print, | - | ||||||||||||||||||
582 | - | |||||||||||||||||||
583 | dh_priv_decode, | - | ||||||||||||||||||
584 | dh_priv_encode, | - | ||||||||||||||||||
585 | dh_private_print, | - | ||||||||||||||||||
586 | - | |||||||||||||||||||
587 | int_dh_size, | - | ||||||||||||||||||
588 | dh_bits, | - | ||||||||||||||||||
589 | dh_security_bits, | - | ||||||||||||||||||
590 | - | |||||||||||||||||||
591 | dh_param_decode, | - | ||||||||||||||||||
592 | dh_param_encode, | - | ||||||||||||||||||
593 | dh_missing_parameters, | - | ||||||||||||||||||
594 | dh_copy_parameters, | - | ||||||||||||||||||
595 | dh_cmp_parameters, | - | ||||||||||||||||||
596 | dh_param_print, | - | ||||||||||||||||||
597 | 0, | - | ||||||||||||||||||
598 | - | |||||||||||||||||||
599 | int_dh_free, | - | ||||||||||||||||||
600 | dh_pkey_ctrl, | - | ||||||||||||||||||
601 | - | |||||||||||||||||||
602 | 0, 0, 0, 0, 0, | - | ||||||||||||||||||
603 | - | |||||||||||||||||||
604 | 0, | - | ||||||||||||||||||
605 | dh_pkey_public_check, | - | ||||||||||||||||||
606 | dh_pkey_param_check | - | ||||||||||||||||||
607 | }; | - | ||||||||||||||||||
608 | - | |||||||||||||||||||
609 | #ifndef OPENSSL_NO_CMS | - | ||||||||||||||||||
610 | - | |||||||||||||||||||
611 | static int dh_cms_set_peerkey(EVP_PKEY_CTX *pctx, | - | ||||||||||||||||||
612 | X509_ALGOR *alg, ASN1_BIT_STRING *pubkey) | - | ||||||||||||||||||
613 | { | - | ||||||||||||||||||
614 | const ASN1_OBJECT *aoid; | - | ||||||||||||||||||
615 | int atype; | - | ||||||||||||||||||
616 | const void *aval; | - | ||||||||||||||||||
617 | ASN1_INTEGER *public_key = NULL; | - | ||||||||||||||||||
618 | int rv = 0; | - | ||||||||||||||||||
619 | EVP_PKEY *pkpeer = NULL, *pk = NULL; | - | ||||||||||||||||||
620 | DH *dhpeer = NULL; | - | ||||||||||||||||||
621 | const unsigned char *p; | - | ||||||||||||||||||
622 | int plen; | - | ||||||||||||||||||
623 | - | |||||||||||||||||||
624 | X509_ALGOR_get0(&aoid, &atype, &aval, alg); | - | ||||||||||||||||||
625 | if (OBJ_obj2nid(aoid) != NID_dhpublicnumber)
| 0-1 | ||||||||||||||||||
626 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
627 | /* Only absent parameters allowed in RFC XXXX */ | - | ||||||||||||||||||
628 | if (atype != V_ASN1_UNDEF && atype == V_ASN1_NULL)
| 0-1 | ||||||||||||||||||
629 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
630 | - | |||||||||||||||||||
631 | pk = EVP_PKEY_CTX_get0_pkey(pctx); | - | ||||||||||||||||||
632 | if (!pk)
| 0-1 | ||||||||||||||||||
633 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
634 | if (pk->type != EVP_PKEY_DHX)
| 0-1 | ||||||||||||||||||
635 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
636 | /* Get parameters from parent key */ | - | ||||||||||||||||||
637 | dhpeer = DHparams_dup(pk->pkey.dh); | - | ||||||||||||||||||
638 | /* We have parameters now set public key */ | - | ||||||||||||||||||
639 | plen = ASN1_STRING_length(pubkey); | - | ||||||||||||||||||
640 | p = ASN1_STRING_get0_data(pubkey); | - | ||||||||||||||||||
641 | if (!p || !plen)
| 0-1 | ||||||||||||||||||
642 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
643 | - | |||||||||||||||||||
644 | if ((public_key = d2i_ASN1_INTEGER(NULL, &p, plen)) == NULL) {
| 0-1 | ||||||||||||||||||
645 | DHerr(DH_F_DH_CMS_SET_PEERKEY, DH_R_DECODE_ERROR); | - | ||||||||||||||||||
646 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
647 | } | - | ||||||||||||||||||
648 | - | |||||||||||||||||||
649 | /* We have parameters now set public key */ | - | ||||||||||||||||||
650 | if ((dhpeer->pub_key = ASN1_INTEGER_to_BN(public_key, NULL)) == NULL) {
| 0-1 | ||||||||||||||||||
651 | DHerr(DH_F_DH_CMS_SET_PEERKEY, DH_R_BN_DECODE_ERROR); | - | ||||||||||||||||||
652 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
653 | } | - | ||||||||||||||||||
654 | - | |||||||||||||||||||
655 | pkpeer = EVP_PKEY_new(); | - | ||||||||||||||||||
656 | if (pkpeer == NULL)
| 0-1 | ||||||||||||||||||
657 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
658 | EVP_PKEY_assign(pkpeer, pk->ameth->pkey_id, dhpeer); | - | ||||||||||||||||||
659 | dhpeer = NULL; | - | ||||||||||||||||||
660 | if (EVP_PKEY_derive_set_peer(pctx, pkpeer) > 0)
| 0-1 | ||||||||||||||||||
661 | rv = 1; executed 1 time by 1 test: rv = 1; Executed by:
| 1 | ||||||||||||||||||
662 | err: code before this statement executed 1 time by 1 test: err: Executed by:
| 1 | ||||||||||||||||||
663 | ASN1_INTEGER_free(public_key); | - | ||||||||||||||||||
664 | EVP_PKEY_free(pkpeer); | - | ||||||||||||||||||
665 | DH_free(dhpeer); | - | ||||||||||||||||||
666 | return rv; executed 1 time by 1 test: return rv; Executed by:
| 1 | ||||||||||||||||||
667 | } | - | ||||||||||||||||||
668 | - | |||||||||||||||||||
669 | static int dh_cms_set_shared_info(EVP_PKEY_CTX *pctx, CMS_RecipientInfo *ri) | - | ||||||||||||||||||
670 | { | - | ||||||||||||||||||
671 | int rv = 0; | - | ||||||||||||||||||
672 | - | |||||||||||||||||||
673 | X509_ALGOR *alg, *kekalg = NULL; | - | ||||||||||||||||||
674 | ASN1_OCTET_STRING *ukm; | - | ||||||||||||||||||
675 | const unsigned char *p; | - | ||||||||||||||||||
676 | unsigned char *dukm = NULL; | - | ||||||||||||||||||
677 | size_t dukmlen = 0; | - | ||||||||||||||||||
678 | int keylen, plen; | - | ||||||||||||||||||
679 | const EVP_CIPHER *kekcipher; | - | ||||||||||||||||||
680 | EVP_CIPHER_CTX *kekctx; | - | ||||||||||||||||||
681 | - | |||||||||||||||||||
682 | if (!CMS_RecipientInfo_kari_get0_alg(ri, &alg, &ukm))
| 0-1 | ||||||||||||||||||
683 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
684 | - | |||||||||||||||||||
685 | /* | - | ||||||||||||||||||
686 | * For DH we only have one OID permissible. If ever any more get defined | - | ||||||||||||||||||
687 | * we will need something cleverer. | - | ||||||||||||||||||
688 | */ | - | ||||||||||||||||||
689 | if (OBJ_obj2nid(alg->algorithm) != NID_id_smime_alg_ESDH) {
| 0-1 | ||||||||||||||||||
690 | DHerr(DH_F_DH_CMS_SET_SHARED_INFO, DH_R_KDF_PARAMETER_ERROR); | - | ||||||||||||||||||
691 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
692 | } | - | ||||||||||||||||||
693 | - | |||||||||||||||||||
694 | if (EVP_PKEY_CTX_set_dh_kdf_type(pctx, EVP_PKEY_DH_KDF_X9_42) <= 0)
| 0-1 | ||||||||||||||||||
695 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
696 | - | |||||||||||||||||||
697 | if (EVP_PKEY_CTX_set_dh_kdf_md(pctx, EVP_sha1()) <= 0)
| 0-1 | ||||||||||||||||||
698 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
699 | - | |||||||||||||||||||
700 | if (alg->parameter->type != V_ASN1_SEQUENCE)
| 0-1 | ||||||||||||||||||
701 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
702 | - | |||||||||||||||||||
703 | p = alg->parameter->value.sequence->data; | - | ||||||||||||||||||
704 | plen = alg->parameter->value.sequence->length; | - | ||||||||||||||||||
705 | kekalg = d2i_X509_ALGOR(NULL, &p, plen); | - | ||||||||||||||||||
706 | if (!kekalg)
| 0-1 | ||||||||||||||||||
707 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
708 | kekctx = CMS_RecipientInfo_kari_get0_ctx(ri); | - | ||||||||||||||||||
709 | if (!kekctx)
| 0-1 | ||||||||||||||||||
710 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
711 | kekcipher = EVP_get_cipherbyobj(kekalg->algorithm); | - | ||||||||||||||||||
712 | if (!kekcipher || EVP_CIPHER_mode(kekcipher) != EVP_CIPH_WRAP_MODE)
| 0-1 | ||||||||||||||||||
713 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
714 | if (!EVP_EncryptInit_ex(kekctx, kekcipher, NULL, NULL, NULL))
| 0-1 | ||||||||||||||||||
715 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
716 | if (EVP_CIPHER_asn1_to_param(kekctx, kekalg->parameter) <= 0)
| 0-1 | ||||||||||||||||||
717 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
718 | - | |||||||||||||||||||
719 | keylen = EVP_CIPHER_CTX_key_length(kekctx); | - | ||||||||||||||||||
720 | if (EVP_PKEY_CTX_set_dh_kdf_outlen(pctx, keylen) <= 0)
| 0-1 | ||||||||||||||||||
721 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
722 | /* Use OBJ_nid2obj to ensure we use built in OID that isn't freed */ | - | ||||||||||||||||||
723 | if (EVP_PKEY_CTX_set0_dh_kdf_oid(pctx,
| 0-1 | ||||||||||||||||||
724 | OBJ_nid2obj(EVP_CIPHER_type(kekcipher)))
| 0-1 | ||||||||||||||||||
725 | <= 0)
| 0-1 | ||||||||||||||||||
726 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
727 | - | |||||||||||||||||||
728 | if (ukm) {
| 0-1 | ||||||||||||||||||
729 | dukmlen = ASN1_STRING_length(ukm); | - | ||||||||||||||||||
730 | dukm = OPENSSL_memdup(ASN1_STRING_get0_data(ukm), dukmlen); | - | ||||||||||||||||||
731 | if (!dukm)
| 0 | ||||||||||||||||||
732 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
733 | } never executed: end of block | 0 | ||||||||||||||||||
734 | - | |||||||||||||||||||
735 | if (EVP_PKEY_CTX_set0_dh_kdf_ukm(pctx, dukm, dukmlen) <= 0)
| 0-1 | ||||||||||||||||||
736 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
737 | dukm = NULL; | - | ||||||||||||||||||
738 | - | |||||||||||||||||||
739 | rv = 1; | - | ||||||||||||||||||
740 | err: code before this statement executed 1 time by 1 test: err: Executed by:
| 1 | ||||||||||||||||||
741 | X509_ALGOR_free(kekalg); | - | ||||||||||||||||||
742 | OPENSSL_free(dukm); | - | ||||||||||||||||||
743 | return rv; executed 1 time by 1 test: return rv; Executed by:
| 1 | ||||||||||||||||||
744 | } | - | ||||||||||||||||||
745 | - | |||||||||||||||||||
746 | static int dh_cms_decrypt(CMS_RecipientInfo *ri) | - | ||||||||||||||||||
747 | { | - | ||||||||||||||||||
748 | EVP_PKEY_CTX *pctx; | - | ||||||||||||||||||
749 | pctx = CMS_RecipientInfo_get0_pkey_ctx(ri); | - | ||||||||||||||||||
750 | if (!pctx)
| 0-1 | ||||||||||||||||||
751 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
752 | /* See if we need to set peer key */ | - | ||||||||||||||||||
753 | if (!EVP_PKEY_CTX_get0_peerkey(pctx)) {
| 0-1 | ||||||||||||||||||
754 | X509_ALGOR *alg; | - | ||||||||||||||||||
755 | ASN1_BIT_STRING *pubkey; | - | ||||||||||||||||||
756 | if (!CMS_RecipientInfo_kari_get0_orig_id(ri, &alg, &pubkey,
| 0-1 | ||||||||||||||||||
757 | NULL, NULL, NULL))
| 0-1 | ||||||||||||||||||
758 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
759 | if (!alg || !pubkey)
| 0-1 | ||||||||||||||||||
760 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
761 | if (!dh_cms_set_peerkey(pctx, alg, pubkey)) {
| 0-1 | ||||||||||||||||||
762 | DHerr(DH_F_DH_CMS_DECRYPT, DH_R_PEER_KEY_ERROR); | - | ||||||||||||||||||
763 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
764 | } | - | ||||||||||||||||||
765 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||||||||
766 | /* Set DH derivation parameters and initialise unwrap context */ | - | ||||||||||||||||||
767 | if (!dh_cms_set_shared_info(pctx, ri)) {
| 0-1 | ||||||||||||||||||
768 | DHerr(DH_F_DH_CMS_DECRYPT, DH_R_SHARED_INFO_ERROR); | - | ||||||||||||||||||
769 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
770 | } | - | ||||||||||||||||||
771 | return 1; executed 1 time by 1 test: return 1; Executed by:
| 1 | ||||||||||||||||||
772 | } | - | ||||||||||||||||||
773 | - | |||||||||||||||||||
774 | static int dh_cms_encrypt(CMS_RecipientInfo *ri) | - | ||||||||||||||||||
775 | { | - | ||||||||||||||||||
776 | EVP_PKEY_CTX *pctx; | - | ||||||||||||||||||
777 | EVP_PKEY *pkey; | - | ||||||||||||||||||
778 | EVP_CIPHER_CTX *ctx; | - | ||||||||||||||||||
779 | int keylen; | - | ||||||||||||||||||
780 | X509_ALGOR *talg, *wrap_alg = NULL; | - | ||||||||||||||||||
781 | const ASN1_OBJECT *aoid; | - | ||||||||||||||||||
782 | ASN1_BIT_STRING *pubkey; | - | ||||||||||||||||||
783 | ASN1_STRING *wrap_str; | - | ||||||||||||||||||
784 | ASN1_OCTET_STRING *ukm; | - | ||||||||||||||||||
785 | unsigned char *penc = NULL, *dukm = NULL; | - | ||||||||||||||||||
786 | int penclen; | - | ||||||||||||||||||
787 | size_t dukmlen = 0; | - | ||||||||||||||||||
788 | int rv = 0; | - | ||||||||||||||||||
789 | int kdf_type, wrap_nid; | - | ||||||||||||||||||
790 | const EVP_MD *kdf_md; | - | ||||||||||||||||||
791 | pctx = CMS_RecipientInfo_get0_pkey_ctx(ri); | - | ||||||||||||||||||
792 | if (!pctx)
| 0-1 | ||||||||||||||||||
793 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
794 | /* Get ephemeral key */ | - | ||||||||||||||||||
795 | pkey = EVP_PKEY_CTX_get0_pkey(pctx); | - | ||||||||||||||||||
796 | if (!CMS_RecipientInfo_kari_get0_orig_id(ri, &talg, &pubkey,
| 0-1 | ||||||||||||||||||
797 | NULL, NULL, NULL))
| 0-1 | ||||||||||||||||||
798 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
799 | X509_ALGOR_get0(&aoid, NULL, NULL, talg); | - | ||||||||||||||||||
800 | /* Is everything uninitialised? */ | - | ||||||||||||||||||
801 | if (aoid == OBJ_nid2obj(NID_undef)) {
| 0-1 | ||||||||||||||||||
802 | ASN1_INTEGER *pubk = BN_to_ASN1_INTEGER(pkey->pkey.dh->pub_key, NULL); | - | ||||||||||||||||||
803 | if (!pubk)
| 0-1 | ||||||||||||||||||
804 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
805 | /* Set the key */ | - | ||||||||||||||||||
806 | - | |||||||||||||||||||
807 | penclen = i2d_ASN1_INTEGER(pubk, &penc); | - | ||||||||||||||||||
808 | ASN1_INTEGER_free(pubk); | - | ||||||||||||||||||
809 | if (penclen <= 0)
| 0-1 | ||||||||||||||||||
810 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
811 | ASN1_STRING_set0(pubkey, penc, penclen); | - | ||||||||||||||||||
812 | pubkey->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); | - | ||||||||||||||||||
813 | pubkey->flags |= ASN1_STRING_FLAG_BITS_LEFT; | - | ||||||||||||||||||
814 | - | |||||||||||||||||||
815 | penc = NULL; | - | ||||||||||||||||||
816 | X509_ALGOR_set0(talg, OBJ_nid2obj(NID_dhpublicnumber), | - | ||||||||||||||||||
817 | V_ASN1_UNDEF, NULL); | - | ||||||||||||||||||
818 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||||||||
819 | - | |||||||||||||||||||
820 | /* See if custom parameters set */ | - | ||||||||||||||||||
821 | kdf_type = EVP_PKEY_CTX_get_dh_kdf_type(pctx); | - | ||||||||||||||||||
822 | if (kdf_type <= 0)
| 0-1 | ||||||||||||||||||
823 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
824 | if (!EVP_PKEY_CTX_get_dh_kdf_md(pctx, &kdf_md))
| 0-1 | ||||||||||||||||||
825 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
826 | - | |||||||||||||||||||
827 | if (kdf_type == EVP_PKEY_DH_KDF_NONE) {
| 0-1 | ||||||||||||||||||
828 | kdf_type = EVP_PKEY_DH_KDF_X9_42; | - | ||||||||||||||||||
829 | if (EVP_PKEY_CTX_set_dh_kdf_type(pctx, kdf_type) <= 0)
| 0-1 | ||||||||||||||||||
830 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
831 | } else if (kdf_type != EVP_PKEY_DH_KDF_X9_42) executed 1 time by 1 test: end of block Executed by:
| 0-1 | ||||||||||||||||||
832 | /* Unknown KDF */ | - | ||||||||||||||||||
833 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
834 | if (kdf_md == NULL) {
| 0-1 | ||||||||||||||||||
835 | /* Only SHA1 supported */ | - | ||||||||||||||||||
836 | kdf_md = EVP_sha1(); | - | ||||||||||||||||||
837 | if (EVP_PKEY_CTX_set_dh_kdf_md(pctx, kdf_md) <= 0)
| 0-1 | ||||||||||||||||||
838 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
839 | } else if (EVP_MD_type(kdf_md) != NID_sha1) executed 1 time by 1 test: end of block Executed by:
| 0-1 | ||||||||||||||||||
840 | /* Unsupported digest */ | - | ||||||||||||||||||
841 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
842 | - | |||||||||||||||||||
843 | if (!CMS_RecipientInfo_kari_get0_alg(ri, &talg, &ukm))
| 0-1 | ||||||||||||||||||
844 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
845 | - | |||||||||||||||||||
846 | /* Get wrap NID */ | - | ||||||||||||||||||
847 | ctx = CMS_RecipientInfo_kari_get0_ctx(ri); | - | ||||||||||||||||||
848 | wrap_nid = EVP_CIPHER_CTX_type(ctx); | - | ||||||||||||||||||
849 | if (EVP_PKEY_CTX_set0_dh_kdf_oid(pctx, OBJ_nid2obj(wrap_nid)) <= 0)
| 0-1 | ||||||||||||||||||
850 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
851 | keylen = EVP_CIPHER_CTX_key_length(ctx); | - | ||||||||||||||||||
852 | - | |||||||||||||||||||
853 | /* Package wrap algorithm in an AlgorithmIdentifier */ | - | ||||||||||||||||||
854 | - | |||||||||||||||||||
855 | wrap_alg = X509_ALGOR_new(); | - | ||||||||||||||||||
856 | if (wrap_alg == NULL)
| 0-1 | ||||||||||||||||||
857 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
858 | wrap_alg->algorithm = OBJ_nid2obj(wrap_nid); | - | ||||||||||||||||||
859 | wrap_alg->parameter = ASN1_TYPE_new(); | - | ||||||||||||||||||
860 | if (wrap_alg->parameter == NULL)
| 0-1 | ||||||||||||||||||
861 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
862 | if (EVP_CIPHER_param_to_asn1(ctx, wrap_alg->parameter) <= 0)
| 0-1 | ||||||||||||||||||
863 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
864 | if (ASN1_TYPE_get(wrap_alg->parameter) == NID_undef) {
| 0-1 | ||||||||||||||||||
865 | ASN1_TYPE_free(wrap_alg->parameter); | - | ||||||||||||||||||
866 | wrap_alg->parameter = NULL; | - | ||||||||||||||||||
867 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||||||||
868 | - | |||||||||||||||||||
869 | if (EVP_PKEY_CTX_set_dh_kdf_outlen(pctx, keylen) <= 0)
| 0-1 | ||||||||||||||||||
870 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
871 | - | |||||||||||||||||||
872 | if (ukm) {
| 0-1 | ||||||||||||||||||
873 | dukmlen = ASN1_STRING_length(ukm); | - | ||||||||||||||||||
874 | dukm = OPENSSL_memdup(ASN1_STRING_get0_data(ukm), dukmlen); | - | ||||||||||||||||||
875 | if (!dukm)
| 0 | ||||||||||||||||||
876 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
877 | } never executed: end of block | 0 | ||||||||||||||||||
878 | - | |||||||||||||||||||
879 | if (EVP_PKEY_CTX_set0_dh_kdf_ukm(pctx, dukm, dukmlen) <= 0)
| 0-1 | ||||||||||||||||||
880 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
881 | dukm = NULL; | - | ||||||||||||||||||
882 | - | |||||||||||||||||||
883 | /* | - | ||||||||||||||||||
884 | * Now need to wrap encoding of wrap AlgorithmIdentifier into parameter | - | ||||||||||||||||||
885 | * of another AlgorithmIdentifier. | - | ||||||||||||||||||
886 | */ | - | ||||||||||||||||||
887 | penc = NULL; | - | ||||||||||||||||||
888 | penclen = i2d_X509_ALGOR(wrap_alg, &penc); | - | ||||||||||||||||||
889 | if (!penc || !penclen)
| 0-1 | ||||||||||||||||||
890 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
891 | wrap_str = ASN1_STRING_new(); | - | ||||||||||||||||||
892 | if (wrap_str == NULL)
| 0-1 | ||||||||||||||||||
893 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
894 | ASN1_STRING_set0(wrap_str, penc, penclen); | - | ||||||||||||||||||
895 | penc = NULL; | - | ||||||||||||||||||
896 | X509_ALGOR_set0(talg, OBJ_nid2obj(NID_id_smime_alg_ESDH), | - | ||||||||||||||||||
897 | V_ASN1_SEQUENCE, wrap_str); | - | ||||||||||||||||||
898 | - | |||||||||||||||||||
899 | rv = 1; | - | ||||||||||||||||||
900 | - | |||||||||||||||||||
901 | err: code before this statement executed 1 time by 1 test: err: Executed by:
| 1 | ||||||||||||||||||
902 | OPENSSL_free(penc); | - | ||||||||||||||||||
903 | X509_ALGOR_free(wrap_alg); | - | ||||||||||||||||||
904 | return rv; executed 1 time by 1 test: return rv; Executed by:
| 1 | ||||||||||||||||||
905 | } | - | ||||||||||||||||||
906 | - | |||||||||||||||||||
907 | #endif | - | ||||||||||||||||||
Source code | Switch to Preprocessed file |