diff options
Diffstat (limited to 'src/lib/libcrypto/dsa/dsa_gen.c')
-rw-r--r-- | src/lib/libcrypto/dsa/dsa_gen.c | 45 |
1 files changed, 18 insertions, 27 deletions
diff --git a/src/lib/libcrypto/dsa/dsa_gen.c b/src/lib/libcrypto/dsa/dsa_gen.c index e40afeea51..dc9c249310 100644 --- a/src/lib/libcrypto/dsa/dsa_gen.c +++ b/src/lib/libcrypto/dsa/dsa_gen.c | |||
@@ -80,7 +80,6 @@ | |||
80 | #include <openssl/rand.h> | 80 | #include <openssl/rand.h> |
81 | #include <openssl/sha.h> | 81 | #include <openssl/sha.h> |
82 | 82 | ||
83 | #ifndef OPENSSL_FIPS | ||
84 | DSA *DSA_generate_parameters(int bits, | 83 | DSA *DSA_generate_parameters(int bits, |
85 | unsigned char *seed_in, int seed_len, | 84 | unsigned char *seed_in, int seed_len, |
86 | int *counter_ret, unsigned long *h_ret, | 85 | int *counter_ret, unsigned long *h_ret, |
@@ -128,9 +127,8 @@ DSA *DSA_generate_parameters(int bits, | |||
128 | c = BN_CTX_get(ctx2); | 127 | c = BN_CTX_get(ctx2); |
129 | p = BN_CTX_get(ctx2); | 128 | p = BN_CTX_get(ctx2); |
130 | test = BN_CTX_get(ctx2); | 129 | test = BN_CTX_get(ctx2); |
131 | if (test == NULL) goto err; | ||
132 | 130 | ||
133 | if (!BN_lshift(test,BN_value_one(),bits-1)) goto err; | 131 | BN_lshift(test,BN_value_one(),bits-1); |
134 | 132 | ||
135 | for (;;) | 133 | for (;;) |
136 | { | 134 | { |
@@ -198,7 +196,7 @@ DSA *DSA_generate_parameters(int bits, | |||
198 | callback(0,counter,cb_arg); | 196 | callback(0,counter,cb_arg); |
199 | 197 | ||
200 | /* step 7 */ | 198 | /* step 7 */ |
201 | if (!BN_zero(W)) goto err; | 199 | BN_zero(W); |
202 | /* now 'buf' contains "SEED + offset - 1" */ | 200 | /* now 'buf' contains "SEED + offset - 1" */ |
203 | for (k=0; k<=n; k++) | 201 | for (k=0; k<=n; k++) |
204 | { | 202 | { |
@@ -214,20 +212,20 @@ DSA *DSA_generate_parameters(int bits, | |||
214 | /* step 8 */ | 212 | /* step 8 */ |
215 | if (!BN_bin2bn(md,SHA_DIGEST_LENGTH,r0)) | 213 | if (!BN_bin2bn(md,SHA_DIGEST_LENGTH,r0)) |
216 | goto err; | 214 | goto err; |
217 | if (!BN_lshift(r0,r0,160*k)) goto err; | 215 | BN_lshift(r0,r0,160*k); |
218 | if (!BN_add(W,W,r0)) goto err; | 216 | BN_add(W,W,r0); |
219 | } | 217 | } |
220 | 218 | ||
221 | /* more of step 8 */ | 219 | /* more of step 8 */ |
222 | if (!BN_mask_bits(W,bits-1)) goto err; | 220 | BN_mask_bits(W,bits-1); |
223 | if (!BN_copy(X,W)) goto err; | 221 | BN_copy(X,W); /* this should be ok */ |
224 | if (!BN_add(X,X,test)) goto err; | 222 | BN_add(X,X,test); /* this should be ok */ |
225 | 223 | ||
226 | /* step 9 */ | 224 | /* step 9 */ |
227 | if (!BN_lshift1(r0,q)) goto err; | 225 | BN_lshift1(r0,q); |
228 | if (!BN_mod(c,X,r0,ctx)) goto err; | 226 | BN_mod(c,X,r0,ctx); |
229 | if (!BN_sub(r0,c,BN_value_one())) goto err; | 227 | BN_sub(r0,c,BN_value_one()); |
230 | if (!BN_sub(p,X,r0)) goto err; | 228 | BN_sub(p,X,r0); |
231 | 229 | ||
232 | /* step 10 */ | 230 | /* step 10 */ |
233 | if (BN_cmp(p,test) >= 0) | 231 | if (BN_cmp(p,test) >= 0) |
@@ -253,18 +251,18 @@ end: | |||
253 | 251 | ||
254 | /* We now need to generate g */ | 252 | /* We now need to generate g */ |
255 | /* Set r0=(p-1)/q */ | 253 | /* Set r0=(p-1)/q */ |
256 | if (!BN_sub(test,p,BN_value_one())) goto err; | 254 | BN_sub(test,p,BN_value_one()); |
257 | if (!BN_div(r0,NULL,test,q,ctx)) goto err; | 255 | BN_div(r0,NULL,test,q,ctx); |
258 | 256 | ||
259 | if (!BN_set_word(test,h)) goto err; | 257 | BN_set_word(test,h); |
260 | if (!BN_MONT_CTX_set(mont,p,ctx)) goto err; | 258 | BN_MONT_CTX_set(mont,p,ctx); |
261 | 259 | ||
262 | for (;;) | 260 | for (;;) |
263 | { | 261 | { |
264 | /* g=test^r0%p */ | 262 | /* g=test^r0%p */ |
265 | if (!BN_mod_exp_mont(g,test,r0,p,ctx,mont)) goto err; | 263 | BN_mod_exp_mont(g,test,r0,p,ctx,mont); |
266 | if (!BN_is_one(g)) break; | 264 | if (!BN_is_one(g)) break; |
267 | if (!BN_add(test,test,BN_value_one())) goto err; | 265 | BN_add(test,test,BN_value_one()); |
268 | h++; | 266 | h++; |
269 | } | 267 | } |
270 | 268 | ||
@@ -281,11 +279,6 @@ err: | |||
281 | ret->p=BN_dup(p); | 279 | ret->p=BN_dup(p); |
282 | ret->q=BN_dup(q); | 280 | ret->q=BN_dup(q); |
283 | ret->g=BN_dup(g); | 281 | ret->g=BN_dup(g); |
284 | if (ret->p == NULL || ret->q == NULL || ret->g == NULL) | ||
285 | { | ||
286 | ok=0; | ||
287 | goto err; | ||
288 | } | ||
289 | if ((m > 1) && (seed_in != NULL)) memcpy(seed_in,seed,20); | 282 | if ((m > 1) && (seed_in != NULL)) memcpy(seed_in,seed,20); |
290 | if (counter_ret != NULL) *counter_ret=counter; | 283 | if (counter_ret != NULL) *counter_ret=counter; |
291 | if (h_ret != NULL) *h_ret=h; | 284 | if (h_ret != NULL) *h_ret=h; |
@@ -300,6 +293,4 @@ err: | |||
300 | if (mont != NULL) BN_MONT_CTX_free(mont); | 293 | if (mont != NULL) BN_MONT_CTX_free(mont); |
301 | return(ok?ret:NULL); | 294 | return(ok?ret:NULL); |
302 | } | 295 | } |
303 | #endif /* ndef OPENSSL_FIPS */ | 296 | #endif |
304 | #endif /* ndef OPENSSL_NO_SHA */ | ||
305 | |||