static CRYPTO_RWLOCK *rand_nonce_lock;
static int rand_nonce_count;
+static int rand_cleaning_up = 0;
+
#ifdef OPENSSL_RAND_SEED_RDTSC
/*
* IMPORTANT NOTE: It is not currently possible to use this code
if (RAND_DRBG_generate(drbg->parent,
buffer, bytes_needed,
prediction_resistance,
- (unsigned char *)drbg, sizeof(*drbg)) != 0)
+ NULL, 0) != 0)
bytes = bytes_needed;
rand_drbg_unlock(drbg->parent);
if (rand_nonce_lock == NULL)
goto err2;
+ if (!rand_cleaning_up && !rand_pool_init())
+ goto err3;
+
return 1;
+err3:
+ rand_pool_cleanup();
err2:
CRYPTO_THREAD_lock_free(rand_meth_lock);
rand_meth_lock = NULL;
{
const RAND_METHOD *meth = default_RAND_meth;
+ rand_cleaning_up = 1;
+
if (meth != NULL && meth->cleanup != NULL)
meth->cleanup();
RAND_set_rand_method(NULL);
+ rand_pool_cleanup();
#ifndef OPENSSL_NO_ENGINE
CRYPTO_THREAD_lock_free(rand_engine_lock);
rand_engine_lock = NULL;
rand_nonce_lock = NULL;
}
+/*
+ * RAND_close_seed_files() ensures that any seed file decriptors are
+ * closed after use.
+ */
+void RAND_keep_random_devices_open(int keep)
+{
+ rand_pool_keep_random_devices_open(keep);
+}
+
/*
* RAND_poll() reseeds the default RNG using random input
*