1 /*************************************************************************** 2 * _ _ ____ _ 3 * Project ___| | | | _ \| | 4 * / __| | | | |_) | | 5 * | (__| |_| | _ <| |___ 6 * \___|\___/|_| \_\_____| 7 * 8 * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel (at) haxx.se>, et al. 9 * 10 * This software is licensed as described in the file COPYING, which 11 * you should have received as part of this distribution. The terms 12 * are also available at http://curl.haxx.se/docs/copyright.html. 13 * 14 * You may opt to use, copy, modify, merge, publish, distribute and/or sell 15 * copies of the Software, and permit persons to whom the Software is 16 * furnished to do so, under the terms of the COPYING file. 17 * 18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19 * KIND, either express or implied. 20 * 21 ***************************************************************************/ 22 23 /* 24 * Source file for all OpenSSL-specific code for the TLS/SSL layer. No code 25 * but vtls.c should ever call or use these functions. 26 */ 27 28 /* 29 * The original SSLeay-using code for curl was written by Linas Vepstas and 30 * Sampo Kellomaki 1998. 31 */ 32 33 #include "curl_setup.h" 34 35 #ifdef USE_OPENSSL 36 37 #ifdef HAVE_LIMITS_H 38 #include <limits.h> 39 #endif 40 41 #include "urldata.h" 42 #include "sendf.h" 43 #include "formdata.h" /* for the boundary function */ 44 #include "url.h" /* for the ssl config check function */ 45 #include "inet_pton.h" 46 #include "openssl.h" 47 #include "connect.h" 48 #include "slist.h" 49 #include "strequal.h" 50 #include "select.h" 51 #include "vtls.h" 52 #include "rawstr.h" 53 #include "hostcheck.h" 54 #include "curl_printf.h" 55 56 #include <openssl/ssl.h> 57 #include <openssl/rand.h> 58 #include <openssl/x509v3.h> 59 #include <openssl/dsa.h> 60 #include <openssl/dh.h> 61 #include <openssl/err.h> 62 #include <openssl/md5.h> 63 #include <openssl/conf.h> 64 #include <openssl/bn.h> 65 #include <openssl/rsa.h> 66 67 #ifdef HAVE_OPENSSL_PKCS12_H 68 #include <openssl/pkcs12.h> 69 #endif 70 71 #ifndef HAVE_BORINGSSL 72 #include <openssl/ocsp.h> 73 #endif 74 75 #include "warnless.h" 76 #include "non-ascii.h" /* for Curl_convert_from_utf8 prototype */ 77 78 /* The last #include files should be: */ 79 #include "curl_memory.h" 80 #include "memdebug.h" 81 82 #ifndef OPENSSL_VERSION_NUMBER 83 #error "OPENSSL_VERSION_NUMBER not defined" 84 #endif 85 86 #if OPENSSL_VERSION_NUMBER >= 0x00907001L && !defined(OPENSSL_IS_BORINGSSL) 87 /* ENGINE_load_private_key() takes four arguments */ 88 #define HAVE_ENGINE_LOAD_FOUR_ARGS 89 #include <openssl/ui.h> 90 #else 91 /* ENGINE_load_private_key() takes three arguments */ 92 #undef HAVE_ENGINE_LOAD_FOUR_ARGS 93 #endif 94 95 #if (OPENSSL_VERSION_NUMBER >= 0x00903001L) && \ 96 defined(HAVE_OPENSSL_PKCS12_H) && \ 97 !defined(OPENSSL_IS_BORINGSSL) 98 /* OpenSSL has PKCS 12 support, BoringSSL does not */ 99 #define HAVE_PKCS12_SUPPORT 100 #else 101 /* OpenSSL does not have PKCS12 support */ 102 #undef HAVE_PKCS12_SUPPORT 103 #endif 104 105 #if OPENSSL_VERSION_NUMBER >= 0x00909000L 106 #define SSL_METHOD_QUAL const 107 #else 108 #define SSL_METHOD_QUAL 109 #endif 110 111 #if OPENSSL_VERSION_NUMBER >= 0x00907000L 112 /* 0.9.6 didn't have X509_STORE_set_flags() */ 113 #define HAVE_X509_STORE_SET_FLAGS 1 114 #else 115 #define X509_STORE_set_flags(x,y) Curl_nop_stmt 116 #endif 117 118 #ifdef OPENSSL_IS_BORINGSSL 119 /* BoringSSL has no ERR_remove_state() */ 120 #define ERR_remove_state(x) 121 #elif (OPENSSL_VERSION_NUMBER >= 0x10000000L) 122 #define HAVE_ERR_REMOVE_THREAD_STATE 1 123 #endif 124 125 #if !defined(HAVE_SSLV2_CLIENT_METHOD) || \ 126 OPENSSL_VERSION_NUMBER >= 0x10100000L /* 1.1.0+ has no SSLv2 */ 127 #undef OPENSSL_NO_SSL2 /* undef first to avoid compiler warnings */ 128 #define OPENSSL_NO_SSL2 129 #endif 130 131 #if defined(OPENSSL_IS_BORINGSSL) 132 #define NO_RAND_SEED 1 133 /* In BoringSSL OpenSSL_add_all_algorithms does nothing */ 134 #define OpenSSL_add_all_algorithms() 135 /* BoringSSL does not have CONF_modules_load_file */ 136 #define CONF_modules_load_file(a,b,c) 137 #endif 138 139 #ifdef OPENSSL_IS_BORINGSSL 140 /* not present in BoringSSL */ 141 #define OPENSSL_load_builtin_modules(x) 142 #endif 143 144 /* 145 * Number of bytes to read from the random number seed file. This must be 146 * a finite value (because some entropy "files" like /dev/urandom have 147 * an infinite length), but must be large enough to provide enough 148 * entopy to properly seed OpenSSL's PRNG. 149 */ 150 #define RAND_LOAD_LENGTH 1024 151 152 static int passwd_callback(char *buf, int num, int encrypting, 153 void *global_passwd) 154 { 155 DEBUGASSERT(0 == encrypting); 156 157 if(!encrypting) { 158 int klen = curlx_uztosi(strlen((char *)global_passwd)); 159 if(num > klen) { 160 memcpy(buf, global_passwd, klen+1); 161 return klen; 162 } 163 } 164 return 0; 165 } 166 167 /* 168 * rand_enough() is a function that returns TRUE if we have seeded the random 169 * engine properly. We use some preprocessor magic to provide a seed_enough() 170 * macro to use, just to prevent a compiler warning on this function if we 171 * pass in an argument that is never used. 172 */ 173 174 #ifndef NO_RAND_SEED 175 #ifdef HAVE_RAND_STATUS 176 #define seed_enough(x) rand_enough() 177 static bool rand_enough(void) 178 { 179 return (0 != RAND_status()) ? TRUE : FALSE; 180 } 181 #else 182 #define seed_enough(x) rand_enough(x) 183 static bool rand_enough(int nread) 184 { 185 /* this is a very silly decision to make */ 186 return (nread > 500) ? TRUE : FALSE; 187 } 188 #endif 189 190 static int ossl_seed(struct SessionHandle *data) 191 { 192 char *buf = data->state.buffer; /* point to the big buffer */ 193 int nread=0; 194 195 /* Q: should we add support for a random file name as a libcurl option? 196 A: Yes, it is here */ 197 198 #ifndef RANDOM_FILE 199 /* if RANDOM_FILE isn't defined, we only perform this if an option tells 200 us to! */ 201 if(data->set.ssl.random_file) 202 #define RANDOM_FILE "" /* doesn't matter won't be used */ 203 #endif 204 { 205 /* let the option override the define */ 206 nread += RAND_load_file((data->set.str[STRING_SSL_RANDOM_FILE]? 207 data->set.str[STRING_SSL_RANDOM_FILE]: 208 RANDOM_FILE), 209 RAND_LOAD_LENGTH); 210 if(seed_enough(nread)) 211 return nread; 212 } 213 214 #if defined(HAVE_RAND_EGD) 215 /* only available in OpenSSL 0.9.5 and later */ 216 /* EGD_SOCKET is set at configure time or not at all */ 217 #ifndef EGD_SOCKET 218 /* If we don't have the define set, we only do this if the egd-option 219 is set */ 220 if(data->set.str[STRING_SSL_EGDSOCKET]) 221 #define EGD_SOCKET "" /* doesn't matter won't be used */ 222 #endif 223 { 224 /* If there's an option and a define, the option overrides the 225 define */ 226 int ret = RAND_egd(data->set.str[STRING_SSL_EGDSOCKET]? 227 data->set.str[STRING_SSL_EGDSOCKET]:EGD_SOCKET); 228 if(-1 != ret) { 229 nread += ret; 230 if(seed_enough(nread)) 231 return nread; 232 } 233 } 234 #endif 235 236 /* If we get here, it means we need to seed the PRNG using a "silly" 237 approach! */ 238 do { 239 unsigned char randb[64]; 240 int len = sizeof(randb); 241 RAND_bytes(randb, len); 242 RAND_add(randb, len, (len >> 1)); 243 } while(!RAND_status()); 244 245 /* generates a default path for the random seed file */ 246 buf[0]=0; /* blank it first */ 247 RAND_file_name(buf, BUFSIZE); 248 if(buf[0]) { 249 /* we got a file name to try */ 250 nread += RAND_load_file(buf, RAND_LOAD_LENGTH); 251 if(seed_enough(nread)) 252 return nread; 253 } 254 255 infof(data, "libcurl is now using a weak random seed!\n"); 256 return nread; 257 } 258 259 static void Curl_ossl_seed(struct SessionHandle *data) 260 { 261 /* we have the "SSL is seeded" boolean static to prevent multiple 262 time-consuming seedings in vain */ 263 static bool ssl_seeded = FALSE; 264 265 if(!ssl_seeded || data->set.str[STRING_SSL_RANDOM_FILE] || 266 data->set.str[STRING_SSL_EGDSOCKET]) { 267 ossl_seed(data); 268 ssl_seeded = TRUE; 269 } 270 } 271 #else 272 /* BoringSSL needs no seeding */ 273 #define Curl_ossl_seed(x) 274 #endif 275 276 277 #ifndef SSL_FILETYPE_ENGINE 278 #define SSL_FILETYPE_ENGINE 42 279 #endif 280 #ifndef SSL_FILETYPE_PKCS12 281 #define SSL_FILETYPE_PKCS12 43 282 #endif 283 static int do_file_type(const char *type) 284 { 285 if(!type || !type[0]) 286 return SSL_FILETYPE_PEM; 287 if(Curl_raw_equal(type, "PEM")) 288 return SSL_FILETYPE_PEM; 289 if(Curl_raw_equal(type, "DER")) 290 return SSL_FILETYPE_ASN1; 291 if(Curl_raw_equal(type, "ENG")) 292 return SSL_FILETYPE_ENGINE; 293 if(Curl_raw_equal(type, "P12")) 294 return SSL_FILETYPE_PKCS12; 295 return -1; 296 } 297 298 #if defined(HAVE_OPENSSL_ENGINE_H) && defined(HAVE_ENGINE_LOAD_FOUR_ARGS) 299 /* 300 * Supply default password to the engine user interface conversation. 301 * The password is passed by OpenSSL engine from ENGINE_load_private_key() 302 * last argument to the ui and can be obtained by UI_get0_user_data(ui) here. 303 */ 304 static int ssl_ui_reader(UI *ui, UI_STRING *uis) 305 { 306 const char *password; 307 switch(UI_get_string_type(uis)) { 308 case UIT_PROMPT: 309 case UIT_VERIFY: 310 password = (const char*)UI_get0_user_data(ui); 311 if(password && (UI_get_input_flags(uis) & UI_INPUT_FLAG_DEFAULT_PWD)) { 312 UI_set_result(ui, uis, password); 313 return 1; 314 } 315 default: 316 break; 317 } 318 return (UI_method_get_reader(UI_OpenSSL()))(ui, uis); 319 } 320 321 /* 322 * Suppress interactive request for a default password if available. 323 */ 324 static int ssl_ui_writer(UI *ui, UI_STRING *uis) 325 { 326 switch(UI_get_string_type(uis)) { 327 case UIT_PROMPT: 328 case UIT_VERIFY: 329 if(UI_get0_user_data(ui) && 330 (UI_get_input_flags(uis) & UI_INPUT_FLAG_DEFAULT_PWD)) { 331 return 1; 332 } 333 default: 334 break; 335 } 336 return (UI_method_get_writer(UI_OpenSSL()))(ui, uis); 337 } 338 #endif 339 340 static 341 int cert_stuff(struct connectdata *conn, 342 SSL_CTX* ctx, 343 char *cert_file, 344 const char *cert_type, 345 char *key_file, 346 const char *key_type) 347 { 348 struct SessionHandle *data = conn->data; 349 350 int file_type = do_file_type(cert_type); 351 352 if(cert_file || (file_type == SSL_FILETYPE_ENGINE)) { 353 SSL *ssl; 354 X509 *x509; 355 int cert_done = 0; 356 357 if(data->set.str[STRING_KEY_PASSWD]) { 358 /* set the password in the callback userdata */ 359 SSL_CTX_set_default_passwd_cb_userdata(ctx, 360 data->set.str[STRING_KEY_PASSWD]); 361 /* Set passwd callback: */ 362 SSL_CTX_set_default_passwd_cb(ctx, passwd_callback); 363 } 364 365 366 switch(file_type) { 367 case SSL_FILETYPE_PEM: 368 /* SSL_CTX_use_certificate_chain_file() only works on PEM files */ 369 if(SSL_CTX_use_certificate_chain_file(ctx, 370 cert_file) != 1) { 371 failf(data, 372 "could not load PEM client certificate, OpenSSL error %s, " 373 "(no key found, wrong pass phrase, or wrong file format?)", 374 ERR_error_string(ERR_get_error(), NULL) ); 375 return 0; 376 } 377 break; 378 379 case SSL_FILETYPE_ASN1: 380 /* SSL_CTX_use_certificate_file() works with either PEM or ASN1, but 381 we use the case above for PEM so this can only be performed with 382 ASN1 files. */ 383 if(SSL_CTX_use_certificate_file(ctx, 384 cert_file, 385 file_type) != 1) { 386 failf(data, 387 "could not load ASN1 client certificate, OpenSSL error %s, " 388 "(no key found, wrong pass phrase, or wrong file format?)", 389 ERR_error_string(ERR_get_error(), NULL) ); 390 return 0; 391 } 392 break; 393 case SSL_FILETYPE_ENGINE: 394 #if defined(HAVE_OPENSSL_ENGINE_H) && defined(ENGINE_CTRL_GET_CMD_FROM_NAME) 395 { 396 if(data->state.engine) { 397 const char *cmd_name = "LOAD_CERT_CTRL"; 398 struct { 399 const char *cert_id; 400 X509 *cert; 401 } params; 402 403 params.cert_id = cert_file; 404 params.cert = NULL; 405 406 /* Does the engine supports LOAD_CERT_CTRL ? */ 407 if(!ENGINE_ctrl(data->state.engine, ENGINE_CTRL_GET_CMD_FROM_NAME, 408 0, (void *)cmd_name, NULL)) { 409 failf(data, "ssl engine does not support loading certificates"); 410 return 0; 411 } 412 413 /* Load the certificate from the engine */ 414 if(!ENGINE_ctrl_cmd(data->state.engine, cmd_name, 415 0, ¶ms, NULL, 1)) { 416 failf(data, "ssl engine cannot load client cert with id" 417 " '%s' [%s]", cert_file, 418 ERR_error_string(ERR_get_error(), NULL)); 419 return 0; 420 } 421 422 if(!params.cert) { 423 failf(data, "ssl engine didn't initialized the certificate " 424 "properly."); 425 return 0; 426 } 427 428 if(SSL_CTX_use_certificate(ctx, params.cert) != 1) { 429 failf(data, "unable to set client certificate"); 430 X509_free(params.cert); 431 return 0; 432 } 433 X509_free(params.cert); /* we don't need the handle any more... */ 434 } 435 else { 436 failf(data, "crypto engine not set, can't load certificate"); 437 return 0; 438 } 439 } 440 break; 441 #else 442 failf(data, "file type ENG for certificate not implemented"); 443 return 0; 444 #endif 445 446 case SSL_FILETYPE_PKCS12: 447 { 448 #ifdef HAVE_PKCS12_SUPPORT 449 FILE *f; 450 PKCS12 *p12; 451 EVP_PKEY *pri; 452 STACK_OF(X509) *ca = NULL; 453 int i; 454 455 f = fopen(cert_file, "rb"); 456 if(!f) { 457 failf(data, "could not open PKCS12 file '%s'", cert_file); 458 return 0; 459 } 460 p12 = d2i_PKCS12_fp(f, NULL); 461 fclose(f); 462 463 if(!p12) { 464 failf(data, "error reading PKCS12 file '%s'", cert_file); 465 return 0; 466 } 467 468 PKCS12_PBE_add(); 469 470 if(!PKCS12_parse(p12, data->set.str[STRING_KEY_PASSWD], &pri, &x509, 471 &ca)) { 472 failf(data, 473 "could not parse PKCS12 file, check password, OpenSSL error %s", 474 ERR_error_string(ERR_get_error(), NULL) ); 475 PKCS12_free(p12); 476 return 0; 477 } 478 479 PKCS12_free(p12); 480 481 if(SSL_CTX_use_certificate(ctx, x509) != 1) { 482 failf(data, 483 "could not load PKCS12 client certificate, OpenSSL error %s", 484 ERR_error_string(ERR_get_error(), NULL) ); 485 goto fail; 486 } 487 488 if(SSL_CTX_use_PrivateKey(ctx, pri) != 1) { 489 failf(data, "unable to use private key from PKCS12 file '%s'", 490 cert_file); 491 goto fail; 492 } 493 494 if(!SSL_CTX_check_private_key (ctx)) { 495 failf(data, "private key from PKCS12 file '%s' " 496 "does not match certificate in same file", cert_file); 497 goto fail; 498 } 499 /* Set Certificate Verification chain */ 500 if(ca && sk_X509_num(ca)) { 501 for(i = 0; i < sk_X509_num(ca); i++) { 502 /* 503 * Note that sk_X509_pop() is used below to make sure the cert is 504 * removed from the stack properly before getting passed to 505 * SSL_CTX_add_extra_chain_cert(). Previously we used 506 * sk_X509_value() instead, but then we'd clean it in the subsequent 507 * sk_X509_pop_free() call. 508 */ 509 X509 *x = sk_X509_pop(ca); 510 if(!SSL_CTX_add_extra_chain_cert(ctx, x)) { 511 failf(data, "cannot add certificate to certificate chain"); 512 goto fail; 513 } 514 /* SSL_CTX_add_client_CA() seems to work with either sk_* function, 515 * presumably because it duplicates what we pass to it. 516 */ 517 if(!SSL_CTX_add_client_CA(ctx, x)) { 518 failf(data, "cannot add certificate to client CA list"); 519 goto fail; 520 } 521 } 522 } 523 524 cert_done = 1; 525 fail: 526 EVP_PKEY_free(pri); 527 X509_free(x509); 528 sk_X509_pop_free(ca, X509_free); 529 530 if(!cert_done) 531 return 0; /* failure! */ 532 break; 533 #else 534 failf(data, "file type P12 for certificate not supported"); 535 return 0; 536 #endif 537 } 538 default: 539 failf(data, "not supported file type '%s' for certificate", cert_type); 540 return 0; 541 } 542 543 file_type = do_file_type(key_type); 544 545 switch(file_type) { 546 case SSL_FILETYPE_PEM: 547 if(cert_done) 548 break; 549 if(!key_file) 550 /* cert & key can only be in PEM case in the same file */ 551 key_file=cert_file; 552 case SSL_FILETYPE_ASN1: 553 if(SSL_CTX_use_PrivateKey_file(ctx, key_file, file_type) != 1) { 554 failf(data, "unable to set private key file: '%s' type %s", 555 key_file, key_type?key_type:"PEM"); 556 return 0; 557 } 558 break; 559 case SSL_FILETYPE_ENGINE: 560 #ifdef HAVE_OPENSSL_ENGINE_H 561 { /* XXXX still needs some work */ 562 EVP_PKEY *priv_key = NULL; 563 if(data->state.engine) { 564 #ifdef HAVE_ENGINE_LOAD_FOUR_ARGS 565 UI_METHOD *ui_method = 566 UI_create_method((char *)"cURL user interface"); 567 if(!ui_method) { 568 failf(data, "unable do create OpenSSL user-interface method"); 569 return 0; 570 } 571 UI_method_set_opener(ui_method, UI_method_get_opener(UI_OpenSSL())); 572 UI_method_set_closer(ui_method, UI_method_get_closer(UI_OpenSSL())); 573 UI_method_set_reader(ui_method, ssl_ui_reader); 574 UI_method_set_writer(ui_method, ssl_ui_writer); 575 #endif 576 /* the typecast below was added to please mingw32 */ 577 priv_key = (EVP_PKEY *) 578 ENGINE_load_private_key(data->state.engine, key_file, 579 #ifdef HAVE_ENGINE_LOAD_FOUR_ARGS 580 ui_method, 581 #endif 582 data->set.str[STRING_KEY_PASSWD]); 583 #ifdef HAVE_ENGINE_LOAD_FOUR_ARGS 584 UI_destroy_method(ui_method); 585 #endif 586 if(!priv_key) { 587 failf(data, "failed to load private key from crypto engine"); 588 return 0; 589 } 590 if(SSL_CTX_use_PrivateKey(ctx, priv_key) != 1) { 591 failf(data, "unable to set private key"); 592 EVP_PKEY_free(priv_key); 593 return 0; 594 } 595 EVP_PKEY_free(priv_key); /* we don't need the handle any more... */ 596 } 597 else { 598 failf(data, "crypto engine not set, can't load private key"); 599 return 0; 600 } 601 } 602 break; 603 #else 604 failf(data, "file type ENG for private key not supported"); 605 return 0; 606 #endif 607 case SSL_FILETYPE_PKCS12: 608 if(!cert_done) { 609 failf(data, "file type P12 for private key not supported"); 610 return 0; 611 } 612 break; 613 default: 614 failf(data, "not supported file type for private key"); 615 return 0; 616 } 617 618 ssl=SSL_new(ctx); 619 if(!ssl) { 620 failf(data, "unable to create an SSL structure"); 621 return 0; 622 } 623 624 x509=SSL_get_certificate(ssl); 625 626 /* This version was provided by Evan Jordan and is supposed to not 627 leak memory as the previous version: */ 628 if(x509) { 629 EVP_PKEY *pktmp = X509_get_pubkey(x509); 630 EVP_PKEY_copy_parameters(pktmp, SSL_get_privatekey(ssl)); 631 EVP_PKEY_free(pktmp); 632 } 633 634 SSL_free(ssl); 635 636 /* If we are using DSA, we can copy the parameters from 637 * the private key */ 638 639 640 /* Now we know that a key and cert have been set against 641 * the SSL context */ 642 if(!SSL_CTX_check_private_key(ctx)) { 643 failf(data, "Private key does not match the certificate public key"); 644 return 0; 645 } 646 } 647 return 1; 648 } 649 650 /* returns non-zero on failure */ 651 static int x509_name_oneline(X509_NAME *a, char *buf, size_t size) 652 { 653 #if 0 654 return X509_NAME_oneline(a, buf, size); 655 #else 656 BIO *bio_out = BIO_new(BIO_s_mem()); 657 BUF_MEM *biomem; 658 int rc; 659 660 if(!bio_out) 661 return 1; /* alloc failed! */ 662 663 rc = X509_NAME_print_ex(bio_out, a, 0, XN_FLAG_SEP_SPLUS_SPC); 664 BIO_get_mem_ptr(bio_out, &biomem); 665 666 if((size_t)biomem->length < size) 667 size = biomem->length; 668 else 669 size--; /* don't overwrite the buffer end */ 670 671 memcpy(buf, biomem->data, size); 672 buf[size]=0; 673 674 BIO_free(bio_out); 675 676 return !rc; 677 #endif 678 } 679 680 /* Return error string for last OpenSSL error 681 */ 682 static char *SSL_strerror(unsigned long error, char *buf, size_t size) 683 { 684 /* OpenSSL 0.9.6 and later has a function named 685 ERR_error_string_n() that takes the size of the buffer as a 686 third argument */ 687 ERR_error_string_n(error, buf, size); 688 return buf; 689 } 690 691 /** 692 * Global SSL init 693 * 694 * @retval 0 error initializing SSL 695 * @retval 1 SSL initialized successfully 696 */ 697 int Curl_ossl_init(void) 698 { 699 OPENSSL_load_builtin_modules(); 700 701 #ifdef HAVE_ENGINE_LOAD_BUILTIN_ENGINES 702 ENGINE_load_builtin_engines(); 703 #endif 704 705 /* Lets get nice error messages */ 706 SSL_load_error_strings(); 707 708 /* Init the global ciphers and digests */ 709 if(!SSLeay_add_ssl_algorithms()) 710 return 0; 711 712 OpenSSL_add_all_algorithms(); 713 714 715 /* OPENSSL_config(NULL); is "strongly recommended" to use but unfortunately 716 that function makes an exit() call on wrongly formatted config files 717 which makes it hard to use in some situations. OPENSSL_config() itself 718 calls CONF_modules_load_file() and we use that instead and we ignore 719 its return code! */ 720 721 /* CONF_MFLAGS_DEFAULT_SECTION introduced some time between 0.9.8b and 722 0.9.8e */ 723 #ifndef CONF_MFLAGS_DEFAULT_SECTION 724 #define CONF_MFLAGS_DEFAULT_SECTION 0x0 725 #endif 726 727 CONF_modules_load_file(NULL, NULL, 728 CONF_MFLAGS_DEFAULT_SECTION| 729 CONF_MFLAGS_IGNORE_MISSING_FILE); 730 731 return 1; 732 } 733 734 /* Global cleanup */ 735 void Curl_ossl_cleanup(void) 736 { 737 /* Free ciphers and digests lists */ 738 EVP_cleanup(); 739 740 #ifdef HAVE_ENGINE_CLEANUP 741 /* Free engine list */ 742 ENGINE_cleanup(); 743 #endif 744 745 #ifdef HAVE_CRYPTO_CLEANUP_ALL_EX_DATA 746 /* Free OpenSSL ex_data table */ 747 CRYPTO_cleanup_all_ex_data(); 748 #endif 749 750 /* Free OpenSSL error strings */ 751 ERR_free_strings(); 752 753 /* Free thread local error state, destroying hash upon zero refcount */ 754 #ifdef HAVE_ERR_REMOVE_THREAD_STATE 755 ERR_remove_thread_state(NULL); 756 #else 757 ERR_remove_state(0); 758 #endif 759 } 760 761 /* 762 * This function uses SSL_peek to determine connection status. 763 * 764 * Return codes: 765 * 1 means the connection is still in place 766 * 0 means the connection has been closed 767 * -1 means the connection status is unknown 768 */ 769 int Curl_ossl_check_cxn(struct connectdata *conn) 770 { 771 int rc; 772 char buf; 773 774 rc = SSL_peek(conn->ssl[FIRSTSOCKET].handle, (void*)&buf, 1); 775 if(rc > 0) 776 return 1; /* connection still in place */ 777 778 if(rc == 0) 779 return 0; /* connection has been closed */ 780 781 return -1; /* connection status unknown */ 782 } 783 784 /* Selects an OpenSSL crypto engine 785 */ 786 CURLcode Curl_ossl_set_engine(struct SessionHandle *data, const char *engine) 787 { 788 #if defined(USE_OPENSSL) && defined(HAVE_OPENSSL_ENGINE_H) 789 ENGINE *e; 790 791 #if OPENSSL_VERSION_NUMBER >= 0x00909000L 792 e = ENGINE_by_id(engine); 793 #else 794 /* avoid memory leak */ 795 for(e = ENGINE_get_first(); e; e = ENGINE_get_next(e)) { 796 const char *e_id = ENGINE_get_id(e); 797 if(!strcmp(engine, e_id)) 798 break; 799 } 800 #endif 801 802 if(!e) { 803 failf(data, "SSL Engine '%s' not found", engine); 804 return CURLE_SSL_ENGINE_NOTFOUND; 805 } 806 807 if(data->state.engine) { 808 ENGINE_finish(data->state.engine); 809 ENGINE_free(data->state.engine); 810 data->state.engine = NULL; 811 } 812 if(!ENGINE_init(e)) { 813 char buf[256]; 814 815 ENGINE_free(e); 816 failf(data, "Failed to initialise SSL Engine '%s':\n%s", 817 engine, SSL_strerror(ERR_get_error(), buf, sizeof(buf))); 818 return CURLE_SSL_ENGINE_INITFAILED; 819 } 820 data->state.engine = e; 821 return CURLE_OK; 822 #else 823 (void)engine; 824 failf(data, "SSL Engine not supported"); 825 return CURLE_SSL_ENGINE_NOTFOUND; 826 #endif 827 } 828 829 /* Sets engine as default for all SSL operations 830 */ 831 CURLcode Curl_ossl_set_engine_default(struct SessionHandle *data) 832 { 833 #ifdef HAVE_OPENSSL_ENGINE_H 834 if(data->state.engine) { 835 if(ENGINE_set_default(data->state.engine, ENGINE_METHOD_ALL) > 0) { 836 infof(data, "set default crypto engine '%s'\n", 837 ENGINE_get_id(data->state.engine)); 838 } 839 else { 840 failf(data, "set default crypto engine '%s' failed", 841 ENGINE_get_id(data->state.engine)); 842 return CURLE_SSL_ENGINE_SETFAILED; 843 } 844 } 845 #else 846 (void) data; 847 #endif 848 return CURLE_OK; 849 } 850 851 /* Return list of OpenSSL crypto engine names. 852 */ 853 struct curl_slist *Curl_ossl_engines_list(struct SessionHandle *data) 854 { 855 struct curl_slist *list = NULL; 856 #if defined(USE_OPENSSL) && defined(HAVE_OPENSSL_ENGINE_H) 857 struct curl_slist *beg; 858 ENGINE *e; 859 860 for(e = ENGINE_get_first(); e; e = ENGINE_get_next(e)) { 861 beg = curl_slist_append(list, ENGINE_get_id(e)); 862 if(!beg) { 863 curl_slist_free_all(list); 864 return NULL; 865 } 866 list = beg; 867 } 868 #endif 869 (void) data; 870 return list; 871 } 872 873 874 /* 875 * This function is called when an SSL connection is closed. 876 */ 877 void Curl_ossl_close(struct connectdata *conn, int sockindex) 878 { 879 struct ssl_connect_data *connssl = &conn->ssl[sockindex]; 880 881 if(connssl->handle) { 882 (void)SSL_shutdown(connssl->handle); 883 SSL_set_connect_state(connssl->handle); 884 885 SSL_free (connssl->handle); 886 connssl->handle = NULL; 887 } 888 if(connssl->ctx) { 889 SSL_CTX_free (connssl->ctx); 890 connssl->ctx = NULL; 891 } 892 } 893 894 /* 895 * This function is called to shut down the SSL layer but keep the 896 * socket open (CCC - Clear Command Channel) 897 */ 898 int Curl_ossl_shutdown(struct connectdata *conn, int sockindex) 899 { 900 int retval = 0; 901 struct ssl_connect_data *connssl = &conn->ssl[sockindex]; 902 struct SessionHandle *data = conn->data; 903 char buf[120]; /* We will use this for the OpenSSL error buffer, so it has 904 to be at least 120 bytes long. */ 905 unsigned long sslerror; 906 ssize_t nread; 907 int buffsize; 908 int err; 909 int done = 0; 910 911 /* This has only been tested on the proftpd server, and the mod_tls code 912 sends a close notify alert without waiting for a close notify alert in 913 response. Thus we wait for a close notify alert from the server, but 914 we do not send one. Let's hope other servers do the same... */ 915 916 if(data->set.ftp_ccc == CURLFTPSSL_CCC_ACTIVE) 917 (void)SSL_shutdown(connssl->handle); 918 919 if(connssl->handle) { 920 buffsize = (int)sizeof(buf); 921 while(!done) { 922 int what = Curl_socket_ready(conn->sock[sockindex], 923 CURL_SOCKET_BAD, SSL_SHUTDOWN_TIMEOUT); 924 if(what > 0) { 925 ERR_clear_error(); 926 927 /* Something to read, let's do it and hope that it is the close 928 notify alert from the server */ 929 nread = (ssize_t)SSL_read(conn->ssl[sockindex].handle, buf, 930 buffsize); 931 err = SSL_get_error(conn->ssl[sockindex].handle, (int)nread); 932 933 switch(err) { 934 case SSL_ERROR_NONE: /* this is not an error */ 935 case SSL_ERROR_ZERO_RETURN: /* no more data */ 936 /* This is the expected response. There was no data but only 937 the close notify alert */ 938 done = 1; 939 break; 940 case SSL_ERROR_WANT_READ: 941 /* there's data pending, re-invoke SSL_read() */ 942 infof(data, "SSL_ERROR_WANT_READ\n"); 943 break; 944 case SSL_ERROR_WANT_WRITE: 945 /* SSL wants a write. Really odd. Let's bail out. */ 946 infof(data, "SSL_ERROR_WANT_WRITE\n"); 947 done = 1; 948 break; 949 default: 950 /* openssl/ssl.h says "look at error stack/return value/errno" */ 951 sslerror = ERR_get_error(); 952 failf(conn->data, "SSL read: %s, errno %d", 953 ERR_error_string(sslerror, buf), 954 SOCKERRNO); 955 done = 1; 956 break; 957 } 958 } 959 else if(0 == what) { 960 /* timeout */ 961 failf(data, "SSL shutdown timeout"); 962 done = 1; 963 } 964 else { 965 /* anything that gets here is fatally bad */ 966 failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO); 967 retval = -1; 968 done = 1; 969 } 970 } /* while()-loop for the select() */ 971 972 if(data->set.verbose) { 973 #ifdef HAVE_SSL_GET_SHUTDOWN 974 switch(SSL_get_shutdown(connssl->handle)) { 975 case SSL_SENT_SHUTDOWN: 976 infof(data, "SSL_get_shutdown() returned SSL_SENT_SHUTDOWN\n"); 977 break; 978 case SSL_RECEIVED_SHUTDOWN: 979 infof(data, "SSL_get_shutdown() returned SSL_RECEIVED_SHUTDOWN\n"); 980 break; 981 case SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN: 982 infof(data, "SSL_get_shutdown() returned SSL_SENT_SHUTDOWN|" 983 "SSL_RECEIVED__SHUTDOWN\n"); 984 break; 985 } 986 #endif 987 } 988 989 SSL_free (connssl->handle); 990 connssl->handle = NULL; 991 } 992 return retval; 993 } 994 995 void Curl_ossl_session_free(void *ptr) 996 { 997 /* free the ID */ 998 SSL_SESSION_free(ptr); 999 } 1000 1001 /* 1002 * This function is called when the 'data' struct is going away. Close 1003 * down everything and free all resources! 1004 */ 1005 void Curl_ossl_close_all(struct SessionHandle *data) 1006 { 1007 #ifdef HAVE_OPENSSL_ENGINE_H 1008 if(data->state.engine) { 1009 ENGINE_finish(data->state.engine); 1010 ENGINE_free(data->state.engine); 1011 data->state.engine = NULL; 1012 } 1013 #else 1014 (void)data; 1015 #endif 1016 } 1017 1018 static int asn1_output(const ASN1_UTCTIME *tm, 1019 char *buf, 1020 size_t sizeofbuf) 1021 { 1022 const char *asn1_string; 1023 int gmt=FALSE; 1024 int i; 1025 int year=0, month=0, day=0, hour=0, minute=0, second=0; 1026 1027 i=tm->length; 1028 asn1_string=(const char *)tm->data; 1029 1030 if(i < 10) 1031 return 1; 1032 if(asn1_string[i-1] == 'Z') 1033 gmt=TRUE; 1034 for(i=0; i<10; i++) 1035 if((asn1_string[i] > '9') || (asn1_string[i] < '0')) 1036 return 2; 1037 1038 year= (asn1_string[0]-'0')*10+(asn1_string[1]-'0'); 1039 if(year < 50) 1040 year+=100; 1041 1042 month= (asn1_string[2]-'0')*10+(asn1_string[3]-'0'); 1043 if((month > 12) || (month < 1)) 1044 return 3; 1045 1046 day= (asn1_string[4]-'0')*10+(asn1_string[5]-'0'); 1047 hour= (asn1_string[6]-'0')*10+(asn1_string[7]-'0'); 1048 minute= (asn1_string[8]-'0')*10+(asn1_string[9]-'0'); 1049 1050 if((asn1_string[10] >= '0') && (asn1_string[10] <= '9') && 1051 (asn1_string[11] >= '0') && (asn1_string[11] <= '9')) 1052 second= (asn1_string[10]-'0')*10+(asn1_string[11]-'0'); 1053 1054 snprintf(buf, sizeofbuf, 1055 "%04d-%02d-%02d %02d:%02d:%02d %s", 1056 year+1900, month, day, hour, minute, second, (gmt?"GMT":"")); 1057 1058 return 0; 1059 } 1060 1061 /* ====================================================== */ 1062 1063 1064 /* Quote from RFC2818 section 3.1 "Server Identity" 1065 1066 If a subjectAltName extension of type dNSName is present, that MUST 1067 be used as the identity. Otherwise, the (most specific) Common Name 1068 field in the Subject field of the certificate MUST be used. Although 1069 the use of the Common Name is existing practice, it is deprecated and 1070 Certification Authorities are encouraged to use the dNSName instead. 1071 1072 Matching is performed using the matching rules specified by 1073 [RFC2459]. If more than one identity of a given type is present in 1074 the certificate (e.g., more than one dNSName name, a match in any one 1075 of the set is considered acceptable.) Names may contain the wildcard 1076 character * which is considered to match any single domain name 1077 component or component fragment. E.g., *.a.com matches foo.a.com but 1078 not bar.foo.a.com. f*.com matches foo.com but not bar.com. 1079 1080 In some cases, the URI is specified as an IP address rather than a 1081 hostname. In this case, the iPAddress subjectAltName must be present 1082 in the certificate and must exactly match the IP in the URI. 1083 1084 */ 1085 static CURLcode verifyhost(struct connectdata *conn, X509 *server_cert) 1086 { 1087 int matched = -1; /* -1 is no alternative match yet, 1 means match and 0 1088 means mismatch */ 1089 int target = GEN_DNS; /* target type, GEN_DNS or GEN_IPADD */ 1090 size_t addrlen = 0; 1091 struct SessionHandle *data = conn->data; 1092 STACK_OF(GENERAL_NAME) *altnames; 1093 #ifdef ENABLE_IPV6 1094 struct in6_addr addr; 1095 #else 1096 struct in_addr addr; 1097 #endif 1098 CURLcode result = CURLE_OK; 1099 1100 #ifdef ENABLE_IPV6 1101 if(conn->bits.ipv6_ip && 1102 Curl_inet_pton(AF_INET6, conn->host.name, &addr)) { 1103 target = GEN_IPADD; 1104 addrlen = sizeof(struct in6_addr); 1105 } 1106 else 1107 #endif 1108 if(Curl_inet_pton(AF_INET, conn->host.name, &addr)) { 1109 target = GEN_IPADD; 1110 addrlen = sizeof(struct in_addr); 1111 } 1112 1113 /* get a "list" of alternative names */ 1114 altnames = X509_get_ext_d2i(server_cert, NID_subject_alt_name, NULL, NULL); 1115 1116 if(altnames) { 1117 int numalts; 1118 int i; 1119 1120 /* get amount of alternatives, RFC2459 claims there MUST be at least 1121 one, but we don't depend on it... */ 1122 numalts = sk_GENERAL_NAME_num(altnames); 1123 1124 /* loop through all alternatives while none has matched */ 1125 for(i=0; (i<numalts) && (matched != 1); i++) { 1126 /* get a handle to alternative name number i */ 1127 const GENERAL_NAME *check = sk_GENERAL_NAME_value(altnames, i); 1128 1129 /* only check alternatives of the same type the target is */ 1130 if(check->type == target) { 1131 /* get data and length */ 1132 const char *altptr = (char *)ASN1_STRING_data(check->d.ia5); 1133 size_t altlen = (size_t) ASN1_STRING_length(check->d.ia5); 1134 1135 switch(target) { 1136 case GEN_DNS: /* name/pattern comparison */ 1137 /* The OpenSSL man page explicitly says: "In general it cannot be 1138 assumed that the data returned by ASN1_STRING_data() is null 1139 terminated or does not contain embedded nulls." But also that 1140 "The actual format of the data will depend on the actual string 1141 type itself: for example for and IA5String the data will be ASCII" 1142 1143 Gisle researched the OpenSSL sources: 1144 "I checked the 0.9.6 and 0.9.8 sources before my patch and 1145 it always 0-terminates an IA5String." 1146 */ 1147 if((altlen == strlen(altptr)) && 1148 /* if this isn't true, there was an embedded zero in the name 1149 string and we cannot match it. */ 1150 Curl_cert_hostcheck(altptr, conn->host.name)) 1151 matched = 1; 1152 else 1153 matched = 0; 1154 break; 1155 1156 case GEN_IPADD: /* IP address comparison */ 1157 /* compare alternative IP address if the data chunk is the same size 1158 our server IP address is */ 1159 if((altlen == addrlen) && !memcmp(altptr, &addr, altlen)) 1160 matched = 1; 1161 else 1162 matched = 0; 1163 break; 1164 } 1165 } 1166 } 1167 GENERAL_NAMES_free(altnames); 1168 } 1169 1170 if(matched == 1) 1171 /* an alternative name matched the server hostname */ 1172 infof(data, "\t subjectAltName: %s matched\n", conn->host.dispname); 1173 else if(matched == 0) { 1174 /* an alternative name field existed, but didn't match and then 1175 we MUST fail */ 1176 infof(data, "\t subjectAltName does not match %s\n", conn->host.dispname); 1177 failf(data, "SSL: no alternative certificate subject name matches " 1178 "target host name '%s'", conn->host.dispname); 1179 result = CURLE_PEER_FAILED_VERIFICATION; 1180 } 1181 else { 1182 /* we have to look to the last occurrence of a commonName in the 1183 distinguished one to get the most significant one. */ 1184 int j, i=-1; 1185 1186 /* The following is done because of a bug in 0.9.6b */ 1187 1188 unsigned char *nulstr = (unsigned char *)""; 1189 unsigned char *peer_CN = nulstr; 1190 1191 X509_NAME *name = X509_get_subject_name(server_cert); 1192 if(name) 1193 while((j = X509_NAME_get_index_by_NID(name, NID_commonName, i))>=0) 1194 i=j; 1195 1196 /* we have the name entry and we will now convert this to a string 1197 that we can use for comparison. Doing this we support BMPstring, 1198 UTF8 etc. */ 1199 1200 if(i>=0) { 1201 ASN1_STRING *tmp = 1202 X509_NAME_ENTRY_get_data(X509_NAME_get_entry(name, i)); 1203 1204 /* In OpenSSL 0.9.7d and earlier, ASN1_STRING_to_UTF8 fails if the input 1205 is already UTF-8 encoded. We check for this case and copy the raw 1206 string manually to avoid the problem. This code can be made 1207 conditional in the future when OpenSSL has been fixed. Work-around 1208 brought by Alexis S. L. Carvalho. */ 1209 if(tmp) { 1210 if(ASN1_STRING_type(tmp) == V_ASN1_UTF8STRING) { 1211 j = ASN1_STRING_length(tmp); 1212 if(j >= 0) { 1213 peer_CN = OPENSSL_malloc(j+1); 1214 if(peer_CN) { 1215 memcpy(peer_CN, ASN1_STRING_data(tmp), j); 1216 peer_CN[j] = '\0'; 1217 } 1218 } 1219 } 1220 else /* not a UTF8 name */ 1221 j = ASN1_STRING_to_UTF8(&peer_CN, tmp); 1222 1223 if(peer_CN && (curlx_uztosi(strlen((char *)peer_CN)) != j)) { 1224 /* there was a terminating zero before the end of string, this 1225 cannot match and we return failure! */ 1226 failf(data, "SSL: illegal cert name field"); 1227 result = CURLE_PEER_FAILED_VERIFICATION; 1228 } 1229 } 1230 } 1231 1232 if(peer_CN == nulstr) 1233 peer_CN = NULL; 1234 else { 1235 /* convert peer_CN from UTF8 */ 1236 CURLcode rc = Curl_convert_from_utf8(data, peer_CN, strlen(peer_CN)); 1237 /* Curl_convert_from_utf8 calls failf if unsuccessful */ 1238 if(rc) { 1239 OPENSSL_free(peer_CN); 1240 return rc; 1241 } 1242 } 1243 1244 if(result) 1245 /* error already detected, pass through */ 1246 ; 1247 else if(!peer_CN) { 1248 failf(data, 1249 "SSL: unable to obtain common name from peer certificate"); 1250 result = CURLE_PEER_FAILED_VERIFICATION; 1251 } 1252 else if(!Curl_cert_hostcheck((const char *)peer_CN, conn->host.name)) { 1253 failf(data, "SSL: certificate subject name '%s' does not match " 1254 "target host name '%s'", peer_CN, conn->host.dispname); 1255 result = CURLE_PEER_FAILED_VERIFICATION; 1256 } 1257 else { 1258 infof(data, "\t common name: %s (matched)\n", peer_CN); 1259 } 1260 if(peer_CN) 1261 OPENSSL_free(peer_CN); 1262 } 1263 1264 return result; 1265 } 1266 1267 #if (OPENSSL_VERSION_NUMBER >= 0x0090808fL) && !defined(OPENSSL_NO_TLSEXT) && \ 1268 !defined(OPENSSL_IS_BORINGSSL) 1269 static CURLcode verifystatus(struct connectdata *conn, 1270 struct ssl_connect_data *connssl) 1271 { 1272 int i, ocsp_status; 1273 const unsigned char *p; 1274 CURLcode result = CURLE_OK; 1275 struct SessionHandle *data = conn->data; 1276 1277 OCSP_RESPONSE *rsp = NULL; 1278 OCSP_BASICRESP *br = NULL; 1279 X509_STORE *st = NULL; 1280 STACK_OF(X509) *ch = NULL; 1281 1282 long len = SSL_get_tlsext_status_ocsp_resp(connssl->handle, &p); 1283 1284 if(!p) { 1285 failf(data, "No OCSP response received"); 1286 result = CURLE_SSL_INVALIDCERTSTATUS; 1287 goto end; 1288 } 1289 1290 rsp = d2i_OCSP_RESPONSE(NULL, &p, len); 1291 if(!rsp) { 1292 failf(data, "Invalid OCSP response"); 1293 result = CURLE_SSL_INVALIDCERTSTATUS; 1294 goto end; 1295 } 1296 1297 ocsp_status = OCSP_response_status(rsp); 1298 if(ocsp_status != OCSP_RESPONSE_STATUS_SUCCESSFUL) { 1299 failf(data, "Invalid OCSP response status: %s (%d)", 1300 OCSP_response_status_str(ocsp_status), ocsp_status); 1301 result = CURLE_SSL_INVALIDCERTSTATUS; 1302 goto end; 1303 } 1304 1305 br = OCSP_response_get1_basic(rsp); 1306 if(!br) { 1307 failf(data, "Invalid OCSP response"); 1308 result = CURLE_SSL_INVALIDCERTSTATUS; 1309 goto end; 1310 } 1311 1312 ch = SSL_get_peer_cert_chain(connssl->handle); 1313 st = SSL_CTX_get_cert_store(connssl->ctx); 1314 1315 #if ((OPENSSL_VERSION_NUMBER <= 0x1000201fL) /* Fixed after 1.0.2a */ || \ 1316 defined(LIBRESSL_VERSION_NUMBER)) 1317 /* The authorized responder cert in the OCSP response MUST be signed by the 1318 peer cert's issuer (see RFC6960 section 4.2.2.2). If that's a root cert, 1319 no problem, but if it's an intermediate cert OpenSSL has a bug where it 1320 expects this issuer to be present in the chain embedded in the OCSP 1321 response. So we add it if necessary. */ 1322 1323 /* First make sure the peer cert chain includes both a peer and an issuer, 1324 and the OCSP response contains a responder cert. */ 1325 if(sk_X509_num(ch) >= 2 && sk_X509_num(br->certs) >= 1) { 1326 X509 *responder = sk_X509_value(br->certs, sk_X509_num(br->certs) - 1); 1327 1328 /* Find issuer of responder cert and add it to the OCSP response chain */ 1329 for(i = 0; i < sk_X509_num(ch); i++) { 1330 X509 *issuer = sk_X509_value(ch, i); 1331 if(X509_check_issued(issuer, responder) == X509_V_OK) { 1332 if(!OCSP_basic_add1_cert(br, issuer)) { 1333 failf(data, "Could not add issuer cert to OCSP response"); 1334 result = CURLE_SSL_INVALIDCERTSTATUS; 1335 goto end; 1336 } 1337 } 1338 } 1339 } 1340 #endif 1341 1342 if(OCSP_basic_verify(br, ch, st, 0) <= 0) { 1343 failf(data, "OCSP response verification failed"); 1344 result = CURLE_SSL_INVALIDCERTSTATUS; 1345 goto end; 1346 } 1347 1348 for(i = 0; i < OCSP_resp_count(br); i++) { 1349 int cert_status, crl_reason; 1350 OCSP_SINGLERESP *single = NULL; 1351 1352 ASN1_GENERALIZEDTIME *rev, *thisupd, *nextupd; 1353 1354 if(!(single = OCSP_resp_get0(br, i))) 1355 continue; 1356 1357 cert_status = OCSP_single_get0_status(single, &crl_reason, &rev, 1358 &thisupd, &nextupd); 1359 1360 if(!OCSP_check_validity(thisupd, nextupd, 300L, -1L)) { 1361 failf(data, "OCSP response has expired"); 1362 result = CURLE_SSL_INVALIDCERTSTATUS; 1363 goto end; 1364 } 1365 1366 infof(data, "SSL certificate status: %s (%d)\n", 1367 OCSP_cert_status_str(cert_status), cert_status); 1368 1369 switch(cert_status) { 1370 case V_OCSP_CERTSTATUS_GOOD: 1371 break; 1372 1373 case V_OCSP_CERTSTATUS_REVOKED: 1374 result = CURLE_SSL_INVALIDCERTSTATUS; 1375 1376 failf(data, "SSL certificate revocation reason: %s (%d)", 1377 OCSP_crl_reason_str(crl_reason), crl_reason); 1378 goto end; 1379 1380 case V_OCSP_CERTSTATUS_UNKNOWN: 1381 result = CURLE_SSL_INVALIDCERTSTATUS; 1382 goto end; 1383 } 1384 } 1385 1386 end: 1387 if(br) OCSP_BASICRESP_free(br); 1388 OCSP_RESPONSE_free(rsp); 1389 1390 return result; 1391 } 1392 #endif 1393 1394 #endif /* USE_OPENSSL */ 1395 1396 /* The SSL_CTRL_SET_MSG_CALLBACK doesn't exist in ancient OpenSSL versions 1397 and thus this cannot be done there. */ 1398 #ifdef SSL_CTRL_SET_MSG_CALLBACK 1399 1400 static const char *ssl_msg_type(int ssl_ver, int msg) 1401 { 1402 #ifdef SSL2_VERSION_MAJOR 1403 if(ssl_ver == SSL2_VERSION_MAJOR) { 1404 switch (msg) { 1405 case SSL2_MT_ERROR: 1406 return "Error"; 1407 case SSL2_MT_CLIENT_HELLO: 1408 return "Client hello"; 1409 case SSL2_MT_CLIENT_MASTER_KEY: 1410 return "Client key"; 1411 case SSL2_MT_CLIENT_FINISHED: 1412 return "Client finished"; 1413 case SSL2_MT_SERVER_HELLO: 1414 return "Server hello"; 1415 case SSL2_MT_SERVER_VERIFY: 1416 return "Server verify"; 1417 case SSL2_MT_SERVER_FINISHED: 1418 return "Server finished"; 1419 case SSL2_MT_REQUEST_CERTIFICATE: 1420 return "Request CERT"; 1421 case SSL2_MT_CLIENT_CERTIFICATE: 1422 return "Client CERT"; 1423 } 1424 } 1425 else 1426 #endif 1427 if(ssl_ver == SSL3_VERSION_MAJOR) { 1428 switch (msg) { 1429 case SSL3_MT_HELLO_REQUEST: 1430 return "Hello request"; 1431 case SSL3_MT_CLIENT_HELLO: 1432 return "Client hello"; 1433 case SSL3_MT_SERVER_HELLO: 1434 return "Server hello"; 1435 case SSL3_MT_NEWSESSION_TICKET: 1436 return "Newsession Ticket"; 1437 case SSL3_MT_CERTIFICATE: 1438 return "Certificate"; 1439 case SSL3_MT_SERVER_KEY_EXCHANGE: 1440 return "Server key exchange"; 1441 case SSL3_MT_CLIENT_KEY_EXCHANGE: 1442 return "Client key exchange"; 1443 case SSL3_MT_CERTIFICATE_REQUEST: 1444 return "Request CERT"; 1445 case SSL3_MT_SERVER_DONE: 1446 return "Server finished"; 1447 case SSL3_MT_CERTIFICATE_VERIFY: 1448 return "CERT verify"; 1449 case SSL3_MT_FINISHED: 1450 return "Finished"; 1451 #ifdef SSL3_MT_CERTIFICATE_STATUS 1452 case SSL3_MT_CERTIFICATE_STATUS: 1453 return "Certificate Status"; 1454 #endif 1455 } 1456 } 1457 return "Unknown"; 1458 } 1459 1460 static const char *tls_rt_type(int type) 1461 { 1462 switch(type) { 1463 #ifdef SSL3_RT_HEADER 1464 case SSL3_RT_HEADER: 1465 return "TLS header"; 1466 #endif 1467 case SSL3_RT_CHANGE_CIPHER_SPEC: 1468 return "TLS change cipher"; 1469 case SSL3_RT_ALERT: 1470 return "TLS alert"; 1471 case SSL3_RT_HANDSHAKE: 1472 return "TLS handshake"; 1473 case SSL3_RT_APPLICATION_DATA: 1474 return "TLS app data"; 1475 default: 1476 return "TLS Unknown"; 1477 } 1478 } 1479 1480 1481 /* 1482 * Our callback from the SSL/TLS layers. 1483 */ 1484 static void ssl_tls_trace(int direction, int ssl_ver, int content_type, 1485 const void *buf, size_t len, SSL *ssl, 1486 void *userp) 1487 { 1488 struct SessionHandle *data; 1489 const char *msg_name, *tls_rt_name; 1490 char ssl_buf[1024]; 1491 char unknown[32]; 1492 int msg_type, txt_len; 1493 const char *verstr; 1494 struct connectdata *conn = userp; 1495 1496 if(!conn || !conn->data || !conn->data->set.fdebug || 1497 (direction != 0 && direction != 1)) 1498 return; 1499 1500 data = conn->data; 1501 1502 switch(ssl_ver) { 1503 #ifdef SSL2_VERSION /* removed in recent versions */ 1504 case SSL2_VERSION: 1505 verstr = "SSLv2"; 1506 break; 1507 #endif 1508 #ifdef SSL3_VERSION 1509 case SSL3_VERSION: 1510 verstr = "SSLv3"; 1511 break; 1512 #endif 1513 case TLS1_VERSION: 1514 verstr = "TLSv1.0"; 1515 break; 1516 #ifdef TLS1_1_VERSION 1517 case TLS1_1_VERSION: 1518 verstr = "TLSv1.1"; 1519 break; 1520 #endif 1521 #ifdef TLS1_2_VERSION 1522 case TLS1_2_VERSION: 1523 verstr = "TLSv1.2"; 1524 break; 1525 #endif 1526 case 0: 1527 break; 1528 default: 1529 snprintf(unknown, sizeof(unknown), "(%x)", ssl_ver); 1530 verstr = unknown; 1531 break; 1532 } 1533 1534 if(ssl_ver) { 1535 /* the info given when the version is zero is not that useful for us */ 1536 1537 ssl_ver >>= 8; /* check the upper 8 bits only below */ 1538 1539 /* SSLv2 doesn't seem to have TLS record-type headers, so OpenSSL 1540 * always pass-up content-type as 0. But the interesting message-type 1541 * is at 'buf[0]'. 1542 */ 1543 if(ssl_ver == SSL3_VERSION_MAJOR && content_type) 1544 tls_rt_name = tls_rt_type(content_type); 1545 else 1546 tls_rt_name = ""; 1547 1548 msg_type = *(char*)buf; 1549 msg_name = ssl_msg_type(ssl_ver, msg_type); 1550 1551 txt_len = snprintf(ssl_buf, sizeof(ssl_buf), "%s (%s), %s, %s (%d):\n", 1552 verstr, direction?"OUT":"IN", 1553 tls_rt_name, msg_name, msg_type); 1554 Curl_debug(data, CURLINFO_TEXT, ssl_buf, (size_t)txt_len, NULL); 1555 } 1556 1557 Curl_debug(data, (direction == 1) ? CURLINFO_SSL_DATA_OUT : 1558 CURLINFO_SSL_DATA_IN, (char *)buf, len, NULL); 1559 (void) ssl; 1560 } 1561 #endif 1562 1563 #ifdef USE_OPENSSL 1564 /* ====================================================== */ 1565 1566 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME 1567 # define use_sni(x) sni = (x) 1568 #else 1569 # define use_sni(x) Curl_nop_stmt 1570 #endif 1571 1572 /* Check for OpenSSL 1.0.2 which has ALPN support. */ 1573 #undef HAS_ALPN 1574 #if OPENSSL_VERSION_NUMBER >= 0x10002000L \ 1575 && !defined(OPENSSL_NO_TLSEXT) 1576 # define HAS_ALPN 1 1577 #endif 1578 1579 /* Check for OpenSSL 1.0.1 which has NPN support. */ 1580 #undef HAS_NPN 1581 #if OPENSSL_VERSION_NUMBER >= 0x10001000L \ 1582 && !defined(OPENSSL_NO_TLSEXT) \ 1583 && !defined(OPENSSL_NO_NEXTPROTONEG) 1584 # define HAS_NPN 1 1585 #endif 1586 1587 #ifdef HAS_NPN 1588 1589 /* 1590 * in is a list of lenght prefixed strings. this function has to select 1591 * the protocol we want to use from the list and write its string into out. 1592 */ 1593 1594 static int 1595 select_next_protocol(unsigned char **out, unsigned char *outlen, 1596 const unsigned char *in, unsigned int inlen, 1597 const char *key, unsigned int keylen) 1598 { 1599 unsigned int i; 1600 for(i = 0; i + keylen <= inlen; i += in[i] + 1) { 1601 if(memcmp(&in[i + 1], key, keylen) == 0) { 1602 *out = (unsigned char *) &in[i + 1]; 1603 *outlen = in[i]; 1604 return 0; 1605 } 1606 } 1607 return -1; 1608 } 1609 1610 static int 1611 select_next_proto_cb(SSL *ssl, 1612 unsigned char **out, unsigned char *outlen, 1613 const unsigned char *in, unsigned int inlen, 1614 void *arg) 1615 { 1616 struct connectdata *conn = (struct connectdata*) arg; 1617 1618 (void)ssl; 1619 1620 #ifdef USE_NGHTTP2 1621 if(conn->data->set.httpversion == CURL_HTTP_VERSION_2_0 && 1622 !select_next_protocol(out, outlen, in, inlen, NGHTTP2_PROTO_VERSION_ID, 1623 NGHTTP2_PROTO_VERSION_ID_LEN)) { 1624 infof(conn->data, "NPN, negotiated HTTP2 (%s)\n", 1625 NGHTTP2_PROTO_VERSION_ID); 1626 conn->negnpn = CURL_HTTP_VERSION_2_0; 1627 return SSL_TLSEXT_ERR_OK; 1628 } 1629 #endif 1630 1631 if(!select_next_protocol(out, outlen, in, inlen, ALPN_HTTP_1_1, 1632 ALPN_HTTP_1_1_LENGTH)) { 1633 infof(conn->data, "NPN, negotiated HTTP1.1\n"); 1634 conn->negnpn = CURL_HTTP_VERSION_1_1; 1635 return SSL_TLSEXT_ERR_OK; 1636 } 1637 1638 infof(conn->data, "NPN, no overlap, use HTTP1.1\n"); 1639 *out = (unsigned char *)ALPN_HTTP_1_1; 1640 *outlen = ALPN_HTTP_1_1_LENGTH; 1641 conn->negnpn = CURL_HTTP_VERSION_1_1; 1642 1643 return SSL_TLSEXT_ERR_OK; 1644 } 1645 #endif /* HAS_NPN */ 1646 1647 static const char * 1648 get_ssl_version_txt(SSL *ssl) 1649 { 1650 if(!ssl) 1651 return ""; 1652 1653 switch(SSL_version(ssl)) { 1654 #if OPENSSL_VERSION_NUMBER >= 0x1000100FL 1655 case TLS1_2_VERSION: 1656 return "TLSv1.2"; 1657 case TLS1_1_VERSION: 1658 return "TLSv1.1"; 1659 #endif 1660 case TLS1_VERSION: 1661 return "TLSv1.0"; 1662 case SSL3_VERSION: 1663 return "SSLv3"; 1664 case SSL2_VERSION: 1665 return "SSLv2"; 1666 } 1667 return "unknown"; 1668 } 1669 1670 static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex) 1671 { 1672 CURLcode result = CURLE_OK; 1673 char *ciphers; 1674 struct SessionHandle *data = conn->data; 1675 SSL_METHOD_QUAL SSL_METHOD *req_method = NULL; 1676 void *ssl_sessionid = NULL; 1677 X509_LOOKUP *lookup = NULL; 1678 curl_socket_t sockfd = conn->sock[sockindex]; 1679 struct ssl_connect_data *connssl = &conn->ssl[sockindex]; 1680 long ctx_options; 1681 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME 1682 bool sni; 1683 #ifdef ENABLE_IPV6 1684 struct in6_addr addr; 1685 #else 1686 struct in_addr addr; 1687 #endif 1688 #endif 1689 1690 DEBUGASSERT(ssl_connect_1 == connssl->connecting_state); 1691 1692 /* Make funny stuff to get random input */ 1693 Curl_ossl_seed(data); 1694 1695 data->set.ssl.certverifyresult = !X509_V_OK; 1696 1697 /* check to see if we've been told to use an explicit SSL/TLS version */ 1698 1699 switch(data->set.ssl.version) { 1700 default: 1701 case CURL_SSLVERSION_DEFAULT: 1702 case CURL_SSLVERSION_TLSv1: 1703 case CURL_SSLVERSION_TLSv1_0: 1704 case CURL_SSLVERSION_TLSv1_1: 1705 case CURL_SSLVERSION_TLSv1_2: 1706 /* it will be handled later with the context options */ 1707 #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && \ 1708 !defined(LIBRESSL_VERSION_NUMBER) && !defined(OPENSSL_IS_BORINGSSL) 1709 req_method = TLS_client_method(); 1710 #else 1711 req_method = SSLv23_client_method(); 1712 #endif 1713 use_sni(TRUE); 1714 break; 1715 case CURL_SSLVERSION_SSLv2: 1716 #ifdef OPENSSL_NO_SSL2 1717 failf(data, "OpenSSL was built without SSLv2 support"); 1718 return CURLE_NOT_BUILT_IN; 1719 #else 1720 #ifdef USE_TLS_SRP 1721 if(data->set.ssl.authtype == CURL_TLSAUTH_SRP) 1722 return CURLE_SSL_CONNECT_ERROR; 1723 #endif 1724 req_method = SSLv2_client_method(); 1725 use_sni(FALSE); 1726 break; 1727 #endif 1728 case CURL_SSLVERSION_SSLv3: 1729 #ifdef OPENSSL_NO_SSL3_METHOD 1730 failf(data, "OpenSSL was built without SSLv3 support"); 1731 return CURLE_NOT_BUILT_IN; 1732 #else 1733 #ifdef USE_TLS_SRP 1734 if(data->set.ssl.authtype == CURL_TLSAUTH_SRP) 1735 return CURLE_SSL_CONNECT_ERROR; 1736 #endif 1737 req_method = SSLv3_client_method(); 1738 use_sni(FALSE); 1739 break; 1740 #endif 1741 } 1742 1743 if(connssl->ctx) 1744 SSL_CTX_free(connssl->ctx); 1745 connssl->ctx = SSL_CTX_new(req_method); 1746 1747 if(!connssl->ctx) { 1748 failf(data, "SSL: couldn't create a context: %s", 1749 ERR_error_string(ERR_peek_error(), NULL)); 1750 return CURLE_OUT_OF_MEMORY; 1751 } 1752 1753 #ifdef SSL_MODE_RELEASE_BUFFERS 1754 SSL_CTX_set_mode(connssl->ctx, SSL_MODE_RELEASE_BUFFERS); 1755 #endif 1756 1757 #ifdef SSL_CTRL_SET_MSG_CALLBACK 1758 if(data->set.fdebug && data->set.verbose) { 1759 /* the SSL trace callback is only used for verbose logging */ 1760 SSL_CTX_set_msg_callback(connssl->ctx, ssl_tls_trace); 1761 SSL_CTX_set_msg_callback_arg(connssl->ctx, conn); 1762 } 1763 #endif 1764 1765 /* OpenSSL contains code to work-around lots of bugs and flaws in various 1766 SSL-implementations. SSL_CTX_set_options() is used to enabled those 1767 work-arounds. The man page for this option states that SSL_OP_ALL enables 1768 all the work-arounds and that "It is usually safe to use SSL_OP_ALL to 1769 enable the bug workaround options if compatibility with somewhat broken 1770 implementations is desired." 1771 1772 The "-no_ticket" option was introduced in Openssl0.9.8j. It's a flag to 1773 disable "rfc4507bis session ticket support". rfc4507bis was later turned 1774 into the proper RFC5077 it seems: https://tools.ietf.org/html/rfc5077 1775 1776 The enabled extension concerns the session management. I wonder how often 1777 libcurl stops a connection and then resumes a TLS session. also, sending 1778 the session data is some overhead. .I suggest that you just use your 1779 proposed patch (which explicitly disables TICKET). 1780 1781 If someone writes an application with libcurl and openssl who wants to 1782 enable the feature, one can do this in the SSL callback. 1783 1784 SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG option enabling allowed proper 1785 interoperability with web server Netscape Enterprise Server 2.0.1 which 1786 was released back in 1996. 1787 1788 Due to CVE-2010-4180, option SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG has 1789 become ineffective as of OpenSSL 0.9.8q and 1.0.0c. In order to mitigate 1790 CVE-2010-4180 when using previous OpenSSL versions we no longer enable 1791 this option regardless of OpenSSL version and SSL_OP_ALL definition. 1792 1793 OpenSSL added a work-around for a SSL 3.0/TLS 1.0 CBC vulnerability 1794 (https://www.openssl.org/~bodo/tls-cbc.txt). In 0.9.6e they added a bit to 1795 SSL_OP_ALL that _disables_ that work-around despite the fact that 1796 SSL_OP_ALL is documented to do "rather harmless" workarounds. In order to 1797 keep the secure work-around, the SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS bit 1798 must not be set. 1799 */ 1800 1801 ctx_options = SSL_OP_ALL; 1802 1803 #ifdef SSL_OP_NO_TICKET 1804 ctx_options |= SSL_OP_NO_TICKET; 1805 #endif 1806 1807 #ifdef SSL_OP_NO_COMPRESSION 1808 ctx_options |= SSL_OP_NO_COMPRESSION; 1809 #endif 1810 1811 #ifdef SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG 1812 /* mitigate CVE-2010-4180 */ 1813 ctx_options &= ~SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG; 1814 #endif 1815 1816 #ifdef SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS 1817 /* unless the user explicitly ask to allow the protocol vulnerability we 1818 use the work-around */ 1819 if(!conn->data->set.ssl_enable_beast) 1820 ctx_options &= ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS; 1821 #endif 1822 1823 switch(data->set.ssl.version) { 1824 case CURL_SSLVERSION_SSLv3: 1825 #ifdef USE_TLS_SRP 1826 if(data->set.ssl.authtype == CURL_TLSAUTH_SRP) { 1827 infof(data, "Set version TLSv1.x for SRP authorisation\n"); 1828 } 1829 #endif 1830 ctx_options |= SSL_OP_NO_SSLv2; 1831 ctx_options |= SSL_OP_NO_TLSv1; 1832 #if OPENSSL_VERSION_NUMBER >= 0x1000100FL 1833 ctx_options |= SSL_OP_NO_TLSv1_1; 1834 ctx_options |= SSL_OP_NO_TLSv1_2; 1835 #endif 1836 break; 1837 1838 case CURL_SSLVERSION_DEFAULT: 1839 case CURL_SSLVERSION_TLSv1: 1840 ctx_options |= SSL_OP_NO_SSLv2; 1841 ctx_options |= SSL_OP_NO_SSLv3; 1842 break; 1843 1844 case CURL_SSLVERSION_TLSv1_0: 1845 ctx_options |= SSL_OP_NO_SSLv2; 1846 ctx_options |= SSL_OP_NO_SSLv3; 1847 #if OPENSSL_VERSION_NUMBER >= 0x1000100FL 1848 ctx_options |= SSL_OP_NO_TLSv1_1; 1849 ctx_options |= SSL_OP_NO_TLSv1_2; 1850 #endif 1851 break; 1852 1853 #if OPENSSL_VERSION_NUMBER >= 0x1000100FL 1854 case CURL_SSLVERSION_TLSv1_1: 1855 ctx_options |= SSL_OP_NO_SSLv2; 1856 ctx_options |= SSL_OP_NO_SSLv3; 1857 ctx_options |= SSL_OP_NO_TLSv1; 1858 ctx_options |= SSL_OP_NO_TLSv1_2; 1859 break; 1860 1861 case CURL_SSLVERSION_TLSv1_2: 1862 ctx_options |= SSL_OP_NO_SSLv2; 1863 ctx_options |= SSL_OP_NO_SSLv3; 1864 ctx_options |= SSL_OP_NO_TLSv1; 1865 ctx_options |= SSL_OP_NO_TLSv1_1; 1866 break; 1867 #endif 1868 1869 #ifndef OPENSSL_NO_SSL2 1870 case CURL_SSLVERSION_SSLv2: 1871 ctx_options |= SSL_OP_NO_SSLv3; 1872 ctx_options |= SSL_OP_NO_TLSv1; 1873 #if OPENSSL_VERSION_NUMBER >= 0x1000100FL 1874 ctx_options |= SSL_OP_NO_TLSv1_1; 1875 ctx_options |= SSL_OP_NO_TLSv1_2; 1876 #endif 1877 break; 1878 #endif 1879 1880 default: 1881 failf(data, "Unsupported SSL protocol version"); 1882 return CURLE_SSL_CONNECT_ERROR; 1883 } 1884 1885 SSL_CTX_set_options(connssl->ctx, ctx_options); 1886 1887 #ifdef HAS_NPN 1888 if(data->set.ssl_enable_npn) 1889 SSL_CTX_set_next_proto_select_cb(connssl->ctx, select_next_proto_cb, conn); 1890 #endif 1891 1892 #ifdef HAS_ALPN 1893 if(data->set.ssl_enable_alpn) { 1894 int cur = 0; 1895 unsigned char protocols[128]; 1896 1897 #ifdef USE_NGHTTP2 1898 if(data->set.httpversion == CURL_HTTP_VERSION_2_0) { 1899 protocols[cur++] = NGHTTP2_PROTO_VERSION_ID_LEN; 1900 1901 memcpy(&protocols[cur], NGHTTP2_PROTO_VERSION_ID, 1902 NGHTTP2_PROTO_VERSION_ID_LEN); 1903 cur += NGHTTP2_PROTO_VERSION_ID_LEN; 1904 infof(data, "ALPN, offering %s\n", NGHTTP2_PROTO_VERSION_ID); 1905 } 1906 #endif 1907 1908 protocols[cur++] = ALPN_HTTP_1_1_LENGTH; 1909 memcpy(&protocols[cur], ALPN_HTTP_1_1, ALPN_HTTP_1_1_LENGTH); 1910 cur += ALPN_HTTP_1_1_LENGTH; 1911 infof(data, "ALPN, offering %s\n", ALPN_HTTP_1_1); 1912 1913 /* expects length prefixed preference ordered list of protocols in wire 1914 * format 1915 */ 1916 SSL_CTX_set_alpn_protos(connssl->ctx, protocols, cur); 1917 } 1918 #endif 1919 1920 if(data->set.str[STRING_CERT] || data->set.str[STRING_CERT_TYPE]) { 1921 if(!cert_stuff(conn, 1922 connssl->ctx, 1923 data->set.str[STRING_CERT], 1924 data->set.str[STRING_CERT_TYPE], 1925 data->set.str[STRING_KEY], 1926 data->set.str[STRING_KEY_TYPE])) { 1927 /* failf() is already done in cert_stuff() */ 1928 return CURLE_SSL_CERTPROBLEM; 1929 } 1930 } 1931 1932 ciphers = data->set.str[STRING_SSL_CIPHER_LIST]; 1933 if(!ciphers) 1934 ciphers = (char *)DEFAULT_CIPHER_SELECTION; 1935 if(!SSL_CTX_set_cipher_list(connssl->ctx, ciphers)) { 1936 failf(data, "failed setting cipher list: %s", ciphers); 1937 return CURLE_SSL_CIPHER; 1938 } 1939 infof(data, "Cipher selection: %s\n", ciphers); 1940 1941 #ifdef USE_TLS_SRP 1942 if(data->set.ssl.authtype == CURL_TLSAUTH_SRP) { 1943 infof(data, "Using TLS-SRP username: %s\n", data->set.ssl.username); 1944 1945 if(!SSL_CTX_set_srp_username(connssl->ctx, data->set.ssl.username)) { 1946 failf(data, "Unable to set SRP user name"); 1947 return CURLE_BAD_FUNCTION_ARGUMENT; 1948 } 1949 if(!SSL_CTX_set_srp_password(connssl->ctx, data->set.ssl.password)) { 1950 failf(data, "failed setting SRP password"); 1951 return CURLE_BAD_FUNCTION_ARGUMENT; 1952 } 1953 if(!data->set.str[STRING_SSL_CIPHER_LIST]) { 1954 infof(data, "Setting cipher list SRP\n"); 1955 1956 if(!SSL_CTX_set_cipher_list(connssl->ctx, "SRP")) { 1957 failf(data, "failed setting SRP cipher list"); 1958 return CURLE_SSL_CIPHER; 1959 } 1960 } 1961 } 1962 #endif 1963 if(data->set.str[STRING_SSL_CAFILE] || data->set.str[STRING_SSL_CAPATH]) { 1964 /* tell SSL where to find CA certificates that are used to verify 1965 the servers certificate. */ 1966 if(!SSL_CTX_load_verify_locations(connssl->ctx, 1967 data->set.str[STRING_SSL_CAFILE], 1968 data->set.str[STRING_SSL_CAPATH])) { 1969 if(data->set.ssl.verifypeer) { 1970 /* Fail if we insist on successfully verifying the server. */ 1971 failf(data, "error setting certificate verify locations:\n" 1972 " CAfile: %s\n CApath: %s", 1973 data->set.str[STRING_SSL_CAFILE]? 1974 data->set.str[STRING_SSL_CAFILE]: "none", 1975 data->set.str[STRING_SSL_CAPATH]? 1976 data->set.str[STRING_SSL_CAPATH] : "none"); 1977 return CURLE_SSL_CACERT_BADFILE; 1978 } 1979 else { 1980 /* Just continue with a warning if no strict certificate verification 1981 is required. */ 1982 infof(data, "error setting certificate verify locations," 1983 " continuing anyway:\n"); 1984 } 1985 } 1986 else { 1987 /* Everything is fine. */ 1988 infof(data, "successfully set certificate verify locations:\n"); 1989 } 1990 infof(data, 1991 " CAfile: %s\n" 1992 " CApath: %s\n", 1993 data->set.str[STRING_SSL_CAFILE] ? data->set.str[STRING_SSL_CAFILE]: 1994 "none", 1995 data->set.str[STRING_SSL_CAPATH] ? data->set.str[STRING_SSL_CAPATH]: 1996 "none"); 1997 } 1998 1999 if(data->set.str[STRING_SSL_CRLFILE]) { 2000 /* tell SSL where to find CRL file that is used to check certificate 2001 * revocation */ 2002 lookup=X509_STORE_add_lookup(SSL_CTX_get_cert_store(connssl->ctx), 2003 X509_LOOKUP_file()); 2004 if(!lookup || 2005 (!X509_load_crl_file(lookup, data->set.str[STRING_SSL_CRLFILE], 2006 X509_FILETYPE_PEM)) ) { 2007 failf(data, "error loading CRL file: %s", 2008 data->set.str[STRING_SSL_CRLFILE]); 2009 return CURLE_SSL_CRL_BADFILE; 2010 } 2011 else { 2012 /* Everything is fine. */ 2013 infof(data, "successfully load CRL file:\n"); 2014 X509_STORE_set_flags(SSL_CTX_get_cert_store(connssl->ctx), 2015 X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL); 2016 } 2017 infof(data, 2018 " CRLfile: %s\n", data->set.str[STRING_SSL_CRLFILE] ? 2019 data->set.str[STRING_SSL_CRLFILE]: "none"); 2020 } 2021 2022 /* Try building a chain using issuers in the trusted store first to avoid 2023 problems with server-sent legacy intermediates. 2024 Newer versions of OpenSSL do alternate chain checking by default which 2025 gives us the same fix without as much of a performance hit (slight), so we 2026 prefer that if available. 2027 https://rt.openssl.org/Ticket/Display.html?id=3621&user=guest&pass=guest 2028 */ 2029 #if defined(X509_V_FLAG_TRUSTED_FIRST) && !defined(X509_V_FLAG_NO_ALT_CHAINS) 2030 if(data->set.ssl.verifypeer) { 2031 X509_STORE_set_flags(SSL_CTX_get_cert_store(connssl->ctx), 2032 X509_V_FLAG_TRUSTED_FIRST); 2033 } 2034 #endif 2035 2036 /* SSL always tries to verify the peer, this only says whether it should 2037 * fail to connect if the verification fails, or if it should continue 2038 * anyway. In the latter case the result of the verification is checked with 2039 * SSL_get_verify_result() below. */ 2040 SSL_CTX_set_verify(connssl->ctx, 2041 data->set.ssl.verifypeer?SSL_VERIFY_PEER:SSL_VERIFY_NONE, 2042 NULL); 2043 2044 /* give application a chance to interfere with SSL set up. */ 2045 if(data->set.ssl.fsslctx) { 2046 result = (*data->set.ssl.fsslctx)(data, connssl->ctx, 2047 data->set.ssl.fsslctxp); 2048 if(result) { 2049 failf(data, "error signaled by ssl ctx callback"); 2050 return result; 2051 } 2052 } 2053 2054 /* Lets make an SSL structure */ 2055 if(connssl->handle) 2056 SSL_free(connssl->handle); 2057 connssl->handle = SSL_new(connssl->ctx); 2058 if(!connssl->handle) { 2059 failf(data, "SSL: couldn't create a context (handle)!"); 2060 return CURLE_OUT_OF_MEMORY; 2061 } 2062 2063 #if (OPENSSL_VERSION_NUMBER >= 0x0090808fL) && !defined(OPENSSL_NO_TLSEXT) && \ 2064 !defined(OPENSSL_IS_BORINGSSL) 2065 if(data->set.ssl.verifystatus) 2066 SSL_set_tlsext_status_type(connssl->handle, TLSEXT_STATUSTYPE_ocsp); 2067 #endif 2068 2069 SSL_set_connect_state(connssl->handle); 2070 2071 connssl->server_cert = 0x0; 2072 2073 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME 2074 if((0 == Curl_inet_pton(AF_INET, conn->host.name, &addr)) && 2075 #ifdef ENABLE_IPV6 2076 (0 == Curl_inet_pton(AF_INET6, conn->host.name, &addr)) && 2077 #endif 2078 sni && 2079 !SSL_set_tlsext_host_name(connssl->handle, conn->host.name)) 2080 infof(data, "WARNING: failed to configure server name indication (SNI) " 2081 "TLS extension\n"); 2082 #endif 2083 2084 /* Check if there's a cached ID we can/should use here! */ 2085 if(!Curl_ssl_getsessionid(conn, &ssl_sessionid, NULL)) { 2086 /* we got a session id, use it! */ 2087 if(!SSL_set_session(connssl->handle, ssl_sessionid)) { 2088 failf(data, "SSL: SSL_set_session failed: %s", 2089 ERR_error_string(ERR_get_error(), NULL)); 2090 return CURLE_SSL_CONNECT_ERROR; 2091 } 2092 /* Informational message */ 2093 infof (data, "SSL re-using session ID\n"); 2094 } 2095 2096 /* pass the raw socket into the SSL layers */ 2097 if(!SSL_set_fd(connssl->handle, (int)sockfd)) { 2098 failf(data, "SSL: SSL_set_fd failed: %s", 2099 ERR_error_string(ERR_get_error(), NULL)); 2100 return CURLE_SSL_CONNECT_ERROR; 2101 } 2102 2103 connssl->connecting_state = ssl_connect_2; 2104 2105 return CURLE_OK; 2106 } 2107 2108 static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex) 2109 { 2110 struct SessionHandle *data = conn->data; 2111 int err; 2112 struct ssl_connect_data *connssl = &conn->ssl[sockindex]; 2113 DEBUGASSERT(ssl_connect_2 == connssl->connecting_state 2114 || ssl_connect_2_reading == connssl->connecting_state 2115 || ssl_connect_2_writing == connssl->connecting_state); 2116 2117 ERR_clear_error(); 2118 2119 err = SSL_connect(connssl->handle); 2120 2121 /* 1 is fine 2122 0 is "not successful but was shut down controlled" 2123 <0 is "handshake was not successful, because a fatal error occurred" */ 2124 if(1 != err) { 2125 int detail = SSL_get_error(connssl->handle, err); 2126 2127 if(SSL_ERROR_WANT_READ == detail) { 2128 connssl->connecting_state = ssl_connect_2_reading; 2129 return CURLE_OK; 2130 } 2131 else if(SSL_ERROR_WANT_WRITE == detail) { 2132 connssl->connecting_state = ssl_connect_2_writing; 2133 return CURLE_OK; 2134 } 2135 else { 2136 /* untreated error */ 2137 unsigned long errdetail; 2138 char error_buffer[256]; /* OpenSSL documents that this must be at least 2139 256 bytes long. */ 2140 CURLcode result; 2141 const char *cert_problem = NULL; 2142 long lerr; 2143 2144 connssl->connecting_state = ssl_connect_2; /* the connection failed, 2145 we're not waiting for 2146 anything else. */ 2147 2148 errdetail = ERR_get_error(); /* Gets the earliest error code from the 2149 thread's error queue and removes the 2150 entry. */ 2151 2152 switch(errdetail) { 2153 case 0x1407E086: 2154 /* 1407E086: 2155 SSL routines: 2156 SSL2_SET_CERTIFICATE: 2157 certificate verify failed */ 2158 /* fall-through */ 2159 case 0x14090086: 2160 /* 14090086: 2161 SSL routines: 2162 SSL3_GET_SERVER_CERTIFICATE: 2163 certificate verify failed */ 2164 result = CURLE_SSL_CACERT; 2165 2166 lerr = SSL_get_verify_result(connssl->handle); 2167 if(lerr != X509_V_OK) { 2168 snprintf(error_buffer, sizeof(error_buffer), 2169 "SSL certificate problem: %s", 2170 X509_verify_cert_error_string(lerr)); 2171 } 2172 else 2173 cert_problem = "SSL certificate problem, verify that the CA cert is" 2174 " OK."; 2175 2176 break; 2177 default: 2178 result = CURLE_SSL_CONNECT_ERROR; 2179 SSL_strerror(errdetail, error_buffer, sizeof(error_buffer)); 2180 break; 2181 } 2182 2183 /* detail is already set to the SSL error above */ 2184 2185 /* If we e.g. use SSLv2 request-method and the server doesn't like us 2186 * (RST connection etc.), OpenSSL gives no explanation whatsoever and 2187 * the SO_ERROR is also lost. 2188 */ 2189 if(CURLE_SSL_CONNECT_ERROR == result && errdetail == 0) { 2190 failf(data, "Unknown SSL protocol error in connection to %s:%ld ", 2191 conn->host.name, conn->remote_port); 2192 return result; 2193 } 2194 2195 /* Could be a CERT problem */ 2196 failf(data, "%s%s", cert_problem ? cert_problem : "", error_buffer); 2197 2198 return result; 2199 } 2200 } 2201 else { 2202 /* we have been connected fine, we're not waiting for anything else. */ 2203 connssl->connecting_state = ssl_connect_3; 2204 2205 /* Informational message */ 2206 infof(data, "SSL connection using %s / %s\n", 2207 get_ssl_version_txt(connssl->handle), 2208 SSL_get_cipher(connssl->handle)); 2209 2210 #ifdef HAS_ALPN 2211 /* Sets data and len to negotiated protocol, len is 0 if no protocol was 2212 * negotiated 2213 */ 2214 if(data->set.ssl_enable_alpn) { 2215 const unsigned char* neg_protocol; 2216 unsigned int len; 2217 SSL_get0_alpn_selected(connssl->handle, &neg_protocol, &len); 2218 if(len != 0) { 2219 infof(data, "ALPN, server accepted to use %.*s\n", len, neg_protocol); 2220 2221 #ifdef USE_NGHTTP2 2222 if(len == NGHTTP2_PROTO_VERSION_ID_LEN && 2223 !memcmp(NGHTTP2_PROTO_VERSION_ID, neg_protocol, len)) { 2224 conn->negnpn = CURL_HTTP_VERSION_2_0; 2225 } 2226 else 2227 #endif 2228 if(len == ALPN_HTTP_1_1_LENGTH && 2229 !memcmp(ALPN_HTTP_1_1, neg_protocol, ALPN_HTTP_1_1_LENGTH)) { 2230 conn->negnpn = CURL_HTTP_VERSION_1_1; 2231 } 2232 } 2233 else 2234 infof(data, "ALPN, server did not agree to a protocol\n"); 2235 } 2236 #endif 2237 2238 return CURLE_OK; 2239 } 2240 } 2241 2242 static int asn1_object_dump(ASN1_OBJECT *a, char *buf, size_t len) 2243 { 2244 int i, ilen; 2245 2246 if((ilen = (int)len) < 0) 2247 return 1; /* buffer too big */ 2248 2249 i = i2t_ASN1_OBJECT(buf, ilen, a); 2250 2251 if(i >= ilen) 2252 return 1; /* buffer too small */ 2253 2254 return 0; 2255 } 2256 2257 static void pubkey_show(struct SessionHandle *data, 2258 int num, 2259 const char *type, 2260 const char *name, 2261 unsigned char *raw, 2262 int len) 2263 { 2264 size_t left; 2265 int i; 2266 char namebuf[32]; 2267 char *buffer; 2268 2269 left = len*3 + 1; 2270 buffer = malloc(left); 2271 if(buffer) { 2272 char *ptr=buffer; 2273 snprintf(namebuf, sizeof(namebuf), "%s(%s)", type, name); 2274 for(i=0; i< len; i++) { 2275 snprintf(ptr, left, "%02x:", raw[i]); 2276 ptr += 3; 2277 left -= 3; 2278 } 2279 infof(data, " %s: %s\n", namebuf, buffer); 2280 Curl_ssl_push_certinfo(data, num, namebuf, buffer); 2281 free(buffer); 2282 } 2283 } 2284 2285 #define print_pubkey_BN(_type, _name, _num) \ 2286 do { \ 2287 if(pubkey->pkey._type->_name) { \ 2288 int len = BN_num_bytes(pubkey->pkey._type->_name); \ 2289 if(len < CERTBUFFERSIZE) { \ 2290 BN_bn2bin(pubkey->pkey._type->_name, (unsigned char*)bufp); \ 2291 bufp[len] = 0; \ 2292 pubkey_show(data, _num, #_type, #_name, (unsigned char*)bufp, len); \ 2293 } \ 2294 } \ 2295 } WHILE_FALSE 2296 2297 static int X509V3_ext(struct SessionHandle *data, 2298 int certnum, 2299 STACK_OF(X509_EXTENSION) *exts) 2300 { 2301 int i; 2302 size_t j; 2303 2304 if(sk_X509_EXTENSION_num(exts) <= 0) 2305 /* no extensions, bail out */ 2306 return 1; 2307 2308 for(i=0; i<sk_X509_EXTENSION_num(exts); i++) { 2309 ASN1_OBJECT *obj; 2310 X509_EXTENSION *ext = sk_X509_EXTENSION_value(exts, i); 2311 BUF_MEM *biomem; 2312 char buf[512]; 2313 char *ptr=buf; 2314 char namebuf[128]; 2315 BIO *bio_out = BIO_new(BIO_s_mem()); 2316 2317 if(!bio_out) 2318 return 1; 2319 2320 obj = X509_EXTENSION_get_object(ext); 2321 2322 asn1_object_dump(obj, namebuf, sizeof(namebuf)); 2323 2324 infof(data, "%s: %s\n", namebuf, 2325 X509_EXTENSION_get_critical(ext)?"(critical)":""); 2326 2327 if(!X509V3_EXT_print(bio_out, ext, 0, 0)) 2328 ASN1_STRING_print(bio_out, (ASN1_STRING *)X509_EXTENSION_get_data(ext)); 2329 2330 BIO_get_mem_ptr(bio_out, &biomem); 2331 2332 /* biomem->length bytes at biomem->data, this little loop here is only 2333 done for the infof() call, we send the "raw" data to the certinfo 2334 function */ 2335 for(j=0; j<(size_t)biomem->length; j++) { 2336 const char *sep=""; 2337 if(biomem->data[j] == '\n') { 2338 sep=", "; 2339 j++; /* skip the newline */ 2340 }; 2341 while((j<(size_t)biomem->length) && (biomem->data[j] == ' ')) 2342 j++; 2343 if(j<(size_t)biomem->length) 2344 ptr+=snprintf(ptr, sizeof(buf)-(ptr-buf), "%s%c", sep, 2345 biomem->data[j]); 2346 } 2347 infof(data, " %s\n", buf); 2348 2349 Curl_ssl_push_certinfo(data, certnum, namebuf, buf); 2350 2351 BIO_free(bio_out); 2352 2353 } 2354 return 0; /* all is fine */ 2355 } 2356 2357 2358 static void X509_signature(struct SessionHandle *data, 2359 int numcert, 2360 ASN1_STRING *sig) 2361 { 2362 char buf[1024]; 2363 char *ptr = buf; 2364 int i; 2365 2366 for(i=0; i<sig->length; i++) 2367 ptr+=snprintf(ptr, sizeof(buf)-(ptr-buf), "%02x:", sig->data[i]); 2368 2369 infof(data, " Signature: %s\n", buf); 2370 Curl_ssl_push_certinfo(data, numcert, "Signature", buf); 2371 } 2372 2373 static void dumpcert(struct SessionHandle *data, X509 *x, int numcert) 2374 { 2375 BIO *bio_out = BIO_new(BIO_s_mem()); 2376 BUF_MEM *biomem; 2377 2378 /* this outputs the cert in this 64 column wide style with newlines and 2379 -----BEGIN CERTIFICATE----- texts and more */ 2380 PEM_write_bio_X509(bio_out, x); 2381 2382 BIO_get_mem_ptr(bio_out, &biomem); 2383 2384 Curl_ssl_push_certinfo_len(data, numcert, 2385 "Cert", biomem->data, biomem->length); 2386 2387 BIO_free(bio_out); 2388 } 2389 2390 /* 2391 * This size was previously 512 which has been reported "too small" without 2392 * any specifics, so it was enlarged to allow more data to get shown uncut. 2393 * The "perfect" size is yet to figure out. 2394 */ 2395 #define CERTBUFFERSIZE 8192 2396 2397 static CURLcode get_cert_chain(struct connectdata *conn, 2398 struct ssl_connect_data *connssl) 2399 2400 { 2401 CURLcode result; 2402 STACK_OF(X509) *sk; 2403 int i; 2404 char *bufp; 2405 struct SessionHandle *data = conn->data; 2406 int numcerts; 2407 2408 bufp = malloc(CERTBUFFERSIZE); 2409 if(!bufp) 2410 return CURLE_OUT_OF_MEMORY; 2411 2412 sk = SSL_get_peer_cert_chain(connssl->handle); 2413 if(!sk) { 2414 free(bufp); 2415 return CURLE_OUT_OF_MEMORY; 2416 } 2417 2418 numcerts = sk_X509_num(sk); 2419 2420 result = Curl_ssl_init_certinfo(data, numcerts); 2421 if(result) { 2422 free(bufp); 2423 return result; 2424 } 2425 2426 infof(data, "--- Certificate chain\n"); 2427 for(i=0; i<numcerts; i++) { 2428 long value; 2429 ASN1_INTEGER *num; 2430 ASN1_TIME *certdate; 2431 2432 /* get the certs in "importance order" */ 2433 #if 0 2434 X509 *x = sk_X509_value(sk, numcerts - i - 1); 2435 #else 2436 X509 *x = sk_X509_value(sk, i); 2437 #endif 2438 2439 X509_CINF *cinf; 2440 EVP_PKEY *pubkey=NULL; 2441 int j; 2442 char *ptr; 2443 2444 (void)x509_name_oneline(X509_get_subject_name(x), bufp, CERTBUFFERSIZE); 2445 infof(data, "%2d Subject: %s\n", i, bufp); 2446 Curl_ssl_push_certinfo(data, i, "Subject", bufp); 2447 2448 (void)x509_name_oneline(X509_get_issuer_name(x), bufp, CERTBUFFERSIZE); 2449 infof(data, " Issuer: %s\n", bufp); 2450 Curl_ssl_push_certinfo(data, i, "Issuer", bufp); 2451 2452 value = X509_get_version(x); 2453 infof(data, " Version: %lu (0x%lx)\n", value+1, value); 2454 snprintf(bufp, CERTBUFFERSIZE, "%lx", value); 2455 Curl_ssl_push_certinfo(data, i, "Version", bufp); /* hex */ 2456 2457 num=X509_get_serialNumber(x); 2458 { 2459 int left = CERTBUFFERSIZE; 2460 2461 ptr = bufp; 2462 if(num->type == V_ASN1_NEG_INTEGER) { 2463 *ptr++='-'; 2464 left--; 2465 } 2466 2467 for(j=0; (j<num->length) && (left>=3); j++) { 2468 snprintf(ptr, left, "%02x", num->data[j]); 2469 ptr += 2; 2470 left -= 2; 2471 } 2472 if(num->length) 2473 infof(data, " Serial Number: %s\n", bufp); 2474 else 2475 bufp[0]=0; 2476 } 2477 if(bufp[0]) 2478 Curl_ssl_push_certinfo(data, i, "Serial Number", bufp); /* hex */ 2479 2480 cinf = x->cert_info; 2481 2482 j = asn1_object_dump(cinf->signature->algorithm, bufp, CERTBUFFERSIZE); 2483 if(!j) { 2484 infof(data, " Signature Algorithm: %s\n", bufp); 2485 Curl_ssl_push_certinfo(data, i, "Signature Algorithm", bufp); 2486 } 2487 2488 certdate = X509_get_notBefore(x); 2489 asn1_output(certdate, bufp, CERTBUFFERSIZE); 2490 infof(data, " Start date: %s\n", bufp); 2491 Curl_ssl_push_certinfo(data, i, "Start date", bufp); 2492 2493 certdate = X509_get_notAfter(x); 2494 asn1_output(certdate, bufp, CERTBUFFERSIZE); 2495 infof(data, " Expire date: %s\n", bufp); 2496 Curl_ssl_push_certinfo(data, i, "Expire date", bufp); 2497 2498 j = asn1_object_dump(cinf->key->algor->algorithm, bufp, CERTBUFFERSIZE); 2499 if(!j) { 2500 infof(data, " Public Key Algorithm: %s\n", bufp); 2501 Curl_ssl_push_certinfo(data, i, "Public Key Algorithm", bufp); 2502 } 2503 2504 pubkey = X509_get_pubkey(x); 2505 if(!pubkey) 2506 infof(data, " Unable to load public key\n"); 2507 else { 2508 switch(pubkey->type) { 2509 case EVP_PKEY_RSA: 2510 infof(data, " RSA Public Key (%d bits)\n", 2511 BN_num_bits(pubkey->pkey.rsa->n)); 2512 snprintf(bufp, CERTBUFFERSIZE, "%d", BN_num_bits(pubkey->pkey.rsa->n)); 2513 Curl_ssl_push_certinfo(data, i, "RSA Public Key", bufp); 2514 2515 print_pubkey_BN(rsa, n, i); 2516 print_pubkey_BN(rsa, e, i); 2517 print_pubkey_BN(rsa, d, i); 2518 print_pubkey_BN(rsa, p, i); 2519 print_pubkey_BN(rsa, q, i); 2520 print_pubkey_BN(rsa, dmp1, i); 2521 print_pubkey_BN(rsa, dmq1, i); 2522 print_pubkey_BN(rsa, iqmp, i); 2523 break; 2524 case EVP_PKEY_DSA: 2525 print_pubkey_BN(dsa, p, i); 2526 print_pubkey_BN(dsa, q, i); 2527 print_pubkey_BN(dsa, g, i); 2528 print_pubkey_BN(dsa, priv_key, i); 2529 print_pubkey_BN(dsa, pub_key, i); 2530 break; 2531 case EVP_PKEY_DH: 2532 print_pubkey_BN(dh, p, i); 2533 print_pubkey_BN(dh, g, i); 2534 print_pubkey_BN(dh, priv_key, i); 2535 print_pubkey_BN(dh, pub_key, i); 2536 break; 2537 #if 0 2538 case EVP_PKEY_EC: /* symbol not present in OpenSSL 0.9.6 */ 2539 /* left TODO */ 2540 break; 2541 #endif 2542 } 2543 EVP_PKEY_free(pubkey); 2544 } 2545 2546 X509V3_ext(data, i, cinf->extensions); 2547 2548 X509_signature(data, i, x->signature); 2549 2550 dumpcert(data, x, i); 2551 } 2552 2553 free(bufp); 2554 2555 return CURLE_OK; 2556 } 2557 2558 /* 2559 * Heavily modified from: 2560 * https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning#OpenSSL 2561 */ 2562 static CURLcode pkp_pin_peer_pubkey(X509* cert, const char *pinnedpubkey) 2563 { 2564 /* Scratch */ 2565 int len1 = 0, len2 = 0; 2566 unsigned char *buff1 = NULL, *temp = NULL; 2567 2568 /* Result is returned to caller */ 2569 CURLcode result = CURLE_SSL_PINNEDPUBKEYNOTMATCH; 2570 2571 /* if a path wasn't specified, don't pin */ 2572 if(!pinnedpubkey) 2573 return CURLE_OK; 2574 2575 if(!cert) 2576 return result; 2577 2578 do { 2579 /* Begin Gyrations to get the subjectPublicKeyInfo */ 2580 /* Thanks to Viktor Dukhovni on the OpenSSL mailing list */ 2581 2582 /* https://groups.google.com/group/mailing.openssl.users/browse_thread 2583 /thread/d61858dae102c6c7 */ 2584 len1 = i2d_X509_PUBKEY(X509_get_X509_PUBKEY(cert), NULL); 2585 if(len1 < 1) 2586 break; /* failed */ 2587 2588 /* https://www.openssl.org/docs/crypto/buffer.html */ 2589 buff1 = temp = OPENSSL_malloc(len1); 2590 if(!buff1) 2591 break; /* failed */ 2592 2593 /* https://www.openssl.org/docs/crypto/d2i_X509.html */ 2594 len2 = i2d_X509_PUBKEY(X509_get_X509_PUBKEY(cert), &temp); 2595 2596 /* 2597 * These checks are verifying we got back the same values as when we 2598 * sized the buffer. It's pretty weak since they should always be the 2599 * same. But it gives us something to test. 2600 */ 2601 if((len1 != len2) || !temp || ((temp - buff1) != len1)) 2602 break; /* failed */ 2603 2604 /* End Gyrations */ 2605 2606 /* The one good exit point */ 2607 result = Curl_pin_peer_pubkey(pinnedpubkey, buff1, len1); 2608 } while(0); 2609 2610 /* https://www.openssl.org/docs/crypto/buffer.html */ 2611 if(buff1) 2612 OPENSSL_free(buff1); 2613 2614 return result; 2615 } 2616 2617 /* 2618 * Get the server cert, verify it and show it etc, only call failf() if the 2619 * 'strict' argument is TRUE as otherwise all this is for informational 2620 * purposes only! 2621 * 2622 * We check certificates to authenticate the server; otherwise we risk 2623 * man-in-the-middle attack. 2624 */ 2625 static CURLcode servercert(struct connectdata *conn, 2626 struct ssl_connect_data *connssl, 2627 bool strict) 2628 { 2629 CURLcode result = CURLE_OK; 2630 int rc; 2631 long lerr; 2632 ASN1_TIME *certdate; 2633 struct SessionHandle *data = conn->data; 2634 X509 *issuer; 2635 FILE *fp; 2636 char *buffer = data->state.buffer; 2637 const char *ptr; 2638 2639 if(data->set.ssl.certinfo) 2640 /* we've been asked to gather certificate info! */ 2641 (void)get_cert_chain(conn, connssl); 2642 2643 connssl->server_cert = SSL_get_peer_certificate(connssl->handle); 2644 if(!connssl->server_cert) { 2645 if(strict) 2646 failf(data, "SSL: couldn't get peer certificate!"); 2647 return CURLE_PEER_FAILED_VERIFICATION; 2648 } 2649 2650 infof(data, "Server certificate:\n"); 2651 2652 rc = x509_name_oneline(X509_get_subject_name(connssl->server_cert), 2653 buffer, BUFSIZE); 2654 infof(data, "\t subject: %s\n", rc?"[NONE]":buffer); 2655 2656 certdate = X509_get_notBefore(connssl->server_cert); 2657 asn1_output(certdate, buffer, BUFSIZE); 2658 infof(data, "\t start date: %s\n", buffer); 2659 2660 certdate = X509_get_notAfter(connssl->server_cert); 2661 asn1_output(certdate, buffer, BUFSIZE); 2662 infof(data, "\t expire date: %s\n", buffer); 2663 2664 if(data->set.ssl.verifyhost) { 2665 result = verifyhost(conn, connssl->server_cert); 2666 if(result) { 2667 X509_free(connssl->server_cert); 2668 connssl->server_cert = NULL; 2669 return result; 2670 } 2671 } 2672 2673 rc = x509_name_oneline(X509_get_issuer_name(connssl->server_cert), 2674 buffer, BUFSIZE); 2675 if(rc) { 2676 if(strict) 2677 failf(data, "SSL: couldn't get X509-issuer name!"); 2678 result = CURLE_SSL_CONNECT_ERROR; 2679 } 2680 else { 2681 infof(data, "\t issuer: %s\n", buffer); 2682 2683 /* We could do all sorts of certificate verification stuff here before 2684 deallocating the certificate. */ 2685 2686 /* e.g. match issuer name with provided issuer certificate */ 2687 if(data->set.str[STRING_SSL_ISSUERCERT]) { 2688 fp = fopen(data->set.str[STRING_SSL_ISSUERCERT], FOPEN_READTEXT); 2689 if(!fp) { 2690 if(strict) 2691 failf(data, "SSL: Unable to open issuer cert (%s)", 2692 data->set.str[STRING_SSL_ISSUERCERT]); 2693 X509_free(connssl->server_cert); 2694 connssl->server_cert = NULL; 2695 return CURLE_SSL_ISSUER_ERROR; 2696 } 2697 2698 issuer = PEM_read_X509(fp, NULL, ZERO_NULL, NULL); 2699 if(!issuer) { 2700 if(strict) 2701 failf(data, "SSL: Unable to read issuer cert (%s)", 2702 data->set.str[STRING_SSL_ISSUERCERT]); 2703 X509_free(connssl->server_cert); 2704 X509_free(issuer); 2705 fclose(fp); 2706 return CURLE_SSL_ISSUER_ERROR; 2707 } 2708 2709 fclose(fp); 2710 2711 if(X509_check_issued(issuer, connssl->server_cert) != X509_V_OK) { 2712 if(strict) 2713 failf(data, "SSL: Certificate issuer check failed (%s)", 2714 data->set.str[STRING_SSL_ISSUERCERT]); 2715 X509_free(connssl->server_cert); 2716 X509_free(issuer); 2717 connssl->server_cert = NULL; 2718 return CURLE_SSL_ISSUER_ERROR; 2719 } 2720 2721 infof(data, "\t SSL certificate issuer check ok (%s)\n", 2722 data->set.str[STRING_SSL_ISSUERCERT]); 2723 X509_free(issuer); 2724 } 2725 2726 lerr = data->set.ssl.certverifyresult = 2727 SSL_get_verify_result(connssl->handle); 2728 2729 if(data->set.ssl.certverifyresult != X509_V_OK) { 2730 if(data->set.ssl.verifypeer) { 2731 /* We probably never reach this, because SSL_connect() will fail 2732 and we return earlier if verifypeer is set? */ 2733 if(strict) 2734 failf(data, "SSL certificate verify result: %s (%ld)", 2735 X509_verify_cert_error_string(lerr), lerr); 2736 result = CURLE_PEER_FAILED_VERIFICATION; 2737 } 2738 else 2739 infof(data, "\t SSL certificate verify result: %s (%ld)," 2740 " continuing anyway.\n", 2741 X509_verify_cert_error_string(lerr), lerr); 2742 } 2743 else 2744 infof(data, "\t SSL certificate verify ok.\n"); 2745 } 2746 2747 #if (OPENSSL_VERSION_NUMBER >= 0x0090808fL) && !defined(OPENSSL_NO_TLSEXT) && \ 2748 !defined(OPENSSL_IS_BORINGSSL) 2749 if(data->set.ssl.verifystatus) { 2750 result = verifystatus(conn, connssl); 2751 if(result) { 2752 X509_free(connssl->server_cert); 2753 connssl->server_cert = NULL; 2754 return result; 2755 } 2756 } 2757 #endif 2758 2759 if(!strict) 2760 /* when not strict, we don't bother about the verify cert problems */ 2761 result = CURLE_OK; 2762 2763 ptr = data->set.str[STRING_SSL_PINNEDPUBLICKEY]; 2764 if(!result && ptr) { 2765 result = pkp_pin_peer_pubkey(connssl->server_cert, ptr); 2766 if(result) 2767 failf(data, "SSL: public key does not match pinned public key!"); 2768 } 2769 2770 X509_free(connssl->server_cert); 2771 connssl->server_cert = NULL; 2772 connssl->connecting_state = ssl_connect_done; 2773 2774 return result; 2775 } 2776 2777 static CURLcode ossl_connect_step3(struct connectdata *conn, int sockindex) 2778 { 2779 CURLcode result = CURLE_OK; 2780 void *old_ssl_sessionid = NULL; 2781 struct SessionHandle *data = conn->data; 2782 struct ssl_connect_data *connssl = &conn->ssl[sockindex]; 2783 bool incache; 2784 SSL_SESSION *our_ssl_sessionid; 2785 2786 DEBUGASSERT(ssl_connect_3 == connssl->connecting_state); 2787 2788 our_ssl_sessionid = SSL_get1_session(connssl->handle); 2789 2790 /* SSL_get1_session() will increment the reference count and the session 2791 will stay in memory until explicitly freed with SSL_SESSION_free(3), 2792 regardless of its state. */ 2793 2794 incache = !(Curl_ssl_getsessionid(conn, &old_ssl_sessionid, NULL)); 2795 if(incache) { 2796 if(old_ssl_sessionid != our_ssl_sessionid) { 2797 infof(data, "old SSL session ID is stale, removing\n"); 2798 Curl_ssl_delsessionid(conn, old_ssl_sessionid); 2799 incache = FALSE; 2800 } 2801 } 2802 2803 if(!incache) { 2804 result = Curl_ssl_addsessionid(conn, our_ssl_sessionid, 2805 0 /* unknown size */); 2806 if(result) { 2807 failf(data, "failed to store ssl session"); 2808 return result; 2809 } 2810 } 2811 else { 2812 /* Session was incache, so refcount already incremented earlier. 2813 * Avoid further increments with each SSL_get1_session() call. 2814 * This does not free the session as refcount remains > 0 2815 */ 2816 SSL_SESSION_free(our_ssl_sessionid); 2817 } 2818 2819 /* 2820 * We check certificates to authenticate the server; otherwise we risk 2821 * man-in-the-middle attack; NEVERTHELESS, if we're told explicitly not to 2822 * verify the peer ignore faults and failures from the server cert 2823 * operations. 2824 */ 2825 2826 result = servercert(conn, connssl, 2827 (data->set.ssl.verifypeer || data->set.ssl.verifyhost)); 2828 2829 if(!result) 2830 connssl->connecting_state = ssl_connect_done; 2831 2832 return result; 2833 } 2834 2835 static Curl_recv ossl_recv; 2836 static Curl_send ossl_send; 2837 2838 static CURLcode ossl_connect_common(struct connectdata *conn, 2839 int sockindex, 2840 bool nonblocking, 2841 bool *done) 2842 { 2843 CURLcode result; 2844 struct SessionHandle *data = conn->data; 2845 struct ssl_connect_data *connssl = &conn->ssl[sockindex]; 2846 curl_socket_t sockfd = conn->sock[sockindex]; 2847 long timeout_ms; 2848 int what; 2849 2850 /* check if the connection has already been established */ 2851 if(ssl_connection_complete == connssl->state) { 2852 *done = TRUE; 2853 return CURLE_OK; 2854 } 2855 2856 if(ssl_connect_1 == connssl->connecting_state) { 2857 /* Find out how much more time we're allowed */ 2858 timeout_ms = Curl_timeleft(data, NULL, TRUE); 2859 2860 if(timeout_ms < 0) { 2861 /* no need to continue if time already is up */ 2862 failf(data, "SSL connection timeout"); 2863 return CURLE_OPERATION_TIMEDOUT; 2864 } 2865 2866 result = ossl_connect_step1(conn, sockindex); 2867 if(result) 2868 return result; 2869 } 2870 2871 while(ssl_connect_2 == connssl->connecting_state || 2872 ssl_connect_2_reading == connssl->connecting_state || 2873 ssl_connect_2_writing == connssl->connecting_state) { 2874 2875 /* check allowed time left */ 2876 timeout_ms = Curl_timeleft(data, NULL, TRUE); 2877 2878 if(timeout_ms < 0) { 2879 /* no need to continue if time already is up */ 2880 failf(data, "SSL connection timeout"); 2881 return CURLE_OPERATION_TIMEDOUT; 2882 } 2883 2884 /* if ssl is expecting something, check if it's available. */ 2885 if(connssl->connecting_state == ssl_connect_2_reading || 2886 connssl->connecting_state == ssl_connect_2_writing) { 2887 2888 curl_socket_t writefd = ssl_connect_2_writing== 2889 connssl->connecting_state?sockfd:CURL_SOCKET_BAD; 2890 curl_socket_t readfd = ssl_connect_2_reading== 2891 connssl->connecting_state?sockfd:CURL_SOCKET_BAD; 2892 2893 what = Curl_socket_ready(readfd, writefd, nonblocking?0:timeout_ms); 2894 if(what < 0) { 2895 /* fatal error */ 2896 failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO); 2897 return CURLE_SSL_CONNECT_ERROR; 2898 } 2899 else if(0 == what) { 2900 if(nonblocking) { 2901 *done = FALSE; 2902 return CURLE_OK; 2903 } 2904 else { 2905 /* timeout */ 2906 failf(data, "SSL connection timeout"); 2907 return CURLE_OPERATION_TIMEDOUT; 2908 } 2909 } 2910 /* socket is readable or writable */ 2911 } 2912 2913 /* Run transaction, and return to the caller if it failed or if this 2914 * connection is done nonblocking and this loop would execute again. This 2915 * permits the owner of a multi handle to abort a connection attempt 2916 * before step2 has completed while ensuring that a client using select() 2917 * or epoll() will always have a valid fdset to wait on. 2918 */ 2919 result = ossl_connect_step2(conn, sockindex); 2920 if(result || (nonblocking && 2921 (ssl_connect_2 == connssl->connecting_state || 2922 ssl_connect_2_reading == connssl->connecting_state || 2923 ssl_connect_2_writing == connssl->connecting_state))) 2924 return result; 2925 2926 } /* repeat step2 until all transactions are done. */ 2927 2928 if(ssl_connect_3 == connssl->connecting_state) { 2929 result = ossl_connect_step3(conn, sockindex); 2930 if(result) 2931 return result; 2932 } 2933 2934 if(ssl_connect_done == connssl->connecting_state) { 2935 connssl->state = ssl_connection_complete; 2936 conn->recv[sockindex] = ossl_recv; 2937 conn->send[sockindex] = ossl_send; 2938 *done = TRUE; 2939 } 2940 else 2941 *done = FALSE; 2942 2943 /* Reset our connect state machine */ 2944 connssl->connecting_state = ssl_connect_1; 2945 2946 return CURLE_OK; 2947 } 2948 2949 CURLcode Curl_ossl_connect_nonblocking(struct connectdata *conn, 2950 int sockindex, 2951 bool *done) 2952 { 2953 return ossl_connect_common(conn, sockindex, TRUE, done); 2954 } 2955 2956 CURLcode Curl_ossl_connect(struct connectdata *conn, int sockindex) 2957 { 2958 CURLcode result; 2959 bool done = FALSE; 2960 2961 result = ossl_connect_common(conn, sockindex, FALSE, &done); 2962 if(result) 2963 return result; 2964 2965 DEBUGASSERT(done); 2966 2967 return CURLE_OK; 2968 } 2969 2970 bool Curl_ossl_data_pending(const struct connectdata *conn, int connindex) 2971 { 2972 if(conn->ssl[connindex].handle) 2973 /* SSL is in use */ 2974 return (0 != SSL_pending(conn->ssl[connindex].handle)) ? TRUE : FALSE; 2975 else 2976 return FALSE; 2977 } 2978 2979 static ssize_t ossl_send(struct connectdata *conn, 2980 int sockindex, 2981 const void *mem, 2982 size_t len, 2983 CURLcode *curlcode) 2984 { 2985 /* SSL_write() is said to return 'int' while write() and send() returns 2986 'size_t' */ 2987 int err; 2988 char error_buffer[120]; /* OpenSSL documents that this must be at least 120 2989 bytes long. */ 2990 unsigned long sslerror; 2991 int memlen; 2992 int rc; 2993 2994 ERR_clear_error(); 2995 2996 memlen = (len > (size_t)INT_MAX) ? INT_MAX : (int)len; 2997 rc = SSL_write(conn->ssl[sockindex].handle, mem, memlen); 2998 2999 if(rc <= 0) { 3000 err = SSL_get_error(conn->ssl[sockindex].handle, rc); 3001 3002 switch(err) { 3003 case SSL_ERROR_WANT_READ: 3004 case SSL_ERROR_WANT_WRITE: 3005 /* The operation did not complete; the same TLS/SSL I/O function 3006 should be called again later. This is basically an EWOULDBLOCK 3007 equivalent. */ 3008 *curlcode = CURLE_AGAIN; 3009 return -1; 3010 case SSL_ERROR_SYSCALL: 3011 failf(conn->data, "SSL_write() returned SYSCALL, errno = %d", 3012 SOCKERRNO); 3013 *curlcode = CURLE_SEND_ERROR; 3014 return -1; 3015 case SSL_ERROR_SSL: 3016 /* A failure in the SSL library occurred, usually a protocol error. 3017 The OpenSSL error queue contains more information on the error. */ 3018 sslerror = ERR_get_error(); 3019 failf(conn->data, "SSL_write() error: %s", 3020 ERR_error_string(sslerror, error_buffer)); 3021 *curlcode = CURLE_SEND_ERROR; 3022 return -1; 3023 } 3024 /* a true error */ 3025 failf(conn->data, "SSL_write() return error %d", err); 3026 *curlcode = CURLE_SEND_ERROR; 3027 return -1; 3028 } 3029 *curlcode = CURLE_OK; 3030 return (ssize_t)rc; /* number of bytes */ 3031 } 3032 3033 static ssize_t ossl_recv(struct connectdata *conn, /* connection data */ 3034 int num, /* socketindex */ 3035 char *buf, /* store read data here */ 3036 size_t buffersize, /* max amount to read */ 3037 CURLcode *curlcode) 3038 { 3039 char error_buffer[120]; /* OpenSSL documents that this must be at 3040 least 120 bytes long. */ 3041 unsigned long sslerror; 3042 ssize_t nread; 3043 int buffsize; 3044 3045 ERR_clear_error(); 3046 3047 buffsize = (buffersize > (size_t)INT_MAX) ? INT_MAX : (int)buffersize; 3048 nread = (ssize_t)SSL_read(conn->ssl[num].handle, buf, buffsize); 3049 if(nread <= 0) { 3050 /* failed SSL_read */ 3051 int err = SSL_get_error(conn->ssl[num].handle, (int)nread); 3052 3053 switch(err) { 3054 case SSL_ERROR_NONE: /* this is not an error */ 3055 case SSL_ERROR_ZERO_RETURN: /* no more data */ 3056 break; 3057 case SSL_ERROR_WANT_READ: 3058 case SSL_ERROR_WANT_WRITE: 3059 /* there's data pending, re-invoke SSL_read() */ 3060 *curlcode = CURLE_AGAIN; 3061 return -1; 3062 default: 3063 /* openssl/ssl.h for SSL_ERROR_SYSCALL says "look at error stack/return 3064 value/errno" */ 3065 /* https://www.openssl.org/docs/crypto/ERR_get_error.html */ 3066 sslerror = ERR_get_error(); 3067 if((nread < 0) || sslerror) { 3068 /* If the return code was negative or there actually is an error in the 3069 queue */ 3070 failf(conn->data, "SSL read: %s, errno %d", 3071 ERR_error_string(sslerror, error_buffer), 3072 SOCKERRNO); 3073 *curlcode = CURLE_RECV_ERROR; 3074 return -1; 3075 } 3076 } 3077 } 3078 return nread; 3079 } 3080 3081 size_t Curl_ossl_version(char *buffer, size_t size) 3082 { 3083 #ifdef YASSL_VERSION 3084 /* yassl provides an OpenSSL API compatibility layer so it looks identical 3085 to OpenSSL in all other aspects */ 3086 return snprintf(buffer, size, "yassl/%s", YASSL_VERSION); 3087 #else /* YASSL_VERSION */ 3088 #ifdef OPENSSL_IS_BORINGSSL 3089 return snprintf(buffer, size, "BoringSSL"); 3090 #else /* OPENSSL_IS_BORINGSSL */ 3091 3092 #if(OPENSSL_VERSION_NUMBER >= 0x905000) 3093 { 3094 char sub[3]; 3095 unsigned long ssleay_value; 3096 sub[2]='\0'; 3097 sub[1]='\0'; 3098 ssleay_value=SSLeay(); 3099 if(ssleay_value < 0x906000) { 3100 ssleay_value=SSLEAY_VERSION_NUMBER; 3101 sub[0]='\0'; 3102 } 3103 else { 3104 if(ssleay_value&0xff0) { 3105 int minor_ver = (ssleay_value >> 4) & 0xff; 3106 if(minor_ver > 26) { 3107 /* handle extended version introduced for 0.9.8za */ 3108 sub[1] = (char) ((minor_ver - 1) % 26 + 'a' + 1); 3109 sub[0] = 'z'; 3110 } 3111 else { 3112 sub[0]=(char)(((ssleay_value>>4)&0xff) + 'a' -1); 3113 } 3114 } 3115 else 3116 sub[0]='\0'; 3117 } 3118 3119 return snprintf(buffer, size, "%s/%lx.%lx.%lx%s", 3120 #ifdef LIBRESSL_VERSION_NUMBER 3121 "LibreSSL" 3122 #else 3123 "OpenSSL" 3124 #endif 3125 , (ssleay_value>>28)&0xf, 3126 (ssleay_value>>20)&0xff, 3127 (ssleay_value>>12)&0xff, 3128 sub); 3129 } 3130 3131 #else /* OPENSSL_VERSION_NUMBER is less than 0.9.5 */ 3132 3133 #if(OPENSSL_VERSION_NUMBER >= 0x900000) 3134 return snprintf(buffer, size, "OpenSSL/%lx.%lx.%lx", 3135 (OPENSSL_VERSION_NUMBER>>28)&0xff, 3136 (OPENSSL_VERSION_NUMBER>>20)&0xff, 3137 (OPENSSL_VERSION_NUMBER>>12)&0xf); 3138 3139 #else /* (OPENSSL_VERSION_NUMBER >= 0x900000) */ 3140 { 3141 char sub[2]; 3142 sub[1]='\0'; 3143 if(OPENSSL_VERSION_NUMBER&0x0f) { 3144 sub[0]=(OPENSSL_VERSION_NUMBER&0x0f) + 'a' -1; 3145 } 3146 else 3147 sub[0]='\0'; 3148 3149 return snprintf(buffer, size, "SSL/%x.%x.%x%s", 3150 (OPENSSL_VERSION_NUMBER>>12)&0xff, 3151 (OPENSSL_VERSION_NUMBER>>8)&0xf, 3152 (OPENSSL_VERSION_NUMBER>>4)&0xf, sub); 3153 } 3154 #endif /* (OPENSSL_VERSION_NUMBER >= 0x900000) */ 3155 #endif /* OPENSSL_VERSION_NUMBER is less than 0.9.5 */ 3156 3157 #endif /* OPENSSL_IS_BORINGSSL */ 3158 #endif /* YASSL_VERSION */ 3159 } 3160 3161 /* can be called with data == NULL */ 3162 int Curl_ossl_random(struct SessionHandle *data, unsigned char *entropy, 3163 size_t length) 3164 { 3165 if(data) { 3166 Curl_ossl_seed(data); /* Initiate the seed if not already done */ 3167 } 3168 RAND_bytes(entropy, curlx_uztosi(length)); 3169 return 0; /* 0 as in no problem */ 3170 } 3171 3172 void Curl_ossl_md5sum(unsigned char *tmp, /* input */ 3173 size_t tmplen, 3174 unsigned char *md5sum /* output */, 3175 size_t unused) 3176 { 3177 MD5_CTX MD5pw; 3178 (void)unused; 3179 MD5_Init(&MD5pw); 3180 MD5_Update(&MD5pw, tmp, tmplen); 3181 MD5_Final(md5sum, &MD5pw); 3182 } 3183 3184 bool Curl_ossl_cert_status_request(void) 3185 { 3186 #if (OPENSSL_VERSION_NUMBER >= 0x0090808fL) && !defined(OPENSSL_NO_TLSEXT) && \ 3187 !defined(OPENSSL_IS_BORINGSSL) 3188 return TRUE; 3189 #else 3190 return FALSE; 3191 #endif 3192 } 3193 #endif /* USE_OPENSSL */ 3194