From faa624f9f9d0801b9a86eb2583dac45674390267 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ulf=20M=C3=B6ller?= Date: Tue, 20 Feb 2001 00:17:46 +0000 Subject: [PATCH] BN_rand_range() needs a BN_rand() variant that doesn't set the MSB. --- crypto/bn/bn_rand.c | 27 +++++++++++++++------------ doc/crypto/BN_rand.pod | 14 ++++++++------ 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/crypto/bn/bn_rand.c b/crypto/bn/bn_rand.c index 224a0ff7a2..b6f546b88e 100644 --- a/crypto/bn/bn_rand.c +++ b/crypto/bn/bn_rand.c @@ -100,24 +100,27 @@ static int bnrand(int pseudorand, BIGNUM *rnd, int bits, int top, int bottom) goto err; } - if (top) + if (top != -1) { - if (bit == 0) + if (top) { - buf[0]=1; - buf[1]|=0x80; + if (bit == 0) + { + buf[0]=1; + buf[1]|=0x80; + } + else + { + buf[0]|=(3<<(bit-1)); + buf[0]&= ~(mask<<1); + } } else { - buf[0]|=(3<<(bit-1)); + buf[0]|=(1<= .75 */ - if (!BN_rand(r, n, 0, 0)) return 0; + if (!BN_rand(r, n, -1, 0)) return 0; } while (BN_cmp(r, range) >= 0); } @@ -173,7 +176,7 @@ int BN_rand_range(BIGNUM *r, BIGNUM *range) * so 3*range (= 11..._2) is exactly one bit longer than range */ do { - if (!BN_rand(r, n + 1, 0, 0)) return 0; + if (!BN_rand(r, n + 1, -1, 0)) return 0; /* If r < 3*range, use r := r MOD range * (which is either r, r - range, or r - 2*range). * Otherwise, iterate once more. diff --git a/doc/crypto/BN_rand.pod b/doc/crypto/BN_rand.pod index 2a8bed5fed..cbae2fca97 100644 --- a/doc/crypto/BN_rand.pod +++ b/doc/crypto/BN_rand.pod @@ -17,10 +17,12 @@ BN_rand, BN_pseudo_rand - generate pseudo-random number =head1 DESCRIPTION BN_rand() generates a cryptographically strong pseudo-random number of -B bits in length and stores it in B. If B is true, the -two most significant bits of the number will be set to 1, so that the -product of two such random numbers will always have 2*B length. -If B is true, the number will be odd. +B bits in length and stores it in B. If B is -1, the +most significant bit of the random number can be zero. If B is 0, +it is set to 1, and if B is 1, the two most significant bits of +the number will be set to 1, so that the product of two such random +numbers will always have 2*B length. If B is true, the +number will be odd. BN_pseudo_rand() does the same, but pseudo-random numbers generated by this function are not necessarily unpredictable. They can be used for @@ -45,7 +47,7 @@ L, L =head1 HISTORY BN_rand() is available in all versions of SSLeay and OpenSSL. -BN_pseudo_rand() was added in OpenSSL 0.9.5, and BN_rand_range() -in OpenSSL 0.9.6a. +BN_pseudo_rand() was added in OpenSSL 0.9.5. The B == -1 case +and the function BN_rand_range() were added in OpenSSL 0.9.6a. =cut -- 2.25.1