From 61c1baa4bf5a97675187a37cf203e1937a060daa Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Thu, 31 Jan 2019 01:05:19 +0100 Subject: Windows: use CPU RDRAND or RDSEED as an additional entropy source for our random generator when available --- src/Common/Random.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) (limited to 'src/Common/Random.c') diff --git a/src/Common/Random.c b/src/Common/Random.c index 6c95cf6a..12e9d9af 100644 --- a/src/Common/Random.c +++ b/src/Common/Random.c @@ -14,6 +14,8 @@ #include "Tcdefs.h" #include "Crc.h" #include "Random.h" +#include "Crypto\cpu.h" +#include "Crypto\rdrand.h" #include static unsigned __int8 buffer[RNG_POOL_SIZE]; @@ -766,10 +768,6 @@ BOOL SlowPoll (void) if (CryptGenRandom (hCryptProv, sizeof (buffer), buffer)) { RandaddBuf (buffer, sizeof (buffer)); - - burn(buffer, sizeof (buffer)); - Randmix(); - return TRUE; } else { @@ -777,6 +775,19 @@ BOOL SlowPoll (void) CryptoAPILastError = GetLastError (); return FALSE; } + + // use RDSEED or RDRAND from CPU as source of entropy if present + if ( (HasRDSEED() && RDSEED_getBytes (buffer, sizeof (buffer))) + || (HasRDRAND() && RDRAND_getBytes (buffer, sizeof (buffer))) + ) + { + RandaddBuf (buffer, sizeof (buffer)); + } + + burn(buffer, sizeof (buffer)); + Randmix(); + + return TRUE; } @@ -888,7 +899,6 @@ BOOL FastPoll (void) if (CryptGenRandom (hCryptProv, sizeof (buffer), buffer)) { RandaddBuf (buffer, sizeof (buffer)); - burn (buffer, sizeof(buffer)); } else { @@ -897,6 +907,16 @@ BOOL FastPoll (void) return FALSE; } + // use RDSEED or RDRAND from CPU as source of entropy if present + if ( (HasRDSEED() && RDSEED_getBytes (buffer, sizeof (buffer))) + || (HasRDRAND() && RDRAND_getBytes (buffer, sizeof (buffer))) + ) + { + RandaddBuf (buffer, sizeof (buffer)); + } + + burn (buffer, sizeof(buffer)); + /* Apply the pool mixing function */ Randmix(); -- cgit v1.2.3