mirror of
https://github.com/php/php-src.git
synced 2024-11-23 18:04:36 +08:00
- add striped down version of RNG layer to have a reliable random src on windows
This commit is contained in:
parent
ae01c146d1
commit
5afc8e2c83
@ -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 <zeev@zend.com> |
|
||||
* Pierre Joye <pierre@php.net> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
#include "php.h"
|
||||
#include <wincrypt.h>
|
||||
|
||||
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;
|
||||
}
|
||||
/* }}} */
|
||||
|
Loading…
Reference in New Issue
Block a user