Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/openssl/src/crypto/dsa/dsa_gen.c |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /* | - | ||||||||||||||||||
2 | * Copyright 1995-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 | /* | - | ||||||||||||||||||
11 | * Parameter generation follows the updated Appendix 2.2 for FIPS PUB 186, | - | ||||||||||||||||||
12 | * also Appendix 2.2 of FIPS PUB 186-1 (i.e. use SHA as defined in FIPS PUB | - | ||||||||||||||||||
13 | * 180-1) | - | ||||||||||||||||||
14 | */ | - | ||||||||||||||||||
15 | #define xxxHASH EVP_sha1() | - | ||||||||||||||||||
16 | - | |||||||||||||||||||
17 | #include <openssl/opensslconf.h> | - | ||||||||||||||||||
18 | #include <stdio.h> | - | ||||||||||||||||||
19 | #include "internal/cryptlib.h" | - | ||||||||||||||||||
20 | #include <openssl/evp.h> | - | ||||||||||||||||||
21 | #include <openssl/bn.h> | - | ||||||||||||||||||
22 | #include <openssl/rand.h> | - | ||||||||||||||||||
23 | #include <openssl/sha.h> | - | ||||||||||||||||||
24 | #include "dsa_locl.h" | - | ||||||||||||||||||
25 | - | |||||||||||||||||||
26 | int DSA_generate_parameters_ex(DSA *ret, int bits, | - | ||||||||||||||||||
27 | const unsigned char *seed_in, int seed_len, | - | ||||||||||||||||||
28 | int *counter_ret, unsigned long *h_ret, | - | ||||||||||||||||||
29 | BN_GENCB *cb) | - | ||||||||||||||||||
30 | { | - | ||||||||||||||||||
31 | if (ret->meth->dsa_paramgen)
| 0-1 | ||||||||||||||||||
32 | return ret->meth->dsa_paramgen(ret, bits, seed_in, seed_len, never executed: return ret->meth->dsa_paramgen(ret, bits, seed_in, seed_len, counter_ret, h_ret, cb); | 0 | ||||||||||||||||||
33 | counter_ret, h_ret, cb); never executed: return ret->meth->dsa_paramgen(ret, bits, seed_in, seed_len, counter_ret, h_ret, cb); | 0 | ||||||||||||||||||
34 | else { | - | ||||||||||||||||||
35 | const EVP_MD *evpmd = bits >= 2048 ? EVP_sha256() : EVP_sha1();
| 0-1 | ||||||||||||||||||
36 | size_t qbits = EVP_MD_size(evpmd) * 8; | - | ||||||||||||||||||
37 | - | |||||||||||||||||||
38 | return dsa_builtin_paramgen(ret, bits, qbits, evpmd, executed 1 time by 1 test: return dsa_builtin_paramgen(ret, bits, qbits, evpmd, seed_in, seed_len, ((void *)0) , counter_ret, h_ret, cb); Executed by:
| 1 | ||||||||||||||||||
39 | seed_in, seed_len, NULL, counter_ret, executed 1 time by 1 test: return dsa_builtin_paramgen(ret, bits, qbits, evpmd, seed_in, seed_len, ((void *)0) , counter_ret, h_ret, cb); Executed by:
| 1 | ||||||||||||||||||
40 | h_ret, cb); executed 1 time by 1 test: return dsa_builtin_paramgen(ret, bits, qbits, evpmd, seed_in, seed_len, ((void *)0) , counter_ret, h_ret, cb); Executed by:
| 1 | ||||||||||||||||||
41 | } | - | ||||||||||||||||||
42 | } | - | ||||||||||||||||||
43 | - | |||||||||||||||||||
44 | int dsa_builtin_paramgen(DSA *ret, size_t bits, size_t qbits, | - | ||||||||||||||||||
45 | const EVP_MD *evpmd, const unsigned char *seed_in, | - | ||||||||||||||||||
46 | size_t seed_len, unsigned char *seed_out, | - | ||||||||||||||||||
47 | int *counter_ret, unsigned long *h_ret, BN_GENCB *cb) | - | ||||||||||||||||||
48 | { | - | ||||||||||||||||||
49 | int ok = 0; | - | ||||||||||||||||||
50 | unsigned char seed[SHA256_DIGEST_LENGTH]; | - | ||||||||||||||||||
51 | unsigned char md[SHA256_DIGEST_LENGTH]; | - | ||||||||||||||||||
52 | unsigned char buf[SHA256_DIGEST_LENGTH], buf2[SHA256_DIGEST_LENGTH]; | - | ||||||||||||||||||
53 | BIGNUM *r0, *W, *X, *c, *test; | - | ||||||||||||||||||
54 | BIGNUM *g = NULL, *q = NULL, *p = NULL; | - | ||||||||||||||||||
55 | BN_MONT_CTX *mont = NULL; | - | ||||||||||||||||||
56 | int i, k, n = 0, m = 0, qsize = qbits >> 3; | - | ||||||||||||||||||
57 | int counter = 0; | - | ||||||||||||||||||
58 | int r = 0; | - | ||||||||||||||||||
59 | BN_CTX *ctx = NULL; | - | ||||||||||||||||||
60 | unsigned int h = 2; | - | ||||||||||||||||||
61 | - | |||||||||||||||||||
62 | if (qsize != SHA_DIGEST_LENGTH && qsize != SHA224_DIGEST_LENGTH &&
| 0-1 | ||||||||||||||||||
63 | qsize != SHA256_DIGEST_LENGTH)
| 0 | ||||||||||||||||||
64 | /* invalid q size */ | - | ||||||||||||||||||
65 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
66 | - | |||||||||||||||||||
67 | if (evpmd == NULL) {
| 0-1 | ||||||||||||||||||
68 | if (qsize == SHA_DIGEST_LENGTH)
| 0 | ||||||||||||||||||
69 | evpmd = EVP_sha1(); never executed: evpmd = EVP_sha1(); | 0 | ||||||||||||||||||
70 | else if (qsize == SHA224_DIGEST_LENGTH)
| 0 | ||||||||||||||||||
71 | evpmd = EVP_sha224(); never executed: evpmd = EVP_sha224(); | 0 | ||||||||||||||||||
72 | else | - | ||||||||||||||||||
73 | evpmd = EVP_sha256(); never executed: evpmd = EVP_sha256(); | 0 | ||||||||||||||||||
74 | } else { | - | ||||||||||||||||||
75 | qsize = EVP_MD_size(evpmd); | - | ||||||||||||||||||
76 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||||||||
77 | - | |||||||||||||||||||
78 | if (bits < 512)
| 0-1 | ||||||||||||||||||
79 | bits = 512; never executed: bits = 512; | 0 | ||||||||||||||||||
80 | - | |||||||||||||||||||
81 | bits = (bits + 63) / 64 * 64; | - | ||||||||||||||||||
82 | - | |||||||||||||||||||
83 | if (seed_in != NULL) {
| 0-1 | ||||||||||||||||||
84 | if (seed_len < (size_t)qsize) {
| 0-1 | ||||||||||||||||||
85 | DSAerr(DSA_F_DSA_BUILTIN_PARAMGEN, DSA_R_SEED_LEN_SMALL); | - | ||||||||||||||||||
86 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
87 | } | - | ||||||||||||||||||
88 | if (seed_len > (size_t)qsize) {
| 0-1 | ||||||||||||||||||
89 | /* Only consume as much seed as is expected. */ | - | ||||||||||||||||||
90 | seed_len = qsize; | - | ||||||||||||||||||
91 | } never executed: end of block | 0 | ||||||||||||||||||
92 | memcpy(seed, seed_in, seed_len); | - | ||||||||||||||||||
93 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||||||||
94 | - | |||||||||||||||||||
95 | if ((mont = BN_MONT_CTX_new()) == NULL)
| 0-1 | ||||||||||||||||||
96 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
97 | - | |||||||||||||||||||
98 | if ((ctx = BN_CTX_new()) == NULL)
| 0-1 | ||||||||||||||||||
99 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
100 | - | |||||||||||||||||||
101 | BN_CTX_start(ctx); | - | ||||||||||||||||||
102 | - | |||||||||||||||||||
103 | r0 = BN_CTX_get(ctx); | - | ||||||||||||||||||
104 | g = BN_CTX_get(ctx); | - | ||||||||||||||||||
105 | W = BN_CTX_get(ctx); | - | ||||||||||||||||||
106 | q = BN_CTX_get(ctx); | - | ||||||||||||||||||
107 | X = BN_CTX_get(ctx); | - | ||||||||||||||||||
108 | c = BN_CTX_get(ctx); | - | ||||||||||||||||||
109 | p = BN_CTX_get(ctx); | - | ||||||||||||||||||
110 | test = BN_CTX_get(ctx); | - | ||||||||||||||||||
111 | - | |||||||||||||||||||
112 | if (test == NULL)
| 0-1 | ||||||||||||||||||
113 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
114 | - | |||||||||||||||||||
115 | if (!BN_lshift(test, BN_value_one(), bits - 1))
| 0-1 | ||||||||||||||||||
116 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
117 | - | |||||||||||||||||||
118 | for (;;) { | - | ||||||||||||||||||
119 | for (;;) { /* find q */ | - | ||||||||||||||||||
120 | int use_random_seed = (seed_in == NULL); | - | ||||||||||||||||||
121 | - | |||||||||||||||||||
122 | /* step 1 */ | - | ||||||||||||||||||
123 | if (!BN_GENCB_call(cb, 0, m++))
| 0-1 | ||||||||||||||||||
124 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
125 | - | |||||||||||||||||||
126 | if (use_random_seed) {
| 0-1 | ||||||||||||||||||
127 | if (RAND_bytes(seed, qsize) <= 0)
| 0 | ||||||||||||||||||
128 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
129 | } else { never executed: end of block | 0 | ||||||||||||||||||
130 | /* If we come back through, use random seed next time. */ | - | ||||||||||||||||||
131 | seed_in = NULL; | - | ||||||||||||||||||
132 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||||||||
133 | memcpy(buf, seed, qsize); | - | ||||||||||||||||||
134 | memcpy(buf2, seed, qsize); | - | ||||||||||||||||||
135 | /* precompute "SEED + 1" for step 7: */ | - | ||||||||||||||||||
136 | for (i = qsize - 1; i >= 0; i--) {
| 0-1 | ||||||||||||||||||
137 | buf[i]++; | - | ||||||||||||||||||
138 | if (buf[i] != 0)
| 0-1 | ||||||||||||||||||
139 | break; executed 1 time by 1 test: break; Executed by:
| 1 | ||||||||||||||||||
140 | } never executed: end of block | 0 | ||||||||||||||||||
141 | - | |||||||||||||||||||
142 | /* step 2 */ | - | ||||||||||||||||||
143 | if (!EVP_Digest(seed, qsize, md, NULL, evpmd, NULL))
| 0-1 | ||||||||||||||||||
144 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
145 | if (!EVP_Digest(buf, qsize, buf2, NULL, evpmd, NULL))
| 0-1 | ||||||||||||||||||
146 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
147 | for (i = 0; i < qsize; i++)
| 1-20 | ||||||||||||||||||
148 | md[i] ^= buf2[i]; executed 20 times by 1 test: md[i] ^= buf2[i]; Executed by:
| 20 | ||||||||||||||||||
149 | - | |||||||||||||||||||
150 | /* step 3 */ | - | ||||||||||||||||||
151 | md[0] |= 0x80; | - | ||||||||||||||||||
152 | md[qsize - 1] |= 0x01; | - | ||||||||||||||||||
153 | if (!BN_bin2bn(md, qsize, q))
| 0-1 | ||||||||||||||||||
154 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
155 | - | |||||||||||||||||||
156 | /* step 4 */ | - | ||||||||||||||||||
157 | r = BN_is_prime_fasttest_ex(q, DSS_prime_checks, ctx, | - | ||||||||||||||||||
158 | use_random_seed, cb); | - | ||||||||||||||||||
159 | if (r > 0)
| 0-1 | ||||||||||||||||||
160 | break; executed 1 time by 1 test: break; Executed by:
| 1 | ||||||||||||||||||
161 | if (r != 0)
| 0 | ||||||||||||||||||
162 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
163 | - | |||||||||||||||||||
164 | /* do a callback call */ | - | ||||||||||||||||||
165 | /* step 5 */ | - | ||||||||||||||||||
166 | } never executed: end of block | 0 | ||||||||||||||||||
167 | - | |||||||||||||||||||
168 | if (!BN_GENCB_call(cb, 2, 0))
| 0-1 | ||||||||||||||||||
169 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
170 | if (!BN_GENCB_call(cb, 3, 0))
| 0-1 | ||||||||||||||||||
171 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
172 | - | |||||||||||||||||||
173 | /* step 6 */ | - | ||||||||||||||||||
174 | counter = 0; | - | ||||||||||||||||||
175 | /* "offset = 2" */ | - | ||||||||||||||||||
176 | - | |||||||||||||||||||
177 | n = (bits - 1) / 160; | - | ||||||||||||||||||
178 | - | |||||||||||||||||||
179 | for (;;) { | - | ||||||||||||||||||
180 | if ((counter != 0) && !BN_GENCB_call(cb, 0, counter))
| 0-105 | ||||||||||||||||||
181 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
182 | - | |||||||||||||||||||
183 | /* step 7 */ | - | ||||||||||||||||||
184 | BN_zero(W); | - | ||||||||||||||||||
185 | /* now 'buf' contains "SEED + offset - 1" */ | - | ||||||||||||||||||
186 | for (k = 0; k <= n; k++) {
| 106-424 | ||||||||||||||||||
187 | /* | - | ||||||||||||||||||
188 | * obtain "SEED + offset + k" by incrementing: | - | ||||||||||||||||||
189 | */ | - | ||||||||||||||||||
190 | for (i = qsize - 1; i >= 0; i--) {
| 0-426 | ||||||||||||||||||
191 | buf[i]++; | - | ||||||||||||||||||
192 | if (buf[i] != 0)
| 2-424 | ||||||||||||||||||
193 | break; executed 424 times by 1 test: break; Executed by:
| 424 | ||||||||||||||||||
194 | } executed 2 times by 1 test: end of block Executed by:
| 2 | ||||||||||||||||||
195 | - | |||||||||||||||||||
196 | if (!EVP_Digest(buf, qsize, md, NULL, evpmd, NULL))
| 0-424 | ||||||||||||||||||
197 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
198 | - | |||||||||||||||||||
199 | /* step 8 */ | - | ||||||||||||||||||
200 | if (!BN_bin2bn(md, qsize, r0))
| 0-424 | ||||||||||||||||||
201 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
202 | if (!BN_lshift(r0, r0, (qsize << 3) * k))
| 0-424 | ||||||||||||||||||
203 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
204 | if (!BN_add(W, W, r0))
| 0-424 | ||||||||||||||||||
205 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
206 | } executed 424 times by 1 test: end of block Executed by:
| 424 | ||||||||||||||||||
207 | - | |||||||||||||||||||
208 | /* more of step 8 */ | - | ||||||||||||||||||
209 | if (!BN_mask_bits(W, bits - 1))
| 0-106 | ||||||||||||||||||
210 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
211 | if (!BN_copy(X, W))
| 0-106 | ||||||||||||||||||
212 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
213 | if (!BN_add(X, X, test))
| 0-106 | ||||||||||||||||||
214 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
215 | - | |||||||||||||||||||
216 | /* step 9 */ | - | ||||||||||||||||||
217 | if (!BN_lshift1(r0, q))
| 0-106 | ||||||||||||||||||
218 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
219 | if (!BN_mod(c, X, r0, ctx))
| 0-106 | ||||||||||||||||||
220 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
221 | if (!BN_sub(r0, c, BN_value_one()))
| 0-106 | ||||||||||||||||||
222 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
223 | if (!BN_sub(p, X, r0))
| 0-106 | ||||||||||||||||||
224 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
225 | - | |||||||||||||||||||
226 | /* step 10 */ | - | ||||||||||||||||||
227 | if (BN_cmp(p, test) >= 0) {
| 0-106 | ||||||||||||||||||
228 | /* step 11 */ | - | ||||||||||||||||||
229 | r = BN_is_prime_fasttest_ex(p, DSS_prime_checks, ctx, 1, cb); | - | ||||||||||||||||||
230 | if (r > 0)
| 1-105 | ||||||||||||||||||
231 | goto end; /* found it */ executed 1 time by 1 test: goto end; Executed by:
| 1 | ||||||||||||||||||
232 | if (r != 0)
| 0-105 | ||||||||||||||||||
233 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
234 | } executed 105 times by 1 test: end of block Executed by:
| 105 | ||||||||||||||||||
235 | - | |||||||||||||||||||
236 | /* step 13 */ | - | ||||||||||||||||||
237 | counter++; | - | ||||||||||||||||||
238 | /* "offset = offset + n + 1" */ | - | ||||||||||||||||||
239 | - | |||||||||||||||||||
240 | /* step 14 */ | - | ||||||||||||||||||
241 | if (counter >= 4096)
| 0-105 | ||||||||||||||||||
242 | break; never executed: break; | 0 | ||||||||||||||||||
243 | } executed 105 times by 1 test: end of block Executed by:
| 105 | ||||||||||||||||||
244 | } never executed: end of block | 0 | ||||||||||||||||||
245 | end: code before this statement never executed: end: | 0 | ||||||||||||||||||
246 | if (!BN_GENCB_call(cb, 2, 1))
| 0-1 | ||||||||||||||||||
247 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
248 | - | |||||||||||||||||||
249 | /* We now need to generate g */ | - | ||||||||||||||||||
250 | /* Set r0=(p-1)/q */ | - | ||||||||||||||||||
251 | if (!BN_sub(test, p, BN_value_one()))
| 0-1 | ||||||||||||||||||
252 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
253 | if (!BN_div(r0, NULL, test, q, ctx))
| 0-1 | ||||||||||||||||||
254 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
255 | - | |||||||||||||||||||
256 | if (!BN_set_word(test, h))
| 0-1 | ||||||||||||||||||
257 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
258 | if (!BN_MONT_CTX_set(mont, p, ctx))
| 0-1 | ||||||||||||||||||
259 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
260 | - | |||||||||||||||||||
261 | for (;;) { | - | ||||||||||||||||||
262 | /* g=test^r0%p */ | - | ||||||||||||||||||
263 | if (!BN_mod_exp_mont(g, test, r0, p, ctx, mont))
| 0-1 | ||||||||||||||||||
264 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
265 | if (!BN_is_one(g))
| 0-1 | ||||||||||||||||||
266 | break; executed 1 time by 1 test: break; Executed by:
| 1 | ||||||||||||||||||
267 | if (!BN_add(test, test, BN_value_one()))
| 0 | ||||||||||||||||||
268 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
269 | h++; | - | ||||||||||||||||||
270 | } never executed: end of block | 0 | ||||||||||||||||||
271 | - | |||||||||||||||||||
272 | if (!BN_GENCB_call(cb, 3, 1))
| 0-1 | ||||||||||||||||||
273 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
274 | - | |||||||||||||||||||
275 | ok = 1; | - | ||||||||||||||||||
276 | err: code before this statement executed 1 time by 1 test: err: Executed by:
| 1 | ||||||||||||||||||
277 | if (ok) {
| 0-1 | ||||||||||||||||||
278 | BN_free(ret->p); | - | ||||||||||||||||||
279 | BN_free(ret->q); | - | ||||||||||||||||||
280 | BN_free(ret->g); | - | ||||||||||||||||||
281 | ret->p = BN_dup(p); | - | ||||||||||||||||||
282 | ret->q = BN_dup(q); | - | ||||||||||||||||||
283 | ret->g = BN_dup(g); | - | ||||||||||||||||||
284 | if (ret->p == NULL || ret->q == NULL || ret->g == NULL) {
| 0-1 | ||||||||||||||||||
285 | ok = 0; | - | ||||||||||||||||||
286 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
287 | } | - | ||||||||||||||||||
288 | if (counter_ret != NULL)
| 0-1 | ||||||||||||||||||
289 | *counter_ret = counter; executed 1 time by 1 test: *counter_ret = counter; Executed by:
| 1 | ||||||||||||||||||
290 | if (h_ret != NULL)
| 0-1 | ||||||||||||||||||
291 | *h_ret = h; executed 1 time by 1 test: *h_ret = h; Executed by:
| 1 | ||||||||||||||||||
292 | if (seed_out)
| 0-1 | ||||||||||||||||||
293 | memcpy(seed_out, seed, qsize); never executed: memcpy(seed_out, seed, qsize); | 0 | ||||||||||||||||||
294 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||||||||
295 | if (ctx)
| 0-1 | ||||||||||||||||||
296 | BN_CTX_end(ctx); executed 1 time by 1 test: BN_CTX_end(ctx); Executed by:
| 1 | ||||||||||||||||||
297 | BN_CTX_free(ctx); | - | ||||||||||||||||||
298 | BN_MONT_CTX_free(mont); | - | ||||||||||||||||||
299 | return ok; executed 1 time by 1 test: return ok; Executed by:
| 1 | ||||||||||||||||||
300 | } | - | ||||||||||||||||||
301 | - | |||||||||||||||||||
302 | /* | - | ||||||||||||||||||
303 | * This is a parameter generation algorithm for the DSA2 algorithm as | - | ||||||||||||||||||
304 | * described in FIPS 186-3. | - | ||||||||||||||||||
305 | */ | - | ||||||||||||||||||
306 | - | |||||||||||||||||||
307 | int dsa_builtin_paramgen2(DSA *ret, size_t L, size_t N, | - | ||||||||||||||||||
308 | const EVP_MD *evpmd, const unsigned char *seed_in, | - | ||||||||||||||||||
309 | size_t seed_len, int idx, unsigned char *seed_out, | - | ||||||||||||||||||
310 | int *counter_ret, unsigned long *h_ret, | - | ||||||||||||||||||
311 | BN_GENCB *cb) | - | ||||||||||||||||||
312 | { | - | ||||||||||||||||||
313 | int ok = -1; | - | ||||||||||||||||||
314 | unsigned char *seed = NULL, *seed_tmp = NULL; | - | ||||||||||||||||||
315 | unsigned char md[EVP_MAX_MD_SIZE]; | - | ||||||||||||||||||
316 | int mdsize; | - | ||||||||||||||||||
317 | BIGNUM *r0, *W, *X, *c, *test; | - | ||||||||||||||||||
318 | BIGNUM *g = NULL, *q = NULL, *p = NULL; | - | ||||||||||||||||||
319 | BN_MONT_CTX *mont = NULL; | - | ||||||||||||||||||
320 | int i, k, n = 0, m = 0, qsize = N >> 3; | - | ||||||||||||||||||
321 | int counter = 0; | - | ||||||||||||||||||
322 | int r = 0; | - | ||||||||||||||||||
323 | BN_CTX *ctx = NULL; | - | ||||||||||||||||||
324 | EVP_MD_CTX *mctx = EVP_MD_CTX_new(); | - | ||||||||||||||||||
325 | unsigned int h = 2; | - | ||||||||||||||||||
326 | - | |||||||||||||||||||
327 | if (mctx == NULL)
| 0 | ||||||||||||||||||
328 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
329 | - | |||||||||||||||||||
330 | if (evpmd == NULL) {
| 0 | ||||||||||||||||||
331 | if (N == 160)
| 0 | ||||||||||||||||||
332 | evpmd = EVP_sha1(); never executed: evpmd = EVP_sha1(); | 0 | ||||||||||||||||||
333 | else if (N == 224)
| 0 | ||||||||||||||||||
334 | evpmd = EVP_sha224(); never executed: evpmd = EVP_sha224(); | 0 | ||||||||||||||||||
335 | else | - | ||||||||||||||||||
336 | evpmd = EVP_sha256(); never executed: evpmd = EVP_sha256(); | 0 | ||||||||||||||||||
337 | } | - | ||||||||||||||||||
338 | - | |||||||||||||||||||
339 | mdsize = EVP_MD_size(evpmd); | - | ||||||||||||||||||
340 | /* If unverifiable g generation only don't need seed */ | - | ||||||||||||||||||
341 | if (!ret->p || !ret->q || idx >= 0) {
| 0 | ||||||||||||||||||
342 | if (seed_len == 0)
| 0 | ||||||||||||||||||
343 | seed_len = mdsize; never executed: seed_len = mdsize; | 0 | ||||||||||||||||||
344 | - | |||||||||||||||||||
345 | seed = OPENSSL_malloc(seed_len); | - | ||||||||||||||||||
346 | - | |||||||||||||||||||
347 | if (seed_out)
| 0 | ||||||||||||||||||
348 | seed_tmp = seed_out; never executed: seed_tmp = seed_out; | 0 | ||||||||||||||||||
349 | else | - | ||||||||||||||||||
350 | seed_tmp = OPENSSL_malloc(seed_len); never executed: seed_tmp = CRYPTO_malloc(seed_len, __FILE__, 350); | 0 | ||||||||||||||||||
351 | - | |||||||||||||||||||
352 | if (seed == NULL || seed_tmp == NULL)
| 0 | ||||||||||||||||||
353 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
354 | - | |||||||||||||||||||
355 | if (seed_in)
| 0 | ||||||||||||||||||
356 | memcpy(seed, seed_in, seed_len); never executed: memcpy(seed, seed_in, seed_len); | 0 | ||||||||||||||||||
357 | - | |||||||||||||||||||
358 | } never executed: end of block | 0 | ||||||||||||||||||
359 | - | |||||||||||||||||||
360 | if ((ctx = BN_CTX_new()) == NULL)
| 0 | ||||||||||||||||||
361 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
362 | - | |||||||||||||||||||
363 | if ((mont = BN_MONT_CTX_new()) == NULL)
| 0 | ||||||||||||||||||
364 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
365 | - | |||||||||||||||||||
366 | BN_CTX_start(ctx); | - | ||||||||||||||||||
367 | r0 = BN_CTX_get(ctx); | - | ||||||||||||||||||
368 | g = BN_CTX_get(ctx); | - | ||||||||||||||||||
369 | W = BN_CTX_get(ctx); | - | ||||||||||||||||||
370 | X = BN_CTX_get(ctx); | - | ||||||||||||||||||
371 | c = BN_CTX_get(ctx); | - | ||||||||||||||||||
372 | test = BN_CTX_get(ctx); | - | ||||||||||||||||||
373 | if (test == NULL)
| 0 | ||||||||||||||||||
374 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
375 | - | |||||||||||||||||||
376 | /* if p, q already supplied generate g only */ | - | ||||||||||||||||||
377 | if (ret->p && ret->q) {
| 0 | ||||||||||||||||||
378 | p = ret->p; | - | ||||||||||||||||||
379 | q = ret->q; | - | ||||||||||||||||||
380 | if (idx >= 0)
| 0 | ||||||||||||||||||
381 | memcpy(seed_tmp, seed, seed_len); never executed: memcpy(seed_tmp, seed, seed_len); | 0 | ||||||||||||||||||
382 | goto g_only; never executed: goto g_only; | 0 | ||||||||||||||||||
383 | } else { | - | ||||||||||||||||||
384 | p = BN_CTX_get(ctx); | - | ||||||||||||||||||
385 | q = BN_CTX_get(ctx); | - | ||||||||||||||||||
386 | if (q == NULL)
| 0 | ||||||||||||||||||
387 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
388 | } never executed: end of block | 0 | ||||||||||||||||||
389 | - | |||||||||||||||||||
390 | if (!BN_lshift(test, BN_value_one(), L - 1))
| 0 | ||||||||||||||||||
391 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
392 | for (;;) { | - | ||||||||||||||||||
393 | for (;;) { /* find q */ | - | ||||||||||||||||||
394 | unsigned char *pmd; | - | ||||||||||||||||||
395 | /* step 1 */ | - | ||||||||||||||||||
396 | if (!BN_GENCB_call(cb, 0, m++))
| 0 | ||||||||||||||||||
397 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
398 | - | |||||||||||||||||||
399 | if (!seed_in) {
| 0 | ||||||||||||||||||
400 | if (RAND_bytes(seed, seed_len) <= 0)
| 0 | ||||||||||||||||||
401 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
402 | } never executed: end of block | 0 | ||||||||||||||||||
403 | /* step 2 */ | - | ||||||||||||||||||
404 | if (!EVP_Digest(seed, seed_len, md, NULL, evpmd, NULL))
| 0 | ||||||||||||||||||
405 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
406 | /* Take least significant bits of md */ | - | ||||||||||||||||||
407 | if (mdsize > qsize)
| 0 | ||||||||||||||||||
408 | pmd = md + mdsize - qsize; never executed: pmd = md + mdsize - qsize; | 0 | ||||||||||||||||||
409 | else | - | ||||||||||||||||||
410 | pmd = md; never executed: pmd = md; | 0 | ||||||||||||||||||
411 | - | |||||||||||||||||||
412 | if (mdsize < qsize)
| 0 | ||||||||||||||||||
413 | memset(md + mdsize, 0, qsize - mdsize); never executed: memset(md + mdsize, 0, qsize - mdsize); | 0 | ||||||||||||||||||
414 | - | |||||||||||||||||||
415 | /* step 3 */ | - | ||||||||||||||||||
416 | pmd[0] |= 0x80; | - | ||||||||||||||||||
417 | pmd[qsize - 1] |= 0x01; | - | ||||||||||||||||||
418 | if (!BN_bin2bn(pmd, qsize, q))
| 0 | ||||||||||||||||||
419 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
420 | - | |||||||||||||||||||
421 | /* step 4 */ | - | ||||||||||||||||||
422 | r = BN_is_prime_fasttest_ex(q, DSS_prime_checks, ctx, | - | ||||||||||||||||||
423 | seed_in ? 1 : 0, cb); | - | ||||||||||||||||||
424 | if (r > 0)
| 0 | ||||||||||||||||||
425 | break; never executed: break; | 0 | ||||||||||||||||||
426 | if (r != 0)
| 0 | ||||||||||||||||||
427 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
428 | /* Provided seed didn't produce a prime: error */ | - | ||||||||||||||||||
429 | if (seed_in) {
| 0 | ||||||||||||||||||
430 | ok = 0; | - | ||||||||||||||||||
431 | DSAerr(DSA_F_DSA_BUILTIN_PARAMGEN2, DSA_R_Q_NOT_PRIME); | - | ||||||||||||||||||
432 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
433 | } | - | ||||||||||||||||||
434 | - | |||||||||||||||||||
435 | /* do a callback call */ | - | ||||||||||||||||||
436 | /* step 5 */ | - | ||||||||||||||||||
437 | } never executed: end of block | 0 | ||||||||||||||||||
438 | /* Copy seed to seed_out before we mess with it */ | - | ||||||||||||||||||
439 | if (seed_out)
| 0 | ||||||||||||||||||
440 | memcpy(seed_out, seed, seed_len); never executed: memcpy(seed_out, seed, seed_len); | 0 | ||||||||||||||||||
441 | - | |||||||||||||||||||
442 | if (!BN_GENCB_call(cb, 2, 0))
| 0 | ||||||||||||||||||
443 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
444 | if (!BN_GENCB_call(cb, 3, 0))
| 0 | ||||||||||||||||||
445 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
446 | - | |||||||||||||||||||
447 | /* step 6 */ | - | ||||||||||||||||||
448 | counter = 0; | - | ||||||||||||||||||
449 | /* "offset = 1" */ | - | ||||||||||||||||||
450 | - | |||||||||||||||||||
451 | n = (L - 1) / (mdsize << 3); | - | ||||||||||||||||||
452 | - | |||||||||||||||||||
453 | for (;;) { | - | ||||||||||||||||||
454 | if ((counter != 0) && !BN_GENCB_call(cb, 0, counter))
| 0 | ||||||||||||||||||
455 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
456 | - | |||||||||||||||||||
457 | /* step 7 */ | - | ||||||||||||||||||
458 | BN_zero(W); | - | ||||||||||||||||||
459 | /* now 'buf' contains "SEED + offset - 1" */ | - | ||||||||||||||||||
460 | for (k = 0; k <= n; k++) {
| 0 | ||||||||||||||||||
461 | /* | - | ||||||||||||||||||
462 | * obtain "SEED + offset + k" by incrementing: | - | ||||||||||||||||||
463 | */ | - | ||||||||||||||||||
464 | for (i = seed_len - 1; i >= 0; i--) {
| 0 | ||||||||||||||||||
465 | seed[i]++; | - | ||||||||||||||||||
466 | if (seed[i] != 0)
| 0 | ||||||||||||||||||
467 | break; never executed: break; | 0 | ||||||||||||||||||
468 | } never executed: end of block | 0 | ||||||||||||||||||
469 | - | |||||||||||||||||||
470 | if (!EVP_Digest(seed, seed_len, md, NULL, evpmd, NULL))
| 0 | ||||||||||||||||||
471 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
472 | - | |||||||||||||||||||
473 | /* step 8 */ | - | ||||||||||||||||||
474 | if (!BN_bin2bn(md, mdsize, r0))
| 0 | ||||||||||||||||||
475 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
476 | if (!BN_lshift(r0, r0, (mdsize << 3) * k))
| 0 | ||||||||||||||||||
477 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
478 | if (!BN_add(W, W, r0))
| 0 | ||||||||||||||||||
479 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
480 | } never executed: end of block | 0 | ||||||||||||||||||
481 | - | |||||||||||||||||||
482 | /* more of step 8 */ | - | ||||||||||||||||||
483 | if (!BN_mask_bits(W, L - 1))
| 0 | ||||||||||||||||||
484 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
485 | if (!BN_copy(X, W))
| 0 | ||||||||||||||||||
486 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
487 | if (!BN_add(X, X, test))
| 0 | ||||||||||||||||||
488 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
489 | - | |||||||||||||||||||
490 | /* step 9 */ | - | ||||||||||||||||||
491 | if (!BN_lshift1(r0, q))
| 0 | ||||||||||||||||||
492 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
493 | if (!BN_mod(c, X, r0, ctx))
| 0 | ||||||||||||||||||
494 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
495 | if (!BN_sub(r0, c, BN_value_one()))
| 0 | ||||||||||||||||||
496 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
497 | if (!BN_sub(p, X, r0))
| 0 | ||||||||||||||||||
498 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
499 | - | |||||||||||||||||||
500 | /* step 10 */ | - | ||||||||||||||||||
501 | if (BN_cmp(p, test) >= 0) {
| 0 | ||||||||||||||||||
502 | /* step 11 */ | - | ||||||||||||||||||
503 | r = BN_is_prime_fasttest_ex(p, DSS_prime_checks, ctx, 1, cb); | - | ||||||||||||||||||
504 | if (r > 0)
| 0 | ||||||||||||||||||
505 | goto end; /* found it */ never executed: goto end; | 0 | ||||||||||||||||||
506 | if (r != 0)
| 0 | ||||||||||||||||||
507 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
508 | } never executed: end of block | 0 | ||||||||||||||||||
509 | - | |||||||||||||||||||
510 | /* step 13 */ | - | ||||||||||||||||||
511 | counter++; | - | ||||||||||||||||||
512 | /* "offset = offset + n + 1" */ | - | ||||||||||||||||||
513 | - | |||||||||||||||||||
514 | /* step 14 */ | - | ||||||||||||||||||
515 | if (counter >= (int)(4 * L))
| 0 | ||||||||||||||||||
516 | break; never executed: break; | 0 | ||||||||||||||||||
517 | } never executed: end of block | 0 | ||||||||||||||||||
518 | if (seed_in) {
| 0 | ||||||||||||||||||
519 | ok = 0; | - | ||||||||||||||||||
520 | DSAerr(DSA_F_DSA_BUILTIN_PARAMGEN2, DSA_R_INVALID_PARAMETERS); | - | ||||||||||||||||||
521 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
522 | } | - | ||||||||||||||||||
523 | } never executed: end of block | 0 | ||||||||||||||||||
524 | end: code before this statement never executed: end: | 0 | ||||||||||||||||||
525 | if (!BN_GENCB_call(cb, 2, 1))
| 0 | ||||||||||||||||||
526 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
527 | - | |||||||||||||||||||
528 | g_only: code before this statement never executed: g_only: | 0 | ||||||||||||||||||
529 | - | |||||||||||||||||||
530 | /* We now need to generate g */ | - | ||||||||||||||||||
531 | /* Set r0=(p-1)/q */ | - | ||||||||||||||||||
532 | if (!BN_sub(test, p, BN_value_one()))
| 0 | ||||||||||||||||||
533 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
534 | if (!BN_div(r0, NULL, test, q, ctx))
| 0 | ||||||||||||||||||
535 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
536 | - | |||||||||||||||||||
537 | if (idx < 0) {
| 0 | ||||||||||||||||||
538 | if (!BN_set_word(test, h))
| 0 | ||||||||||||||||||
539 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
540 | } else never executed: end of block | 0 | ||||||||||||||||||
541 | h = 1; never executed: h = 1; | 0 | ||||||||||||||||||
542 | if (!BN_MONT_CTX_set(mont, p, ctx))
| 0 | ||||||||||||||||||
543 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
544 | - | |||||||||||||||||||
545 | for (;;) { | - | ||||||||||||||||||
546 | static const unsigned char ggen[4] = { 0x67, 0x67, 0x65, 0x6e }; | - | ||||||||||||||||||
547 | if (idx >= 0) {
| 0 | ||||||||||||||||||
548 | md[0] = idx & 0xff; | - | ||||||||||||||||||
549 | md[1] = (h >> 8) & 0xff; | - | ||||||||||||||||||
550 | md[2] = h & 0xff; | - | ||||||||||||||||||
551 | if (!EVP_DigestInit_ex(mctx, evpmd, NULL))
| 0 | ||||||||||||||||||
552 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
553 | if (!EVP_DigestUpdate(mctx, seed_tmp, seed_len))
| 0 | ||||||||||||||||||
554 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
555 | if (!EVP_DigestUpdate(mctx, ggen, sizeof(ggen)))
| 0 | ||||||||||||||||||
556 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
557 | if (!EVP_DigestUpdate(mctx, md, 3))
| 0 | ||||||||||||||||||
558 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
559 | if (!EVP_DigestFinal_ex(mctx, md, NULL))
| 0 | ||||||||||||||||||
560 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
561 | if (!BN_bin2bn(md, mdsize, test))
| 0 | ||||||||||||||||||
562 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
563 | } never executed: end of block | 0 | ||||||||||||||||||
564 | /* g=test^r0%p */ | - | ||||||||||||||||||
565 | if (!BN_mod_exp_mont(g, test, r0, p, ctx, mont))
| 0 | ||||||||||||||||||
566 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
567 | if (!BN_is_one(g))
| 0 | ||||||||||||||||||
568 | break; never executed: break; | 0 | ||||||||||||||||||
569 | if (idx < 0 && !BN_add(test, test, BN_value_one()))
| 0 | ||||||||||||||||||
570 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
571 | h++; | - | ||||||||||||||||||
572 | if (idx >= 0 && h > 0xffff)
| 0 | ||||||||||||||||||
573 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
574 | } never executed: end of block | 0 | ||||||||||||||||||
575 | - | |||||||||||||||||||
576 | if (!BN_GENCB_call(cb, 3, 1))
| 0 | ||||||||||||||||||
577 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
578 | - | |||||||||||||||||||
579 | ok = 1; | - | ||||||||||||||||||
580 | err: code before this statement never executed: err: | 0 | ||||||||||||||||||
581 | if (ok == 1) {
| 0 | ||||||||||||||||||
582 | if (p != ret->p) {
| 0 | ||||||||||||||||||
583 | BN_free(ret->p); | - | ||||||||||||||||||
584 | ret->p = BN_dup(p); | - | ||||||||||||||||||
585 | } never executed: end of block | 0 | ||||||||||||||||||
586 | if (q != ret->q) {
| 0 | ||||||||||||||||||
587 | BN_free(ret->q); | - | ||||||||||||||||||
588 | ret->q = BN_dup(q); | - | ||||||||||||||||||
589 | } never executed: end of block | 0 | ||||||||||||||||||
590 | BN_free(ret->g); | - | ||||||||||||||||||
591 | ret->g = BN_dup(g); | - | ||||||||||||||||||
592 | if (ret->p == NULL || ret->q == NULL || ret->g == NULL) {
| 0 | ||||||||||||||||||
593 | ok = -1; | - | ||||||||||||||||||
594 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
595 | } | - | ||||||||||||||||||
596 | if (counter_ret != NULL)
| 0 | ||||||||||||||||||
597 | *counter_ret = counter; never executed: *counter_ret = counter; | 0 | ||||||||||||||||||
598 | if (h_ret != NULL)
| 0 | ||||||||||||||||||
599 | *h_ret = h; never executed: *h_ret = h; | 0 | ||||||||||||||||||
600 | } never executed: end of block | 0 | ||||||||||||||||||
601 | OPENSSL_free(seed); | - | ||||||||||||||||||
602 | if (seed_out != seed_tmp)
| 0 | ||||||||||||||||||
603 | OPENSSL_free(seed_tmp); never executed: CRYPTO_free(seed_tmp, __FILE__, 603); | 0 | ||||||||||||||||||
604 | if (ctx)
| 0 | ||||||||||||||||||
605 | BN_CTX_end(ctx); never executed: BN_CTX_end(ctx); | 0 | ||||||||||||||||||
606 | BN_CTX_free(ctx); | - | ||||||||||||||||||
607 | BN_MONT_CTX_free(mont); | - | ||||||||||||||||||
608 | EVP_MD_CTX_free(mctx); | - | ||||||||||||||||||
609 | return ok; never executed: return ok; | 0 | ||||||||||||||||||
610 | } | - | ||||||||||||||||||
Source code | Switch to Preprocessed file |