@@ -700,14 +700,14 @@ mysqlnd_xor_string(char * dst, const size_t dst_len, const char * xor_str, const
700
700
#include <openssl/pem.h>
701
701
#include <openssl/err.h>
702
702
703
- typedef RSA * mysqlnd_rsa_t ;
703
+ typedef EVP_PKEY * mysqlnd_rsa_t ;
704
704
705
705
/* {{{ mysqlnd_sha256_get_rsa_from_pem */
706
706
static mysqlnd_rsa_t
707
707
mysqlnd_sha256_get_rsa_from_pem (const char * buf , size_t len )
708
708
{
709
- BIO * bio = BIO_new_mem_buf (buf , len );
710
- RSA * ret = PEM_read_bio_RSA_PUBKEY (bio , NULL , NULL , NULL );
709
+ BIO * bio = BIO_new_mem_buf (buf , len );
710
+ EVP_PKEY * ret = PEM_read_bio_PUBKEY (bio , NULL , NULL , NULL );
711
711
BIO_free (bio );
712
712
return ret ;
713
713
}
@@ -718,7 +718,7 @@ static zend_uchar *
718
718
mysqlnd_sha256_public_encrypt (MYSQLND_CONN_DATA * conn , mysqlnd_rsa_t server_public_key , size_t passwd_len , size_t * auth_data_len , char * xor_str )
719
719
{
720
720
zend_uchar * ret = NULL ;
721
- size_t server_public_key_len = (size_t ) RSA_size (server_public_key );
721
+ size_t server_public_key_len = (size_t ) EVP_PKEY_size (server_public_key );
722
722
723
723
DBG_ENTER ("mysqlnd_sha256_public_encrypt" );
724
724
/*
@@ -728,16 +728,24 @@ mysqlnd_sha256_public_encrypt(MYSQLND_CONN_DATA * conn, mysqlnd_rsa_t server_pub
728
728
*/
729
729
if (server_public_key_len <= passwd_len + 41 ) {
730
730
/* password message is to long */
731
- RSA_free (server_public_key );
731
+ EVP_PKEY_free (server_public_key );
732
732
SET_CLIENT_ERROR (conn -> error_info , CR_UNKNOWN_ERROR , UNKNOWN_SQLSTATE , "password is too long" );
733
733
DBG_ERR ("password is too long" );
734
734
DBG_RETURN (NULL );
735
735
}
736
736
737
737
* auth_data_len = server_public_key_len ;
738
738
ret = malloc (* auth_data_len );
739
- RSA_public_encrypt (passwd_len + 1 , (zend_uchar * ) xor_str , ret , server_public_key , RSA_PKCS1_OAEP_PADDING );
740
- RSA_free (server_public_key );
739
+ EVP_PKEY_CTX * ctx = EVP_PKEY_CTX_new (server_public_key , NULL );
740
+ if (!ctx || EVP_PKEY_encrypt_init (ctx ) <= 0 ||
741
+ EVP_PKEY_CTX_set_rsa_padding (ctx , RSA_PKCS1_OAEP_PADDING ) <= 0 ||
742
+ EVP_PKEY_encrypt (ctx , ret , & server_public_key_len , (zend_uchar * ) xor_str , passwd_len + 1 ) <= 0 ) {
743
+ DBG_ERR ("encrypt failed" );
744
+ free (ret );
745
+ ret = NULL ;
746
+ }
747
+ EVP_PKEY_CTX_free (ctx );
748
+ EVP_PKEY_free (server_public_key );
741
749
DBG_RETURN (ret );
742
750
}
743
751
/* }}} */
@@ -1011,7 +1019,7 @@ void php_mysqlnd_scramble_sha2(zend_uchar * const buffer, const zend_uchar * con
1011
1019
static size_t
1012
1020
mysqlnd_caching_sha2_public_encrypt (MYSQLND_CONN_DATA * conn , mysqlnd_rsa_t server_public_key , size_t passwd_len , unsigned char * * crypted , char * xor_str )
1013
1021
{
1014
- size_t server_public_key_len = (size_t ) RSA_size (server_public_key );
1022
+ size_t server_public_key_len = (size_t ) EVP_PKEY_size (server_public_key );
1015
1023
1016
1024
DBG_ENTER ("mysqlnd_caching_sha2_public_encrypt" );
1017
1025
/*
@@ -1021,15 +1029,22 @@ mysqlnd_caching_sha2_public_encrypt(MYSQLND_CONN_DATA * conn, mysqlnd_rsa_t serv
1021
1029
*/
1022
1030
if (server_public_key_len <= passwd_len + 41 ) {
1023
1031
/* password message is to long */
1024
- RSA_free (server_public_key );
1032
+ EVP_PKEY_free (server_public_key );
1025
1033
SET_CLIENT_ERROR (conn -> error_info , CR_UNKNOWN_ERROR , UNKNOWN_SQLSTATE , "password is too long" );
1026
1034
DBG_ERR ("password is too long" );
1027
1035
DBG_RETURN (0 );
1028
1036
}
1029
1037
1030
1038
* crypted = emalloc (server_public_key_len );
1031
- RSA_public_encrypt (passwd_len + 1 , (zend_uchar * ) xor_str , * crypted , server_public_key , RSA_PKCS1_OAEP_PADDING );
1032
- RSA_free (server_public_key );
1039
+ EVP_PKEY_CTX * ctx = EVP_PKEY_CTX_new (server_public_key , NULL );
1040
+ if (!ctx || EVP_PKEY_encrypt_init (ctx ) <= 0 ||
1041
+ EVP_PKEY_CTX_set_rsa_padding (ctx , RSA_PKCS1_OAEP_PADDING ) <= 0 ||
1042
+ EVP_PKEY_encrypt (ctx , * crypted , & server_public_key_len , (zend_uchar * ) xor_str , passwd_len + 1 ) <= 0 ) {
1043
+ DBG_ERR ("encrypt failed" );
1044
+ server_public_key_len = 0 ;
1045
+ }
1046
+ EVP_PKEY_CTX_free (ctx );
1047
+ EVP_PKEY_free (server_public_key );
1033
1048
DBG_RETURN (server_public_key_len );
1034
1049
}
1035
1050
/* }}} */
0 commit comments