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

Reply via email to