#include <openssl/rand.h>
+#ifdef BN_DEBUG
+# define PREDICT
+#endif
+
/* #define NORAND 1 */
/* #define PREDICT 1 */
static double entropy=0;
static int initialized=0;
+#ifdef PREDICT
+int rand_predictable=0;
+#endif
+
const char *RAND_version="RAND" OPENSSL_VERSION_PTEXT;
static void ssleay_rand_cleanup(void);
static void ssleay_rand_add(const void *buf, int num, double add_entropy);
static int ssleay_rand_bytes(unsigned char *buf, int num);
static int ssleay_rand_pseudo_bytes(unsigned char *buf, int num);
+static int ssleay_rand_status(void);
RAND_METHOD rand_ssleay_meth={
ssleay_rand_seed,
ssleay_rand_cleanup,
ssleay_rand_add,
ssleay_rand_pseudo_bytes,
+ ssleay_rand_status
};
RAND_METHOD *RAND_SSLeay(void)
{
md[k] ^= local_md[k];
}
+ if (entropy < ENTROPY_NEEDED) /* stop counting when we have enough */
+ entropy += add;
CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
#ifndef THREADS
assert(md_c[1] == md_count[1]);
#endif
- if (entropy < ENTROPY_NEEDED) /* stop counting when we have enough */
- entropy += add;
}
static void ssleay_rand_seed(const void *buf, int num)
FILE *fh;
#endif
+#ifdef NORAND
+ return;
+#endif
+
CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
/* put in some default random data, we need more than just this */
#ifndef GETPID_IS_MEANINGLESS
RAND_add(&l,sizeof(l),0);
#ifdef DEVRANDOM
- /* Use a random entropy pool device. Linux and FreeBSD have
- * this. Use /dev/urandom if you can as /dev/random will block
+ /* Use a random entropy pool device. Linux, FreeBSD and OpenBSD
+ * have this. Use /dev/urandom if you can as /dev/random may block
* if it runs out of random entries. */
if ((fh = fopen(DEVRANDOM, "r")) != NULL)
#endif
#ifdef PREDICT
- {
- static unsigned char val=0;
+ if (rand_predictable)
+ {
+ static unsigned char val=0;
- for (i=0; i<num; i++)
- buf[i]=val++;
- return(1);
- }
+ for (i=0; i<num; i++)
+ buf[i]=val++;
+ return(1);
+ }
#endif
/*
ssleay_rand_initialize();
ok = (entropy >= ENTROPY_NEEDED);
+ if (!ok)
+ {
+ /* If the PRNG state is not yet unpredictable, then seeing
+ * the PRNG output may help attackers to determine the new
+ * state; thus we have to decrease the entropy estimate.
+ * Once we've had enough initial seeding we don't bother to
+ * adjust the entropy count, though, because we're not ambitious
+ * to provide *information-theoretic* randomness.
+ */
+ entropy -= num;
+ if (entropy < 0)
+ entropy = 0;
+ }
st_idx=state_index;
st_num=state_num;
return (ret);
}
-int RAND_status(void)
+static int ssleay_rand_status(void)
{
if (!initialized)
ssleay_rand_initialize();