]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
getinfo: access SSL internals via Curl_ssl
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Fri, 23 Jun 2017 14:05:26 +0000 (16:05 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 28 Aug 2017 12:56:57 +0000 (14:56 +0200)
In the ongoing endeavor to abstract out all SSL backend-specific
functionality, this is the next step: Instead of hard-coding how the
different SSL backends access their internal data in getinfo.c, let's
implement backend-specific functions to do that task.

This will also allow for switching SSL backends as a runtime option.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
12 files changed:
lib/getinfo.c
lib/vtls/axtls.c
lib/vtls/cyassl.c
lib/vtls/darwinssl.c
lib/vtls/gskit.c
lib/vtls/gtls.c
lib/vtls/mbedtls.c
lib/vtls/nss.c
lib/vtls/openssl.c
lib/vtls/polarssl.c
lib/vtls/schannel.c
lib/vtls/vtls.h

index 9c6f3b731a8bf9660306e8ce97ecd8d706a2a354..862ced0194a26b4e64282dfd43e7d5930056a499 100644 (file)
@@ -360,46 +360,25 @@ static CURLcode getinfo_slist(struct Curl_easy *data, CURLINFO info,
       struct curl_tlssessioninfo **tsip = (struct curl_tlssessioninfo **)
                                           param_slistp;
       struct curl_tlssessioninfo *tsi = &data->tsi;
+#ifdef USE_SSL
       struct connectdata *conn = data->easy_conn;
+#endif
 
       *tsip = tsi;
       tsi->backend = Curl_ssl_backend();
       tsi->internals = NULL;
 
+#ifdef USE_SSL
       if(conn && tsi->backend != CURLSSLBACKEND_NONE) {
         unsigned int i;
         for(i = 0; i < (sizeof(conn->ssl) / sizeof(conn->ssl[0])); ++i) {
           if(conn->ssl[i].use) {
-#if defined(USE_AXTLS)
-            tsi->internals = (void *)conn->ssl[i].ssl;
-#elif defined(USE_CYASSL)
-            tsi->internals = (void *)conn->ssl[i].handle;
-#elif defined(USE_DARWINSSL)
-            tsi->internals = (void *)conn->ssl[i].ssl_ctx;
-#elif defined(USE_GNUTLS)
-            tsi->internals = (void *)conn->ssl[i].session;
-#elif defined(USE_GSKIT)
-            tsi->internals = (void *)conn->ssl[i].handle;
-#elif defined(USE_MBEDTLS)
-            tsi->internals = (void *)&conn->ssl[i].ssl;
-#elif defined(USE_NSS)
-            tsi->internals = (void *)conn->ssl[i].handle;
-#elif defined(USE_OPENSSL)
-            /* Legacy: CURLINFO_TLS_SESSION must return an SSL_CTX pointer. */
-            tsi->internals = ((info == CURLINFO_TLS_SESSION) ?
-                              (void *)conn->ssl[i].ctx :
-                              (void *)conn->ssl[i].handle);
-#elif defined(USE_POLARSSL)
-            tsi->internals = (void *)&conn->ssl[i].ssl;
-#elif defined(USE_SCHANNEL)
-            tsi->internals = (void *)&conn->ssl[i].ctxt->ctxt_handle;
-#elif defined(USE_SSL)
-#error "SSL backend specific information missing for CURLINFO_TLS_SSL_PTR"
-#endif
+            tsi->internals = Curl_ssl->get_internals(&conn->ssl[i], info);
             break;
           }
         }
       }
+#endif
     }
     break;
   default:
index ceebc9a7a155fd905ffae2c459d795137b8873d9..2b904fcd0ce244ad873b58a312e388dc7fab6be5 100644 (file)
@@ -681,6 +681,13 @@ static CURLcode Curl_axtls_random(struct Curl_easy *data,
   return CURLE_OK;
 }
 
+static void *Curl_axtls_get_internals(struct ssl_connect_data *connssl,
+                                      CURLINFO info UNUSED_PARAM)
+{
+  (void)info;
+  return connssl->ssl;
+}
+
 const struct Curl_ssl Curl_ssl_axtls = {
   "axtls",                        /* name */
 
@@ -705,6 +712,7 @@ const struct Curl_ssl Curl_ssl_axtls = {
   Curl_none_cert_status_request,  /* cert_status_request */
   Curl_axtls_connect,             /* connect */
   Curl_axtls_connect_nonblocking, /* connect_nonblocking */
+  Curl_axtls_get_internals,       /* get_internals */
   Curl_axtls_close,               /* close */
   Curl_none_close_all,            /* close_all */
   Curl_axtls_session_free,        /* session_free */
index 7cc294b1dc61bf29696a86414525088e3995860c..0fbb6ff670df6af463da0260e00df43ff5acb31d 100644 (file)
@@ -959,6 +959,13 @@ static void Curl_cyassl_sha256sum(const unsigned char *tmp, /* input */
   Sha256Final(&SHA256pw, sha256sum);
 }
 
+static void *Curl_cyassl_get_internals(struct ssl_connect_data *connssl,
+                                       CURLINFO info UNUSED_PARAM)
+{
+  (void)info;
+  return connssl->handle;
+}
+
 const struct Curl_ssl Curl_ssl_cyassl = {
   "cyassl",                        /* name */
 
@@ -982,6 +989,7 @@ const struct Curl_ssl Curl_ssl_cyassl = {
   Curl_none_cert_status_request,   /* cert_status_request */
   Curl_cyassl_connect,             /* connect */
   Curl_cyassl_connect_nonblocking, /* connect_nonblocking */
+  Curl_cyassl_get_internals,       /* get_internals */
   Curl_cyassl_close,               /* close */
   Curl_none_close_all,             /* close_all */
   Curl_cyassl_session_free,        /* session_free */
index aef644457967d47d12f5d9cef693aa9ed9676ffb..d6558e358cba5af7796ca135107d1b2576ed7afa 100644 (file)
@@ -2871,6 +2871,13 @@ static ssize_t darwinssl_recv(struct connectdata *conn,
   return (ssize_t)processed;
 }
 
+static void *Curl_darwinssl_get_internals(struct ssl_connect_data *connssl,
+                                          CURLINFO info UNUSED_PARAM)
+{
+  (void)info;
+  return connssl->ssl_ctx;
+}
+
 const struct Curl_ssl Curl_ssl_darwinssl = {
   "darwinssl",                        /* name */
 
@@ -2894,6 +2901,7 @@ const struct Curl_ssl Curl_ssl_darwinssl = {
   Curl_none_cert_status_request,      /* cert_status_request */
   Curl_darwinssl_connect,             /* connect */
   Curl_darwinssl_connect_nonblocking, /* connect_nonblocking */
+  Curl_darwinssl_get_internals,       /* get_internals */
   Curl_darwinssl_close,               /* close */
   Curl_none_close_all,                /* close_all */
   Curl_darwinssl_session_free,        /* session_free */
index dab11491202ddaac15aa4033aa35a9e4904ede72..196cbb3bac9285da58bf29e67dd622108787196e 100644 (file)
@@ -1333,6 +1333,13 @@ static int Curl_gskit_check_cxn(struct connectdata *cxn)
   return -1;  /* connection status unknown */
 }
 
+static void *Curl_gskit_get_internals(struct ssl_connect_data *connssl,
+                                      CURLINFO info UNUSED_PARAM)
+{
+  (void)info;
+  return connssl->handle;
+}
+
 const struct Curl_ssl Curl_ssl_gskit = {
   "gskit",                        /* name */
 
@@ -1354,6 +1361,7 @@ const struct Curl_ssl Curl_ssl_gskit = {
   Curl_none_cert_status_request,  /* cert_status_request */
   Curl_gskit_connect,             /* connect */
   Curl_gskit_connect_nonblocking, /* connect_nonblocking */
+  Curl_gskit_get_internals,       /* get_internals */
   Curl_gskit_close,               /* close */
   Curl_none_close_all,            /* close_all */
   /* No session handling for GSKit */
index 54fda5467b51828ba206e39b2a8e2296fb09c73e..1e57b4588f41dc1fdc22d082ea932bc4bd76cd8c 100644 (file)
@@ -1782,6 +1782,13 @@ static bool Curl_gtls_cert_status_request(void)
 #endif
 }
 
+static void *Curl_gtls_get_internals(struct ssl_connect_data *connssl,
+                                     CURLINFO info UNUSED_PARAM)
+{
+  (void)info;
+  return connssl->session;
+}
+
 const struct Curl_ssl Curl_ssl_gnutls = {
   "gnutls",                      /* name */
 
@@ -1801,6 +1808,7 @@ const struct Curl_ssl Curl_ssl_gnutls = {
   Curl_gtls_cert_status_request, /* cert_status_request */
   Curl_gtls_connect,             /* connect */
   Curl_gtls_connect_nonblocking, /* connect_nonblocking */
+  Curl_gtls_get_internals,       /* get_internals */
   Curl_gtls_close,               /* close */
   Curl_none_close_all,           /* close_all */
   Curl_glts_session_free,        /* session_free */
index ea8f3c6d503096504b76d45fa08cbde340b6e212..803932c6fd6bf8e947d45972cf2c06abd5bcd92a 100644 (file)
@@ -1012,6 +1012,13 @@ static void Curl_mbedtls_sha256sum(const unsigned char *input,
   mbedtls_sha256(input, inputlen, sha256sum, 0);
 }
 
+static void *Curl_mbedtls_get_internals(struct ssl_connect_data *connssl,
+                                        CURLINFO info UNUSED_PARAM)
+{
+  (void)info;
+  return &connssl->ssl;
+}
+
 const struct Curl_ssl Curl_ssl_mbedtls = {
   "mbedtls",                        /* name */
 
@@ -1031,6 +1038,7 @@ const struct Curl_ssl Curl_ssl_mbedtls = {
   Curl_none_cert_status_request,    /* cert_status_request */
   Curl_mbedtls_connect,             /* connect */
   Curl_mbedtls_connect_nonblocking, /* connect_nonblocking */
+  Curl_mbedtls_get_internals,       /* get_internals */
   Curl_mbedtls_close,               /* close */
   Curl_mbedtls_close_all,           /* close_all */
   Curl_mbedtls_session_free,        /* session_free */
index 3f3d59f0d6a6996d18aa9aeb07fc61fbb36b4cac..d7d49b6731c1d613b055d3a79069e3c10f2ef918 100644 (file)
@@ -2323,6 +2323,13 @@ static bool Curl_nss_false_start(void)
 #endif
 }
 
+static void *Curl_nss_get_internals(struct ssl_connect_data *connssl,
+                                    CURLINFO info UNUSED_PARAM)
+{
+  (void)info;
+  return connssl->handle;
+}
+
 const struct Curl_ssl Curl_ssl_nss = {
   "nss",                        /* name */
 
@@ -2343,6 +2350,7 @@ const struct Curl_ssl Curl_ssl_nss = {
   Curl_nss_cert_status_request, /* cert_status_request */
   Curl_nss_connect,             /* connect */
   Curl_nss_connect_nonblocking, /* connect_nonblocking */
+  Curl_nss_get_internals,       /* get_internals */
   Curl_nss_close,               /* close */
   Curl_none_close_all,          /* close_all */
   /* NSS has its own session ID cache */
index fcd4539d5ee27826388e9073ae4147c0f08c6070..40bd8ee86a36cf011533970dd0eb3a54741f09ed 100644 (file)
@@ -3394,6 +3394,14 @@ static bool Curl_ossl_cert_status_request(void)
 #endif
 }
 
+static void *Curl_ossl_get_internals(struct ssl_connect_data *connssl,
+                                     CURLINFO info)
+{
+  /* Legacy: CURLINFO_TLS_SESSION must return an SSL_CTX pointer. */
+  return info == CURLINFO_TLS_SESSION ?
+         (void *)connssl->ctx : (void *)connssl->handle;
+}
+
 const struct Curl_ssl Curl_ssl_openssl = {
   "openssl",                     /* name */
 
@@ -3413,6 +3421,7 @@ const struct Curl_ssl Curl_ssl_openssl = {
   Curl_ossl_cert_status_request, /* cert_status_request */
   Curl_ossl_connect,             /* connect */
   Curl_ossl_connect_nonblocking, /* connect_nonblocking */
+  Curl_ossl_get_internals,       /* get_internals */
   Curl_ossl_close,               /* close */
   Curl_ossl_close_all,           /* close_all */
   Curl_ossl_session_free,        /* session_free */
index e12a50d6a3dd77d3bb3a69f1cd5515d670453513..3cffb9f4bb9c0a69ff0650e669e82dd2d3b1b462 100644 (file)
@@ -874,6 +874,13 @@ static void Curl_polarssl_sha256sum(const unsigned char *input,
   sha256(input, inputlen, sha256sum, 0);
 }
 
+static void *Curl_polarssl_get_internals(struct ssl_connect_data *connssl,
+                                         CURLINFO info UNUSED_PARAM)
+{
+  (void)info;
+  return &connssl->ssl;
+}
+
 const struct Curl_ssl Curl_ssl_polarssl = {
   "polarssl",                        /* name */
 
@@ -896,6 +903,7 @@ const struct Curl_ssl Curl_ssl_polarssl = {
   Curl_none_cert_status_request,     /* cert_status_request */
   Curl_polarssl_connect,             /* connect */
   Curl_polarssl_connect_nonblocking, /* connect_nonblocking */
+  Curl_polarssl_get_internals,       /* get_internals */
   Curl_polarssl_close,               /* close */
   Curl_none_close_all,               /* close_all */
   Curl_polarssl_session_free,        /* session_free */
index d01a224c9c3fc1b8aa5ab826c5a3ece75cde6432..1296267ef9b4b4a0fca2eb33e247837bcbdb1fc7 100644 (file)
@@ -1773,6 +1773,13 @@ static CURLcode verify_certificate(struct connectdata *conn, int sockindex)
 }
 #endif /* _WIN32_WCE */
 
+static void *Curl_schannel_get_internals(struct ssl_connect_data *connssl,
+                                         CURLINFO info UNUSED_PARAM)
+{
+  (void)info;
+  return &connssl->ctxt->ctxt_handle;
+}
+
 const struct Curl_ssl Curl_ssl_schannel = {
   "schannel",                        /* name */
 
@@ -1792,6 +1799,7 @@ const struct Curl_ssl Curl_ssl_schannel = {
   Curl_none_cert_status_request,     /* cert_status_request */
   Curl_schannel_connect,             /* connect */
   Curl_schannel_connect_nonblocking, /* connect_nonblocking */
+  Curl_schannel_get_internals,       /* get_internals */
   Curl_schannel_close,               /* close */
   Curl_none_close_all,               /* close_all */
   Curl_schannel_session_free,        /* session_free */
index de98df02751a58e6448f4787b69a747e3b20d5fd..a814b72fb2f5b2dc4baa6af56884d9c73b40d263 100644 (file)
@@ -24,6 +24,7 @@
 #include "curl_setup.h"
 
 struct connectdata;
+struct ssl_connect_data;
 
 struct Curl_ssl {
   const char *name;
@@ -52,6 +53,7 @@ struct Curl_ssl {
   CURLcode (*connect)(struct connectdata *conn, int sockindex);
   CURLcode (*connect_nonblocking)(struct connectdata *conn, int sockindex,
                                   bool *done);
+  void *(*get_internals)(struct ssl_connect_data *connssl, CURLINFO info);
   void (*close)(struct connectdata *conn, int sockindex);
   void (*close_all)(struct Curl_easy *data);
   void (*session_free)(void *ptr);