22
22
#include <openssl/param_build.h>
23
23
#include <openssl/provider.h>
24
24
25
+ ZEND_EXTERN_MODULE_GLOBALS (openssl )
26
+
25
27
void php_openssl_backend_shutdown (void )
26
28
{
27
29
(void ) 0 ;
28
30
}
29
31
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
+
30
60
EVP_PKEY * php_openssl_pkey_init_rsa (zval * data )
31
61
{
32
62
BIGNUM * n = NULL , * e = NULL , * d = NULL , * p = NULL , * q = NULL ;
33
63
BIGNUM * dmp1 = NULL , * dmq1 = NULL , * iqmp = NULL ;
34
64
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 );
36
66
OSSL_PARAM * params = NULL ;
37
67
OSSL_PARAM_BLD * bld = OSSL_PARAM_BLD_new ();
38
68
@@ -100,7 +130,7 @@ EVP_PKEY *php_openssl_pkey_init_dsa(zval *data, bool *is_private)
100
130
{
101
131
BIGNUM * p = NULL , * q = NULL , * g = NULL , * priv_key = NULL , * pub_key = NULL ;
102
132
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 );
104
134
OSSL_PARAM * params = NULL ;
105
135
OSSL_PARAM_BLD * bld = OSSL_PARAM_BLD_new ();
106
136
@@ -144,7 +174,7 @@ EVP_PKEY *php_openssl_pkey_init_dsa(zval *data, bool *is_private)
144
174
} else {
145
175
* is_private = true;
146
176
EVP_PKEY_CTX_free (ctx );
147
- ctx = EVP_PKEY_CTX_new (param_key , NULL );
177
+ ctx = php_openssl_pkey_new_from_pkey (param_key );
148
178
if (EVP_PKEY_keygen_init (ctx ) <= 0 || EVP_PKEY_keygen (ctx , & pkey ) <= 0 ) {
149
179
goto cleanup ;
150
180
}
@@ -168,7 +198,7 @@ EVP_PKEY *php_openssl_pkey_init_dh(zval *data, bool *is_private)
168
198
{
169
199
BIGNUM * p = NULL , * q = NULL , * g = NULL , * priv_key = NULL , * pub_key = NULL ;
170
200
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 );
172
202
OSSL_PARAM * params = NULL ;
173
203
OSSL_PARAM_BLD * bld = OSSL_PARAM_BLD_new ();
174
204
@@ -219,7 +249,7 @@ EVP_PKEY *php_openssl_pkey_init_dh(zval *data, bool *is_private)
219
249
} else {
220
250
* is_private = true;
221
251
EVP_PKEY_CTX_free (ctx );
222
- ctx = EVP_PKEY_CTX_new (param_key , NULL );
252
+ ctx = php_openssl_pkey_new_from_pkey (param_key );
223
253
if (EVP_PKEY_keygen_init (ctx ) <= 0 || EVP_PKEY_keygen (ctx , & pkey ) <= 0 ) {
224
254
goto cleanup ;
225
255
}
@@ -250,7 +280,7 @@ EVP_PKEY *php_openssl_pkey_init_ec(zval *data, bool *is_private) {
250
280
unsigned char * point_q_buf = NULL ;
251
281
EC_GROUP * group = NULL ;
252
282
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 );
254
284
BN_CTX * bctx = BN_CTX_new ();
255
285
OSSL_PARAM * params = NULL ;
256
286
OSSL_PARAM_BLD * bld = OSSL_PARAM_BLD_new ();
@@ -269,7 +299,7 @@ EVP_PKEY *php_openssl_pkey_init_ec(zval *data, bool *is_private) {
269
299
goto cleanup ;
270
300
}
271
301
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 ))) {
273
303
goto cleanup ;
274
304
}
275
305
@@ -438,7 +468,7 @@ EVP_PKEY *php_openssl_pkey_init_ec(zval *data, bool *is_private) {
438
468
}
439
469
#endif
440
470
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 ) {
442
472
EVP_PKEY * pkey = NULL ;
443
473
EVP_PKEY_CTX * ctx = NULL ;
444
474
OSSL_PARAM * params = NULL ;
@@ -466,7 +496,7 @@ void php_openssl_pkey_object_curve_25519_448(zval *return_value, int key_type, z
466
496
}
467
497
468
498
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 );
470
500
if (!params || !ctx ) {
471
501
goto cleanup ;
472
502
}
0 commit comments