From 3058158b69a80da13292c80ce46d95299b2fa609 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Thu, 12 Sep 2024 16:56:15 +0800 Subject: [PATCH] Use modern function for getting random numbers on Windows The previous `RtlGenRandom()` just redirects to `ProcessPrng()` according to "The Windows 10 random number generation infrastructure" whitepaper from MS. `ProcessPrng()` is also the de facto PRNG for Rust lang: https://github.com/rust-random/getrandom/blob/aa13fa58821180248507b81c967d3c731a2ca1d5/src/windows.rs#L3C1-L22C81 And for golang: https://go-review.googlesource.com/c/go/+/536235 --- src/base/utils/random.cpp | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/src/base/utils/random.cpp b/src/base/utils/random.cpp index f08f439f5..eb81aed2a 100644 --- a/src/base/utils/random.cpp +++ b/src/base/utils/random.cpp @@ -33,9 +33,10 @@ #include #include -#ifdef Q_OS_WIN +#if defined(Q_OS_WIN) #include -#include +#include "base/global.h" +#include "base/utils/os.h" #elif defined(Q_OS_LINUX) #include #include @@ -46,17 +47,9 @@ #include #endif -#include - -#include "base/global.h" - -#ifdef Q_OS_WIN -#include "base/utils/os.h" -#endif - namespace { -#ifdef Q_OS_WIN +#if defined(Q_OS_WIN) class RandomLayer { // need to satisfy UniformRandomBitGenerator requirements @@ -64,10 +57,10 @@ namespace using result_type = uint32_t; RandomLayer() - : m_rtlGenRandom {Utils::OS::loadWinAPI(u"Advapi32.dll"_s, "SystemFunction036")} + : m_processPrng {Utils::OS::loadWinAPI(u"BCryptPrimitives.dll"_s, "ProcessPrng")} { - if (!m_rtlGenRandom) - qFatal("Failed to load RtlGenRandom()"); + if (!m_processPrng) + qFatal("Failed to load ProcessPrng()."); } static constexpr result_type min() @@ -83,16 +76,16 @@ namespace result_type operator()() { result_type buf = 0; - const bool result = m_rtlGenRandom(&buf, sizeof(buf)); + const bool result = m_processPrng(reinterpret_cast(&buf), sizeof(buf)); if (!result) - qFatal("RtlGenRandom() failed"); + qFatal("ProcessPrng() failed."); return buf; } private: - using PRTLGENRANDOM = BOOLEAN (WINAPI *)(PVOID, ULONG); - const PRTLGENRANDOM m_rtlGenRandom; + using PPROCESSPRNG = BOOL (WINAPI *)(PBYTE, SIZE_T); + const PPROCESSPRNG m_processPrng; }; #elif defined(Q_OS_LINUX) class RandomLayer