@@ -3725,6 +3725,29 @@ PHP_FUNCTION(openssl_cms_decrypt)
3725
3725
3726
3726
/* }}} */
3727
3727
3728
+ /* Helper to set RSA padding and digest for OAEP */
3729
+ static int php_openssl_set_rsa_padding_and_digest (EVP_PKEY_CTX * ctx , zend_long padding , const char * digest_algo )
3730
+ {
3731
+ if (EVP_PKEY_CTX_set_rsa_padding (ctx , padding ) <= 0 ) {
3732
+ return 0 ;
3733
+ }
3734
+
3735
+ if (digest_algo != NULL ) {
3736
+ const EVP_MD * md = php_openssl_get_evp_md_by_name (digest_algo );
3737
+ if (md == NULL ) {
3738
+ php_error_docref (NULL , E_WARNING , "Unknown digest algorithm: %s" , digest_algo );
3739
+ return 0 ;
3740
+ }
3741
+
3742
+ if (padding == RSA_PKCS1_OAEP_PADDING ) {
3743
+ if (EVP_PKEY_CTX_set_rsa_oaep_md (ctx , md ) <= 0 ) {
3744
+ return 0 ;
3745
+ }
3746
+ }
3747
+ }
3748
+
3749
+ return 1 ;
3750
+ }
3728
3751
3729
3752
/* {{{ Encrypts data with private key */
3730
3753
PHP_FUNCTION (openssl_private_encrypt )
@@ -3780,10 +3803,11 @@ PHP_FUNCTION(openssl_private_decrypt)
3780
3803
{
3781
3804
zval * key , * crypted ;
3782
3805
zend_long padding = RSA_PKCS1_PADDING ;
3783
- char * data ;
3784
- size_t data_len ;
3806
+ char * data ;
3807
+ char * digest_algo = NULL ;
3808
+ size_t data_len , digest_algo_len = 0 ;
3785
3809
3786
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "szz|l " , & data , & data_len , & crypted , & key , & padding ) == FAILURE ) {
3810
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "szz|ls! " , & data , & data_len , & crypted , & key , & padding , & digest_algo , & digest_algo_len ) == FAILURE ) {
3787
3811
RETURN_THROWS ();
3788
3812
}
3789
3813
@@ -3798,7 +3822,7 @@ PHP_FUNCTION(openssl_private_decrypt)
3798
3822
size_t out_len = 0 ;
3799
3823
EVP_PKEY_CTX * ctx = EVP_PKEY_CTX_new (pkey , NULL );
3800
3824
if (!ctx || EVP_PKEY_decrypt_init (ctx ) <= 0 ||
3801
- EVP_PKEY_CTX_set_rsa_padding (ctx , padding ) <= 0 ||
3825
+ ! php_openssl_set_rsa_padding_and_digest (ctx , padding , digest_algo ) ||
3802
3826
EVP_PKEY_decrypt (ctx , NULL , & out_len , (unsigned char * ) data , data_len ) <= 0 ) {
3803
3827
php_openssl_store_errors ();
3804
3828
RETVAL_FALSE ;
@@ -3831,9 +3855,10 @@ PHP_FUNCTION(openssl_public_encrypt)
3831
3855
zval * key , * crypted ;
3832
3856
zend_long padding = RSA_PKCS1_PADDING ;
3833
3857
char * data ;
3834
- size_t data_len ;
3858
+ char * digest_algo = NULL ;
3859
+ size_t data_len , digest_algo_len = 0 ;
3835
3860
3836
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "szz|l " , & data , & data_len , & crypted , & key , & padding ) == FAILURE ) {
3861
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "szz|ls! " , & data , & data_len , & crypted , & key , & padding , & digest_algo , & digest_algo_len ) == FAILURE ) {
3837
3862
RETURN_THROWS ();
3838
3863
}
3839
3864
@@ -3848,7 +3873,7 @@ PHP_FUNCTION(openssl_public_encrypt)
3848
3873
size_t out_len = 0 ;
3849
3874
EVP_PKEY_CTX * ctx = EVP_PKEY_CTX_new (pkey , NULL );
3850
3875
if (!ctx || EVP_PKEY_encrypt_init (ctx ) <= 0 ||
3851
- EVP_PKEY_CTX_set_rsa_padding (ctx , padding ) <= 0 ||
3876
+ ! php_openssl_set_rsa_padding_and_digest (ctx , padding , digest_algo ) ||
3852
3877
EVP_PKEY_encrypt (ctx , NULL , & out_len , (unsigned char * ) data , data_len ) <= 0 ) {
3853
3878
php_openssl_store_errors ();
3854
3879
RETVAL_FALSE ;
@@ -3879,7 +3904,7 @@ PHP_FUNCTION(openssl_public_decrypt)
3879
3904
{
3880
3905
zval * key , * crypted ;
3881
3906
zend_long padding = RSA_PKCS1_PADDING ;
3882
- char * data ;
3907
+ char * data ;
3883
3908
size_t data_len ;
3884
3909
3885
3910
if (zend_parse_parameters (ZEND_NUM_ARGS (), "szz|l" , & data , & data_len , & crypted , & key , & padding ) == FAILURE ) {
0 commit comments