From 2c6e561ff8c8fc4069a96fb133771532d61fe499 Mon Sep 17 00:00:00 2001 From: Minos Galanakis Date: Wed, 6 Sep 2023 15:00:58 +0100 Subject: [PATCH] entropy_poll.c: Added looping logic to `mbedtls_platform_entropy_poll()`. Signed-off-by: Minos Galanakis --- library/entropy_poll.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/library/entropy_poll.c b/library/entropy_poll.c index 8048ace0f9..52be9f5505 100644 --- a/library/entropy_poll.c +++ b/library/entropy_poll.c @@ -56,7 +56,6 @@ int mbedtls_platform_entropy_poll(void *data, unsigned char *output, size_t len, size_t *olen) { - ULONG len_as_ulong = 0; ((void) data); *olen = 0; @@ -65,16 +64,18 @@ int mbedtls_platform_entropy_poll(void *data, unsigned char *output, size_t len, * 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; - } + while (len != 0) { + unsigned long ulong_bytes = + (len > ULONG_MAX) ? ULONG_MAX : (unsigned long) len; - if (!BCRYPT_SUCCESS(BCryptGenRandom(NULL, output, len_as_ulong, - BCRYPT_USE_SYSTEM_PREFERRED_RNG))) { - return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; - } + if (!BCRYPT_SUCCESS(BCryptGenRandom(NULL, output, ulong_bytes, + BCRYPT_USE_SYSTEM_PREFERRED_RNG))) { + return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; + } - *olen = len; + *olen += ulong_bytes; + len -= ulong_bytes; + } return 0; }