From 97477c537e9e9d9b9a14ec2f965c9c6121ac818b Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Wed, 3 May 2017 03:07:53 -0700 Subject: [PATCH] Maintain state across GetStrongRandBytes calls --- src/random.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/random.cpp b/src/random.cpp index 6187f16290..6ec01b878f 100644 --- a/src/random.cpp +++ b/src/random.cpp @@ -32,6 +32,8 @@ #include #endif +#include + #include #include @@ -192,6 +194,10 @@ void GetRandBytes(unsigned char* buf, int num) } } +static std::mutex cs_rng_state; +static unsigned char rng_state[32] = {0}; +static uint64_t rng_counter = 0; + void GetStrongRandBytes(unsigned char* out, int num) { assert(num <= 32); @@ -207,8 +213,17 @@ void GetStrongRandBytes(unsigned char* out, int num) GetOSRand(buf); hasher.Write(buf, 32); + // Combine with and update state + { + std::unique_lock lock(cs_rng_state); + hasher.Write(rng_state, sizeof(rng_state)); + hasher.Write((const unsigned char*)&rng_counter, sizeof(rng_counter)); + ++rng_counter; + hasher.Finalize(buf); + memcpy(rng_state, buf + 32, 32); + } + // Produce output - hasher.Finalize(buf); memcpy(out, buf, num); memory_cleanse(buf, 64); }