@@ -4563,16 +4563,48 @@ static zend_string *php_openssl_pkey_derive(EVP_PKEY *key, EVP_PKEY *peer_key, s
4563
4563
return result ;
4564
4564
}
4565
4565
4566
+ static zend_string * php_openssl_dh_compute_key (EVP_PKEY * pkey , char * pub_str , size_t pub_len ) {
4567
+ #if PHP_OPENSSL_API_VERSION >= 0x30000
4568
+ EVP_PKEY * peer_key = EVP_PKEY_new ();
4569
+ if (!peer_key || EVP_PKEY_copy_parameters (peer_key , pkey ) <= 0 ||
4570
+ EVP_PKEY_set1_encoded_public_key (peer_key , (unsigned char * ) pub_str , pub_len ) <= 0 ) {
4571
+ php_openssl_store_errors ();
4572
+ EVP_PKEY_free (peer_key );
4573
+ return NULL ;
4574
+ }
4575
+
4576
+ zend_string * result = php_openssl_pkey_derive (pkey , peer_key , 0 );
4577
+ EVP_PKEY_free (peer_key );
4578
+ return result ;
4579
+ #else
4580
+ DH * dh = EVP_PKEY_get0_DH (pkey );
4581
+ if (dh == NULL ) {
4582
+ return NULL ;
4583
+ }
4584
+
4585
+ BIGNUM * pub = BN_bin2bn ((unsigned char * )pub_str , (int )pub_len , NULL );
4586
+ zend_string * data = zend_string_alloc (DH_size (dh ), 0 );
4587
+ int len = DH_compute_key ((unsigned char * )ZSTR_VAL (data ), pub , dh );
4588
+ BN_free (pub );
4589
+
4590
+ if (len < 0 ) {
4591
+ php_openssl_store_errors ();
4592
+ zend_string_release_ex (data , 0 );
4593
+ return NULL ;
4594
+ }
4595
+
4596
+ ZSTR_LEN (data ) = len ;
4597
+ ZSTR_VAL (data )[len ] = 0 ;
4598
+ return data ;
4599
+ #endif
4600
+ }
4601
+
4566
4602
/* {{{ Computes shared secret for public value of remote DH key and local DH key */
4567
4603
PHP_FUNCTION (openssl_dh_compute_key )
4568
4604
{
4569
4605
zval * key ;
4570
4606
char * pub_str ;
4571
4607
size_t pub_len ;
4572
- DH * dh ;
4573
- BIGNUM * pub ;
4574
- zend_string * data ;
4575
- int len ;
4576
4608
4577
4609
if (zend_parse_parameters (ZEND_NUM_ARGS (), "sO" , & pub_str , & pub_len , & key , php_openssl_pkey_ce ) == FAILURE ) {
4578
4610
RETURN_THROWS ();
@@ -4581,32 +4613,16 @@ PHP_FUNCTION(openssl_dh_compute_key)
4581
4613
PHP_OPENSSL_CHECK_SIZE_T_TO_INT (pub_len , pub_key , 1 );
4582
4614
4583
4615
EVP_PKEY * pkey = Z_OPENSSL_PKEY_P (key )-> pkey ;
4584
-
4585
4616
if (EVP_PKEY_base_id (pkey ) != EVP_PKEY_DH ) {
4586
4617
RETURN_FALSE ;
4587
4618
}
4588
4619
4589
- dh = EVP_PKEY_get0_DH (pkey );
4590
- if (dh == NULL ) {
4591
- RETURN_FALSE ;
4592
- }
4593
-
4594
- pub = BN_bin2bn ((unsigned char * )pub_str , (int )pub_len , NULL );
4595
-
4596
- data = zend_string_alloc (DH_size (dh ), 0 );
4597
- len = DH_compute_key ((unsigned char * )ZSTR_VAL (data ), pub , dh );
4598
-
4599
- if (len >= 0 ) {
4600
- ZSTR_LEN (data ) = len ;
4601
- ZSTR_VAL (data )[len ] = 0 ;
4602
- RETVAL_NEW_STR (data );
4620
+ zend_string * result = php_openssl_dh_compute_key (pkey , pub_str , pub_len );
4621
+ if (result ) {
4622
+ RETURN_NEW_STR (result );
4603
4623
} else {
4604
- php_openssl_store_errors ();
4605
- zend_string_release_ex (data , 0 );
4606
- RETVAL_FALSE ;
4624
+ RETURN_FALSE ;
4607
4625
}
4608
-
4609
- BN_free (pub );
4610
4626
}
4611
4627
/* }}} */
4612
4628
0 commit comments