* [meta-oe][PATCH] php5: 5.6.36 -> 5.6.38
@ 2018-09-26 15:12 Hongxu Jia
2019-01-30 16:13 ` Randy MacLeod
0 siblings, 1 reply; 7+ messages in thread
From: Hongxu Jia @ 2018-09-26 15:12 UTC (permalink / raw)
To: raj.khem; +Cc: openembedded-devel
1. Support openssl 1.1.x
2. 5.6.38 ChangeLog (http://php.net/ChangeLog-5.php#5.6.38)
- Fixed bug #76582 (XSS due to the header Transfer-Encoding: chunked).
- Fixed bug #76423 (Int Overflow lead to Heap OverFlow in
exif_thumbnail_extract of exif.c). (CVE-2018-14883)
- Fixed bug #76557 (heap-buffer-overflow (READ of size 48) while
reading exif data). (CVE-2018-14851)
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
.../0001-PHP-5.6-LibSSL-1.1-compatibility.patch | 1285 ++++++++++++++++++++
meta-oe/recipes-devtools/php/php_5.6.36.bb | 23 -
meta-oe/recipes-devtools/php/php_5.6.38.bb | 24 +
3 files changed, 1309 insertions(+), 23 deletions(-)
create mode 100644 meta-oe/recipes-devtools/php/php/0001-PHP-5.6-LibSSL-1.1-compatibility.patch
delete mode 100644 meta-oe/recipes-devtools/php/php_5.6.36.bb
create mode 100644 meta-oe/recipes-devtools/php/php_5.6.38.bb
diff --git a/meta-oe/recipes-devtools/php/php/0001-PHP-5.6-LibSSL-1.1-compatibility.patch b/meta-oe/recipes-devtools/php/php/0001-PHP-5.6-LibSSL-1.1-compatibility.patch
new file mode 100644
index 0000000..ac8365b
--- /dev/null
+++ b/meta-oe/recipes-devtools/php/php/0001-PHP-5.6-LibSSL-1.1-compatibility.patch
@@ -0,0 +1,1285 @@
+Subject: [PATCH] PHP 5.6 - LibSSL 1.1 compatibility
+
+This patch does not try to backport the 7.1 openssl module, it is the
+improved version of the 5.6 original openssl module.
+
+https://github.com/oerdnj/deb.sury.org/issues/566
+http://zettasystem.com/PHP-5.6.31-OpenSSL-1.1.0-compatibility-20170801.patch
+
+Upstream-Status: Deny [https://github.com/php/php-src/pull/2667]
+Reason: As PHP 5.6 is no longer actively supported only security fixes
+may land on this branch. As this change does not fall in this category,
+I'm closing this PR. (All higher versions of PHP already have OpenSSL
+1.1 support.)
+
+Author: zsalab@github https://github.com/zsalab
+
+Only port source modification, do not include the test case
+Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
+---
+ ext/openssl/openssl.c | 683 +++++++++++++++++++++++++++++++++++++-------------
+ ext/openssl/xp_ssl.c | 18 +-
+ ext/phar/util.c | 13 +-
+ 3 files changed, 527 insertions(+), 187 deletions(-)
+
+diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c
+index a78a8fb..b53114c 100644
+--- a/ext/openssl/openssl.c
++++ b/ext/openssl/openssl.c
+@@ -42,6 +42,12 @@
+
+ /* OpenSSL includes */
+ #include <openssl/evp.h>
++#if OPENSSL_VERSION_NUMBER >= 0x10002000L
++#include <openssl/bn.h>
++#include <openssl/rsa.h>
++#include <openssl/dsa.h>
++#include <openssl/dh.h>
++#endif
+ #include <openssl/x509.h>
+ #include <openssl/x509v3.h>
+ #include <openssl/crypto.h>
+@@ -531,6 +537,133 @@ zend_module_entry openssl_module_entry = {
+ ZEND_GET_MODULE(openssl)
+ #endif
+
++/* {{{ OpenSSL compatibility functions and macros */
++#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined (LIBRESSL_VERSION_NUMBER)
++#define EVP_PKEY_get0_RSA(_pkey) _pkey->pkey.rsa
++#define EVP_PKEY_get0_DH(_pkey) _pkey->pkey.dh
++#define EVP_PKEY_get0_DSA(_pkey) _pkey->pkey.dsa
++#define EVP_PKEY_get0_EC_KEY(_pkey) _pkey->pkey.ec
++
++static int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d)
++{
++ r->n = n;
++ r->e = e;
++ r->d = d;
++
++ return 1;
++}
++
++static int RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q)
++{
++ r->p = p;
++ r->q = q;
++
++ return 1;
++}
++
++static int RSA_set0_crt_params(RSA *r, BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp)
++{
++ r->dmp1 = dmp1;
++ r->dmq1 = dmq1;
++ r->iqmp = iqmp;
++
++ return 1;
++}
++
++static void RSA_get0_key(const RSA *r, const BIGNUM **n, const BIGNUM **e, const BIGNUM **d)
++{
++ *n = r->n;
++ *e = r->e;
++ *d = r->d;
++}
++
++static void RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q)
++{
++ *p = r->p;
++ *q = r->q;
++}
++
++static void RSA_get0_crt_params(const RSA *r, const BIGNUM **dmp1, const BIGNUM **dmq1, const BIGNUM **iqmp)
++{
++ *dmp1 = r->dmp1;
++ *dmq1 = r->dmq1;
++ *iqmp = r->iqmp;
++}
++
++static void DH_get0_pqg(const DH *dh, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g)
++{
++ *p = dh->p;
++ *q = dh->q;
++ *g = dh->g;
++}
++
++static int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g)
++{
++ dh->p = p;
++ dh->q = q;
++ dh->g = g;
++
++ return 1;
++}
++
++static void DH_get0_key(const DH *dh, const BIGNUM **pub_key, const BIGNUM **priv_key)
++{
++ *pub_key = dh->pub_key;
++ *priv_key = dh->priv_key;
++}
++
++static int DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key)
++{
++ dh->pub_key = pub_key;
++ dh->priv_key = priv_key;
++
++ return 1;
++}
++
++static void DSA_get0_pqg(const DSA *d, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g)
++{
++ *p = d->p;
++ *q = d->q;
++ *g = d->g;
++}
++
++int DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g)
++{
++ d->p = p;
++ d->q = q;
++ d->g = g;
++
++ return 1;
++}
++
++static void DSA_get0_key(const DSA *d, const BIGNUM **pub_key, const BIGNUM **priv_key)
++{
++ *pub_key = d->pub_key;
++ *priv_key = d->priv_key;
++}
++
++int DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key)
++{
++ d->pub_key = pub_key;
++ d->priv_key = priv_key;
++
++ return 1;
++}
++
++#if OPENSSL_VERSION_NUMBER < 0x10002000L || defined (LIBRESSL_VERSION_NUMBER)
++#define EVP_PKEY_id(_pkey) _pkey->type
++#define EVP_PKEY_base_id(_key) EVP_PKEY_type(_key->type)
++
++static int X509_get_signature_nid(const X509 *x)
++{
++ return OBJ_obj2nid(x->sig_alg->algorithm);
++}
++
++#endif
++
++#endif
++/* }}} */
++
+ static int le_key;
+ static int le_x509;
+ static int le_csr;
+@@ -825,7 +958,7 @@ static int add_oid_section(struct php_x509_request * req TSRMLS_DC) /* {{{ */
+ }
+ for (i = 0; i < sk_CONF_VALUE_num(sktmp); i++) {
+ cnf = sk_CONF_VALUE_value(sktmp, i);
+- if (OBJ_create(cnf->value, cnf->name, cnf->name) == NID_undef) {
++ if (OBJ_sn2nid(cnf->name) == NID_undef && OBJ_ln2nid(cnf->name) == NID_undef && OBJ_create(cnf->value, cnf->name, cnf->name) == NID_undef) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "problem creating object %s=%s", cnf->name, cnf->value);
+ return FAILURE;
+ }
+@@ -967,7 +1100,7 @@ static void php_openssl_dispose_config(struct php_x509_request * req TSRMLS_DC)
+ }
+ /* }}} */
+
+-#ifdef PHP_WIN32
++#if defined(PHP_WIN32) || (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER))
+ #define PHP_OPENSSL_RAND_ADD_TIME() ((void) 0)
+ #else
+ #define PHP_OPENSSL_RAND_ADD_TIME() php_openssl_rand_add_timeval()
+@@ -1053,9 +1186,11 @@ static EVP_MD * php_openssl_get_evp_md_from_algo(long algo) { /* {{{ */
+ mdtype = (EVP_MD *) EVP_md2();
+ break;
+ #endif
++#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined (LIBRESSL_VERSION_NUMBER)
+ case OPENSSL_ALGO_DSS1:
+ mdtype = (EVP_MD *) EVP_dss1();
+ break;
++#endif
+ #if OPENSSL_VERSION_NUMBER >= 0x0090708fL
+ case OPENSSL_ALGO_SHA224:
+ mdtype = (EVP_MD *) EVP_sha224();
+@@ -1146,6 +1281,12 @@ PHP_MINIT_FUNCTION(openssl)
+ OpenSSL_add_all_digests();
+ OpenSSL_add_all_algorithms();
+
++#if !defined(OPENSSL_NO_AES) && defined(EVP_CIPH_CCM_MODE) && OPENSSL_VERSION_NUMBER < 0x100020000
++ EVP_add_cipher(EVP_aes_128_ccm());
++ EVP_add_cipher(EVP_aes_192_ccm());
++ EVP_add_cipher(EVP_aes_256_ccm());
++#endif
++
+ SSL_load_error_strings();
+
+ /* register a resource id number with OpenSSL so that we can map SSL -> stream structures in
+@@ -1173,7 +1314,9 @@ PHP_MINIT_FUNCTION(openssl)
+ #ifdef HAVE_OPENSSL_MD2_H
+ REGISTER_LONG_CONSTANT("OPENSSL_ALGO_MD2", OPENSSL_ALGO_MD2, CONST_CS|CONST_PERSISTENT);
+ #endif
++#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined (LIBRESSL_VERSION_NUMBER)
+ REGISTER_LONG_CONSTANT("OPENSSL_ALGO_DSS1", OPENSSL_ALGO_DSS1, CONST_CS|CONST_PERSISTENT);
++#endif
+ #if OPENSSL_VERSION_NUMBER >= 0x0090708fL
+ REGISTER_LONG_CONSTANT("OPENSSL_ALGO_SHA224", OPENSSL_ALGO_SHA224, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("OPENSSL_ALGO_SHA256", OPENSSL_ALGO_SHA256, CONST_CS|CONST_PERSISTENT);
+@@ -1251,7 +1394,9 @@ PHP_MINIT_FUNCTION(openssl)
+ }
+
+ php_stream_xport_register("ssl", php_openssl_ssl_socket_factory TSRMLS_CC);
++#ifndef OPENSSL_NO_SSL3
+ php_stream_xport_register("sslv3", php_openssl_ssl_socket_factory TSRMLS_CC);
++#endif
+ #ifndef OPENSSL_NO_SSL2
+ php_stream_xport_register("sslv2", php_openssl_ssl_socket_factory TSRMLS_CC);
+ #endif
+@@ -1308,7 +1453,9 @@ PHP_MSHUTDOWN_FUNCTION(openssl)
+ #ifndef OPENSSL_NO_SSL2
+ php_stream_xport_unregister("sslv2" TSRMLS_CC);
+ #endif
++#ifndef OPENSSL_NO_SSL3
+ php_stream_xport_unregister("sslv3" TSRMLS_CC);
++#endif
+ php_stream_xport_unregister("tls" TSRMLS_CC);
+ php_stream_xport_unregister("tlsv1.0" TSRMLS_CC);
+ #if OPENSSL_VERSION_NUMBER >= 0x10001001L
+@@ -1893,6 +2040,7 @@ static int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension)
+ {
+ GENERAL_NAMES *names;
+ const X509V3_EXT_METHOD *method = NULL;
++ ASN1_OCTET_STRING *extension_data;
+ long i, length, num;
+ const unsigned char *p;
+
+@@ -1901,8 +2049,9 @@ static int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension)
+ return -1;
+ }
+
+- p = extension->value->data;
+- length = extension->value->length;
++ extension_data = X509_EXTENSION_get_data(extension);
++ p = extension_data->data;
++ length = extension_data->length;
+ if (method->it) {
+ names = (GENERAL_NAMES*)(ASN1_item_d2i(NULL, &p, length,
+ ASN1_ITEM_ptr(method->it)));
+@@ -1965,6 +2114,8 @@ PHP_FUNCTION(openssl_x509_parse)
+ char * tmpstr;
+ zval * subitem;
+ X509_EXTENSION *extension;
++ X509_NAME *subject_name;
++ char *cert_name;
+ char *extname;
+ BIO *bio_out;
+ BUF_MEM *bio_buf;
+@@ -1979,10 +2130,10 @@ PHP_FUNCTION(openssl_x509_parse)
+ }
+ array_init(return_value);
+
+- if (cert->name) {
+- add_assoc_string(return_value, "name", cert->name, 1);
+- }
+-/* add_assoc_bool(return_value, "valid", cert->valid); */
++ subject_name = X509_get_subject_name(cert);
++ cert_name = X509_NAME_oneline(subject_name, NULL, 0);
++ add_assoc_string(return_value, "name", cert_name, 1);
++ OPENSSL_free(cert_name);
+
+ add_assoc_name_entry(return_value, "subject", X509_get_subject_name(cert), useshortnames TSRMLS_CC);
+ /* hash as used in CA directories to lookup cert by subject name */
+@@ -2008,7 +2159,7 @@ PHP_FUNCTION(openssl_x509_parse)
+ add_assoc_string(return_value, "alias", tmpstr, 1);
+ }
+
+- sig_nid = OBJ_obj2nid((cert)->sig_alg->algorithm);
++ sig_nid = X509_get_signature_nid(cert);
+ add_assoc_string(return_value, "signatureTypeSN", (char*)OBJ_nid2sn(sig_nid), 1);
+ add_assoc_string(return_value, "signatureTypeLN", (char*)OBJ_nid2ln(sig_nid), 1);
+ add_assoc_long(return_value, "signatureTypeNID", sig_nid);
+@@ -3217,7 +3368,21 @@ PHP_FUNCTION(openssl_csr_get_public_key)
+ RETURN_FALSE;
+ }
+
+- tpubkey=X509_REQ_get_pubkey(csr);
++#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)
++ /* Due to changes in OpenSSL 1.1 related to locking when decoding CSR,
++ * the pub key is not changed after assigning. It means if we pass
++ * a private key, it will be returned including the private part.
++ * If we duplicate it, then we get just the public part which is
++ * the same behavior as for OpenSSL 1.0 */
++ csr = X509_REQ_dup(csr);
++#endif
++ /* Retrieve the public key from the CSR */
++ tpubkey = X509_REQ_get_pubkey(csr);
++
++#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)
++ /* We need to free the CSR as it was duplicated */
++ X509_REQ_free(csr);
++#endif
+ RETVAL_RESOURCE(zend_list_insert(tpubkey, le_key TSRMLS_CC));
+ return;
+ }
+@@ -3482,13 +3647,20 @@ static int php_openssl_is_private_key(EVP_PKEY* pkey TSRMLS_DC)
+ {
+ assert(pkey != NULL);
+
+- switch (pkey->type) {
++ switch (EVP_PKEY_id(pkey)) {
+ #ifndef NO_RSA
+ case EVP_PKEY_RSA:
+ case EVP_PKEY_RSA2:
+- assert(pkey->pkey.rsa != NULL);
+- if (pkey->pkey.rsa != NULL && (NULL == pkey->pkey.rsa->p || NULL == pkey->pkey.rsa->q)) {
+- return 0;
++ {
++ RSA *rsa = EVP_PKEY_get0_RSA(pkey);
++ if (rsa != NULL) {
++ const BIGNUM *p, *q;
++
++ RSA_get0_factors(rsa, &p, &q);
++ if (p == NULL || q == NULL) {
++ return 0;
++ }
++ }
+ }
+ break;
+ #endif
+@@ -3498,28 +3670,51 @@ static int php_openssl_is_private_key(EVP_PKEY* pkey TSRMLS_DC)
+ case EVP_PKEY_DSA2:
+ case EVP_PKEY_DSA3:
+ case EVP_PKEY_DSA4:
+- assert(pkey->pkey.dsa != NULL);
+-
+- if (NULL == pkey->pkey.dsa->p || NULL == pkey->pkey.dsa->q || NULL == pkey->pkey.dsa->priv_key){
+- return 0;
++ {
++ DSA *dsa = EVP_PKEY_get0_DSA(pkey);
++ if (dsa != NULL) {
++ const BIGNUM *p, *q, *g, *pub_key, *priv_key;
++
++ DSA_get0_pqg(dsa, &p, &q, &g);
++ if (p == NULL || q == NULL) {
++ return 0;
++ }
++
++ DSA_get0_key(dsa, &pub_key, &priv_key);
++ if (priv_key == NULL) {
++ return 0;
++ }
++ }
+ }
+ break;
+ #endif
+ #ifndef NO_DH
+ case EVP_PKEY_DH:
+- assert(pkey->pkey.dh != NULL);
+-
+- if (NULL == pkey->pkey.dh->p || NULL == pkey->pkey.dh->priv_key) {
+- return 0;
++ {
++ DH *dh = EVP_PKEY_get0_DH(pkey);
++ if (dh != NULL) {
++ const BIGNUM *p, *q, *g, *pub_key, *priv_key;
++
++ DH_get0_pqg(dh, &p, &q, &g);
++ if (p == NULL) {
++ return 0;
++ }
++
++ DH_get0_key(dh, &pub_key, &priv_key);
++ if (priv_key == NULL) {
++ return 0;
++ }
++ }
+ }
+ break;
+ #endif
+ #ifdef HAVE_EVP_PKEY_EC
+ case EVP_PKEY_EC:
+- assert(pkey->pkey.ec != NULL);
+-
+- if ( NULL == EC_KEY_get0_private_key(pkey->pkey.ec)) {
+- return 0;
++ {
++ EC_KEY *ec = EVP_PKEY_get0_EC_KEY(pkey);
++ if (ec != NULL && NULL == EC_KEY_get0_private_key(ec)) {
++ return 0;
++ }
+ }
+ break;
+ #endif
+@@ -3531,34 +3726,80 @@ static int php_openssl_is_private_key(EVP_PKEY* pkey TSRMLS_DC)
+ }
+ /* }}} */
+
+-#define OPENSSL_PKEY_GET_BN(_type, _name) do { \
+- if (pkey->pkey._type->_name != NULL) { \
+- int len = BN_num_bytes(pkey->pkey._type->_name); \
+- char *str = emalloc(len + 1); \
+- BN_bn2bin(pkey->pkey._type->_name, (unsigned char*)str); \
+- str[len] = 0; \
+- add_assoc_stringl(_type, #_name, str, len, 0); \
+- } \
+- } while (0)
+-
+-#define OPENSSL_PKEY_SET_BN(_ht, _type, _name) do { \
+- zval **bn; \
+- if (zend_hash_find(_ht, #_name, sizeof(#_name), (void**)&bn) == SUCCESS && \
+- Z_TYPE_PP(bn) == IS_STRING) { \
+- _type->_name = BN_bin2bn( \
+- (unsigned char*)Z_STRVAL_PP(bn), \
+- Z_STRLEN_PP(bn), NULL); \
+- } \
++#define OPENSSL_GET_BN(_array, _bn, _name) do { \
++ if (_bn != NULL) { \
++ int len = BN_num_bytes(_bn); \
++ char *str = emalloc(len + 1); \
++ BN_bn2bin(_bn, (unsigned char*)str); \
++ str[len] = 0; \
++ add_assoc_stringl(_array, #_name, str, len, 0); \
++ } \
+ } while (0);
+
++#define OPENSSL_PKEY_GET_BN(_type, _name) OPENSSL_GET_BN(_type, _name, _name)
++
++#define OPENSSL_PKEY_SET_BN(_data, _name) do { \
++ zval **bn; \
++ if (zend_hash_find(Z_ARRVAL_P(_data), #_name, sizeof(#_name),(void**)&bn) == SUCCESS && \
++ Z_TYPE_PP(bn) == IS_STRING) { \
++ _name = BN_bin2bn( \
++ (unsigned char*)Z_STRVAL_PP(bn), \
++ Z_STRLEN_PP(bn), NULL); \
++ } else { \
++ _name = NULL; \
++ } \
++ } while (0);
++
++/* {{{ php_openssl_pkey_init_rsa */
++zend_bool php_openssl_pkey_init_and_assign_rsa(EVP_PKEY *pkey, RSA *rsa, zval *data)
++{
++ BIGNUM *n, *e, *d, *p, *q, *dmp1, *dmq1, *iqmp;
++
++ OPENSSL_PKEY_SET_BN(data, n);
++ OPENSSL_PKEY_SET_BN(data, e);
++ OPENSSL_PKEY_SET_BN(data, d);
++ if (!n || !d || !RSA_set0_key(rsa, n, e, d)) {
++ return 0;
++ }
++
++ OPENSSL_PKEY_SET_BN(data, p);
++ OPENSSL_PKEY_SET_BN(data, q);
++ if ((p || q) && !RSA_set0_factors(rsa, p, q)) {
++ return 0;
++ }
++
++ OPENSSL_PKEY_SET_BN(data, dmp1);
++ OPENSSL_PKEY_SET_BN(data, dmq1);
++ OPENSSL_PKEY_SET_BN(data, iqmp);
++ if ((dmp1 || dmq1 || iqmp) && !RSA_set0_crt_params(rsa, dmp1, dmq1, iqmp)) {
++ return 0;
++ }
++
++ if (!EVP_PKEY_assign_RSA(pkey, rsa)) {
++ return 0;
++ }
++
++ return 1;
++}
++/* }}} */
++
+ /* {{{ php_openssl_pkey_init_dsa */
+-zend_bool php_openssl_pkey_init_dsa(DSA *dsa)
++zend_bool php_openssl_pkey_init_dsa(DSA *dsa, zval *data)
+ {
+- if (!dsa->p || !dsa->q || !dsa->g) {
++ BIGNUM *p, *q, *g, *priv_key, *pub_key;
++ const BIGNUM *priv_key_const, *pub_key_const;
++
++ OPENSSL_PKEY_SET_BN(data, p);
++ OPENSSL_PKEY_SET_BN(data, q);
++ OPENSSL_PKEY_SET_BN(data, g);
++ if (!p || !q || !g || !DSA_set0_pqg(dsa, p, q, g)) {
+ return 0;
+ }
+- if (dsa->priv_key || dsa->pub_key) {
+- return 1;
++
++ OPENSSL_PKEY_SET_BN(data, pub_key);
++ OPENSSL_PKEY_SET_BN(data, priv_key);
++ if (pub_key) {
++ return DSA_set0_key(dsa, pub_key, priv_key);
+ }
+ PHP_OPENSSL_RAND_ADD_TIME();
+ if (!DSA_generate_key(dsa)) {
+@@ -3566,7 +3807,8 @@ zend_bool php_openssl_pkey_init_dsa(DSA *dsa)
+ }
+ /* if BN_mod_exp return -1, then DSA_generate_key succeed for failed key
+ * so we need to double check that public key is created */
+- if (!dsa->pub_key || BN_is_zero(dsa->pub_key)) {
++ DSA_get0_key(dsa, &pub_key_const, &priv_key_const);
++ if (!pub_key_const || BN_is_zero(pub_key_const)) {
+ return 0;
+ }
+ /* all good */
+@@ -3574,14 +3816,66 @@ zend_bool php_openssl_pkey_init_dsa(DSA *dsa)
+ }
+ /* }}} */
+
++/* {{{ php_openssl_dh_pub_from_priv */
++static BIGNUM *php_openssl_dh_pub_from_priv(BIGNUM *priv_key, BIGNUM *g, BIGNUM *p)
++{
++ BIGNUM *pub_key, *priv_key_const_time;
++ BN_CTX *ctx;
++
++ pub_key = BN_new();
++ if (pub_key == NULL) {
++ return NULL;
++ }
++
++ priv_key_const_time = BN_new();
++ if (priv_key_const_time == NULL) {
++ BN_free(pub_key);
++ return NULL;
++ }
++ ctx = BN_CTX_new();
++ if (ctx == NULL) {
++ BN_free(pub_key);
++ BN_free(priv_key_const_time);
++ return NULL;
++ }
++
++ BN_with_flags(priv_key_const_time, priv_key, BN_FLG_CONSTTIME);
++
++ if (!BN_mod_exp_mont(pub_key, g, priv_key_const_time, p, ctx, NULL)) {
++ BN_free(pub_key);
++ pub_key = NULL;
++ }
++
++ BN_free(priv_key_const_time);
++ BN_CTX_free(ctx);
++
++ return pub_key;
++}
++/* }}} */
++
+ /* {{{ php_openssl_pkey_init_dh */
+-zend_bool php_openssl_pkey_init_dh(DH *dh)
++zend_bool php_openssl_pkey_init_dh(DH *dh, zval *data)
+ {
+- if (!dh->p || !dh->g) {
++ BIGNUM *p, *q, *g, *priv_key, *pub_key;
++
++ OPENSSL_PKEY_SET_BN(data, p);
++ OPENSSL_PKEY_SET_BN(data, q);
++ OPENSSL_PKEY_SET_BN(data, g);
++ if (!p || !g || !DH_set0_pqg(dh, p, q, g)) {
+ return 0;
+ }
+- if (dh->pub_key) {
+- return 1;
++
++ OPENSSL_PKEY_SET_BN(data, priv_key);
++ OPENSSL_PKEY_SET_BN(data, pub_key);
++ if (pub_key) {
++ return DH_set0_key(dh, pub_key, priv_key);
++ }
++ if (priv_key) {
++ pub_key = php_openssl_dh_pub_from_priv(priv_key, g, p);
++ if (pub_key == NULL) {
++ return 0;
++ }
++ return DH_set0_key(dh, pub_key, priv_key);
+ }
+ PHP_OPENSSL_RAND_ADD_TIME();
+ if (!DH_generate_key(dh)) {
+@@ -3614,18 +3908,8 @@ PHP_FUNCTION(openssl_pkey_new)
+ if (pkey) {
+ RSA *rsa = RSA_new();
+ if (rsa) {
+- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, n);
+- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, e);
+- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, d);
+- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, p);
+- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, q);
+- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, dmp1);
+- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, dmq1);
+- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, iqmp);
+- if (rsa->n && rsa->d) {
+- if (EVP_PKEY_assign_RSA(pkey, rsa)) {
+- RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
+- }
++ if (php_openssl_pkey_init_and_assign_rsa(pkey, rsa, *data)) {
++ RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
+ }
+ RSA_free(rsa);
+ }
+@@ -3638,12 +3922,7 @@ PHP_FUNCTION(openssl_pkey_new)
+ if (pkey) {
+ DSA *dsa = DSA_new();
+ if (dsa) {
+- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, p);
+- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, q);
+- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, g);
+- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, priv_key);
+- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, pub_key);
+- if (php_openssl_pkey_init_dsa(dsa)) {
++ if (php_openssl_pkey_init_dsa(dsa, *data)) {
+ if (EVP_PKEY_assign_DSA(pkey, dsa)) {
+ RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
+ }
+@@ -3659,11 +3938,7 @@ PHP_FUNCTION(openssl_pkey_new)
+ if (pkey) {
+ DH *dh = DH_new();
+ if (dh) {
+- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, p);
+- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, g);
+- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, priv_key);
+- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, pub_key);
+- if (php_openssl_pkey_init_dh(dh)) {
++ if (php_openssl_pkey_init_dh(dh, *data)) {
+ if (EVP_PKEY_assign_DH(pkey, dh)) {
+ RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
+ }
+@@ -3738,10 +4013,10 @@ PHP_FUNCTION(openssl_pkey_export_to_file)
+ cipher = NULL;
+ }
+
+- switch (EVP_PKEY_type(key->type)) {
++ switch (EVP_PKEY_base_id(key)) {
+ #ifdef HAVE_EVP_PKEY_EC
+ case EVP_PKEY_EC:
+- pem_write = PEM_write_bio_ECPrivateKey(bio_out, EVP_PKEY_get1_EC_KEY(key), cipher, (unsigned char *)passphrase, passphrase_len, NULL, NULL);
++ pem_write = PEM_write_bio_ECPrivateKey(bio_out, EVP_PKEY_get0_EC_KEY(key), cipher, (unsigned char *)passphrase, passphrase_len, NULL, NULL);
+ break;
+ #endif
+ default:
+@@ -3807,7 +4082,7 @@ PHP_FUNCTION(openssl_pkey_export)
+ cipher = NULL;
+ }
+
+- switch (EVP_PKEY_type(key->type)) {
++ switch (EVP_PKEY_base_id(key)) {
+ #ifdef HAVE_EVP_PKEY_EC
+ case EVP_PKEY_EC:
+ pem_write = PEM_write_bio_ECPrivateKey(bio_out, EVP_PKEY_get1_EC_KEY(key), cipher, (unsigned char *)passphrase, passphrase_len, NULL, NULL);
+@@ -3928,25 +4203,33 @@ PHP_FUNCTION(openssl_pkey_get_details)
+ /*TODO: Use the real values once the openssl constants are used
+ * See the enum at the top of this file
+ */
+- switch (EVP_PKEY_type(pkey->type)) {
++ switch (EVP_PKEY_base_id(pkey)) {
+ case EVP_PKEY_RSA:
+ case EVP_PKEY_RSA2:
+- ktype = OPENSSL_KEYTYPE_RSA;
+-
+- if (pkey->pkey.rsa != NULL) {
+- zval *rsa;
+-
+- ALLOC_INIT_ZVAL(rsa);
+- array_init(rsa);
+- OPENSSL_PKEY_GET_BN(rsa, n);
+- OPENSSL_PKEY_GET_BN(rsa, e);
+- OPENSSL_PKEY_GET_BN(rsa, d);
+- OPENSSL_PKEY_GET_BN(rsa, p);
+- OPENSSL_PKEY_GET_BN(rsa, q);
+- OPENSSL_PKEY_GET_BN(rsa, dmp1);
+- OPENSSL_PKEY_GET_BN(rsa, dmq1);
+- OPENSSL_PKEY_GET_BN(rsa, iqmp);
+- add_assoc_zval(return_value, "rsa", rsa);
++ {
++ RSA *rsa = EVP_PKEY_get0_RSA(pkey);
++ ktype = OPENSSL_KEYTYPE_RSA;
++
++ if (rsa != NULL) {
++ zval *z_rsa;
++ const BIGNUM *n, *e, *d, *p, *q, *dmp1, *dmq1, *iqmp;
++
++ RSA_get0_key(rsa, &n, &e, &d);
++ RSA_get0_factors(rsa, &p, &q);
++ RSA_get0_crt_params(rsa, &dmp1, &dmq1, &iqmp);
++
++ ALLOC_INIT_ZVAL(z_rsa);
++ array_init(z_rsa);
++ OPENSSL_PKEY_GET_BN(z_rsa, n);
++ OPENSSL_PKEY_GET_BN(z_rsa, e);
++ OPENSSL_PKEY_GET_BN(z_rsa, d);
++ OPENSSL_PKEY_GET_BN(z_rsa, p);
++ OPENSSL_PKEY_GET_BN(z_rsa, q);
++ OPENSSL_PKEY_GET_BN(z_rsa, dmp1);
++ OPENSSL_PKEY_GET_BN(z_rsa, dmq1);
++ OPENSSL_PKEY_GET_BN(z_rsa, iqmp);
++ add_assoc_zval(return_value, "rsa", z_rsa);
++ }
+ }
+
+ break;
+@@ -3954,42 +4237,55 @@ PHP_FUNCTION(openssl_pkey_get_details)
+ case EVP_PKEY_DSA2:
+ case EVP_PKEY_DSA3:
+ case EVP_PKEY_DSA4:
+- ktype = OPENSSL_KEYTYPE_DSA;
+-
+- if (pkey->pkey.dsa != NULL) {
+- zval *dsa;
+-
+- ALLOC_INIT_ZVAL(dsa);
+- array_init(dsa);
+- OPENSSL_PKEY_GET_BN(dsa, p);
+- OPENSSL_PKEY_GET_BN(dsa, q);
+- OPENSSL_PKEY_GET_BN(dsa, g);
+- OPENSSL_PKEY_GET_BN(dsa, priv_key);
+- OPENSSL_PKEY_GET_BN(dsa, pub_key);
+- add_assoc_zval(return_value, "dsa", dsa);
++ {
++ DSA *dsa = EVP_PKEY_get0_DSA(pkey);
++ ktype = OPENSSL_KEYTYPE_DSA;
++
++ if (dsa != NULL) {
++ zval *z_dsa;
++ const BIGNUM *p, *q, *g, *priv_key, *pub_key;
++
++ DSA_get0_pqg(dsa, &p, &q, &g);
++ DSA_get0_key(dsa, &pub_key, &priv_key);
++
++ ALLOC_INIT_ZVAL(z_dsa);
++ array_init(z_dsa);
++ OPENSSL_PKEY_GET_BN(z_dsa, p);
++ OPENSSL_PKEY_GET_BN(z_dsa, q);
++ OPENSSL_PKEY_GET_BN(z_dsa, g);
++ OPENSSL_PKEY_GET_BN(z_dsa, priv_key);
++ OPENSSL_PKEY_GET_BN(z_dsa, pub_key);
++ add_assoc_zval(return_value, "dsa", z_dsa);
++ }
+ }
+ break;
+ case EVP_PKEY_DH:
+-
+- ktype = OPENSSL_KEYTYPE_DH;
+-
+- if (pkey->pkey.dh != NULL) {
+- zval *dh;
+-
+- ALLOC_INIT_ZVAL(dh);
+- array_init(dh);
+- OPENSSL_PKEY_GET_BN(dh, p);
+- OPENSSL_PKEY_GET_BN(dh, g);
+- OPENSSL_PKEY_GET_BN(dh, priv_key);
+- OPENSSL_PKEY_GET_BN(dh, pub_key);
+- add_assoc_zval(return_value, "dh", dh);
++ {
++ DH *dh = EVP_PKEY_get0_DH(pkey);
++ ktype = OPENSSL_KEYTYPE_DH;
++
++ if (dh != NULL) {
++ zval *z_dh;
++ const BIGNUM *p, *q, *g, *priv_key, *pub_key;
++
++ DH_get0_pqg(dh, &p, &q, &g);
++ DH_get0_key(dh, &pub_key, &priv_key);
++
++ ALLOC_INIT_ZVAL(z_dh);
++ array_init(z_dh);
++ OPENSSL_PKEY_GET_BN(z_dh, p);
++ OPENSSL_PKEY_GET_BN(z_dh, g);
++ OPENSSL_PKEY_GET_BN(z_dh, priv_key);
++ OPENSSL_PKEY_GET_BN(z_dh, pub_key);
++ add_assoc_zval(return_value, "dh", z_dh);
++ }
+ }
+
+ break;
+ #ifdef HAVE_EVP_PKEY_EC
+ case EVP_PKEY_EC:
+ ktype = OPENSSL_KEYTYPE_EC;
+- if (pkey->pkey.ec != NULL) {
++ if (EVP_PKEY_get0_EC_KEY(pkey) != NULL) {
+ zval *ec;
+ const EC_GROUP *ec_group;
+ int nid;
+@@ -4546,13 +4842,13 @@ PHP_FUNCTION(openssl_private_encrypt)
+ cryptedlen = EVP_PKEY_size(pkey);
+ cryptedbuf = emalloc(cryptedlen + 1);
+
+- switch (pkey->type) {
++ switch (EVP_PKEY_id(pkey)) {
+ case EVP_PKEY_RSA:
+ case EVP_PKEY_RSA2:
+ successful = (RSA_private_encrypt(data_len,
+ (unsigned char *)data,
+ cryptedbuf,
+- pkey->pkey.rsa,
++ EVP_PKEY_get0_RSA(pkey),
+ padding) == cryptedlen);
+ break;
+ default:
+@@ -4604,13 +4900,13 @@ PHP_FUNCTION(openssl_private_decrypt)
+ cryptedlen = EVP_PKEY_size(pkey);
+ crypttemp = emalloc(cryptedlen + 1);
+
+- switch (pkey->type) {
++ switch (EVP_PKEY_id(pkey)) {
+ case EVP_PKEY_RSA:
+ case EVP_PKEY_RSA2:
+ cryptedlen = RSA_private_decrypt(data_len,
+ (unsigned char *)data,
+ crypttemp,
+- pkey->pkey.rsa,
++ EVP_PKEY_get0_RSA(pkey),
+ padding);
+ if (cryptedlen != -1) {
+ cryptedbuf = emalloc(cryptedlen + 1);
+@@ -4669,13 +4965,13 @@ PHP_FUNCTION(openssl_public_encrypt)
+ cryptedlen = EVP_PKEY_size(pkey);
+ cryptedbuf = emalloc(cryptedlen + 1);
+
+- switch (pkey->type) {
++ switch (EVP_PKEY_id(pkey)) {
+ case EVP_PKEY_RSA:
+ case EVP_PKEY_RSA2:
+ successful = (RSA_public_encrypt(data_len,
+ (unsigned char *)data,
+ cryptedbuf,
+- pkey->pkey.rsa,
++ EVP_PKEY_get0_RSA(pkey),
+ padding) == cryptedlen);
+ break;
+ default:
+@@ -4728,13 +5024,13 @@ PHP_FUNCTION(openssl_public_decrypt)
+ cryptedlen = EVP_PKEY_size(pkey);
+ crypttemp = emalloc(cryptedlen + 1);
+
+- switch (pkey->type) {
++ switch (EVP_PKEY_id(pkey)) {
+ case EVP_PKEY_RSA:
+ case EVP_PKEY_RSA2:
+ cryptedlen = RSA_public_decrypt(data_len,
+ (unsigned char *)data,
+ crypttemp,
+- pkey->pkey.rsa,
++ EVP_PKEY_get0_RSA(pkey),
+ padding);
+ if (cryptedlen != -1) {
+ cryptedbuf = emalloc(cryptedlen + 1);
+@@ -4798,7 +5094,7 @@ PHP_FUNCTION(openssl_sign)
+ long keyresource = -1;
+ char * data;
+ int data_len;
+- EVP_MD_CTX md_ctx;
++ EVP_MD_CTX *md_ctx;
+ zval *method = NULL;
+ long signature_algo = OPENSSL_ALGO_SHA1;
+ const EVP_MD *mdtype;
+@@ -4831,9 +5127,10 @@ PHP_FUNCTION(openssl_sign)
+ siglen = EVP_PKEY_size(pkey);
+ sigbuf = emalloc(siglen + 1);
+
+- EVP_SignInit(&md_ctx, mdtype);
+- EVP_SignUpdate(&md_ctx, data, data_len);
+- if (EVP_SignFinal (&md_ctx, sigbuf,(unsigned int *)&siglen, pkey)) {
++ md_ctx = EVP_MD_CTX_create();
++ EVP_SignInit(md_ctx, mdtype);
++ EVP_SignUpdate(md_ctx, data, data_len);
++ if (EVP_SignFinal (md_ctx, sigbuf,(unsigned int *)&siglen, pkey)) {
+ zval_dtor(signature);
+ sigbuf[siglen] = '\0';
+ ZVAL_STRINGL(signature, (char *)sigbuf, siglen, 0);
+@@ -4842,7 +5139,7 @@ PHP_FUNCTION(openssl_sign)
+ efree(sigbuf);
+ RETVAL_FALSE;
+ }
+- EVP_MD_CTX_cleanup(&md_ctx);
++ EVP_MD_CTX_destroy(md_ctx);
+ if (keyresource == -1) {
+ EVP_PKEY_free(pkey);
+ }
+@@ -4856,7 +5153,7 @@ PHP_FUNCTION(openssl_verify)
+ zval **key;
+ EVP_PKEY *pkey;
+ int err;
+- EVP_MD_CTX md_ctx;
++ EVP_MD_CTX *md_ctx;
+ const EVP_MD *mdtype;
+ long keyresource = -1;
+ char * data; int data_len;
+@@ -4890,10 +5187,11 @@ PHP_FUNCTION(openssl_verify)
+ RETURN_FALSE;
+ }
+
+- EVP_VerifyInit (&md_ctx, mdtype);
+- EVP_VerifyUpdate (&md_ctx, data, data_len);
+- err = EVP_VerifyFinal (&md_ctx, (unsigned char *)signature, signature_len, pkey);
+- EVP_MD_CTX_cleanup(&md_ctx);
++ md_ctx = EVP_MD_CTX_create();
++ EVP_VerifyInit (md_ctx, mdtype);
++ EVP_VerifyUpdate (md_ctx, data, data_len);
++ err = EVP_VerifyFinal (md_ctx, (unsigned char *)signature, signature_len, pkey);
++ EVP_MD_CTX_destroy(md_ctx);
+
+ if (keyresource == -1) {
+ EVP_PKEY_free(pkey);
+@@ -4917,7 +5215,7 @@ PHP_FUNCTION(openssl_seal)
+ char *method =NULL;
+ int method_len = 0;
+ const EVP_CIPHER *cipher;
+- EVP_CIPHER_CTX ctx;
++ EVP_CIPHER_CTX *ctx;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "szza/|s", &data, &data_len, &sealdata, &ekeys, &pubkeys, &method, &method_len) == FAILURE) {
+ return;
+@@ -4950,6 +5248,7 @@ PHP_FUNCTION(openssl_seal)
+ memset(eks, 0, sizeof(*eks) * nkeys);
+ key_resources = safe_emalloc(nkeys, sizeof(long), 0);
+ memset(key_resources, 0, sizeof(*key_resources) * nkeys);
++ memset(pkeys, 0, sizeof(*pkeys) * nkeys);
+
+ /* get the public keys we are using to seal this data */
+ zend_hash_internal_pointer_reset_ex(pubkeysht, &pos);
+@@ -4967,27 +5266,28 @@ PHP_FUNCTION(openssl_seal)
+ i++;
+ }
+
+- if (!EVP_EncryptInit(&ctx,cipher,NULL,NULL)) {
++ ctx = EVP_CIPHER_CTX_new();
++ if (ctx == NULL || !EVP_EncryptInit(ctx,cipher,NULL,NULL)) {
+ RETVAL_FALSE;
+- EVP_CIPHER_CTX_cleanup(&ctx);
++ EVP_CIPHER_CTX_free(ctx);
+ goto clean_exit;
+ }
+
+ #if 0
+ /* Need this if allow ciphers that require initialization vector */
+- ivlen = EVP_CIPHER_CTX_iv_length(&ctx);
++ ivlen = EVP_CIPHER_CTX_iv_length(ctx);
+ iv = ivlen ? emalloc(ivlen + 1) : NULL;
+ #endif
+ /* allocate one byte extra to make room for \0 */
+- buf = emalloc(data_len + EVP_CIPHER_CTX_block_size(&ctx));
+- EVP_CIPHER_CTX_cleanup(&ctx);
++ buf = emalloc(data_len + EVP_CIPHER_CTX_block_size(ctx));
++ EVP_CIPHER_CTX_cleanup(ctx);
+
+- if (EVP_SealInit(&ctx, cipher, eks, eksl, NULL, pkeys, nkeys) <= 0 ||
+- !EVP_SealUpdate(&ctx, buf, &len1, (unsigned char *)data, data_len) ||
+- !EVP_SealFinal(&ctx, buf + len1, &len2)) {
++ if (EVP_SealInit(ctx, cipher, eks, eksl, NULL, pkeys, nkeys) <= 0 ||
++ !EVP_SealUpdate(ctx, buf, &len1, (unsigned char *)data, data_len) ||
++ !EVP_SealFinal(ctx, buf + len1, &len2)) {
+ RETVAL_FALSE;
+ efree(buf);
+- EVP_CIPHER_CTX_cleanup(&ctx);
++ EVP_CIPHER_CTX_free(ctx);
+ goto clean_exit;
+ }
+
+@@ -5018,7 +5318,7 @@ PHP_FUNCTION(openssl_seal)
+ efree(buf);
+ }
+ RETVAL_LONG(len1 + len2);
+- EVP_CIPHER_CTX_cleanup(&ctx);
++ EVP_CIPHER_CTX_free(ctx);
+
+ clean_exit:
+ for (i=0; i<nkeys; i++) {
+@@ -5045,7 +5345,7 @@ PHP_FUNCTION(openssl_open)
+ int len1, len2;
+ unsigned char *buf;
+ long keyresource = -1;
+- EVP_CIPHER_CTX ctx;
++ EVP_CIPHER_CTX *ctx;
+ char * data; int data_len;
+ char * ekey; int ekey_len;
+ char *method =NULL;
+@@ -5074,8 +5374,9 @@ PHP_FUNCTION(openssl_open)
+
+ buf = emalloc(data_len + 1);
+
+- if (EVP_OpenInit(&ctx, cipher, (unsigned char *)ekey, ekey_len, NULL, pkey) && EVP_OpenUpdate(&ctx, buf, &len1, (unsigned char *)data, data_len)) {
+- if (!EVP_OpenFinal(&ctx, buf + len1, &len2) || (len1 + len2 == 0)) {
++ ctx = EVP_CIPHER_CTX_new();
++ if (EVP_OpenInit(ctx, cipher, (unsigned char *)ekey, ekey_len, NULL, pkey) && EVP_OpenUpdate(ctx, buf, &len1, (unsigned char *)data, data_len)) {
++ if (!EVP_OpenFinal(ctx, buf + len1, &len2) || (len1 + len2 == 0)) {
+ efree(buf);
+ RETVAL_FALSE;
+ } else {
+@@ -5091,7 +5392,7 @@ PHP_FUNCTION(openssl_open)
+ if (keyresource == -1) {
+ EVP_PKEY_free(pkey);
+ }
+- EVP_CIPHER_CTX_cleanup(&ctx);
++ EVP_CIPHER_CTX_free(ctx);
+ }
+ /* }}} */
+
+@@ -5151,7 +5452,7 @@ PHP_FUNCTION(openssl_digest)
+ char *data, *method;
+ int data_len, method_len;
+ const EVP_MD *mdtype;
+- EVP_MD_CTX md_ctx;
++ EVP_MD_CTX *md_ctx;
+ int siglen;
+ unsigned char *sigbuf;
+
+@@ -5167,9 +5468,10 @@ PHP_FUNCTION(openssl_digest)
+ siglen = EVP_MD_size(mdtype);
+ sigbuf = emalloc(siglen + 1);
+
+- EVP_DigestInit(&md_ctx, mdtype);
+- EVP_DigestUpdate(&md_ctx, (unsigned char *)data, data_len);
+- if (EVP_DigestFinal (&md_ctx, (unsigned char *)sigbuf, (unsigned int *)&siglen)) {
++ md_ctx = EVP_MD_CTX_create();
++ EVP_DigestInit(md_ctx, mdtype);
++ EVP_DigestUpdate(md_ctx, (unsigned char *)data, data_len);
++ if (EVP_DigestFinal (md_ctx, (unsigned char *)sigbuf, (unsigned int *)&siglen)) {
+ if (raw_output) {
+ sigbuf[siglen] = '\0';
+ RETVAL_STRINGL((char *)sigbuf, siglen, 0);
+@@ -5185,6 +5487,8 @@ PHP_FUNCTION(openssl_digest)
+ efree(sigbuf);
+ RETVAL_FALSE;
+ }
++
++ EVP_MD_CTX_destroy(md_ctx);
+ }
+ /* }}} */
+
+@@ -5230,7 +5534,7 @@ PHP_FUNCTION(openssl_encrypt)
+ char *data, *method, *password, *iv = "";
+ int data_len, method_len, password_len, iv_len = 0, max_iv_len;
+ const EVP_CIPHER *cipher_type;
+- EVP_CIPHER_CTX cipher_ctx;
++ EVP_CIPHER_CTX *cipher_ctx;
+ int i=0, outlen, keylen;
+ unsigned char *outbuf, *key;
+ zend_bool free_iv;
+@@ -5262,19 +5566,24 @@ PHP_FUNCTION(openssl_encrypt)
+ outlen = data_len + EVP_CIPHER_block_size(cipher_type);
+ outbuf = safe_emalloc(outlen, 1, 1);
+
+- EVP_EncryptInit(&cipher_ctx, cipher_type, NULL, NULL);
++ cipher_ctx = EVP_CIPHER_CTX_new();
++ if (!cipher_ctx) {
++ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to create cipher context");
++ RETURN_FALSE;
++ }
++ EVP_EncryptInit(cipher_ctx, cipher_type, NULL, NULL);
+ if (password_len > keylen) {
+- EVP_CIPHER_CTX_set_key_length(&cipher_ctx, password_len);
++ EVP_CIPHER_CTX_set_key_length(cipher_ctx, password_len);
+ }
+- EVP_EncryptInit_ex(&cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
++ EVP_EncryptInit_ex(cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
+ if (options & OPENSSL_ZERO_PADDING) {
+- EVP_CIPHER_CTX_set_padding(&cipher_ctx, 0);
++ EVP_CIPHER_CTX_set_padding(cipher_ctx, 0);
+ }
+ if (data_len > 0) {
+- EVP_EncryptUpdate(&cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
++ EVP_EncryptUpdate(cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
+ }
+ outlen = i;
+- if (EVP_EncryptFinal(&cipher_ctx, (unsigned char *)outbuf + i, &i)) {
++ if (EVP_EncryptFinal(cipher_ctx, (unsigned char *)outbuf + i, &i)) {
+ outlen += i;
+ if (options & OPENSSL_RAW_DATA) {
+ outbuf[outlen] = '\0';
+@@ -5301,7 +5610,8 @@ PHP_FUNCTION(openssl_encrypt)
+ if (free_iv) {
+ efree(iv);
+ }
+- EVP_CIPHER_CTX_cleanup(&cipher_ctx);
++ EVP_CIPHER_CTX_cleanup(cipher_ctx);
++ EVP_CIPHER_CTX_free(cipher_ctx);
+ }
+ /* }}} */
+
+@@ -5313,7 +5623,7 @@ PHP_FUNCTION(openssl_decrypt)
+ char *data, *method, *password, *iv = "";
+ int data_len, method_len, password_len, iv_len = 0;
+ const EVP_CIPHER *cipher_type;
+- EVP_CIPHER_CTX cipher_ctx;
++ EVP_CIPHER_CTX *cipher_ctx;
+ int i, outlen, keylen;
+ unsigned char *outbuf, *key;
+ int base64_str_len;
+@@ -5359,17 +5669,23 @@ PHP_FUNCTION(openssl_decrypt)
+ outlen = data_len + EVP_CIPHER_block_size(cipher_type);
+ outbuf = emalloc(outlen + 1);
+
+- EVP_DecryptInit(&cipher_ctx, cipher_type, NULL, NULL);
++ cipher_ctx = EVP_CIPHER_CTX_new();
++ if (!cipher_ctx) {
++ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to create cipher context");
++ RETURN_FALSE;
++ }
++
++ EVP_DecryptInit(cipher_ctx, cipher_type, NULL, NULL);
+ if (password_len > keylen) {
+- EVP_CIPHER_CTX_set_key_length(&cipher_ctx, password_len);
++ EVP_CIPHER_CTX_set_key_length(cipher_ctx, password_len);
+ }
+- EVP_DecryptInit_ex(&cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
++ EVP_DecryptInit_ex(cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
+ if (options & OPENSSL_ZERO_PADDING) {
+- EVP_CIPHER_CTX_set_padding(&cipher_ctx, 0);
++ EVP_CIPHER_CTX_set_padding(cipher_ctx, 0);
+ }
+- EVP_DecryptUpdate(&cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
++ EVP_DecryptUpdate(cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
+ outlen = i;
+- if (EVP_DecryptFinal(&cipher_ctx, (unsigned char *)outbuf + i, &i)) {
++ if (EVP_DecryptFinal(cipher_ctx, (unsigned char *)outbuf + i, &i)) {
+ outlen += i;
+ outbuf[outlen] = '\0';
+ RETVAL_STRINGL((char *)outbuf, outlen, 0);
+@@ -5386,7 +5702,8 @@ PHP_FUNCTION(openssl_decrypt)
+ if (base64_str) {
+ efree(base64_str);
+ }
+- EVP_CIPHER_CTX_cleanup(&cipher_ctx);
++ EVP_CIPHER_CTX_cleanup(cipher_ctx);
++ EVP_CIPHER_CTX_free(cipher_ctx);
+ }
+ /* }}} */
+
+@@ -5424,6 +5741,7 @@ PHP_FUNCTION(openssl_dh_compute_key)
+ zval *key;
+ char *pub_str;
+ int pub_len;
++ DH *dh;
+ EVP_PKEY *pkey;
+ BIGNUM *pub;
+ char *data;
+@@ -5433,14 +5751,21 @@ PHP_FUNCTION(openssl_dh_compute_key)
+ return;
+ }
+ ZEND_FETCH_RESOURCE(pkey, EVP_PKEY *, &key, -1, "OpenSSL key", le_key);
+- if (!pkey || EVP_PKEY_type(pkey->type) != EVP_PKEY_DH || !pkey->pkey.dh) {
++ if (pkey == NULL) {
++ RETURN_FALSE;
++ }
++ if (EVP_PKEY_base_id(pkey) != EVP_PKEY_DH) {
++ RETURN_FALSE;
++ }
++ dh = EVP_PKEY_get0_DH(pkey);
++ if (dh == NULL) {
+ RETURN_FALSE;
+ }
+
+ pub = BN_bin2bn((unsigned char*)pub_str, pub_len, NULL);
+
+- data = emalloc(DH_size(pkey->pkey.dh) + 1);
+- len = DH_compute_key((unsigned char*)data, pub, pkey->pkey.dh);
++ data = emalloc(DH_size(dh) + 1);
++ len = DH_compute_key((unsigned char*)data, pub, dh);
+
+ if (len >= 0) {
+ data[len] = 0;
+diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c
+index d549033..c2d477c 100644
+--- a/ext/openssl/xp_ssl.c
++++ b/ext/openssl/xp_ssl.c
+@@ -935,7 +935,7 @@ static int set_local_cert(SSL_CTX *ctx, php_stream *stream TSRMLS_DC) /* {{{ */
+ static const SSL_METHOD *php_select_crypto_method(long method_value, int is_client TSRMLS_DC) /* {{{ */
+ {
+ if (method_value == STREAM_CRYPTO_METHOD_SSLv2) {
+-#ifndef OPENSSL_NO_SSL2
++#if !defined(OPENSSL_NO_SSL2) && OPENSSL_VERSION_NUMBER < 0x10100000L
+ return is_client ? SSLv2_client_method() : SSLv2_server_method();
+ #else
+ php_error_docref(NULL TSRMLS_CC, E_WARNING,
+@@ -1588,12 +1588,26 @@ int php_openssl_setup_crypto(php_stream *stream,
+ }
+ /* }}} */
+
++#define PHP_SSL_MAX_VERSION_LEN 32
++
++static char *php_ssl_cipher_get_version(const SSL_CIPHER *c, char *buffer, size_t max_len) /* {{{ */
++{
++ const char *version = SSL_CIPHER_get_version(c);
++ strncpy(buffer, version, max_len);
++ if (max_len <= strlen(version)) {
++ buffer[max_len - 1] = 0;
++ }
++ return buffer;
++}
++/* }}} */
++
+ static zval *capture_session_meta(SSL *ssl_handle) /* {{{ */
+ {
+ zval *meta_arr;
+ char *proto_str;
+ long proto = SSL_version(ssl_handle);
+ const SSL_CIPHER *cipher = SSL_get_current_cipher(ssl_handle);
++ char version_str[PHP_SSL_MAX_VERSION_LEN];
+
+ switch (proto) {
+ #if OPENSSL_VERSION_NUMBER >= 0x10001001L
+@@ -1611,7 +1625,7 @@ static zval *capture_session_meta(SSL *ssl_handle) /* {{{ */
+ add_assoc_string(meta_arr, "protocol", proto_str, 1);
+ add_assoc_string(meta_arr, "cipher_name", (char *) SSL_CIPHER_get_name(cipher), 1);
+ add_assoc_long(meta_arr, "cipher_bits", SSL_CIPHER_get_bits(cipher, NULL));
+- add_assoc_string(meta_arr, "cipher_version", SSL_CIPHER_get_version(cipher), 1);
++ add_assoc_string(meta_arr, "cipher_version", php_ssl_cipher_get_version(cipher, version_str, PHP_SSL_MAX_VERSION_LEN), 1);
+
+ return meta_arr;
+ }
+diff --git a/ext/phar/util.c b/ext/phar/util.c
+index 828be8f..06e4e55 100644
+--- a/ext/phar/util.c
++++ b/ext/phar/util.c
+@@ -1531,7 +1531,7 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ
+ BIO *in;
+ EVP_PKEY *key;
+ EVP_MD *mdtype = (EVP_MD *) EVP_sha1();
+- EVP_MD_CTX md_ctx;
++ EVP_MD_CTX *md_ctx;
+ #else
+ int tempsig;
+ #endif
+@@ -1608,7 +1608,8 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ
+ return FAILURE;
+ }
+
+- EVP_VerifyInit(&md_ctx, mdtype);
++ md_ctx = EVP_MD_CTX_create();
++ EVP_VerifyInit(md_ctx, mdtype);
+ read_len = end_of_phar;
+
+ if (read_len > sizeof(buf)) {
+@@ -1620,7 +1621,7 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ
+ php_stream_seek(fp, 0, SEEK_SET);
+
+ while (read_size && (len = php_stream_read(fp, (char*)buf, read_size)) > 0) {
+- EVP_VerifyUpdate (&md_ctx, buf, len);
++ EVP_VerifyUpdate (md_ctx, buf, len);
+ read_len -= (off_t)len;
+
+ if (read_len < read_size) {
+@@ -1628,9 +1629,9 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ
+ }
+ }
+
+- if (EVP_VerifyFinal(&md_ctx, (unsigned char *)sig, sig_len, key) != 1) {
++ if (EVP_VerifyFinal(md_ctx, (unsigned char *)sig, sig_len, key) != 1) {
+ /* 1: signature verified, 0: signature does not match, -1: failed signature operation */
+- EVP_MD_CTX_cleanup(&md_ctx);
++ EVP_MD_CTX_destroy(md_ctx);
+
+ if (error) {
+ spprintf(error, 0, "broken openssl signature");
+@@ -1639,7 +1640,7 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ
+ return FAILURE;
+ }
+
+- EVP_MD_CTX_cleanup(&md_ctx);
++ EVP_MD_CTX_destroy(md_ctx);
+ #endif
+
+ *signature_len = phar_hex_str((const char*)sig, sig_len, signature TSRMLS_CC);
+--
+2.7.4
+
diff --git a/meta-oe/recipes-devtools/php/php_5.6.36.bb b/meta-oe/recipes-devtools/php/php_5.6.36.bb
deleted file mode 100644
index addddb3..0000000
--- a/meta-oe/recipes-devtools/php/php_5.6.36.bb
+++ /dev/null
@@ -1,23 +0,0 @@
-require php.inc
-
-LIC_FILES_CHKSUM = "file://LICENSE;md5=b602636d46a61c0ac0432bbf5c078fe4"
-
-SRC_URI += "file://php5-change-AC_TRY_RUN-to-AC_TRY_LINK.patch \
- file://pthread-check-threads-m4.patch \
- file://0001-Add-lpthread-to-link.patch \
- file://acinclude-xml2-config.patch \
- file://0001-acinclude-use-pkgconfig-for-libxml2-config.patch \
- "
-
-SRC_URI_append_class-target = " \
- file://php5-pear-makefile.patch \
- file://php5-phar-makefile.patch \
- file://php5-0001-opcache-config.m4-enable-opcache.patch \
- "
-
-SRC_URI[md5sum] = "6ca12a0e52dcd99cf4d5b2d74c6cde6f"
-SRC_URI[sha256sum] = "626a0e3f5d8a0e686a2b930f0dd3a0601fe3dcb5e43dd0e8c3fab631e64e172a"
-
-DEPENDS += "libmcrypt"
-EXTRA_OECONF += "--with-mcrypt=${STAGING_DIR_TARGET}${exec_prefix} \
- "
diff --git a/meta-oe/recipes-devtools/php/php_5.6.38.bb b/meta-oe/recipes-devtools/php/php_5.6.38.bb
new file mode 100644
index 0000000..d6f5145
--- /dev/null
+++ b/meta-oe/recipes-devtools/php/php_5.6.38.bb
@@ -0,0 +1,24 @@
+require php.inc
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b602636d46a61c0ac0432bbf5c078fe4"
+
+SRC_URI += "file://php5-change-AC_TRY_RUN-to-AC_TRY_LINK.patch \
+ file://pthread-check-threads-m4.patch \
+ file://0001-Add-lpthread-to-link.patch \
+ file://acinclude-xml2-config.patch \
+ file://0001-acinclude-use-pkgconfig-for-libxml2-config.patch \
+ file://0001-PHP-5.6-LibSSL-1.1-compatibility.patch \
+ "
+
+SRC_URI_append_class-target = " \
+ file://php5-pear-makefile.patch \
+ file://php5-phar-makefile.patch \
+ file://php5-0001-opcache-config.m4-enable-opcache.patch \
+ "
+
+SRC_URI[md5sum] = "5b98aa066567eca8e5738b8ef4a3545c"
+SRC_URI[sha256sum] = "d65b231bbdd63be4439ef5ced965cfd63e62983429dbd4dfcfb49981593ebc03"
+
+DEPENDS += "libmcrypt"
+EXTRA_OECONF += "--with-mcrypt=${STAGING_DIR_TARGET}${exec_prefix} \
+ "
--
2.7.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [meta-oe][PATCH] php5: 5.6.36 -> 5.6.38
2018-09-26 15:12 [meta-oe][PATCH] php5: 5.6.36 -> 5.6.38 Hongxu Jia
@ 2019-01-30 16:13 ` Randy MacLeod
2019-01-30 16:33 ` Khem Raj
0 siblings, 1 reply; 7+ messages in thread
From: Randy MacLeod @ 2019-01-30 16:13 UTC (permalink / raw)
To: Hongxu Jia, raj.khem; +Cc: openembedded-devel
On 9/26/18 11:12 AM, Hongxu Jia wrote:
> 1. Support openssl 1.1.x
>
> 2. 5.6.38 ChangeLog (http://php.net/ChangeLog-5.php#5.6.38)
> - Fixed bug #76582 (XSS due to the header Transfer-Encoding: chunked).
>
> - Fixed bug #76423 (Int Overflow lead to Heap OverFlow in
> exif_thumbnail_extract of exif.c). (CVE-2018-14883)
>
> - Fixed bug #76557 (heap-buffer-overflow (READ of size 48) while
> reading exif data). (CVE-2018-14851)
Does anyone object to dropping the 5.6 version of php ?
Official security support for PHP 5.6 finished on 31 December 2018 [1]
and:
http://php.net/supported-versions.php
Despite this, there's a 5.6.40 that was released on Jan 10, 2018 which
is odd:
http://php.net/downloads.php#v5.6.40
../Randy
[1] https://en.wikipedia.org/wiki/PHP#PHP_5
>
> Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
> ---
> .../0001-PHP-5.6-LibSSL-1.1-compatibility.patch | 1285 ++++++++++++++++++++
> meta-oe/recipes-devtools/php/php_5.6.36.bb | 23 -
> meta-oe/recipes-devtools/php/php_5.6.38.bb | 24 +
> 3 files changed, 1309 insertions(+), 23 deletions(-)
> create mode 100644 meta-oe/recipes-devtools/php/php/0001-PHP-5.6-LibSSL-1.1-compatibility.patch
> delete mode 100644 meta-oe/recipes-devtools/php/php_5.6.36.bb
> create mode 100644 meta-oe/recipes-devtools/php/php_5.6.38.bb
>
> diff --git a/meta-oe/recipes-devtools/php/php/0001-PHP-5.6-LibSSL-1.1-compatibility.patch b/meta-oe/recipes-devtools/php/php/0001-PHP-5.6-LibSSL-1.1-compatibility.patch
> new file mode 100644
> index 0000000..ac8365b
> --- /dev/null
> +++ b/meta-oe/recipes-devtools/php/php/0001-PHP-5.6-LibSSL-1.1-compatibility.patch
> @@ -0,0 +1,1285 @@
> +Subject: [PATCH] PHP 5.6 - LibSSL 1.1 compatibility
> +
> +This patch does not try to backport the 7.1 openssl module, it is the
> +improved version of the 5.6 original openssl module.
> +
> +https://github.com/oerdnj/deb.sury.org/issues/566
> +http://zettasystem.com/PHP-5.6.31-OpenSSL-1.1.0-compatibility-20170801.patch
> +
> +Upstream-Status: Deny [https://github.com/php/php-src/pull/2667]
> +Reason: As PHP 5.6 is no longer actively supported only security fixes
> +may land on this branch. As this change does not fall in this category,
> +I'm closing this PR. (All higher versions of PHP already have OpenSSL
> +1.1 support.)
> +
> +Author: zsalab@github https://github.com/zsalab
> +
> +Only port source modification, do not include the test case
> +Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
> +---
> + ext/openssl/openssl.c | 683 +++++++++++++++++++++++++++++++++++++-------------
> + ext/openssl/xp_ssl.c | 18 +-
> + ext/phar/util.c | 13 +-
> + 3 files changed, 527 insertions(+), 187 deletions(-)
> +
> +diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c
> +index a78a8fb..b53114c 100644
> +--- a/ext/openssl/openssl.c
> ++++ b/ext/openssl/openssl.c
> +@@ -42,6 +42,12 @@
> +
> + /* OpenSSL includes */
> + #include <openssl/evp.h>
> ++#if OPENSSL_VERSION_NUMBER >= 0x10002000L
> ++#include <openssl/bn.h>
> ++#include <openssl/rsa.h>
> ++#include <openssl/dsa.h>
> ++#include <openssl/dh.h>
> ++#endif
> + #include <openssl/x509.h>
> + #include <openssl/x509v3.h>
> + #include <openssl/crypto.h>
> +@@ -531,6 +537,133 @@ zend_module_entry openssl_module_entry = {
> + ZEND_GET_MODULE(openssl)
> + #endif
> +
> ++/* {{{ OpenSSL compatibility functions and macros */
> ++#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined (LIBRESSL_VERSION_NUMBER)
> ++#define EVP_PKEY_get0_RSA(_pkey) _pkey->pkey.rsa
> ++#define EVP_PKEY_get0_DH(_pkey) _pkey->pkey.dh
> ++#define EVP_PKEY_get0_DSA(_pkey) _pkey->pkey.dsa
> ++#define EVP_PKEY_get0_EC_KEY(_pkey) _pkey->pkey.ec
> ++
> ++static int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d)
> ++{
> ++ r->n = n;
> ++ r->e = e;
> ++ r->d = d;
> ++
> ++ return 1;
> ++}
> ++
> ++static int RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q)
> ++{
> ++ r->p = p;
> ++ r->q = q;
> ++
> ++ return 1;
> ++}
> ++
> ++static int RSA_set0_crt_params(RSA *r, BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp)
> ++{
> ++ r->dmp1 = dmp1;
> ++ r->dmq1 = dmq1;
> ++ r->iqmp = iqmp;
> ++
> ++ return 1;
> ++}
> ++
> ++static void RSA_get0_key(const RSA *r, const BIGNUM **n, const BIGNUM **e, const BIGNUM **d)
> ++{
> ++ *n = r->n;
> ++ *e = r->e;
> ++ *d = r->d;
> ++}
> ++
> ++static void RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q)
> ++{
> ++ *p = r->p;
> ++ *q = r->q;
> ++}
> ++
> ++static void RSA_get0_crt_params(const RSA *r, const BIGNUM **dmp1, const BIGNUM **dmq1, const BIGNUM **iqmp)
> ++{
> ++ *dmp1 = r->dmp1;
> ++ *dmq1 = r->dmq1;
> ++ *iqmp = r->iqmp;
> ++}
> ++
> ++static void DH_get0_pqg(const DH *dh, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g)
> ++{
> ++ *p = dh->p;
> ++ *q = dh->q;
> ++ *g = dh->g;
> ++}
> ++
> ++static int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g)
> ++{
> ++ dh->p = p;
> ++ dh->q = q;
> ++ dh->g = g;
> ++
> ++ return 1;
> ++}
> ++
> ++static void DH_get0_key(const DH *dh, const BIGNUM **pub_key, const BIGNUM **priv_key)
> ++{
> ++ *pub_key = dh->pub_key;
> ++ *priv_key = dh->priv_key;
> ++}
> ++
> ++static int DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key)
> ++{
> ++ dh->pub_key = pub_key;
> ++ dh->priv_key = priv_key;
> ++
> ++ return 1;
> ++}
> ++
> ++static void DSA_get0_pqg(const DSA *d, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g)
> ++{
> ++ *p = d->p;
> ++ *q = d->q;
> ++ *g = d->g;
> ++}
> ++
> ++int DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g)
> ++{
> ++ d->p = p;
> ++ d->q = q;
> ++ d->g = g;
> ++
> ++ return 1;
> ++}
> ++
> ++static void DSA_get0_key(const DSA *d, const BIGNUM **pub_key, const BIGNUM **priv_key)
> ++{
> ++ *pub_key = d->pub_key;
> ++ *priv_key = d->priv_key;
> ++}
> ++
> ++int DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key)
> ++{
> ++ d->pub_key = pub_key;
> ++ d->priv_key = priv_key;
> ++
> ++ return 1;
> ++}
> ++
> ++#if OPENSSL_VERSION_NUMBER < 0x10002000L || defined (LIBRESSL_VERSION_NUMBER)
> ++#define EVP_PKEY_id(_pkey) _pkey->type
> ++#define EVP_PKEY_base_id(_key) EVP_PKEY_type(_key->type)
> ++
> ++static int X509_get_signature_nid(const X509 *x)
> ++{
> ++ return OBJ_obj2nid(x->sig_alg->algorithm);
> ++}
> ++
> ++#endif
> ++
> ++#endif
> ++/* }}} */
> ++
> + static int le_key;
> + static int le_x509;
> + static int le_csr;
> +@@ -825,7 +958,7 @@ static int add_oid_section(struct php_x509_request * req TSRMLS_DC) /* {{{ */
> + }
> + for (i = 0; i < sk_CONF_VALUE_num(sktmp); i++) {
> + cnf = sk_CONF_VALUE_value(sktmp, i);
> +- if (OBJ_create(cnf->value, cnf->name, cnf->name) == NID_undef) {
> ++ if (OBJ_sn2nid(cnf->name) == NID_undef && OBJ_ln2nid(cnf->name) == NID_undef && OBJ_create(cnf->value, cnf->name, cnf->name) == NID_undef) {
> + php_error_docref(NULL TSRMLS_CC, E_WARNING, "problem creating object %s=%s", cnf->name, cnf->value);
> + return FAILURE;
> + }
> +@@ -967,7 +1100,7 @@ static void php_openssl_dispose_config(struct php_x509_request * req TSRMLS_DC)
> + }
> + /* }}} */
> +
> +-#ifdef PHP_WIN32
> ++#if defined(PHP_WIN32) || (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER))
> + #define PHP_OPENSSL_RAND_ADD_TIME() ((void) 0)
> + #else
> + #define PHP_OPENSSL_RAND_ADD_TIME() php_openssl_rand_add_timeval()
> +@@ -1053,9 +1186,11 @@ static EVP_MD * php_openssl_get_evp_md_from_algo(long algo) { /* {{{ */
> + mdtype = (EVP_MD *) EVP_md2();
> + break;
> + #endif
> ++#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined (LIBRESSL_VERSION_NUMBER)
> + case OPENSSL_ALGO_DSS1:
> + mdtype = (EVP_MD *) EVP_dss1();
> + break;
> ++#endif
> + #if OPENSSL_VERSION_NUMBER >= 0x0090708fL
> + case OPENSSL_ALGO_SHA224:
> + mdtype = (EVP_MD *) EVP_sha224();
> +@@ -1146,6 +1281,12 @@ PHP_MINIT_FUNCTION(openssl)
> + OpenSSL_add_all_digests();
> + OpenSSL_add_all_algorithms();
> +
> ++#if !defined(OPENSSL_NO_AES) && defined(EVP_CIPH_CCM_MODE) && OPENSSL_VERSION_NUMBER < 0x100020000
> ++ EVP_add_cipher(EVP_aes_128_ccm());
> ++ EVP_add_cipher(EVP_aes_192_ccm());
> ++ EVP_add_cipher(EVP_aes_256_ccm());
> ++#endif
> ++
> + SSL_load_error_strings();
> +
> + /* register a resource id number with OpenSSL so that we can map SSL -> stream structures in
> +@@ -1173,7 +1314,9 @@ PHP_MINIT_FUNCTION(openssl)
> + #ifdef HAVE_OPENSSL_MD2_H
> + REGISTER_LONG_CONSTANT("OPENSSL_ALGO_MD2", OPENSSL_ALGO_MD2, CONST_CS|CONST_PERSISTENT);
> + #endif
> ++#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined (LIBRESSL_VERSION_NUMBER)
> + REGISTER_LONG_CONSTANT("OPENSSL_ALGO_DSS1", OPENSSL_ALGO_DSS1, CONST_CS|CONST_PERSISTENT);
> ++#endif
> + #if OPENSSL_VERSION_NUMBER >= 0x0090708fL
> + REGISTER_LONG_CONSTANT("OPENSSL_ALGO_SHA224", OPENSSL_ALGO_SHA224, CONST_CS|CONST_PERSISTENT);
> + REGISTER_LONG_CONSTANT("OPENSSL_ALGO_SHA256", OPENSSL_ALGO_SHA256, CONST_CS|CONST_PERSISTENT);
> +@@ -1251,7 +1394,9 @@ PHP_MINIT_FUNCTION(openssl)
> + }
> +
> + php_stream_xport_register("ssl", php_openssl_ssl_socket_factory TSRMLS_CC);
> ++#ifndef OPENSSL_NO_SSL3
> + php_stream_xport_register("sslv3", php_openssl_ssl_socket_factory TSRMLS_CC);
> ++#endif
> + #ifndef OPENSSL_NO_SSL2
> + php_stream_xport_register("sslv2", php_openssl_ssl_socket_factory TSRMLS_CC);
> + #endif
> +@@ -1308,7 +1453,9 @@ PHP_MSHUTDOWN_FUNCTION(openssl)
> + #ifndef OPENSSL_NO_SSL2
> + php_stream_xport_unregister("sslv2" TSRMLS_CC);
> + #endif
> ++#ifndef OPENSSL_NO_SSL3
> + php_stream_xport_unregister("sslv3" TSRMLS_CC);
> ++#endif
> + php_stream_xport_unregister("tls" TSRMLS_CC);
> + php_stream_xport_unregister("tlsv1.0" TSRMLS_CC);
> + #if OPENSSL_VERSION_NUMBER >= 0x10001001L
> +@@ -1893,6 +2040,7 @@ static int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension)
> + {
> + GENERAL_NAMES *names;
> + const X509V3_EXT_METHOD *method = NULL;
> ++ ASN1_OCTET_STRING *extension_data;
> + long i, length, num;
> + const unsigned char *p;
> +
> +@@ -1901,8 +2049,9 @@ static int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension)
> + return -1;
> + }
> +
> +- p = extension->value->data;
> +- length = extension->value->length;
> ++ extension_data = X509_EXTENSION_get_data(extension);
> ++ p = extension_data->data;
> ++ length = extension_data->length;
> + if (method->it) {
> + names = (GENERAL_NAMES*)(ASN1_item_d2i(NULL, &p, length,
> + ASN1_ITEM_ptr(method->it)));
> +@@ -1965,6 +2114,8 @@ PHP_FUNCTION(openssl_x509_parse)
> + char * tmpstr;
> + zval * subitem;
> + X509_EXTENSION *extension;
> ++ X509_NAME *subject_name;
> ++ char *cert_name;
> + char *extname;
> + BIO *bio_out;
> + BUF_MEM *bio_buf;
> +@@ -1979,10 +2130,10 @@ PHP_FUNCTION(openssl_x509_parse)
> + }
> + array_init(return_value);
> +
> +- if (cert->name) {
> +- add_assoc_string(return_value, "name", cert->name, 1);
> +- }
> +-/* add_assoc_bool(return_value, "valid", cert->valid); */
> ++ subject_name = X509_get_subject_name(cert);
> ++ cert_name = X509_NAME_oneline(subject_name, NULL, 0);
> ++ add_assoc_string(return_value, "name", cert_name, 1);
> ++ OPENSSL_free(cert_name);
> +
> + add_assoc_name_entry(return_value, "subject", X509_get_subject_name(cert), useshortnames TSRMLS_CC);
> + /* hash as used in CA directories to lookup cert by subject name */
> +@@ -2008,7 +2159,7 @@ PHP_FUNCTION(openssl_x509_parse)
> + add_assoc_string(return_value, "alias", tmpstr, 1);
> + }
> +
> +- sig_nid = OBJ_obj2nid((cert)->sig_alg->algorithm);
> ++ sig_nid = X509_get_signature_nid(cert);
> + add_assoc_string(return_value, "signatureTypeSN", (char*)OBJ_nid2sn(sig_nid), 1);
> + add_assoc_string(return_value, "signatureTypeLN", (char*)OBJ_nid2ln(sig_nid), 1);
> + add_assoc_long(return_value, "signatureTypeNID", sig_nid);
> +@@ -3217,7 +3368,21 @@ PHP_FUNCTION(openssl_csr_get_public_key)
> + RETURN_FALSE;
> + }
> +
> +- tpubkey=X509_REQ_get_pubkey(csr);
> ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)
> ++ /* Due to changes in OpenSSL 1.1 related to locking when decoding CSR,
> ++ * the pub key is not changed after assigning. It means if we pass
> ++ * a private key, it will be returned including the private part.
> ++ * If we duplicate it, then we get just the public part which is
> ++ * the same behavior as for OpenSSL 1.0 */
> ++ csr = X509_REQ_dup(csr);
> ++#endif
> ++ /* Retrieve the public key from the CSR */
> ++ tpubkey = X509_REQ_get_pubkey(csr);
> ++
> ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)
> ++ /* We need to free the CSR as it was duplicated */
> ++ X509_REQ_free(csr);
> ++#endif
> + RETVAL_RESOURCE(zend_list_insert(tpubkey, le_key TSRMLS_CC));
> + return;
> + }
> +@@ -3482,13 +3647,20 @@ static int php_openssl_is_private_key(EVP_PKEY* pkey TSRMLS_DC)
> + {
> + assert(pkey != NULL);
> +
> +- switch (pkey->type) {
> ++ switch (EVP_PKEY_id(pkey)) {
> + #ifndef NO_RSA
> + case EVP_PKEY_RSA:
> + case EVP_PKEY_RSA2:
> +- assert(pkey->pkey.rsa != NULL);
> +- if (pkey->pkey.rsa != NULL && (NULL == pkey->pkey.rsa->p || NULL == pkey->pkey.rsa->q)) {
> +- return 0;
> ++ {
> ++ RSA *rsa = EVP_PKEY_get0_RSA(pkey);
> ++ if (rsa != NULL) {
> ++ const BIGNUM *p, *q;
> ++
> ++ RSA_get0_factors(rsa, &p, &q);
> ++ if (p == NULL || q == NULL) {
> ++ return 0;
> ++ }
> ++ }
> + }
> + break;
> + #endif
> +@@ -3498,28 +3670,51 @@ static int php_openssl_is_private_key(EVP_PKEY* pkey TSRMLS_DC)
> + case EVP_PKEY_DSA2:
> + case EVP_PKEY_DSA3:
> + case EVP_PKEY_DSA4:
> +- assert(pkey->pkey.dsa != NULL);
> +-
> +- if (NULL == pkey->pkey.dsa->p || NULL == pkey->pkey.dsa->q || NULL == pkey->pkey.dsa->priv_key){
> +- return 0;
> ++ {
> ++ DSA *dsa = EVP_PKEY_get0_DSA(pkey);
> ++ if (dsa != NULL) {
> ++ const BIGNUM *p, *q, *g, *pub_key, *priv_key;
> ++
> ++ DSA_get0_pqg(dsa, &p, &q, &g);
> ++ if (p == NULL || q == NULL) {
> ++ return 0;
> ++ }
> ++
> ++ DSA_get0_key(dsa, &pub_key, &priv_key);
> ++ if (priv_key == NULL) {
> ++ return 0;
> ++ }
> ++ }
> + }
> + break;
> + #endif
> + #ifndef NO_DH
> + case EVP_PKEY_DH:
> +- assert(pkey->pkey.dh != NULL);
> +-
> +- if (NULL == pkey->pkey.dh->p || NULL == pkey->pkey.dh->priv_key) {
> +- return 0;
> ++ {
> ++ DH *dh = EVP_PKEY_get0_DH(pkey);
> ++ if (dh != NULL) {
> ++ const BIGNUM *p, *q, *g, *pub_key, *priv_key;
> ++
> ++ DH_get0_pqg(dh, &p, &q, &g);
> ++ if (p == NULL) {
> ++ return 0;
> ++ }
> ++
> ++ DH_get0_key(dh, &pub_key, &priv_key);
> ++ if (priv_key == NULL) {
> ++ return 0;
> ++ }
> ++ }
> + }
> + break;
> + #endif
> + #ifdef HAVE_EVP_PKEY_EC
> + case EVP_PKEY_EC:
> +- assert(pkey->pkey.ec != NULL);
> +-
> +- if ( NULL == EC_KEY_get0_private_key(pkey->pkey.ec)) {
> +- return 0;
> ++ {
> ++ EC_KEY *ec = EVP_PKEY_get0_EC_KEY(pkey);
> ++ if (ec != NULL && NULL == EC_KEY_get0_private_key(ec)) {
> ++ return 0;
> ++ }
> + }
> + break;
> + #endif
> +@@ -3531,34 +3726,80 @@ static int php_openssl_is_private_key(EVP_PKEY* pkey TSRMLS_DC)
> + }
> + /* }}} */
> +
> +-#define OPENSSL_PKEY_GET_BN(_type, _name) do { \
> +- if (pkey->pkey._type->_name != NULL) { \
> +- int len = BN_num_bytes(pkey->pkey._type->_name); \
> +- char *str = emalloc(len + 1); \
> +- BN_bn2bin(pkey->pkey._type->_name, (unsigned char*)str); \
> +- str[len] = 0; \
> +- add_assoc_stringl(_type, #_name, str, len, 0); \
> +- } \
> +- } while (0)
> +-
> +-#define OPENSSL_PKEY_SET_BN(_ht, _type, _name) do { \
> +- zval **bn; \
> +- if (zend_hash_find(_ht, #_name, sizeof(#_name), (void**)&bn) == SUCCESS && \
> +- Z_TYPE_PP(bn) == IS_STRING) { \
> +- _type->_name = BN_bin2bn( \
> +- (unsigned char*)Z_STRVAL_PP(bn), \
> +- Z_STRLEN_PP(bn), NULL); \
> +- } \
> ++#define OPENSSL_GET_BN(_array, _bn, _name) do { \
> ++ if (_bn != NULL) { \
> ++ int len = BN_num_bytes(_bn); \
> ++ char *str = emalloc(len + 1); \
> ++ BN_bn2bin(_bn, (unsigned char*)str); \
> ++ str[len] = 0; \
> ++ add_assoc_stringl(_array, #_name, str, len, 0); \
> ++ } \
> + } while (0);
> +
> ++#define OPENSSL_PKEY_GET_BN(_type, _name) OPENSSL_GET_BN(_type, _name, _name)
> ++
> ++#define OPENSSL_PKEY_SET_BN(_data, _name) do { \
> ++ zval **bn; \
> ++ if (zend_hash_find(Z_ARRVAL_P(_data), #_name, sizeof(#_name),(void**)&bn) == SUCCESS && \
> ++ Z_TYPE_PP(bn) == IS_STRING) { \
> ++ _name = BN_bin2bn( \
> ++ (unsigned char*)Z_STRVAL_PP(bn), \
> ++ Z_STRLEN_PP(bn), NULL); \
> ++ } else { \
> ++ _name = NULL; \
> ++ } \
> ++ } while (0);
> ++
> ++/* {{{ php_openssl_pkey_init_rsa */
> ++zend_bool php_openssl_pkey_init_and_assign_rsa(EVP_PKEY *pkey, RSA *rsa, zval *data)
> ++{
> ++ BIGNUM *n, *e, *d, *p, *q, *dmp1, *dmq1, *iqmp;
> ++
> ++ OPENSSL_PKEY_SET_BN(data, n);
> ++ OPENSSL_PKEY_SET_BN(data, e);
> ++ OPENSSL_PKEY_SET_BN(data, d);
> ++ if (!n || !d || !RSA_set0_key(rsa, n, e, d)) {
> ++ return 0;
> ++ }
> ++
> ++ OPENSSL_PKEY_SET_BN(data, p);
> ++ OPENSSL_PKEY_SET_BN(data, q);
> ++ if ((p || q) && !RSA_set0_factors(rsa, p, q)) {
> ++ return 0;
> ++ }
> ++
> ++ OPENSSL_PKEY_SET_BN(data, dmp1);
> ++ OPENSSL_PKEY_SET_BN(data, dmq1);
> ++ OPENSSL_PKEY_SET_BN(data, iqmp);
> ++ if ((dmp1 || dmq1 || iqmp) && !RSA_set0_crt_params(rsa, dmp1, dmq1, iqmp)) {
> ++ return 0;
> ++ }
> ++
> ++ if (!EVP_PKEY_assign_RSA(pkey, rsa)) {
> ++ return 0;
> ++ }
> ++
> ++ return 1;
> ++}
> ++/* }}} */
> ++
> + /* {{{ php_openssl_pkey_init_dsa */
> +-zend_bool php_openssl_pkey_init_dsa(DSA *dsa)
> ++zend_bool php_openssl_pkey_init_dsa(DSA *dsa, zval *data)
> + {
> +- if (!dsa->p || !dsa->q || !dsa->g) {
> ++ BIGNUM *p, *q, *g, *priv_key, *pub_key;
> ++ const BIGNUM *priv_key_const, *pub_key_const;
> ++
> ++ OPENSSL_PKEY_SET_BN(data, p);
> ++ OPENSSL_PKEY_SET_BN(data, q);
> ++ OPENSSL_PKEY_SET_BN(data, g);
> ++ if (!p || !q || !g || !DSA_set0_pqg(dsa, p, q, g)) {
> + return 0;
> + }
> +- if (dsa->priv_key || dsa->pub_key) {
> +- return 1;
> ++
> ++ OPENSSL_PKEY_SET_BN(data, pub_key);
> ++ OPENSSL_PKEY_SET_BN(data, priv_key);
> ++ if (pub_key) {
> ++ return DSA_set0_key(dsa, pub_key, priv_key);
> + }
> + PHP_OPENSSL_RAND_ADD_TIME();
> + if (!DSA_generate_key(dsa)) {
> +@@ -3566,7 +3807,8 @@ zend_bool php_openssl_pkey_init_dsa(DSA *dsa)
> + }
> + /* if BN_mod_exp return -1, then DSA_generate_key succeed for failed key
> + * so we need to double check that public key is created */
> +- if (!dsa->pub_key || BN_is_zero(dsa->pub_key)) {
> ++ DSA_get0_key(dsa, &pub_key_const, &priv_key_const);
> ++ if (!pub_key_const || BN_is_zero(pub_key_const)) {
> + return 0;
> + }
> + /* all good */
> +@@ -3574,14 +3816,66 @@ zend_bool php_openssl_pkey_init_dsa(DSA *dsa)
> + }
> + /* }}} */
> +
> ++/* {{{ php_openssl_dh_pub_from_priv */
> ++static BIGNUM *php_openssl_dh_pub_from_priv(BIGNUM *priv_key, BIGNUM *g, BIGNUM *p)
> ++{
> ++ BIGNUM *pub_key, *priv_key_const_time;
> ++ BN_CTX *ctx;
> ++
> ++ pub_key = BN_new();
> ++ if (pub_key == NULL) {
> ++ return NULL;
> ++ }
> ++
> ++ priv_key_const_time = BN_new();
> ++ if (priv_key_const_time == NULL) {
> ++ BN_free(pub_key);
> ++ return NULL;
> ++ }
> ++ ctx = BN_CTX_new();
> ++ if (ctx == NULL) {
> ++ BN_free(pub_key);
> ++ BN_free(priv_key_const_time);
> ++ return NULL;
> ++ }
> ++
> ++ BN_with_flags(priv_key_const_time, priv_key, BN_FLG_CONSTTIME);
> ++
> ++ if (!BN_mod_exp_mont(pub_key, g, priv_key_const_time, p, ctx, NULL)) {
> ++ BN_free(pub_key);
> ++ pub_key = NULL;
> ++ }
> ++
> ++ BN_free(priv_key_const_time);
> ++ BN_CTX_free(ctx);
> ++
> ++ return pub_key;
> ++}
> ++/* }}} */
> ++
> + /* {{{ php_openssl_pkey_init_dh */
> +-zend_bool php_openssl_pkey_init_dh(DH *dh)
> ++zend_bool php_openssl_pkey_init_dh(DH *dh, zval *data)
> + {
> +- if (!dh->p || !dh->g) {
> ++ BIGNUM *p, *q, *g, *priv_key, *pub_key;
> ++
> ++ OPENSSL_PKEY_SET_BN(data, p);
> ++ OPENSSL_PKEY_SET_BN(data, q);
> ++ OPENSSL_PKEY_SET_BN(data, g);
> ++ if (!p || !g || !DH_set0_pqg(dh, p, q, g)) {
> + return 0;
> + }
> +- if (dh->pub_key) {
> +- return 1;
> ++
> ++ OPENSSL_PKEY_SET_BN(data, priv_key);
> ++ OPENSSL_PKEY_SET_BN(data, pub_key);
> ++ if (pub_key) {
> ++ return DH_set0_key(dh, pub_key, priv_key);
> ++ }
> ++ if (priv_key) {
> ++ pub_key = php_openssl_dh_pub_from_priv(priv_key, g, p);
> ++ if (pub_key == NULL) {
> ++ return 0;
> ++ }
> ++ return DH_set0_key(dh, pub_key, priv_key);
> + }
> + PHP_OPENSSL_RAND_ADD_TIME();
> + if (!DH_generate_key(dh)) {
> +@@ -3614,18 +3908,8 @@ PHP_FUNCTION(openssl_pkey_new)
> + if (pkey) {
> + RSA *rsa = RSA_new();
> + if (rsa) {
> +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, n);
> +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, e);
> +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, d);
> +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, p);
> +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, q);
> +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, dmp1);
> +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, dmq1);
> +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, iqmp);
> +- if (rsa->n && rsa->d) {
> +- if (EVP_PKEY_assign_RSA(pkey, rsa)) {
> +- RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
> +- }
> ++ if (php_openssl_pkey_init_and_assign_rsa(pkey, rsa, *data)) {
> ++ RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
> + }
> + RSA_free(rsa);
> + }
> +@@ -3638,12 +3922,7 @@ PHP_FUNCTION(openssl_pkey_new)
> + if (pkey) {
> + DSA *dsa = DSA_new();
> + if (dsa) {
> +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, p);
> +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, q);
> +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, g);
> +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, priv_key);
> +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, pub_key);
> +- if (php_openssl_pkey_init_dsa(dsa)) {
> ++ if (php_openssl_pkey_init_dsa(dsa, *data)) {
> + if (EVP_PKEY_assign_DSA(pkey, dsa)) {
> + RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
> + }
> +@@ -3659,11 +3938,7 @@ PHP_FUNCTION(openssl_pkey_new)
> + if (pkey) {
> + DH *dh = DH_new();
> + if (dh) {
> +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, p);
> +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, g);
> +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, priv_key);
> +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, pub_key);
> +- if (php_openssl_pkey_init_dh(dh)) {
> ++ if (php_openssl_pkey_init_dh(dh, *data)) {
> + if (EVP_PKEY_assign_DH(pkey, dh)) {
> + RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
> + }
> +@@ -3738,10 +4013,10 @@ PHP_FUNCTION(openssl_pkey_export_to_file)
> + cipher = NULL;
> + }
> +
> +- switch (EVP_PKEY_type(key->type)) {
> ++ switch (EVP_PKEY_base_id(key)) {
> + #ifdef HAVE_EVP_PKEY_EC
> + case EVP_PKEY_EC:
> +- pem_write = PEM_write_bio_ECPrivateKey(bio_out, EVP_PKEY_get1_EC_KEY(key), cipher, (unsigned char *)passphrase, passphrase_len, NULL, NULL);
> ++ pem_write = PEM_write_bio_ECPrivateKey(bio_out, EVP_PKEY_get0_EC_KEY(key), cipher, (unsigned char *)passphrase, passphrase_len, NULL, NULL);
> + break;
> + #endif
> + default:
> +@@ -3807,7 +4082,7 @@ PHP_FUNCTION(openssl_pkey_export)
> + cipher = NULL;
> + }
> +
> +- switch (EVP_PKEY_type(key->type)) {
> ++ switch (EVP_PKEY_base_id(key)) {
> + #ifdef HAVE_EVP_PKEY_EC
> + case EVP_PKEY_EC:
> + pem_write = PEM_write_bio_ECPrivateKey(bio_out, EVP_PKEY_get1_EC_KEY(key), cipher, (unsigned char *)passphrase, passphrase_len, NULL, NULL);
> +@@ -3928,25 +4203,33 @@ PHP_FUNCTION(openssl_pkey_get_details)
> + /*TODO: Use the real values once the openssl constants are used
> + * See the enum at the top of this file
> + */
> +- switch (EVP_PKEY_type(pkey->type)) {
> ++ switch (EVP_PKEY_base_id(pkey)) {
> + case EVP_PKEY_RSA:
> + case EVP_PKEY_RSA2:
> +- ktype = OPENSSL_KEYTYPE_RSA;
> +-
> +- if (pkey->pkey.rsa != NULL) {
> +- zval *rsa;
> +-
> +- ALLOC_INIT_ZVAL(rsa);
> +- array_init(rsa);
> +- OPENSSL_PKEY_GET_BN(rsa, n);
> +- OPENSSL_PKEY_GET_BN(rsa, e);
> +- OPENSSL_PKEY_GET_BN(rsa, d);
> +- OPENSSL_PKEY_GET_BN(rsa, p);
> +- OPENSSL_PKEY_GET_BN(rsa, q);
> +- OPENSSL_PKEY_GET_BN(rsa, dmp1);
> +- OPENSSL_PKEY_GET_BN(rsa, dmq1);
> +- OPENSSL_PKEY_GET_BN(rsa, iqmp);
> +- add_assoc_zval(return_value, "rsa", rsa);
> ++ {
> ++ RSA *rsa = EVP_PKEY_get0_RSA(pkey);
> ++ ktype = OPENSSL_KEYTYPE_RSA;
> ++
> ++ if (rsa != NULL) {
> ++ zval *z_rsa;
> ++ const BIGNUM *n, *e, *d, *p, *q, *dmp1, *dmq1, *iqmp;
> ++
> ++ RSA_get0_key(rsa, &n, &e, &d);
> ++ RSA_get0_factors(rsa, &p, &q);
> ++ RSA_get0_crt_params(rsa, &dmp1, &dmq1, &iqmp);
> ++
> ++ ALLOC_INIT_ZVAL(z_rsa);
> ++ array_init(z_rsa);
> ++ OPENSSL_PKEY_GET_BN(z_rsa, n);
> ++ OPENSSL_PKEY_GET_BN(z_rsa, e);
> ++ OPENSSL_PKEY_GET_BN(z_rsa, d);
> ++ OPENSSL_PKEY_GET_BN(z_rsa, p);
> ++ OPENSSL_PKEY_GET_BN(z_rsa, q);
> ++ OPENSSL_PKEY_GET_BN(z_rsa, dmp1);
> ++ OPENSSL_PKEY_GET_BN(z_rsa, dmq1);
> ++ OPENSSL_PKEY_GET_BN(z_rsa, iqmp);
> ++ add_assoc_zval(return_value, "rsa", z_rsa);
> ++ }
> + }
> +
> + break;
> +@@ -3954,42 +4237,55 @@ PHP_FUNCTION(openssl_pkey_get_details)
> + case EVP_PKEY_DSA2:
> + case EVP_PKEY_DSA3:
> + case EVP_PKEY_DSA4:
> +- ktype = OPENSSL_KEYTYPE_DSA;
> +-
> +- if (pkey->pkey.dsa != NULL) {
> +- zval *dsa;
> +-
> +- ALLOC_INIT_ZVAL(dsa);
> +- array_init(dsa);
> +- OPENSSL_PKEY_GET_BN(dsa, p);
> +- OPENSSL_PKEY_GET_BN(dsa, q);
> +- OPENSSL_PKEY_GET_BN(dsa, g);
> +- OPENSSL_PKEY_GET_BN(dsa, priv_key);
> +- OPENSSL_PKEY_GET_BN(dsa, pub_key);
> +- add_assoc_zval(return_value, "dsa", dsa);
> ++ {
> ++ DSA *dsa = EVP_PKEY_get0_DSA(pkey);
> ++ ktype = OPENSSL_KEYTYPE_DSA;
> ++
> ++ if (dsa != NULL) {
> ++ zval *z_dsa;
> ++ const BIGNUM *p, *q, *g, *priv_key, *pub_key;
> ++
> ++ DSA_get0_pqg(dsa, &p, &q, &g);
> ++ DSA_get0_key(dsa, &pub_key, &priv_key);
> ++
> ++ ALLOC_INIT_ZVAL(z_dsa);
> ++ array_init(z_dsa);
> ++ OPENSSL_PKEY_GET_BN(z_dsa, p);
> ++ OPENSSL_PKEY_GET_BN(z_dsa, q);
> ++ OPENSSL_PKEY_GET_BN(z_dsa, g);
> ++ OPENSSL_PKEY_GET_BN(z_dsa, priv_key);
> ++ OPENSSL_PKEY_GET_BN(z_dsa, pub_key);
> ++ add_assoc_zval(return_value, "dsa", z_dsa);
> ++ }
> + }
> + break;
> + case EVP_PKEY_DH:
> +-
> +- ktype = OPENSSL_KEYTYPE_DH;
> +-
> +- if (pkey->pkey.dh != NULL) {
> +- zval *dh;
> +-
> +- ALLOC_INIT_ZVAL(dh);
> +- array_init(dh);
> +- OPENSSL_PKEY_GET_BN(dh, p);
> +- OPENSSL_PKEY_GET_BN(dh, g);
> +- OPENSSL_PKEY_GET_BN(dh, priv_key);
> +- OPENSSL_PKEY_GET_BN(dh, pub_key);
> +- add_assoc_zval(return_value, "dh", dh);
> ++ {
> ++ DH *dh = EVP_PKEY_get0_DH(pkey);
> ++ ktype = OPENSSL_KEYTYPE_DH;
> ++
> ++ if (dh != NULL) {
> ++ zval *z_dh;
> ++ const BIGNUM *p, *q, *g, *priv_key, *pub_key;
> ++
> ++ DH_get0_pqg(dh, &p, &q, &g);
> ++ DH_get0_key(dh, &pub_key, &priv_key);
> ++
> ++ ALLOC_INIT_ZVAL(z_dh);
> ++ array_init(z_dh);
> ++ OPENSSL_PKEY_GET_BN(z_dh, p);
> ++ OPENSSL_PKEY_GET_BN(z_dh, g);
> ++ OPENSSL_PKEY_GET_BN(z_dh, priv_key);
> ++ OPENSSL_PKEY_GET_BN(z_dh, pub_key);
> ++ add_assoc_zval(return_value, "dh", z_dh);
> ++ }
> + }
> +
> + break;
> + #ifdef HAVE_EVP_PKEY_EC
> + case EVP_PKEY_EC:
> + ktype = OPENSSL_KEYTYPE_EC;
> +- if (pkey->pkey.ec != NULL) {
> ++ if (EVP_PKEY_get0_EC_KEY(pkey) != NULL) {
> + zval *ec;
> + const EC_GROUP *ec_group;
> + int nid;
> +@@ -4546,13 +4842,13 @@ PHP_FUNCTION(openssl_private_encrypt)
> + cryptedlen = EVP_PKEY_size(pkey);
> + cryptedbuf = emalloc(cryptedlen + 1);
> +
> +- switch (pkey->type) {
> ++ switch (EVP_PKEY_id(pkey)) {
> + case EVP_PKEY_RSA:
> + case EVP_PKEY_RSA2:
> + successful = (RSA_private_encrypt(data_len,
> + (unsigned char *)data,
> + cryptedbuf,
> +- pkey->pkey.rsa,
> ++ EVP_PKEY_get0_RSA(pkey),
> + padding) == cryptedlen);
> + break;
> + default:
> +@@ -4604,13 +4900,13 @@ PHP_FUNCTION(openssl_private_decrypt)
> + cryptedlen = EVP_PKEY_size(pkey);
> + crypttemp = emalloc(cryptedlen + 1);
> +
> +- switch (pkey->type) {
> ++ switch (EVP_PKEY_id(pkey)) {
> + case EVP_PKEY_RSA:
> + case EVP_PKEY_RSA2:
> + cryptedlen = RSA_private_decrypt(data_len,
> + (unsigned char *)data,
> + crypttemp,
> +- pkey->pkey.rsa,
> ++ EVP_PKEY_get0_RSA(pkey),
> + padding);
> + if (cryptedlen != -1) {
> + cryptedbuf = emalloc(cryptedlen + 1);
> +@@ -4669,13 +4965,13 @@ PHP_FUNCTION(openssl_public_encrypt)
> + cryptedlen = EVP_PKEY_size(pkey);
> + cryptedbuf = emalloc(cryptedlen + 1);
> +
> +- switch (pkey->type) {
> ++ switch (EVP_PKEY_id(pkey)) {
> + case EVP_PKEY_RSA:
> + case EVP_PKEY_RSA2:
> + successful = (RSA_public_encrypt(data_len,
> + (unsigned char *)data,
> + cryptedbuf,
> +- pkey->pkey.rsa,
> ++ EVP_PKEY_get0_RSA(pkey),
> + padding) == cryptedlen);
> + break;
> + default:
> +@@ -4728,13 +5024,13 @@ PHP_FUNCTION(openssl_public_decrypt)
> + cryptedlen = EVP_PKEY_size(pkey);
> + crypttemp = emalloc(cryptedlen + 1);
> +
> +- switch (pkey->type) {
> ++ switch (EVP_PKEY_id(pkey)) {
> + case EVP_PKEY_RSA:
> + case EVP_PKEY_RSA2:
> + cryptedlen = RSA_public_decrypt(data_len,
> + (unsigned char *)data,
> + crypttemp,
> +- pkey->pkey.rsa,
> ++ EVP_PKEY_get0_RSA(pkey),
> + padding);
> + if (cryptedlen != -1) {
> + cryptedbuf = emalloc(cryptedlen + 1);
> +@@ -4798,7 +5094,7 @@ PHP_FUNCTION(openssl_sign)
> + long keyresource = -1;
> + char * data;
> + int data_len;
> +- EVP_MD_CTX md_ctx;
> ++ EVP_MD_CTX *md_ctx;
> + zval *method = NULL;
> + long signature_algo = OPENSSL_ALGO_SHA1;
> + const EVP_MD *mdtype;
> +@@ -4831,9 +5127,10 @@ PHP_FUNCTION(openssl_sign)
> + siglen = EVP_PKEY_size(pkey);
> + sigbuf = emalloc(siglen + 1);
> +
> +- EVP_SignInit(&md_ctx, mdtype);
> +- EVP_SignUpdate(&md_ctx, data, data_len);
> +- if (EVP_SignFinal (&md_ctx, sigbuf,(unsigned int *)&siglen, pkey)) {
> ++ md_ctx = EVP_MD_CTX_create();
> ++ EVP_SignInit(md_ctx, mdtype);
> ++ EVP_SignUpdate(md_ctx, data, data_len);
> ++ if (EVP_SignFinal (md_ctx, sigbuf,(unsigned int *)&siglen, pkey)) {
> + zval_dtor(signature);
> + sigbuf[siglen] = '\0';
> + ZVAL_STRINGL(signature, (char *)sigbuf, siglen, 0);
> +@@ -4842,7 +5139,7 @@ PHP_FUNCTION(openssl_sign)
> + efree(sigbuf);
> + RETVAL_FALSE;
> + }
> +- EVP_MD_CTX_cleanup(&md_ctx);
> ++ EVP_MD_CTX_destroy(md_ctx);
> + if (keyresource == -1) {
> + EVP_PKEY_free(pkey);
> + }
> +@@ -4856,7 +5153,7 @@ PHP_FUNCTION(openssl_verify)
> + zval **key;
> + EVP_PKEY *pkey;
> + int err;
> +- EVP_MD_CTX md_ctx;
> ++ EVP_MD_CTX *md_ctx;
> + const EVP_MD *mdtype;
> + long keyresource = -1;
> + char * data; int data_len;
> +@@ -4890,10 +5187,11 @@ PHP_FUNCTION(openssl_verify)
> + RETURN_FALSE;
> + }
> +
> +- EVP_VerifyInit (&md_ctx, mdtype);
> +- EVP_VerifyUpdate (&md_ctx, data, data_len);
> +- err = EVP_VerifyFinal (&md_ctx, (unsigned char *)signature, signature_len, pkey);
> +- EVP_MD_CTX_cleanup(&md_ctx);
> ++ md_ctx = EVP_MD_CTX_create();
> ++ EVP_VerifyInit (md_ctx, mdtype);
> ++ EVP_VerifyUpdate (md_ctx, data, data_len);
> ++ err = EVP_VerifyFinal (md_ctx, (unsigned char *)signature, signature_len, pkey);
> ++ EVP_MD_CTX_destroy(md_ctx);
> +
> + if (keyresource == -1) {
> + EVP_PKEY_free(pkey);
> +@@ -4917,7 +5215,7 @@ PHP_FUNCTION(openssl_seal)
> + char *method =NULL;
> + int method_len = 0;
> + const EVP_CIPHER *cipher;
> +- EVP_CIPHER_CTX ctx;
> ++ EVP_CIPHER_CTX *ctx;
> +
> + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "szza/|s", &data, &data_len, &sealdata, &ekeys, &pubkeys, &method, &method_len) == FAILURE) {
> + return;
> +@@ -4950,6 +5248,7 @@ PHP_FUNCTION(openssl_seal)
> + memset(eks, 0, sizeof(*eks) * nkeys);
> + key_resources = safe_emalloc(nkeys, sizeof(long), 0);
> + memset(key_resources, 0, sizeof(*key_resources) * nkeys);
> ++ memset(pkeys, 0, sizeof(*pkeys) * nkeys);
> +
> + /* get the public keys we are using to seal this data */
> + zend_hash_internal_pointer_reset_ex(pubkeysht, &pos);
> +@@ -4967,27 +5266,28 @@ PHP_FUNCTION(openssl_seal)
> + i++;
> + }
> +
> +- if (!EVP_EncryptInit(&ctx,cipher,NULL,NULL)) {
> ++ ctx = EVP_CIPHER_CTX_new();
> ++ if (ctx == NULL || !EVP_EncryptInit(ctx,cipher,NULL,NULL)) {
> + RETVAL_FALSE;
> +- EVP_CIPHER_CTX_cleanup(&ctx);
> ++ EVP_CIPHER_CTX_free(ctx);
> + goto clean_exit;
> + }
> +
> + #if 0
> + /* Need this if allow ciphers that require initialization vector */
> +- ivlen = EVP_CIPHER_CTX_iv_length(&ctx);
> ++ ivlen = EVP_CIPHER_CTX_iv_length(ctx);
> + iv = ivlen ? emalloc(ivlen + 1) : NULL;
> + #endif
> + /* allocate one byte extra to make room for \0 */
> +- buf = emalloc(data_len + EVP_CIPHER_CTX_block_size(&ctx));
> +- EVP_CIPHER_CTX_cleanup(&ctx);
> ++ buf = emalloc(data_len + EVP_CIPHER_CTX_block_size(ctx));
> ++ EVP_CIPHER_CTX_cleanup(ctx);
> +
> +- if (EVP_SealInit(&ctx, cipher, eks, eksl, NULL, pkeys, nkeys) <= 0 ||
> +- !EVP_SealUpdate(&ctx, buf, &len1, (unsigned char *)data, data_len) ||
> +- !EVP_SealFinal(&ctx, buf + len1, &len2)) {
> ++ if (EVP_SealInit(ctx, cipher, eks, eksl, NULL, pkeys, nkeys) <= 0 ||
> ++ !EVP_SealUpdate(ctx, buf, &len1, (unsigned char *)data, data_len) ||
> ++ !EVP_SealFinal(ctx, buf + len1, &len2)) {
> + RETVAL_FALSE;
> + efree(buf);
> +- EVP_CIPHER_CTX_cleanup(&ctx);
> ++ EVP_CIPHER_CTX_free(ctx);
> + goto clean_exit;
> + }
> +
> +@@ -5018,7 +5318,7 @@ PHP_FUNCTION(openssl_seal)
> + efree(buf);
> + }
> + RETVAL_LONG(len1 + len2);
> +- EVP_CIPHER_CTX_cleanup(&ctx);
> ++ EVP_CIPHER_CTX_free(ctx);
> +
> + clean_exit:
> + for (i=0; i<nkeys; i++) {
> +@@ -5045,7 +5345,7 @@ PHP_FUNCTION(openssl_open)
> + int len1, len2;
> + unsigned char *buf;
> + long keyresource = -1;
> +- EVP_CIPHER_CTX ctx;
> ++ EVP_CIPHER_CTX *ctx;
> + char * data; int data_len;
> + char * ekey; int ekey_len;
> + char *method =NULL;
> +@@ -5074,8 +5374,9 @@ PHP_FUNCTION(openssl_open)
> +
> + buf = emalloc(data_len + 1);
> +
> +- if (EVP_OpenInit(&ctx, cipher, (unsigned char *)ekey, ekey_len, NULL, pkey) && EVP_OpenUpdate(&ctx, buf, &len1, (unsigned char *)data, data_len)) {
> +- if (!EVP_OpenFinal(&ctx, buf + len1, &len2) || (len1 + len2 == 0)) {
> ++ ctx = EVP_CIPHER_CTX_new();
> ++ if (EVP_OpenInit(ctx, cipher, (unsigned char *)ekey, ekey_len, NULL, pkey) && EVP_OpenUpdate(ctx, buf, &len1, (unsigned char *)data, data_len)) {
> ++ if (!EVP_OpenFinal(ctx, buf + len1, &len2) || (len1 + len2 == 0)) {
> + efree(buf);
> + RETVAL_FALSE;
> + } else {
> +@@ -5091,7 +5392,7 @@ PHP_FUNCTION(openssl_open)
> + if (keyresource == -1) {
> + EVP_PKEY_free(pkey);
> + }
> +- EVP_CIPHER_CTX_cleanup(&ctx);
> ++ EVP_CIPHER_CTX_free(ctx);
> + }
> + /* }}} */
> +
> +@@ -5151,7 +5452,7 @@ PHP_FUNCTION(openssl_digest)
> + char *data, *method;
> + int data_len, method_len;
> + const EVP_MD *mdtype;
> +- EVP_MD_CTX md_ctx;
> ++ EVP_MD_CTX *md_ctx;
> + int siglen;
> + unsigned char *sigbuf;
> +
> +@@ -5167,9 +5468,10 @@ PHP_FUNCTION(openssl_digest)
> + siglen = EVP_MD_size(mdtype);
> + sigbuf = emalloc(siglen + 1);
> +
> +- EVP_DigestInit(&md_ctx, mdtype);
> +- EVP_DigestUpdate(&md_ctx, (unsigned char *)data, data_len);
> +- if (EVP_DigestFinal (&md_ctx, (unsigned char *)sigbuf, (unsigned int *)&siglen)) {
> ++ md_ctx = EVP_MD_CTX_create();
> ++ EVP_DigestInit(md_ctx, mdtype);
> ++ EVP_DigestUpdate(md_ctx, (unsigned char *)data, data_len);
> ++ if (EVP_DigestFinal (md_ctx, (unsigned char *)sigbuf, (unsigned int *)&siglen)) {
> + if (raw_output) {
> + sigbuf[siglen] = '\0';
> + RETVAL_STRINGL((char *)sigbuf, siglen, 0);
> +@@ -5185,6 +5487,8 @@ PHP_FUNCTION(openssl_digest)
> + efree(sigbuf);
> + RETVAL_FALSE;
> + }
> ++
> ++ EVP_MD_CTX_destroy(md_ctx);
> + }
> + /* }}} */
> +
> +@@ -5230,7 +5534,7 @@ PHP_FUNCTION(openssl_encrypt)
> + char *data, *method, *password, *iv = "";
> + int data_len, method_len, password_len, iv_len = 0, max_iv_len;
> + const EVP_CIPHER *cipher_type;
> +- EVP_CIPHER_CTX cipher_ctx;
> ++ EVP_CIPHER_CTX *cipher_ctx;
> + int i=0, outlen, keylen;
> + unsigned char *outbuf, *key;
> + zend_bool free_iv;
> +@@ -5262,19 +5566,24 @@ PHP_FUNCTION(openssl_encrypt)
> + outlen = data_len + EVP_CIPHER_block_size(cipher_type);
> + outbuf = safe_emalloc(outlen, 1, 1);
> +
> +- EVP_EncryptInit(&cipher_ctx, cipher_type, NULL, NULL);
> ++ cipher_ctx = EVP_CIPHER_CTX_new();
> ++ if (!cipher_ctx) {
> ++ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to create cipher context");
> ++ RETURN_FALSE;
> ++ }
> ++ EVP_EncryptInit(cipher_ctx, cipher_type, NULL, NULL);
> + if (password_len > keylen) {
> +- EVP_CIPHER_CTX_set_key_length(&cipher_ctx, password_len);
> ++ EVP_CIPHER_CTX_set_key_length(cipher_ctx, password_len);
> + }
> +- EVP_EncryptInit_ex(&cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
> ++ EVP_EncryptInit_ex(cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
> + if (options & OPENSSL_ZERO_PADDING) {
> +- EVP_CIPHER_CTX_set_padding(&cipher_ctx, 0);
> ++ EVP_CIPHER_CTX_set_padding(cipher_ctx, 0);
> + }
> + if (data_len > 0) {
> +- EVP_EncryptUpdate(&cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
> ++ EVP_EncryptUpdate(cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
> + }
> + outlen = i;
> +- if (EVP_EncryptFinal(&cipher_ctx, (unsigned char *)outbuf + i, &i)) {
> ++ if (EVP_EncryptFinal(cipher_ctx, (unsigned char *)outbuf + i, &i)) {
> + outlen += i;
> + if (options & OPENSSL_RAW_DATA) {
> + outbuf[outlen] = '\0';
> +@@ -5301,7 +5610,8 @@ PHP_FUNCTION(openssl_encrypt)
> + if (free_iv) {
> + efree(iv);
> + }
> +- EVP_CIPHER_CTX_cleanup(&cipher_ctx);
> ++ EVP_CIPHER_CTX_cleanup(cipher_ctx);
> ++ EVP_CIPHER_CTX_free(cipher_ctx);
> + }
> + /* }}} */
> +
> +@@ -5313,7 +5623,7 @@ PHP_FUNCTION(openssl_decrypt)
> + char *data, *method, *password, *iv = "";
> + int data_len, method_len, password_len, iv_len = 0;
> + const EVP_CIPHER *cipher_type;
> +- EVP_CIPHER_CTX cipher_ctx;
> ++ EVP_CIPHER_CTX *cipher_ctx;
> + int i, outlen, keylen;
> + unsigned char *outbuf, *key;
> + int base64_str_len;
> +@@ -5359,17 +5669,23 @@ PHP_FUNCTION(openssl_decrypt)
> + outlen = data_len + EVP_CIPHER_block_size(cipher_type);
> + outbuf = emalloc(outlen + 1);
> +
> +- EVP_DecryptInit(&cipher_ctx, cipher_type, NULL, NULL);
> ++ cipher_ctx = EVP_CIPHER_CTX_new();
> ++ if (!cipher_ctx) {
> ++ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to create cipher context");
> ++ RETURN_FALSE;
> ++ }
> ++
> ++ EVP_DecryptInit(cipher_ctx, cipher_type, NULL, NULL);
> + if (password_len > keylen) {
> +- EVP_CIPHER_CTX_set_key_length(&cipher_ctx, password_len);
> ++ EVP_CIPHER_CTX_set_key_length(cipher_ctx, password_len);
> + }
> +- EVP_DecryptInit_ex(&cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
> ++ EVP_DecryptInit_ex(cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
> + if (options & OPENSSL_ZERO_PADDING) {
> +- EVP_CIPHER_CTX_set_padding(&cipher_ctx, 0);
> ++ EVP_CIPHER_CTX_set_padding(cipher_ctx, 0);
> + }
> +- EVP_DecryptUpdate(&cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
> ++ EVP_DecryptUpdate(cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
> + outlen = i;
> +- if (EVP_DecryptFinal(&cipher_ctx, (unsigned char *)outbuf + i, &i)) {
> ++ if (EVP_DecryptFinal(cipher_ctx, (unsigned char *)outbuf + i, &i)) {
> + outlen += i;
> + outbuf[outlen] = '\0';
> + RETVAL_STRINGL((char *)outbuf, outlen, 0);
> +@@ -5386,7 +5702,8 @@ PHP_FUNCTION(openssl_decrypt)
> + if (base64_str) {
> + efree(base64_str);
> + }
> +- EVP_CIPHER_CTX_cleanup(&cipher_ctx);
> ++ EVP_CIPHER_CTX_cleanup(cipher_ctx);
> ++ EVP_CIPHER_CTX_free(cipher_ctx);
> + }
> + /* }}} */
> +
> +@@ -5424,6 +5741,7 @@ PHP_FUNCTION(openssl_dh_compute_key)
> + zval *key;
> + char *pub_str;
> + int pub_len;
> ++ DH *dh;
> + EVP_PKEY *pkey;
> + BIGNUM *pub;
> + char *data;
> +@@ -5433,14 +5751,21 @@ PHP_FUNCTION(openssl_dh_compute_key)
> + return;
> + }
> + ZEND_FETCH_RESOURCE(pkey, EVP_PKEY *, &key, -1, "OpenSSL key", le_key);
> +- if (!pkey || EVP_PKEY_type(pkey->type) != EVP_PKEY_DH || !pkey->pkey.dh) {
> ++ if (pkey == NULL) {
> ++ RETURN_FALSE;
> ++ }
> ++ if (EVP_PKEY_base_id(pkey) != EVP_PKEY_DH) {
> ++ RETURN_FALSE;
> ++ }
> ++ dh = EVP_PKEY_get0_DH(pkey);
> ++ if (dh == NULL) {
> + RETURN_FALSE;
> + }
> +
> + pub = BN_bin2bn((unsigned char*)pub_str, pub_len, NULL);
> +
> +- data = emalloc(DH_size(pkey->pkey.dh) + 1);
> +- len = DH_compute_key((unsigned char*)data, pub, pkey->pkey.dh);
> ++ data = emalloc(DH_size(dh) + 1);
> ++ len = DH_compute_key((unsigned char*)data, pub, dh);
> +
> + if (len >= 0) {
> + data[len] = 0;
> +diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c
> +index d549033..c2d477c 100644
> +--- a/ext/openssl/xp_ssl.c
> ++++ b/ext/openssl/xp_ssl.c
> +@@ -935,7 +935,7 @@ static int set_local_cert(SSL_CTX *ctx, php_stream *stream TSRMLS_DC) /* {{{ */
> + static const SSL_METHOD *php_select_crypto_method(long method_value, int is_client TSRMLS_DC) /* {{{ */
> + {
> + if (method_value == STREAM_CRYPTO_METHOD_SSLv2) {
> +-#ifndef OPENSSL_NO_SSL2
> ++#if !defined(OPENSSL_NO_SSL2) && OPENSSL_VERSION_NUMBER < 0x10100000L
> + return is_client ? SSLv2_client_method() : SSLv2_server_method();
> + #else
> + php_error_docref(NULL TSRMLS_CC, E_WARNING,
> +@@ -1588,12 +1588,26 @@ int php_openssl_setup_crypto(php_stream *stream,
> + }
> + /* }}} */
> +
> ++#define PHP_SSL_MAX_VERSION_LEN 32
> ++
> ++static char *php_ssl_cipher_get_version(const SSL_CIPHER *c, char *buffer, size_t max_len) /* {{{ */
> ++{
> ++ const char *version = SSL_CIPHER_get_version(c);
> ++ strncpy(buffer, version, max_len);
> ++ if (max_len <= strlen(version)) {
> ++ buffer[max_len - 1] = 0;
> ++ }
> ++ return buffer;
> ++}
> ++/* }}} */
> ++
> + static zval *capture_session_meta(SSL *ssl_handle) /* {{{ */
> + {
> + zval *meta_arr;
> + char *proto_str;
> + long proto = SSL_version(ssl_handle);
> + const SSL_CIPHER *cipher = SSL_get_current_cipher(ssl_handle);
> ++ char version_str[PHP_SSL_MAX_VERSION_LEN];
> +
> + switch (proto) {
> + #if OPENSSL_VERSION_NUMBER >= 0x10001001L
> +@@ -1611,7 +1625,7 @@ static zval *capture_session_meta(SSL *ssl_handle) /* {{{ */
> + add_assoc_string(meta_arr, "protocol", proto_str, 1);
> + add_assoc_string(meta_arr, "cipher_name", (char *) SSL_CIPHER_get_name(cipher), 1);
> + add_assoc_long(meta_arr, "cipher_bits", SSL_CIPHER_get_bits(cipher, NULL));
> +- add_assoc_string(meta_arr, "cipher_version", SSL_CIPHER_get_version(cipher), 1);
> ++ add_assoc_string(meta_arr, "cipher_version", php_ssl_cipher_get_version(cipher, version_str, PHP_SSL_MAX_VERSION_LEN), 1);
> +
> + return meta_arr;
> + }
> +diff --git a/ext/phar/util.c b/ext/phar/util.c
> +index 828be8f..06e4e55 100644
> +--- a/ext/phar/util.c
> ++++ b/ext/phar/util.c
> +@@ -1531,7 +1531,7 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ
> + BIO *in;
> + EVP_PKEY *key;
> + EVP_MD *mdtype = (EVP_MD *) EVP_sha1();
> +- EVP_MD_CTX md_ctx;
> ++ EVP_MD_CTX *md_ctx;
> + #else
> + int tempsig;
> + #endif
> +@@ -1608,7 +1608,8 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ
> + return FAILURE;
> + }
> +
> +- EVP_VerifyInit(&md_ctx, mdtype);
> ++ md_ctx = EVP_MD_CTX_create();
> ++ EVP_VerifyInit(md_ctx, mdtype);
> + read_len = end_of_phar;
> +
> + if (read_len > sizeof(buf)) {
> +@@ -1620,7 +1621,7 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ
> + php_stream_seek(fp, 0, SEEK_SET);
> +
> + while (read_size && (len = php_stream_read(fp, (char*)buf, read_size)) > 0) {
> +- EVP_VerifyUpdate (&md_ctx, buf, len);
> ++ EVP_VerifyUpdate (md_ctx, buf, len);
> + read_len -= (off_t)len;
> +
> + if (read_len < read_size) {
> +@@ -1628,9 +1629,9 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ
> + }
> + }
> +
> +- if (EVP_VerifyFinal(&md_ctx, (unsigned char *)sig, sig_len, key) != 1) {
> ++ if (EVP_VerifyFinal(md_ctx, (unsigned char *)sig, sig_len, key) != 1) {
> + /* 1: signature verified, 0: signature does not match, -1: failed signature operation */
> +- EVP_MD_CTX_cleanup(&md_ctx);
> ++ EVP_MD_CTX_destroy(md_ctx);
> +
> + if (error) {
> + spprintf(error, 0, "broken openssl signature");
> +@@ -1639,7 +1640,7 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ
> + return FAILURE;
> + }
> +
> +- EVP_MD_CTX_cleanup(&md_ctx);
> ++ EVP_MD_CTX_destroy(md_ctx);
> + #endif
> +
> + *signature_len = phar_hex_str((const char*)sig, sig_len, signature TSRMLS_CC);
> +--
> +2.7.4
> +
> diff --git a/meta-oe/recipes-devtools/php/php_5.6.36.bb b/meta-oe/recipes-devtools/php/php_5.6.36.bb
> deleted file mode 100644
> index addddb3..0000000
> --- a/meta-oe/recipes-devtools/php/php_5.6.36.bb
> +++ /dev/null
> @@ -1,23 +0,0 @@
> -require php.inc
> -
> -LIC_FILES_CHKSUM = "file://LICENSE;md5=b602636d46a61c0ac0432bbf5c078fe4"
> -
> -SRC_URI += "file://php5-change-AC_TRY_RUN-to-AC_TRY_LINK.patch \
> - file://pthread-check-threads-m4.patch \
> - file://0001-Add-lpthread-to-link.patch \
> - file://acinclude-xml2-config.patch \
> - file://0001-acinclude-use-pkgconfig-for-libxml2-config.patch \
> - "
> -
> -SRC_URI_append_class-target = " \
> - file://php5-pear-makefile.patch \
> - file://php5-phar-makefile.patch \
> - file://php5-0001-opcache-config.m4-enable-opcache.patch \
> - "
> -
> -SRC_URI[md5sum] = "6ca12a0e52dcd99cf4d5b2d74c6cde6f"
> -SRC_URI[sha256sum] = "626a0e3f5d8a0e686a2b930f0dd3a0601fe3dcb5e43dd0e8c3fab631e64e172a"
> -
> -DEPENDS += "libmcrypt"
> -EXTRA_OECONF += "--with-mcrypt=${STAGING_DIR_TARGET}${exec_prefix} \
> - "
> diff --git a/meta-oe/recipes-devtools/php/php_5.6.38.bb b/meta-oe/recipes-devtools/php/php_5.6.38.bb
> new file mode 100644
> index 0000000..d6f5145
> --- /dev/null
> +++ b/meta-oe/recipes-devtools/php/php_5.6.38.bb
> @@ -0,0 +1,24 @@
> +require php.inc
> +
> +LIC_FILES_CHKSUM = "file://LICENSE;md5=b602636d46a61c0ac0432bbf5c078fe4"
> +
> +SRC_URI += "file://php5-change-AC_TRY_RUN-to-AC_TRY_LINK.patch \
> + file://pthread-check-threads-m4.patch \
> + file://0001-Add-lpthread-to-link.patch \
> + file://acinclude-xml2-config.patch \
> + file://0001-acinclude-use-pkgconfig-for-libxml2-config.patch \
> + file://0001-PHP-5.6-LibSSL-1.1-compatibility.patch \
> + "
> +
> +SRC_URI_append_class-target = " \
> + file://php5-pear-makefile.patch \
> + file://php5-phar-makefile.patch \
> + file://php5-0001-opcache-config.m4-enable-opcache.patch \
> + "
> +
> +SRC_URI[md5sum] = "5b98aa066567eca8e5738b8ef4a3545c"
> +SRC_URI[sha256sum] = "d65b231bbdd63be4439ef5ced965cfd63e62983429dbd4dfcfb49981593ebc03"
> +
> +DEPENDS += "libmcrypt"
> +EXTRA_OECONF += "--with-mcrypt=${STAGING_DIR_TARGET}${exec_prefix} \
> + "
>
--
# Randy MacLeod
# Wind River Linux
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [meta-oe][PATCH] php5: 5.6.36 -> 5.6.38
2019-01-30 16:13 ` Randy MacLeod
@ 2019-01-30 16:33 ` Khem Raj
2019-01-30 16:43 ` Randy MacLeod
0 siblings, 1 reply; 7+ messages in thread
From: Khem Raj @ 2019-01-30 16:33 UTC (permalink / raw)
To: Randy MacLeod; +Cc: openembeded-devel
Hi Randy
It would better to put it on the list of deprecated packages for a
release before removing it.
On Wed, Jan 30, 2019 at 8:14 AM Randy MacLeod
<randy.macleod@windriver.com> wrote:
>
> On 9/26/18 11:12 AM, Hongxu Jia wrote:
> > 1. Support openssl 1.1.x
> >
> > 2. 5.6.38 ChangeLog (http://php.net/ChangeLog-5.php#5.6.38)
> > - Fixed bug #76582 (XSS due to the header Transfer-Encoding: chunked).
> >
> > - Fixed bug #76423 (Int Overflow lead to Heap OverFlow in
> > exif_thumbnail_extract of exif.c). (CVE-2018-14883)
> >
> > - Fixed bug #76557 (heap-buffer-overflow (READ of size 48) while
> > reading exif data). (CVE-2018-14851)
>
> Does anyone object to dropping the 5.6 version of php ?
>
>
> Official security support for PHP 5.6 finished on 31 December 2018 [1]
>
> and:
> http://php.net/supported-versions.php
>
> Despite this, there's a 5.6.40 that was released on Jan 10, 2018 which
> is odd:
> http://php.net/downloads.php#v5.6.40
>
> ../Randy
>
> [1] https://en.wikipedia.org/wiki/PHP#PHP_5
>
>
> >
> > Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
> > ---
> > .../0001-PHP-5.6-LibSSL-1.1-compatibility.patch | 1285 ++++++++++++++++++++
> > meta-oe/recipes-devtools/php/php_5.6.36.bb | 23 -
> > meta-oe/recipes-devtools/php/php_5.6.38.bb | 24 +
> > 3 files changed, 1309 insertions(+), 23 deletions(-)
> > create mode 100644 meta-oe/recipes-devtools/php/php/0001-PHP-5.6-LibSSL-1.1-compatibility.patch
> > delete mode 100644 meta-oe/recipes-devtools/php/php_5.6.36.bb
> > create mode 100644 meta-oe/recipes-devtools/php/php_5.6.38.bb
> >
> > diff --git a/meta-oe/recipes-devtools/php/php/0001-PHP-5.6-LibSSL-1.1-compatibility.patch b/meta-oe/recipes-devtools/php/php/0001-PHP-5.6-LibSSL-1.1-compatibility.patch
> > new file mode 100644
> > index 0000000..ac8365b
> > --- /dev/null
> > +++ b/meta-oe/recipes-devtools/php/php/0001-PHP-5.6-LibSSL-1.1-compatibility.patch
> > @@ -0,0 +1,1285 @@
> > +Subject: [PATCH] PHP 5.6 - LibSSL 1.1 compatibility
> > +
> > +This patch does not try to backport the 7.1 openssl module, it is the
> > +improved version of the 5.6 original openssl module.
> > +
> > +https://github.com/oerdnj/deb.sury.org/issues/566
> > +http://zettasystem.com/PHP-5.6.31-OpenSSL-1.1.0-compatibility-20170801.patch
> > +
> > +Upstream-Status: Deny [https://github.com/php/php-src/pull/2667]
> > +Reason: As PHP 5.6 is no longer actively supported only security fixes
> > +may land on this branch. As this change does not fall in this category,
> > +I'm closing this PR. (All higher versions of PHP already have OpenSSL
> > +1.1 support.)
> > +
> > +Author: zsalab@github https://github.com/zsalab
> > +
> > +Only port source modification, do not include the test case
> > +Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
> > +---
> > + ext/openssl/openssl.c | 683 +++++++++++++++++++++++++++++++++++++-------------
> > + ext/openssl/xp_ssl.c | 18 +-
> > + ext/phar/util.c | 13 +-
> > + 3 files changed, 527 insertions(+), 187 deletions(-)
> > +
> > +diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c
> > +index a78a8fb..b53114c 100644
> > +--- a/ext/openssl/openssl.c
> > ++++ b/ext/openssl/openssl.c
> > +@@ -42,6 +42,12 @@
> > +
> > + /* OpenSSL includes */
> > + #include <openssl/evp.h>
> > ++#if OPENSSL_VERSION_NUMBER >= 0x10002000L
> > ++#include <openssl/bn.h>
> > ++#include <openssl/rsa.h>
> > ++#include <openssl/dsa.h>
> > ++#include <openssl/dh.h>
> > ++#endif
> > + #include <openssl/x509.h>
> > + #include <openssl/x509v3.h>
> > + #include <openssl/crypto.h>
> > +@@ -531,6 +537,133 @@ zend_module_entry openssl_module_entry = {
> > + ZEND_GET_MODULE(openssl)
> > + #endif
> > +
> > ++/* {{{ OpenSSL compatibility functions and macros */
> > ++#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined (LIBRESSL_VERSION_NUMBER)
> > ++#define EVP_PKEY_get0_RSA(_pkey) _pkey->pkey.rsa
> > ++#define EVP_PKEY_get0_DH(_pkey) _pkey->pkey.dh
> > ++#define EVP_PKEY_get0_DSA(_pkey) _pkey->pkey.dsa
> > ++#define EVP_PKEY_get0_EC_KEY(_pkey) _pkey->pkey.ec
> > ++
> > ++static int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d)
> > ++{
> > ++ r->n = n;
> > ++ r->e = e;
> > ++ r->d = d;
> > ++
> > ++ return 1;
> > ++}
> > ++
> > ++static int RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q)
> > ++{
> > ++ r->p = p;
> > ++ r->q = q;
> > ++
> > ++ return 1;
> > ++}
> > ++
> > ++static int RSA_set0_crt_params(RSA *r, BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp)
> > ++{
> > ++ r->dmp1 = dmp1;
> > ++ r->dmq1 = dmq1;
> > ++ r->iqmp = iqmp;
> > ++
> > ++ return 1;
> > ++}
> > ++
> > ++static void RSA_get0_key(const RSA *r, const BIGNUM **n, const BIGNUM **e, const BIGNUM **d)
> > ++{
> > ++ *n = r->n;
> > ++ *e = r->e;
> > ++ *d = r->d;
> > ++}
> > ++
> > ++static void RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q)
> > ++{
> > ++ *p = r->p;
> > ++ *q = r->q;
> > ++}
> > ++
> > ++static void RSA_get0_crt_params(const RSA *r, const BIGNUM **dmp1, const BIGNUM **dmq1, const BIGNUM **iqmp)
> > ++{
> > ++ *dmp1 = r->dmp1;
> > ++ *dmq1 = r->dmq1;
> > ++ *iqmp = r->iqmp;
> > ++}
> > ++
> > ++static void DH_get0_pqg(const DH *dh, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g)
> > ++{
> > ++ *p = dh->p;
> > ++ *q = dh->q;
> > ++ *g = dh->g;
> > ++}
> > ++
> > ++static int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g)
> > ++{
> > ++ dh->p = p;
> > ++ dh->q = q;
> > ++ dh->g = g;
> > ++
> > ++ return 1;
> > ++}
> > ++
> > ++static void DH_get0_key(const DH *dh, const BIGNUM **pub_key, const BIGNUM **priv_key)
> > ++{
> > ++ *pub_key = dh->pub_key;
> > ++ *priv_key = dh->priv_key;
> > ++}
> > ++
> > ++static int DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key)
> > ++{
> > ++ dh->pub_key = pub_key;
> > ++ dh->priv_key = priv_key;
> > ++
> > ++ return 1;
> > ++}
> > ++
> > ++static void DSA_get0_pqg(const DSA *d, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g)
> > ++{
> > ++ *p = d->p;
> > ++ *q = d->q;
> > ++ *g = d->g;
> > ++}
> > ++
> > ++int DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g)
> > ++{
> > ++ d->p = p;
> > ++ d->q = q;
> > ++ d->g = g;
> > ++
> > ++ return 1;
> > ++}
> > ++
> > ++static void DSA_get0_key(const DSA *d, const BIGNUM **pub_key, const BIGNUM **priv_key)
> > ++{
> > ++ *pub_key = d->pub_key;
> > ++ *priv_key = d->priv_key;
> > ++}
> > ++
> > ++int DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key)
> > ++{
> > ++ d->pub_key = pub_key;
> > ++ d->priv_key = priv_key;
> > ++
> > ++ return 1;
> > ++}
> > ++
> > ++#if OPENSSL_VERSION_NUMBER < 0x10002000L || defined (LIBRESSL_VERSION_NUMBER)
> > ++#define EVP_PKEY_id(_pkey) _pkey->type
> > ++#define EVP_PKEY_base_id(_key) EVP_PKEY_type(_key->type)
> > ++
> > ++static int X509_get_signature_nid(const X509 *x)
> > ++{
> > ++ return OBJ_obj2nid(x->sig_alg->algorithm);
> > ++}
> > ++
> > ++#endif
> > ++
> > ++#endif
> > ++/* }}} */
> > ++
> > + static int le_key;
> > + static int le_x509;
> > + static int le_csr;
> > +@@ -825,7 +958,7 @@ static int add_oid_section(struct php_x509_request * req TSRMLS_DC) /* {{{ */
> > + }
> > + for (i = 0; i < sk_CONF_VALUE_num(sktmp); i++) {
> > + cnf = sk_CONF_VALUE_value(sktmp, i);
> > +- if (OBJ_create(cnf->value, cnf->name, cnf->name) == NID_undef) {
> > ++ if (OBJ_sn2nid(cnf->name) == NID_undef && OBJ_ln2nid(cnf->name) == NID_undef && OBJ_create(cnf->value, cnf->name, cnf->name) == NID_undef) {
> > + php_error_docref(NULL TSRMLS_CC, E_WARNING, "problem creating object %s=%s", cnf->name, cnf->value);
> > + return FAILURE;
> > + }
> > +@@ -967,7 +1100,7 @@ static void php_openssl_dispose_config(struct php_x509_request * req TSRMLS_DC)
> > + }
> > + /* }}} */
> > +
> > +-#ifdef PHP_WIN32
> > ++#if defined(PHP_WIN32) || (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER))
> > + #define PHP_OPENSSL_RAND_ADD_TIME() ((void) 0)
> > + #else
> > + #define PHP_OPENSSL_RAND_ADD_TIME() php_openssl_rand_add_timeval()
> > +@@ -1053,9 +1186,11 @@ static EVP_MD * php_openssl_get_evp_md_from_algo(long algo) { /* {{{ */
> > + mdtype = (EVP_MD *) EVP_md2();
> > + break;
> > + #endif
> > ++#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined (LIBRESSL_VERSION_NUMBER)
> > + case OPENSSL_ALGO_DSS1:
> > + mdtype = (EVP_MD *) EVP_dss1();
> > + break;
> > ++#endif
> > + #if OPENSSL_VERSION_NUMBER >= 0x0090708fL
> > + case OPENSSL_ALGO_SHA224:
> > + mdtype = (EVP_MD *) EVP_sha224();
> > +@@ -1146,6 +1281,12 @@ PHP_MINIT_FUNCTION(openssl)
> > + OpenSSL_add_all_digests();
> > + OpenSSL_add_all_algorithms();
> > +
> > ++#if !defined(OPENSSL_NO_AES) && defined(EVP_CIPH_CCM_MODE) && OPENSSL_VERSION_NUMBER < 0x100020000
> > ++ EVP_add_cipher(EVP_aes_128_ccm());
> > ++ EVP_add_cipher(EVP_aes_192_ccm());
> > ++ EVP_add_cipher(EVP_aes_256_ccm());
> > ++#endif
> > ++
> > + SSL_load_error_strings();
> > +
> > + /* register a resource id number with OpenSSL so that we can map SSL -> stream structures in
> > +@@ -1173,7 +1314,9 @@ PHP_MINIT_FUNCTION(openssl)
> > + #ifdef HAVE_OPENSSL_MD2_H
> > + REGISTER_LONG_CONSTANT("OPENSSL_ALGO_MD2", OPENSSL_ALGO_MD2, CONST_CS|CONST_PERSISTENT);
> > + #endif
> > ++#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined (LIBRESSL_VERSION_NUMBER)
> > + REGISTER_LONG_CONSTANT("OPENSSL_ALGO_DSS1", OPENSSL_ALGO_DSS1, CONST_CS|CONST_PERSISTENT);
> > ++#endif
> > + #if OPENSSL_VERSION_NUMBER >= 0x0090708fL
> > + REGISTER_LONG_CONSTANT("OPENSSL_ALGO_SHA224", OPENSSL_ALGO_SHA224, CONST_CS|CONST_PERSISTENT);
> > + REGISTER_LONG_CONSTANT("OPENSSL_ALGO_SHA256", OPENSSL_ALGO_SHA256, CONST_CS|CONST_PERSISTENT);
> > +@@ -1251,7 +1394,9 @@ PHP_MINIT_FUNCTION(openssl)
> > + }
> > +
> > + php_stream_xport_register("ssl", php_openssl_ssl_socket_factory TSRMLS_CC);
> > ++#ifndef OPENSSL_NO_SSL3
> > + php_stream_xport_register("sslv3", php_openssl_ssl_socket_factory TSRMLS_CC);
> > ++#endif
> > + #ifndef OPENSSL_NO_SSL2
> > + php_stream_xport_register("sslv2", php_openssl_ssl_socket_factory TSRMLS_CC);
> > + #endif
> > +@@ -1308,7 +1453,9 @@ PHP_MSHUTDOWN_FUNCTION(openssl)
> > + #ifndef OPENSSL_NO_SSL2
> > + php_stream_xport_unregister("sslv2" TSRMLS_CC);
> > + #endif
> > ++#ifndef OPENSSL_NO_SSL3
> > + php_stream_xport_unregister("sslv3" TSRMLS_CC);
> > ++#endif
> > + php_stream_xport_unregister("tls" TSRMLS_CC);
> > + php_stream_xport_unregister("tlsv1.0" TSRMLS_CC);
> > + #if OPENSSL_VERSION_NUMBER >= 0x10001001L
> > +@@ -1893,6 +2040,7 @@ static int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension)
> > + {
> > + GENERAL_NAMES *names;
> > + const X509V3_EXT_METHOD *method = NULL;
> > ++ ASN1_OCTET_STRING *extension_data;
> > + long i, length, num;
> > + const unsigned char *p;
> > +
> > +@@ -1901,8 +2049,9 @@ static int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension)
> > + return -1;
> > + }
> > +
> > +- p = extension->value->data;
> > +- length = extension->value->length;
> > ++ extension_data = X509_EXTENSION_get_data(extension);
> > ++ p = extension_data->data;
> > ++ length = extension_data->length;
> > + if (method->it) {
> > + names = (GENERAL_NAMES*)(ASN1_item_d2i(NULL, &p, length,
> > + ASN1_ITEM_ptr(method->it)));
> > +@@ -1965,6 +2114,8 @@ PHP_FUNCTION(openssl_x509_parse)
> > + char * tmpstr;
> > + zval * subitem;
> > + X509_EXTENSION *extension;
> > ++ X509_NAME *subject_name;
> > ++ char *cert_name;
> > + char *extname;
> > + BIO *bio_out;
> > + BUF_MEM *bio_buf;
> > +@@ -1979,10 +2130,10 @@ PHP_FUNCTION(openssl_x509_parse)
> > + }
> > + array_init(return_value);
> > +
> > +- if (cert->name) {
> > +- add_assoc_string(return_value, "name", cert->name, 1);
> > +- }
> > +-/* add_assoc_bool(return_value, "valid", cert->valid); */
> > ++ subject_name = X509_get_subject_name(cert);
> > ++ cert_name = X509_NAME_oneline(subject_name, NULL, 0);
> > ++ add_assoc_string(return_value, "name", cert_name, 1);
> > ++ OPENSSL_free(cert_name);
> > +
> > + add_assoc_name_entry(return_value, "subject", X509_get_subject_name(cert), useshortnames TSRMLS_CC);
> > + /* hash as used in CA directories to lookup cert by subject name */
> > +@@ -2008,7 +2159,7 @@ PHP_FUNCTION(openssl_x509_parse)
> > + add_assoc_string(return_value, "alias", tmpstr, 1);
> > + }
> > +
> > +- sig_nid = OBJ_obj2nid((cert)->sig_alg->algorithm);
> > ++ sig_nid = X509_get_signature_nid(cert);
> > + add_assoc_string(return_value, "signatureTypeSN", (char*)OBJ_nid2sn(sig_nid), 1);
> > + add_assoc_string(return_value, "signatureTypeLN", (char*)OBJ_nid2ln(sig_nid), 1);
> > + add_assoc_long(return_value, "signatureTypeNID", sig_nid);
> > +@@ -3217,7 +3368,21 @@ PHP_FUNCTION(openssl_csr_get_public_key)
> > + RETURN_FALSE;
> > + }
> > +
> > +- tpubkey=X509_REQ_get_pubkey(csr);
> > ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)
> > ++ /* Due to changes in OpenSSL 1.1 related to locking when decoding CSR,
> > ++ * the pub key is not changed after assigning. It means if we pass
> > ++ * a private key, it will be returned including the private part.
> > ++ * If we duplicate it, then we get just the public part which is
> > ++ * the same behavior as for OpenSSL 1.0 */
> > ++ csr = X509_REQ_dup(csr);
> > ++#endif
> > ++ /* Retrieve the public key from the CSR */
> > ++ tpubkey = X509_REQ_get_pubkey(csr);
> > ++
> > ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)
> > ++ /* We need to free the CSR as it was duplicated */
> > ++ X509_REQ_free(csr);
> > ++#endif
> > + RETVAL_RESOURCE(zend_list_insert(tpubkey, le_key TSRMLS_CC));
> > + return;
> > + }
> > +@@ -3482,13 +3647,20 @@ static int php_openssl_is_private_key(EVP_PKEY* pkey TSRMLS_DC)
> > + {
> > + assert(pkey != NULL);
> > +
> > +- switch (pkey->type) {
> > ++ switch (EVP_PKEY_id(pkey)) {
> > + #ifndef NO_RSA
> > + case EVP_PKEY_RSA:
> > + case EVP_PKEY_RSA2:
> > +- assert(pkey->pkey.rsa != NULL);
> > +- if (pkey->pkey.rsa != NULL && (NULL == pkey->pkey.rsa->p || NULL == pkey->pkey.rsa->q)) {
> > +- return 0;
> > ++ {
> > ++ RSA *rsa = EVP_PKEY_get0_RSA(pkey);
> > ++ if (rsa != NULL) {
> > ++ const BIGNUM *p, *q;
> > ++
> > ++ RSA_get0_factors(rsa, &p, &q);
> > ++ if (p == NULL || q == NULL) {
> > ++ return 0;
> > ++ }
> > ++ }
> > + }
> > + break;
> > + #endif
> > +@@ -3498,28 +3670,51 @@ static int php_openssl_is_private_key(EVP_PKEY* pkey TSRMLS_DC)
> > + case EVP_PKEY_DSA2:
> > + case EVP_PKEY_DSA3:
> > + case EVP_PKEY_DSA4:
> > +- assert(pkey->pkey.dsa != NULL);
> > +-
> > +- if (NULL == pkey->pkey.dsa->p || NULL == pkey->pkey.dsa->q || NULL == pkey->pkey.dsa->priv_key){
> > +- return 0;
> > ++ {
> > ++ DSA *dsa = EVP_PKEY_get0_DSA(pkey);
> > ++ if (dsa != NULL) {
> > ++ const BIGNUM *p, *q, *g, *pub_key, *priv_key;
> > ++
> > ++ DSA_get0_pqg(dsa, &p, &q, &g);
> > ++ if (p == NULL || q == NULL) {
> > ++ return 0;
> > ++ }
> > ++
> > ++ DSA_get0_key(dsa, &pub_key, &priv_key);
> > ++ if (priv_key == NULL) {
> > ++ return 0;
> > ++ }
> > ++ }
> > + }
> > + break;
> > + #endif
> > + #ifndef NO_DH
> > + case EVP_PKEY_DH:
> > +- assert(pkey->pkey.dh != NULL);
> > +-
> > +- if (NULL == pkey->pkey.dh->p || NULL == pkey->pkey.dh->priv_key) {
> > +- return 0;
> > ++ {
> > ++ DH *dh = EVP_PKEY_get0_DH(pkey);
> > ++ if (dh != NULL) {
> > ++ const BIGNUM *p, *q, *g, *pub_key, *priv_key;
> > ++
> > ++ DH_get0_pqg(dh, &p, &q, &g);
> > ++ if (p == NULL) {
> > ++ return 0;
> > ++ }
> > ++
> > ++ DH_get0_key(dh, &pub_key, &priv_key);
> > ++ if (priv_key == NULL) {
> > ++ return 0;
> > ++ }
> > ++ }
> > + }
> > + break;
> > + #endif
> > + #ifdef HAVE_EVP_PKEY_EC
> > + case EVP_PKEY_EC:
> > +- assert(pkey->pkey.ec != NULL);
> > +-
> > +- if ( NULL == EC_KEY_get0_private_key(pkey->pkey.ec)) {
> > +- return 0;
> > ++ {
> > ++ EC_KEY *ec = EVP_PKEY_get0_EC_KEY(pkey);
> > ++ if (ec != NULL && NULL == EC_KEY_get0_private_key(ec)) {
> > ++ return 0;
> > ++ }
> > + }
> > + break;
> > + #endif
> > +@@ -3531,34 +3726,80 @@ static int php_openssl_is_private_key(EVP_PKEY* pkey TSRMLS_DC)
> > + }
> > + /* }}} */
> > +
> > +-#define OPENSSL_PKEY_GET_BN(_type, _name) do { \
> > +- if (pkey->pkey._type->_name != NULL) { \
> > +- int len = BN_num_bytes(pkey->pkey._type->_name); \
> > +- char *str = emalloc(len + 1); \
> > +- BN_bn2bin(pkey->pkey._type->_name, (unsigned char*)str); \
> > +- str[len] = 0; \
> > +- add_assoc_stringl(_type, #_name, str, len, 0); \
> > +- } \
> > +- } while (0)
> > +-
> > +-#define OPENSSL_PKEY_SET_BN(_ht, _type, _name) do { \
> > +- zval **bn; \
> > +- if (zend_hash_find(_ht, #_name, sizeof(#_name), (void**)&bn) == SUCCESS && \
> > +- Z_TYPE_PP(bn) == IS_STRING) { \
> > +- _type->_name = BN_bin2bn( \
> > +- (unsigned char*)Z_STRVAL_PP(bn), \
> > +- Z_STRLEN_PP(bn), NULL); \
> > +- } \
> > ++#define OPENSSL_GET_BN(_array, _bn, _name) do { \
> > ++ if (_bn != NULL) { \
> > ++ int len = BN_num_bytes(_bn); \
> > ++ char *str = emalloc(len + 1); \
> > ++ BN_bn2bin(_bn, (unsigned char*)str); \
> > ++ str[len] = 0; \
> > ++ add_assoc_stringl(_array, #_name, str, len, 0); \
> > ++ } \
> > + } while (0);
> > +
> > ++#define OPENSSL_PKEY_GET_BN(_type, _name) OPENSSL_GET_BN(_type, _name, _name)
> > ++
> > ++#define OPENSSL_PKEY_SET_BN(_data, _name) do { \
> > ++ zval **bn; \
> > ++ if (zend_hash_find(Z_ARRVAL_P(_data), #_name, sizeof(#_name),(void**)&bn) == SUCCESS && \
> > ++ Z_TYPE_PP(bn) == IS_STRING) { \
> > ++ _name = BN_bin2bn( \
> > ++ (unsigned char*)Z_STRVAL_PP(bn), \
> > ++ Z_STRLEN_PP(bn), NULL); \
> > ++ } else { \
> > ++ _name = NULL; \
> > ++ } \
> > ++ } while (0);
> > ++
> > ++/* {{{ php_openssl_pkey_init_rsa */
> > ++zend_bool php_openssl_pkey_init_and_assign_rsa(EVP_PKEY *pkey, RSA *rsa, zval *data)
> > ++{
> > ++ BIGNUM *n, *e, *d, *p, *q, *dmp1, *dmq1, *iqmp;
> > ++
> > ++ OPENSSL_PKEY_SET_BN(data, n);
> > ++ OPENSSL_PKEY_SET_BN(data, e);
> > ++ OPENSSL_PKEY_SET_BN(data, d);
> > ++ if (!n || !d || !RSA_set0_key(rsa, n, e, d)) {
> > ++ return 0;
> > ++ }
> > ++
> > ++ OPENSSL_PKEY_SET_BN(data, p);
> > ++ OPENSSL_PKEY_SET_BN(data, q);
> > ++ if ((p || q) && !RSA_set0_factors(rsa, p, q)) {
> > ++ return 0;
> > ++ }
> > ++
> > ++ OPENSSL_PKEY_SET_BN(data, dmp1);
> > ++ OPENSSL_PKEY_SET_BN(data, dmq1);
> > ++ OPENSSL_PKEY_SET_BN(data, iqmp);
> > ++ if ((dmp1 || dmq1 || iqmp) && !RSA_set0_crt_params(rsa, dmp1, dmq1, iqmp)) {
> > ++ return 0;
> > ++ }
> > ++
> > ++ if (!EVP_PKEY_assign_RSA(pkey, rsa)) {
> > ++ return 0;
> > ++ }
> > ++
> > ++ return 1;
> > ++}
> > ++/* }}} */
> > ++
> > + /* {{{ php_openssl_pkey_init_dsa */
> > +-zend_bool php_openssl_pkey_init_dsa(DSA *dsa)
> > ++zend_bool php_openssl_pkey_init_dsa(DSA *dsa, zval *data)
> > + {
> > +- if (!dsa->p || !dsa->q || !dsa->g) {
> > ++ BIGNUM *p, *q, *g, *priv_key, *pub_key;
> > ++ const BIGNUM *priv_key_const, *pub_key_const;
> > ++
> > ++ OPENSSL_PKEY_SET_BN(data, p);
> > ++ OPENSSL_PKEY_SET_BN(data, q);
> > ++ OPENSSL_PKEY_SET_BN(data, g);
> > ++ if (!p || !q || !g || !DSA_set0_pqg(dsa, p, q, g)) {
> > + return 0;
> > + }
> > +- if (dsa->priv_key || dsa->pub_key) {
> > +- return 1;
> > ++
> > ++ OPENSSL_PKEY_SET_BN(data, pub_key);
> > ++ OPENSSL_PKEY_SET_BN(data, priv_key);
> > ++ if (pub_key) {
> > ++ return DSA_set0_key(dsa, pub_key, priv_key);
> > + }
> > + PHP_OPENSSL_RAND_ADD_TIME();
> > + if (!DSA_generate_key(dsa)) {
> > +@@ -3566,7 +3807,8 @@ zend_bool php_openssl_pkey_init_dsa(DSA *dsa)
> > + }
> > + /* if BN_mod_exp return -1, then DSA_generate_key succeed for failed key
> > + * so we need to double check that public key is created */
> > +- if (!dsa->pub_key || BN_is_zero(dsa->pub_key)) {
> > ++ DSA_get0_key(dsa, &pub_key_const, &priv_key_const);
> > ++ if (!pub_key_const || BN_is_zero(pub_key_const)) {
> > + return 0;
> > + }
> > + /* all good */
> > +@@ -3574,14 +3816,66 @@ zend_bool php_openssl_pkey_init_dsa(DSA *dsa)
> > + }
> > + /* }}} */
> > +
> > ++/* {{{ php_openssl_dh_pub_from_priv */
> > ++static BIGNUM *php_openssl_dh_pub_from_priv(BIGNUM *priv_key, BIGNUM *g, BIGNUM *p)
> > ++{
> > ++ BIGNUM *pub_key, *priv_key_const_time;
> > ++ BN_CTX *ctx;
> > ++
> > ++ pub_key = BN_new();
> > ++ if (pub_key == NULL) {
> > ++ return NULL;
> > ++ }
> > ++
> > ++ priv_key_const_time = BN_new();
> > ++ if (priv_key_const_time == NULL) {
> > ++ BN_free(pub_key);
> > ++ return NULL;
> > ++ }
> > ++ ctx = BN_CTX_new();
> > ++ if (ctx == NULL) {
> > ++ BN_free(pub_key);
> > ++ BN_free(priv_key_const_time);
> > ++ return NULL;
> > ++ }
> > ++
> > ++ BN_with_flags(priv_key_const_time, priv_key, BN_FLG_CONSTTIME);
> > ++
> > ++ if (!BN_mod_exp_mont(pub_key, g, priv_key_const_time, p, ctx, NULL)) {
> > ++ BN_free(pub_key);
> > ++ pub_key = NULL;
> > ++ }
> > ++
> > ++ BN_free(priv_key_const_time);
> > ++ BN_CTX_free(ctx);
> > ++
> > ++ return pub_key;
> > ++}
> > ++/* }}} */
> > ++
> > + /* {{{ php_openssl_pkey_init_dh */
> > +-zend_bool php_openssl_pkey_init_dh(DH *dh)
> > ++zend_bool php_openssl_pkey_init_dh(DH *dh, zval *data)
> > + {
> > +- if (!dh->p || !dh->g) {
> > ++ BIGNUM *p, *q, *g, *priv_key, *pub_key;
> > ++
> > ++ OPENSSL_PKEY_SET_BN(data, p);
> > ++ OPENSSL_PKEY_SET_BN(data, q);
> > ++ OPENSSL_PKEY_SET_BN(data, g);
> > ++ if (!p || !g || !DH_set0_pqg(dh, p, q, g)) {
> > + return 0;
> > + }
> > +- if (dh->pub_key) {
> > +- return 1;
> > ++
> > ++ OPENSSL_PKEY_SET_BN(data, priv_key);
> > ++ OPENSSL_PKEY_SET_BN(data, pub_key);
> > ++ if (pub_key) {
> > ++ return DH_set0_key(dh, pub_key, priv_key);
> > ++ }
> > ++ if (priv_key) {
> > ++ pub_key = php_openssl_dh_pub_from_priv(priv_key, g, p);
> > ++ if (pub_key == NULL) {
> > ++ return 0;
> > ++ }
> > ++ return DH_set0_key(dh, pub_key, priv_key);
> > + }
> > + PHP_OPENSSL_RAND_ADD_TIME();
> > + if (!DH_generate_key(dh)) {
> > +@@ -3614,18 +3908,8 @@ PHP_FUNCTION(openssl_pkey_new)
> > + if (pkey) {
> > + RSA *rsa = RSA_new();
> > + if (rsa) {
> > +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, n);
> > +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, e);
> > +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, d);
> > +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, p);
> > +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, q);
> > +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, dmp1);
> > +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, dmq1);
> > +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), rsa, iqmp);
> > +- if (rsa->n && rsa->d) {
> > +- if (EVP_PKEY_assign_RSA(pkey, rsa)) {
> > +- RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
> > +- }
> > ++ if (php_openssl_pkey_init_and_assign_rsa(pkey, rsa, *data)) {
> > ++ RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
> > + }
> > + RSA_free(rsa);
> > + }
> > +@@ -3638,12 +3922,7 @@ PHP_FUNCTION(openssl_pkey_new)
> > + if (pkey) {
> > + DSA *dsa = DSA_new();
> > + if (dsa) {
> > +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, p);
> > +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, q);
> > +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, g);
> > +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, priv_key);
> > +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dsa, pub_key);
> > +- if (php_openssl_pkey_init_dsa(dsa)) {
> > ++ if (php_openssl_pkey_init_dsa(dsa, *data)) {
> > + if (EVP_PKEY_assign_DSA(pkey, dsa)) {
> > + RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
> > + }
> > +@@ -3659,11 +3938,7 @@ PHP_FUNCTION(openssl_pkey_new)
> > + if (pkey) {
> > + DH *dh = DH_new();
> > + if (dh) {
> > +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, p);
> > +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, g);
> > +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, priv_key);
> > +- OPENSSL_PKEY_SET_BN(Z_ARRVAL_PP(data), dh, pub_key);
> > +- if (php_openssl_pkey_init_dh(dh)) {
> > ++ if (php_openssl_pkey_init_dh(dh, *data)) {
> > + if (EVP_PKEY_assign_DH(pkey, dh)) {
> > + RETURN_RESOURCE(zend_list_insert(pkey, le_key TSRMLS_CC));
> > + }
> > +@@ -3738,10 +4013,10 @@ PHP_FUNCTION(openssl_pkey_export_to_file)
> > + cipher = NULL;
> > + }
> > +
> > +- switch (EVP_PKEY_type(key->type)) {
> > ++ switch (EVP_PKEY_base_id(key)) {
> > + #ifdef HAVE_EVP_PKEY_EC
> > + case EVP_PKEY_EC:
> > +- pem_write = PEM_write_bio_ECPrivateKey(bio_out, EVP_PKEY_get1_EC_KEY(key), cipher, (unsigned char *)passphrase, passphrase_len, NULL, NULL);
> > ++ pem_write = PEM_write_bio_ECPrivateKey(bio_out, EVP_PKEY_get0_EC_KEY(key), cipher, (unsigned char *)passphrase, passphrase_len, NULL, NULL);
> > + break;
> > + #endif
> > + default:
> > +@@ -3807,7 +4082,7 @@ PHP_FUNCTION(openssl_pkey_export)
> > + cipher = NULL;
> > + }
> > +
> > +- switch (EVP_PKEY_type(key->type)) {
> > ++ switch (EVP_PKEY_base_id(key)) {
> > + #ifdef HAVE_EVP_PKEY_EC
> > + case EVP_PKEY_EC:
> > + pem_write = PEM_write_bio_ECPrivateKey(bio_out, EVP_PKEY_get1_EC_KEY(key), cipher, (unsigned char *)passphrase, passphrase_len, NULL, NULL);
> > +@@ -3928,25 +4203,33 @@ PHP_FUNCTION(openssl_pkey_get_details)
> > + /*TODO: Use the real values once the openssl constants are used
> > + * See the enum at the top of this file
> > + */
> > +- switch (EVP_PKEY_type(pkey->type)) {
> > ++ switch (EVP_PKEY_base_id(pkey)) {
> > + case EVP_PKEY_RSA:
> > + case EVP_PKEY_RSA2:
> > +- ktype = OPENSSL_KEYTYPE_RSA;
> > +-
> > +- if (pkey->pkey.rsa != NULL) {
> > +- zval *rsa;
> > +-
> > +- ALLOC_INIT_ZVAL(rsa);
> > +- array_init(rsa);
> > +- OPENSSL_PKEY_GET_BN(rsa, n);
> > +- OPENSSL_PKEY_GET_BN(rsa, e);
> > +- OPENSSL_PKEY_GET_BN(rsa, d);
> > +- OPENSSL_PKEY_GET_BN(rsa, p);
> > +- OPENSSL_PKEY_GET_BN(rsa, q);
> > +- OPENSSL_PKEY_GET_BN(rsa, dmp1);
> > +- OPENSSL_PKEY_GET_BN(rsa, dmq1);
> > +- OPENSSL_PKEY_GET_BN(rsa, iqmp);
> > +- add_assoc_zval(return_value, "rsa", rsa);
> > ++ {
> > ++ RSA *rsa = EVP_PKEY_get0_RSA(pkey);
> > ++ ktype = OPENSSL_KEYTYPE_RSA;
> > ++
> > ++ if (rsa != NULL) {
> > ++ zval *z_rsa;
> > ++ const BIGNUM *n, *e, *d, *p, *q, *dmp1, *dmq1, *iqmp;
> > ++
> > ++ RSA_get0_key(rsa, &n, &e, &d);
> > ++ RSA_get0_factors(rsa, &p, &q);
> > ++ RSA_get0_crt_params(rsa, &dmp1, &dmq1, &iqmp);
> > ++
> > ++ ALLOC_INIT_ZVAL(z_rsa);
> > ++ array_init(z_rsa);
> > ++ OPENSSL_PKEY_GET_BN(z_rsa, n);
> > ++ OPENSSL_PKEY_GET_BN(z_rsa, e);
> > ++ OPENSSL_PKEY_GET_BN(z_rsa, d);
> > ++ OPENSSL_PKEY_GET_BN(z_rsa, p);
> > ++ OPENSSL_PKEY_GET_BN(z_rsa, q);
> > ++ OPENSSL_PKEY_GET_BN(z_rsa, dmp1);
> > ++ OPENSSL_PKEY_GET_BN(z_rsa, dmq1);
> > ++ OPENSSL_PKEY_GET_BN(z_rsa, iqmp);
> > ++ add_assoc_zval(return_value, "rsa", z_rsa);
> > ++ }
> > + }
> > +
> > + break;
> > +@@ -3954,42 +4237,55 @@ PHP_FUNCTION(openssl_pkey_get_details)
> > + case EVP_PKEY_DSA2:
> > + case EVP_PKEY_DSA3:
> > + case EVP_PKEY_DSA4:
> > +- ktype = OPENSSL_KEYTYPE_DSA;
> > +-
> > +- if (pkey->pkey.dsa != NULL) {
> > +- zval *dsa;
> > +-
> > +- ALLOC_INIT_ZVAL(dsa);
> > +- array_init(dsa);
> > +- OPENSSL_PKEY_GET_BN(dsa, p);
> > +- OPENSSL_PKEY_GET_BN(dsa, q);
> > +- OPENSSL_PKEY_GET_BN(dsa, g);
> > +- OPENSSL_PKEY_GET_BN(dsa, priv_key);
> > +- OPENSSL_PKEY_GET_BN(dsa, pub_key);
> > +- add_assoc_zval(return_value, "dsa", dsa);
> > ++ {
> > ++ DSA *dsa = EVP_PKEY_get0_DSA(pkey);
> > ++ ktype = OPENSSL_KEYTYPE_DSA;
> > ++
> > ++ if (dsa != NULL) {
> > ++ zval *z_dsa;
> > ++ const BIGNUM *p, *q, *g, *priv_key, *pub_key;
> > ++
> > ++ DSA_get0_pqg(dsa, &p, &q, &g);
> > ++ DSA_get0_key(dsa, &pub_key, &priv_key);
> > ++
> > ++ ALLOC_INIT_ZVAL(z_dsa);
> > ++ array_init(z_dsa);
> > ++ OPENSSL_PKEY_GET_BN(z_dsa, p);
> > ++ OPENSSL_PKEY_GET_BN(z_dsa, q);
> > ++ OPENSSL_PKEY_GET_BN(z_dsa, g);
> > ++ OPENSSL_PKEY_GET_BN(z_dsa, priv_key);
> > ++ OPENSSL_PKEY_GET_BN(z_dsa, pub_key);
> > ++ add_assoc_zval(return_value, "dsa", z_dsa);
> > ++ }
> > + }
> > + break;
> > + case EVP_PKEY_DH:
> > +-
> > +- ktype = OPENSSL_KEYTYPE_DH;
> > +-
> > +- if (pkey->pkey.dh != NULL) {
> > +- zval *dh;
> > +-
> > +- ALLOC_INIT_ZVAL(dh);
> > +- array_init(dh);
> > +- OPENSSL_PKEY_GET_BN(dh, p);
> > +- OPENSSL_PKEY_GET_BN(dh, g);
> > +- OPENSSL_PKEY_GET_BN(dh, priv_key);
> > +- OPENSSL_PKEY_GET_BN(dh, pub_key);
> > +- add_assoc_zval(return_value, "dh", dh);
> > ++ {
> > ++ DH *dh = EVP_PKEY_get0_DH(pkey);
> > ++ ktype = OPENSSL_KEYTYPE_DH;
> > ++
> > ++ if (dh != NULL) {
> > ++ zval *z_dh;
> > ++ const BIGNUM *p, *q, *g, *priv_key, *pub_key;
> > ++
> > ++ DH_get0_pqg(dh, &p, &q, &g);
> > ++ DH_get0_key(dh, &pub_key, &priv_key);
> > ++
> > ++ ALLOC_INIT_ZVAL(z_dh);
> > ++ array_init(z_dh);
> > ++ OPENSSL_PKEY_GET_BN(z_dh, p);
> > ++ OPENSSL_PKEY_GET_BN(z_dh, g);
> > ++ OPENSSL_PKEY_GET_BN(z_dh, priv_key);
> > ++ OPENSSL_PKEY_GET_BN(z_dh, pub_key);
> > ++ add_assoc_zval(return_value, "dh", z_dh);
> > ++ }
> > + }
> > +
> > + break;
> > + #ifdef HAVE_EVP_PKEY_EC
> > + case EVP_PKEY_EC:
> > + ktype = OPENSSL_KEYTYPE_EC;
> > +- if (pkey->pkey.ec != NULL) {
> > ++ if (EVP_PKEY_get0_EC_KEY(pkey) != NULL) {
> > + zval *ec;
> > + const EC_GROUP *ec_group;
> > + int nid;
> > +@@ -4546,13 +4842,13 @@ PHP_FUNCTION(openssl_private_encrypt)
> > + cryptedlen = EVP_PKEY_size(pkey);
> > + cryptedbuf = emalloc(cryptedlen + 1);
> > +
> > +- switch (pkey->type) {
> > ++ switch (EVP_PKEY_id(pkey)) {
> > + case EVP_PKEY_RSA:
> > + case EVP_PKEY_RSA2:
> > + successful = (RSA_private_encrypt(data_len,
> > + (unsigned char *)data,
> > + cryptedbuf,
> > +- pkey->pkey.rsa,
> > ++ EVP_PKEY_get0_RSA(pkey),
> > + padding) == cryptedlen);
> > + break;
> > + default:
> > +@@ -4604,13 +4900,13 @@ PHP_FUNCTION(openssl_private_decrypt)
> > + cryptedlen = EVP_PKEY_size(pkey);
> > + crypttemp = emalloc(cryptedlen + 1);
> > +
> > +- switch (pkey->type) {
> > ++ switch (EVP_PKEY_id(pkey)) {
> > + case EVP_PKEY_RSA:
> > + case EVP_PKEY_RSA2:
> > + cryptedlen = RSA_private_decrypt(data_len,
> > + (unsigned char *)data,
> > + crypttemp,
> > +- pkey->pkey.rsa,
> > ++ EVP_PKEY_get0_RSA(pkey),
> > + padding);
> > + if (cryptedlen != -1) {
> > + cryptedbuf = emalloc(cryptedlen + 1);
> > +@@ -4669,13 +4965,13 @@ PHP_FUNCTION(openssl_public_encrypt)
> > + cryptedlen = EVP_PKEY_size(pkey);
> > + cryptedbuf = emalloc(cryptedlen + 1);
> > +
> > +- switch (pkey->type) {
> > ++ switch (EVP_PKEY_id(pkey)) {
> > + case EVP_PKEY_RSA:
> > + case EVP_PKEY_RSA2:
> > + successful = (RSA_public_encrypt(data_len,
> > + (unsigned char *)data,
> > + cryptedbuf,
> > +- pkey->pkey.rsa,
> > ++ EVP_PKEY_get0_RSA(pkey),
> > + padding) == cryptedlen);
> > + break;
> > + default:
> > +@@ -4728,13 +5024,13 @@ PHP_FUNCTION(openssl_public_decrypt)
> > + cryptedlen = EVP_PKEY_size(pkey);
> > + crypttemp = emalloc(cryptedlen + 1);
> > +
> > +- switch (pkey->type) {
> > ++ switch (EVP_PKEY_id(pkey)) {
> > + case EVP_PKEY_RSA:
> > + case EVP_PKEY_RSA2:
> > + cryptedlen = RSA_public_decrypt(data_len,
> > + (unsigned char *)data,
> > + crypttemp,
> > +- pkey->pkey.rsa,
> > ++ EVP_PKEY_get0_RSA(pkey),
> > + padding);
> > + if (cryptedlen != -1) {
> > + cryptedbuf = emalloc(cryptedlen + 1);
> > +@@ -4798,7 +5094,7 @@ PHP_FUNCTION(openssl_sign)
> > + long keyresource = -1;
> > + char * data;
> > + int data_len;
> > +- EVP_MD_CTX md_ctx;
> > ++ EVP_MD_CTX *md_ctx;
> > + zval *method = NULL;
> > + long signature_algo = OPENSSL_ALGO_SHA1;
> > + const EVP_MD *mdtype;
> > +@@ -4831,9 +5127,10 @@ PHP_FUNCTION(openssl_sign)
> > + siglen = EVP_PKEY_size(pkey);
> > + sigbuf = emalloc(siglen + 1);
> > +
> > +- EVP_SignInit(&md_ctx, mdtype);
> > +- EVP_SignUpdate(&md_ctx, data, data_len);
> > +- if (EVP_SignFinal (&md_ctx, sigbuf,(unsigned int *)&siglen, pkey)) {
> > ++ md_ctx = EVP_MD_CTX_create();
> > ++ EVP_SignInit(md_ctx, mdtype);
> > ++ EVP_SignUpdate(md_ctx, data, data_len);
> > ++ if (EVP_SignFinal (md_ctx, sigbuf,(unsigned int *)&siglen, pkey)) {
> > + zval_dtor(signature);
> > + sigbuf[siglen] = '\0';
> > + ZVAL_STRINGL(signature, (char *)sigbuf, siglen, 0);
> > +@@ -4842,7 +5139,7 @@ PHP_FUNCTION(openssl_sign)
> > + efree(sigbuf);
> > + RETVAL_FALSE;
> > + }
> > +- EVP_MD_CTX_cleanup(&md_ctx);
> > ++ EVP_MD_CTX_destroy(md_ctx);
> > + if (keyresource == -1) {
> > + EVP_PKEY_free(pkey);
> > + }
> > +@@ -4856,7 +5153,7 @@ PHP_FUNCTION(openssl_verify)
> > + zval **key;
> > + EVP_PKEY *pkey;
> > + int err;
> > +- EVP_MD_CTX md_ctx;
> > ++ EVP_MD_CTX *md_ctx;
> > + const EVP_MD *mdtype;
> > + long keyresource = -1;
> > + char * data; int data_len;
> > +@@ -4890,10 +5187,11 @@ PHP_FUNCTION(openssl_verify)
> > + RETURN_FALSE;
> > + }
> > +
> > +- EVP_VerifyInit (&md_ctx, mdtype);
> > +- EVP_VerifyUpdate (&md_ctx, data, data_len);
> > +- err = EVP_VerifyFinal (&md_ctx, (unsigned char *)signature, signature_len, pkey);
> > +- EVP_MD_CTX_cleanup(&md_ctx);
> > ++ md_ctx = EVP_MD_CTX_create();
> > ++ EVP_VerifyInit (md_ctx, mdtype);
> > ++ EVP_VerifyUpdate (md_ctx, data, data_len);
> > ++ err = EVP_VerifyFinal (md_ctx, (unsigned char *)signature, signature_len, pkey);
> > ++ EVP_MD_CTX_destroy(md_ctx);
> > +
> > + if (keyresource == -1) {
> > + EVP_PKEY_free(pkey);
> > +@@ -4917,7 +5215,7 @@ PHP_FUNCTION(openssl_seal)
> > + char *method =NULL;
> > + int method_len = 0;
> > + const EVP_CIPHER *cipher;
> > +- EVP_CIPHER_CTX ctx;
> > ++ EVP_CIPHER_CTX *ctx;
> > +
> > + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "szza/|s", &data, &data_len, &sealdata, &ekeys, &pubkeys, &method, &method_len) == FAILURE) {
> > + return;
> > +@@ -4950,6 +5248,7 @@ PHP_FUNCTION(openssl_seal)
> > + memset(eks, 0, sizeof(*eks) * nkeys);
> > + key_resources = safe_emalloc(nkeys, sizeof(long), 0);
> > + memset(key_resources, 0, sizeof(*key_resources) * nkeys);
> > ++ memset(pkeys, 0, sizeof(*pkeys) * nkeys);
> > +
> > + /* get the public keys we are using to seal this data */
> > + zend_hash_internal_pointer_reset_ex(pubkeysht, &pos);
> > +@@ -4967,27 +5266,28 @@ PHP_FUNCTION(openssl_seal)
> > + i++;
> > + }
> > +
> > +- if (!EVP_EncryptInit(&ctx,cipher,NULL,NULL)) {
> > ++ ctx = EVP_CIPHER_CTX_new();
> > ++ if (ctx == NULL || !EVP_EncryptInit(ctx,cipher,NULL,NULL)) {
> > + RETVAL_FALSE;
> > +- EVP_CIPHER_CTX_cleanup(&ctx);
> > ++ EVP_CIPHER_CTX_free(ctx);
> > + goto clean_exit;
> > + }
> > +
> > + #if 0
> > + /* Need this if allow ciphers that require initialization vector */
> > +- ivlen = EVP_CIPHER_CTX_iv_length(&ctx);
> > ++ ivlen = EVP_CIPHER_CTX_iv_length(ctx);
> > + iv = ivlen ? emalloc(ivlen + 1) : NULL;
> > + #endif
> > + /* allocate one byte extra to make room for \0 */
> > +- buf = emalloc(data_len + EVP_CIPHER_CTX_block_size(&ctx));
> > +- EVP_CIPHER_CTX_cleanup(&ctx);
> > ++ buf = emalloc(data_len + EVP_CIPHER_CTX_block_size(ctx));
> > ++ EVP_CIPHER_CTX_cleanup(ctx);
> > +
> > +- if (EVP_SealInit(&ctx, cipher, eks, eksl, NULL, pkeys, nkeys) <= 0 ||
> > +- !EVP_SealUpdate(&ctx, buf, &len1, (unsigned char *)data, data_len) ||
> > +- !EVP_SealFinal(&ctx, buf + len1, &len2)) {
> > ++ if (EVP_SealInit(ctx, cipher, eks, eksl, NULL, pkeys, nkeys) <= 0 ||
> > ++ !EVP_SealUpdate(ctx, buf, &len1, (unsigned char *)data, data_len) ||
> > ++ !EVP_SealFinal(ctx, buf + len1, &len2)) {
> > + RETVAL_FALSE;
> > + efree(buf);
> > +- EVP_CIPHER_CTX_cleanup(&ctx);
> > ++ EVP_CIPHER_CTX_free(ctx);
> > + goto clean_exit;
> > + }
> > +
> > +@@ -5018,7 +5318,7 @@ PHP_FUNCTION(openssl_seal)
> > + efree(buf);
> > + }
> > + RETVAL_LONG(len1 + len2);
> > +- EVP_CIPHER_CTX_cleanup(&ctx);
> > ++ EVP_CIPHER_CTX_free(ctx);
> > +
> > + clean_exit:
> > + for (i=0; i<nkeys; i++) {
> > +@@ -5045,7 +5345,7 @@ PHP_FUNCTION(openssl_open)
> > + int len1, len2;
> > + unsigned char *buf;
> > + long keyresource = -1;
> > +- EVP_CIPHER_CTX ctx;
> > ++ EVP_CIPHER_CTX *ctx;
> > + char * data; int data_len;
> > + char * ekey; int ekey_len;
> > + char *method =NULL;
> > +@@ -5074,8 +5374,9 @@ PHP_FUNCTION(openssl_open)
> > +
> > + buf = emalloc(data_len + 1);
> > +
> > +- if (EVP_OpenInit(&ctx, cipher, (unsigned char *)ekey, ekey_len, NULL, pkey) && EVP_OpenUpdate(&ctx, buf, &len1, (unsigned char *)data, data_len)) {
> > +- if (!EVP_OpenFinal(&ctx, buf + len1, &len2) || (len1 + len2 == 0)) {
> > ++ ctx = EVP_CIPHER_CTX_new();
> > ++ if (EVP_OpenInit(ctx, cipher, (unsigned char *)ekey, ekey_len, NULL, pkey) && EVP_OpenUpdate(ctx, buf, &len1, (unsigned char *)data, data_len)) {
> > ++ if (!EVP_OpenFinal(ctx, buf + len1, &len2) || (len1 + len2 == 0)) {
> > + efree(buf);
> > + RETVAL_FALSE;
> > + } else {
> > +@@ -5091,7 +5392,7 @@ PHP_FUNCTION(openssl_open)
> > + if (keyresource == -1) {
> > + EVP_PKEY_free(pkey);
> > + }
> > +- EVP_CIPHER_CTX_cleanup(&ctx);
> > ++ EVP_CIPHER_CTX_free(ctx);
> > + }
> > + /* }}} */
> > +
> > +@@ -5151,7 +5452,7 @@ PHP_FUNCTION(openssl_digest)
> > + char *data, *method;
> > + int data_len, method_len;
> > + const EVP_MD *mdtype;
> > +- EVP_MD_CTX md_ctx;
> > ++ EVP_MD_CTX *md_ctx;
> > + int siglen;
> > + unsigned char *sigbuf;
> > +
> > +@@ -5167,9 +5468,10 @@ PHP_FUNCTION(openssl_digest)
> > + siglen = EVP_MD_size(mdtype);
> > + sigbuf = emalloc(siglen + 1);
> > +
> > +- EVP_DigestInit(&md_ctx, mdtype);
> > +- EVP_DigestUpdate(&md_ctx, (unsigned char *)data, data_len);
> > +- if (EVP_DigestFinal (&md_ctx, (unsigned char *)sigbuf, (unsigned int *)&siglen)) {
> > ++ md_ctx = EVP_MD_CTX_create();
> > ++ EVP_DigestInit(md_ctx, mdtype);
> > ++ EVP_DigestUpdate(md_ctx, (unsigned char *)data, data_len);
> > ++ if (EVP_DigestFinal (md_ctx, (unsigned char *)sigbuf, (unsigned int *)&siglen)) {
> > + if (raw_output) {
> > + sigbuf[siglen] = '\0';
> > + RETVAL_STRINGL((char *)sigbuf, siglen, 0);
> > +@@ -5185,6 +5487,8 @@ PHP_FUNCTION(openssl_digest)
> > + efree(sigbuf);
> > + RETVAL_FALSE;
> > + }
> > ++
> > ++ EVP_MD_CTX_destroy(md_ctx);
> > + }
> > + /* }}} */
> > +
> > +@@ -5230,7 +5534,7 @@ PHP_FUNCTION(openssl_encrypt)
> > + char *data, *method, *password, *iv = "";
> > + int data_len, method_len, password_len, iv_len = 0, max_iv_len;
> > + const EVP_CIPHER *cipher_type;
> > +- EVP_CIPHER_CTX cipher_ctx;
> > ++ EVP_CIPHER_CTX *cipher_ctx;
> > + int i=0, outlen, keylen;
> > + unsigned char *outbuf, *key;
> > + zend_bool free_iv;
> > +@@ -5262,19 +5566,24 @@ PHP_FUNCTION(openssl_encrypt)
> > + outlen = data_len + EVP_CIPHER_block_size(cipher_type);
> > + outbuf = safe_emalloc(outlen, 1, 1);
> > +
> > +- EVP_EncryptInit(&cipher_ctx, cipher_type, NULL, NULL);
> > ++ cipher_ctx = EVP_CIPHER_CTX_new();
> > ++ if (!cipher_ctx) {
> > ++ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to create cipher context");
> > ++ RETURN_FALSE;
> > ++ }
> > ++ EVP_EncryptInit(cipher_ctx, cipher_type, NULL, NULL);
> > + if (password_len > keylen) {
> > +- EVP_CIPHER_CTX_set_key_length(&cipher_ctx, password_len);
> > ++ EVP_CIPHER_CTX_set_key_length(cipher_ctx, password_len);
> > + }
> > +- EVP_EncryptInit_ex(&cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
> > ++ EVP_EncryptInit_ex(cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
> > + if (options & OPENSSL_ZERO_PADDING) {
> > +- EVP_CIPHER_CTX_set_padding(&cipher_ctx, 0);
> > ++ EVP_CIPHER_CTX_set_padding(cipher_ctx, 0);
> > + }
> > + if (data_len > 0) {
> > +- EVP_EncryptUpdate(&cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
> > ++ EVP_EncryptUpdate(cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
> > + }
> > + outlen = i;
> > +- if (EVP_EncryptFinal(&cipher_ctx, (unsigned char *)outbuf + i, &i)) {
> > ++ if (EVP_EncryptFinal(cipher_ctx, (unsigned char *)outbuf + i, &i)) {
> > + outlen += i;
> > + if (options & OPENSSL_RAW_DATA) {
> > + outbuf[outlen] = '\0';
> > +@@ -5301,7 +5610,8 @@ PHP_FUNCTION(openssl_encrypt)
> > + if (free_iv) {
> > + efree(iv);
> > + }
> > +- EVP_CIPHER_CTX_cleanup(&cipher_ctx);
> > ++ EVP_CIPHER_CTX_cleanup(cipher_ctx);
> > ++ EVP_CIPHER_CTX_free(cipher_ctx);
> > + }
> > + /* }}} */
> > +
> > +@@ -5313,7 +5623,7 @@ PHP_FUNCTION(openssl_decrypt)
> > + char *data, *method, *password, *iv = "";
> > + int data_len, method_len, password_len, iv_len = 0;
> > + const EVP_CIPHER *cipher_type;
> > +- EVP_CIPHER_CTX cipher_ctx;
> > ++ EVP_CIPHER_CTX *cipher_ctx;
> > + int i, outlen, keylen;
> > + unsigned char *outbuf, *key;
> > + int base64_str_len;
> > +@@ -5359,17 +5669,23 @@ PHP_FUNCTION(openssl_decrypt)
> > + outlen = data_len + EVP_CIPHER_block_size(cipher_type);
> > + outbuf = emalloc(outlen + 1);
> > +
> > +- EVP_DecryptInit(&cipher_ctx, cipher_type, NULL, NULL);
> > ++ cipher_ctx = EVP_CIPHER_CTX_new();
> > ++ if (!cipher_ctx) {
> > ++ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to create cipher context");
> > ++ RETURN_FALSE;
> > ++ }
> > ++
> > ++ EVP_DecryptInit(cipher_ctx, cipher_type, NULL, NULL);
> > + if (password_len > keylen) {
> > +- EVP_CIPHER_CTX_set_key_length(&cipher_ctx, password_len);
> > ++ EVP_CIPHER_CTX_set_key_length(cipher_ctx, password_len);
> > + }
> > +- EVP_DecryptInit_ex(&cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
> > ++ EVP_DecryptInit_ex(cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
> > + if (options & OPENSSL_ZERO_PADDING) {
> > +- EVP_CIPHER_CTX_set_padding(&cipher_ctx, 0);
> > ++ EVP_CIPHER_CTX_set_padding(cipher_ctx, 0);
> > + }
> > +- EVP_DecryptUpdate(&cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
> > ++ EVP_DecryptUpdate(cipher_ctx, outbuf, &i, (unsigned char *)data, data_len);
> > + outlen = i;
> > +- if (EVP_DecryptFinal(&cipher_ctx, (unsigned char *)outbuf + i, &i)) {
> > ++ if (EVP_DecryptFinal(cipher_ctx, (unsigned char *)outbuf + i, &i)) {
> > + outlen += i;
> > + outbuf[outlen] = '\0';
> > + RETVAL_STRINGL((char *)outbuf, outlen, 0);
> > +@@ -5386,7 +5702,8 @@ PHP_FUNCTION(openssl_decrypt)
> > + if (base64_str) {
> > + efree(base64_str);
> > + }
> > +- EVP_CIPHER_CTX_cleanup(&cipher_ctx);
> > ++ EVP_CIPHER_CTX_cleanup(cipher_ctx);
> > ++ EVP_CIPHER_CTX_free(cipher_ctx);
> > + }
> > + /* }}} */
> > +
> > +@@ -5424,6 +5741,7 @@ PHP_FUNCTION(openssl_dh_compute_key)
> > + zval *key;
> > + char *pub_str;
> > + int pub_len;
> > ++ DH *dh;
> > + EVP_PKEY *pkey;
> > + BIGNUM *pub;
> > + char *data;
> > +@@ -5433,14 +5751,21 @@ PHP_FUNCTION(openssl_dh_compute_key)
> > + return;
> > + }
> > + ZEND_FETCH_RESOURCE(pkey, EVP_PKEY *, &key, -1, "OpenSSL key", le_key);
> > +- if (!pkey || EVP_PKEY_type(pkey->type) != EVP_PKEY_DH || !pkey->pkey.dh) {
> > ++ if (pkey == NULL) {
> > ++ RETURN_FALSE;
> > ++ }
> > ++ if (EVP_PKEY_base_id(pkey) != EVP_PKEY_DH) {
> > ++ RETURN_FALSE;
> > ++ }
> > ++ dh = EVP_PKEY_get0_DH(pkey);
> > ++ if (dh == NULL) {
> > + RETURN_FALSE;
> > + }
> > +
> > + pub = BN_bin2bn((unsigned char*)pub_str, pub_len, NULL);
> > +
> > +- data = emalloc(DH_size(pkey->pkey.dh) + 1);
> > +- len = DH_compute_key((unsigned char*)data, pub, pkey->pkey.dh);
> > ++ data = emalloc(DH_size(dh) + 1);
> > ++ len = DH_compute_key((unsigned char*)data, pub, dh);
> > +
> > + if (len >= 0) {
> > + data[len] = 0;
> > +diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c
> > +index d549033..c2d477c 100644
> > +--- a/ext/openssl/xp_ssl.c
> > ++++ b/ext/openssl/xp_ssl.c
> > +@@ -935,7 +935,7 @@ static int set_local_cert(SSL_CTX *ctx, php_stream *stream TSRMLS_DC) /* {{{ */
> > + static const SSL_METHOD *php_select_crypto_method(long method_value, int is_client TSRMLS_DC) /* {{{ */
> > + {
> > + if (method_value == STREAM_CRYPTO_METHOD_SSLv2) {
> > +-#ifndef OPENSSL_NO_SSL2
> > ++#if !defined(OPENSSL_NO_SSL2) && OPENSSL_VERSION_NUMBER < 0x10100000L
> > + return is_client ? SSLv2_client_method() : SSLv2_server_method();
> > + #else
> > + php_error_docref(NULL TSRMLS_CC, E_WARNING,
> > +@@ -1588,12 +1588,26 @@ int php_openssl_setup_crypto(php_stream *stream,
> > + }
> > + /* }}} */
> > +
> > ++#define PHP_SSL_MAX_VERSION_LEN 32
> > ++
> > ++static char *php_ssl_cipher_get_version(const SSL_CIPHER *c, char *buffer, size_t max_len) /* {{{ */
> > ++{
> > ++ const char *version = SSL_CIPHER_get_version(c);
> > ++ strncpy(buffer, version, max_len);
> > ++ if (max_len <= strlen(version)) {
> > ++ buffer[max_len - 1] = 0;
> > ++ }
> > ++ return buffer;
> > ++}
> > ++/* }}} */
> > ++
> > + static zval *capture_session_meta(SSL *ssl_handle) /* {{{ */
> > + {
> > + zval *meta_arr;
> > + char *proto_str;
> > + long proto = SSL_version(ssl_handle);
> > + const SSL_CIPHER *cipher = SSL_get_current_cipher(ssl_handle);
> > ++ char version_str[PHP_SSL_MAX_VERSION_LEN];
> > +
> > + switch (proto) {
> > + #if OPENSSL_VERSION_NUMBER >= 0x10001001L
> > +@@ -1611,7 +1625,7 @@ static zval *capture_session_meta(SSL *ssl_handle) /* {{{ */
> > + add_assoc_string(meta_arr, "protocol", proto_str, 1);
> > + add_assoc_string(meta_arr, "cipher_name", (char *) SSL_CIPHER_get_name(cipher), 1);
> > + add_assoc_long(meta_arr, "cipher_bits", SSL_CIPHER_get_bits(cipher, NULL));
> > +- add_assoc_string(meta_arr, "cipher_version", SSL_CIPHER_get_version(cipher), 1);
> > ++ add_assoc_string(meta_arr, "cipher_version", php_ssl_cipher_get_version(cipher, version_str, PHP_SSL_MAX_VERSION_LEN), 1);
> > +
> > + return meta_arr;
> > + }
> > +diff --git a/ext/phar/util.c b/ext/phar/util.c
> > +index 828be8f..06e4e55 100644
> > +--- a/ext/phar/util.c
> > ++++ b/ext/phar/util.c
> > +@@ -1531,7 +1531,7 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ
> > + BIO *in;
> > + EVP_PKEY *key;
> > + EVP_MD *mdtype = (EVP_MD *) EVP_sha1();
> > +- EVP_MD_CTX md_ctx;
> > ++ EVP_MD_CTX *md_ctx;
> > + #else
> > + int tempsig;
> > + #endif
> > +@@ -1608,7 +1608,8 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ
> > + return FAILURE;
> > + }
> > +
> > +- EVP_VerifyInit(&md_ctx, mdtype);
> > ++ md_ctx = EVP_MD_CTX_create();
> > ++ EVP_VerifyInit(md_ctx, mdtype);
> > + read_len = end_of_phar;
> > +
> > + if (read_len > sizeof(buf)) {
> > +@@ -1620,7 +1621,7 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ
> > + php_stream_seek(fp, 0, SEEK_SET);
> > +
> > + while (read_size && (len = php_stream_read(fp, (char*)buf, read_size)) > 0) {
> > +- EVP_VerifyUpdate (&md_ctx, buf, len);
> > ++ EVP_VerifyUpdate (md_ctx, buf, len);
> > + read_len -= (off_t)len;
> > +
> > + if (read_len < read_size) {
> > +@@ -1628,9 +1629,9 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ
> > + }
> > + }
> > +
> > +- if (EVP_VerifyFinal(&md_ctx, (unsigned char *)sig, sig_len, key) != 1) {
> > ++ if (EVP_VerifyFinal(md_ctx, (unsigned char *)sig, sig_len, key) != 1) {
> > + /* 1: signature verified, 0: signature does not match, -1: failed signature operation */
> > +- EVP_MD_CTX_cleanup(&md_ctx);
> > ++ EVP_MD_CTX_destroy(md_ctx);
> > +
> > + if (error) {
> > + spprintf(error, 0, "broken openssl signature");
> > +@@ -1639,7 +1640,7 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ
> > + return FAILURE;
> > + }
> > +
> > +- EVP_MD_CTX_cleanup(&md_ctx);
> > ++ EVP_MD_CTX_destroy(md_ctx);
> > + #endif
> > +
> > + *signature_len = phar_hex_str((const char*)sig, sig_len, signature TSRMLS_CC);
> > +--
> > +2.7.4
> > +
> > diff --git a/meta-oe/recipes-devtools/php/php_5.6.36.bb b/meta-oe/recipes-devtools/php/php_5.6.36.bb
> > deleted file mode 100644
> > index addddb3..0000000
> > --- a/meta-oe/recipes-devtools/php/php_5.6.36.bb
> > +++ /dev/null
> > @@ -1,23 +0,0 @@
> > -require php.inc
> > -
> > -LIC_FILES_CHKSUM = "file://LICENSE;md5=b602636d46a61c0ac0432bbf5c078fe4"
> > -
> > -SRC_URI += "file://php5-change-AC_TRY_RUN-to-AC_TRY_LINK.patch \
> > - file://pthread-check-threads-m4.patch \
> > - file://0001-Add-lpthread-to-link.patch \
> > - file://acinclude-xml2-config.patch \
> > - file://0001-acinclude-use-pkgconfig-for-libxml2-config.patch \
> > - "
> > -
> > -SRC_URI_append_class-target = " \
> > - file://php5-pear-makefile.patch \
> > - file://php5-phar-makefile.patch \
> > - file://php5-0001-opcache-config.m4-enable-opcache.patch \
> > - "
> > -
> > -SRC_URI[md5sum] = "6ca12a0e52dcd99cf4d5b2d74c6cde6f"
> > -SRC_URI[sha256sum] = "626a0e3f5d8a0e686a2b930f0dd3a0601fe3dcb5e43dd0e8c3fab631e64e172a"
> > -
> > -DEPENDS += "libmcrypt"
> > -EXTRA_OECONF += "--with-mcrypt=${STAGING_DIR_TARGET}${exec_prefix} \
> > - "
> > diff --git a/meta-oe/recipes-devtools/php/php_5.6.38.bb b/meta-oe/recipes-devtools/php/php_5.6.38.bb
> > new file mode 100644
> > index 0000000..d6f5145
> > --- /dev/null
> > +++ b/meta-oe/recipes-devtools/php/php_5.6.38.bb
> > @@ -0,0 +1,24 @@
> > +require php.inc
> > +
> > +LIC_FILES_CHKSUM = "file://LICENSE;md5=b602636d46a61c0ac0432bbf5c078fe4"
> > +
> > +SRC_URI += "file://php5-change-AC_TRY_RUN-to-AC_TRY_LINK.patch \
> > + file://pthread-check-threads-m4.patch \
> > + file://0001-Add-lpthread-to-link.patch \
> > + file://acinclude-xml2-config.patch \
> > + file://0001-acinclude-use-pkgconfig-for-libxml2-config.patch \
> > + file://0001-PHP-5.6-LibSSL-1.1-compatibility.patch \
> > + "
> > +
> > +SRC_URI_append_class-target = " \
> > + file://php5-pear-makefile.patch \
> > + file://php5-phar-makefile.patch \
> > + file://php5-0001-opcache-config.m4-enable-opcache.patch \
> > + "
> > +
> > +SRC_URI[md5sum] = "5b98aa066567eca8e5738b8ef4a3545c"
> > +SRC_URI[sha256sum] = "d65b231bbdd63be4439ef5ced965cfd63e62983429dbd4dfcfb49981593ebc03"
> > +
> > +DEPENDS += "libmcrypt"
> > +EXTRA_OECONF += "--with-mcrypt=${STAGING_DIR_TARGET}${exec_prefix} \
> > + "
> >
>
>
> --
> # Randy MacLeod
> # Wind River Linux
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [meta-oe][PATCH] php5: 5.6.36 -> 5.6.38
2019-01-30 16:33 ` Khem Raj
@ 2019-01-30 16:43 ` Randy MacLeod
2019-01-31 1:26 ` Hongxu Jia
0 siblings, 1 reply; 7+ messages in thread
From: Randy MacLeod @ 2019-01-30 16:43 UTC (permalink / raw)
To: Khem Raj; +Cc: openembeded-devel
On 1/30/19 11:33 AM, Khem Raj wrote:
> Hi Randy
>
> It would better to put it on the list of deprecated packages for a
> release before removing it.
Khem,
That works for me.
Where is the list of deprecated packages?
Neither google nor I could find it.
Hongxu,
Will you update to 5.6.40 sometime please?
--
# Randy MacLeod
# Wind River Linux
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [meta-oe][PATCH] php5: 5.6.36 -> 5.6.38
2019-01-30 16:43 ` Randy MacLeod
@ 2019-01-31 1:26 ` Hongxu Jia
2019-07-12 20:26 ` Randy MacLeod
0 siblings, 1 reply; 7+ messages in thread
From: Hongxu Jia @ 2019-01-31 1:26 UTC (permalink / raw)
To: Randy MacLeod, Khem Raj; +Cc: openembeded-devel
On 2019/1/31 上午12:43, Randy MacLeod wrote:
> On 1/30/19 11:33 AM, Khem Raj wrote:
>> Hi Randy
>>
>> It would better to put it on the list of deprecated packages for a
>> release before removing it.
>
> Khem,
>
> That works for me.
> Where is the list of deprecated packages?
> Neither google nor I could find it.
>
> Hongxu,
> Will you update to 5.6.40 sometime please?
I am afraid no, the reason why I upgraded it is the compiling failure
with new openssl 1.1.x, after fix the build failure, I am no longer to
maintain php5.
//Hongxu
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [meta-oe][PATCH] php5: 5.6.36 -> 5.6.38
2019-01-31 1:26 ` Hongxu Jia
@ 2019-07-12 20:26 ` Randy MacLeod
2019-07-12 20:44 ` Khem Raj
0 siblings, 1 reply; 7+ messages in thread
From: Randy MacLeod @ 2019-07-12 20:26 UTC (permalink / raw)
To: Hongxu Jia, Khem Raj; +Cc: openembeded-devel
On 1/30/19 8:26 PM, Hongxu Jia wrote:
> On 2019/1/31 上午12:43, Randy MacLeod wrote:
>> On 1/30/19 11:33 AM, Khem Raj wrote:
>>> Hi Randy
>>>
>>> It would better to put it on the list of deprecated packages for a
>>> release before removing it.
>>
>> Khem,
>>
>> That works for me.
>> Where is the list of deprecated packages?
>> Neither google nor I could find it.
>>
>> Hongxu,
>> Will you update to 5.6.40 sometime please?
>
> I am afraid no, the reason why I upgraded it is the compiling failure
>
> with new openssl 1.1.x, after fix the build failure, I am no longer to
>
> maintain php5.
>
> //Hongxu
>
>
Hongxu,
It's time to remove the old version of php.
Khem,
I didn't find a list of deprecated packages.
--
# Randy MacLeod
# Wind River Linux
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [meta-oe][PATCH] php5: 5.6.36 -> 5.6.38
2019-07-12 20:26 ` Randy MacLeod
@ 2019-07-12 20:44 ` Khem Raj
0 siblings, 0 replies; 7+ messages in thread
From: Khem Raj @ 2019-07-12 20:44 UTC (permalink / raw)
To: Randy MacLeod; +Cc: openembeded-devel
On Fri, Jul 12, 2019 at 1:26 PM Randy MacLeod
<randy.macleod@windriver.com> wrote:
>
> On 1/30/19 8:26 PM, Hongxu Jia wrote:
> > On 2019/1/31 上午12:43, Randy MacLeod wrote:
> >> On 1/30/19 11:33 AM, Khem Raj wrote:
> >>> Hi Randy
> >>>
> >>> It would better to put it on the list of deprecated packages for a
> >>> release before removing it.
> >>
> >> Khem,
> >>
> >> That works for me.
> >> Where is the list of deprecated packages?
> >> Neither google nor I could find it.
> >>
> >> Hongxu,
> >> Will you update to 5.6.40 sometime please?
> >
> > I am afraid no, the reason why I upgraded it is the compiling failure
> >
> > with new openssl 1.1.x, after fix the build failure, I am no longer to
> >
> > maintain php5.
> >
> > //Hongxu
> >
> >
>
>
> Hongxu,
> It's time to remove the old version of php.
>
> Khem,
> I didn't find a list of deprecated packages.
you would add PNBLACKLIST in the related recipe, since we did not do
this for warrior
lets remove the recipe directly, since October would be a year after
EOL so waiting until
then would make it quite stale
>
> --
> # Randy MacLeod
> # Wind River Linux
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2019-07-12 20:45 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-09-26 15:12 [meta-oe][PATCH] php5: 5.6.36 -> 5.6.38 Hongxu Jia
2019-01-30 16:13 ` Randy MacLeod
2019-01-30 16:33 ` Khem Raj
2019-01-30 16:43 ` Randy MacLeod
2019-01-31 1:26 ` Hongxu Jia
2019-07-12 20:26 ` Randy MacLeod
2019-07-12 20:44 ` Khem Raj
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.