From c16de9d8329d41a2433d0f273c080d9d06ad7a87 Mon Sep 17 00:00:00 2001 From: "Dr. Matthias St. Pierre" Date: Thu, 31 Aug 2017 23:16:22 +0200 Subject: Fix reseeding issues of the public RAND_DRBG Reseeding is handled very differently by the classic RAND_METHOD API and the new RAND_DRBG api. These differences led to some problems when the new RAND_DRBG was made the default OpenSSL RNG. In particular, RAND_add() did not work as expected anymore. These issues are discussed on the thread '[openssl-dev] Plea for a new public OpenSSL RNG API' and in Pull Request #4328. This commit fixes the mentioned issues, introducing the following changes: - Replace the fixed size RAND_BYTES_BUFFER by a new RAND_POOL API which facilitates collecting entropy by the get_entropy() callback. - Don't use RAND_poll()/RAND_add() for collecting entropy from the get_entropy() callback anymore. Instead, replace RAND_poll() by RAND_POOL_acquire_entropy(). - Add a new function rand_drbg_restart() which tries to get the DRBG in an instantiated state by all means, regardless of the current state (uninstantiated, error, ...) the DRBG is in. If the caller provides entropy or additional input, it will be used for reseeding. - Restore the original documented behaviour of RAND_add() and RAND_poll() (namely to reseed the DRBG immediately) by a new implementation based on rand_drbg_restart(). - Add automatic error recovery from temporary failures of the entropy source to RAND_DRBG_generate() using the rand_drbg_restart() function. Reviewed-by: Paul Dale Reviewed-by: Kurt Roeckx Reviewed-by: Rich Salz Reviewed-by: Ben Kaduk (Merged from https://github.com/openssl/openssl/pull/4328) --- test/drbgtest.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test/drbgtest.c') diff --git a/test/drbgtest.c b/test/drbgtest.c index 7d33c3035d..25920d6e40 100644 --- a/test/drbgtest.c +++ b/test/drbgtest.c @@ -481,7 +481,7 @@ static int test_rand_add(void) { char *p; - if (!TEST_ptr(p = malloc(RAND_ADD_SIZE))) + if (!TEST_ptr(p = calloc(RAND_ADD_SIZE, 1))) return 0; RAND_add(p, RAND_ADD_SIZE, RAND_ADD_SIZE); free(p); -- cgit v1.2.3