diff options
author | Bodo Möller <bodo@openssl.org> | 2002-08-02 15:02:03 +0000 |
---|---|---|
committer | Bodo Möller <bodo@openssl.org> | 2002-08-02 15:02:03 +0000 |
commit | 95ecacf8a28ce7a782d3bd733483b8776a23b79f (patch) | |
tree | b4450ef1832a5ddbb5e0a700fd2c6fffa3ca56af | |
parent | be8a280e0b24b78c702b260d70ceb7e0604d226c (diff) |
Let BN_rand_range() abort with an error after 100 iterations
without success.
-rw-r--r-- | CHANGES | 4 | ||||
-rw-r--r-- | crypto/bn/bn_rand.c | 14 |
2 files changed, 18 insertions, 0 deletions
@@ -4,6 +4,10 @@ Changes between 0.9.7 and 0.9.8 [xx XXX 2002] + *) Let BN_rand_range() abort with an error after 100 iterations + without success (which indicates a broken PRNG). + [Bodo Moeller] + *) Change BN_mod_sqrt() so that it verifies that the input value is really the square of the return value. (Previously, BN_mod_sqrt would show GIGO behaviour.) diff --git a/crypto/bn/bn_rand.c b/crypto/bn/bn_rand.c index 9e08ccd22e..e6705f7025 100644 --- a/crypto/bn/bn_rand.c +++ b/crypto/bn/bn_rand.c @@ -230,6 +230,7 @@ static int bn_rand_range(int pseudo, BIGNUM *r, BIGNUM *range) { int (*bn_rand)(BIGNUM *, int, int, int) = pseudo ? BN_pseudo_rand : BN_rand; int n; + int count = 100; if (range->neg || BN_is_zero(range)) { @@ -263,6 +264,13 @@ static int bn_rand_range(int pseudo, BIGNUM *r, BIGNUM *range) if (BN_cmp(r, range) >= 0) if (!BN_sub(r, r, range)) return 0; } + + if (!--count) + { + BNerr(BN_F_BN_RAND_RANGE, BN_R_TOO_MANY_ITERATIONS); + return 0; + } + } while (BN_cmp(r, range) >= 0); } @@ -272,6 +280,12 @@ static int bn_rand_range(int pseudo, BIGNUM *r, BIGNUM *range) { /* range = 11..._2 or range = 101..._2 */ if (!bn_rand(r, n, -1, 0)) return 0; + + if (!--count) + { + BNerr(BN_F_BN_RAND_RANGE, BN_R_TOO_MANY_ITERATIONS); + return 0; + } } while (BN_cmp(r, range) >= 0); } |