diff options
author | Jakub Zelenka <bukka@php.net> | 2016-03-03 20:28:12 +0000 |
---|---|---|
committer | Jakub Zelenka <bukka@php.net> | 2016-07-17 17:43:34 +0100 |
commit | 1a4e910e8d6f635eb7b3e6ee56c095558f47a8e0 (patch) | |
tree | 0266a7a8e0589d2f8b6bc07a03f95477754f176b | |
parent | f08660bb58876714cb747eff09d0ef51894f5f66 (diff) | |
download | php-git-1a4e910e8d6f635eb7b3e6ee56c095558f47a8e0.tar.gz |
Use opaque pkey in openssl_pkey_get_details
-rw-r--r-- | ext/openssl/openssl.c | 124 |
1 files changed, 65 insertions, 59 deletions
diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index d653164fcc..0308ee7078 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -3829,30 +3829,30 @@ static int php_openssl_is_private_key(EVP_PKEY* pkey) } /* }}} */ -#define OPENSSL_GET_BN(_array, _bn, _name) do { \ - if (_bn != NULL) { \ - int len = BN_num_bytes(_bn); \ - zend_string *str = zend_string_alloc(len, 0); \ - BN_bn2bin(_bn, (unsigned char*)ZSTR_VAL(str)); \ - ZSTR_VAL(str)[len] = 0; \ - add_assoc_str(&_array, #_name, str); \ - } \ +#define OPENSSL_GET_BN(_array, _bn, _name) do { \ + if (_bn != NULL) { \ + int len = BN_num_bytes(_bn); \ + zend_string *str = zend_string_alloc(len, 0); \ + BN_bn2bin(_bn, (unsigned char*)ZSTR_VAL(str)); \ + ZSTR_VAL(str)[len] = 0; \ + add_assoc_str(&_array, #_name, str); \ + } \ } while (0); -#define OPENSSL_PKEY_GET_BN(_type, _name) do { \ - if (pkey->pkey._type->_name != NULL) { \ - OPENSSL_GET_BN(_type, pkey->pkey._type->_name, _name); \ - } \ +#define OPENSSL_PKEY_GET_BN(_type, _key, _name) do { \ + if (_key->_name != NULL) { \ + OPENSSL_GET_BN(_type, _key->_name, _name); \ + } \ } while (0); -#define OPENSSL_PKEY_SET_BN(_ht, _type, _name) do { \ - zval *bn; \ +#define OPENSSL_PKEY_SET_BN(_ht, _type, _name) do { \ + zval *bn; \ if ((bn = zend_hash_str_find(_ht, #_name, sizeof(#_name)-1)) != NULL && \ - Z_TYPE_P(bn) == IS_STRING) { \ - _type->_name = BN_bin2bn( \ - (unsigned char*)Z_STRVAL_P(bn), \ - (int)Z_STRLEN_P(bn), NULL); \ - } \ + Z_TYPE_P(bn) == IS_STRING) { \ + _type->_name = BN_bin2bn( \ + (unsigned char*)Z_STRVAL_P(bn), \ + (int)Z_STRLEN_P(bn), NULL); \ + } \ } while (0); /* {{{ php_openssl_pkey_init_dsa */ @@ -4387,62 +4387,68 @@ PHP_FUNCTION(openssl_pkey_get_details) 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; - - 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; + + array_init(&z_rsa); + OPENSSL_PKEY_GET_BN(z_rsa, rsa, n); + OPENSSL_PKEY_GET_BN(z_rsa, rsa, e); + OPENSSL_PKEY_GET_BN(z_rsa, rsa, d); + OPENSSL_PKEY_GET_BN(z_rsa, rsa, p); + OPENSSL_PKEY_GET_BN(z_rsa, rsa, q); + OPENSSL_PKEY_GET_BN(z_rsa, rsa, dmp1); + OPENSSL_PKEY_GET_BN(z_rsa, rsa, dmq1); + OPENSSL_PKEY_GET_BN(z_rsa, rsa, iqmp); + add_assoc_zval(return_value, "rsa", &z_rsa); + } } - break; case EVP_PKEY_DSA: case EVP_PKEY_DSA2: case EVP_PKEY_DSA3: case EVP_PKEY_DSA4: - ktype = OPENSSL_KEYTYPE_DSA; - - if (pkey->pkey.dsa != NULL) { - 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; + + array_init(&z_dsa); + OPENSSL_PKEY_GET_BN(z_dsa, dsa, p); + OPENSSL_PKEY_GET_BN(z_dsa, dsa, q); + OPENSSL_PKEY_GET_BN(z_dsa, dsa, g); + OPENSSL_PKEY_GET_BN(z_dsa, dsa, priv_key); + OPENSSL_PKEY_GET_BN(z_dsa, dsa, pub_key); + add_assoc_zval(return_value, "dsa", &z_dsa); + } } break; case EVP_PKEY_DH: + { + DH *dh = EVP_PKEY_get0_DH(pkey); + ktype = OPENSSL_KEYTYPE_DH; - ktype = OPENSSL_KEYTYPE_DH; - - if (pkey->pkey.dh != NULL) { - zval dh; + if (dh != NULL) { + zval z_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); + array_init(&z_dh); + OPENSSL_PKEY_GET_BN(z_dh, dh, p); + OPENSSL_PKEY_GET_BN(z_dh, dh, g); + OPENSSL_PKEY_GET_BN(z_dh, dh, priv_key); + OPENSSL_PKEY_GET_BN(z_dh, 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; const EC_POINT *pub; |