projects
/
openssl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add missing include of cryptlib.h
[openssl.git]
/
crypto
/
bn
/
bn_rand.c
diff --git
a/crypto/bn/bn_rand.c
b/crypto/bn/bn_rand.c
index a7c7309888fd57124b8364c464deb41814380585..d7b17d5d45438ed5b40eefb5d7d967ff0b62c1fc 100644
(file)
--- a/
crypto/bn/bn_rand.c
+++ b/
crypto/bn/bn_rand.c
@@
-14,11
+14,14
@@
#include <openssl/rand.h>
#include <openssl/sha.h>
#include <openssl/rand.h>
#include <openssl/sha.h>
-static int bnrand(int testing, BIGNUM *rnd, int bits, int top, int bottom)
+typedef enum bnrand_flag_e {
+ NORMAL, TESTING, PRIVATE
+} BNRAND_FLAG;
+
+static int bnrand(BNRAND_FLAG flag, BIGNUM *rnd, int bits, int top, int bottom)
{
unsigned char *buf = NULL;
{
unsigned char *buf = NULL;
- int ret = 0, bit, bytes, mask;
- time_t tim;
+ int b, ret = 0, bit, bytes, mask;
if (bits == 0) {
if (top != BN_RAND_TOP_ANY || bottom != BN_RAND_BOTTOM_ANY)
if (bits == 0) {
if (top != BN_RAND_TOP_ANY || bottom != BN_RAND_BOTTOM_ANY)
@@
-40,13
+43,11
@@
static int bnrand(int testing, BIGNUM *rnd, int bits, int top, int bottom)
}
/* make a random number and set the top and bottom bits */
}
/* make a random number and set the top and bottom bits */
- time(&tim);
- RAND_add(&tim, sizeof(tim), 0.0);
-
- if (RAND_bytes(buf, bytes) <= 0)
+ b = flag == NORMAL ? RAND_bytes(buf, bytes) : RAND_priv_bytes(buf, bytes);
+ if (b <= 0)
goto err;
goto err;
- if (
testing
) {
+ if (
flag == TESTING
) {
/*
* generate patterns that are more likely to trigger BN library bugs
*/
/*
* generate patterns that are more likely to trigger BN library bugs
*/
@@
-95,22
+96,27
@@
toosmall:
int BN_rand(BIGNUM *rnd, int bits, int top, int bottom)
{
int BN_rand(BIGNUM *rnd, int bits, int top, int bottom)
{
- return bnrand(
0
, rnd, bits, top, bottom);
+ return bnrand(
NORMAL
, rnd, bits, top, bottom);
}
int BN_bntest_rand(BIGNUM *rnd, int bits, int top, int bottom)
{
}
int BN_bntest_rand(BIGNUM *rnd, int bits, int top, int bottom)
{
- return bnrand(1, rnd, bits, top, bottom);
+ return bnrand(TESTING, rnd, bits, top, bottom);
+}
+
+int BN_priv_rand(BIGNUM *rnd, int bits, int top, int bottom)
+{
+ return bnrand(PRIVATE, rnd, bits, top, bottom);
}
/* random number r: 0 <= r < range */
}
/* random number r: 0 <= r < range */
-
int BN_rand_range(
BIGNUM *r, const BIGNUM *range)
+
static int bnrand_range(BNRAND_FLAG flag,
BIGNUM *r, const BIGNUM *range)
{
{
- int n;
+ int
b,
n;
int count = 100;
if (range->neg || BN_is_zero(range)) {
int count = 100;
if (range->neg || BN_is_zero(range)) {
- BNerr(BN_F_BN
_
RAND_RANGE, BN_R_INVALID_RANGE);
+ BNerr(BN_F_BNRAND_RANGE, BN_R_INVALID_RANGE);
return 0;
}
return 0;
}
@@
-126,7
+132,10
@@
int BN_rand_range(BIGNUM *r, const BIGNUM *range)
* than range
*/
do {
* than range
*/
do {
- if (!BN_rand(r, n + 1, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY))
+ b = flag == NORMAL
+ ? BN_rand(r, n + 1, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY)
+ : BN_priv_rand(r, n + 1, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY);
+ if (!b)
return 0;
/*
* If r < 3*range, use r := r MOD range (which is either r, r -
return 0;
/*
* If r < 3*range, use r := r MOD range (which is either r, r -
@@
-143,7
+152,7
@@
int BN_rand_range(BIGNUM *r, const BIGNUM *range)
}
if (!--count) {
}
if (!--count) {
- BNerr(BN_F_BN
_
RAND_RANGE, BN_R_TOO_MANY_ITERATIONS);
+ BNerr(BN_F_BNRAND_RANGE, BN_R_TOO_MANY_ITERATIONS);
return 0;
}
return 0;
}
@@
-156,7
+165,7
@@
int BN_rand_range(BIGNUM *r, const BIGNUM *range)
return 0;
if (!--count) {
return 0;
if (!--count) {
- BNerr(BN_F_BN
_
RAND_RANGE, BN_R_TOO_MANY_ITERATIONS);
+ BNerr(BN_F_BNRAND_RANGE, BN_R_TOO_MANY_ITERATIONS);
return 0;
}
}
return 0;
}
}
@@
-167,6
+176,16
@@
int BN_rand_range(BIGNUM *r, const BIGNUM *range)
return 1;
}
return 1;
}
+int BN_rand_range(BIGNUM *r, const BIGNUM *range)
+{
+ return bnrand_range(NORMAL, r, range);
+}
+
+int BN_priv_rand_range(BIGNUM *r, const BIGNUM *range)
+{
+ return bnrand_range(PRIVATE, r, range);
+}
+
int BN_pseudo_rand(BIGNUM *rnd, int bits, int top, int bottom)
{
return BN_rand(rnd, bits, top, bottom);
int BN_pseudo_rand(BIGNUM *rnd, int bits, int top, int bottom)
{
return BN_rand(rnd, bits, top, bottom);