scottmac                Mon Nov 17 21:54:25 2008 UTC

  Modified files:              (Branch: PHP_5_3)
    /php-src/ext/openssl        openssl.c 
  Log:
  MFH Add openssl_random_pseudo_bytes() in order to expose access to a PRG, 
this wraps around whatever the OS provides.
  
  - OpenBSD uses arc4random()
  - Windows uses the Windows Crypto API
  - FreeBSD, Linux, etc use /dev/random or /dev/urandom if available
  [DOC]
  
  
  
http://cvs.php.net/viewvc.cgi/php-src/ext/openssl/openssl.c?r1=1.98.2.5.2.41.2.24&r2=1.98.2.5.2.41.2.25&diff_format=u
Index: php-src/ext/openssl/openssl.c
diff -u php-src/ext/openssl/openssl.c:1.98.2.5.2.41.2.24 
php-src/ext/openssl/openssl.c:1.98.2.5.2.41.2.25
--- php-src/ext/openssl/openssl.c:1.98.2.5.2.41.2.24    Mon Nov 17 11:27:57 2008
+++ php-src/ext/openssl/openssl.c       Mon Nov 17 21:54:25 2008
@@ -20,7 +20,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: openssl.c,v 1.98.2.5.2.41.2.24 2008/11/17 11:27:57 felipe Exp $ */
+/* $Id: openssl.c,v 1.98.2.5.2.41.2.25 2008/11/17 21:54:25 scottmac Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -94,6 +94,7 @@
 PHP_FUNCTION(openssl_decrypt);
 
 PHP_FUNCTION(openssl_dh_compute_key);
+PHP_FUNCTION(openssl_random_pseudo_bytes);
 
 /* {{{ arginfo */
 ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_export_to_file, 0, 0, 2)
@@ -352,6 +353,11 @@
     ZEND_ARG_INFO(0, pub_key)
     ZEND_ARG_INFO(0, dh_key)
 ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_random_pseudo_bytes, 0, 0, 1)
+    ZEND_ARG_INFO(0, length)
+    ZEND_ARG_INFO(1, result_is_strong)
+ZEND_END_ARG_INFO()
 /* }}} */
 
 /* {{{ openssl_functions[]
@@ -416,6 +422,7 @@
 
        PHP_FE(openssl_dh_compute_key,      arginfo_openssl_dh_compute_key)
 
+       PHP_FE(openssl_random_pseudo_bytes,    
arginfo_openssl_random_pseudo_bytes)
        PHP_FE(openssl_error_string, arginfo_openssl_error_string)
        {NULL, NULL, NULL}
 };
@@ -4704,6 +4711,52 @@
 }
 /* }}} */
 
+/* {{{ proto string openssl_random_pseudo_bytes(integer length [, &bool 
returned_strong_result])
+   Returns a string of the length specified filled with random pseudo bytes */
+PHP_FUNCTION(openssl_random_pseudo_bytes)
+{
+       long buffer_length;
+       unsigned char *buffer = NULL;
+       zval *zstrong_result_returned = NULL;
+       int strong_result = 0;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|z", 
&buffer_length, &zstrong_result_returned) == FAILURE) {
+               return;
+       }
+
+       if (buffer_length <= 0) {
+               RETURN_FALSE;
+       }
+
+       if (zstrong_result_returned) {
+               zval_dtor(zstrong_result_returned);
+               ZVAL_BOOL(zstrong_result_returned, 0);
+       }
+
+       buffer = emalloc(buffer_length);
+
+       if (!buffer) {
+               RETURN_FALSE;
+       }
+
+#ifdef WINDOWS
+        RAND_screen();
+#endif
+
+       if ((strong_result = RAND_pseudo_bytes(buffer, buffer_length)) < 0) {
+               RETVAL_FALSE;
+       } else {
+               RETVAL_STRINGL((char *)buffer, buffer_length, 1);
+
+               if (zstrong_result_returned) {
+                       ZVAL_BOOL(zstrong_result_returned, strong_result);
+               }
+
+       }
+       efree(buffer);
+}
+/* }}} */
+
 /*
  * Local variables:
  * tab-width: 8



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to