@@ -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 , const EVP_MD * * pmd )
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
+ * pmd = md ;
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,12 @@ 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 ;
3809
+ const EVP_MD * md = NULL ;
3785
3810
3786
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "szz|l " , & data , & data_len , & crypted , & key , & padding ) == FAILURE ) {
3811
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "szz|lp! " , & data , & data_len , & crypted , & key , & padding , & digest_algo , & digest_algo_len ) == FAILURE ) {
3787
3812
RETURN_THROWS ();
3788
3813
}
3789
3814
@@ -3798,7 +3823,7 @@ PHP_FUNCTION(openssl_private_decrypt)
3798
3823
size_t out_len = 0 ;
3799
3824
EVP_PKEY_CTX * ctx = EVP_PKEY_CTX_new (pkey , NULL );
3800
3825
if (!ctx || EVP_PKEY_decrypt_init (ctx ) <= 0 ||
3801
- EVP_PKEY_CTX_set_rsa_padding (ctx , padding ) <= 0 ||
3826
+ ! php_openssl_set_rsa_padding_and_digest (ctx , padding , digest_algo , & md ) ||
3802
3827
EVP_PKEY_decrypt (ctx , NULL , & out_len , (unsigned char * ) data , data_len ) <= 0 ) {
3803
3828
php_openssl_store_errors ();
3804
3829
RETVAL_FALSE ;
@@ -3820,6 +3845,7 @@ PHP_FUNCTION(openssl_private_decrypt)
3820
3845
RETVAL_TRUE ;
3821
3846
3822
3847
cleanup :
3848
+ php_openssl_release_evp_md (md );
3823
3849
EVP_PKEY_CTX_free (ctx );
3824
3850
EVP_PKEY_free (pkey );
3825
3851
}
@@ -3831,9 +3857,11 @@ PHP_FUNCTION(openssl_public_encrypt)
3831
3857
zval * key , * crypted ;
3832
3858
zend_long padding = RSA_PKCS1_PADDING ;
3833
3859
char * data ;
3834
- size_t data_len ;
3860
+ char * digest_algo = NULL ;
3861
+ size_t data_len , digest_algo_len = 0 ;
3862
+ const EVP_MD * md = NULL ;
3835
3863
3836
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "szz|l " , & data , & data_len , & crypted , & key , & padding ) == FAILURE ) {
3864
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "szz|lp! " , & data , & data_len , & crypted , & key , & padding , & digest_algo , & digest_algo_len ) == FAILURE ) {
3837
3865
RETURN_THROWS ();
3838
3866
}
3839
3867
@@ -3848,7 +3876,7 @@ PHP_FUNCTION(openssl_public_encrypt)
3848
3876
size_t out_len = 0 ;
3849
3877
EVP_PKEY_CTX * ctx = EVP_PKEY_CTX_new (pkey , NULL );
3850
3878
if (!ctx || EVP_PKEY_encrypt_init (ctx ) <= 0 ||
3851
- EVP_PKEY_CTX_set_rsa_padding (ctx , padding ) <= 0 ||
3879
+ ! php_openssl_set_rsa_padding_and_digest (ctx , padding , digest_algo , & md ) ||
3852
3880
EVP_PKEY_encrypt (ctx , NULL , & out_len , (unsigned char * ) data , data_len ) <= 0 ) {
3853
3881
php_openssl_store_errors ();
3854
3882
RETVAL_FALSE ;
@@ -3869,6 +3897,7 @@ PHP_FUNCTION(openssl_public_encrypt)
3869
3897
RETVAL_TRUE ;
3870
3898
3871
3899
cleanup :
3900
+
3872
3901
EVP_PKEY_CTX_free (ctx );
3873
3902
EVP_PKEY_free (pkey );
3874
3903
}
@@ -3879,7 +3908,7 @@ PHP_FUNCTION(openssl_public_decrypt)
3879
3908
{
3880
3909
zval * key , * crypted ;
3881
3910
zend_long padding = RSA_PKCS1_PADDING ;
3882
- char * data ;
3911
+ char * data ;
3883
3912
size_t data_len ;
3884
3913
3885
3914
if (zend_parse_parameters (ZEND_NUM_ARGS (), "szz|l" , & data , & data_len , & crypted , & key , & padding ) == FAILURE ) {
0 commit comments