pajoye Tue, 08 Jun 2010 13:00:11 +
Revision: http://svn.php.net/viewvc?view=revisionrevision=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.c2010-06-08 12:54:11 UTC
(rev 300272)
+++ php/php-src/branches/PHP_5_3/win32/winutil.c2010-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