1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- diff --git a/thirdparty/mbedtls/library/entropy_poll.c b/thirdparty/mbedtls/library/entropy_poll.c
- index 3420616a06..57fddd4d62 100644
- --- a/thirdparty/mbedtls/library/entropy_poll.c
- +++ b/thirdparty/mbedtls/library/entropy_poll.c
- @@ -55,26 +55,41 @@
- #define _WIN32_WINNT 0x0400
- #endif
- #include <windows.h>
- -#include <wincrypt.h>
- +#include <bcrypt.h>
- +#if defined(_MSC_VER) && _MSC_VER <= 1600
- +/* Visual Studio 2010 and earlier issue a warning when both <stdint.h> and
- + * <intsafe.h> are included, as they redefine a number of <TYPE>_MAX constants.
- + * These constants are guaranteed to be the same, though, so we suppress the
- + * warning when including intsafe.h.
- + */
- +#pragma warning( push )
- +#pragma warning( disable : 4005 )
- +#endif
- +#include <intsafe.h>
- +#if defined(_MSC_VER) && _MSC_VER <= 1600
- +#pragma warning( pop )
- +#endif
-
- int mbedtls_platform_entropy_poll(void *data, unsigned char *output, size_t len,
- size_t *olen)
- {
- - HCRYPTPROV provider;
- + ULONG len_as_ulong = 0;
- ((void) data);
- *olen = 0;
-
- - if (CryptAcquireContext(&provider, NULL, NULL,
- - PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) == FALSE) {
- + /*
- + * BCryptGenRandom takes ULONG for size, which is smaller than size_t on
- + * 64-bit Windows platforms. Ensure len's value can be safely converted into
- + * a ULONG.
- + */
- + if (FAILED(SizeTToULong(len, &len_as_ulong))) {
- return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED;
- }
-
- - if (CryptGenRandom(provider, (DWORD) len, output) == FALSE) {
- - CryptReleaseContext(provider, 0);
- + if (!BCRYPT_SUCCESS(BCryptGenRandom(NULL, output, len_as_ulong, BCRYPT_USE_SYSTEM_PREFERRED_RNG))) {
- return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED;
- }
-
- - CryptReleaseContext(provider, 0);
- *olen = len;
-
- return 0;
|