diff options
Diffstat (limited to 'src/lib/libcrypto/dh/dh_key.c')
| -rw-r--r-- | src/lib/libcrypto/dh/dh_key.c | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/src/lib/libcrypto/dh/dh_key.c b/src/lib/libcrypto/dh/dh_key.c index e7db440342..89a74db4e6 100644 --- a/src/lib/libcrypto/dh/dh_key.c +++ b/src/lib/libcrypto/dh/dh_key.c | |||
| @@ -73,11 +73,27 @@ static int dh_finish(DH *dh); | |||
| 73 | 73 | ||
| 74 | int DH_generate_key(DH *dh) | 74 | int DH_generate_key(DH *dh) |
| 75 | { | 75 | { |
| 76 | #ifdef OPENSSL_FIPS | ||
| 77 | if (FIPS_mode() && !(dh->meth->flags & DH_FLAG_FIPS_METHOD) | ||
| 78 | && !(dh->flags & DH_FLAG_NON_FIPS_ALLOW)) | ||
| 79 | { | ||
| 80 | DHerr(DH_F_DH_GENERATE_KEY, DH_R_NON_FIPS_METHOD); | ||
| 81 | return 0; | ||
| 82 | } | ||
| 83 | #endif | ||
| 76 | return dh->meth->generate_key(dh); | 84 | return dh->meth->generate_key(dh); |
| 77 | } | 85 | } |
| 78 | 86 | ||
| 79 | int DH_compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh) | 87 | int DH_compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh) |
| 80 | { | 88 | { |
| 89 | #ifdef OPENSSL_FIPS | ||
| 90 | if (FIPS_mode() && !(dh->meth->flags & DH_FLAG_FIPS_METHOD) | ||
| 91 | && !(dh->flags & DH_FLAG_NON_FIPS_ALLOW)) | ||
| 92 | { | ||
| 93 | DHerr(DH_F_DH_COMPUTE_KEY, DH_R_NON_FIPS_METHOD); | ||
| 94 | return 0; | ||
| 95 | } | ||
| 96 | #endif | ||
| 81 | return dh->meth->compute_key(key, pub_key, dh); | 97 | return dh->meth->compute_key(key, pub_key, dh); |
| 82 | } | 98 | } |
| 83 | 99 | ||
| @@ -138,8 +154,21 @@ static int generate_key(DH *dh) | |||
| 138 | 154 | ||
| 139 | if (generate_new_key) | 155 | if (generate_new_key) |
| 140 | { | 156 | { |
| 141 | l = dh->length ? dh->length : BN_num_bits(dh->p)-1; /* secret exponent length */ | 157 | if (dh->q) |
| 142 | if (!BN_rand(priv_key, l, 0, 0)) goto err; | 158 | { |
| 159 | do | ||
| 160 | { | ||
| 161 | if (!BN_rand_range(priv_key, dh->q)) | ||
| 162 | goto err; | ||
| 163 | } | ||
| 164 | while (BN_is_zero(priv_key) || BN_is_one(priv_key)); | ||
| 165 | } | ||
| 166 | else | ||
| 167 | { | ||
| 168 | /* secret exponent length */ | ||
| 169 | l = dh->length ? dh->length : BN_num_bits(dh->p)-1; | ||
| 170 | if (!BN_rand(priv_key, l, 0, 0)) goto err; | ||
| 171 | } | ||
| 143 | } | 172 | } |
| 144 | 173 | ||
| 145 | { | 174 | { |
