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