@@ -967,6 +967,22 @@ static void php_openssl_dispose_config(struct php_x509_request * req TSRMLS_DC)
967
967
}
968
968
/* }}} */
969
969
970
+ #ifdef PHP_WIN32
971
+ #define PHP_OPENSSL_RAND_ADD_TIME () ((void) 0)
972
+ #else
973
+ #define PHP_OPENSSL_RAND_ADD_TIME () php_openssl_rand_add_timeval()
974
+
975
+ static inline void php_openssl_rand_add_timeval () /* {{{ */
976
+ {
977
+ struct timeval tv ;
978
+
979
+ gettimeofday (& tv , NULL );
980
+ RAND_add (& tv , sizeof (tv ), 0.0 );
981
+ }
982
+ /* }}} */
983
+
984
+ #endif
985
+
970
986
static int php_openssl_load_rand_file (const char * file , int * egdsocket , int * seeded TSRMLS_DC ) /* {{{ */
971
987
{
972
988
char buffer [MAXPATHLEN ];
@@ -1010,6 +1026,7 @@ static int php_openssl_write_rand_file(const char * file, int egdsocket, int see
1010
1026
if (file == NULL ) {
1011
1027
file = RAND_file_name (buffer , sizeof (buffer ));
1012
1028
}
1029
+ PHP_OPENSSL_RAND_ADD_TIME ();
1013
1030
if (file == NULL || !RAND_write_file (file )) {
1014
1031
php_error_docref (NULL TSRMLS_CC , E_WARNING , "unable to write random state" );
1015
1032
return FAILURE ;
@@ -3399,12 +3416,14 @@ static EVP_PKEY * php_openssl_generate_private_key(struct php_x509_request * req
3399
3416
if ((req -> priv_key = EVP_PKEY_new ()) != NULL ) {
3400
3417
switch (req -> priv_key_type ) {
3401
3418
case OPENSSL_KEYTYPE_RSA :
3419
+ PHP_OPENSSL_RAND_ADD_TIME ();
3402
3420
if (EVP_PKEY_assign_RSA (req -> priv_key , RSA_generate_key (req -> priv_key_bits , 0x10001 , NULL , NULL ))) {
3403
3421
return_val = req -> priv_key ;
3404
3422
}
3405
3423
break ;
3406
3424
#if !defined(NO_DSA ) && defined(HAVE_DSA_DEFAULT_METHOD )
3407
3425
case OPENSSL_KEYTYPE_DSA :
3426
+ PHP_OPENSSL_RAND_ADD_TIME ();
3408
3427
{
3409
3428
DSA * dsapar = DSA_generate_parameters (req -> priv_key_bits , NULL , 0 , NULL , NULL , NULL , NULL );
3410
3429
if (dsapar ) {
@@ -3422,6 +3441,7 @@ static EVP_PKEY * php_openssl_generate_private_key(struct php_x509_request * req
3422
3441
#endif
3423
3442
#if !defined(NO_DH )
3424
3443
case OPENSSL_KEYTYPE_DH :
3444
+ PHP_OPENSSL_RAND_ADD_TIME ();
3425
3445
{
3426
3446
DH * dhpar = DH_generate_parameters (req -> priv_key_bits , 2 , NULL , NULL );
3427
3447
int codes = 0 ;
@@ -3540,6 +3560,7 @@ zend_bool php_openssl_pkey_init_dsa(DSA *dsa)
3540
3560
if (dsa -> priv_key || dsa -> pub_key ) {
3541
3561
return 1 ;
3542
3562
}
3563
+ PHP_OPENSSL_RAND_ADD_TIME ();
3543
3564
if (!DSA_generate_key (dsa )) {
3544
3565
return 0 ;
3545
3566
}
@@ -3562,6 +3583,7 @@ zend_bool php_openssl_pkey_init_dh(DH *dh)
3562
3583
if (dh -> pub_key ) {
3563
3584
return 1 ;
3564
3585
}
3586
+ PHP_OPENSSL_RAND_ADD_TIME ();
3565
3587
if (!DH_generate_key (dh )) {
3566
3588
return 0 ;
3567
3589
}
@@ -5461,6 +5483,7 @@ PHP_FUNCTION(openssl_random_pseudo_bytes)
5461
5483
RETURN_FALSE ;
5462
5484
}
5463
5485
#else
5486
+ PHP_OPENSSL_RAND_ADD_TIME ();
5464
5487
if (RAND_bytes (buffer , buffer_length ) <= 0 ) {
5465
5488
efree (buffer );
5466
5489
if (zstrong_result_returned ) {
0 commit comments