aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorViktor Szakats <vszakats@users.noreply.github.com>2016-02-13 17:09:12 +0100
committerDaniel Stenberg <daniel@haxx.se>2016-02-16 00:29:24 +0100
commitae01698ea493efaf0190814bd3fbff3e192f837e (patch)
treee6784fc78c19969ce0d8e921100f0aad1af78e7f
parent569a37efe046f9fb9f5ae8d51c6a83ba4e2bd513 (diff)
openssl: avoid direct PKEY access with OpenSSL 1.1.0
by using API instead of accessing an internal structure. This is required starting OpenSSL 1.1.0-pre3. Closes #650
-rw-r--r--lib/vtls/openssl.c42
1 files changed, 38 insertions, 4 deletions
diff --git a/lib/vtls/openssl.c b/lib/vtls/openssl.c
index b4f62e606..0c7315eab 100644
--- a/lib/vtls/openssl.c
+++ b/lib/vtls/openssl.c
@@ -2208,8 +2208,8 @@ static void pubkey_show(struct SessionHandle *data,
#define print_pubkey_BN(_type, _name, _num) \
do { \
- if(pubkey->pkey._type->_name) { \
- pubkey_show(data, mem, _num, #_type, #_name, pubkey->pkey._type->_name); \
+ if(_type->_name) { \
+ pubkey_show(data, mem, _num, #_type, #_name, _type->_name); \
} \
} WHILE_FALSE
@@ -2356,9 +2356,24 @@ static CURLcode get_cert_chain(struct connectdata *conn,
if(!pubkey)
infof(data, " Unable to load public key\n");
else {
- switch(pubkey->type) {
+ int pktype;
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L && \
+ !defined(LIBRESSL_VERSION_NUMBER)
+ pktype = EVP_PKEY_id(pubkey);
+#else
+ pktype = pubkey->type;
+#endif
+ switch(pktype) {
case EVP_PKEY_RSA:
- BIO_printf(mem, "%d", BN_num_bits(pubkey->pkey.rsa->n));
+ {
+ RSA *rsa;
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L && \
+ !defined(LIBRESSL_VERSION_NUMBER)
+ rsa = EVP_PKEY_get0_RSA(pubkey);
+#else
+ rsa = pubkey->pkey.rsa;
+#endif
+ BIO_printf(mem, "%d", BN_num_bits(rsa->n));
push_certinfo("RSA Public Key", i);
print_pubkey_BN(rsa, n, i);
@@ -2370,19 +2385,38 @@ static CURLcode get_cert_chain(struct connectdata *conn,
print_pubkey_BN(rsa, dmq1, i);
print_pubkey_BN(rsa, iqmp, i);
break;
+ }
case EVP_PKEY_DSA:
+ {
+ DSA *dsa;
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L && \
+ !defined(LIBRESSL_VERSION_NUMBER)
+ dsa = EVP_PKEY_get0_DSA(pubkey);
+#else
+ dsa = pubkey->pkey.dsa;
+#endif
print_pubkey_BN(dsa, p, i);
print_pubkey_BN(dsa, q, i);
print_pubkey_BN(dsa, g, i);
print_pubkey_BN(dsa, priv_key, i);
print_pubkey_BN(dsa, pub_key, i);
break;
+ }
case EVP_PKEY_DH:
+ {
+ DH *dh;
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L && \
+ !defined(LIBRESSL_VERSION_NUMBER)
+ dh = EVP_PKEY_get0_DH(pubkey);
+#else
+ dh = pubkey->pkey.dh;
+#endif
print_pubkey_BN(dh, p, i);
print_pubkey_BN(dh, g, i);
print_pubkey_BN(dh, priv_key, i);
print_pubkey_BN(dh, pub_key, i);
break;
+ }
#if 0
case EVP_PKEY_EC: /* symbol not present in OpenSSL 0.9.6 */
/* left TODO */