@@ -29,32 +29,47 @@ void php_openssl_backend_shutdown(void)
2929 (void ) 0 ;
3030}
3131
32- void php_openssl_backend_init_libctx (OSSL_LIB_CTX * * plibctx , char * * ppropq )
32+ #define PHP_OPENSSL_DEFAULT_CONF_MFLAGS \
33+ (CONF_MFLAGS_DEFAULT_SECTION | CONF_MFLAGS_IGNORE_MISSING_FILE | CONF_MFLAGS_IGNORE_RETURN_CODES)
34+
35+ void php_openssl_backend_init_libctx (struct php_openssl_libctx * ctx )
3336{
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 ;
37+ ctx -> default_libctx = OSSL_LIB_CTX_get0_global_default ();
38+ ctx -> custom_libctx = OSSL_LIB_CTX_new ();
39+ if (ctx -> custom_libctx != NULL ) {
40+ /* This is not being checked because there is not much that can be done. */
41+ CONF_modules_load_file_ex (ctx -> custom_libctx , NULL , NULL ,
42+ PHP_OPENSSL_DEFAULT_CONF_MFLAGS );
43+ #ifdef LOAD_OPENSSL_LEGACY_PROVIDER
44+ OSSL_PROVIDER_load (ctx -> custom_libctx , "legacy" );
45+ OSSL_PROVIDER_load (ctx -> custom_libctx , "default" );
46+ #endif
47+ ctx -> libctx = ctx -> custom_libctx ;
48+ } else {
49+ /* If creation fails, just fallback to default */
50+ ctx -> libctx = ctx -> default_libctx ;
51+ }
52+ ctx -> propq = NULL ;
3853}
3954
40- void php_openssl_backend_destroy_libctx (OSSL_LIB_CTX * libctx , char * propq )
55+ void php_openssl_backend_destroy_libctx (struct php_openssl_libctx * ctx )
4156{
42- if (libctx != NULL ) {
43- OSSL_LIB_CTX_free (libctx );
57+ if (ctx -> custom_libctx != NULL ) {
58+ OSSL_LIB_CTX_free (ctx -> custom_libctx );
4459 }
45- if (propq != NULL ) {
46- free (propq );
60+ if (ctx -> propq != NULL ) {
61+ free (ctx -> propq );
4762 }
4863}
4964
5065EVP_PKEY_CTX * php_openssl_pkey_new_from_name (const char * name , int id )
5166{
52- return EVP_PKEY_CTX_new_from_name (OPENSSL_G ( libctx ) , name , OPENSSL_G ( propq ) );
67+ return EVP_PKEY_CTX_new_from_name (PHP_OPENSSL_LIBCTX , name , PHP_OPENSSL_PROPQ );
5368}
5469
5570EVP_PKEY_CTX * php_openssl_pkey_new_from_pkey (EVP_PKEY * pkey )
5671{
57- return EVP_PKEY_CTX_new_from_pkey (OPENSSL_G ( libctx ) , pkey , OPENSSL_G ( propq ) );
72+ return EVP_PKEY_CTX_new_from_pkey (PHP_OPENSSL_LIBCTX , pkey , PHP_OPENSSL_PROPQ );
5873}
5974
6075EVP_PKEY * php_openssl_pkey_init_rsa (zval * data )
@@ -299,7 +314,7 @@ EVP_PKEY *php_openssl_pkey_init_ec(zval *data, bool *is_private) {
299314 goto cleanup ;
300315 }
301316
302- if (!(group = EC_GROUP_new_by_curve_name_ex (OPENSSL_G ( libctx ), OPENSSL_G ( propq ) , nid ))) {
317+ if (!(group = EC_GROUP_new_by_curve_name_ex (PHP_OPENSSL_LIBCTX , PHP_OPENSSL_PROPQ , nid ))) {
303318 goto cleanup ;
304319 }
305320
@@ -698,7 +713,7 @@ zend_string *php_openssl_dh_compute_key(EVP_PKEY *pkey, char *pub_str, size_t pu
698713
699714const EVP_MD * php_openssl_get_evp_md_by_name (const char * name )
700715{
701- return EVP_MD_fetch (OPENSSL_G ( libctx ) , name , OPENSSL_G ( propq ) );
716+ return EVP_MD_fetch (PHP_OPENSSL_LIBCTX , name , PHP_OPENSSL_PROPQ );
702717}
703718
704719static const char * php_openssl_digest_names [] = {
@@ -754,7 +769,7 @@ static const char *php_openssl_cipher_names[] = {
754769
755770const EVP_CIPHER * php_openssl_get_evp_cipher_by_name (const char * name )
756771{
757- return EVP_CIPHER_fetch (OPENSSL_G ( libctx ) , name , OPENSSL_G ( propq ) );
772+ return EVP_CIPHER_fetch (PHP_OPENSSL_LIBCTX , name , PHP_OPENSSL_PROPQ );
758773}
759774
760775const EVP_CIPHER * php_openssl_get_evp_cipher_from_algo (zend_long algo )
@@ -805,7 +820,7 @@ static int php_openssl_compare_func(Bucket *a, Bucket *b)
805820void php_openssl_get_cipher_methods (zval * return_value , bool aliases )
806821{
807822 array_init (return_value );
808- EVP_CIPHER_do_all_provided (OPENSSL_G ( libctx ) ,
823+ EVP_CIPHER_do_all_provided (PHP_OPENSSL_LIBCTX ,
809824 aliases ? php_openssl_add_cipher_or_alias : php_openssl_add_cipher ,
810825 return_value );
811826 zend_hash_sort (Z_ARRVAL_P (return_value ), php_openssl_compare_func , 1 );
0 commit comments