pajoye Tue, 08 Jun 2010 13:00:11 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=300273
Log: - add striped down version of RNG layer to have a reliable random src on windows Changed paths: U php/php-src/branches/PHP_5_3/win32/winutil.c U php/php-src/trunk/win32/winutil.c U php/php-src/trunk/win32/winutil.h Modified: php/php-src/branches/PHP_5_3/win32/winutil.c =================================================================== --- php/php-src/branches/PHP_5_3/win32/winutil.c 2010-06-08 12:54:11 UTC (rev 300272) +++ php/php-src/branches/PHP_5_3/win32/winutil.c 2010-06-08 13:00:11 UTC (rev 300273) @@ -12,13 +12,15 @@ | obtain it through the world-wide-web, please send a note to | | lice...@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ - | Author: | + | Author: Zeev Suraski <z...@zend.com> | + * Pierre Joye <pie...@php.net> | +----------------------------------------------------------------------+ */ /* $Id$ */ #include "php.h" +#include <wincrypt.h> PHPAPI char *php_win_err(int error) { @@ -46,3 +48,35 @@ 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; +} +/* }}} */ Modified: php/php-src/trunk/win32/winutil.c =================================================================== --- php/php-src/trunk/win32/winutil.c 2010-06-08 12:54:11 UTC (rev 300272) +++ php/php-src/trunk/win32/winutil.c 2010-06-08 13:00:11 UTC (rev 300273) @@ -12,13 +12,15 @@ | obtain it through the world-wide-web, please send a note to | | lice...@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ - | Author: | + | Author: Zeev Suraski <z...@zend.com> | + * Pierre Joye <pie...@php.net> | +----------------------------------------------------------------------+ */ /* $Id$ */ #include "php.h" +#include <wincrypt.h> PHPAPI char *php_win_err(int error) { @@ -46,3 +48,35 @@ 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; +} +/* }}} */ Modified: php/php-src/trunk/win32/winutil.h =================================================================== --- php/php-src/trunk/win32/winutil.h 2010-06-08 12:54:11 UTC (rev 300272) +++ php/php-src/trunk/win32/winutil.h 2010-06-08 13:00:11 UTC (rev 300273) @@ -20,3 +20,4 @@ #define php_win_err() php_win_err(GetLastError()) int php_win32_check_trailing_space(const char * path, const int path_len); +PHPAPI php_win32_get_random_bytes(unsigned char *buf, size_t size);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php