Home | History | Annotate | Download | only in vtls
      1 /***************************************************************************
      2  *                                  _   _ ____  _
      3  *  Project                     ___| | | |  _ \| |
      4  *                             / __| | | | |_) | |
      5  *                            | (__| |_| |  _ <| |___
      6  *                             \___|\___/|_| \_\_____|
      7  *
      8  * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel (at) haxx.se>, et al.
      9  *
     10  * This software is licensed as described in the file COPYING, which
     11  * you should have received as part of this distribution. The terms
     12  * are also available at https://curl.haxx.se/docs/copyright.html.
     13  *
     14  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
     15  * copies of the Software, and permit persons to whom the Software is
     16  * furnished to do so, under the terms of the COPYING file.
     17  *
     18  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
     19  * KIND, either express or implied.
     20  *
     21  ***************************************************************************/
     22 
     23 /*
     24  * Source file for all OpenSSL-specific code for the TLS/SSL layer. No code
     25  * but vtls.c should ever call or use these functions.
     26  */
     27 
     28 /*
     29  * The original SSLeay-using code for curl was written by Linas Vepstas and
     30  * Sampo Kellomaki 1998.
     31  */
     32 
     33 #include "curl_setup.h"
     34 
     35 #ifdef USE_OPENSSL
     36 
     37 #include <limits.h>
     38 
     39 #include "urldata.h"
     40 #include "sendf.h"
     41 #include "formdata.h" /* for the boundary function */
     42 #include "url.h" /* for the ssl config check function */
     43 #include "inet_pton.h"
     44 #include "openssl.h"
     45 #include "connect.h"
     46 #include "slist.h"
     47 #include "select.h"
     48 #include "vtls.h"
     49 #include "strcase.h"
     50 #include "hostcheck.h"
     51 #include "curl_printf.h"
     52 #include <openssl/ssl.h>
     53 #include <openssl/rand.h>
     54 #include <openssl/x509v3.h>
     55 #ifndef OPENSSL_NO_DSA
     56 #include <openssl/dsa.h>
     57 #endif
     58 #include <openssl/dh.h>
     59 #include <openssl/err.h>
     60 #include <openssl/md5.h>
     61 #include <openssl/conf.h>
     62 #include <openssl/bn.h>
     63 #include <openssl/rsa.h>
     64 #include <openssl/bio.h>
     65 #include <openssl/buffer.h>
     66 #include <openssl/pkcs12.h>
     67 
     68 #ifdef USE_AMISSL
     69 #include "amigaos.h"
     70 #endif
     71 
     72 #if (OPENSSL_VERSION_NUMBER >= 0x0090808fL) && !defined(OPENSSL_NO_OCSP)
     73 #include <openssl/ocsp.h>
     74 #endif
     75 
     76 #if (OPENSSL_VERSION_NUMBER >= 0x0090700fL) && /* 0.9.7 or later */     \
     77   !defined(OPENSSL_NO_ENGINE)
     78 #define USE_OPENSSL_ENGINE
     79 #include <openssl/engine.h>
     80 #endif
     81 
     82 #include "warnless.h"
     83 #include "non-ascii.h" /* for Curl_convert_from_utf8 prototype */
     84 
     85 /* The last #include files should be: */
     86 #include "curl_memory.h"
     87 #include "memdebug.h"
     88 
     89 /* Uncomment the ALLOW_RENEG line to a real #define if you want to allow TLS
     90    renegotiations when built with BoringSSL. Renegotiating is non-compliant
     91    with HTTP/2 and "an extremely dangerous protocol feature". Beware.
     92 
     93 #define ALLOW_RENEG 1
     94  */
     95 
     96 #ifndef OPENSSL_VERSION_NUMBER
     97 #error "OPENSSL_VERSION_NUMBER not defined"
     98 #endif
     99 
    100 #ifdef USE_OPENSSL_ENGINE
    101 #include <openssl/ui.h>
    102 #endif
    103 
    104 #if OPENSSL_VERSION_NUMBER >= 0x00909000L
    105 #define SSL_METHOD_QUAL const
    106 #else
    107 #define SSL_METHOD_QUAL
    108 #endif
    109 
    110 #if (OPENSSL_VERSION_NUMBER >= 0x10000000L)
    111 #define HAVE_ERR_REMOVE_THREAD_STATE 1
    112 #endif
    113 
    114 #if !defined(HAVE_SSLV2_CLIENT_METHOD) || \
    115   OPENSSL_VERSION_NUMBER >= 0x10100000L /* 1.1.0+ has no SSLv2 */
    116 #undef OPENSSL_NO_SSL2 /* undef first to avoid compiler warnings */
    117 #define OPENSSL_NO_SSL2
    118 #endif
    119 
    120 #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && /* OpenSSL 1.1.0+ */ \
    121     !(defined(LIBRESSL_VERSION_NUMBER) && \
    122       LIBRESSL_VERSION_NUMBER < 0x20700000L)
    123 #define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER
    124 #define HAVE_X509_GET0_EXTENSIONS 1 /* added in 1.1.0 -pre1 */
    125 #define HAVE_OPAQUE_EVP_PKEY 1 /* since 1.1.0 -pre3 */
    126 #define HAVE_OPAQUE_RSA_DSA_DH 1 /* since 1.1.0 -pre5 */
    127 #define CONST_EXTS const
    128 #define HAVE_ERR_REMOVE_THREAD_STATE_DEPRECATED 1
    129 
    130 /* funny typecast define due to difference in API */
    131 #ifdef LIBRESSL_VERSION_NUMBER
    132 #define ARG2_X509_signature_print (X509_ALGOR *)
    133 #else
    134 #define ARG2_X509_signature_print
    135 #endif
    136 
    137 #else
    138 /* For OpenSSL before 1.1.0 */
    139 #define ASN1_STRING_get0_data(x) ASN1_STRING_data(x)
    140 #define X509_get0_notBefore(x) X509_get_notBefore(x)
    141 #define X509_get0_notAfter(x) X509_get_notAfter(x)
    142 #define CONST_EXTS /* nope */
    143 #ifndef LIBRESSL_VERSION_NUMBER
    144 #define OpenSSL_version_num() SSLeay()
    145 #endif
    146 #endif
    147 
    148 #ifdef LIBRESSL_VERSION_NUMBER
    149 #define OpenSSL_version_num() LIBRESSL_VERSION_NUMBER
    150 #endif
    151 
    152 #if (OPENSSL_VERSION_NUMBER >= 0x1000200fL) && /* 1.0.2 or later */ \
    153     !(defined(LIBRESSL_VERSION_NUMBER) && \
    154       LIBRESSL_VERSION_NUMBER < 0x20700000L)
    155 #define HAVE_X509_GET0_SIGNATURE 1
    156 #endif
    157 
    158 #if OPENSSL_VERSION_NUMBER >= 0x10002003L && \
    159   OPENSSL_VERSION_NUMBER <= 0x10002FFFL && \
    160   !defined(OPENSSL_NO_COMP)
    161 #define HAVE_SSL_COMP_FREE_COMPRESSION_METHODS 1
    162 #endif
    163 
    164 #if (OPENSSL_VERSION_NUMBER < 0x0090808fL)
    165 /* not present in older OpenSSL */
    166 #define OPENSSL_load_builtin_modules(x)
    167 #endif
    168 
    169 /*
    170  * Whether SSL_CTX_set_keylog_callback is available.
    171  * OpenSSL: supported since 1.1.1 https://github.com/openssl/openssl/pull/2287
    172  * BoringSSL: supported since d28f59c27bac (committed 2015-11-19)
    173  * LibreSSL: unsupported in at least 2.7.2 (explicitly check for it since it
    174  *           lies and pretends to be OpenSSL 2.0.0).
    175  */
    176 #if (OPENSSL_VERSION_NUMBER >= 0x10101000L && \
    177      !defined(LIBRESSL_VERSION_NUMBER)) || \
    178     defined(OPENSSL_IS_BORINGSSL)
    179 #define HAVE_KEYLOG_CALLBACK
    180 #endif
    181 
    182 /* Whether SSL_CTX_set_ciphersuites is available.
    183  * OpenSSL: supported since 1.1.1 (commit a53b5be6a05)
    184  * BoringSSL: no
    185  * LibreSSL: no
    186  */
    187 #if ((OPENSSL_VERSION_NUMBER >= 0x10101000L) && \
    188      !defined(LIBRESSL_VERSION_NUMBER) &&       \
    189      !defined(OPENSSL_IS_BORINGSSL))
    190 #define HAVE_SSL_CTX_SET_CIPHERSUITES
    191 #define HAVE_SSL_CTX_SET_POST_HANDSHAKE_AUTH
    192 #endif
    193 
    194 #if defined(LIBRESSL_VERSION_NUMBER)
    195 #define OSSL_PACKAGE "LibreSSL"
    196 #elif defined(OPENSSL_IS_BORINGSSL)
    197 #define OSSL_PACKAGE "BoringSSL"
    198 #else
    199 #define OSSL_PACKAGE "OpenSSL"
    200 #endif
    201 
    202 #if (OPENSSL_VERSION_NUMBER >= 0x10100000L)
    203 /* up2date versions of OpenSSL maintain the default reasonably secure without
    204  * breaking compatibility, so it is better not to override the default by curl
    205  */
    206 #define DEFAULT_CIPHER_SELECTION NULL
    207 #else
    208 /* ... but it is not the case with old versions of OpenSSL */
    209 #define DEFAULT_CIPHER_SELECTION \
    210   "ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH"
    211 #endif
    212 
    213 #define ENABLE_SSLKEYLOGFILE
    214 
    215 #ifdef ENABLE_SSLKEYLOGFILE
    216 typedef struct ssl_tap_state {
    217   int master_key_length;
    218   unsigned char master_key[SSL_MAX_MASTER_KEY_LENGTH];
    219   unsigned char client_random[SSL3_RANDOM_SIZE];
    220 } ssl_tap_state_t;
    221 #endif /* ENABLE_SSLKEYLOGFILE */
    222 
    223 struct ssl_backend_data {
    224   /* these ones requires specific SSL-types */
    225   SSL_CTX* ctx;
    226   SSL*     handle;
    227   X509*    server_cert;
    228 #ifdef ENABLE_SSLKEYLOGFILE
    229   /* tap_state holds the last seen master key if we're logging them */
    230   ssl_tap_state_t tap_state;
    231 #endif
    232 };
    233 
    234 #define BACKEND connssl->backend
    235 
    236 /*
    237  * Number of bytes to read from the random number seed file. This must be
    238  * a finite value (because some entropy "files" like /dev/urandom have
    239  * an infinite length), but must be large enough to provide enough
    240  * entropy to properly seed OpenSSL's PRNG.
    241  */
    242 #define RAND_LOAD_LENGTH 1024
    243 
    244 #ifdef ENABLE_SSLKEYLOGFILE
    245 /* The fp for the open SSLKEYLOGFILE, or NULL if not open */
    246 static FILE *keylog_file_fp;
    247 
    248 #ifdef HAVE_KEYLOG_CALLBACK
    249 static void ossl_keylog_callback(const SSL *ssl, const char *line)
    250 {
    251   (void)ssl;
    252 
    253   /* Using fputs here instead of fprintf since libcurl's fprintf replacement
    254      may not be thread-safe. */
    255   if(keylog_file_fp && line && *line) {
    256     char stackbuf[256];
    257     char *buf;
    258     size_t linelen = strlen(line);
    259 
    260     if(linelen <= sizeof(stackbuf) - 2)
    261       buf = stackbuf;
    262     else {
    263       buf = malloc(linelen + 2);
    264       if(!buf)
    265         return;
    266     }
    267     memcpy(buf, line, linelen);
    268     buf[linelen] = '\n';
    269     buf[linelen + 1] = '\0';
    270 
    271     fputs(buf, keylog_file_fp);
    272     if(buf != stackbuf)
    273       free(buf);
    274   }
    275 }
    276 #else
    277 #define KEYLOG_PREFIX      "CLIENT_RANDOM "
    278 #define KEYLOG_PREFIX_LEN  (sizeof(KEYLOG_PREFIX) - 1)
    279 /*
    280  * tap_ssl_key is called by libcurl to make the CLIENT_RANDOMs if the OpenSSL
    281  * being used doesn't have native support for doing that.
    282  */
    283 static void tap_ssl_key(const SSL *ssl, ssl_tap_state_t *state)
    284 {
    285   const char *hex = "0123456789ABCDEF";
    286   int pos, i;
    287   char line[KEYLOG_PREFIX_LEN + 2 * SSL3_RANDOM_SIZE + 1 +
    288             2 * SSL_MAX_MASTER_KEY_LENGTH + 1 + 1];
    289   const SSL_SESSION *session = SSL_get_session(ssl);
    290   unsigned char client_random[SSL3_RANDOM_SIZE];
    291   unsigned char master_key[SSL_MAX_MASTER_KEY_LENGTH];
    292   int master_key_length = 0;
    293 
    294   if(!session || !keylog_file_fp)
    295     return;
    296 
    297 #if OPENSSL_VERSION_NUMBER >= 0x10100000L && \
    298     !(defined(LIBRESSL_VERSION_NUMBER) && \
    299       LIBRESSL_VERSION_NUMBER < 0x20700000L)
    300   /* ssl->s3 is not checked in openssl 1.1.0-pre6, but let's assume that
    301    * we have a valid SSL context if we have a non-NULL session. */
    302   SSL_get_client_random(ssl, client_random, SSL3_RANDOM_SIZE);
    303   master_key_length = (int)
    304     SSL_SESSION_get_master_key(session, master_key, SSL_MAX_MASTER_KEY_LENGTH);
    305 #else
    306   if(ssl->s3 && session->master_key_length > 0) {
    307     master_key_length = session->master_key_length;
    308     memcpy(master_key, session->master_key, session->master_key_length);
    309     memcpy(client_random, ssl->s3->client_random, SSL3_RANDOM_SIZE);
    310   }
    311 #endif
    312 
    313   if(master_key_length <= 0)
    314     return;
    315 
    316   /* Skip writing keys if there is no key or it did not change. */
    317   if(state->master_key_length == master_key_length &&
    318      !memcmp(state->master_key, master_key, master_key_length) &&
    319      !memcmp(state->client_random, client_random, SSL3_RANDOM_SIZE)) {
    320     return;
    321   }
    322 
    323   state->master_key_length = master_key_length;
    324   memcpy(state->master_key, master_key, master_key_length);
    325   memcpy(state->client_random, client_random, SSL3_RANDOM_SIZE);
    326 
    327   memcpy(line, KEYLOG_PREFIX, KEYLOG_PREFIX_LEN);
    328   pos = KEYLOG_PREFIX_LEN;
    329 
    330   /* Client Random for SSLv3/TLS */
    331   for(i = 0; i < SSL3_RANDOM_SIZE; i++) {
    332     line[pos++] = hex[client_random[i] >> 4];
    333     line[pos++] = hex[client_random[i] & 0xF];
    334   }
    335   line[pos++] = ' ';
    336 
    337   /* Master Secret (size is at most SSL_MAX_MASTER_KEY_LENGTH) */
    338   for(i = 0; i < master_key_length; i++) {
    339     line[pos++] = hex[master_key[i] >> 4];
    340     line[pos++] = hex[master_key[i] & 0xF];
    341   }
    342   line[pos++] = '\n';
    343   line[pos] = '\0';
    344 
    345   /* Using fputs here instead of fprintf since libcurl's fprintf replacement
    346      may not be thread-safe. */
    347   fputs(line, keylog_file_fp);
    348 }
    349 #endif /* !HAVE_KEYLOG_CALLBACK */
    350 #endif /* ENABLE_SSLKEYLOGFILE */
    351 
    352 static const char *SSL_ERROR_to_str(int err)
    353 {
    354   switch(err) {
    355   case SSL_ERROR_NONE:
    356     return "SSL_ERROR_NONE";
    357   case SSL_ERROR_SSL:
    358     return "SSL_ERROR_SSL";
    359   case SSL_ERROR_WANT_READ:
    360     return "SSL_ERROR_WANT_READ";
    361   case SSL_ERROR_WANT_WRITE:
    362     return "SSL_ERROR_WANT_WRITE";
    363   case SSL_ERROR_WANT_X509_LOOKUP:
    364     return "SSL_ERROR_WANT_X509_LOOKUP";
    365   case SSL_ERROR_SYSCALL:
    366     return "SSL_ERROR_SYSCALL";
    367   case SSL_ERROR_ZERO_RETURN:
    368     return "SSL_ERROR_ZERO_RETURN";
    369   case SSL_ERROR_WANT_CONNECT:
    370     return "SSL_ERROR_WANT_CONNECT";
    371   case SSL_ERROR_WANT_ACCEPT:
    372     return "SSL_ERROR_WANT_ACCEPT";
    373 #if defined(SSL_ERROR_WANT_ASYNC)
    374   case SSL_ERROR_WANT_ASYNC:
    375     return "SSL_ERROR_WANT_ASYNC";
    376 #endif
    377 #if defined(SSL_ERROR_WANT_ASYNC_JOB)
    378   case SSL_ERROR_WANT_ASYNC_JOB:
    379     return "SSL_ERROR_WANT_ASYNC_JOB";
    380 #endif
    381 #if defined(SSL_ERROR_WANT_EARLY)
    382   case SSL_ERROR_WANT_EARLY:
    383     return "SSL_ERROR_WANT_EARLY";
    384 #endif
    385   default:
    386     return "SSL_ERROR unknown";
    387   }
    388 }
    389 
    390 /* Return error string for last OpenSSL error
    391  */
    392 static char *ossl_strerror(unsigned long error, char *buf, size_t size)
    393 {
    394   ERR_error_string_n(error, buf, size);
    395   return buf;
    396 }
    397 
    398 /* Return an extra data index for the connection data.
    399  * This index can be used with SSL_get_ex_data() and SSL_set_ex_data().
    400  */
    401 static int ossl_get_ssl_conn_index(void)
    402 {
    403   static int ssl_ex_data_conn_index = -1;
    404   if(ssl_ex_data_conn_index < 0) {
    405     ssl_ex_data_conn_index = SSL_get_ex_new_index(0, NULL, NULL, NULL, NULL);
    406   }
    407   return ssl_ex_data_conn_index;
    408 }
    409 
    410 /* Return an extra data index for the sockindex.
    411  * This index can be used with SSL_get_ex_data() and SSL_set_ex_data().
    412  */
    413 static int ossl_get_ssl_sockindex_index(void)
    414 {
    415   static int ssl_ex_data_sockindex_index = -1;
    416   if(ssl_ex_data_sockindex_index < 0) {
    417     ssl_ex_data_sockindex_index = SSL_get_ex_new_index(0, NULL, NULL, NULL,
    418         NULL);
    419   }
    420   return ssl_ex_data_sockindex_index;
    421 }
    422 
    423 static int passwd_callback(char *buf, int num, int encrypting,
    424                            void *global_passwd)
    425 {
    426   DEBUGASSERT(0 == encrypting);
    427 
    428   if(!encrypting) {
    429     int klen = curlx_uztosi(strlen((char *)global_passwd));
    430     if(num > klen) {
    431       memcpy(buf, global_passwd, klen + 1);
    432       return klen;
    433     }
    434   }
    435   return 0;
    436 }
    437 
    438 /*
    439  * rand_enough() returns TRUE if we have seeded the random engine properly.
    440  */
    441 static bool rand_enough(void)
    442 {
    443   return (0 != RAND_status()) ? TRUE : FALSE;
    444 }
    445 
    446 static CURLcode Curl_ossl_seed(struct Curl_easy *data)
    447 {
    448   /* we have the "SSL is seeded" boolean static to prevent multiple
    449      time-consuming seedings in vain */
    450   static bool ssl_seeded = FALSE;
    451   char fname[256];
    452 
    453   if(ssl_seeded)
    454     return CURLE_OK;
    455 
    456   if(rand_enough()) {
    457     /* OpenSSL 1.1.0+ will return here */
    458     ssl_seeded = TRUE;
    459     return CURLE_OK;
    460   }
    461 
    462 #ifndef RANDOM_FILE
    463   /* if RANDOM_FILE isn't defined, we only perform this if an option tells
    464      us to! */
    465   if(data->set.str[STRING_SSL_RANDOM_FILE])
    466 #define RANDOM_FILE "" /* doesn't matter won't be used */
    467 #endif
    468   {
    469     /* let the option override the define */
    470     RAND_load_file((data->set.str[STRING_SSL_RANDOM_FILE]?
    471                     data->set.str[STRING_SSL_RANDOM_FILE]:
    472                     RANDOM_FILE),
    473                    RAND_LOAD_LENGTH);
    474     if(rand_enough())
    475       return CURLE_OK;
    476   }
    477 
    478 #if defined(HAVE_RAND_EGD)
    479   /* only available in OpenSSL 0.9.5 and later */
    480   /* EGD_SOCKET is set at configure time or not at all */
    481 #ifndef EGD_SOCKET
    482   /* If we don't have the define set, we only do this if the egd-option
    483      is set */
    484   if(data->set.str[STRING_SSL_EGDSOCKET])
    485 #define EGD_SOCKET "" /* doesn't matter won't be used */
    486 #endif
    487   {
    488     /* If there's an option and a define, the option overrides the
    489        define */
    490     int ret = RAND_egd(data->set.str[STRING_SSL_EGDSOCKET]?
    491                        data->set.str[STRING_SSL_EGDSOCKET]:EGD_SOCKET);
    492     if(-1 != ret) {
    493       if(rand_enough())
    494         return CURLE_OK;
    495     }
    496   }
    497 #endif
    498 
    499   /* fallback to a custom seeding of the PRNG using a hash based on a current
    500      time */
    501   do {
    502     unsigned char randb[64];
    503     size_t len = sizeof(randb);
    504     size_t i, i_max;
    505     for(i = 0, i_max = len / sizeof(struct curltime); i < i_max; ++i) {
    506       struct curltime tv = Curl_now();
    507       Curl_wait_ms(1);
    508       tv.tv_sec *= i + 1;
    509       tv.tv_usec *= (unsigned int)i + 2;
    510       tv.tv_sec ^= ((Curl_now().tv_sec + Curl_now().tv_usec) *
    511                     (i + 3)) << 8;
    512       tv.tv_usec ^= (unsigned int) ((Curl_now().tv_sec +
    513                                      Curl_now().tv_usec) *
    514                                     (i + 4)) << 16;
    515       memcpy(&randb[i * sizeof(struct curltime)], &tv,
    516              sizeof(struct curltime));
    517     }
    518     RAND_add(randb, (int)len, (double)len/2);
    519   } while(!rand_enough());
    520 
    521   /* generates a default path for the random seed file */
    522   fname[0] = 0; /* blank it first */
    523   RAND_file_name(fname, sizeof(fname));
    524   if(fname[0]) {
    525     /* we got a file name to try */
    526     RAND_load_file(fname, RAND_LOAD_LENGTH);
    527     if(rand_enough())
    528       return CURLE_OK;
    529   }
    530 
    531   infof(data, "libcurl is now using a weak random seed!\n");
    532   return (rand_enough() ? CURLE_OK :
    533     CURLE_SSL_CONNECT_ERROR /* confusing error code */);
    534 }
    535 
    536 #ifndef SSL_FILETYPE_ENGINE
    537 #define SSL_FILETYPE_ENGINE 42
    538 #endif
    539 #ifndef SSL_FILETYPE_PKCS12
    540 #define SSL_FILETYPE_PKCS12 43
    541 #endif
    542 static int do_file_type(const char *type)
    543 {
    544   if(!type || !type[0])
    545     return SSL_FILETYPE_PEM;
    546   if(strcasecompare(type, "PEM"))
    547     return SSL_FILETYPE_PEM;
    548   if(strcasecompare(type, "DER"))
    549     return SSL_FILETYPE_ASN1;
    550   if(strcasecompare(type, "ENG"))
    551     return SSL_FILETYPE_ENGINE;
    552   if(strcasecompare(type, "P12"))
    553     return SSL_FILETYPE_PKCS12;
    554   return -1;
    555 }
    556 
    557 #ifdef USE_OPENSSL_ENGINE
    558 /*
    559  * Supply default password to the engine user interface conversation.
    560  * The password is passed by OpenSSL engine from ENGINE_load_private_key()
    561  * last argument to the ui and can be obtained by UI_get0_user_data(ui) here.
    562  */
    563 static int ssl_ui_reader(UI *ui, UI_STRING *uis)
    564 {
    565   const char *password;
    566   switch(UI_get_string_type(uis)) {
    567   case UIT_PROMPT:
    568   case UIT_VERIFY:
    569     password = (const char *)UI_get0_user_data(ui);
    570     if(password && (UI_get_input_flags(uis) & UI_INPUT_FLAG_DEFAULT_PWD)) {
    571       UI_set_result(ui, uis, password);
    572       return 1;
    573     }
    574   default:
    575     break;
    576   }
    577   return (UI_method_get_reader(UI_OpenSSL()))(ui, uis);
    578 }
    579 
    580 /*
    581  * Suppress interactive request for a default password if available.
    582  */
    583 static int ssl_ui_writer(UI *ui, UI_STRING *uis)
    584 {
    585   switch(UI_get_string_type(uis)) {
    586   case UIT_PROMPT:
    587   case UIT_VERIFY:
    588     if(UI_get0_user_data(ui) &&
    589        (UI_get_input_flags(uis) & UI_INPUT_FLAG_DEFAULT_PWD)) {
    590       return 1;
    591     }
    592   default:
    593     break;
    594   }
    595   return (UI_method_get_writer(UI_OpenSSL()))(ui, uis);
    596 }
    597 
    598 /*
    599  * Check if a given string is a PKCS#11 URI
    600  */
    601 static bool is_pkcs11_uri(const char *string)
    602 {
    603   return (string && strncasecompare(string, "pkcs11:", 7));
    604 }
    605 
    606 #endif
    607 
    608 static CURLcode Curl_ossl_set_engine(struct Curl_easy *data,
    609                                      const char *engine);
    610 
    611 static
    612 int cert_stuff(struct connectdata *conn,
    613                SSL_CTX* ctx,
    614                char *cert_file,
    615                const char *cert_type,
    616                char *key_file,
    617                const char *key_type,
    618                char *key_passwd)
    619 {
    620   struct Curl_easy *data = conn->data;
    621   char error_buffer[256];
    622   bool check_privkey = TRUE;
    623 
    624   int file_type = do_file_type(cert_type);
    625 
    626   if(cert_file || (file_type == SSL_FILETYPE_ENGINE)) {
    627     SSL *ssl;
    628     X509 *x509;
    629     int cert_done = 0;
    630 
    631     if(key_passwd) {
    632       /* set the password in the callback userdata */
    633       SSL_CTX_set_default_passwd_cb_userdata(ctx, key_passwd);
    634       /* Set passwd callback: */
    635       SSL_CTX_set_default_passwd_cb(ctx, passwd_callback);
    636     }
    637 
    638 
    639     switch(file_type) {
    640     case SSL_FILETYPE_PEM:
    641       /* SSL_CTX_use_certificate_chain_file() only works on PEM files */
    642       if(SSL_CTX_use_certificate_chain_file(ctx,
    643                                             cert_file) != 1) {
    644         failf(data,
    645               "could not load PEM client certificate, " OSSL_PACKAGE
    646               " error %s, "
    647               "(no key found, wrong pass phrase, or wrong file format?)",
    648               ossl_strerror(ERR_get_error(), error_buffer,
    649                             sizeof(error_buffer)) );
    650         return 0;
    651       }
    652       break;
    653 
    654     case SSL_FILETYPE_ASN1:
    655       /* SSL_CTX_use_certificate_file() works with either PEM or ASN1, but
    656          we use the case above for PEM so this can only be performed with
    657          ASN1 files. */
    658       if(SSL_CTX_use_certificate_file(ctx,
    659                                       cert_file,
    660                                       file_type) != 1) {
    661         failf(data,
    662               "could not load ASN1 client certificate, " OSSL_PACKAGE
    663               " error %s, "
    664               "(no key found, wrong pass phrase, or wrong file format?)",
    665               ossl_strerror(ERR_get_error(), error_buffer,
    666                             sizeof(error_buffer)) );
    667         return 0;
    668       }
    669       break;
    670     case SSL_FILETYPE_ENGINE:
    671 #if defined(USE_OPENSSL_ENGINE) && defined(ENGINE_CTRL_GET_CMD_FROM_NAME)
    672       {
    673         /* Implicitly use pkcs11 engine if none was provided and the
    674          * cert_file is a PKCS#11 URI */
    675         if(!data->state.engine) {
    676           if(is_pkcs11_uri(cert_file)) {
    677             if(Curl_ossl_set_engine(data, "pkcs11") != CURLE_OK) {
    678               return 0;
    679             }
    680           }
    681         }
    682 
    683         if(data->state.engine) {
    684           const char *cmd_name = "LOAD_CERT_CTRL";
    685           struct {
    686             const char *cert_id;
    687             X509 *cert;
    688           } params;
    689 
    690           params.cert_id = cert_file;
    691           params.cert = NULL;
    692 
    693           /* Does the engine supports LOAD_CERT_CTRL ? */
    694           if(!ENGINE_ctrl(data->state.engine, ENGINE_CTRL_GET_CMD_FROM_NAME,
    695                           0, (void *)cmd_name, NULL)) {
    696             failf(data, "ssl engine does not support loading certificates");
    697             return 0;
    698           }
    699 
    700           /* Load the certificate from the engine */
    701           if(!ENGINE_ctrl_cmd(data->state.engine, cmd_name,
    702                               0, &params, NULL, 1)) {
    703             failf(data, "ssl engine cannot load client cert with id"
    704                   " '%s' [%s]", cert_file,
    705                   ossl_strerror(ERR_get_error(), error_buffer,
    706                                 sizeof(error_buffer)));
    707             return 0;
    708           }
    709 
    710           if(!params.cert) {
    711             failf(data, "ssl engine didn't initialized the certificate "
    712                   "properly.");
    713             return 0;
    714           }
    715 
    716           if(SSL_CTX_use_certificate(ctx, params.cert) != 1) {
    717             failf(data, "unable to set client certificate");
    718             X509_free(params.cert);
    719             return 0;
    720           }
    721           X509_free(params.cert); /* we don't need the handle any more... */
    722         }
    723         else {
    724           failf(data, "crypto engine not set, can't load certificate");
    725           return 0;
    726         }
    727       }
    728       break;
    729 #else
    730       failf(data, "file type ENG for certificate not implemented");
    731       return 0;
    732 #endif
    733 
    734     case SSL_FILETYPE_PKCS12:
    735     {
    736       BIO *fp = NULL;
    737       PKCS12 *p12 = NULL;
    738       EVP_PKEY *pri;
    739       STACK_OF(X509) *ca = NULL;
    740 
    741       fp = BIO_new(BIO_s_file());
    742       if(fp == NULL) {
    743         failf(data,
    744               "BIO_new return NULL, " OSSL_PACKAGE
    745               " error %s",
    746               ossl_strerror(ERR_get_error(), error_buffer,
    747                             sizeof(error_buffer)) );
    748         return 0;
    749       }
    750 
    751       if(BIO_read_filename(fp, cert_file) <= 0) {
    752         failf(data, "could not open PKCS12 file '%s'", cert_file);
    753         BIO_free(fp);
    754         return 0;
    755       }
    756       p12 = d2i_PKCS12_bio(fp, NULL);
    757       BIO_free(fp);
    758 
    759       if(!p12) {
    760         failf(data, "error reading PKCS12 file '%s'", cert_file);
    761         return 0;
    762       }
    763 
    764       PKCS12_PBE_add();
    765 
    766       if(!PKCS12_parse(p12, key_passwd, &pri, &x509,
    767                        &ca)) {
    768         failf(data,
    769               "could not parse PKCS12 file, check password, " OSSL_PACKAGE
    770               " error %s",
    771               ossl_strerror(ERR_get_error(), error_buffer,
    772                             sizeof(error_buffer)) );
    773         PKCS12_free(p12);
    774         return 0;
    775       }
    776 
    777       PKCS12_free(p12);
    778 
    779       if(SSL_CTX_use_certificate(ctx, x509) != 1) {
    780         failf(data,
    781               "could not load PKCS12 client certificate, " OSSL_PACKAGE
    782               " error %s",
    783               ossl_strerror(ERR_get_error(), error_buffer,
    784                             sizeof(error_buffer)) );
    785         goto fail;
    786       }
    787 
    788       if(SSL_CTX_use_PrivateKey(ctx, pri) != 1) {
    789         failf(data, "unable to use private key from PKCS12 file '%s'",
    790               cert_file);
    791         goto fail;
    792       }
    793 
    794       if(!SSL_CTX_check_private_key (ctx)) {
    795         failf(data, "private key from PKCS12 file '%s' "
    796               "does not match certificate in same file", cert_file);
    797         goto fail;
    798       }
    799       /* Set Certificate Verification chain */
    800       if(ca) {
    801         while(sk_X509_num(ca)) {
    802           /*
    803            * Note that sk_X509_pop() is used below to make sure the cert is
    804            * removed from the stack properly before getting passed to
    805            * SSL_CTX_add_extra_chain_cert(), which takes ownership. Previously
    806            * we used sk_X509_value() instead, but then we'd clean it in the
    807            * subsequent sk_X509_pop_free() call.
    808            */
    809           X509 *x = sk_X509_pop(ca);
    810           if(!SSL_CTX_add_client_CA(ctx, x)) {
    811             X509_free(x);
    812             failf(data, "cannot add certificate to client CA list");
    813             goto fail;
    814           }
    815           if(!SSL_CTX_add_extra_chain_cert(ctx, x)) {
    816             X509_free(x);
    817             failf(data, "cannot add certificate to certificate chain");
    818             goto fail;
    819           }
    820         }
    821       }
    822 
    823       cert_done = 1;
    824   fail:
    825       EVP_PKEY_free(pri);
    826       X509_free(x509);
    827 #ifdef USE_AMISSL
    828       sk_X509_pop_free(ca, Curl_amiga_X509_free);
    829 #else
    830       sk_X509_pop_free(ca, X509_free);
    831 #endif
    832       if(!cert_done)
    833         return 0; /* failure! */
    834       break;
    835     }
    836     default:
    837       failf(data, "not supported file type '%s' for certificate", cert_type);
    838       return 0;
    839     }
    840 
    841     if(!key_file)
    842       key_file = cert_file;
    843     else
    844       file_type = do_file_type(key_type);
    845 
    846     switch(file_type) {
    847     case SSL_FILETYPE_PEM:
    848       if(cert_done)
    849         break;
    850       /* FALLTHROUGH */
    851     case SSL_FILETYPE_ASN1:
    852       if(SSL_CTX_use_PrivateKey_file(ctx, key_file, file_type) != 1) {
    853         failf(data, "unable to set private key file: '%s' type %s",
    854               key_file, key_type?key_type:"PEM");
    855         return 0;
    856       }
    857       break;
    858     case SSL_FILETYPE_ENGINE:
    859 #ifdef USE_OPENSSL_ENGINE
    860       {                         /* XXXX still needs some work */
    861         EVP_PKEY *priv_key = NULL;
    862 
    863         /* Implicitly use pkcs11 engine if none was provided and the
    864          * key_file is a PKCS#11 URI */
    865         if(!data->state.engine) {
    866           if(is_pkcs11_uri(key_file)) {
    867             if(Curl_ossl_set_engine(data, "pkcs11") != CURLE_OK) {
    868               return 0;
    869             }
    870           }
    871         }
    872 
    873         if(data->state.engine) {
    874           UI_METHOD *ui_method =
    875             UI_create_method((char *)"curl user interface");
    876           if(!ui_method) {
    877             failf(data, "unable do create " OSSL_PACKAGE
    878                   " user-interface method");
    879             return 0;
    880           }
    881           UI_method_set_opener(ui_method, UI_method_get_opener(UI_OpenSSL()));
    882           UI_method_set_closer(ui_method, UI_method_get_closer(UI_OpenSSL()));
    883           UI_method_set_reader(ui_method, ssl_ui_reader);
    884           UI_method_set_writer(ui_method, ssl_ui_writer);
    885           /* the typecast below was added to please mingw32 */
    886           priv_key = (EVP_PKEY *)
    887             ENGINE_load_private_key(data->state.engine, key_file,
    888                                     ui_method,
    889                                     key_passwd);
    890           UI_destroy_method(ui_method);
    891           if(!priv_key) {
    892             failf(data, "failed to load private key from crypto engine");
    893             return 0;
    894           }
    895           if(SSL_CTX_use_PrivateKey(ctx, priv_key) != 1) {
    896             failf(data, "unable to set private key");
    897             EVP_PKEY_free(priv_key);
    898             return 0;
    899           }
    900           EVP_PKEY_free(priv_key);  /* we don't need the handle any more... */
    901         }
    902         else {
    903           failf(data, "crypto engine not set, can't load private key");
    904           return 0;
    905         }
    906       }
    907       break;
    908 #else
    909       failf(data, "file type ENG for private key not supported");
    910       return 0;
    911 #endif
    912     case SSL_FILETYPE_PKCS12:
    913       if(!cert_done) {
    914         failf(data, "file type P12 for private key not supported");
    915         return 0;
    916       }
    917       break;
    918     default:
    919       failf(data, "not supported file type for private key");
    920       return 0;
    921     }
    922 
    923     ssl = SSL_new(ctx);
    924     if(!ssl) {
    925       failf(data, "unable to create an SSL structure");
    926       return 0;
    927     }
    928 
    929     x509 = SSL_get_certificate(ssl);
    930 
    931     /* This version was provided by Evan Jordan and is supposed to not
    932        leak memory as the previous version: */
    933     if(x509) {
    934       EVP_PKEY *pktmp = X509_get_pubkey(x509);
    935       EVP_PKEY_copy_parameters(pktmp, SSL_get_privatekey(ssl));
    936       EVP_PKEY_free(pktmp);
    937     }
    938 
    939 #if !defined(OPENSSL_NO_RSA) && !defined(OPENSSL_IS_BORINGSSL)
    940     {
    941       /* If RSA is used, don't check the private key if its flags indicate
    942        * it doesn't support it. */
    943       EVP_PKEY *priv_key = SSL_get_privatekey(ssl);
    944       int pktype;
    945 #ifdef HAVE_OPAQUE_EVP_PKEY
    946       pktype = EVP_PKEY_id(priv_key);
    947 #else
    948       pktype = priv_key->type;
    949 #endif
    950       if(pktype == EVP_PKEY_RSA) {
    951         RSA *rsa = EVP_PKEY_get1_RSA(priv_key);
    952         if(RSA_flags(rsa) & RSA_METHOD_FLAG_NO_CHECK)
    953           check_privkey = FALSE;
    954         RSA_free(rsa); /* Decrement reference count */
    955       }
    956     }
    957 #endif
    958 
    959     SSL_free(ssl);
    960 
    961     /* If we are using DSA, we can copy the parameters from
    962      * the private key */
    963 
    964     if(check_privkey == TRUE) {
    965       /* Now we know that a key and cert have been set against
    966        * the SSL context */
    967       if(!SSL_CTX_check_private_key(ctx)) {
    968         failf(data, "Private key does not match the certificate public key");
    969         return 0;
    970       }
    971     }
    972   }
    973   return 1;
    974 }
    975 
    976 /* returns non-zero on failure */
    977 static int x509_name_oneline(X509_NAME *a, char *buf, size_t size)
    978 {
    979 #if 0
    980   return X509_NAME_oneline(a, buf, size);
    981 #else
    982   BIO *bio_out = BIO_new(BIO_s_mem());
    983   BUF_MEM *biomem;
    984   int rc;
    985 
    986   if(!bio_out)
    987     return 1; /* alloc failed! */
    988 
    989   rc = X509_NAME_print_ex(bio_out, a, 0, XN_FLAG_SEP_SPLUS_SPC);
    990   BIO_get_mem_ptr(bio_out, &biomem);
    991 
    992   if((size_t)biomem->length < size)
    993     size = biomem->length;
    994   else
    995     size--; /* don't overwrite the buffer end */
    996 
    997   memcpy(buf, biomem->data, size);
    998   buf[size] = 0;
    999 
   1000   BIO_free(bio_out);
   1001 
   1002   return !rc;
   1003 #endif
   1004 }
   1005 
   1006 /**
   1007  * Global SSL init
   1008  *
   1009  * @retval 0 error initializing SSL
   1010  * @retval 1 SSL initialized successfully
   1011  */
   1012 static int Curl_ossl_init(void)
   1013 {
   1014 #ifdef ENABLE_SSLKEYLOGFILE
   1015   char *keylog_file_name;
   1016 #endif
   1017 
   1018   OPENSSL_load_builtin_modules();
   1019 
   1020 #ifdef USE_OPENSSL_ENGINE
   1021   ENGINE_load_builtin_engines();
   1022 #endif
   1023 
   1024   /* OPENSSL_config(NULL); is "strongly recommended" to use but unfortunately
   1025      that function makes an exit() call on wrongly formatted config files
   1026      which makes it hard to use in some situations. OPENSSL_config() itself
   1027      calls CONF_modules_load_file() and we use that instead and we ignore
   1028      its return code! */
   1029 
   1030   /* CONF_MFLAGS_DEFAULT_SECTION introduced some time between 0.9.8b and
   1031      0.9.8e */
   1032 #ifndef CONF_MFLAGS_DEFAULT_SECTION
   1033 #define CONF_MFLAGS_DEFAULT_SECTION 0x0
   1034 #endif
   1035 
   1036 #ifndef CURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG
   1037   CONF_modules_load_file(NULL, NULL,
   1038                          CONF_MFLAGS_DEFAULT_SECTION|
   1039                          CONF_MFLAGS_IGNORE_MISSING_FILE);
   1040 #endif
   1041 
   1042 #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && \
   1043     !defined(LIBRESSL_VERSION_NUMBER)
   1044   /* OpenSSL 1.1.0+ takes care of initialization itself */
   1045 #else
   1046   /* Lets get nice error messages */
   1047   SSL_load_error_strings();
   1048 
   1049   /* Init the global ciphers and digests */
   1050   if(!SSLeay_add_ssl_algorithms())
   1051     return 0;
   1052 
   1053   OpenSSL_add_all_algorithms();
   1054 #endif
   1055 
   1056 #ifdef ENABLE_SSLKEYLOGFILE
   1057   if(!keylog_file_fp) {
   1058     keylog_file_name = curl_getenv("SSLKEYLOGFILE");
   1059     if(keylog_file_name) {
   1060       keylog_file_fp = fopen(keylog_file_name, FOPEN_APPENDTEXT);
   1061       if(keylog_file_fp) {
   1062 #ifdef WIN32
   1063         if(setvbuf(keylog_file_fp, NULL, _IONBF, 0))
   1064 #else
   1065         if(setvbuf(keylog_file_fp, NULL, _IOLBF, 4096))
   1066 #endif
   1067         {
   1068           fclose(keylog_file_fp);
   1069           keylog_file_fp = NULL;
   1070         }
   1071       }
   1072       Curl_safefree(keylog_file_name);
   1073     }
   1074   }
   1075 #endif
   1076 
   1077   /* Initialize the extra data indexes */
   1078   if(ossl_get_ssl_conn_index() < 0 || ossl_get_ssl_sockindex_index() < 0)
   1079     return 0;
   1080 
   1081   return 1;
   1082 }
   1083 
   1084 /* Global cleanup */
   1085 static void Curl_ossl_cleanup(void)
   1086 {
   1087 #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && \
   1088     !defined(LIBRESSL_VERSION_NUMBER)
   1089   /* OpenSSL 1.1 deprecates all these cleanup functions and
   1090      turns them into no-ops in OpenSSL 1.0 compatibility mode */
   1091 #else
   1092   /* Free ciphers and digests lists */
   1093   EVP_cleanup();
   1094 
   1095 #ifdef USE_OPENSSL_ENGINE
   1096   /* Free engine list */
   1097   ENGINE_cleanup();
   1098 #endif
   1099 
   1100   /* Free OpenSSL error strings */
   1101   ERR_free_strings();
   1102 
   1103   /* Free thread local error state, destroying hash upon zero refcount */
   1104 #ifdef HAVE_ERR_REMOVE_THREAD_STATE
   1105   ERR_remove_thread_state(NULL);
   1106 #else
   1107   ERR_remove_state(0);
   1108 #endif
   1109 
   1110   /* Free all memory allocated by all configuration modules */
   1111   CONF_modules_free();
   1112 
   1113 #ifdef HAVE_SSL_COMP_FREE_COMPRESSION_METHODS
   1114   SSL_COMP_free_compression_methods();
   1115 #endif
   1116 #endif
   1117 
   1118 #ifdef ENABLE_SSLKEYLOGFILE
   1119   if(keylog_file_fp) {
   1120     fclose(keylog_file_fp);
   1121     keylog_file_fp = NULL;
   1122   }
   1123 #endif
   1124 }
   1125 
   1126 /*
   1127  * This function is used to determine connection status.
   1128  *
   1129  * Return codes:
   1130  *     1 means the connection is still in place
   1131  *     0 means the connection has been closed
   1132  *    -1 means the connection status is unknown
   1133  */
   1134 static int Curl_ossl_check_cxn(struct connectdata *conn)
   1135 {
   1136   /* SSL_peek takes data out of the raw recv buffer without peeking so we use
   1137      recv MSG_PEEK instead. Bug #795 */
   1138 #ifdef MSG_PEEK
   1139   char buf;
   1140   ssize_t nread;
   1141   nread = recv((RECV_TYPE_ARG1)conn->sock[FIRSTSOCKET], (RECV_TYPE_ARG2)&buf,
   1142                (RECV_TYPE_ARG3)1, (RECV_TYPE_ARG4)MSG_PEEK);
   1143   if(nread == 0)
   1144     return 0; /* connection has been closed */
   1145   if(nread == 1)
   1146     return 1; /* connection still in place */
   1147   else if(nread == -1) {
   1148       int err = SOCKERRNO;
   1149       if(err == EINPROGRESS ||
   1150 #if defined(EAGAIN) && (EAGAIN != EWOULDBLOCK)
   1151          err == EAGAIN ||
   1152 #endif
   1153          err == EWOULDBLOCK)
   1154         return 1; /* connection still in place */
   1155       if(err == ECONNRESET ||
   1156 #ifdef ECONNABORTED
   1157          err == ECONNABORTED ||
   1158 #endif
   1159 #ifdef ENETDOWN
   1160          err == ENETDOWN ||
   1161 #endif
   1162 #ifdef ENETRESET
   1163          err == ENETRESET ||
   1164 #endif
   1165 #ifdef ESHUTDOWN
   1166          err == ESHUTDOWN ||
   1167 #endif
   1168 #ifdef ETIMEDOUT
   1169          err == ETIMEDOUT ||
   1170 #endif
   1171          err == ENOTCONN)
   1172         return 0; /* connection has been closed */
   1173   }
   1174 #endif
   1175   return -1; /* connection status unknown */
   1176 }
   1177 
   1178 /* Selects an OpenSSL crypto engine
   1179  */
   1180 static CURLcode Curl_ossl_set_engine(struct Curl_easy *data,
   1181                                      const char *engine)
   1182 {
   1183 #ifdef USE_OPENSSL_ENGINE
   1184   ENGINE *e;
   1185 
   1186 #if OPENSSL_VERSION_NUMBER >= 0x00909000L
   1187   e = ENGINE_by_id(engine);
   1188 #else
   1189   /* avoid memory leak */
   1190   for(e = ENGINE_get_first(); e; e = ENGINE_get_next(e)) {
   1191     const char *e_id = ENGINE_get_id(e);
   1192     if(!strcmp(engine, e_id))
   1193       break;
   1194   }
   1195 #endif
   1196 
   1197   if(!e) {
   1198     failf(data, "SSL Engine '%s' not found", engine);
   1199     return CURLE_SSL_ENGINE_NOTFOUND;
   1200   }
   1201 
   1202   if(data->state.engine) {
   1203     ENGINE_finish(data->state.engine);
   1204     ENGINE_free(data->state.engine);
   1205     data->state.engine = NULL;
   1206   }
   1207   if(!ENGINE_init(e)) {
   1208     char buf[256];
   1209 
   1210     ENGINE_free(e);
   1211     failf(data, "Failed to initialise SSL Engine '%s':\n%s",
   1212           engine, ossl_strerror(ERR_get_error(), buf, sizeof(buf)));
   1213     return CURLE_SSL_ENGINE_INITFAILED;
   1214   }
   1215   data->state.engine = e;
   1216   return CURLE_OK;
   1217 #else
   1218   (void)engine;
   1219   failf(data, "SSL Engine not supported");
   1220   return CURLE_SSL_ENGINE_NOTFOUND;
   1221 #endif
   1222 }
   1223 
   1224 /* Sets engine as default for all SSL operations
   1225  */
   1226 static CURLcode Curl_ossl_set_engine_default(struct Curl_easy *data)
   1227 {
   1228 #ifdef USE_OPENSSL_ENGINE
   1229   if(data->state.engine) {
   1230     if(ENGINE_set_default(data->state.engine, ENGINE_METHOD_ALL) > 0) {
   1231       infof(data, "set default crypto engine '%s'\n",
   1232             ENGINE_get_id(data->state.engine));
   1233     }
   1234     else {
   1235       failf(data, "set default crypto engine '%s' failed",
   1236             ENGINE_get_id(data->state.engine));
   1237       return CURLE_SSL_ENGINE_SETFAILED;
   1238     }
   1239   }
   1240 #else
   1241   (void) data;
   1242 #endif
   1243   return CURLE_OK;
   1244 }
   1245 
   1246 /* Return list of OpenSSL crypto engine names.
   1247  */
   1248 static struct curl_slist *Curl_ossl_engines_list(struct Curl_easy *data)
   1249 {
   1250   struct curl_slist *list = NULL;
   1251 #ifdef USE_OPENSSL_ENGINE
   1252   struct curl_slist *beg;
   1253   ENGINE *e;
   1254 
   1255   for(e = ENGINE_get_first(); e; e = ENGINE_get_next(e)) {
   1256     beg = curl_slist_append(list, ENGINE_get_id(e));
   1257     if(!beg) {
   1258       curl_slist_free_all(list);
   1259       return NULL;
   1260     }
   1261     list = beg;
   1262   }
   1263 #endif
   1264   (void) data;
   1265   return list;
   1266 }
   1267 
   1268 
   1269 static void ossl_close(struct ssl_connect_data *connssl)
   1270 {
   1271   if(BACKEND->handle) {
   1272     (void)SSL_shutdown(BACKEND->handle);
   1273     SSL_set_connect_state(BACKEND->handle);
   1274 
   1275     SSL_free(BACKEND->handle);
   1276     BACKEND->handle = NULL;
   1277   }
   1278   if(BACKEND->ctx) {
   1279     SSL_CTX_free(BACKEND->ctx);
   1280     BACKEND->ctx = NULL;
   1281   }
   1282 }
   1283 
   1284 /*
   1285  * This function is called when an SSL connection is closed.
   1286  */
   1287 static void Curl_ossl_close(struct connectdata *conn, int sockindex)
   1288 {
   1289   ossl_close(&conn->ssl[sockindex]);
   1290   ossl_close(&conn->proxy_ssl[sockindex]);
   1291 }
   1292 
   1293 /*
   1294  * This function is called to shut down the SSL layer but keep the
   1295  * socket open (CCC - Clear Command Channel)
   1296  */
   1297 static int Curl_ossl_shutdown(struct connectdata *conn, int sockindex)
   1298 {
   1299   int retval = 0;
   1300   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   1301   struct Curl_easy *data = conn->data;
   1302   char buf[256]; /* We will use this for the OpenSSL error buffer, so it has
   1303                     to be at least 256 bytes long. */
   1304   unsigned long sslerror;
   1305   ssize_t nread;
   1306   int buffsize;
   1307   int err;
   1308   bool done = FALSE;
   1309 
   1310   /* This has only been tested on the proftpd server, and the mod_tls code
   1311      sends a close notify alert without waiting for a close notify alert in
   1312      response. Thus we wait for a close notify alert from the server, but
   1313      we do not send one. Let's hope other servers do the same... */
   1314 
   1315   if(data->set.ftp_ccc == CURLFTPSSL_CCC_ACTIVE)
   1316       (void)SSL_shutdown(BACKEND->handle);
   1317 
   1318   if(BACKEND->handle) {
   1319     buffsize = (int)sizeof(buf);
   1320     while(!done) {
   1321       int what = SOCKET_READABLE(conn->sock[sockindex],
   1322                                  SSL_SHUTDOWN_TIMEOUT);
   1323       if(what > 0) {
   1324         ERR_clear_error();
   1325 
   1326         /* Something to read, let's do it and hope that it is the close
   1327            notify alert from the server */
   1328         nread = (ssize_t)SSL_read(BACKEND->handle, buf, buffsize);
   1329         err = SSL_get_error(BACKEND->handle, (int)nread);
   1330 
   1331         switch(err) {
   1332         case SSL_ERROR_NONE: /* this is not an error */
   1333         case SSL_ERROR_ZERO_RETURN: /* no more data */
   1334           /* This is the expected response. There was no data but only
   1335              the close notify alert */
   1336           done = TRUE;
   1337           break;
   1338         case SSL_ERROR_WANT_READ:
   1339           /* there's data pending, re-invoke SSL_read() */
   1340           infof(data, "SSL_ERROR_WANT_READ\n");
   1341           break;
   1342         case SSL_ERROR_WANT_WRITE:
   1343           /* SSL wants a write. Really odd. Let's bail out. */
   1344           infof(data, "SSL_ERROR_WANT_WRITE\n");
   1345           done = TRUE;
   1346           break;
   1347         default:
   1348           /* openssl/ssl.h says "look at error stack/return value/errno" */
   1349           sslerror = ERR_get_error();
   1350           failf(conn->data, OSSL_PACKAGE " SSL_read on shutdown: %s, errno %d",
   1351                 (sslerror ?
   1352                  ossl_strerror(sslerror, buf, sizeof(buf)) :
   1353                  SSL_ERROR_to_str(err)),
   1354                 SOCKERRNO);
   1355           done = TRUE;
   1356           break;
   1357         }
   1358       }
   1359       else if(0 == what) {
   1360         /* timeout */
   1361         failf(data, "SSL shutdown timeout");
   1362         done = TRUE;
   1363       }
   1364       else {
   1365         /* anything that gets here is fatally bad */
   1366         failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
   1367         retval = -1;
   1368         done = TRUE;
   1369       }
   1370     } /* while()-loop for the select() */
   1371 
   1372     if(data->set.verbose) {
   1373 #ifdef HAVE_SSL_GET_SHUTDOWN
   1374       switch(SSL_get_shutdown(BACKEND->handle)) {
   1375       case SSL_SENT_SHUTDOWN:
   1376         infof(data, "SSL_get_shutdown() returned SSL_SENT_SHUTDOWN\n");
   1377         break;
   1378       case SSL_RECEIVED_SHUTDOWN:
   1379         infof(data, "SSL_get_shutdown() returned SSL_RECEIVED_SHUTDOWN\n");
   1380         break;
   1381       case SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN:
   1382         infof(data, "SSL_get_shutdown() returned SSL_SENT_SHUTDOWN|"
   1383               "SSL_RECEIVED__SHUTDOWN\n");
   1384         break;
   1385       }
   1386 #endif
   1387     }
   1388 
   1389     SSL_free(BACKEND->handle);
   1390     BACKEND->handle = NULL;
   1391   }
   1392   return retval;
   1393 }
   1394 
   1395 static void Curl_ossl_session_free(void *ptr)
   1396 {
   1397   /* free the ID */
   1398   SSL_SESSION_free(ptr);
   1399 }
   1400 
   1401 /*
   1402  * This function is called when the 'data' struct is going away. Close
   1403  * down everything and free all resources!
   1404  */
   1405 static void Curl_ossl_close_all(struct Curl_easy *data)
   1406 {
   1407 #ifdef USE_OPENSSL_ENGINE
   1408   if(data->state.engine) {
   1409     ENGINE_finish(data->state.engine);
   1410     ENGINE_free(data->state.engine);
   1411     data->state.engine = NULL;
   1412   }
   1413 #else
   1414   (void)data;
   1415 #endif
   1416 #if !defined(HAVE_ERR_REMOVE_THREAD_STATE_DEPRECATED) && \
   1417   defined(HAVE_ERR_REMOVE_THREAD_STATE)
   1418   /* OpenSSL 1.0.1 and 1.0.2 build an error queue that is stored per-thread
   1419      so we need to clean it here in case the thread will be killed. All OpenSSL
   1420      code should extract the error in association with the error so clearing
   1421      this queue here should be harmless at worst. */
   1422   ERR_remove_thread_state(NULL);
   1423 #endif
   1424 }
   1425 
   1426 /* ====================================================== */
   1427 
   1428 /*
   1429  * Match subjectAltName against the host name. This requires a conversion
   1430  * in CURL_DOES_CONVERSIONS builds.
   1431  */
   1432 static bool subj_alt_hostcheck(struct Curl_easy *data,
   1433                                const char *match_pattern, const char *hostname,
   1434                                const char *dispname)
   1435 #ifdef CURL_DOES_CONVERSIONS
   1436 {
   1437   bool res = FALSE;
   1438 
   1439   /* Curl_cert_hostcheck uses host encoding, but we get ASCII from
   1440      OpenSSl.
   1441    */
   1442   char *match_pattern2 = strdup(match_pattern);
   1443 
   1444   if(match_pattern2) {
   1445     if(Curl_convert_from_network(data, match_pattern2,
   1446                                 strlen(match_pattern2)) == CURLE_OK) {
   1447       if(Curl_cert_hostcheck(match_pattern2, hostname)) {
   1448         res = TRUE;
   1449         infof(data,
   1450                 " subjectAltName: host \"%s\" matched cert's \"%s\"\n",
   1451                 dispname, match_pattern2);
   1452       }
   1453     }
   1454     free(match_pattern2);
   1455   }
   1456   else {
   1457     failf(data,
   1458         "SSL: out of memory when allocating temporary for subjectAltName");
   1459   }
   1460   return res;
   1461 }
   1462 #else
   1463 {
   1464 #ifdef CURL_DISABLE_VERBOSE_STRINGS
   1465   (void)dispname;
   1466   (void)data;
   1467 #endif
   1468   if(Curl_cert_hostcheck(match_pattern, hostname)) {
   1469     infof(data, " subjectAltName: host \"%s\" matched cert's \"%s\"\n",
   1470                   dispname, match_pattern);
   1471     return TRUE;
   1472   }
   1473   return FALSE;
   1474 }
   1475 #endif
   1476 
   1477 
   1478 /* Quote from RFC2818 section 3.1 "Server Identity"
   1479 
   1480    If a subjectAltName extension of type dNSName is present, that MUST
   1481    be used as the identity. Otherwise, the (most specific) Common Name
   1482    field in the Subject field of the certificate MUST be used. Although
   1483    the use of the Common Name is existing practice, it is deprecated and
   1484    Certification Authorities are encouraged to use the dNSName instead.
   1485 
   1486    Matching is performed using the matching rules specified by
   1487    [RFC2459].  If more than one identity of a given type is present in
   1488    the certificate (e.g., more than one dNSName name, a match in any one
   1489    of the set is considered acceptable.) Names may contain the wildcard
   1490    character * which is considered to match any single domain name
   1491    component or component fragment. E.g., *.a.com matches foo.a.com but
   1492    not bar.foo.a.com. f*.com matches foo.com but not bar.com.
   1493 
   1494    In some cases, the URI is specified as an IP address rather than a
   1495    hostname. In this case, the iPAddress subjectAltName must be present
   1496    in the certificate and must exactly match the IP in the URI.
   1497 
   1498 */
   1499 static CURLcode verifyhost(struct connectdata *conn, X509 *server_cert)
   1500 {
   1501   bool matched = FALSE;
   1502   int target = GEN_DNS; /* target type, GEN_DNS or GEN_IPADD */
   1503   size_t addrlen = 0;
   1504   struct Curl_easy *data = conn->data;
   1505   STACK_OF(GENERAL_NAME) *altnames;
   1506 #ifdef ENABLE_IPV6
   1507   struct in6_addr addr;
   1508 #else
   1509   struct in_addr addr;
   1510 #endif
   1511   CURLcode result = CURLE_OK;
   1512   bool dNSName = FALSE; /* if a dNSName field exists in the cert */
   1513   bool iPAddress = FALSE; /* if a iPAddress field exists in the cert */
   1514   const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
   1515     conn->host.name;
   1516   const char * const dispname = SSL_IS_PROXY() ?
   1517     conn->http_proxy.host.dispname : conn->host.dispname;
   1518 
   1519 #ifdef ENABLE_IPV6
   1520   if(conn->bits.ipv6_ip &&
   1521      Curl_inet_pton(AF_INET6, hostname, &addr)) {
   1522     target = GEN_IPADD;
   1523     addrlen = sizeof(struct in6_addr);
   1524   }
   1525   else
   1526 #endif
   1527     if(Curl_inet_pton(AF_INET, hostname, &addr)) {
   1528       target = GEN_IPADD;
   1529       addrlen = sizeof(struct in_addr);
   1530     }
   1531 
   1532   /* get a "list" of alternative names */
   1533   altnames = X509_get_ext_d2i(server_cert, NID_subject_alt_name, NULL, NULL);
   1534 
   1535   if(altnames) {
   1536     int numalts;
   1537     int i;
   1538     bool dnsmatched = FALSE;
   1539     bool ipmatched = FALSE;
   1540 
   1541     /* get amount of alternatives, RFC2459 claims there MUST be at least
   1542        one, but we don't depend on it... */
   1543     numalts = sk_GENERAL_NAME_num(altnames);
   1544 
   1545     /* loop through all alternatives - until a dnsmatch */
   1546     for(i = 0; (i < numalts) && !dnsmatched; i++) {
   1547       /* get a handle to alternative name number i */
   1548       const GENERAL_NAME *check = sk_GENERAL_NAME_value(altnames, i);
   1549 
   1550       if(check->type == GEN_DNS)
   1551         dNSName = TRUE;
   1552       else if(check->type == GEN_IPADD)
   1553         iPAddress = TRUE;
   1554 
   1555       /* only check alternatives of the same type the target is */
   1556       if(check->type == target) {
   1557         /* get data and length */
   1558         const char *altptr = (char *)ASN1_STRING_get0_data(check->d.ia5);
   1559         size_t altlen = (size_t) ASN1_STRING_length(check->d.ia5);
   1560 
   1561         switch(target) {
   1562         case GEN_DNS: /* name/pattern comparison */
   1563           /* The OpenSSL man page explicitly says: "In general it cannot be
   1564              assumed that the data returned by ASN1_STRING_data() is null
   1565              terminated or does not contain embedded nulls." But also that
   1566              "The actual format of the data will depend on the actual string
   1567              type itself: for example for and IA5String the data will be ASCII"
   1568 
   1569              Gisle researched the OpenSSL sources:
   1570              "I checked the 0.9.6 and 0.9.8 sources before my patch and
   1571              it always 0-terminates an IA5String."
   1572           */
   1573           if((altlen == strlen(altptr)) &&
   1574              /* if this isn't true, there was an embedded zero in the name
   1575                 string and we cannot match it. */
   1576              subj_alt_hostcheck(data, altptr, hostname, dispname)) {
   1577             dnsmatched = TRUE;
   1578           }
   1579           break;
   1580 
   1581         case GEN_IPADD: /* IP address comparison */
   1582           /* compare alternative IP address if the data chunk is the same size
   1583              our server IP address is */
   1584           if((altlen == addrlen) && !memcmp(altptr, &addr, altlen)) {
   1585             ipmatched = TRUE;
   1586             infof(data,
   1587                   " subjectAltName: host \"%s\" matched cert's IP address!\n",
   1588                   dispname);
   1589           }
   1590           break;
   1591         }
   1592       }
   1593     }
   1594     GENERAL_NAMES_free(altnames);
   1595 
   1596     if(dnsmatched || ipmatched)
   1597       matched = TRUE;
   1598   }
   1599 
   1600   if(matched)
   1601     /* an alternative name matched */
   1602     ;
   1603   else if(dNSName || iPAddress) {
   1604     infof(data, " subjectAltName does not match %s\n", dispname);
   1605     failf(data, "SSL: no alternative certificate subject name matches "
   1606           "target host name '%s'", dispname);
   1607     result = CURLE_PEER_FAILED_VERIFICATION;
   1608   }
   1609   else {
   1610     /* we have to look to the last occurrence of a commonName in the
   1611        distinguished one to get the most significant one. */
   1612     int j, i = -1;
   1613 
   1614     /* The following is done because of a bug in 0.9.6b */
   1615 
   1616     unsigned char *nulstr = (unsigned char *)"";
   1617     unsigned char *peer_CN = nulstr;
   1618 
   1619     X509_NAME *name = X509_get_subject_name(server_cert);
   1620     if(name)
   1621       while((j = X509_NAME_get_index_by_NID(name, NID_commonName, i)) >= 0)
   1622         i = j;
   1623 
   1624     /* we have the name entry and we will now convert this to a string
   1625        that we can use for comparison. Doing this we support BMPstring,
   1626        UTF8 etc. */
   1627 
   1628     if(i >= 0) {
   1629       ASN1_STRING *tmp =
   1630         X509_NAME_ENTRY_get_data(X509_NAME_get_entry(name, i));
   1631 
   1632       /* In OpenSSL 0.9.7d and earlier, ASN1_STRING_to_UTF8 fails if the input
   1633          is already UTF-8 encoded. We check for this case and copy the raw
   1634          string manually to avoid the problem. This code can be made
   1635          conditional in the future when OpenSSL has been fixed. Work-around
   1636          brought by Alexis S. L. Carvalho. */
   1637       if(tmp) {
   1638         if(ASN1_STRING_type(tmp) == V_ASN1_UTF8STRING) {
   1639           j = ASN1_STRING_length(tmp);
   1640           if(j >= 0) {
   1641             peer_CN = OPENSSL_malloc(j + 1);
   1642             if(peer_CN) {
   1643               memcpy(peer_CN, ASN1_STRING_get0_data(tmp), j);
   1644               peer_CN[j] = '\0';
   1645             }
   1646           }
   1647         }
   1648         else /* not a UTF8 name */
   1649           j = ASN1_STRING_to_UTF8(&peer_CN, tmp);
   1650 
   1651         if(peer_CN && (curlx_uztosi(strlen((char *)peer_CN)) != j)) {
   1652           /* there was a terminating zero before the end of string, this
   1653              cannot match and we return failure! */
   1654           failf(data, "SSL: illegal cert name field");
   1655           result = CURLE_PEER_FAILED_VERIFICATION;
   1656         }
   1657       }
   1658     }
   1659 
   1660     if(peer_CN == nulstr)
   1661        peer_CN = NULL;
   1662     else {
   1663       /* convert peer_CN from UTF8 */
   1664       CURLcode rc = Curl_convert_from_utf8(data, (char *)peer_CN,
   1665                                            strlen((char *)peer_CN));
   1666       /* Curl_convert_from_utf8 calls failf if unsuccessful */
   1667       if(rc) {
   1668         OPENSSL_free(peer_CN);
   1669         return rc;
   1670       }
   1671     }
   1672 
   1673     if(result)
   1674       /* error already detected, pass through */
   1675       ;
   1676     else if(!peer_CN) {
   1677       failf(data,
   1678             "SSL: unable to obtain common name from peer certificate");
   1679       result = CURLE_PEER_FAILED_VERIFICATION;
   1680     }
   1681     else if(!Curl_cert_hostcheck((const char *)peer_CN, hostname)) {
   1682       failf(data, "SSL: certificate subject name '%s' does not match "
   1683             "target host name '%s'", peer_CN, dispname);
   1684       result = CURLE_PEER_FAILED_VERIFICATION;
   1685     }
   1686     else {
   1687       infof(data, " common name: %s (matched)\n", peer_CN);
   1688     }
   1689     if(peer_CN)
   1690       OPENSSL_free(peer_CN);
   1691   }
   1692 
   1693   return result;
   1694 }
   1695 
   1696 #if (OPENSSL_VERSION_NUMBER >= 0x0090808fL) && !defined(OPENSSL_NO_TLSEXT) && \
   1697     !defined(OPENSSL_NO_OCSP)
   1698 static CURLcode verifystatus(struct connectdata *conn,
   1699                              struct ssl_connect_data *connssl)
   1700 {
   1701   int i, ocsp_status;
   1702   unsigned char *status;
   1703   const unsigned char *p;
   1704   CURLcode result = CURLE_OK;
   1705   struct Curl_easy *data = conn->data;
   1706 
   1707   OCSP_RESPONSE *rsp = NULL;
   1708   OCSP_BASICRESP *br = NULL;
   1709   X509_STORE     *st = NULL;
   1710   STACK_OF(X509) *ch = NULL;
   1711 
   1712   long len = SSL_get_tlsext_status_ocsp_resp(BACKEND->handle, &status);
   1713 
   1714   if(!status) {
   1715     failf(data, "No OCSP response received");
   1716     result = CURLE_SSL_INVALIDCERTSTATUS;
   1717     goto end;
   1718   }
   1719   p = status;
   1720   rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
   1721   if(!rsp) {
   1722     failf(data, "Invalid OCSP response");
   1723     result = CURLE_SSL_INVALIDCERTSTATUS;
   1724     goto end;
   1725   }
   1726 
   1727   ocsp_status = OCSP_response_status(rsp);
   1728   if(ocsp_status != OCSP_RESPONSE_STATUS_SUCCESSFUL) {
   1729     failf(data, "Invalid OCSP response status: %s (%d)",
   1730           OCSP_response_status_str(ocsp_status), ocsp_status);
   1731     result = CURLE_SSL_INVALIDCERTSTATUS;
   1732     goto end;
   1733   }
   1734 
   1735   br = OCSP_response_get1_basic(rsp);
   1736   if(!br) {
   1737     failf(data, "Invalid OCSP response");
   1738     result = CURLE_SSL_INVALIDCERTSTATUS;
   1739     goto end;
   1740   }
   1741 
   1742   ch = SSL_get_peer_cert_chain(BACKEND->handle);
   1743   st = SSL_CTX_get_cert_store(BACKEND->ctx);
   1744 
   1745 #if ((OPENSSL_VERSION_NUMBER <= 0x1000201fL) /* Fixed after 1.0.2a */ || \
   1746      (defined(LIBRESSL_VERSION_NUMBER) &&                               \
   1747       LIBRESSL_VERSION_NUMBER <= 0x2040200fL))
   1748   /* The authorized responder cert in the OCSP response MUST be signed by the
   1749      peer cert's issuer (see RFC6960 section 4.2.2.2). If that's a root cert,
   1750      no problem, but if it's an intermediate cert OpenSSL has a bug where it
   1751      expects this issuer to be present in the chain embedded in the OCSP
   1752      response. So we add it if necessary. */
   1753 
   1754   /* First make sure the peer cert chain includes both a peer and an issuer,
   1755      and the OCSP response contains a responder cert. */
   1756   if(sk_X509_num(ch) >= 2 && sk_X509_num(br->certs) >= 1) {
   1757     X509 *responder = sk_X509_value(br->certs, sk_X509_num(br->certs) - 1);
   1758 
   1759     /* Find issuer of responder cert and add it to the OCSP response chain */
   1760     for(i = 0; i < sk_X509_num(ch); i++) {
   1761       X509 *issuer = sk_X509_value(ch, i);
   1762       if(X509_check_issued(issuer, responder) == X509_V_OK) {
   1763         if(!OCSP_basic_add1_cert(br, issuer)) {
   1764           failf(data, "Could not add issuer cert to OCSP response");
   1765           result = CURLE_SSL_INVALIDCERTSTATUS;
   1766           goto end;
   1767         }
   1768       }
   1769     }
   1770   }
   1771 #endif
   1772 
   1773   if(OCSP_basic_verify(br, ch, st, 0) <= 0) {
   1774     failf(data, "OCSP response verification failed");
   1775     result = CURLE_SSL_INVALIDCERTSTATUS;
   1776     goto end;
   1777   }
   1778 
   1779   for(i = 0; i < OCSP_resp_count(br); i++) {
   1780     int cert_status, crl_reason;
   1781     OCSP_SINGLERESP *single = NULL;
   1782 
   1783     ASN1_GENERALIZEDTIME *rev, *thisupd, *nextupd;
   1784 
   1785     single = OCSP_resp_get0(br, i);
   1786     if(!single)
   1787       continue;
   1788 
   1789     cert_status = OCSP_single_get0_status(single, &crl_reason, &rev,
   1790                                           &thisupd, &nextupd);
   1791 
   1792     if(!OCSP_check_validity(thisupd, nextupd, 300L, -1L)) {
   1793       failf(data, "OCSP response has expired");
   1794       result = CURLE_SSL_INVALIDCERTSTATUS;
   1795       goto end;
   1796     }
   1797 
   1798     infof(data, "SSL certificate status: %s (%d)\n",
   1799           OCSP_cert_status_str(cert_status), cert_status);
   1800 
   1801     switch(cert_status) {
   1802       case V_OCSP_CERTSTATUS_GOOD:
   1803         break;
   1804 
   1805       case V_OCSP_CERTSTATUS_REVOKED:
   1806         result = CURLE_SSL_INVALIDCERTSTATUS;
   1807 
   1808         failf(data, "SSL certificate revocation reason: %s (%d)",
   1809               OCSP_crl_reason_str(crl_reason), crl_reason);
   1810         goto end;
   1811 
   1812       case V_OCSP_CERTSTATUS_UNKNOWN:
   1813         result = CURLE_SSL_INVALIDCERTSTATUS;
   1814         goto end;
   1815     }
   1816   }
   1817 
   1818 end:
   1819   if(br) OCSP_BASICRESP_free(br);
   1820   OCSP_RESPONSE_free(rsp);
   1821 
   1822   return result;
   1823 }
   1824 #endif
   1825 
   1826 #endif /* USE_OPENSSL */
   1827 
   1828 /* The SSL_CTRL_SET_MSG_CALLBACK doesn't exist in ancient OpenSSL versions
   1829    and thus this cannot be done there. */
   1830 #ifdef SSL_CTRL_SET_MSG_CALLBACK
   1831 
   1832 static const char *ssl_msg_type(int ssl_ver, int msg)
   1833 {
   1834 #ifdef SSL2_VERSION_MAJOR
   1835   if(ssl_ver == SSL2_VERSION_MAJOR) {
   1836     switch(msg) {
   1837       case SSL2_MT_ERROR:
   1838         return "Error";
   1839       case SSL2_MT_CLIENT_HELLO:
   1840         return "Client hello";
   1841       case SSL2_MT_CLIENT_MASTER_KEY:
   1842         return "Client key";
   1843       case SSL2_MT_CLIENT_FINISHED:
   1844         return "Client finished";
   1845       case SSL2_MT_SERVER_HELLO:
   1846         return "Server hello";
   1847       case SSL2_MT_SERVER_VERIFY:
   1848         return "Server verify";
   1849       case SSL2_MT_SERVER_FINISHED:
   1850         return "Server finished";
   1851       case SSL2_MT_REQUEST_CERTIFICATE:
   1852         return "Request CERT";
   1853       case SSL2_MT_CLIENT_CERTIFICATE:
   1854         return "Client CERT";
   1855     }
   1856   }
   1857   else
   1858 #endif
   1859   if(ssl_ver == SSL3_VERSION_MAJOR) {
   1860     switch(msg) {
   1861       case SSL3_MT_HELLO_REQUEST:
   1862         return "Hello request";
   1863       case SSL3_MT_CLIENT_HELLO:
   1864         return "Client hello";
   1865       case SSL3_MT_SERVER_HELLO:
   1866         return "Server hello";
   1867 #ifdef SSL3_MT_NEWSESSION_TICKET
   1868       case SSL3_MT_NEWSESSION_TICKET:
   1869         return "Newsession Ticket";
   1870 #endif
   1871       case SSL3_MT_CERTIFICATE:
   1872         return "Certificate";
   1873       case SSL3_MT_SERVER_KEY_EXCHANGE:
   1874         return "Server key exchange";
   1875       case SSL3_MT_CLIENT_KEY_EXCHANGE:
   1876         return "Client key exchange";
   1877       case SSL3_MT_CERTIFICATE_REQUEST:
   1878         return "Request CERT";
   1879       case SSL3_MT_SERVER_DONE:
   1880         return "Server finished";
   1881       case SSL3_MT_CERTIFICATE_VERIFY:
   1882         return "CERT verify";
   1883       case SSL3_MT_FINISHED:
   1884         return "Finished";
   1885 #ifdef SSL3_MT_CERTIFICATE_STATUS
   1886       case SSL3_MT_CERTIFICATE_STATUS:
   1887         return "Certificate Status";
   1888 #endif
   1889 #ifdef SSL3_MT_ENCRYPTED_EXTENSIONS
   1890       case SSL3_MT_ENCRYPTED_EXTENSIONS:
   1891         return "Encrypted Extensions";
   1892 #endif
   1893 #ifdef SSL3_MT_END_OF_EARLY_DATA
   1894       case SSL3_MT_END_OF_EARLY_DATA:
   1895         return "End of early data";
   1896 #endif
   1897 #ifdef SSL3_MT_KEY_UPDATE
   1898       case SSL3_MT_KEY_UPDATE:
   1899         return "Key update";
   1900 #endif
   1901 #ifdef SSL3_MT_NEXT_PROTO
   1902       case SSL3_MT_NEXT_PROTO:
   1903         return "Next protocol";
   1904 #endif
   1905 #ifdef SSL3_MT_MESSAGE_HASH
   1906       case SSL3_MT_MESSAGE_HASH:
   1907         return "Message hash";
   1908 #endif
   1909     }
   1910   }
   1911   return "Unknown";
   1912 }
   1913 
   1914 static const char *tls_rt_type(int type)
   1915 {
   1916   switch(type) {
   1917 #ifdef SSL3_RT_HEADER
   1918   case SSL3_RT_HEADER:
   1919     return "TLS header";
   1920 #endif
   1921   case SSL3_RT_CHANGE_CIPHER_SPEC:
   1922     return "TLS change cipher";
   1923   case SSL3_RT_ALERT:
   1924     return "TLS alert";
   1925   case SSL3_RT_HANDSHAKE:
   1926     return "TLS handshake";
   1927   case SSL3_RT_APPLICATION_DATA:
   1928     return "TLS app data";
   1929   default:
   1930     return "TLS Unknown";
   1931   }
   1932 }
   1933 
   1934 
   1935 /*
   1936  * Our callback from the SSL/TLS layers.
   1937  */
   1938 static void ssl_tls_trace(int direction, int ssl_ver, int content_type,
   1939                           const void *buf, size_t len, SSL *ssl,
   1940                           void *userp)
   1941 {
   1942   struct Curl_easy *data;
   1943   char unknown[32];
   1944   const char *verstr = NULL;
   1945   struct connectdata *conn = userp;
   1946 
   1947   if(!conn || !conn->data || !conn->data->set.fdebug ||
   1948      (direction != 0 && direction != 1))
   1949     return;
   1950 
   1951   data = conn->data;
   1952 
   1953   switch(ssl_ver) {
   1954 #ifdef SSL2_VERSION /* removed in recent versions */
   1955   case SSL2_VERSION:
   1956     verstr = "SSLv2";
   1957     break;
   1958 #endif
   1959 #ifdef SSL3_VERSION
   1960   case SSL3_VERSION:
   1961     verstr = "SSLv3";
   1962     break;
   1963 #endif
   1964   case TLS1_VERSION:
   1965     verstr = "TLSv1.0";
   1966     break;
   1967 #ifdef TLS1_1_VERSION
   1968   case TLS1_1_VERSION:
   1969     verstr = "TLSv1.1";
   1970     break;
   1971 #endif
   1972 #ifdef TLS1_2_VERSION
   1973   case TLS1_2_VERSION:
   1974     verstr = "TLSv1.2";
   1975     break;
   1976 #endif
   1977 #ifdef TLS1_3_VERSION
   1978   case TLS1_3_VERSION:
   1979     verstr = "TLSv1.3";
   1980     break;
   1981 #endif
   1982   case 0:
   1983     break;
   1984   default:
   1985     msnprintf(unknown, sizeof(unknown), "(%x)", ssl_ver);
   1986     verstr = unknown;
   1987     break;
   1988   }
   1989 
   1990   /* Log progress for interesting records only (like Handshake or Alert), skip
   1991    * all raw record headers (content_type == SSL3_RT_HEADER or ssl_ver == 0).
   1992    * For TLS 1.3, skip notification of the decrypted inner Content Type.
   1993    */
   1994   if(ssl_ver
   1995 #ifdef SSL3_RT_INNER_CONTENT_TYPE
   1996      && content_type != SSL3_RT_INNER_CONTENT_TYPE
   1997 #endif
   1998     ) {
   1999     const char *msg_name, *tls_rt_name;
   2000     char ssl_buf[1024];
   2001     int msg_type, txt_len;
   2002 
   2003     /* the info given when the version is zero is not that useful for us */
   2004 
   2005     ssl_ver >>= 8; /* check the upper 8 bits only below */
   2006 
   2007     /* SSLv2 doesn't seem to have TLS record-type headers, so OpenSSL
   2008      * always pass-up content-type as 0. But the interesting message-type
   2009      * is at 'buf[0]'.
   2010      */
   2011     if(ssl_ver == SSL3_VERSION_MAJOR && content_type)
   2012       tls_rt_name = tls_rt_type(content_type);
   2013     else
   2014       tls_rt_name = "";
   2015 
   2016     if(content_type == SSL3_RT_CHANGE_CIPHER_SPEC) {
   2017       msg_type = *(char *)buf;
   2018       msg_name = "Change cipher spec";
   2019     }
   2020     else if(content_type == SSL3_RT_ALERT) {
   2021       msg_type = (((char *)buf)[0] << 8) + ((char *)buf)[1];
   2022       msg_name = SSL_alert_desc_string_long(msg_type);
   2023     }
   2024     else {
   2025       msg_type = *(char *)buf;
   2026       msg_name = ssl_msg_type(ssl_ver, msg_type);
   2027     }
   2028 
   2029     txt_len = msnprintf(ssl_buf, sizeof(ssl_buf), "%s (%s), %s, %s (%d):\n",
   2030                         verstr, direction?"OUT":"IN",
   2031                         tls_rt_name, msg_name, msg_type);
   2032     if(0 <= txt_len && (unsigned)txt_len < sizeof(ssl_buf)) {
   2033       Curl_debug(data, CURLINFO_TEXT, ssl_buf, (size_t)txt_len);
   2034     }
   2035   }
   2036 
   2037   Curl_debug(data, (direction == 1) ? CURLINFO_SSL_DATA_OUT :
   2038              CURLINFO_SSL_DATA_IN, (char *)buf, len);
   2039   (void) ssl;
   2040 }
   2041 #endif
   2042 
   2043 #ifdef USE_OPENSSL
   2044 /* ====================================================== */
   2045 
   2046 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
   2047 #  define use_sni(x)  sni = (x)
   2048 #else
   2049 #  define use_sni(x)  Curl_nop_stmt
   2050 #endif
   2051 
   2052 /* Check for OpenSSL 1.0.2 which has ALPN support. */
   2053 #undef HAS_ALPN
   2054 #if OPENSSL_VERSION_NUMBER >= 0x10002000L \
   2055     && !defined(OPENSSL_NO_TLSEXT)
   2056 #  define HAS_ALPN 1
   2057 #endif
   2058 
   2059 /* Check for OpenSSL 1.0.1 which has NPN support. */
   2060 #undef HAS_NPN
   2061 #if OPENSSL_VERSION_NUMBER >= 0x10001000L \
   2062     && !defined(OPENSSL_NO_TLSEXT) \
   2063     && !defined(OPENSSL_NO_NEXTPROTONEG)
   2064 #  define HAS_NPN 1
   2065 #endif
   2066 
   2067 #ifdef HAS_NPN
   2068 
   2069 /*
   2070  * in is a list of length prefixed strings. this function has to select
   2071  * the protocol we want to use from the list and write its string into out.
   2072  */
   2073 
   2074 static int
   2075 select_next_protocol(unsigned char **out, unsigned char *outlen,
   2076                      const unsigned char *in, unsigned int inlen,
   2077                      const char *key, unsigned int keylen)
   2078 {
   2079   unsigned int i;
   2080   for(i = 0; i + keylen <= inlen; i += in[i] + 1) {
   2081     if(memcmp(&in[i + 1], key, keylen) == 0) {
   2082       *out = (unsigned char *) &in[i + 1];
   2083       *outlen = in[i];
   2084       return 0;
   2085     }
   2086   }
   2087   return -1;
   2088 }
   2089 
   2090 static int
   2091 select_next_proto_cb(SSL *ssl,
   2092                      unsigned char **out, unsigned char *outlen,
   2093                      const unsigned char *in, unsigned int inlen,
   2094                      void *arg)
   2095 {
   2096   struct connectdata *conn = (struct connectdata*) arg;
   2097 
   2098   (void)ssl;
   2099 
   2100 #ifdef USE_NGHTTP2
   2101   if(conn->data->set.httpversion >= CURL_HTTP_VERSION_2 &&
   2102      !select_next_protocol(out, outlen, in, inlen, NGHTTP2_PROTO_VERSION_ID,
   2103                            NGHTTP2_PROTO_VERSION_ID_LEN)) {
   2104     infof(conn->data, "NPN, negotiated HTTP2 (%s)\n",
   2105           NGHTTP2_PROTO_VERSION_ID);
   2106     conn->negnpn = CURL_HTTP_VERSION_2;
   2107     return SSL_TLSEXT_ERR_OK;
   2108   }
   2109 #endif
   2110 
   2111   if(!select_next_protocol(out, outlen, in, inlen, ALPN_HTTP_1_1,
   2112                            ALPN_HTTP_1_1_LENGTH)) {
   2113     infof(conn->data, "NPN, negotiated HTTP1.1\n");
   2114     conn->negnpn = CURL_HTTP_VERSION_1_1;
   2115     return SSL_TLSEXT_ERR_OK;
   2116   }
   2117 
   2118   infof(conn->data, "NPN, no overlap, use HTTP1.1\n");
   2119   *out = (unsigned char *)ALPN_HTTP_1_1;
   2120   *outlen = ALPN_HTTP_1_1_LENGTH;
   2121   conn->negnpn = CURL_HTTP_VERSION_1_1;
   2122 
   2123   return SSL_TLSEXT_ERR_OK;
   2124 }
   2125 #endif /* HAS_NPN */
   2126 
   2127 #ifndef CURL_DISABLE_VERBOSE_STRINGS
   2128 static const char *
   2129 get_ssl_version_txt(SSL *ssl)
   2130 {
   2131   if(!ssl)
   2132     return "";
   2133 
   2134   switch(SSL_version(ssl)) {
   2135 #ifdef TLS1_3_VERSION
   2136   case TLS1_3_VERSION:
   2137     return "TLSv1.3";
   2138 #endif
   2139 #if OPENSSL_VERSION_NUMBER >= 0x1000100FL
   2140   case TLS1_2_VERSION:
   2141     return "TLSv1.2";
   2142   case TLS1_1_VERSION:
   2143     return "TLSv1.1";
   2144 #endif
   2145   case TLS1_VERSION:
   2146     return "TLSv1.0";
   2147   case SSL3_VERSION:
   2148     return "SSLv3";
   2149   case SSL2_VERSION:
   2150     return "SSLv2";
   2151   }
   2152   return "unknown";
   2153 }
   2154 #endif
   2155 
   2156 static CURLcode
   2157 set_ssl_version_min_max(long *ctx_options, struct connectdata *conn,
   2158                         int sockindex)
   2159 {
   2160 #if (OPENSSL_VERSION_NUMBER < 0x1000100FL) || !defined(TLS1_3_VERSION)
   2161   /* convoluted #if condition just to avoid compiler warnings on unused
   2162      variable */
   2163   struct Curl_easy *data = conn->data;
   2164 #endif
   2165   long ssl_version = SSL_CONN_CONFIG(version);
   2166   long ssl_version_max = SSL_CONN_CONFIG(version_max);
   2167 
   2168   switch(ssl_version) {
   2169     case CURL_SSLVERSION_TLSv1_3:
   2170 #ifdef TLS1_3_VERSION
   2171     {
   2172       struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   2173       SSL_CTX_set_max_proto_version(BACKEND->ctx, TLS1_3_VERSION);
   2174       *ctx_options |= SSL_OP_NO_TLSv1_2;
   2175     }
   2176 #else
   2177       (void)sockindex;
   2178       (void)ctx_options;
   2179       failf(data, OSSL_PACKAGE " was built without TLS 1.3 support");
   2180       return CURLE_NOT_BUILT_IN;
   2181 #endif
   2182       /* FALLTHROUGH */
   2183     case CURL_SSLVERSION_TLSv1_2:
   2184 #if OPENSSL_VERSION_NUMBER >= 0x1000100FL
   2185       *ctx_options |= SSL_OP_NO_TLSv1_1;
   2186 #else
   2187       failf(data, OSSL_PACKAGE " was built without TLS 1.2 support");
   2188       return CURLE_NOT_BUILT_IN;
   2189 #endif
   2190       /* FALLTHROUGH */
   2191     case CURL_SSLVERSION_TLSv1_1:
   2192 #if OPENSSL_VERSION_NUMBER >= 0x1000100FL
   2193       *ctx_options |= SSL_OP_NO_TLSv1;
   2194 #else
   2195       failf(data, OSSL_PACKAGE " was built without TLS 1.1 support");
   2196       return CURLE_NOT_BUILT_IN;
   2197 #endif
   2198       /* FALLTHROUGH */
   2199     case CURL_SSLVERSION_TLSv1_0:
   2200     case CURL_SSLVERSION_TLSv1:
   2201       break;
   2202   }
   2203 
   2204   switch(ssl_version_max) {
   2205     case CURL_SSLVERSION_MAX_TLSv1_0:
   2206 #if OPENSSL_VERSION_NUMBER >= 0x1000100FL
   2207       *ctx_options |= SSL_OP_NO_TLSv1_1;
   2208 #endif
   2209       /* FALLTHROUGH */
   2210     case CURL_SSLVERSION_MAX_TLSv1_1:
   2211 #if OPENSSL_VERSION_NUMBER >= 0x1000100FL
   2212       *ctx_options |= SSL_OP_NO_TLSv1_2;
   2213 #endif
   2214       /* FALLTHROUGH */
   2215     case CURL_SSLVERSION_MAX_TLSv1_2:
   2216 #ifdef TLS1_3_VERSION
   2217       *ctx_options |= SSL_OP_NO_TLSv1_3;
   2218 #endif
   2219       break;
   2220     case CURL_SSLVERSION_MAX_TLSv1_3:
   2221 #ifdef TLS1_3_VERSION
   2222       break;
   2223 #else
   2224       failf(data, OSSL_PACKAGE " was built without TLS 1.3 support");
   2225       return CURLE_NOT_BUILT_IN;
   2226 #endif
   2227   }
   2228   return CURLE_OK;
   2229 }
   2230 
   2231 /* The "new session" callback must return zero if the session can be removed
   2232  * or non-zero if the session has been put into the session cache.
   2233  */
   2234 static int ossl_new_session_cb(SSL *ssl, SSL_SESSION *ssl_sessionid)
   2235 {
   2236   int res = 0;
   2237   struct connectdata *conn;
   2238   struct Curl_easy *data;
   2239   int sockindex;
   2240   curl_socket_t *sockindex_ptr;
   2241   int connectdata_idx = ossl_get_ssl_conn_index();
   2242   int sockindex_idx = ossl_get_ssl_sockindex_index();
   2243 
   2244   if(connectdata_idx < 0 || sockindex_idx < 0)
   2245     return 0;
   2246 
   2247   conn = (struct connectdata*) SSL_get_ex_data(ssl, connectdata_idx);
   2248   if(!conn)
   2249     return 0;
   2250 
   2251   data = conn->data;
   2252 
   2253   /* The sockindex has been stored as a pointer to an array element */
   2254   sockindex_ptr = (curl_socket_t*) SSL_get_ex_data(ssl, sockindex_idx);
   2255   sockindex = (int)(sockindex_ptr - conn->sock);
   2256 
   2257   if(SSL_SET_OPTION(primary.sessionid)) {
   2258     bool incache;
   2259     void *old_ssl_sessionid = NULL;
   2260 
   2261     Curl_ssl_sessionid_lock(conn);
   2262     incache = !(Curl_ssl_getsessionid(conn, &old_ssl_sessionid, NULL,
   2263                                       sockindex));
   2264     if(incache) {
   2265       if(old_ssl_sessionid != ssl_sessionid) {
   2266         infof(data, "old SSL session ID is stale, removing\n");
   2267         Curl_ssl_delsessionid(conn, old_ssl_sessionid);
   2268         incache = FALSE;
   2269       }
   2270     }
   2271 
   2272     if(!incache) {
   2273       if(!Curl_ssl_addsessionid(conn, ssl_sessionid,
   2274                                       0 /* unknown size */, sockindex)) {
   2275         /* the session has been put into the session cache */
   2276         res = 1;
   2277       }
   2278       else
   2279         failf(data, "failed to store ssl session");
   2280     }
   2281     Curl_ssl_sessionid_unlock(conn);
   2282   }
   2283 
   2284   return res;
   2285 }
   2286 
   2287 static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
   2288 {
   2289   CURLcode result = CURLE_OK;
   2290   char *ciphers;
   2291   struct Curl_easy *data = conn->data;
   2292   SSL_METHOD_QUAL SSL_METHOD *req_method = NULL;
   2293   X509_LOOKUP *lookup = NULL;
   2294   curl_socket_t sockfd = conn->sock[sockindex];
   2295   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   2296   long ctx_options = 0;
   2297 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
   2298   bool sni;
   2299   const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
   2300     conn->host.name;
   2301 #ifdef ENABLE_IPV6
   2302   struct in6_addr addr;
   2303 #else
   2304   struct in_addr addr;
   2305 #endif
   2306 #endif
   2307   long * const certverifyresult = SSL_IS_PROXY() ?
   2308     &data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult;
   2309   const long int ssl_version = SSL_CONN_CONFIG(version);
   2310 #ifdef USE_TLS_SRP
   2311   const enum CURL_TLSAUTH ssl_authtype = SSL_SET_OPTION(authtype);
   2312 #endif
   2313   char * const ssl_cert = SSL_SET_OPTION(cert);
   2314   const char * const ssl_cert_type = SSL_SET_OPTION(cert_type);
   2315   const char * const ssl_cafile = SSL_CONN_CONFIG(CAfile);
   2316   const char * const ssl_capath = SSL_CONN_CONFIG(CApath);
   2317   const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
   2318   const char * const ssl_crlfile = SSL_SET_OPTION(CRLfile);
   2319   char error_buffer[256];
   2320 
   2321   DEBUGASSERT(ssl_connect_1 == connssl->connecting_state);
   2322 
   2323   /* Make funny stuff to get random input */
   2324   result = Curl_ossl_seed(data);
   2325   if(result)
   2326     return result;
   2327 
   2328   *certverifyresult = !X509_V_OK;
   2329 
   2330   /* check to see if we've been told to use an explicit SSL/TLS version */
   2331 
   2332   switch(ssl_version) {
   2333   case CURL_SSLVERSION_DEFAULT:
   2334   case CURL_SSLVERSION_TLSv1:
   2335   case CURL_SSLVERSION_TLSv1_0:
   2336   case CURL_SSLVERSION_TLSv1_1:
   2337   case CURL_SSLVERSION_TLSv1_2:
   2338   case CURL_SSLVERSION_TLSv1_3:
   2339     /* it will be handled later with the context options */
   2340 #if (OPENSSL_VERSION_NUMBER >= 0x10100000L)
   2341     req_method = TLS_client_method();
   2342 #else
   2343     req_method = SSLv23_client_method();
   2344 #endif
   2345     use_sni(TRUE);
   2346     break;
   2347   case CURL_SSLVERSION_SSLv2:
   2348 #ifdef OPENSSL_NO_SSL2
   2349     failf(data, OSSL_PACKAGE " was built without SSLv2 support");
   2350     return CURLE_NOT_BUILT_IN;
   2351 #else
   2352 #ifdef USE_TLS_SRP
   2353     if(ssl_authtype == CURL_TLSAUTH_SRP)
   2354       return CURLE_SSL_CONNECT_ERROR;
   2355 #endif
   2356     req_method = SSLv2_client_method();
   2357     use_sni(FALSE);
   2358     break;
   2359 #endif
   2360   case CURL_SSLVERSION_SSLv3:
   2361 #ifdef OPENSSL_NO_SSL3_METHOD
   2362     failf(data, OSSL_PACKAGE " was built without SSLv3 support");
   2363     return CURLE_NOT_BUILT_IN;
   2364 #else
   2365 #ifdef USE_TLS_SRP
   2366     if(ssl_authtype == CURL_TLSAUTH_SRP)
   2367       return CURLE_SSL_CONNECT_ERROR;
   2368 #endif
   2369     req_method = SSLv3_client_method();
   2370     use_sni(FALSE);
   2371     break;
   2372 #endif
   2373   default:
   2374     failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
   2375     return CURLE_SSL_CONNECT_ERROR;
   2376   }
   2377 
   2378   if(BACKEND->ctx)
   2379     SSL_CTX_free(BACKEND->ctx);
   2380   BACKEND->ctx = SSL_CTX_new(req_method);
   2381 
   2382   if(!BACKEND->ctx) {
   2383     failf(data, "SSL: couldn't create a context: %s",
   2384           ossl_strerror(ERR_peek_error(), error_buffer, sizeof(error_buffer)));
   2385     return CURLE_OUT_OF_MEMORY;
   2386   }
   2387 
   2388 #ifdef SSL_MODE_RELEASE_BUFFERS
   2389   SSL_CTX_set_mode(BACKEND->ctx, SSL_MODE_RELEASE_BUFFERS);
   2390 #endif
   2391 
   2392 #ifdef SSL_CTRL_SET_MSG_CALLBACK
   2393   if(data->set.fdebug && data->set.verbose) {
   2394     /* the SSL trace callback is only used for verbose logging */
   2395     SSL_CTX_set_msg_callback(BACKEND->ctx, ssl_tls_trace);
   2396     SSL_CTX_set_msg_callback_arg(BACKEND->ctx, conn);
   2397   }
   2398 #endif
   2399 
   2400   /* OpenSSL contains code to work-around lots of bugs and flaws in various
   2401      SSL-implementations. SSL_CTX_set_options() is used to enabled those
   2402      work-arounds. The man page for this option states that SSL_OP_ALL enables
   2403      all the work-arounds and that "It is usually safe to use SSL_OP_ALL to
   2404      enable the bug workaround options if compatibility with somewhat broken
   2405      implementations is desired."
   2406 
   2407      The "-no_ticket" option was introduced in Openssl0.9.8j. It's a flag to
   2408      disable "rfc4507bis session ticket support".  rfc4507bis was later turned
   2409      into the proper RFC5077 it seems: https://tools.ietf.org/html/rfc5077
   2410 
   2411      The enabled extension concerns the session management. I wonder how often
   2412      libcurl stops a connection and then resumes a TLS session. also, sending
   2413      the session data is some overhead. .I suggest that you just use your
   2414      proposed patch (which explicitly disables TICKET).
   2415 
   2416      If someone writes an application with libcurl and openssl who wants to
   2417      enable the feature, one can do this in the SSL callback.
   2418 
   2419      SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG option enabling allowed proper
   2420      interoperability with web server Netscape Enterprise Server 2.0.1 which
   2421      was released back in 1996.
   2422 
   2423      Due to CVE-2010-4180, option SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG has
   2424      become ineffective as of OpenSSL 0.9.8q and 1.0.0c. In order to mitigate
   2425      CVE-2010-4180 when using previous OpenSSL versions we no longer enable
   2426      this option regardless of OpenSSL version and SSL_OP_ALL definition.
   2427 
   2428      OpenSSL added a work-around for a SSL 3.0/TLS 1.0 CBC vulnerability
   2429      (https://www.openssl.org/~bodo/tls-cbc.txt). In 0.9.6e they added a bit to
   2430      SSL_OP_ALL that _disables_ that work-around despite the fact that
   2431      SSL_OP_ALL is documented to do "rather harmless" workarounds. In order to
   2432      keep the secure work-around, the SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS bit
   2433      must not be set.
   2434   */
   2435 
   2436   ctx_options = SSL_OP_ALL;
   2437 
   2438 #ifdef SSL_OP_NO_TICKET
   2439   ctx_options |= SSL_OP_NO_TICKET;
   2440 #endif
   2441 
   2442 #ifdef SSL_OP_NO_COMPRESSION
   2443   ctx_options |= SSL_OP_NO_COMPRESSION;
   2444 #endif
   2445 
   2446 #ifdef SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG
   2447   /* mitigate CVE-2010-4180 */
   2448   ctx_options &= ~SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG;
   2449 #endif
   2450 
   2451 #ifdef SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS
   2452   /* unless the user explicitly ask to allow the protocol vulnerability we
   2453      use the work-around */
   2454   if(!SSL_SET_OPTION(enable_beast))
   2455     ctx_options &= ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS;
   2456 #endif
   2457 
   2458   switch(ssl_version) {
   2459   case CURL_SSLVERSION_SSLv3:
   2460     ctx_options |= SSL_OP_NO_SSLv2;
   2461     ctx_options |= SSL_OP_NO_TLSv1;
   2462 #if OPENSSL_VERSION_NUMBER >= 0x1000100FL
   2463     ctx_options |= SSL_OP_NO_TLSv1_1;
   2464     ctx_options |= SSL_OP_NO_TLSv1_2;
   2465 #ifdef TLS1_3_VERSION
   2466     ctx_options |= SSL_OP_NO_TLSv1_3;
   2467 #endif
   2468 #endif
   2469     break;
   2470 
   2471   case CURL_SSLVERSION_DEFAULT:
   2472   case CURL_SSLVERSION_TLSv1:
   2473   case CURL_SSLVERSION_TLSv1_0:
   2474   case CURL_SSLVERSION_TLSv1_1:
   2475   case CURL_SSLVERSION_TLSv1_2:
   2476   case CURL_SSLVERSION_TLSv1_3:
   2477     /* asking for any TLS version as the minimum, means no SSL versions
   2478        allowed */
   2479     ctx_options |= SSL_OP_NO_SSLv2;
   2480     ctx_options |= SSL_OP_NO_SSLv3;
   2481     result = set_ssl_version_min_max(&ctx_options, conn, sockindex);
   2482     if(result != CURLE_OK)
   2483        return result;
   2484     break;
   2485 
   2486   case CURL_SSLVERSION_SSLv2:
   2487     ctx_options |= SSL_OP_NO_SSLv3;
   2488     ctx_options |= SSL_OP_NO_TLSv1;
   2489 #if OPENSSL_VERSION_NUMBER >= 0x1000100FL
   2490     ctx_options |= SSL_OP_NO_TLSv1_1;
   2491     ctx_options |= SSL_OP_NO_TLSv1_2;
   2492 #ifdef TLS1_3_VERSION
   2493     ctx_options |= SSL_OP_NO_TLSv1_3;
   2494 #endif
   2495 #endif
   2496     break;
   2497 
   2498   default:
   2499     failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
   2500     return CURLE_SSL_CONNECT_ERROR;
   2501   }
   2502 
   2503   SSL_CTX_set_options(BACKEND->ctx, ctx_options);
   2504 
   2505 #ifdef HAS_NPN
   2506   if(conn->bits.tls_enable_npn)
   2507     SSL_CTX_set_next_proto_select_cb(BACKEND->ctx, select_next_proto_cb, conn);
   2508 #endif
   2509 
   2510 #ifdef HAS_ALPN
   2511   if(conn->bits.tls_enable_alpn) {
   2512     int cur = 0;
   2513     unsigned char protocols[128];
   2514 
   2515 #ifdef USE_NGHTTP2
   2516     if(data->set.httpversion >= CURL_HTTP_VERSION_2 &&
   2517        (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy)) {
   2518       protocols[cur++] = NGHTTP2_PROTO_VERSION_ID_LEN;
   2519 
   2520       memcpy(&protocols[cur], NGHTTP2_PROTO_VERSION_ID,
   2521           NGHTTP2_PROTO_VERSION_ID_LEN);
   2522       cur += NGHTTP2_PROTO_VERSION_ID_LEN;
   2523       infof(data, "ALPN, offering %s\n", NGHTTP2_PROTO_VERSION_ID);
   2524     }
   2525 #endif
   2526 
   2527     protocols[cur++] = ALPN_HTTP_1_1_LENGTH;
   2528     memcpy(&protocols[cur], ALPN_HTTP_1_1, ALPN_HTTP_1_1_LENGTH);
   2529     cur += ALPN_HTTP_1_1_LENGTH;
   2530     infof(data, "ALPN, offering %s\n", ALPN_HTTP_1_1);
   2531 
   2532     /* expects length prefixed preference ordered list of protocols in wire
   2533      * format
   2534      */
   2535     SSL_CTX_set_alpn_protos(BACKEND->ctx, protocols, cur);
   2536   }
   2537 #endif
   2538 
   2539   if(ssl_cert || ssl_cert_type) {
   2540     if(!cert_stuff(conn, BACKEND->ctx, ssl_cert, ssl_cert_type,
   2541                    SSL_SET_OPTION(key), SSL_SET_OPTION(key_type),
   2542                    SSL_SET_OPTION(key_passwd))) {
   2543       /* failf() is already done in cert_stuff() */
   2544       return CURLE_SSL_CERTPROBLEM;
   2545     }
   2546   }
   2547 
   2548   ciphers = SSL_CONN_CONFIG(cipher_list);
   2549   if(!ciphers)
   2550     ciphers = (char *)DEFAULT_CIPHER_SELECTION;
   2551   if(ciphers) {
   2552     if(!SSL_CTX_set_cipher_list(BACKEND->ctx, ciphers)) {
   2553       failf(data, "failed setting cipher list: %s", ciphers);
   2554       return CURLE_SSL_CIPHER;
   2555     }
   2556     infof(data, "Cipher selection: %s\n", ciphers);
   2557   }
   2558 
   2559 #ifdef HAVE_SSL_CTX_SET_CIPHERSUITES
   2560   {
   2561     char *ciphers13 = SSL_CONN_CONFIG(cipher_list13);
   2562     if(ciphers13) {
   2563       if(!SSL_CTX_set_ciphersuites(BACKEND->ctx, ciphers13)) {
   2564         failf(data, "failed setting TLS 1.3 cipher suite: %s", ciphers13);
   2565         return CURLE_SSL_CIPHER;
   2566       }
   2567       infof(data, "TLS 1.3 cipher selection: %s\n", ciphers13);
   2568     }
   2569   }
   2570 #endif
   2571 
   2572 #ifdef HAVE_SSL_CTX_SET_POST_HANDSHAKE_AUTH
   2573   /* OpenSSL 1.1.1 requires clients to opt-in for PHA */
   2574   SSL_CTX_set_post_handshake_auth(BACKEND->ctx, 1);
   2575 #endif
   2576 
   2577 #ifdef USE_TLS_SRP
   2578   if(ssl_authtype == CURL_TLSAUTH_SRP) {
   2579     char * const ssl_username = SSL_SET_OPTION(username);
   2580 
   2581     infof(data, "Using TLS-SRP username: %s\n", ssl_username);
   2582 
   2583     if(!SSL_CTX_set_srp_username(BACKEND->ctx, ssl_username)) {
   2584       failf(data, "Unable to set SRP user name");
   2585       return CURLE_BAD_FUNCTION_ARGUMENT;
   2586     }
   2587     if(!SSL_CTX_set_srp_password(BACKEND->ctx, SSL_SET_OPTION(password))) {
   2588       failf(data, "failed setting SRP password");
   2589       return CURLE_BAD_FUNCTION_ARGUMENT;
   2590     }
   2591     if(!SSL_CONN_CONFIG(cipher_list)) {
   2592       infof(data, "Setting cipher list SRP\n");
   2593 
   2594       if(!SSL_CTX_set_cipher_list(BACKEND->ctx, "SRP")) {
   2595         failf(data, "failed setting SRP cipher list");
   2596         return CURLE_SSL_CIPHER;
   2597       }
   2598     }
   2599   }
   2600 #endif
   2601 
   2602   if(ssl_cafile || ssl_capath) {
   2603     /* tell SSL where to find CA certificates that are used to verify
   2604        the servers certificate. */
   2605     if(!SSL_CTX_load_verify_locations(BACKEND->ctx, ssl_cafile, ssl_capath)) {
   2606       if(verifypeer) {
   2607         /* Fail if we insist on successfully verifying the server. */
   2608         failf(data, "error setting certificate verify locations:\n"
   2609               "  CAfile: %s\n  CApath: %s",
   2610               ssl_cafile ? ssl_cafile : "none",
   2611               ssl_capath ? ssl_capath : "none");
   2612         return CURLE_SSL_CACERT_BADFILE;
   2613       }
   2614       /* Just continue with a warning if no strict  certificate verification
   2615          is required. */
   2616       infof(data, "error setting certificate verify locations,"
   2617             " continuing anyway:\n");
   2618     }
   2619     else {
   2620       /* Everything is fine. */
   2621       infof(data, "successfully set certificate verify locations:\n");
   2622     }
   2623     infof(data,
   2624           "  CAfile: %s\n"
   2625           "  CApath: %s\n",
   2626           ssl_cafile ? ssl_cafile : "none",
   2627           ssl_capath ? ssl_capath : "none");
   2628   }
   2629 #ifdef CURL_CA_FALLBACK
   2630   else if(verifypeer) {
   2631     /* verifying the peer without any CA certificates won't
   2632        work so use openssl's built in default as fallback */
   2633     SSL_CTX_set_default_verify_paths(BACKEND->ctx);
   2634   }
   2635 #endif
   2636 
   2637   if(ssl_crlfile) {
   2638     /* tell SSL where to find CRL file that is used to check certificate
   2639      * revocation */
   2640     lookup = X509_STORE_add_lookup(SSL_CTX_get_cert_store(BACKEND->ctx),
   2641                                  X509_LOOKUP_file());
   2642     if(!lookup ||
   2643        (!X509_load_crl_file(lookup, ssl_crlfile, X509_FILETYPE_PEM)) ) {
   2644       failf(data, "error loading CRL file: %s", ssl_crlfile);
   2645       return CURLE_SSL_CRL_BADFILE;
   2646     }
   2647     /* Everything is fine. */
   2648     infof(data, "successfully load CRL file:\n");
   2649     X509_STORE_set_flags(SSL_CTX_get_cert_store(BACKEND->ctx),
   2650                          X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);
   2651 
   2652     infof(data, "  CRLfile: %s\n", ssl_crlfile);
   2653   }
   2654 
   2655   /* Try building a chain using issuers in the trusted store first to avoid
   2656   problems with server-sent legacy intermediates.
   2657   Newer versions of OpenSSL do alternate chain checking by default which
   2658   gives us the same fix without as much of a performance hit (slight), so we
   2659   prefer that if available.
   2660   https://rt.openssl.org/Ticket/Display.html?id=3621&user=guest&pass=guest
   2661   */
   2662 #if defined(X509_V_FLAG_TRUSTED_FIRST) && !defined(X509_V_FLAG_NO_ALT_CHAINS)
   2663   if(verifypeer) {
   2664     X509_STORE_set_flags(SSL_CTX_get_cert_store(BACKEND->ctx),
   2665                          X509_V_FLAG_TRUSTED_FIRST);
   2666   }
   2667 #endif
   2668 
   2669   /* SSL always tries to verify the peer, this only says whether it should
   2670    * fail to connect if the verification fails, or if it should continue
   2671    * anyway. In the latter case the result of the verification is checked with
   2672    * SSL_get_verify_result() below. */
   2673   SSL_CTX_set_verify(BACKEND->ctx,
   2674                      verifypeer ? SSL_VERIFY_PEER : SSL_VERIFY_NONE, NULL);
   2675 
   2676   /* Enable logging of secrets to the file specified in env SSLKEYLOGFILE. */
   2677 #if defined(ENABLE_SSLKEYLOGFILE) && defined(HAVE_KEYLOG_CALLBACK)
   2678   if(keylog_file_fp) {
   2679     SSL_CTX_set_keylog_callback(BACKEND->ctx, ossl_keylog_callback);
   2680   }
   2681 #endif
   2682 
   2683   /* Enable the session cache because it's a prerequisite for the "new session"
   2684    * callback. Use the "external storage" mode to avoid that OpenSSL creates
   2685    * an internal session cache.
   2686    */
   2687   SSL_CTX_set_session_cache_mode(BACKEND->ctx,
   2688       SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL);
   2689   SSL_CTX_sess_set_new_cb(BACKEND->ctx, ossl_new_session_cb);
   2690 
   2691   /* give application a chance to interfere with SSL set up. */
   2692   if(data->set.ssl.fsslctx) {
   2693     result = (*data->set.ssl.fsslctx)(data, BACKEND->ctx,
   2694                                       data->set.ssl.fsslctxp);
   2695     if(result) {
   2696       failf(data, "error signaled by ssl ctx callback");
   2697       return result;
   2698     }
   2699   }
   2700 
   2701   /* Lets make an SSL structure */
   2702   if(BACKEND->handle)
   2703     SSL_free(BACKEND->handle);
   2704   BACKEND->handle = SSL_new(BACKEND->ctx);
   2705   if(!BACKEND->handle) {
   2706     failf(data, "SSL: couldn't create a context (handle)!");
   2707     return CURLE_OUT_OF_MEMORY;
   2708   }
   2709 
   2710 #if (OPENSSL_VERSION_NUMBER >= 0x0090808fL) && !defined(OPENSSL_NO_TLSEXT) && \
   2711     !defined(OPENSSL_NO_OCSP)
   2712   if(SSL_CONN_CONFIG(verifystatus))
   2713     SSL_set_tlsext_status_type(BACKEND->handle, TLSEXT_STATUSTYPE_ocsp);
   2714 #endif
   2715 
   2716 #if defined(OPENSSL_IS_BORINGSSL) && defined(ALLOW_RENEG)
   2717   SSL_set_renegotiate_mode(BACKEND->handle, ssl_renegotiate_freely);
   2718 #endif
   2719 
   2720   SSL_set_connect_state(BACKEND->handle);
   2721 
   2722   BACKEND->server_cert = 0x0;
   2723 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
   2724   if((0 == Curl_inet_pton(AF_INET, hostname, &addr)) &&
   2725 #ifdef ENABLE_IPV6
   2726      (0 == Curl_inet_pton(AF_INET6, hostname, &addr)) &&
   2727 #endif
   2728      sni &&
   2729      !SSL_set_tlsext_host_name(BACKEND->handle, hostname))
   2730     infof(data, "WARNING: failed to configure server name indication (SNI) "
   2731           "TLS extension\n");
   2732 #endif
   2733 
   2734   /* Check if there's a cached ID we can/should use here! */
   2735   if(SSL_SET_OPTION(primary.sessionid)) {
   2736     void *ssl_sessionid = NULL;
   2737     int connectdata_idx = ossl_get_ssl_conn_index();
   2738     int sockindex_idx = ossl_get_ssl_sockindex_index();
   2739 
   2740     if(connectdata_idx >= 0 && sockindex_idx >= 0) {
   2741       /* Store the data needed for the "new session" callback.
   2742        * The sockindex is stored as a pointer to an array element. */
   2743       SSL_set_ex_data(BACKEND->handle, connectdata_idx, conn);
   2744       SSL_set_ex_data(BACKEND->handle, sockindex_idx, conn->sock + sockindex);
   2745     }
   2746 
   2747     Curl_ssl_sessionid_lock(conn);
   2748     if(!Curl_ssl_getsessionid(conn, &ssl_sessionid, NULL, sockindex)) {
   2749       /* we got a session id, use it! */
   2750       if(!SSL_set_session(BACKEND->handle, ssl_sessionid)) {
   2751         Curl_ssl_sessionid_unlock(conn);
   2752         failf(data, "SSL: SSL_set_session failed: %s",
   2753               ossl_strerror(ERR_get_error(), error_buffer,
   2754                             sizeof(error_buffer)));
   2755         return CURLE_SSL_CONNECT_ERROR;
   2756       }
   2757       /* Informational message */
   2758       infof(data, "SSL re-using session ID\n");
   2759     }
   2760     Curl_ssl_sessionid_unlock(conn);
   2761   }
   2762 
   2763   if(conn->proxy_ssl[sockindex].use) {
   2764     BIO *const bio = BIO_new(BIO_f_ssl());
   2765     SSL *handle = conn->proxy_ssl[sockindex].backend->handle;
   2766     DEBUGASSERT(ssl_connection_complete == conn->proxy_ssl[sockindex].state);
   2767     DEBUGASSERT(handle != NULL);
   2768     DEBUGASSERT(bio != NULL);
   2769     BIO_set_ssl(bio, handle, FALSE);
   2770     SSL_set_bio(BACKEND->handle, bio, bio);
   2771   }
   2772   else if(!SSL_set_fd(BACKEND->handle, (int)sockfd)) {
   2773     /* pass the raw socket into the SSL layers */
   2774     failf(data, "SSL: SSL_set_fd failed: %s",
   2775           ossl_strerror(ERR_get_error(), error_buffer, sizeof(error_buffer)));
   2776     return CURLE_SSL_CONNECT_ERROR;
   2777   }
   2778 
   2779   connssl->connecting_state = ssl_connect_2;
   2780 
   2781   return CURLE_OK;
   2782 }
   2783 
   2784 static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex)
   2785 {
   2786   struct Curl_easy *data = conn->data;
   2787   int err;
   2788   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   2789   long * const certverifyresult = SSL_IS_PROXY() ?
   2790     &data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult;
   2791   DEBUGASSERT(ssl_connect_2 == connssl->connecting_state
   2792               || ssl_connect_2_reading == connssl->connecting_state
   2793               || ssl_connect_2_writing == connssl->connecting_state);
   2794 
   2795   ERR_clear_error();
   2796 
   2797   err = SSL_connect(BACKEND->handle);
   2798   /* If keylogging is enabled but the keylog callback is not supported then log
   2799      secrets here, immediately after SSL_connect by using tap_ssl_key. */
   2800 #if defined(ENABLE_SSLKEYLOGFILE) && !defined(HAVE_KEYLOG_CALLBACK)
   2801   tap_ssl_key(BACKEND->handle, &BACKEND->tap_state);
   2802 #endif
   2803 
   2804   /* 1  is fine
   2805      0  is "not successful but was shut down controlled"
   2806      <0 is "handshake was not successful, because a fatal error occurred" */
   2807   if(1 != err) {
   2808     int detail = SSL_get_error(BACKEND->handle, err);
   2809 
   2810     if(SSL_ERROR_WANT_READ == detail) {
   2811       connssl->connecting_state = ssl_connect_2_reading;
   2812       return CURLE_OK;
   2813     }
   2814     if(SSL_ERROR_WANT_WRITE == detail) {
   2815       connssl->connecting_state = ssl_connect_2_writing;
   2816       return CURLE_OK;
   2817     }
   2818 #ifdef SSL_ERROR_WANT_ASYNC
   2819     if(SSL_ERROR_WANT_ASYNC == detail) {
   2820       connssl->connecting_state = ssl_connect_2;
   2821       return CURLE_OK;
   2822     }
   2823 #endif
   2824     else {
   2825       /* untreated error */
   2826       unsigned long errdetail;
   2827       char error_buffer[256]="";
   2828       CURLcode result;
   2829       long lerr;
   2830       int lib;
   2831       int reason;
   2832 
   2833       /* the connection failed, we're not waiting for anything else. */
   2834       connssl->connecting_state = ssl_connect_2;
   2835 
   2836       /* Get the earliest error code from the thread's error queue and removes
   2837          the entry. */
   2838       errdetail = ERR_get_error();
   2839 
   2840       /* Extract which lib and reason */
   2841       lib = ERR_GET_LIB(errdetail);
   2842       reason = ERR_GET_REASON(errdetail);
   2843 
   2844       if((lib == ERR_LIB_SSL) &&
   2845          (reason == SSL_R_CERTIFICATE_VERIFY_FAILED)) {
   2846         result = CURLE_PEER_FAILED_VERIFICATION;
   2847 
   2848         lerr = SSL_get_verify_result(BACKEND->handle);
   2849         if(lerr != X509_V_OK) {
   2850           *certverifyresult = lerr;
   2851           msnprintf(error_buffer, sizeof(error_buffer),
   2852                     "SSL certificate problem: %s",
   2853                     X509_verify_cert_error_string(lerr));
   2854         }
   2855         else
   2856           /* strcpy() is fine here as long as the string fits within
   2857              error_buffer */
   2858           strcpy(error_buffer, "SSL certificate verification failed");
   2859       }
   2860       else {
   2861         result = CURLE_SSL_CONNECT_ERROR;
   2862         ossl_strerror(errdetail, error_buffer, sizeof(error_buffer));
   2863       }
   2864 
   2865       /* detail is already set to the SSL error above */
   2866 
   2867       /* If we e.g. use SSLv2 request-method and the server doesn't like us
   2868        * (RST connection etc.), OpenSSL gives no explanation whatsoever and
   2869        * the SO_ERROR is also lost.
   2870        */
   2871       if(CURLE_SSL_CONNECT_ERROR == result && errdetail == 0) {
   2872         const char * const hostname = SSL_IS_PROXY() ?
   2873           conn->http_proxy.host.name : conn->host.name;
   2874         const long int port = SSL_IS_PROXY() ? conn->port : conn->remote_port;
   2875         failf(data, OSSL_PACKAGE " SSL_connect: %s in connection to %s:%ld ",
   2876               SSL_ERROR_to_str(detail), hostname, port);
   2877         return result;
   2878       }
   2879 
   2880       /* Could be a CERT problem */
   2881       failf(data, "%s", error_buffer);
   2882 
   2883       return result;
   2884     }
   2885   }
   2886   else {
   2887     /* we have been connected fine, we're not waiting for anything else. */
   2888     connssl->connecting_state = ssl_connect_3;
   2889 
   2890     /* Informational message */
   2891     infof(data, "SSL connection using %s / %s\n",
   2892           get_ssl_version_txt(BACKEND->handle),
   2893           SSL_get_cipher(BACKEND->handle));
   2894 
   2895 #ifdef HAS_ALPN
   2896     /* Sets data and len to negotiated protocol, len is 0 if no protocol was
   2897      * negotiated
   2898      */
   2899     if(conn->bits.tls_enable_alpn) {
   2900       const unsigned char *neg_protocol;
   2901       unsigned int len;
   2902       SSL_get0_alpn_selected(BACKEND->handle, &neg_protocol, &len);
   2903       if(len != 0) {
   2904         infof(data, "ALPN, server accepted to use %.*s\n", len, neg_protocol);
   2905 
   2906 #ifdef USE_NGHTTP2
   2907         if(len == NGHTTP2_PROTO_VERSION_ID_LEN &&
   2908            !memcmp(NGHTTP2_PROTO_VERSION_ID, neg_protocol, len)) {
   2909           conn->negnpn = CURL_HTTP_VERSION_2;
   2910         }
   2911         else
   2912 #endif
   2913         if(len == ALPN_HTTP_1_1_LENGTH &&
   2914            !memcmp(ALPN_HTTP_1_1, neg_protocol, ALPN_HTTP_1_1_LENGTH)) {
   2915           conn->negnpn = CURL_HTTP_VERSION_1_1;
   2916         }
   2917       }
   2918       else
   2919         infof(data, "ALPN, server did not agree to a protocol\n");
   2920     }
   2921 #endif
   2922 
   2923     return CURLE_OK;
   2924   }
   2925 }
   2926 
   2927 static int asn1_object_dump(ASN1_OBJECT *a, char *buf, size_t len)
   2928 {
   2929   int i, ilen;
   2930 
   2931   ilen = (int)len;
   2932   if(ilen < 0)
   2933     return 1; /* buffer too big */
   2934 
   2935   i = i2t_ASN1_OBJECT(buf, ilen, a);
   2936 
   2937   if(i >= ilen)
   2938     return 1; /* buffer too small */
   2939 
   2940   return 0;
   2941 }
   2942 
   2943 #define push_certinfo(_label, _num) \
   2944 do {                              \
   2945   long info_len = BIO_get_mem_data(mem, &ptr); \
   2946   Curl_ssl_push_certinfo_len(data, _num, _label, ptr, info_len); \
   2947   if(1 != BIO_reset(mem))                                        \
   2948     break;                                                       \
   2949 } WHILE_FALSE
   2950 
   2951 static void pubkey_show(struct Curl_easy *data,
   2952                         BIO *mem,
   2953                         int num,
   2954                         const char *type,
   2955                         const char *name,
   2956 #ifdef HAVE_OPAQUE_RSA_DSA_DH
   2957                         const
   2958 #endif
   2959                         BIGNUM *bn)
   2960 {
   2961   char *ptr;
   2962   char namebuf[32];
   2963 
   2964   msnprintf(namebuf, sizeof(namebuf), "%s(%s)", type, name);
   2965 
   2966   if(bn)
   2967     BN_print(mem, bn);
   2968   push_certinfo(namebuf, num);
   2969 }
   2970 
   2971 #ifdef HAVE_OPAQUE_RSA_DSA_DH
   2972 #define print_pubkey_BN(_type, _name, _num)              \
   2973   pubkey_show(data, mem, _num, #_type, #_name, _name)
   2974 
   2975 #else
   2976 #define print_pubkey_BN(_type, _name, _num)    \
   2977 do {                              \
   2978   if(_type->_name) { \
   2979     pubkey_show(data, mem, _num, #_type, #_name, _type->_name); \
   2980   } \
   2981 } WHILE_FALSE
   2982 #endif
   2983 
   2984 static int X509V3_ext(struct Curl_easy *data,
   2985                       int certnum,
   2986                       CONST_EXTS STACK_OF(X509_EXTENSION) *exts)
   2987 {
   2988   int i;
   2989   size_t j;
   2990 
   2991   if((int)sk_X509_EXTENSION_num(exts) <= 0)
   2992     /* no extensions, bail out */
   2993     return 1;
   2994 
   2995   for(i = 0; i < (int)sk_X509_EXTENSION_num(exts); i++) {
   2996     ASN1_OBJECT *obj;
   2997     X509_EXTENSION *ext = sk_X509_EXTENSION_value(exts, i);
   2998     BUF_MEM *biomem;
   2999     char buf[512];
   3000     char *ptr = buf;
   3001     char namebuf[128];
   3002     BIO *bio_out = BIO_new(BIO_s_mem());
   3003 
   3004     if(!bio_out)
   3005       return 1;
   3006 
   3007     obj = X509_EXTENSION_get_object(ext);
   3008 
   3009     asn1_object_dump(obj, namebuf, sizeof(namebuf));
   3010 
   3011     if(!X509V3_EXT_print(bio_out, ext, 0, 0))
   3012       ASN1_STRING_print(bio_out, (ASN1_STRING *)X509_EXTENSION_get_data(ext));
   3013 
   3014     BIO_get_mem_ptr(bio_out, &biomem);
   3015 
   3016     for(j = 0; j < (size_t)biomem->length; j++) {
   3017       const char *sep = "";
   3018       if(biomem->data[j] == '\n') {
   3019         sep = ", ";
   3020         j++; /* skip the newline */
   3021       };
   3022       while((j<(size_t)biomem->length) && (biomem->data[j] == ' '))
   3023         j++;
   3024       if(j<(size_t)biomem->length)
   3025         ptr += msnprintf(ptr, sizeof(buf)-(ptr-buf), "%s%c", sep,
   3026                          biomem->data[j]);
   3027     }
   3028 
   3029     Curl_ssl_push_certinfo(data, certnum, namebuf, buf);
   3030 
   3031     BIO_free(bio_out);
   3032 
   3033   }
   3034   return 0; /* all is fine */
   3035 }
   3036 
   3037 static CURLcode get_cert_chain(struct connectdata *conn,
   3038                                struct ssl_connect_data *connssl)
   3039 
   3040 {
   3041   CURLcode result;
   3042   STACK_OF(X509) *sk;
   3043   int i;
   3044   struct Curl_easy *data = conn->data;
   3045   int numcerts;
   3046   BIO *mem;
   3047 
   3048   sk = SSL_get_peer_cert_chain(BACKEND->handle);
   3049   if(!sk) {
   3050     return CURLE_OUT_OF_MEMORY;
   3051   }
   3052 
   3053   numcerts = sk_X509_num(sk);
   3054 
   3055   result = Curl_ssl_init_certinfo(data, numcerts);
   3056   if(result) {
   3057     return result;
   3058   }
   3059 
   3060   mem = BIO_new(BIO_s_mem());
   3061 
   3062   for(i = 0; i < numcerts; i++) {
   3063     ASN1_INTEGER *num;
   3064     X509 *x = sk_X509_value(sk, i);
   3065     EVP_PKEY *pubkey = NULL;
   3066     int j;
   3067     char *ptr;
   3068     const ASN1_BIT_STRING *psig = NULL;
   3069 
   3070     X509_NAME_print_ex(mem, X509_get_subject_name(x), 0, XN_FLAG_ONELINE);
   3071     push_certinfo("Subject", i);
   3072 
   3073     X509_NAME_print_ex(mem, X509_get_issuer_name(x), 0, XN_FLAG_ONELINE);
   3074     push_certinfo("Issuer", i);
   3075 
   3076     BIO_printf(mem, "%lx", X509_get_version(x));
   3077     push_certinfo("Version", i);
   3078 
   3079     num = X509_get_serialNumber(x);
   3080     if(num->type == V_ASN1_NEG_INTEGER)
   3081       BIO_puts(mem, "-");
   3082     for(j = 0; j < num->length; j++)
   3083       BIO_printf(mem, "%02x", num->data[j]);
   3084     push_certinfo("Serial Number", i);
   3085 
   3086 #if defined(HAVE_X509_GET0_SIGNATURE) && defined(HAVE_X509_GET0_EXTENSIONS)
   3087     {
   3088       const X509_ALGOR *palg = NULL;
   3089       ASN1_STRING *a = ASN1_STRING_new();
   3090       if(a) {
   3091         X509_get0_signature(&psig, &palg, x);
   3092         X509_signature_print(mem, ARG2_X509_signature_print palg, a);
   3093         ASN1_STRING_free(a);
   3094 
   3095         if(palg) {
   3096           i2a_ASN1_OBJECT(mem, palg->algorithm);
   3097           push_certinfo("Public Key Algorithm", i);
   3098         }
   3099       }
   3100       X509V3_ext(data, i, X509_get0_extensions(x));
   3101     }
   3102 #else
   3103     {
   3104       /* before OpenSSL 1.0.2 */
   3105       X509_CINF *cinf = x->cert_info;
   3106 
   3107       i2a_ASN1_OBJECT(mem, cinf->signature->algorithm);
   3108       push_certinfo("Signature Algorithm", i);
   3109 
   3110       i2a_ASN1_OBJECT(mem, cinf->key->algor->algorithm);
   3111       push_certinfo("Public Key Algorithm", i);
   3112 
   3113       X509V3_ext(data, i, cinf->extensions);
   3114 
   3115       psig = x->signature;
   3116     }
   3117 #endif
   3118 
   3119     ASN1_TIME_print(mem, X509_get0_notBefore(x));
   3120     push_certinfo("Start date", i);
   3121 
   3122     ASN1_TIME_print(mem, X509_get0_notAfter(x));
   3123     push_certinfo("Expire date", i);
   3124 
   3125     pubkey = X509_get_pubkey(x);
   3126     if(!pubkey)
   3127       infof(data, "   Unable to load public key\n");
   3128     else {
   3129       int pktype;
   3130 #ifdef HAVE_OPAQUE_EVP_PKEY
   3131       pktype = EVP_PKEY_id(pubkey);
   3132 #else
   3133       pktype = pubkey->type;
   3134 #endif
   3135       switch(pktype) {
   3136       case EVP_PKEY_RSA:
   3137       {
   3138         RSA *rsa;
   3139 #ifdef HAVE_OPAQUE_EVP_PKEY
   3140         rsa = EVP_PKEY_get0_RSA(pubkey);
   3141 #else
   3142         rsa = pubkey->pkey.rsa;
   3143 #endif
   3144 
   3145 #ifdef HAVE_OPAQUE_RSA_DSA_DH
   3146         {
   3147           const BIGNUM *n;
   3148           const BIGNUM *e;
   3149 
   3150           RSA_get0_key(rsa, &n, &e, NULL);
   3151           BN_print(mem, n);
   3152           push_certinfo("RSA Public Key", i);
   3153           print_pubkey_BN(rsa, n, i);
   3154           print_pubkey_BN(rsa, e, i);
   3155         }
   3156 #else
   3157         BIO_printf(mem, "%d", BN_num_bits(rsa->n));
   3158         push_certinfo("RSA Public Key", i);
   3159         print_pubkey_BN(rsa, n, i);
   3160         print_pubkey_BN(rsa, e, i);
   3161 #endif
   3162 
   3163         break;
   3164       }
   3165       case EVP_PKEY_DSA:
   3166       {
   3167 #ifndef OPENSSL_NO_DSA
   3168         DSA *dsa;
   3169 #ifdef HAVE_OPAQUE_EVP_PKEY
   3170         dsa = EVP_PKEY_get0_DSA(pubkey);
   3171 #else
   3172         dsa = pubkey->pkey.dsa;
   3173 #endif
   3174 #ifdef HAVE_OPAQUE_RSA_DSA_DH
   3175         {
   3176           const BIGNUM *p;
   3177           const BIGNUM *q;
   3178           const BIGNUM *g;
   3179           const BIGNUM *pub_key;
   3180 
   3181           DSA_get0_pqg(dsa, &p, &q, &g);
   3182           DSA_get0_key(dsa, &pub_key, NULL);
   3183 
   3184           print_pubkey_BN(dsa, p, i);
   3185           print_pubkey_BN(dsa, q, i);
   3186           print_pubkey_BN(dsa, g, i);
   3187           print_pubkey_BN(dsa, pub_key, i);
   3188         }
   3189 #else
   3190         print_pubkey_BN(dsa, p, i);
   3191         print_pubkey_BN(dsa, q, i);
   3192         print_pubkey_BN(dsa, g, i);
   3193         print_pubkey_BN(dsa, pub_key, i);
   3194 #endif
   3195 #endif /* !OPENSSL_NO_DSA */
   3196         break;
   3197       }
   3198       case EVP_PKEY_DH:
   3199       {
   3200         DH *dh;
   3201 #ifdef HAVE_OPAQUE_EVP_PKEY
   3202         dh = EVP_PKEY_get0_DH(pubkey);
   3203 #else
   3204         dh = pubkey->pkey.dh;
   3205 #endif
   3206 #ifdef HAVE_OPAQUE_RSA_DSA_DH
   3207         {
   3208           const BIGNUM *p;
   3209           const BIGNUM *q;
   3210           const BIGNUM *g;
   3211           const BIGNUM *pub_key;
   3212           DH_get0_pqg(dh, &p, &q, &g);
   3213           DH_get0_key(dh, &pub_key, NULL);
   3214           print_pubkey_BN(dh, p, i);
   3215           print_pubkey_BN(dh, q, i);
   3216           print_pubkey_BN(dh, g, i);
   3217           print_pubkey_BN(dh, pub_key, i);
   3218        }
   3219 #else
   3220         print_pubkey_BN(dh, p, i);
   3221         print_pubkey_BN(dh, g, i);
   3222         print_pubkey_BN(dh, pub_key, i);
   3223 #endif
   3224         break;
   3225       }
   3226 #if 0
   3227       case EVP_PKEY_EC: /* symbol not present in OpenSSL 0.9.6 */
   3228         /* left TODO */
   3229         break;
   3230 #endif
   3231       }
   3232       EVP_PKEY_free(pubkey);
   3233     }
   3234 
   3235     if(psig) {
   3236       for(j = 0; j < psig->length; j++)
   3237         BIO_printf(mem, "%02x:", psig->data[j]);
   3238       push_certinfo("Signature", i);
   3239     }
   3240 
   3241     PEM_write_bio_X509(mem, x);
   3242     push_certinfo("Cert", i);
   3243   }
   3244 
   3245   BIO_free(mem);
   3246 
   3247   return CURLE_OK;
   3248 }
   3249 
   3250 /*
   3251  * Heavily modified from:
   3252  * https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning#OpenSSL
   3253  */
   3254 static CURLcode pkp_pin_peer_pubkey(struct Curl_easy *data, X509* cert,
   3255                                     const char *pinnedpubkey)
   3256 {
   3257   /* Scratch */
   3258   int len1 = 0, len2 = 0;
   3259   unsigned char *buff1 = NULL, *temp = NULL;
   3260 
   3261   /* Result is returned to caller */
   3262   CURLcode result = CURLE_SSL_PINNEDPUBKEYNOTMATCH;
   3263 
   3264   /* if a path wasn't specified, don't pin */
   3265   if(!pinnedpubkey)
   3266     return CURLE_OK;
   3267 
   3268   if(!cert)
   3269     return result;
   3270 
   3271   do {
   3272     /* Begin Gyrations to get the subjectPublicKeyInfo     */
   3273     /* Thanks to Viktor Dukhovni on the OpenSSL mailing list */
   3274 
   3275     /* https://groups.google.com/group/mailing.openssl.users/browse_thread
   3276      /thread/d61858dae102c6c7 */
   3277     len1 = i2d_X509_PUBKEY(X509_get_X509_PUBKEY(cert), NULL);
   3278     if(len1 < 1)
   3279       break; /* failed */
   3280 
   3281     /* https://www.openssl.org/docs/crypto/buffer.html */
   3282     buff1 = temp = malloc(len1);
   3283     if(!buff1)
   3284       break; /* failed */
   3285 
   3286     /* https://www.openssl.org/docs/crypto/d2i_X509.html */
   3287     len2 = i2d_X509_PUBKEY(X509_get_X509_PUBKEY(cert), &temp);
   3288 
   3289     /*
   3290      * These checks are verifying we got back the same values as when we
   3291      * sized the buffer. It's pretty weak since they should always be the
   3292      * same. But it gives us something to test.
   3293      */
   3294     if((len1 != len2) || !temp || ((temp - buff1) != len1))
   3295       break; /* failed */
   3296 
   3297     /* End Gyrations */
   3298 
   3299     /* The one good exit point */
   3300     result = Curl_pin_peer_pubkey(data, pinnedpubkey, buff1, len1);
   3301   } while(0);
   3302 
   3303   /* https://www.openssl.org/docs/crypto/buffer.html */
   3304   if(buff1)
   3305     free(buff1);
   3306 
   3307   return result;
   3308 }
   3309 
   3310 /*
   3311  * Get the server cert, verify it and show it etc, only call failf() if the
   3312  * 'strict' argument is TRUE as otherwise all this is for informational
   3313  * purposes only!
   3314  *
   3315  * We check certificates to authenticate the server; otherwise we risk
   3316  * man-in-the-middle attack.
   3317  */
   3318 static CURLcode servercert(struct connectdata *conn,
   3319                            struct ssl_connect_data *connssl,
   3320                            bool strict)
   3321 {
   3322   CURLcode result = CURLE_OK;
   3323   int rc;
   3324   long lerr;
   3325   struct Curl_easy *data = conn->data;
   3326   X509 *issuer;
   3327   BIO *fp = NULL;
   3328   char error_buffer[256]="";
   3329   char buffer[2048];
   3330   const char *ptr;
   3331   long * const certverifyresult = SSL_IS_PROXY() ?
   3332     &data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult;
   3333   BIO *mem = BIO_new(BIO_s_mem());
   3334 
   3335   if(data->set.ssl.certinfo)
   3336     /* we've been asked to gather certificate info! */
   3337     (void)get_cert_chain(conn, connssl);
   3338 
   3339   BACKEND->server_cert = SSL_get_peer_certificate(BACKEND->handle);
   3340   if(!BACKEND->server_cert) {
   3341     BIO_free(mem);
   3342     if(!strict)
   3343       return CURLE_OK;
   3344 
   3345     failf(data, "SSL: couldn't get peer certificate!");
   3346     return CURLE_PEER_FAILED_VERIFICATION;
   3347   }
   3348 
   3349   infof(data, "%s certificate:\n", SSL_IS_PROXY() ? "Proxy" : "Server");
   3350 
   3351   rc = x509_name_oneline(X509_get_subject_name(BACKEND->server_cert),
   3352                          buffer, sizeof(buffer));
   3353   infof(data, " subject: %s\n", rc?"[NONE]":buffer);
   3354 
   3355 #ifndef CURL_DISABLE_VERBOSE_STRINGS
   3356   {
   3357     long len;
   3358     ASN1_TIME_print(mem, X509_get0_notBefore(BACKEND->server_cert));
   3359     len = BIO_get_mem_data(mem, (char **) &ptr);
   3360     infof(data, " start date: %.*s\n", len, ptr);
   3361     (void)BIO_reset(mem);
   3362 
   3363     ASN1_TIME_print(mem, X509_get0_notAfter(BACKEND->server_cert));
   3364     len = BIO_get_mem_data(mem, (char **) &ptr);
   3365     infof(data, " expire date: %.*s\n", len, ptr);
   3366     (void)BIO_reset(mem);
   3367   }
   3368 #endif
   3369 
   3370   BIO_free(mem);
   3371 
   3372   if(SSL_CONN_CONFIG(verifyhost)) {
   3373     result = verifyhost(conn, BACKEND->server_cert);
   3374     if(result) {
   3375       X509_free(BACKEND->server_cert);
   3376       BACKEND->server_cert = NULL;
   3377       return result;
   3378     }
   3379   }
   3380 
   3381   rc = x509_name_oneline(X509_get_issuer_name(BACKEND->server_cert),
   3382                          buffer, sizeof(buffer));
   3383   if(rc) {
   3384     if(strict)
   3385       failf(data, "SSL: couldn't get X509-issuer name!");
   3386     result = CURLE_PEER_FAILED_VERIFICATION;
   3387   }
   3388   else {
   3389     infof(data, " issuer: %s\n", buffer);
   3390 
   3391     /* We could do all sorts of certificate verification stuff here before
   3392        deallocating the certificate. */
   3393 
   3394     /* e.g. match issuer name with provided issuer certificate */
   3395     if(SSL_SET_OPTION(issuercert)) {
   3396       fp = BIO_new(BIO_s_file());
   3397       if(fp == NULL) {
   3398         failf(data,
   3399               "BIO_new return NULL, " OSSL_PACKAGE
   3400               " error %s",
   3401               ossl_strerror(ERR_get_error(), error_buffer,
   3402                             sizeof(error_buffer)) );
   3403         X509_free(BACKEND->server_cert);
   3404         BACKEND->server_cert = NULL;
   3405         return CURLE_OUT_OF_MEMORY;
   3406       }
   3407 
   3408       if(BIO_read_filename(fp, SSL_SET_OPTION(issuercert)) <= 0) {
   3409         if(strict)
   3410           failf(data, "SSL: Unable to open issuer cert (%s)",
   3411                 SSL_SET_OPTION(issuercert));
   3412         BIO_free(fp);
   3413         X509_free(BACKEND->server_cert);
   3414         BACKEND->server_cert = NULL;
   3415         return CURLE_SSL_ISSUER_ERROR;
   3416       }
   3417 
   3418       issuer = PEM_read_bio_X509(fp, NULL, ZERO_NULL, NULL);
   3419       if(!issuer) {
   3420         if(strict)
   3421           failf(data, "SSL: Unable to read issuer cert (%s)",
   3422                 SSL_SET_OPTION(issuercert));
   3423         BIO_free(fp);
   3424         X509_free(issuer);
   3425         X509_free(BACKEND->server_cert);
   3426         BACKEND->server_cert = NULL;
   3427         return CURLE_SSL_ISSUER_ERROR;
   3428       }
   3429 
   3430       if(X509_check_issued(issuer, BACKEND->server_cert) != X509_V_OK) {
   3431         if(strict)
   3432           failf(data, "SSL: Certificate issuer check failed (%s)",
   3433                 SSL_SET_OPTION(issuercert));
   3434         BIO_free(fp);
   3435         X509_free(issuer);
   3436         X509_free(BACKEND->server_cert);
   3437         BACKEND->server_cert = NULL;
   3438         return CURLE_SSL_ISSUER_ERROR;
   3439       }
   3440 
   3441       infof(data, " SSL certificate issuer check ok (%s)\n",
   3442             SSL_SET_OPTION(issuercert));
   3443       BIO_free(fp);
   3444       X509_free(issuer);
   3445     }
   3446 
   3447     lerr = *certverifyresult = SSL_get_verify_result(BACKEND->handle);
   3448 
   3449     if(*certverifyresult != X509_V_OK) {
   3450       if(SSL_CONN_CONFIG(verifypeer)) {
   3451         /* We probably never reach this, because SSL_connect() will fail
   3452            and we return earlier if verifypeer is set? */
   3453         if(strict)
   3454           failf(data, "SSL certificate verify result: %s (%ld)",
   3455                 X509_verify_cert_error_string(lerr), lerr);
   3456         result = CURLE_PEER_FAILED_VERIFICATION;
   3457       }
   3458       else
   3459         infof(data, " SSL certificate verify result: %s (%ld),"
   3460               " continuing anyway.\n",
   3461               X509_verify_cert_error_string(lerr), lerr);
   3462     }
   3463     else
   3464       infof(data, " SSL certificate verify ok.\n");
   3465   }
   3466 
   3467 #if (OPENSSL_VERSION_NUMBER >= 0x0090808fL) && !defined(OPENSSL_NO_TLSEXT) && \
   3468     !defined(OPENSSL_NO_OCSP)
   3469   if(SSL_CONN_CONFIG(verifystatus)) {
   3470     result = verifystatus(conn, connssl);
   3471     if(result) {
   3472       X509_free(BACKEND->server_cert);
   3473       BACKEND->server_cert = NULL;
   3474       return result;
   3475     }
   3476   }
   3477 #endif
   3478 
   3479   if(!strict)
   3480     /* when not strict, we don't bother about the verify cert problems */
   3481     result = CURLE_OK;
   3482 
   3483   ptr = SSL_IS_PROXY() ? data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY] :
   3484                          data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
   3485   if(!result && ptr) {
   3486     result = pkp_pin_peer_pubkey(data, BACKEND->server_cert, ptr);
   3487     if(result)
   3488       failf(data, "SSL: public key does not match pinned public key!");
   3489   }
   3490 
   3491   X509_free(BACKEND->server_cert);
   3492   BACKEND->server_cert = NULL;
   3493   connssl->connecting_state = ssl_connect_done;
   3494 
   3495   return result;
   3496 }
   3497 
   3498 static CURLcode ossl_connect_step3(struct connectdata *conn, int sockindex)
   3499 {
   3500   CURLcode result = CURLE_OK;
   3501   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   3502 
   3503   DEBUGASSERT(ssl_connect_3 == connssl->connecting_state);
   3504 
   3505   /*
   3506    * We check certificates to authenticate the server; otherwise we risk
   3507    * man-in-the-middle attack; NEVERTHELESS, if we're told explicitly not to
   3508    * verify the peer ignore faults and failures from the server cert
   3509    * operations.
   3510    */
   3511 
   3512   result = servercert(conn, connssl, (SSL_CONN_CONFIG(verifypeer) ||
   3513                                       SSL_CONN_CONFIG(verifyhost)));
   3514 
   3515   if(!result)
   3516     connssl->connecting_state = ssl_connect_done;
   3517 
   3518   return result;
   3519 }
   3520 
   3521 static Curl_recv ossl_recv;
   3522 static Curl_send ossl_send;
   3523 
   3524 static CURLcode ossl_connect_common(struct connectdata *conn,
   3525                                     int sockindex,
   3526                                     bool nonblocking,
   3527                                     bool *done)
   3528 {
   3529   CURLcode result;
   3530   struct Curl_easy *data = conn->data;
   3531   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   3532   curl_socket_t sockfd = conn->sock[sockindex];
   3533   time_t timeout_ms;
   3534   int what;
   3535 
   3536   /* check if the connection has already been established */
   3537   if(ssl_connection_complete == connssl->state) {
   3538     *done = TRUE;
   3539     return CURLE_OK;
   3540   }
   3541 
   3542   if(ssl_connect_1 == connssl->connecting_state) {
   3543     /* Find out how much more time we're allowed */
   3544     timeout_ms = Curl_timeleft(data, NULL, TRUE);
   3545 
   3546     if(timeout_ms < 0) {
   3547       /* no need to continue if time already is up */
   3548       failf(data, "SSL connection timeout");
   3549       return CURLE_OPERATION_TIMEDOUT;
   3550     }
   3551 
   3552     result = ossl_connect_step1(conn, sockindex);
   3553     if(result)
   3554       return result;
   3555   }
   3556 
   3557   while(ssl_connect_2 == connssl->connecting_state ||
   3558         ssl_connect_2_reading == connssl->connecting_state ||
   3559         ssl_connect_2_writing == connssl->connecting_state) {
   3560 
   3561     /* check allowed time left */
   3562     timeout_ms = Curl_timeleft(data, NULL, TRUE);
   3563 
   3564     if(timeout_ms < 0) {
   3565       /* no need to continue if time already is up */
   3566       failf(data, "SSL connection timeout");
   3567       return CURLE_OPERATION_TIMEDOUT;
   3568     }
   3569 
   3570     /* if ssl is expecting something, check if it's available. */
   3571     if(connssl->connecting_state == ssl_connect_2_reading ||
   3572        connssl->connecting_state == ssl_connect_2_writing) {
   3573 
   3574       curl_socket_t writefd = ssl_connect_2_writing ==
   3575         connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
   3576       curl_socket_t readfd = ssl_connect_2_reading ==
   3577         connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
   3578 
   3579       what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
   3580                                nonblocking?0:timeout_ms);
   3581       if(what < 0) {
   3582         /* fatal error */
   3583         failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
   3584         return CURLE_SSL_CONNECT_ERROR;
   3585       }
   3586       if(0 == what) {
   3587         if(nonblocking) {
   3588           *done = FALSE;
   3589           return CURLE_OK;
   3590         }
   3591         /* timeout */
   3592         failf(data, "SSL connection timeout");
   3593         return CURLE_OPERATION_TIMEDOUT;
   3594       }
   3595       /* socket is readable or writable */
   3596     }
   3597 
   3598     /* Run transaction, and return to the caller if it failed or if this
   3599      * connection is done nonblocking and this loop would execute again. This
   3600      * permits the owner of a multi handle to abort a connection attempt
   3601      * before step2 has completed while ensuring that a client using select()
   3602      * or epoll() will always have a valid fdset to wait on.
   3603      */
   3604     result = ossl_connect_step2(conn, sockindex);
   3605     if(result || (nonblocking &&
   3606                   (ssl_connect_2 == connssl->connecting_state ||
   3607                    ssl_connect_2_reading == connssl->connecting_state ||
   3608                    ssl_connect_2_writing == connssl->connecting_state)))
   3609       return result;
   3610 
   3611   } /* repeat step2 until all transactions are done. */
   3612 
   3613   if(ssl_connect_3 == connssl->connecting_state) {
   3614     result = ossl_connect_step3(conn, sockindex);
   3615     if(result)
   3616       return result;
   3617   }
   3618 
   3619   if(ssl_connect_done == connssl->connecting_state) {
   3620     connssl->state = ssl_connection_complete;
   3621     conn->recv[sockindex] = ossl_recv;
   3622     conn->send[sockindex] = ossl_send;
   3623     *done = TRUE;
   3624   }
   3625   else
   3626     *done = FALSE;
   3627 
   3628   /* Reset our connect state machine */
   3629   connssl->connecting_state = ssl_connect_1;
   3630 
   3631   return CURLE_OK;
   3632 }
   3633 
   3634 static CURLcode Curl_ossl_connect_nonblocking(struct connectdata *conn,
   3635                                               int sockindex,
   3636                                               bool *done)
   3637 {
   3638   return ossl_connect_common(conn, sockindex, TRUE, done);
   3639 }
   3640 
   3641 static CURLcode Curl_ossl_connect(struct connectdata *conn, int sockindex)
   3642 {
   3643   CURLcode result;
   3644   bool done = FALSE;
   3645 
   3646   result = ossl_connect_common(conn, sockindex, FALSE, &done);
   3647   if(result)
   3648     return result;
   3649 
   3650   DEBUGASSERT(done);
   3651 
   3652   return CURLE_OK;
   3653 }
   3654 
   3655 static bool Curl_ossl_data_pending(const struct connectdata *conn,
   3656                                    int connindex)
   3657 {
   3658   const struct ssl_connect_data *connssl = &conn->ssl[connindex];
   3659   const struct ssl_connect_data *proxyssl = &conn->proxy_ssl[connindex];
   3660 
   3661   if(connssl->backend->handle && SSL_pending(connssl->backend->handle))
   3662     return TRUE;
   3663 
   3664   if(proxyssl->backend->handle && SSL_pending(proxyssl->backend->handle))
   3665     return TRUE;
   3666 
   3667   return FALSE;
   3668 }
   3669 
   3670 static size_t Curl_ossl_version(char *buffer, size_t size);
   3671 
   3672 static ssize_t ossl_send(struct connectdata *conn,
   3673                          int sockindex,
   3674                          const void *mem,
   3675                          size_t len,
   3676                          CURLcode *curlcode)
   3677 {
   3678   /* SSL_write() is said to return 'int' while write() and send() returns
   3679      'size_t' */
   3680   int err;
   3681   char error_buffer[256];
   3682   unsigned long sslerror;
   3683   int memlen;
   3684   int rc;
   3685   struct ssl_connect_data *connssl = &conn->ssl[sockindex];
   3686 
   3687   ERR_clear_error();
   3688 
   3689   memlen = (len > (size_t)INT_MAX) ? INT_MAX : (int)len;
   3690   rc = SSL_write(BACKEND->handle, mem, memlen);
   3691 
   3692   if(rc <= 0) {
   3693     err = SSL_get_error(BACKEND->handle, rc);
   3694 
   3695     switch(err) {
   3696     case SSL_ERROR_WANT_READ:
   3697     case SSL_ERROR_WANT_WRITE:
   3698       /* The operation did not complete; the same TLS/SSL I/O function
   3699          should be called again later. This is basically an EWOULDBLOCK
   3700          equivalent. */
   3701       *curlcode = CURLE_AGAIN;
   3702       return -1;
   3703     case SSL_ERROR_SYSCALL:
   3704       failf(conn->data, "SSL_write() returned SYSCALL, errno = %d",
   3705             SOCKERRNO);
   3706       *curlcode = CURLE_SEND_ERROR;
   3707       return -1;
   3708     case SSL_ERROR_SSL:
   3709       /*  A failure in the SSL library occurred, usually a protocol error.
   3710           The OpenSSL error queue contains more information on the error. */
   3711       sslerror = ERR_get_error();
   3712       if(ERR_GET_LIB(sslerror) == ERR_LIB_SSL &&
   3713          ERR_GET_REASON(sslerror) == SSL_R_BIO_NOT_SET &&
   3714          conn->ssl[sockindex].state == ssl_connection_complete &&
   3715          conn->proxy_ssl[sockindex].state == ssl_connection_complete) {
   3716         char ver[120];
   3717         Curl_ossl_version(ver, 120);
   3718         failf(conn->data, "Error: %s does not support double SSL tunneling.",
   3719               ver);
   3720       }
   3721       else
   3722         failf(conn->data, "SSL_write() error: %s",
   3723               ossl_strerror(sslerror, error_buffer, sizeof(error_buffer)));
   3724       *curlcode = CURLE_SEND_ERROR;
   3725       return -1;
   3726     }
   3727     /* a true error */
   3728     failf(conn->data, OSSL_PACKAGE " SSL_write: %s, errno %d",
   3729           SSL_ERROR_to_str(err), SOCKERRNO);
   3730     *curlcode = CURLE_SEND_ERROR;
   3731     return -1;
   3732   }
   3733   *curlcode = CURLE_OK;
   3734   return (ssize_t)rc; /* number of bytes */
   3735 }
   3736 
   3737 static ssize_t ossl_recv(struct connectdata *conn, /* connection data */
   3738                          int num,                  /* socketindex */
   3739                          char *buf,                /* store read data here */
   3740                          size_t buffersize,        /* max amount to read */
   3741                          CURLcode *curlcode)
   3742 {
   3743   char error_buffer[256];
   3744   unsigned long sslerror;
   3745   ssize_t nread;
   3746   int buffsize;
   3747   struct ssl_connect_data *connssl = &conn->ssl[num];
   3748 
   3749   ERR_clear_error();
   3750 
   3751   buffsize = (buffersize > (size_t)INT_MAX) ? INT_MAX : (int)buffersize;
   3752   nread = (ssize_t)SSL_read(BACKEND->handle, buf, buffsize);
   3753   if(nread <= 0) {
   3754     /* failed SSL_read */
   3755     int err = SSL_get_error(BACKEND->handle, (int)nread);
   3756 
   3757     switch(err) {
   3758     case SSL_ERROR_NONE: /* this is not an error */
   3759     case SSL_ERROR_ZERO_RETURN: /* no more data */
   3760       break;
   3761     case SSL_ERROR_WANT_READ:
   3762     case SSL_ERROR_WANT_WRITE:
   3763       /* there's data pending, re-invoke SSL_read() */
   3764       *curlcode = CURLE_AGAIN;
   3765       return -1;
   3766     default:
   3767       /* openssl/ssl.h for SSL_ERROR_SYSCALL says "look at error stack/return
   3768          value/errno" */
   3769       /* https://www.openssl.org/docs/crypto/ERR_get_error.html */
   3770       sslerror = ERR_get_error();
   3771       if((nread < 0) || sslerror) {
   3772         /* If the return code was negative or there actually is an error in the
   3773            queue */
   3774         failf(conn->data, OSSL_PACKAGE " SSL_read: %s, errno %d",
   3775               (sslerror ?
   3776                ossl_strerror(sslerror, error_buffer, sizeof(error_buffer)) :
   3777                SSL_ERROR_to_str(err)),
   3778               SOCKERRNO);
   3779         *curlcode = CURLE_RECV_ERROR;
   3780         return -1;
   3781       }
   3782     }
   3783   }
   3784   return nread;
   3785 }
   3786 
   3787 static size_t Curl_ossl_version(char *buffer, size_t size)
   3788 {
   3789 #ifdef OPENSSL_IS_BORINGSSL
   3790   return msnprintf(buffer, size, OSSL_PACKAGE);
   3791 #elif defined(HAVE_OPENSSL_VERSION) && defined(OPENSSL_VERSION_STRING)
   3792   return msnprintf(buffer, size, "%s/%s",
   3793                    OSSL_PACKAGE, OpenSSL_version(OPENSSL_VERSION_STRING));
   3794 #else
   3795   /* not BoringSSL and not using OpenSSL_version */
   3796 
   3797   char sub[3];
   3798   unsigned long ssleay_value;
   3799   sub[2]='\0';
   3800   sub[1]='\0';
   3801   ssleay_value = OpenSSL_version_num();
   3802   if(ssleay_value < 0x906000) {
   3803     ssleay_value = SSLEAY_VERSION_NUMBER;
   3804     sub[0]='\0';
   3805   }
   3806   else {
   3807     if(ssleay_value&0xff0) {
   3808       int minor_ver = (ssleay_value >> 4) & 0xff;
   3809       if(minor_ver > 26) {
   3810         /* handle extended version introduced for 0.9.8za */
   3811         sub[1] = (char) ((minor_ver - 1) % 26 + 'a' + 1);
   3812         sub[0] = 'z';
   3813       }
   3814       else {
   3815         sub[0] = (char) (minor_ver + 'a' - 1);
   3816       }
   3817     }
   3818     else
   3819       sub[0]='\0';
   3820   }
   3821 
   3822   return msnprintf(buffer, size, "%s/%lx.%lx.%lx%s",
   3823                    OSSL_PACKAGE,
   3824                    (ssleay_value>>28)&0xf,
   3825                    (ssleay_value>>20)&0xff,
   3826                    (ssleay_value>>12)&0xff,
   3827                    sub);
   3828 #endif /* OPENSSL_IS_BORINGSSL */
   3829 }
   3830 
   3831 /* can be called with data == NULL */
   3832 static CURLcode Curl_ossl_random(struct Curl_easy *data,
   3833                                  unsigned char *entropy, size_t length)
   3834 {
   3835   int rc;
   3836   if(data) {
   3837     if(Curl_ossl_seed(data)) /* Initiate the seed if not already done */
   3838       return CURLE_FAILED_INIT; /* couldn't seed for some reason */
   3839   }
   3840   else {
   3841     if(!rand_enough())
   3842       return CURLE_FAILED_INIT;
   3843   }
   3844   /* RAND_bytes() returns 1 on success, 0 otherwise.  */
   3845   rc = RAND_bytes(entropy, curlx_uztosi(length));
   3846   return (rc == 1 ? CURLE_OK : CURLE_FAILED_INIT);
   3847 }
   3848 
   3849 static CURLcode Curl_ossl_md5sum(unsigned char *tmp, /* input */
   3850                                  size_t tmplen,
   3851                                  unsigned char *md5sum /* output */,
   3852                                  size_t unused)
   3853 {
   3854   EVP_MD_CTX *mdctx;
   3855   unsigned int len = 0;
   3856   (void) unused;
   3857 
   3858   mdctx = EVP_MD_CTX_create();
   3859   EVP_DigestInit_ex(mdctx, EVP_md5(), NULL);
   3860   EVP_DigestUpdate(mdctx, tmp, tmplen);
   3861   EVP_DigestFinal_ex(mdctx, md5sum, &len);
   3862   EVP_MD_CTX_destroy(mdctx);
   3863   return CURLE_OK;
   3864 }
   3865 
   3866 #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && !defined(OPENSSL_NO_SHA256)
   3867 static CURLcode Curl_ossl_sha256sum(const unsigned char *tmp, /* input */
   3868                                 size_t tmplen,
   3869                                 unsigned char *sha256sum /* output */,
   3870                                 size_t unused)
   3871 {
   3872   EVP_MD_CTX *mdctx;
   3873   unsigned int len = 0;
   3874   (void) unused;
   3875 
   3876   mdctx =  EVP_MD_CTX_create();
   3877   EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL);
   3878   EVP_DigestUpdate(mdctx, tmp, tmplen);
   3879   EVP_DigestFinal_ex(mdctx, sha256sum, &len);
   3880   EVP_MD_CTX_destroy(mdctx);
   3881   return CURLE_OK;
   3882 }
   3883 #endif
   3884 
   3885 static bool Curl_ossl_cert_status_request(void)
   3886 {
   3887 #if (OPENSSL_VERSION_NUMBER >= 0x0090808fL) && !defined(OPENSSL_NO_TLSEXT) && \
   3888     !defined(OPENSSL_NO_OCSP)
   3889   return TRUE;
   3890 #else
   3891   return FALSE;
   3892 #endif
   3893 }
   3894 
   3895 static void *Curl_ossl_get_internals(struct ssl_connect_data *connssl,
   3896                                      CURLINFO info)
   3897 {
   3898   /* Legacy: CURLINFO_TLS_SESSION must return an SSL_CTX pointer. */
   3899   return info == CURLINFO_TLS_SESSION ?
   3900          (void *)BACKEND->ctx : (void *)BACKEND->handle;
   3901 }
   3902 
   3903 const struct Curl_ssl Curl_ssl_openssl = {
   3904   { CURLSSLBACKEND_OPENSSL, "openssl" }, /* info */
   3905 
   3906   SSLSUPP_CA_PATH |
   3907   SSLSUPP_CERTINFO |
   3908   SSLSUPP_PINNEDPUBKEY |
   3909   SSLSUPP_SSL_CTX |
   3910 #ifdef HAVE_SSL_CTX_SET_CIPHERSUITES
   3911   SSLSUPP_TLS13_CIPHERSUITES |
   3912 #endif
   3913   SSLSUPP_HTTPS_PROXY,
   3914 
   3915   sizeof(struct ssl_backend_data),
   3916 
   3917   Curl_ossl_init,                /* init */
   3918   Curl_ossl_cleanup,             /* cleanup */
   3919   Curl_ossl_version,             /* version */
   3920   Curl_ossl_check_cxn,           /* check_cxn */
   3921   Curl_ossl_shutdown,            /* shutdown */
   3922   Curl_ossl_data_pending,        /* data_pending */
   3923   Curl_ossl_random,              /* random */
   3924   Curl_ossl_cert_status_request, /* cert_status_request */
   3925   Curl_ossl_connect,             /* connect */
   3926   Curl_ossl_connect_nonblocking, /* connect_nonblocking */
   3927   Curl_ossl_get_internals,       /* get_internals */
   3928   Curl_ossl_close,               /* close_one */
   3929   Curl_ossl_close_all,           /* close_all */
   3930   Curl_ossl_session_free,        /* session_free */
   3931   Curl_ossl_set_engine,          /* set_engine */
   3932   Curl_ossl_set_engine_default,  /* set_engine_default */
   3933   Curl_ossl_engines_list,        /* engines_list */
   3934   Curl_none_false_start,         /* false_start */
   3935   Curl_ossl_md5sum,              /* md5sum */
   3936 #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && !defined(OPENSSL_NO_SHA256)
   3937   Curl_ossl_sha256sum            /* sha256sum */
   3938 #else
   3939   NULL                           /* sha256sum */
   3940 #endif
   3941 };
   3942 
   3943 #endif /* USE_OPENSSL */
   3944