diff options
author | Pierre Joye <pajoye@php.net> | 2011-06-16 01:31:10 +0000 |
---|---|---|
committer | Pierre Joye <pajoye@php.net> | 2011-06-16 01:31:10 +0000 |
commit | 23c4c46b36c7c64c54ef68d4a55a3a8fe2bd06a6 (patch) | |
tree | 2153846dd12339eb2d83c75d6319c6e29420742a /win32 | |
parent | b498b5dfe5069627a66d8f458d5149a3b44a8a00 (diff) | |
download | php-git-23c4c46b36c7c64c54ef68d4a55a3a8fe2bd06a6.tar.gz |
- init win32 rng context once per process
Diffstat (limited to 'win32')
-rw-r--r-- | win32/winutil.c | 57 | ||||
-rw-r--r-- | win32/winutil.h | 8 |
2 files changed, 54 insertions, 11 deletions
diff --git a/win32/winutil.c b/win32/winutil.c index 4238b2c740..3216ffc837 100644 --- a/win32/winutil.c +++ b/win32/winutil.c @@ -49,26 +49,61 @@ int php_win32_check_trailing_space(const char * path, const int path_len) { } } +HCRYPTPROV hCryptProv; +unsigned int has_crypto_ctx = 0; + +#ifdef ZTS +MUTEX_T php_lock_win32_cryptoctx; +void php_win32_init_rng_lock() +{ + php_lock_win32_cryptoctx = tsrm_mutex_alloc(); +} + +void php_win32_free_rng_lock() +{ + tsrm_mutex_lock(php_lock_win32_cryptoctx); + CryptReleaseContext(hCryptProv, 0); + has_crypto_ctx = 0; + tsrm_mutex_unlock(php_lock_win32_cryptoctx); + tsrm_mutex_free(php_lock_win32_cryptoctx); + +} +#else +#define php_win32_init_rng_lock(); +#define php_win32_free_rng_lock(); +#endif + + + PHPAPI int php_win32_get_random_bytes(unsigned char *buf, size_t size) { /* {{{ */ - HCRYPTPROV hCryptProv; - int has_context = 0; + + unsigned int has_contextg = 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; + tsrm_mutex_lock(php_lock_win32_cryptoctx); + if (has_crypto_ctx == 0) { + if (!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET)) { + /* 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_crypto_ctx = 1; + } else { + has_crypto_ctx = 0; + } } } } + tsrm_mutex_unlock(php_lock_win32_cryptoctx); + + if (has_crypto_ctx == 0) { + return FAILURE; + } ret = CryptGenRandom(hCryptProv, size, buf); - CryptReleaseContext(hCryptProv, 0); + if (ret) { return SUCCESS; } else { diff --git a/win32/winutil.h b/win32/winutil.h index ac1d15d571..a01f1fd6f2 100644 --- a/win32/winutil.h +++ b/win32/winutil.h @@ -21,3 +21,11 @@ PHPAPI char *php_win_err(int error); #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); + +#ifdef ZTS +void php_win32_init_rng_lock(); +void php_win32_free_rng_lock(); +#else +#define php_win32_init_rng_lock(); +#define php_win32_free_rng_lock(); +#endif |