Skip to content

Commit 35bf3f8

Browse files
committed
Merge bitcoin/bitcoin#32400: random: Use modern Windows randomness functions
6b4bcc1 random: Use modern Windows randomness functions (David Gumberg) Pull request description: This change resolves #32391 and is a follow-up to #14089. The old randomness API has been deprecated and will be removed at some point according to Microsoft.[^1] This PR removes all uses of that API from Bitcoin Core code, but the deprecated API is still invoked in Bitcoin Core binaries compiled after this PR because of upstream use, see this comment: bitcoin/bitcoin#32400 (comment). For reference on `BCryptGenRandom`, see: https://learn.microsoft.com/en-us/windows/win32/api/bcrypt/nf-bcrypt-bcryptgenrandom. [`STATUS_SUCCESS`](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-erref/596a1078-e883-4972-9bbc-49e60bebca55) gets defined here since including `ntstatus.h` is [more trouble](https://github.com/bitcoin-core/secp256k1/blob/70f149b9a1bf4ed3266f97774d0ae9577534bf40/examples/examples_util.h#L19-L28) than it's worth. [^1]: https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontextw & https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptgenrandom ACKs for top commit: laanwj: re-ACK 6b4bcc1 fanquake: ACK 6b4bcc1 Tree-SHA512: ddd9093669dfd6ff0eee7e5e6a9c7dce798d03dd9a81dcc2e668e9b84779b7adab3105a7f0c8038e54accf28f19fe211628e13b3fc2200caa5b423f766725e37
2 parents a42faa2 + 6b4bcc1 commit 35bf3f8

File tree

4 files changed

+12
-11
lines changed

4 files changed

+12
-11
lines changed

contrib/guix/symbol-check.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,8 @@
153153
}
154154

155155
PE_ALLOWED_LIBRARIES = {
156-
'ADVAPI32.dll', # security & registry
156+
'ADVAPI32.dll', # legacy security & registry
157+
'bcrypt.dll', # newer security and identity API
157158
'IPHLPAPI.DLL', # IP helper API
158159
'KERNEL32.dll', # win32 base APIs
159160
'msvcrt.dll', # C standard library for MSVC

src/kernel/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ target_link_libraries(bitcoinkernel
8787
bitcoin_crypto
8888
leveldb
8989
secp256k1
90+
$<$<PLATFORM_ID:Windows>:bcrypt>
9091
$<TARGET_NAME_IF_EXISTS:USDT::headers>
9192
PUBLIC
9293
Boost::headers

src/random.cpp

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@
2727
#include <thread>
2828

2929
#ifdef WIN32
30-
#include <windows.h>
31-
#include <wincrypt.h>
30+
#include <bcrypt.h>
3231
#else
3332
#include <fcntl.h>
3433
#include <sys/time.h>
@@ -287,16 +286,15 @@ void Strengthen(const unsigned char (&seed)[32], SteadyClock::duration dur, CSHA
287286
void GetOSRand(unsigned char *ent32)
288287
{
289288
#if defined(WIN32)
290-
HCRYPTPROV hProvider;
291-
int ret = CryptAcquireContextW(&hProvider, nullptr, nullptr, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
292-
if (!ret) {
293-
RandFailure();
294-
}
295-
ret = CryptGenRandom(hProvider, NUM_OS_RANDOM_BYTES, ent32);
296-
if (!ret) {
289+
constexpr uint32_t STATUS_SUCCESS{0x00000000};
290+
NTSTATUS status = BCryptGenRandom(/*hAlgorithm=*/NULL,
291+
/*pbBuffer=*/ent32,
292+
/*cbBuffer=*/NUM_OS_RANDOM_BYTES,
293+
/*dwFlags=*/BCRYPT_USE_SYSTEM_PREFERRED_RNG);
294+
295+
if (status != STATUS_SUCCESS) {
297296
RandFailure();
298297
}
299-
CryptReleaseContext(hProvider, 0);
300298
#elif defined(HAVE_GETRANDOM)
301299
/* Linux. From the getrandom(2) man page:
302300
* "If the urandom source has been initialized, reads of up to 256 bytes

src/util/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,5 @@ target_link_libraries(bitcoin_util
4343
bitcoin_crypto
4444
$<$<PLATFORM_ID:Windows>:ws2_32>
4545
$<$<PLATFORM_ID:Windows>:iphlpapi>
46+
$<$<PLATFORM_ID:Windows>:bcrypt>
4647
)

0 commit comments

Comments
 (0)