1 diff -ur php-5.5.38.org/ext/openssl/openssl.c php-5.5.38/ext/openssl/openssl.c
2 --- php-5.5.38.org/ext/openssl/openssl.c 2018-09-25 14:34:57.903784149 +0200
3 +++ php-5.5.38/ext/openssl/openssl.c 2018-09-25 14:55:18.919902725 +0200
5 #define HAVE_EVP_PKEY_EC 1
8 +#if (OPENSSL_VERSION_NUMBER >= 0x10100000L)
9 +#define PHP_OPENSSL_RAND_ADD_TIME() ((void) 0)
11 +#define PHP_OPENSSL_RAND_ADD_TIME() php_openssl_rand_add_timeval()
14 /* FIXME: Use the openssl constants instead of
15 * enum. It is now impossible to match real values
16 * against php constants. Also sorry to break the
18 ZEND_GET_MODULE(openssl)
21 +/* {{{ OpenSSL compatibility functions and macros */
22 +#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined (LIBRESSL_VERSION_NUMBER)
23 +#define EVP_PKEY_get0_RSA(_pkey) _pkey->pkey.rsa
24 +#define EVP_PKEY_get0_DH(_pkey) _pkey->pkey.dh
25 +#define EVP_PKEY_get0_DSA(_pkey) _pkey->pkey.dsa
26 +#define EVP_PKEY_get0_EC_KEY(_pkey) _pkey->pkey.ec
33 mdtype = (EVP_MD *) EVP_md2();
36 +#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined (LIBRESSL_VERSION_NUMBER)
37 case OPENSSL_ALGO_DSS1:
38 mdtype = (EVP_MD *) EVP_dss1();
41 #if OPENSSL_VERSION_NUMBER >= 0x0090708fL
42 case OPENSSL_ALGO_SHA224:
43 mdtype = (EVP_MD *) EVP_sha224();
47 const X509V3_EXT_METHOD *method = NULL;
48 + ASN1_OCTET_STRING *extension_data;
50 const unsigned char *p;
56 - p = extension->value->data;
57 - length = extension->value->length;
58 + extension_data = X509_EXTENSION_get_data(extension);
59 + p = extension_data->data;
60 + length = extension_data->length;
62 names = (GENERAL_NAMES*)(ASN1_item_d2i(NULL, &p, length,
63 ASN1_ITEM_ptr(method->it)));
67 X509_EXTENSION *extension;
68 + X509_NAME *subject_name;
73 @@ -1522,12 +1542,12 @@
75 array_init(return_value);
78 - add_assoc_string(return_value, "name", cert->name, 1);
80 -/* add_assoc_bool(return_value, "valid", cert->valid); */
81 + subject_name = X509_get_subject_name(cert);
82 + cert_name = X509_NAME_oneline(subject_name, NULL, 0);
83 + add_assoc_string(return_value, "name", cert_name, 1);
84 + OPENSSL_free(cert_name);
86 - add_assoc_name_entry(return_value, "subject", X509_get_subject_name(cert), useshortnames TSRMLS_CC);
87 + add_assoc_name_entry(return_value, "subject", subject_name, useshortnames TSRMLS_CC);
88 /* hash as used in CA directories to lookup cert by subject name */
92 add_assoc_string(return_value, "alias", tmpstr, 1);
95 - sig_nid = OBJ_obj2nid((cert)->sig_alg->algorithm);
96 + sig_nid = X509_get_signature_nid(cert);
97 add_assoc_string(return_value, "signatureTypeSN", (char*)OBJ_nid2sn(sig_nid), 1);
98 add_assoc_string(return_value, "signatureTypeLN", (char*)OBJ_nid2ln(sig_nid), 1);
99 add_assoc_long(return_value, "signatureTypeNID", sig_nid);
100 @@ -3014,13 +3034,20 @@
102 assert(pkey != NULL);
104 - switch (pkey->type) {
105 + switch (EVP_PKEY_id(pkey)) {
109 - assert(pkey->pkey.rsa != NULL);
110 - if (pkey->pkey.rsa != NULL && (NULL == pkey->pkey.rsa->p || NULL == pkey->pkey.rsa->q)) {
113 + RSA *rsa = EVP_PKEY_get0_RSA(pkey);
115 + const BIGNUM *p, *q;
117 + RSA_get0_factors(rsa, &p, &q);
118 + if (p == NULL || q == NULL) {
125 @@ -3030,28 +3057,51 @@
129 - assert(pkey->pkey.dsa != NULL);
131 + DSA *dsa = EVP_PKEY_get0_DSA(pkey);
133 + const BIGNUM *p, *q, *g, *pub_key, *priv_key;
135 + DSA_get0_pqg(dsa, &p, &q, &g);
136 + if (p == NULL || q == NULL) {
140 - if (NULL == pkey->pkey.dsa->p || NULL == pkey->pkey.dsa->q || NULL == pkey->pkey.dsa->priv_key){
142 + DSA_get0_key(dsa, &pub_key, &priv_key);
143 + if (priv_key == NULL) {
152 - assert(pkey->pkey.dh != NULL);
154 + DH *dh = EVP_PKEY_get0_DH(pkey);
156 + const BIGNUM *p, *q, *g, *pub_key, *priv_key;
158 + DH_get0_pqg(dh, &p, &q, &g);
163 - if (NULL == pkey->pkey.dh->p || NULL == pkey->pkey.dh->priv_key) {
165 + DH_get0_key(dh, &pub_key, &priv_key);
166 + if (priv_key == NULL) {
173 #ifdef HAVE_EVP_PKEY_EC
175 - assert(pkey->pkey.ec != NULL);
177 - if ( NULL == EC_KEY_get0_private_key(pkey->pkey.ec)) {
180 + EC_KEY *ec = EVP_PKEY_get0_EC_KEY(pkey);
181 + if (ec != NULL && NULL == EC_KEY_get0_private_key(ec)) {
187 @@ -3063,26 +3113,166 @@
191 -#define OPENSSL_PKEY_GET_BN(_type, _name) do { \
192 - if (pkey->pkey._type->_name != NULL) { \
193 - int len = BN_num_bytes(pkey->pkey._type->_name); \
194 - char *str = emalloc(len + 1); \
195 - BN_bn2bin(pkey->pkey._type->_name, (unsigned char*)str); \
197 - add_assoc_stringl(_type, #_name, str, len, 0); \
201 -#define OPENSSL_PKEY_SET_BN(_ht, _type, _name) do { \
203 - if (zend_hash_find(_ht, #_name, sizeof(#_name), (void**)&bn) == SUCCESS && \
204 - Z_TYPE_PP(bn) == IS_STRING) { \
205 - _type->_name = BN_bin2bn( \
206 - (unsigned char*)Z_STRVAL_PP(bn), \
207 - Z_STRLEN_PP(bn), NULL); \
210 +#define OPENSSL_GET_BN(_array, _bn, _name) do { \
211 + if (_bn != NULL) { \
212 + int len = BN_num_bytes(_bn); \
213 + char *str = emalloc(len + 1); \
214 + BN_bn2bin(_bn, (unsigned char*)str); \
216 + add_assoc_stringl(&_array, #_name, str, len, 0); \
220 +#define OPENSSL_PKEY_GET_BN(_type, _name) OPENSSL_GET_BN(_type, _name, _name)
222 +#define OPENSSL_PKEY_SET_BN(_data, _name) do { \
224 + if (zend_hash_find(Z_ARRVAL_PP(_data), #_name, sizeof(#_name), (void**)bn) == SUCCESS && \
225 + Z_TYPE_PP(bn) == IS_STRING) { \
226 + _name = BN_bin2bn( \
227 + (unsigned char*)Z_STRVAL_PP(bn), \
228 + (int)Z_STRLEN_PP(bn), NULL); \
234 +/* {{{ php_openssl_pkey_init_rsa */
235 +zend_bool php_openssl_pkey_init_and_assign_rsa(EVP_PKEY *pkey, RSA *rsa, zval **data)
237 + BIGNUM *n, *e, *d, *p, *q, *dmp1, *dmq1, *iqmp;
239 + OPENSSL_PKEY_SET_BN(data, n);
240 + OPENSSL_PKEY_SET_BN(data, e);
241 + OPENSSL_PKEY_SET_BN(data, d);
242 + if (!n || !d || !RSA_set0_key(rsa, n, e, d)) {
246 + OPENSSL_PKEY_SET_BN(data, p);
247 + OPENSSL_PKEY_SET_BN(data, q);
248 + if ((p || q) && !RSA_set0_factors(rsa, p, q)) {
252 + OPENSSL_PKEY_SET_BN(data, dmp1);
253 + OPENSSL_PKEY_SET_BN(data, dmq1);
254 + OPENSSL_PKEY_SET_BN(data, iqmp);
255 + if ((dmp1 || dmq1 || iqmp) && !RSA_set0_crt_params(rsa, dmp1, dmq1, iqmp)) {
259 + if (!EVP_PKEY_assign_RSA(pkey, rsa)) {
266 +/* {{{ php_openssl_pkey_init_dsa */
267 +zend_bool php_openssl_pkey_init_dsa(DSA *dsa, zval **data)
269 + BIGNUM *p, *q, *g, *priv_key, *pub_key;
270 + const BIGNUM *priv_key_const, *pub_key_const;
272 + OPENSSL_PKEY_SET_BN(data, p);
273 + OPENSSL_PKEY_SET_BN(data, q);
274 + OPENSSL_PKEY_SET_BN(data, g);
275 + if (!p || !q || !g || !DSA_set0_pqg(dsa, p, q, g)) {
278 + OPENSSL_PKEY_SET_BN(data, pub_key);
279 + OPENSSL_PKEY_SET_BN(data, priv_key);
281 + return DSA_set0_key(dsa, pub_key, priv_key);
285 + PHP_OPENSSL_RAND_ADD_TIME();
286 + if (!DSA_generate_key(dsa)) {
289 + /* if BN_mod_exp return -1, then DSA_generate_key succeed for failed key
290 + * so we need to double check that public key is created */
291 + DSA_get0_key(dsa, &pub_key_const, &priv_key_const);
292 + if (!pub_key_const || BN_is_zero(pub_key_const)) {
300 +/* {{{ php_openssl_dh_pub_from_priv */
301 +static BIGNUM *php_openssl_dh_pub_from_priv(BIGNUM *priv_key, BIGNUM *g, BIGNUM *p)
303 + BIGNUM *pub_key, *priv_key_const_time;
306 + pub_key = BN_new();
307 + if (pub_key == NULL) {
311 + priv_key_const_time = BN_new();
312 + if (priv_key_const_time == NULL) {
316 + ctx = BN_CTX_new();
319 + BN_free(priv_key_const_time);
323 + BN_with_flags(priv_key_const_time, priv_key, BN_FLG_CONSTTIME);
325 + if (!BN_mod_exp_mont(pub_key, g, priv_key_const_time, p, ctx, NULL)) {
330 + BN_free(priv_key_const_time);
337 +/* {{{ php_openssl_pkey_init_dh */
338 +zend_bool php_openssl_pkey_init_dh(DH *dh, zval **data)
340 + BIGNUM *p, *q, *g, *priv_key, *pub_key;
342 + OPENSSL_PKEY_SET_BN(data, p);
343 + OPENSSL_PKEY_SET_BN(data, q);
344 + OPENSSL_PKEY_SET_BN(data, g);
345 + if (!p || !g || !DH_set0_pqg(dh, p, q, g)) {
348 + OPENSSL_PKEY_SET_BN(data, priv_key);
349 + OPENSSL_PKEY_SET_BN(data, pub_key);
351 + return DH_set0_key(dh, pub_key, priv_key);
354 + pub_key = php_openssl_dh_pub_from_priv(priv_key, g, p);
355 + if (pub_key == NULL) {
358 + return DH_set0_key(dh, pub_key, priv_key);
362 + PHP_OPENSSL_RAND_ADD_TIME();
363 + if (!DH_generate_key(dh)) {
371 /* {{{ proto resource openssl_pkey_new([array configargs])
372 Generates a new private key */
373 @@ -3106,18 +3296,8 @@
375 RSA *rsa = RSA_new();
377 - OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, n);
378 - OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, e);
379 - OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, d);
380 - OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, p);
381 - OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, q);
382 - OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, dmp1);
383 - OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, dmq1);
384 - OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, iqmp);
385 - if (rsa->n && rsa->d) {
386 - if (EVP_PKEY_assign_RSA(pkey, rsa)) {
387 - RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
389 + if (php_openssl_pkey_init_and_assign_rsa(pkey, rsa, data)) {
390 + RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
394 @@ -3130,15 +3310,7 @@
396 DSA *dsa = DSA_new();
398 - OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, p);
399 - OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, q);
400 - OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, g);
401 - OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, priv_key);
402 - OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, pub_key);
403 - if (dsa->p && dsa->q && dsa->g) {
404 - if (!dsa->priv_key && !dsa->pub_key) {
405 - DSA_generate_key(dsa);
407 + if (php_openssl_pkey_init_dsa(dsa, data)) {
408 if (EVP_PKEY_assign_DSA(pkey, dsa)) {
409 RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
411 @@ -3154,14 +3326,7 @@
415 - OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, p);
416 - OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, g);
417 - OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, priv_key);
418 - OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, pub_key);
419 - if (dh->p && dh->g) {
420 - if (!dh->pub_key) {
421 - DH_generate_key(dh);
423 + if (php_openssl_pkey_init_dh(dh, data)) {
424 if (EVP_PKEY_assign_DH(pkey, dh)) {
425 RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
427 @@ -3397,25 +3562,32 @@
428 /*TODO: Use the real values once the openssl constants are used
429 * See the enum at the top of this file
431 - switch (EVP_PKEY_type(pkey->type)) {
432 + switch (EVP_PKEY_base_id(pkey)) {
435 - ktype = OPENSSL_KEYTYPE_RSA;
437 - if (pkey->pkey.rsa != NULL) {
440 - ALLOC_INIT_ZVAL(rsa);
442 - OPENSSL_PKEY_GET_BN(rsa, n);
443 - OPENSSL_PKEY_GET_BN(rsa, e);
444 - OPENSSL_PKEY_GET_BN(rsa, d);
445 - OPENSSL_PKEY_GET_BN(rsa, p);
446 - OPENSSL_PKEY_GET_BN(rsa, q);
447 - OPENSSL_PKEY_GET_BN(rsa, dmp1);
448 - OPENSSL_PKEY_GET_BN(rsa, dmq1);
449 - OPENSSL_PKEY_GET_BN(rsa, iqmp);
450 - add_assoc_zval(return_value, "rsa", rsa);
452 + RSA *rsa = EVP_PKEY_get0_RSA(pkey);
453 + ktype = OPENSSL_KEYTYPE_RSA;
457 + const BIGNUM *n, *e, *d, *p, *q, *dmp1, *dmq1, *iqmp;
459 + RSA_get0_key(rsa, &n, &e, &d);
460 + RSA_get0_factors(rsa, &p, &q);
461 + RSA_get0_crt_params(rsa, &dmp1, &dmq1, &iqmp);
463 + array_init(&z_rsa);
464 + OPENSSL_PKEY_GET_BN(z_rsa, n);
465 + OPENSSL_PKEY_GET_BN(z_rsa, e);
466 + OPENSSL_PKEY_GET_BN(z_rsa, d);
467 + OPENSSL_PKEY_GET_BN(z_rsa, p);
468 + OPENSSL_PKEY_GET_BN(z_rsa, q);
469 + OPENSSL_PKEY_GET_BN(z_rsa, dmp1);
470 + OPENSSL_PKEY_GET_BN(z_rsa, dmq1);
471 + OPENSSL_PKEY_GET_BN(z_rsa, iqmp);
472 + add_assoc_zval(return_value, "rsa", &z_rsa);
477 @@ -3423,37 +3595,47 @@
481 - ktype = OPENSSL_KEYTYPE_DSA;
483 - if (pkey->pkey.dsa != NULL) {
486 - ALLOC_INIT_ZVAL(dsa);
488 - OPENSSL_PKEY_GET_BN(dsa, p);
489 - OPENSSL_PKEY_GET_BN(dsa, q);
490 - OPENSSL_PKEY_GET_BN(dsa, g);
491 - OPENSSL_PKEY_GET_BN(dsa, priv_key);
492 - OPENSSL_PKEY_GET_BN(dsa, pub_key);
493 - add_assoc_zval(return_value, "dsa", dsa);
495 + DSA *dsa = EVP_PKEY_get0_DSA(pkey);
496 + ktype = OPENSSL_KEYTYPE_DSA;
500 + const BIGNUM *p, *q, *g, *priv_key, *pub_key;
502 + DSA_get0_pqg(dsa, &p, &q, &g);
503 + DSA_get0_key(dsa, &pub_key, &priv_key);
505 + array_init(&z_dsa);
506 + OPENSSL_PKEY_GET_BN(z_dsa, p);
507 + OPENSSL_PKEY_GET_BN(z_dsa, q);
508 + OPENSSL_PKEY_GET_BN(z_dsa, g);
509 + OPENSSL_PKEY_GET_BN(z_dsa, priv_key);
510 + OPENSSL_PKEY_GET_BN(z_dsa, pub_key);
511 + add_assoc_zval(return_value, "dsa", &z_dsa);
517 - ktype = OPENSSL_KEYTYPE_DH;
519 - if (pkey->pkey.dh != NULL) {
522 - ALLOC_INIT_ZVAL(dh);
524 - OPENSSL_PKEY_GET_BN(dh, p);
525 - OPENSSL_PKEY_GET_BN(dh, g);
526 - OPENSSL_PKEY_GET_BN(dh, priv_key);
527 - OPENSSL_PKEY_GET_BN(dh, pub_key);
528 - add_assoc_zval(return_value, "dh", dh);
530 + DH *dh = EVP_PKEY_get0_DH(pkey);
531 + ktype = OPENSSL_KEYTYPE_DH;
535 + const BIGNUM *p, *q, *g, *priv_key, *pub_key;
537 + DH_get0_pqg(dh, &p, &q, &g);
538 + DH_get0_key(dh, &pub_key, &priv_key);
541 + OPENSSL_PKEY_GET_BN(z_dh, p);
542 + OPENSSL_PKEY_GET_BN(z_dh, g);
543 + OPENSSL_PKEY_GET_BN(z_dh, priv_key);
544 + OPENSSL_PKEY_GET_BN(z_dh, pub_key);
545 + add_assoc_zval(return_value, "dh", &z_dh);
550 #ifdef HAVE_EVP_PKEY_EC
552 @@ -3981,13 +4163,13 @@
553 cryptedlen = EVP_PKEY_size(pkey);
554 cryptedbuf = emalloc(cryptedlen + 1);
556 - switch (pkey->type) {
557 + switch (EVP_PKEY_id(pkey)) {
560 successful = (RSA_private_encrypt(data_len,
561 (unsigned char *)data,
564 + EVP_PKEY_get0_RSA(pkey),
565 padding) == cryptedlen);
568 @@ -4039,13 +4221,13 @@
569 cryptedlen = EVP_PKEY_size(pkey);
570 crypttemp = emalloc(cryptedlen + 1);
572 - switch (pkey->type) {
573 + switch (EVP_PKEY_id(pkey)) {
576 cryptedlen = RSA_private_decrypt(data_len,
577 (unsigned char *)data,
580 + EVP_PKEY_get0_RSA(pkey),
582 if (cryptedlen != -1) {
583 cryptedbuf = emalloc(cryptedlen + 1);
584 @@ -4104,13 +4286,13 @@
585 cryptedlen = EVP_PKEY_size(pkey);
586 cryptedbuf = emalloc(cryptedlen + 1);
588 - switch (pkey->type) {
589 + switch (EVP_PKEY_id(pkey)) {
592 successful = (RSA_public_encrypt(data_len,
593 (unsigned char *)data,
597 + EVP_PKEY_get0_RSA(pkey),
598 padding) == cryptedlen);
601 @@ -4163,13 +4345,13 @@
602 cryptedlen = EVP_PKEY_size(pkey);
603 crypttemp = emalloc(cryptedlen + 1);
605 - switch (pkey->type) {
606 + switch (EVP_PKEY_id(pkey)) {
609 cryptedlen = RSA_public_decrypt(data_len,
610 (unsigned char *)data,
614 + EVP_PKEY_get0_RSA(pkey),
616 if (cryptedlen != -1) {
617 cryptedbuf = emalloc(cryptedlen + 1);
618 @@ -4233,7 +4415,7 @@
619 long keyresource = -1;
623 + EVP_MD_CTX *md_ctx;
625 long signature_algo = OPENSSL_ALGO_SHA1;
626 const EVP_MD *mdtype;
627 @@ -4266,9 +4448,11 @@
628 siglen = EVP_PKEY_size(pkey);
629 sigbuf = emalloc(siglen + 1);
631 - EVP_SignInit(&md_ctx, mdtype);
632 - EVP_SignUpdate(&md_ctx, data, data_len);
633 - if (EVP_SignFinal (&md_ctx, sigbuf,(unsigned int *)&siglen, pkey)) {
634 + md_ctx = EVP_MD_CTX_create();
635 + if (md_ctx != NULL &&
636 + EVP_SignInit(md_ctx, mdtype) &&
637 + EVP_SignUpdate(md_ctx, data, data_len) &&
638 + EVP_SignFinal(md_ctx, (unsigned char*)sigbuf, &siglen, pkey)) {
639 zval_dtor(signature);
640 sigbuf[siglen] = '\0';
641 ZVAL_STRINGL(signature, (char *)sigbuf, siglen, 0);
642 @@ -4277,7 +4461,7 @@
646 - EVP_MD_CTX_cleanup(&md_ctx);
647 + EVP_MD_CTX_destroy(md_ctx);
648 if (keyresource == -1) {
651 @@ -4290,8 +4474,8 @@
658 + EVP_MD_CTX *md_ctx;
659 const EVP_MD *mdtype;
660 long keyresource = -1;
661 char * data; int data_len;
662 @@ -4325,10 +4509,13 @@
666 - EVP_VerifyInit (&md_ctx, mdtype);
667 - EVP_VerifyUpdate (&md_ctx, data, data_len);
668 - err = EVP_VerifyFinal (&md_ctx, (unsigned char *)signature, signature_len, pkey);
669 - EVP_MD_CTX_cleanup(&md_ctx);
670 + md_ctx = EVP_MD_CTX_create();
671 + if (md_ctx != NULL) {
672 + EVP_VerifyInit(md_ctx, mdtype);
673 + EVP_VerifyUpdate (md_ctx, data, data_len);
674 + err = EVP_VerifyFinal(md_ctx, (unsigned char *)signature, (unsigned int)signature_len, pkey);
676 + EVP_MD_CTX_destroy(md_ctx);
678 if (keyresource == -1) {
680 @@ -4352,7 +4539,7 @@
683 const EVP_CIPHER *cipher;
684 - EVP_CIPHER_CTX ctx;
685 + EVP_CIPHER_CTX *ctx;
687 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "szza/|s", &data, &data_len, &sealdata, &ekeys, &pubkeys, &method, &method_len) == FAILURE) {
689 @@ -4399,9 +4586,10 @@
693 - if (!EVP_EncryptInit(&ctx,cipher,NULL,NULL)) {
694 + ctx = EVP_CIPHER_CTX_new();
695 + if (ctx == NULL || !EVP_EncryptInit(ctx,cipher,NULL,NULL)) {
696 + EVP_CIPHER_CTX_free(ctx);
698 - EVP_CIPHER_CTX_cleanup(&ctx);
702 @@ -4411,17 +4599,17 @@
703 iv = ivlen ? emalloc(ivlen + 1) : NULL;
705 /* allocate one byte extra to make room for \0 */
706 - buf = emalloc(data_len + EVP_CIPHER_CTX_block_size(&ctx));
707 - EVP_CIPHER_CTX_cleanup(&ctx);
708 + buf = emalloc(data_len + EVP_CIPHER_CTX_block_size(ctx));
709 + EVP_CIPHER_CTX_cleanup(ctx);
711 - if (!EVP_SealInit(&ctx, cipher, eks, eksl, NULL, pkeys, nkeys) || !EVP_SealUpdate(&ctx, buf, &len1, (unsigned char *)data, data_len)) {
712 + if (!EVP_SealInit(ctx, cipher, eks, eksl, NULL, pkeys, nkeys) || !EVP_SealUpdate(ctx, buf, &len1, (unsigned char *)data, data_len)) {
715 - EVP_CIPHER_CTX_cleanup(&ctx);
716 + EVP_CIPHER_CTX_free(ctx);
720 - EVP_SealFinal(&ctx, buf + len1, &len2);
721 + EVP_SealFinal(ctx, buf + len1, &len2);
723 if (len1 + len2 > 0) {
725 @@ -4450,7 +4638,7 @@
728 RETVAL_LONG(len1 + len2);
729 - EVP_CIPHER_CTX_cleanup(&ctx);
730 + EVP_CIPHER_CTX_free(ctx);
733 for (i=0; i<nkeys; i++) {
734 @@ -4477,7 +4665,7 @@
737 long keyresource = -1;
738 - EVP_CIPHER_CTX ctx;
739 + EVP_CIPHER_CTX *ctx;
740 char * data; int data_len;
741 char * ekey; int ekey_len;
743 @@ -4503,27 +4691,26 @@
749 buf = emalloc(data_len + 1);
751 - if (EVP_OpenInit(&ctx, cipher, (unsigned char *)ekey, ekey_len, NULL, pkey) && EVP_OpenUpdate(&ctx, buf, &len1, (unsigned char *)data, data_len)) {
752 - if (!EVP_OpenFinal(&ctx, buf + len1, &len2) || (len1 + len2 == 0)) {
756 - zval_dtor(opendata);
757 - buf[len1 + len2] = '\0';
758 - ZVAL_STRINGL(opendata, erealloc(buf, len1 + len2 + 1), len1 + len2, 0);
761 + ctx = EVP_CIPHER_CTX_new();
762 + if (ctx != NULL && EVP_OpenInit(ctx, cipher, (unsigned char *)ekey, (int)ekey_len, NULL, pkey) &&
763 + EVP_OpenUpdate(ctx, buf, &len1, (unsigned char *)data, (int)data_len) &&
764 + EVP_OpenFinal(ctx, buf + len1, &len2) && (len1 + len2 > 0)) {
765 + zval_dtor(opendata);
766 + buf[len1 + len2] = '\0';
767 + ZVAL_STRINGL(opendata, erealloc(buf, len1 + len2 + 1), len1 + len2, 0);
775 if (keyresource == -1) {
778 - EVP_CIPHER_CTX_cleanup(&ctx);
779 + EVP_CIPHER_CTX_free(ctx);
783 @@ -4831,7 +5018,7 @@
785 int data_len, method_len;
786 const EVP_MD *mdtype;
788 + EVP_MD_CTX *md_ctx;
790 unsigned char *sigbuf;
792 @@ -4847,9 +5034,10 @@
793 siglen = EVP_MD_size(mdtype);
794 sigbuf = emalloc(siglen + 1);
796 - EVP_DigestInit(&md_ctx, mdtype);
797 - EVP_DigestUpdate(&md_ctx, (unsigned char *)data, data_len);
798 - if (EVP_DigestFinal (&md_ctx, (unsigned char *)sigbuf, (unsigned int *)&siglen)) {
799 + md_ctx = EVP_MD_CTX_create();
800 + if (EVP_DigestInit(md_ctx, mdtype) &&
801 + EVP_DigestUpdate(md_ctx, (unsigned char *)data, data_len) &&
802 + EVP_DigestFinal (md_ctx, (unsigned char *)sigbuf, &siglen)) {
804 sigbuf[siglen] = '\0';
805 RETVAL_STRINGL((char *)sigbuf, siglen, 0);
806 @@ -4865,6 +5053,8 @@
811 + EVP_MD_CTX_destroy(md_ctx);
815 @@ -4910,7 +5100,7 @@
816 char *data, *method, *password, *iv = "";
817 int data_len, method_len, password_len, iv_len = 0, max_iv_len;
818 const EVP_CIPHER *cipher_type;
819 - EVP_CIPHER_CTX cipher_ctx;
820 + EVP_CIPHER_CTX *cipher_ctx;
821 int i=0, outlen, keylen;
822 unsigned char *outbuf, *key;
824 @@ -4924,6 +5114,12 @@
828 + cipher_ctx = EVP_CIPHER_CTX_new();
830 + php_error_docref(NULL, E_WARNING, "Failed to create cipher context");
834 keylen = EVP_CIPHER_key_length(cipher_type);
835 if (keylen > password_len) {
836 key = emalloc(keylen);
837 @@ -4942,19 +5138,19 @@
838 outlen = data_len + EVP_CIPHER_block_size(cipher_type);
839 outbuf = emalloc(outlen + 1);
841 - EVP_EncryptInit(&cipher_ctx, cipher_type, NULL, NULL);
842 + EVP_EncryptInit(cipher_ctx, cipher_type, NULL, NULL);
843 if (password_len > keylen) {
844 - EVP_CIPHER_CTX_set_key_length(&cipher_ctx, password_len);
845 + EVP_CIPHER_CTX_set_key_length(cipher_ctx, password_len);
847 - EVP_EncryptInit_ex(&cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
848 + EVP_EncryptInit_ex(cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
849 if (options & OPENSSL_ZERO_PADDING) {
850 - EVP_CIPHER_CTX_set_padding(&cipher_ctx, 0);
851 + EVP_CIPHER_CTX_set_padding(cipher_ctx, 0);
854 - EVP_EncryptUpdate(&cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
855 + EVP_EncryptUpdate(cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
858 - if (EVP_EncryptFinal(&cipher_ctx, (unsigned char *)outbuf + i, &i)) {
859 + if (EVP_EncryptFinal(cipher_ctx, (unsigned char *)outbuf + i, &i)) {
861 if (options & OPENSSL_RAW_DATA) {
862 outbuf[outlen] = '\0';
863 @@ -4977,7 +5173,7 @@
867 - EVP_CIPHER_CTX_cleanup(&cipher_ctx);
868 + EVP_CIPHER_CTX_free(cipher_ctx);
872 @@ -4989,7 +5185,7 @@
873 char *data, *method, *password, *iv = "";
874 int data_len, method_len, password_len, iv_len = 0;
875 const EVP_CIPHER *cipher_type;
876 - EVP_CIPHER_CTX cipher_ctx;
877 + EVP_CIPHER_CTX *cipher_ctx;
878 int i, outlen, keylen;
879 unsigned char *outbuf, *key;
881 @@ -5011,10 +5207,17 @@
885 + cipher_ctx = EVP_CIPHER_CTX_new();
887 + php_error_docref(NULL, E_WARNING, "Failed to create cipher context");
891 if (!(options & OPENSSL_RAW_DATA)) {
892 base64_str = (char*)php_base64_decode((unsigned char*)data, data_len, &base64_str_len);
894 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to base64 decode the input");
895 + EVP_CIPHER_CTX_free(cipher_ctx);
898 data_len = base64_str_len;
899 @@ -5035,17 +5238,17 @@
900 outlen = data_len + EVP_CIPHER_block_size(cipher_type);
901 outbuf = emalloc(outlen + 1);
903 - EVP_DecryptInit(&cipher_ctx, cipher_type, NULL, NULL);
904 + EVP_DecryptInit(cipher_ctx, cipher_type, NULL, NULL);
905 if (password_len > keylen) {
906 - EVP_CIPHER_CTX_set_key_length(&cipher_ctx, password_len);
907 + EVP_CIPHER_CTX_set_key_length(cipher_ctx, password_len);
909 - EVP_DecryptInit_ex(&cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
910 + EVP_DecryptInit_ex(cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
911 if (options & OPENSSL_ZERO_PADDING) {
912 - EVP_CIPHER_CTX_set_padding(&cipher_ctx, 0);
913 + EVP_CIPHER_CTX_set_padding(cipher_ctx, 0);
915 - EVP_DecryptUpdate(&cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
916 + EVP_DecryptUpdate(cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
918 - if (EVP_DecryptFinal(&cipher_ctx, (unsigned char *)outbuf + i, &i)) {
919 + if (EVP_DecryptFinal(cipher_ctx, (unsigned char *)outbuf + i, &i)) {
921 outbuf[outlen] = '\0';
922 RETVAL_STRINGL((char *)outbuf, outlen, 0);
923 @@ -5062,7 +5265,7 @@
927 - EVP_CIPHER_CTX_cleanup(&cipher_ctx);
928 + EVP_CIPHER_CTX_free(cipher_ctx);
932 @@ -5100,6 +5303,7 @@
940 @@ -5109,14 +5313,18 @@
943 ZEND_FETCH_RESOURCE(pkey, EVP_PKEY *, &key, -1, "OpenSSL key", le_key);
944 - if (!pkey || EVP_PKEY_type(pkey->type) != EVP_PKEY_DH || !pkey->pkey.dh) {
945 + if (EVP_PKEY_base_id(pkey) != EVP_PKEY_DH) {
948 + dh = EVP_PKEY_get0_DH(pkey);
953 pub = BN_bin2bn((unsigned char*)pub_str, pub_len, NULL);
955 - data = emalloc(DH_size(pkey->pkey.dh) + 1);
956 - len = DH_compute_key((unsigned char*)data, pub, pkey->pkey.dh);
957 + data = emalloc(DH_size(dh) + 1);
958 + len = DH_compute_key((unsigned char*)data, pub, dh);