]> git.pld-linux.org Git - packages/php.git/blame - openssl.patch
- release 5 (by relup.sh)
[packages/php.git] / openssl.patch
CommitLineData
e52c962c
AM
1--- php-5.6.38/ext/openssl/openssl.c 2018-09-12 00:12:36.000000000 +0200
2+++ php-5.6.38/ext/openssl/openssl.c 2018-09-14 14:30:33.582224863 +0200
3@@ -531,6 +531,14 @@ zend_module_entry openssl_module_entry =
4 ZEND_GET_MODULE(openssl)
5 #endif
6
7+/* {{{ OpenSSL compatibility functions and macros */
8+#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined (LIBRESSL_VERSION_NUMBER)
9+#define EVP_PKEY_get0_RSA(_pkey) _pkey->pkey.rsa
10+#define EVP_PKEY_get0_DH(_pkey) _pkey->pkey.dh
11+#define EVP_PKEY_get0_DSA(_pkey) _pkey->pkey.dsa
12+#define EVP_PKEY_get0_EC_KEY(_pkey) _pkey->pkey.ec
13+#endif
14+
15 static int le_key;
16 static int le_x509;
17 static int le_csr;
18@@ -1053,9 +1061,11 @@ static EVP_MD * php_openssl_get_evp_md_f
19 mdtype = (EVP_MD *) EVP_md2();
20 break;
21 #endif
22+#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined (LIBRESSL_VERSION_NUMBER)
23 case OPENSSL_ALGO_DSS1:
24 mdtype = (EVP_MD *) EVP_dss1();
25 break;
26+#endif
27 #if OPENSSL_VERSION_NUMBER >= 0x0090708fL
28 case OPENSSL_ALGO_SHA224:
29 mdtype = (EVP_MD *) EVP_sha224();
30@@ -1893,6 +1903,7 @@ static int openssl_x509v3_subjectAltName
31 {
32 GENERAL_NAMES *names;
33 const X509V3_EXT_METHOD *method = NULL;
34+ ASN1_OCTET_STRING *extension_data;
35 long i, length, num;
36 const unsigned char *p;
37
38@@ -1901,8 +1912,9 @@ static int openssl_x509v3_subjectAltName
39 return -1;
40 }
41
42- p = extension->value->data;
43- length = extension->value->length;
44+ extension_data = X509_EXTENSION_get_data(extension);
45+ p = extension_data->data;
46+ length = extension_data->length;
47 if (method->it) {
48 names = (GENERAL_NAMES*)(ASN1_item_d2i(NULL, &p, length,
49 ASN1_ITEM_ptr(method->it)));
50@@ -1965,6 +1977,8 @@ PHP_FUNCTION(openssl_x509_parse)
51 char * tmpstr;
52 zval * subitem;
53 X509_EXTENSION *extension;
54+ X509_NAME *subject_name;
55+ char *cert_name;
56 char *extname;
57 BIO *bio_out;
58 BUF_MEM *bio_buf;
59@@ -1979,12 +1993,12 @@ PHP_FUNCTION(openssl_x509_parse)
60 }
61 array_init(return_value);
62
63- if (cert->name) {
64- add_assoc_string(return_value, "name", cert->name, 1);
65- }
66-/* add_assoc_bool(return_value, "valid", cert->valid); */
67+ subject_name = X509_get_subject_name(cert);
68+ cert_name = X509_NAME_oneline(subject_name, NULL, 0);
69+ add_assoc_string(return_value, "name", cert_name, 1);
70+ OPENSSL_free(cert_name);
71
72- add_assoc_name_entry(return_value, "subject", X509_get_subject_name(cert), useshortnames TSRMLS_CC);
73+ add_assoc_name_entry(return_value, "subject", subject_name, useshortnames TSRMLS_CC);
74 /* hash as used in CA directories to lookup cert by subject name */
75 {
76 char buf[32];
77@@ -2008,7 +2022,7 @@ PHP_FUNCTION(openssl_x509_parse)
78 add_assoc_string(return_value, "alias", tmpstr, 1);
79 }
80
81- sig_nid = OBJ_obj2nid((cert)->sig_alg->algorithm);
82+ sig_nid = X509_get_signature_nid(cert);
83 add_assoc_string(return_value, "signatureTypeSN", (char*)OBJ_nid2sn(sig_nid), 1);
84 add_assoc_string(return_value, "signatureTypeLN", (char*)OBJ_nid2ln(sig_nid), 1);
85 add_assoc_long(return_value, "signatureTypeNID", sig_nid);
86@@ -3482,13 +3496,20 @@ static int php_openssl_is_private_key(EV
87 {
88 assert(pkey != NULL);
89
90- switch (pkey->type) {
91+ switch (EVP_PKEY_id(pkey)) {
92 #ifndef NO_RSA
93 case EVP_PKEY_RSA:
94 case EVP_PKEY_RSA2:
95- assert(pkey->pkey.rsa != NULL);
96- if (pkey->pkey.rsa != NULL && (NULL == pkey->pkey.rsa->p || NULL == pkey->pkey.rsa->q)) {
97- return 0;
98+ {
99+ RSA *rsa = EVP_PKEY_get0_RSA(pkey);
100+ if (rsa != NULL) {
101+ const BIGNUM *p, *q;
102+
103+ RSA_get0_factors(rsa, &p, &q);
104+ if (p == NULL || q == NULL) {
105+ return 0;
106+ }
107+ }
108 }
109 break;
110 #endif
111@@ -3498,28 +3519,51 @@ static int php_openssl_is_private_key(EV
112 case EVP_PKEY_DSA2:
113 case EVP_PKEY_DSA3:
114 case EVP_PKEY_DSA4:
115- assert(pkey->pkey.dsa != NULL);
116+ {
117+ DSA *dsa = EVP_PKEY_get0_DSA(pkey);
118+ if (dsa != NULL) {
119+ const BIGNUM *p, *q, *g, *pub_key, *priv_key;
120+
121+ DSA_get0_pqg(dsa, &p, &q, &g);
122+ if (p == NULL || q == NULL) {
123+ return 0;
124+ }
125
126- if (NULL == pkey->pkey.dsa->p || NULL == pkey->pkey.dsa->q || NULL == pkey->pkey.dsa->priv_key){
127- return 0;
128+ DSA_get0_key(dsa, &pub_key, &priv_key);
129+ if (priv_key == NULL) {
130+ return 0;
131+ }
132+ }
133 }
134 break;
135 #endif
136 #ifndef NO_DH
137 case EVP_PKEY_DH:
138- assert(pkey->pkey.dh != NULL);
139+ {
140+ DH *dh = EVP_PKEY_get0_DH(pkey);
141+ if (dh != NULL) {
142+ const BIGNUM *p, *q, *g, *pub_key, *priv_key;
143+
144+ DH_get0_pqg(dh, &p, &q, &g);
145+ if (p == NULL) {
146+ return 0;
147+ }
148
149- if (NULL == pkey->pkey.dh->p || NULL == pkey->pkey.dh->priv_key) {
150- return 0;
151+ DH_get0_key(dh, &pub_key, &priv_key);
152+ if (priv_key == NULL) {
153+ return 0;
154+ }
155+ }
156 }
157 break;
158 #endif
159 #ifdef HAVE_EVP_PKEY_EC
160 case EVP_PKEY_EC:
161- assert(pkey->pkey.ec != NULL);
162-
163- if ( NULL == EC_KEY_get0_private_key(pkey->pkey.ec)) {
164- return 0;
165+ {
166+ EC_KEY *ec = EVP_PKEY_get0_EC_KEY(pkey);
167+ if (ec != NULL && NULL == EC_KEY_get0_private_key(ec)) {
168+ return 0;
169+ }
170 }
171 break;
172 #endif
173@@ -3531,42 +3575,89 @@ static int php_openssl_is_private_key(EV
174 }
175 /* }}} */
176
177-#define OPENSSL_PKEY_GET_BN(_type, _name) do { \
178- if (pkey->pkey._type->_name != NULL) { \
179- int len = BN_num_bytes(pkey->pkey._type->_name); \
180- char *str = emalloc(len + 1); \
181- BN_bn2bin(pkey->pkey._type->_name, (unsigned char*)str); \
182- str[len] = 0; \
183- add_assoc_stringl(_type, #_name, str, len, 0); \
184- } \
185- } while (0)
186-
187-#define OPENSSL_PKEY_SET_BN(_ht, _type, _name) do { \
188- zval **bn; \
189- if (zend_hash_find(_ht, #_name, sizeof(#_name), (void**)&bn) == SUCCESS && \
190- Z_TYPE_PP(bn) == IS_STRING) { \
191- _type->_name = BN_bin2bn( \
192- (unsigned char*)Z_STRVAL_PP(bn), \
193- Z_STRLEN_PP(bn), NULL); \
194- } \
195- } while (0);
196+#define OPENSSL_GET_BN(_array, _bn, _name) do { \
197+ if (_bn != NULL) { \
198+ int len = BN_num_bytes(_bn); \
199+ char *str = emalloc(len + 1); \
200+ BN_bn2bin(_bn, (unsigned char*)str); \
201+ str[len] = 0; \
202+ add_assoc_stringl(&_array, #_name, str, len, 0); \
203+ } \
204+} while (0);
205+
206+#define OPENSSL_PKEY_GET_BN(_type, _name) OPENSSL_GET_BN(_type, _name, _name)
207+
208+#define OPENSSL_PKEY_SET_BN(_data, _name) do { \
209+ zval **bn; \
210+ if (zend_hash_find(Z_ARRVAL_PP(_data), #_name, sizeof(#_name), (void**)bn) == SUCCESS && \
211+ Z_TYPE_PP(bn) == IS_STRING) { \
212+ _name = BN_bin2bn( \
213+ (unsigned char*)Z_STRVAL_PP(bn), \
214+ (int)Z_STRLEN_PP(bn), NULL); \
215+ } else { \
216+ _name = NULL; \
217+ } \
218+} while (0);
219+
220+/* {{{ php_openssl_pkey_init_rsa */
221+zend_bool php_openssl_pkey_init_and_assign_rsa(EVP_PKEY *pkey, RSA *rsa, zval **data)
222+{
223+ BIGNUM *n, *e, *d, *p, *q, *dmp1, *dmq1, *iqmp;
224+
225+ OPENSSL_PKEY_SET_BN(data, n);
226+ OPENSSL_PKEY_SET_BN(data, e);
227+ OPENSSL_PKEY_SET_BN(data, d);
228+ if (!n || !d || !RSA_set0_key(rsa, n, e, d)) {
229+ return 0;
230+ }
231+
232+ OPENSSL_PKEY_SET_BN(data, p);
233+ OPENSSL_PKEY_SET_BN(data, q);
234+ if ((p || q) && !RSA_set0_factors(rsa, p, q)) {
235+ return 0;
236+ }
237+
238+ OPENSSL_PKEY_SET_BN(data, dmp1);
239+ OPENSSL_PKEY_SET_BN(data, dmq1);
240+ OPENSSL_PKEY_SET_BN(data, iqmp);
241+ if ((dmp1 || dmq1 || iqmp) && !RSA_set0_crt_params(rsa, dmp1, dmq1, iqmp)) {
242+ return 0;
243+ }
244+
245+ if (!EVP_PKEY_assign_RSA(pkey, rsa)) {
246+ return 0;
247+ }
248+
249+ return 1;
250+}
251
252 /* {{{ php_openssl_pkey_init_dsa */
253-zend_bool php_openssl_pkey_init_dsa(DSA *dsa)
254+zend_bool php_openssl_pkey_init_dsa(DSA *dsa, zval **data)
255 {
256- if (!dsa->p || !dsa->q || !dsa->g) {
257+ BIGNUM *p, *q, *g, *priv_key, *pub_key;
258+ const BIGNUM *priv_key_const, *pub_key_const;
259+
260+ OPENSSL_PKEY_SET_BN(data, p);
261+ OPENSSL_PKEY_SET_BN(data, q);
262+ OPENSSL_PKEY_SET_BN(data, g);
263+ if (!p || !q || !g || !DSA_set0_pqg(dsa, p, q, g)) {
264 return 0;
265 }
266- if (dsa->priv_key || dsa->pub_key) {
267- return 1;
268+ OPENSSL_PKEY_SET_BN(data, pub_key);
269+ OPENSSL_PKEY_SET_BN(data, priv_key);
270+ if (pub_key) {
271+ return DSA_set0_key(dsa, pub_key, priv_key);
272 }
273+
274+ /* generate key */
275 PHP_OPENSSL_RAND_ADD_TIME();
276 if (!DSA_generate_key(dsa)) {
277 return 0;
278 }
279 /* if BN_mod_exp return -1, then DSA_generate_key succeed for failed key
280 * so we need to double check that public key is created */
281- if (!dsa->pub_key || BN_is_zero(dsa->pub_key)) {
282+ DSA_get0_key(dsa, &pub_key_const, &priv_key_const);
283+ if (!pub_key_const || BN_is_zero(pub_key_const)) {
284 return 0;
285 }
286 /* all good */
287@@ -3574,15 +3665,68 @@ zend_bool php_openssl_pkey_init_dsa(DSA
288 }
289 /* }}} */
290
291+/* {{{ php_openssl_dh_pub_from_priv */
292+static BIGNUM *php_openssl_dh_pub_from_priv(BIGNUM *priv_key, BIGNUM *g, BIGNUM *p)
293+{
294+ BIGNUM *pub_key, *priv_key_const_time;
295+ BN_CTX *ctx;
296+
297+ pub_key = BN_new();
298+ if (pub_key == NULL) {
299+ return NULL;
300+ }
301+
302+ priv_key_const_time = BN_new();
303+ if (priv_key_const_time == NULL) {
304+ BN_free(pub_key);
305+ return NULL;
306+ }
307+ ctx = BN_CTX_new();
308+ if (ctx == NULL) {
309+ BN_free(pub_key);
310+ BN_free(priv_key_const_time);
311+ return NULL;
312+ }
313+
314+ BN_with_flags(priv_key_const_time, priv_key, BN_FLG_CONSTTIME);
315+
316+ if (!BN_mod_exp_mont(pub_key, g, priv_key_const_time, p, ctx, NULL)) {
317+ BN_free(pub_key);
318+ pub_key = NULL;
319+ }
320+
321+ BN_free(priv_key_const_time);
322+ BN_CTX_free(ctx);
323+
324+ return pub_key;
325+}
326+/* }}} */
327+
328 /* {{{ php_openssl_pkey_init_dh */
329-zend_bool php_openssl_pkey_init_dh(DH *dh)
330+zend_bool php_openssl_pkey_init_dh(DH *dh, zval **data)
331 {
332- if (!dh->p || !dh->g) {
333+ BIGNUM *p, *q, *g, *priv_key, *pub_key;
334+
335+ OPENSSL_PKEY_SET_BN(data, p);
336+ OPENSSL_PKEY_SET_BN(data, q);
337+ OPENSSL_PKEY_SET_BN(data, g);
338+ if (!p || !g || !DH_set0_pqg(dh, p, q, g)) {
339 return 0;
340 }
341- if (dh->pub_key) {
342- return 1;
343+ OPENSSL_PKEY_SET_BN(data, priv_key);
344+ OPENSSL_PKEY_SET_BN(data, pub_key);
345+ if (pub_key) {
346+ return DH_set0_key(dh, pub_key, priv_key);
347+ }
348+ if (priv_key) {
349+ pub_key = php_openssl_dh_pub_from_priv(priv_key, g, p);
350+ if (pub_key == NULL) {
351+ return 0;
352+ }
353+ return DH_set0_key(dh, pub_key, priv_key);
354 }
355+
356+ /* generate key */
357 PHP_OPENSSL_RAND_ADD_TIME();
358 if (!DH_generate_key(dh)) {
359 return 0;
360@@ -3614,18 +3758,8 @@ PHP_FUNCTION(openssl_pkey_new)
361 if (pkey) {
362 RSA *rsa = RSA_new();
363 if (rsa) {
364- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, n);
365- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, e);
366- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, d);
367- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, p);
368- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, q);
369- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, dmp1);
370- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, dmq1);
371- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, iqmp);
372- if (rsa->n && rsa->d) {
373- if (EVP_PKEY_assign_RSA(pkey, rsa)) {
374- RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
375- }
376+ if (php_openssl_pkey_init_and_assign_rsa(pkey, rsa, data)) {
377+ RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
378 }
379 RSA_free(rsa);
380 }
381@@ -3638,12 +3772,7 @@ PHP_FUNCTION(openssl_pkey_new)
382 if (pkey) {
383 DSA *dsa = DSA_new();
384 if (dsa) {
385- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, p);
386- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, q);
387- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, g);
388- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, priv_key);
389- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, pub_key);
390- if (php_openssl_pkey_init_dsa(dsa)) {
391+ if (php_openssl_pkey_init_dsa(dsa, data)) {
392 if (EVP_PKEY_assign_DSA(pkey, dsa)) {
393 RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
394 }
395@@ -3659,11 +3788,7 @@ PHP_FUNCTION(openssl_pkey_new)
396 if (pkey) {
397 DH *dh = DH_new();
398 if (dh) {
399- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, p);
400- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, g);
401- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, priv_key);
402- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, pub_key);
403- if (php_openssl_pkey_init_dh(dh)) {
404+ if (php_openssl_pkey_init_dh(dh, data)) {
405 if (EVP_PKEY_assign_DH(pkey, dh)) {
406 RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
407 }
408@@ -3738,7 +3863,7 @@ PHP_FUNCTION(openssl_pkey_export_to_file
409 cipher = NULL;
410 }
411
412- switch (EVP_PKEY_type(key->type)) {
413+ switch (EVP_PKEY_base_id(key)) {
414 #ifdef HAVE_EVP_PKEY_EC
415 case EVP_PKEY_EC:
416 pem_write = PEM_write_bio_ECPrivateKey(bio_out, EVP_PKEY_get1_EC_KEY(key), cipher, (unsigned char *)passphrase, passphrase_len, NULL, NULL);
417@@ -3807,7 +3932,7 @@ PHP_FUNCTION(openssl_pkey_export)
418 cipher = NULL;
419 }
420
421- switch (EVP_PKEY_type(key->type)) {
422+ switch (EVP_PKEY_base_id(key)) {
423 #ifdef HAVE_EVP_PKEY_EC
424 case EVP_PKEY_EC:
425 pem_write = PEM_write_bio_ECPrivateKey(bio_out, EVP_PKEY_get1_EC_KEY(key), cipher, (unsigned char *)passphrase, passphrase_len, NULL, NULL);
426@@ -3928,25 +4053,32 @@ PHP_FUNCTION(openssl_pkey_get_details)
427 /*TODO: Use the real values once the openssl constants are used
428 * See the enum at the top of this file
429 */
430- switch (EVP_PKEY_type(pkey->type)) {
431+ switch (EVP_PKEY_base_id(pkey)) {
432 case EVP_PKEY_RSA:
433 case EVP_PKEY_RSA2:
434- ktype = OPENSSL_KEYTYPE_RSA;
435-
436- if (pkey->pkey.rsa != NULL) {
437- zval *rsa;
438-
439- ALLOC_INIT_ZVAL(rsa);
440- array_init(rsa);
441- OPENSSL_PKEY_GET_BN(rsa, n);
442- OPENSSL_PKEY_GET_BN(rsa, e);
443- OPENSSL_PKEY_GET_BN(rsa, d);
444- OPENSSL_PKEY_GET_BN(rsa, p);
445- OPENSSL_PKEY_GET_BN(rsa, q);
446- OPENSSL_PKEY_GET_BN(rsa, dmp1);
447- OPENSSL_PKEY_GET_BN(rsa, dmq1);
448- OPENSSL_PKEY_GET_BN(rsa, iqmp);
449- add_assoc_zval(return_value, "rsa", rsa);
450+ {
451+ RSA *rsa = EVP_PKEY_get0_RSA(pkey);
452+ ktype = OPENSSL_KEYTYPE_RSA;
453+
454+ if (rsa != NULL) {
455+ zval z_rsa;
456+ const BIGNUM *n, *e, *d, *p, *q, *dmp1, *dmq1, *iqmp;
457+
458+ RSA_get0_key(rsa, &n, &e, &d);
459+ RSA_get0_factors(rsa, &p, &q);
460+ RSA_get0_crt_params(rsa, &dmp1, &dmq1, &iqmp);
461+
462+ array_init(&z_rsa);
463+ OPENSSL_PKEY_GET_BN(z_rsa, n);
464+ OPENSSL_PKEY_GET_BN(z_rsa, e);
465+ OPENSSL_PKEY_GET_BN(z_rsa, d);
466+ OPENSSL_PKEY_GET_BN(z_rsa, p);
467+ OPENSSL_PKEY_GET_BN(z_rsa, q);
468+ OPENSSL_PKEY_GET_BN(z_rsa, dmp1);
469+ OPENSSL_PKEY_GET_BN(z_rsa, dmq1);
470+ OPENSSL_PKEY_GET_BN(z_rsa, iqmp);
471+ add_assoc_zval(return_value, "rsa", &z_rsa);
472+ }
473 }
474
475 break;
476@@ -3954,42 +4086,53 @@ PHP_FUNCTION(openssl_pkey_get_details)
477 case EVP_PKEY_DSA2:
478 case EVP_PKEY_DSA3:
479 case EVP_PKEY_DSA4:
480- ktype = OPENSSL_KEYTYPE_DSA;
481-
482- if (pkey->pkey.dsa != NULL) {
483- zval *dsa;
484-
485- ALLOC_INIT_ZVAL(dsa);
486- array_init(dsa);
487- OPENSSL_PKEY_GET_BN(dsa, p);
488- OPENSSL_PKEY_GET_BN(dsa, q);
489- OPENSSL_PKEY_GET_BN(dsa, g);
490- OPENSSL_PKEY_GET_BN(dsa, priv_key);
491- OPENSSL_PKEY_GET_BN(dsa, pub_key);
492- add_assoc_zval(return_value, "dsa", dsa);
493+ {
494+ DSA *dsa = EVP_PKEY_get0_DSA(pkey);
495+ ktype = OPENSSL_KEYTYPE_DSA;
496+
497+ if (dsa != NULL) {
498+ zval z_dsa;
499+ const BIGNUM *p, *q, *g, *priv_key, *pub_key;
500+
501+ DSA_get0_pqg(dsa, &p, &q, &g);
502+ DSA_get0_key(dsa, &pub_key, &priv_key);
503+
504+ array_init(&z_dsa);
505+ OPENSSL_PKEY_GET_BN(z_dsa, p);
506+ OPENSSL_PKEY_GET_BN(z_dsa, q);
507+ OPENSSL_PKEY_GET_BN(z_dsa, g);
508+ OPENSSL_PKEY_GET_BN(z_dsa, priv_key);
509+ OPENSSL_PKEY_GET_BN(z_dsa, pub_key);
510+ add_assoc_zval(return_value, "dsa", &z_dsa);
511+ }
512 }
513 break;
514 case EVP_PKEY_DH:
515-
516- ktype = OPENSSL_KEYTYPE_DH;
517-
518- if (pkey->pkey.dh != NULL) {
519- zval *dh;
520-
521- ALLOC_INIT_ZVAL(dh);
522- array_init(dh);
523- OPENSSL_PKEY_GET_BN(dh, p);
524- OPENSSL_PKEY_GET_BN(dh, g);
525- OPENSSL_PKEY_GET_BN(dh, priv_key);
526- OPENSSL_PKEY_GET_BN(dh, pub_key);
527- add_assoc_zval(return_value, "dh", dh);
528+ {
529+ DH *dh = EVP_PKEY_get0_DH(pkey);
530+ ktype = OPENSSL_KEYTYPE_DH;
531+
532+ if (dh != NULL) {
533+ zval z_dh;
534+ const BIGNUM *p, *q, *g, *priv_key, *pub_key;
535+
536+ DH_get0_pqg(dh, &p, &q, &g);
537+ DH_get0_key(dh, &pub_key, &priv_key);
538+
539+ array_init(&z_dh);
540+ OPENSSL_PKEY_GET_BN(z_dh, p);
541+ OPENSSL_PKEY_GET_BN(z_dh, g);
542+ OPENSSL_PKEY_GET_BN(z_dh, priv_key);
543+ OPENSSL_PKEY_GET_BN(z_dh, pub_key);
544+ add_assoc_zval(return_value, "dh", &z_dh);
545+ }
546 }
547
548 break;
549 #ifdef HAVE_EVP_PKEY_EC
550 case EVP_PKEY_EC:
551 ktype = OPENSSL_KEYTYPE_EC;
552- if (pkey->pkey.ec != NULL) {
553+ if (EVP_PKEY_get0_EC_KEY(pkey) != NULL) {
554 zval *ec;
555 const EC_GROUP *ec_group;
556 int nid;
557@@ -4546,13 +4689,13 @@ PHP_FUNCTION(openssl_private_encrypt)
558 cryptedlen = EVP_PKEY_size(pkey);
559 cryptedbuf = emalloc(cryptedlen + 1);
560
561- switch (pkey->type) {
562+ switch (EVP_PKEY_id(pkey)) {
563 case EVP_PKEY_RSA:
564 case EVP_PKEY_RSA2:
565 successful = (RSA_private_encrypt(data_len,
566 (unsigned char *)data,
567 cryptedbuf,
568- pkey->pkey.rsa,
569+ EVP_PKEY_get0_RSA(pkey),
570 padding) == cryptedlen);
571 break;
572 default:
573@@ -4604,13 +4747,13 @@ PHP_FUNCTION(openssl_private_decrypt)
574 cryptedlen = EVP_PKEY_size(pkey);
575 crypttemp = emalloc(cryptedlen + 1);
576
577- switch (pkey->type) {
578+ switch (EVP_PKEY_id(pkey)) {
579 case EVP_PKEY_RSA:
580 case EVP_PKEY_RSA2:
581 cryptedlen = RSA_private_decrypt(data_len,
582 (unsigned char *)data,
583 crypttemp,
584- pkey->pkey.rsa,
585+ EVP_PKEY_get0_RSA(pkey),
586 padding);
587 if (cryptedlen != -1) {
588 cryptedbuf = emalloc(cryptedlen + 1);
589@@ -4669,13 +4812,13 @@ PHP_FUNCTION(openssl_public_encrypt)
590 cryptedlen = EVP_PKEY_size(pkey);
591 cryptedbuf = emalloc(cryptedlen + 1);
592
593- switch (pkey->type) {
594+ switch (EVP_PKEY_id(pkey)) {
595 case EVP_PKEY_RSA:
596 case EVP_PKEY_RSA2:
597 successful = (RSA_public_encrypt(data_len,
598 (unsigned char *)data,
599- cryptedbuf,
600- pkey->pkey.rsa,
601+ cryptedbuf,
602+ EVP_PKEY_get0_RSA(pkey),
603 padding) == cryptedlen);
604 break;
605 default:
606@@ -4728,13 +4871,13 @@ PHP_FUNCTION(openssl_public_decrypt)
607 cryptedlen = EVP_PKEY_size(pkey);
608 crypttemp = emalloc(cryptedlen + 1);
609
610- switch (pkey->type) {
611+ switch (EVP_PKEY_id(pkey)) {
612 case EVP_PKEY_RSA:
613 case EVP_PKEY_RSA2:
614 cryptedlen = RSA_public_decrypt(data_len,
615 (unsigned char *)data,
616- crypttemp,
617- pkey->pkey.rsa,
618+ crypttemp,
619+ EVP_PKEY_get0_RSA(pkey),
620 padding);
621 if (cryptedlen != -1) {
622 cryptedbuf = emalloc(cryptedlen + 1);
623@@ -4798,7 +4941,7 @@ PHP_FUNCTION(openssl_sign)
624 long keyresource = -1;
625 char * data;
626 int data_len;
627- EVP_MD_CTX md_ctx;
628+ EVP_MD_CTX *md_ctx;
629 zval *method = NULL;
630 long signature_algo = OPENSSL_ALGO_SHA1;
631 const EVP_MD *mdtype;
632@@ -4831,9 +4974,11 @@ PHP_FUNCTION(openssl_sign)
633 siglen = EVP_PKEY_size(pkey);
634 sigbuf = emalloc(siglen + 1);
635
636- EVP_SignInit(&md_ctx, mdtype);
637- EVP_SignUpdate(&md_ctx, data, data_len);
638- if (EVP_SignFinal (&md_ctx, sigbuf,(unsigned int *)&siglen, pkey)) {
639+ md_ctx = EVP_MD_CTX_create();
640+ if (md_ctx != NULL &&
641+ EVP_SignInit(md_ctx, mdtype) &&
642+ EVP_SignUpdate(md_ctx, data, data_len) &&
643+ EVP_SignFinal(md_ctx, (unsigned char*)sigbuf, &siglen, pkey)) {
644 zval_dtor(signature);
645 sigbuf[siglen] = '\0';
646 ZVAL_STRINGL(signature, (char *)sigbuf, siglen, 0);
647@@ -4842,7 +4987,7 @@ PHP_FUNCTION(openssl_sign)
648 efree(sigbuf);
649 RETVAL_FALSE;
650 }
651- EVP_MD_CTX_cleanup(&md_ctx);
652+ EVP_MD_CTX_destroy(md_ctx);
653 if (keyresource == -1) {
654 EVP_PKEY_free(pkey);
655 }
656@@ -4855,8 +5000,8 @@ PHP_FUNCTION(openssl_verify)
657 {
658 zval **key;
659 EVP_PKEY *pkey;
660- int err;
661- EVP_MD_CTX md_ctx;
662+ int err = 0;
663+ EVP_MD_CTX *md_ctx;
664 const EVP_MD *mdtype;
665 long keyresource = -1;
666 char * data; int data_len;
667@@ -4890,10 +5035,13 @@ PHP_FUNCTION(openssl_verify)
668 RETURN_FALSE;
669 }
670
671- EVP_VerifyInit (&md_ctx, mdtype);
672- EVP_VerifyUpdate (&md_ctx, data, data_len);
673- err = EVP_VerifyFinal (&md_ctx, (unsigned char *)signature, signature_len, pkey);
674- EVP_MD_CTX_cleanup(&md_ctx);
675+ md_ctx = EVP_MD_CTX_create();
676+ if (md_ctx != NULL) {
677+ EVP_VerifyInit(md_ctx, mdtype);
678+ EVP_VerifyUpdate (md_ctx, data, data_len);
679+ err = EVP_VerifyFinal(md_ctx, (unsigned char *)signature, (unsigned int)signature_len, pkey);
680+ }
681+ EVP_MD_CTX_destroy(md_ctx);
682
683 if (keyresource == -1) {
684 EVP_PKEY_free(pkey);
685@@ -4917,7 +5065,7 @@ PHP_FUNCTION(openssl_seal)
686 char *method =NULL;
687 int method_len = 0;
688 const EVP_CIPHER *cipher;
689- EVP_CIPHER_CTX ctx;
690+ EVP_CIPHER_CTX *ctx;
691
692 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "szza/|s", &data, &data_len, &sealdata, &ekeys, &pubkeys, &method, &method_len) == FAILURE) {
693 return;
694@@ -4967,9 +5115,10 @@ PHP_FUNCTION(openssl_seal)
695 i++;
696 }
697
698- if (!EVP_EncryptInit(&ctx,cipher,NULL,NULL)) {
699+ ctx = EVP_CIPHER_CTX_new();
700+ if (ctx == NULL || !EVP_EncryptInit(ctx,cipher,NULL,NULL)) {
701+ EVP_CIPHER_CTX_free(ctx);
702 RETVAL_FALSE;
703- EVP_CIPHER_CTX_cleanup(&ctx);
704 goto clean_exit;
705 }
706
707@@ -4979,15 +5128,15 @@ PHP_FUNCTION(openssl_seal)
708 iv = ivlen ? emalloc(ivlen + 1) : NULL;
709 #endif
710 /* allocate one byte extra to make room for \0 */
711- buf = emalloc(data_len + EVP_CIPHER_CTX_block_size(&ctx));
712- EVP_CIPHER_CTX_cleanup(&ctx);
713+ buf = emalloc(data_len + EVP_CIPHER_CTX_block_size(ctx));
714+ EVP_CIPHER_CTX_cleanup(ctx);
715
716- if (EVP_SealInit(&ctx, cipher, eks, eksl, NULL, pkeys, nkeys) <= 0 ||
717- !EVP_SealUpdate(&ctx, buf, &len1, (unsigned char *)data, data_len) ||
718- !EVP_SealFinal(&ctx, buf + len1, &len2)) {
719+ if (EVP_SealInit(ctx, cipher, eks, eksl, NULL, pkeys, nkeys) <= 0 ||
720+ !EVP_SealUpdate(ctx, buf, &len1, (unsigned char *)data, data_len) ||
721+ !EVP_SealFinal(ctx, buf + len1, &len2)) {
722 RETVAL_FALSE;
723 efree(buf);
724- EVP_CIPHER_CTX_cleanup(&ctx);
725+ EVP_CIPHER_CTX_free(ctx);
726 goto clean_exit;
727 }
728
729@@ -5018,5 +5167,5 @@ PHP_FUNCTION(openssl_seal)
730 efree(buf);
731 }
732 RETVAL_LONG(len1 + len2);
733- EVP_CIPHER_CTX_cleanup(&ctx);
734+ EVP_CIPHER_CTX_free(ctx);
735
736@@ -5045,7 +5194,7 @@ PHP_FUNCTION(openssl_open)
737 int len1, len2;
738 unsigned char *buf;
739 long keyresource = -1;
740- EVP_CIPHER_CTX ctx;
741+ EVP_CIPHER_CTX *ctx;
742 char * data; int data_len;
743 char * ekey; int ekey_len;
744 char *method =NULL;
745@@ -5071,27 +5220,26 @@ PHP_FUNCTION(openssl_open)
746 } else {
747 cipher = EVP_rc4();
748 }
749-
750+
751 buf = emalloc(data_len + 1);
752
753- if (EVP_OpenInit(&ctx, cipher, (unsigned char *)ekey, ekey_len, NULL, pkey) && EVP_OpenUpdate(&ctx, buf, &len1, (unsigned char *)data, data_len)) {
754- if (!EVP_OpenFinal(&ctx, buf + len1, &len2) || (len1 + len2 == 0)) {
755- efree(buf);
756- RETVAL_FALSE;
757- } else {
758- zval_dtor(opendata);
759- buf[len1 + len2] = '\0';
760- ZVAL_STRINGL(opendata, erealloc(buf, len1 + len2 + 1), len1 + len2, 0);
761- RETVAL_TRUE;
762- }
763+ ctx = EVP_CIPHER_CTX_new();
764+ if (ctx != NULL && EVP_OpenInit(ctx, cipher, (unsigned char *)ekey, (int)ekey_len, NULL, pkey) &&
765+ EVP_OpenUpdate(ctx, buf, &len1, (unsigned char *)data, (int)data_len) &&
766+ EVP_OpenFinal(ctx, buf + len1, &len2) && (len1 + len2 > 0)) {
767+ zval_dtor(opendata);
768+ buf[len1 + len2] = '\0';
769+ ZVAL_STRINGL(opendata, erealloc(buf, len1 + len2 + 1), len1 + len2, 0);
770+ RETVAL_TRUE;
771 } else {
772- efree(buf);
773 RETVAL_FALSE;
774 }
775+
776+ efree(buf);
777 if (keyresource == -1) {
778 EVP_PKEY_free(pkey);
779 }
780- EVP_CIPHER_CTX_cleanup(&ctx);
781+ EVP_CIPHER_CTX_free(ctx);
782 }
783 /* }}} */
784
785@@ -5151,7 +5299,7 @@ PHP_FUNCTION(openssl_digest)
786 char *data, *method;
787 int data_len, method_len;
788 const EVP_MD *mdtype;
789- EVP_MD_CTX md_ctx;
790+ EVP_MD_CTX *md_ctx;
791 int siglen;
792 unsigned char *sigbuf;
793
794@@ -5167,9 +5315,10 @@ PHP_FUNCTION(openssl_digest)
795 siglen = EVP_MD_size(mdtype);
796 sigbuf = emalloc(siglen + 1);
797
798- EVP_DigestInit(&md_ctx, mdtype);
799- EVP_DigestUpdate(&md_ctx, (unsigned char *)data, data_len);
800- if (EVP_DigestFinal (&md_ctx, (unsigned char *)sigbuf, (unsigned int *)&siglen)) {
801+ md_ctx = EVP_MD_CTX_create();
802+ if (EVP_DigestInit(md_ctx, mdtype) &&
803+ EVP_DigestUpdate(md_ctx, (unsigned char *)data, data_len) &&
804+ EVP_DigestFinal (md_ctx, (unsigned char *)sigbuf, &siglen)) {
805 if (raw_output) {
806 sigbuf[siglen] = '\0';
807 RETVAL_STRINGL((char *)sigbuf, siglen, 0);
808@@ -5185,6 +5334,8 @@ PHP_FUNCTION(openssl_digest)
809 efree(sigbuf);
810 RETVAL_FALSE;
811 }
812+
813+ EVP_MD_CTX_destroy(md_ctx);
814 }
815 /* }}} */
816
817@@ -5230,7 +5381,7 @@ PHP_FUNCTION(openssl_encrypt)
818 char *data, *method, *password, *iv = "";
819 int data_len, method_len, password_len, iv_len = 0, max_iv_len;
820 const EVP_CIPHER *cipher_type;
821- EVP_CIPHER_CTX cipher_ctx;
822+ EVP_CIPHER_CTX *cipher_ctx;
823 int i=0, outlen, keylen;
824 unsigned char *outbuf, *key;
825 zend_bool free_iv;
826@@ -5244,6 +5395,12 @@ PHP_FUNCTION(openssl_encrypt)
827 RETURN_FALSE;
828 }
829
830+ cipher_ctx = EVP_CIPHER_CTX_new();
831+ if (!cipher_ctx) {
832+ php_error_docref(NULL, E_WARNING, "Failed to create cipher context");
833+ RETURN_FALSE;
834+ }
835+
836 keylen = EVP_CIPHER_key_length(cipher_type);
837 if (keylen > password_len) {
838 key = emalloc(keylen);
839@@ -5262,19 +5419,19 @@ PHP_FUNCTION(openssl_encrypt)
840 outlen = data_len + EVP_CIPHER_block_size(cipher_type);
841 outbuf = safe_emalloc(outlen, 1, 1);
842
843- EVP_EncryptInit(&cipher_ctx, cipher_type, NULL, NULL);
844+ EVP_EncryptInit(cipher_ctx, cipher_type, NULL, NULL);
845 if (password_len > keylen) {
846- EVP_CIPHER_CTX_set_key_length(&cipher_ctx, password_len);
847+ EVP_CIPHER_CTX_set_key_length(cipher_ctx, password_len);
848 }
849- EVP_EncryptInit_ex(&cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
850+ EVP_EncryptInit_ex(cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
851 if (options & OPENSSL_ZERO_PADDING) {
852- EVP_CIPHER_CTX_set_padding(&cipher_ctx, 0);
853+ EVP_CIPHER_CTX_set_padding(cipher_ctx, 0);
854 }
855 if (data_len > 0) {
856- EVP_EncryptUpdate(&cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
857+ EVP_EncryptUpdate(cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
858 }
859 outlen = i;
860- if (EVP_EncryptFinal(&cipher_ctx, (unsigned char *)outbuf + i, &i)) {
861+ if (EVP_EncryptFinal(cipher_ctx, (unsigned char *)outbuf + i, &i)) {
862 outlen += i;
863 if (options & OPENSSL_RAW_DATA) {
864 outbuf[outlen] = '\0';
865@@ -5301,7 +5458,7 @@ PHP_FUNCTION(openssl_encrypt)
866 if (free_iv) {
867 efree(iv);
868 }
869- EVP_CIPHER_CTX_cleanup(&cipher_ctx);
870+ EVP_CIPHER_CTX_free(cipher_ctx);
871 }
872 /* }}} */
873
874@@ -5313,7 +5470,7 @@ PHP_FUNCTION(openssl_decrypt)
875 char *data, *method, *password, *iv = "";
876 int data_len, method_len, password_len, iv_len = 0;
877 const EVP_CIPHER *cipher_type;
878- EVP_CIPHER_CTX cipher_ctx;
879+ EVP_CIPHER_CTX *cipher_ctx;
880 int i, outlen, keylen;
881 unsigned char *outbuf, *key;
882 int base64_str_len;
883@@ -5335,10 +5492,17 @@ PHP_FUNCTION(openssl_decrypt)
884 RETURN_FALSE;
885 }
886
887+ cipher_ctx = EVP_CIPHER_CTX_new();
888+ if (!cipher_ctx) {
889+ php_error_docref(NULL, E_WARNING, "Failed to create cipher context");
890+ RETURN_FALSE;
891+ }
892+
893 if (!(options & OPENSSL_RAW_DATA)) {
894 base64_str = (char*)php_base64_decode((unsigned char*)data, data_len, &base64_str_len);
895 if (!base64_str) {
896 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to base64 decode the input");
897+ EVP_CIPHER_CTX_free(cipher_ctx);
898 RETURN_FALSE;
899 }
900 data_len = base64_str_len;
901@@ -5359,17 +5523,17 @@ PHP_FUNCTION(openssl_decrypt)
902 outlen = data_len + EVP_CIPHER_block_size(cipher_type);
903 outbuf = emalloc(outlen + 1);
904
905- EVP_DecryptInit(&cipher_ctx, cipher_type, NULL, NULL);
906+ EVP_DecryptInit(cipher_ctx, cipher_type, NULL, NULL);
907 if (password_len > keylen) {
908- EVP_CIPHER_CTX_set_key_length(&cipher_ctx, password_len);
909+ EVP_CIPHER_CTX_set_key_length(cipher_ctx, password_len);
910 }
911- EVP_DecryptInit_ex(&cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
912+ EVP_DecryptInit_ex(cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
913 if (options & OPENSSL_ZERO_PADDING) {
914- EVP_CIPHER_CTX_set_padding(&cipher_ctx, 0);
915+ EVP_CIPHER_CTX_set_padding(cipher_ctx, 0);
916 }
917- EVP_DecryptUpdate(&cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
918+ EVP_DecryptUpdate(cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
919 outlen = i;
920- if (EVP_DecryptFinal(&cipher_ctx, (unsigned char *)outbuf + i, &i)) {
921+ if (EVP_DecryptFinal(cipher_ctx, (unsigned char *)outbuf + i, &i)) {
922 outlen += i;
923 outbuf[outlen] = '\0';
924 RETVAL_STRINGL((char *)outbuf, outlen, 0);
925@@ -5386,7 +5550,7 @@ PHP_FUNCTION(openssl_decrypt)
926 if (base64_str) {
927 efree(base64_str);
928 }
929- EVP_CIPHER_CTX_cleanup(&cipher_ctx);
930+ EVP_CIPHER_CTX_free(cipher_ctx);
931 }
932 /* }}} */
933
934@@ -5424,6 +5588,7 @@ PHP_FUNCTION(openssl_dh_compute_key)
935 zval *key;
936 char *pub_str;
937 int pub_len;
938+ DH *dh;
939 EVP_PKEY *pkey;
940 BIGNUM *pub;
941 char *data;
942@@ -5433,14 +5598,18 @@ PHP_FUNCTION(openssl_dh_compute_key)
943 return;
944 }
945 ZEND_FETCH_RESOURCE(pkey, EVP_PKEY *, &key, -1, "OpenSSL key", le_key);
946- if (!pkey || EVP_PKEY_type(pkey->type) != EVP_PKEY_DH || !pkey->pkey.dh) {
947+ if (EVP_PKEY_base_id(pkey) != EVP_PKEY_DH) {
948+ RETURN_FALSE;
949+ }
950+ dh = EVP_PKEY_get0_DH(pkey);
951+ if (dh == NULL) {
952 RETURN_FALSE;
953 }
954
955 pub = BN_bin2bn((unsigned char*)pub_str, pub_len, NULL);
956
957- data = emalloc(DH_size(pkey->pkey.dh) + 1);
958- len = DH_compute_key((unsigned char*)data, pub, pkey->pkey.dh);
959+ data = emalloc(DH_size(dh) + 1);
960+ len = DH_compute_key((unsigned char*)data, pub, dh);
961
962 if (len >= 0) {
963 data[len] = 0;
This page took 0.126892 seconds and 4 git commands to generate.