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