From 5afc8e2c833c4bb1e69545ee857f07d910f12b79 Mon Sep 17 00:00:00 2001 From: Pierre Joye Date: Tue, 8 Jun 2010 13:00:11 +0000 Subject: [PATCH] - add striped down version of RNG layer to have a reliable random src on windows --- win32/winutil.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/win32/winutil.c b/win32/winutil.c index 24b00edfae..b3bb90f16e 100644 --- a/win32/winutil.c +++ b/win32/winutil.c @@ -12,13 +12,15 @@ | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ - | Author: | + | Author: Zeev Suraski | + * Pierre Joye | +----------------------------------------------------------------------+ */ /* $Id$ */ #include "php.h" +#include PHPAPI char *php_win_err(int error) { @@ -46,3 +48,35 @@ int php_win32_check_trailing_space(const char * path, const int path_len) { return 0; } } + +PHPAPI int php_win32_get_random_bytes(unsigned char *buf, size_t size) { /* {{{ */ + HCRYPTPROV hCryptProv; + int has_context = 0; + BOOL ret; + size_t i = 0; + + if (!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0)) { + /* Could mean that the key container does not exist, let try + again by asking for a new one */ + if (GetLastError() == NTE_BAD_KEYSET) { + if (CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { + has_context = 1; + } else { + return FAILURE; + } + } + } + + ret = CryptGenRandom(hCryptProv, size, buf); + CryptReleaseContext(hCryptProv, 0); + if (ret) { + while (i < size && buf[i] != 0) { + i++; + } + if (i == size) { + return SUCCESS; + } + } + return FAILURE; +} +/* }}} */ -- 2.40.0