2222#include <openssl/param_build.h>
2323#include <openssl/provider.h>
2424
25+ ZEND_EXTERN_MODULE_GLOBALS (openssl )
26+
2527void php_openssl_backend_shutdown (void )
2628{
2729 (void ) 0 ;
2830}
2931
32+ void php_openssl_backend_init_libctx (OSSL_LIB_CTX * * plibctx , char * * ppropq )
33+ {
34+ /* The return value is not checked because we cannot reasonable fail in GINIT so using NULL
35+ * (default context) is probably better. */
36+ * plibctx = OSSL_LIB_CTX_new ();
37+ * ppropq = NULL ;
38+ }
39+
40+ void php_openssl_backend_destroy_libctx (OSSL_LIB_CTX * libctx , char * propq )
41+ {
42+ if (libctx != NULL ) {
43+ OSSL_LIB_CTX_free (libctx );
44+ }
45+ if (propq != NULL ) {
46+ free (propq );
47+ }
48+ }
49+
50+ EVP_PKEY_CTX * php_openssl_pkey_new_from_name (const char * name , int id )
51+ {
52+ return EVP_PKEY_CTX_new_from_name (OPENSSL_G (libctx ), name , OPENSSL_G (propq ));
53+ }
54+
55+ EVP_PKEY_CTX * php_openssl_pkey_new_from_pkey (EVP_PKEY * pkey )
56+ {
57+ return EVP_PKEY_CTX_new_from_pkey (OPENSSL_G (libctx ), pkey , OPENSSL_G (propq ));
58+ }
59+
3060EVP_PKEY * php_openssl_pkey_init_rsa (zval * data )
3161{
3262 BIGNUM * n = NULL , * e = NULL , * d = NULL , * p = NULL , * q = NULL ;
3363 BIGNUM * dmp1 = NULL , * dmq1 = NULL , * iqmp = NULL ;
3464 EVP_PKEY * pkey = NULL ;
35- EVP_PKEY_CTX * ctx = EVP_PKEY_CTX_new_id ( EVP_PKEY_RSA , NULL );
65+ EVP_PKEY_CTX * ctx = php_openssl_pkey_new_from_name ( "RSA" , EVP_PKEY_RSA );
3666 OSSL_PARAM * params = NULL ;
3767 OSSL_PARAM_BLD * bld = OSSL_PARAM_BLD_new ();
3868
@@ -100,7 +130,7 @@ EVP_PKEY *php_openssl_pkey_init_dsa(zval *data, bool *is_private)
100130{
101131 BIGNUM * p = NULL , * q = NULL , * g = NULL , * priv_key = NULL , * pub_key = NULL ;
102132 EVP_PKEY * param_key = NULL , * pkey = NULL ;
103- EVP_PKEY_CTX * ctx = EVP_PKEY_CTX_new_id ( EVP_PKEY_DSA , NULL );
133+ EVP_PKEY_CTX * ctx = php_openssl_pkey_new_from_name ( "DSA" , EVP_PKEY_DSA );
104134 OSSL_PARAM * params = NULL ;
105135 OSSL_PARAM_BLD * bld = OSSL_PARAM_BLD_new ();
106136
@@ -144,7 +174,7 @@ EVP_PKEY *php_openssl_pkey_init_dsa(zval *data, bool *is_private)
144174 } else {
145175 * is_private = true;
146176 EVP_PKEY_CTX_free (ctx );
147- ctx = EVP_PKEY_CTX_new (param_key , NULL );
177+ ctx = php_openssl_pkey_new_from_pkey (param_key );
148178 if (EVP_PKEY_keygen_init (ctx ) <= 0 || EVP_PKEY_keygen (ctx , & pkey ) <= 0 ) {
149179 goto cleanup ;
150180 }
@@ -168,7 +198,7 @@ EVP_PKEY *php_openssl_pkey_init_dh(zval *data, bool *is_private)
168198{
169199 BIGNUM * p = NULL , * q = NULL , * g = NULL , * priv_key = NULL , * pub_key = NULL ;
170200 EVP_PKEY * param_key = NULL , * pkey = NULL ;
171- EVP_PKEY_CTX * ctx = EVP_PKEY_CTX_new_id ( EVP_PKEY_DH , NULL );
201+ EVP_PKEY_CTX * ctx = php_openssl_pkey_new_from_name ( "DH" , EVP_PKEY_DH );
172202 OSSL_PARAM * params = NULL ;
173203 OSSL_PARAM_BLD * bld = OSSL_PARAM_BLD_new ();
174204
@@ -219,7 +249,7 @@ EVP_PKEY *php_openssl_pkey_init_dh(zval *data, bool *is_private)
219249 } else {
220250 * is_private = true;
221251 EVP_PKEY_CTX_free (ctx );
222- ctx = EVP_PKEY_CTX_new (param_key , NULL );
252+ ctx = php_openssl_pkey_new_from_pkey (param_key );
223253 if (EVP_PKEY_keygen_init (ctx ) <= 0 || EVP_PKEY_keygen (ctx , & pkey ) <= 0 ) {
224254 goto cleanup ;
225255 }
@@ -250,7 +280,7 @@ EVP_PKEY *php_openssl_pkey_init_ec(zval *data, bool *is_private) {
250280 unsigned char * point_q_buf = NULL ;
251281 EC_GROUP * group = NULL ;
252282 EVP_PKEY * param_key = NULL , * pkey = NULL ;
253- EVP_PKEY_CTX * ctx = EVP_PKEY_CTX_new_id ( EVP_PKEY_EC , NULL );
283+ EVP_PKEY_CTX * ctx = php_openssl_pkey_new_from_name ( "EC" , EVP_PKEY_EC );
254284 BN_CTX * bctx = BN_CTX_new ();
255285 OSSL_PARAM * params = NULL ;
256286 OSSL_PARAM_BLD * bld = OSSL_PARAM_BLD_new ();
@@ -269,7 +299,7 @@ EVP_PKEY *php_openssl_pkey_init_ec(zval *data, bool *is_private) {
269299 goto cleanup ;
270300 }
271301
272- if (!(group = EC_GROUP_new_by_curve_name ( nid ))) {
302+ if (!(group = EC_GROUP_new_by_curve_name_ex ( OPENSSL_G ( libctx ), OPENSSL_G ( propq ), nid ))) {
273303 goto cleanup ;
274304 }
275305
@@ -438,7 +468,7 @@ EVP_PKEY *php_openssl_pkey_init_ec(zval *data, bool *is_private) {
438468}
439469#endif
440470
441- void php_openssl_pkey_object_curve_25519_448 (zval * return_value , int key_type , zval * data ) {
471+ void php_openssl_pkey_object_curve_25519_448 (zval * return_value , const char * name , zval * data ) {
442472 EVP_PKEY * pkey = NULL ;
443473 EVP_PKEY_CTX * ctx = NULL ;
444474 OSSL_PARAM * params = NULL ;
@@ -466,7 +496,7 @@ void php_openssl_pkey_object_curve_25519_448(zval *return_value, int key_type, z
466496 }
467497
468498 params = OSSL_PARAM_BLD_to_param (bld );
469- ctx = EVP_PKEY_CTX_new_id ( key_type , NULL );
499+ ctx = php_openssl_pkey_new_from_name ( name , 0 );
470500 if (!params || !ctx ) {
471501 goto cleanup ;
472502 }
0 commit comments