diff --git a/src/port/pg_strong_random.c b/src/port/pg_strong_random.c index 6be5874cbf..8199f89a37 100644 --- a/src/port/pg_strong_random.c +++ b/src/port/pg_strong_random.c @@ -28,10 +28,20 @@ #include #endif #ifdef USE_WIN32_RANDOM -#include +#if defined(_MSC_VER) && _MSC_VER >= 1900 \ + && defined(MIN_WINNT) && MIN_WINNT >= 0x0600 +#define USE_WIN32_BCRYPTGENRANDOM +#endif #endif -#ifdef USE_WIN32_RANDOM +#ifdef USE_WIN32_BCRYPTGENRANDOM +#include +#ifndef STATUS_SUCCESS + #define STATUS_SUCCESS ((NTSTATUS)0x00000000L) +#endif +#elif USE_WIN32_RANDOM +#include + /* * Cache a global crypto provider that only gets freed when the process * exits, in case we need random numbers more than once. @@ -85,8 +95,9 @@ random_from_file(const char *filename, void *buf, size_t len) * We support a number of sources: * * 1. OpenSSL's RAND_bytes() - * 2. Windows' CryptGenRandom() function - * 3. /dev/urandom + * 2. Windows' BCryptGenRandom() function + * 3. Windows' CryptGenRandom() function + * 4. /dev/urandom * * The configure script will choose which one to use, and set * a USE_*_RANDOM flag accordingly. @@ -139,6 +150,10 @@ pg_strong_random(void *buf, size_t len) /* * Windows has CryptoAPI for strong cryptographic numbers. */ +#elif defined(USE_WIN32_BCRYPTGENRANDOM) + return (BCryptGenRandom(NULL, buf, len, + BCRYPT_USE_SYSTEM_PREFERRED_RNG) == STATUS_SUCCESS); + #elif defined(USE_WIN32_RANDOM) if (hProvider == 0) {