Annotation of embedaddon/curl/lib/vtls/openssl.c, revision 1.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>