File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / curl / lib / vtls / openssl.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jun 3 10:01:15 2020 UTC (5 years ago) by misho
Branches: curl, MAIN
CVS tags: v7_70_0p4, HEAD
curl

    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>