1 /* 2 * SSL/TLS interface functions for OpenSSL 3 * Copyright (c) 2004-2015, Jouni Malinen <j (at) w1.fi> 4 * 5 * This software may be distributed under the terms of the BSD license. 6 * See README for more details. 7 */ 8 9 #include "includes.h" 10 11 #ifndef CONFIG_SMARTCARD 12 #ifndef OPENSSL_NO_ENGINE 13 #ifndef ANDROID 14 #define OPENSSL_NO_ENGINE 15 #endif 16 #endif 17 #endif 18 19 #include <openssl/ssl.h> 20 #include <openssl/err.h> 21 #include <openssl/opensslv.h> 22 #include <openssl/pkcs12.h> 23 #include <openssl/x509v3.h> 24 #ifndef OPENSSL_NO_ENGINE 25 #include <openssl/engine.h> 26 #endif /* OPENSSL_NO_ENGINE */ 27 #ifndef OPENSSL_NO_DSA 28 #include <openssl/dsa.h> 29 #endif 30 #ifndef OPENSSL_NO_DH 31 #include <openssl/dh.h> 32 #endif 33 34 #include "common.h" 35 #include "crypto.h" 36 #include "sha1.h" 37 #include "sha256.h" 38 #include "tls.h" 39 #include "tls_openssl.h" 40 41 #if !defined(CONFIG_FIPS) && \ 42 (defined(EAP_FAST) || defined(EAP_FAST_DYNAMIC) || \ 43 defined(EAP_SERVER_FAST)) 44 #define OPENSSL_NEED_EAP_FAST_PRF 45 #endif 46 47 #if defined(OPENSSL_IS_BORINGSSL) 48 /* stack_index_t is the return type of OpenSSL's sk_XXX_num() functions. */ 49 typedef size_t stack_index_t; 50 #else 51 typedef int stack_index_t; 52 #endif 53 54 #ifdef SSL_set_tlsext_status_type 55 #ifndef OPENSSL_NO_TLSEXT 56 #define HAVE_OCSP 57 #include <openssl/ocsp.h> 58 #endif /* OPENSSL_NO_TLSEXT */ 59 #endif /* SSL_set_tlsext_status_type */ 60 61 #if (OPENSSL_VERSION_NUMBER < 0x10100000L || \ 62 defined(LIBRESSL_VERSION_NUMBER)) && \ 63 !defined(BORINGSSL_API_VERSION) 64 /* 65 * SSL_get_client_random() and SSL_get_server_random() were added in OpenSSL 66 * 1.1.0 and newer BoringSSL revisions. Provide compatibility wrappers for 67 * older versions. 68 */ 69 70 static size_t SSL_get_client_random(const SSL *ssl, unsigned char *out, 71 size_t outlen) 72 { 73 if (!ssl->s3 || outlen < SSL3_RANDOM_SIZE) 74 return 0; 75 os_memcpy(out, ssl->s3->client_random, SSL3_RANDOM_SIZE); 76 return SSL3_RANDOM_SIZE; 77 } 78 79 80 static size_t SSL_get_server_random(const SSL *ssl, unsigned char *out, 81 size_t outlen) 82 { 83 if (!ssl->s3 || outlen < SSL3_RANDOM_SIZE) 84 return 0; 85 os_memcpy(out, ssl->s3->server_random, SSL3_RANDOM_SIZE); 86 return SSL3_RANDOM_SIZE; 87 } 88 89 90 #ifdef OPENSSL_NEED_EAP_FAST_PRF 91 static size_t SSL_SESSION_get_master_key(const SSL_SESSION *session, 92 unsigned char *out, size_t outlen) 93 { 94 if (!session || session->master_key_length < 0 || 95 (size_t) session->master_key_length > outlen) 96 return 0; 97 if ((size_t) session->master_key_length < outlen) 98 outlen = session->master_key_length; 99 os_memcpy(out, session->master_key, outlen); 100 return outlen; 101 } 102 #endif /* OPENSSL_NEED_EAP_FAST_PRF */ 103 104 #endif 105 106 #ifdef ANDROID 107 #include <openssl/pem.h> 108 #include <keystore/keystore_get.h> 109 110 static BIO * BIO_from_keystore(const char *key) 111 { 112 BIO *bio = NULL; 113 uint8_t *value = NULL; 114 int length = keystore_get(key, strlen(key), &value); 115 if (length != -1 && (bio = BIO_new(BIO_s_mem())) != NULL) 116 BIO_write(bio, value, length); 117 free(value); 118 return bio; 119 } 120 121 122 static int tls_add_ca_from_keystore(X509_STORE *ctx, const char *key_alias) 123 { 124 BIO *bio = BIO_from_keystore(key_alias); 125 STACK_OF(X509_INFO) *stack = NULL; 126 stack_index_t i; 127 128 if (bio) { 129 stack = PEM_X509_INFO_read_bio(bio, NULL, NULL, NULL); 130 BIO_free(bio); 131 } 132 133 if (!stack) { 134 wpa_printf(MSG_WARNING, "TLS: Failed to parse certificate: %s", 135 key_alias); 136 return -1; 137 } 138 139 for (i = 0; i < sk_X509_INFO_num(stack); ++i) { 140 X509_INFO *info = sk_X509_INFO_value(stack, i); 141 142 if (info->x509) 143 X509_STORE_add_cert(ctx, info->x509); 144 if (info->crl) 145 X509_STORE_add_crl(ctx, info->crl); 146 } 147 148 sk_X509_INFO_pop_free(stack, X509_INFO_free); 149 150 return 0; 151 } 152 153 154 static int tls_add_ca_from_keystore_encoded(X509_STORE *ctx, 155 const char *encoded_key_alias) 156 { 157 int rc = -1; 158 int len = os_strlen(encoded_key_alias); 159 unsigned char *decoded_alias; 160 161 if (len & 1) { 162 wpa_printf(MSG_WARNING, "Invalid hex-encoded alias: %s", 163 encoded_key_alias); 164 return rc; 165 } 166 167 decoded_alias = os_malloc(len / 2 + 1); 168 if (decoded_alias) { 169 if (!hexstr2bin(encoded_key_alias, decoded_alias, len / 2)) { 170 decoded_alias[len / 2] = '\0'; 171 rc = tls_add_ca_from_keystore( 172 ctx, (const char *) decoded_alias); 173 } 174 os_free(decoded_alias); 175 } 176 177 return rc; 178 } 179 180 #endif /* ANDROID */ 181 182 static int tls_openssl_ref_count = 0; 183 static int tls_ex_idx_session = -1; 184 185 struct tls_context { 186 void (*event_cb)(void *ctx, enum tls_event ev, 187 union tls_event_data *data); 188 void *cb_ctx; 189 int cert_in_cb; 190 char *ocsp_stapling_response; 191 }; 192 193 static struct tls_context *tls_global = NULL; 194 195 196 struct tls_data { 197 SSL_CTX *ssl; 198 unsigned int tls_session_lifetime; 199 }; 200 201 struct tls_connection { 202 struct tls_context *context; 203 SSL_CTX *ssl_ctx; 204 SSL *ssl; 205 BIO *ssl_in, *ssl_out; 206 #if defined(ANDROID) || !defined(OPENSSL_NO_ENGINE) 207 ENGINE *engine; /* functional reference to the engine */ 208 EVP_PKEY *private_key; /* the private key if using engine */ 209 #endif /* OPENSSL_NO_ENGINE */ 210 char *subject_match, *altsubject_match, *suffix_match, *domain_match; 211 int read_alerts, write_alerts, failed; 212 213 tls_session_ticket_cb session_ticket_cb; 214 void *session_ticket_cb_ctx; 215 216 /* SessionTicket received from OpenSSL hello_extension_cb (server) */ 217 u8 *session_ticket; 218 size_t session_ticket_len; 219 220 unsigned int ca_cert_verify:1; 221 unsigned int cert_probe:1; 222 unsigned int server_cert_only:1; 223 unsigned int invalid_hb_used:1; 224 unsigned int success_data:1; 225 226 u8 srv_cert_hash[32]; 227 228 unsigned int flags; 229 230 X509 *peer_cert; 231 X509 *peer_issuer; 232 X509 *peer_issuer_issuer; 233 234 unsigned char client_random[SSL3_RANDOM_SIZE]; 235 unsigned char server_random[SSL3_RANDOM_SIZE]; 236 }; 237 238 239 static struct tls_context * tls_context_new(const struct tls_config *conf) 240 { 241 struct tls_context *context = os_zalloc(sizeof(*context)); 242 if (context == NULL) 243 return NULL; 244 if (conf) { 245 context->event_cb = conf->event_cb; 246 context->cb_ctx = conf->cb_ctx; 247 context->cert_in_cb = conf->cert_in_cb; 248 } 249 return context; 250 } 251 252 253 #ifdef CONFIG_NO_STDOUT_DEBUG 254 255 static void _tls_show_errors(void) 256 { 257 unsigned long err; 258 259 while ((err = ERR_get_error())) { 260 /* Just ignore the errors, since stdout is disabled */ 261 } 262 } 263 #define tls_show_errors(l, f, t) _tls_show_errors() 264 265 #else /* CONFIG_NO_STDOUT_DEBUG */ 266 267 static void tls_show_errors(int level, const char *func, const char *txt) 268 { 269 unsigned long err; 270 271 wpa_printf(level, "OpenSSL: %s - %s %s", 272 func, txt, ERR_error_string(ERR_get_error(), NULL)); 273 274 while ((err = ERR_get_error())) { 275 wpa_printf(MSG_INFO, "OpenSSL: pending error: %s", 276 ERR_error_string(err, NULL)); 277 } 278 } 279 280 #endif /* CONFIG_NO_STDOUT_DEBUG */ 281 282 283 #ifdef CONFIG_NATIVE_WINDOWS 284 285 /* Windows CryptoAPI and access to certificate stores */ 286 #include <wincrypt.h> 287 288 #ifdef __MINGW32_VERSION 289 /* 290 * MinGW does not yet include all the needed definitions for CryptoAPI, so 291 * define here whatever extra is needed. 292 */ 293 #define CERT_SYSTEM_STORE_CURRENT_USER (1 << 16) 294 #define CERT_STORE_READONLY_FLAG 0x00008000 295 #define CERT_STORE_OPEN_EXISTING_FLAG 0x00004000 296 297 #endif /* __MINGW32_VERSION */ 298 299 300 struct cryptoapi_rsa_data { 301 const CERT_CONTEXT *cert; 302 HCRYPTPROV crypt_prov; 303 DWORD key_spec; 304 BOOL free_crypt_prov; 305 }; 306 307 308 static void cryptoapi_error(const char *msg) 309 { 310 wpa_printf(MSG_INFO, "CryptoAPI: %s; err=%u", 311 msg, (unsigned int) GetLastError()); 312 } 313 314 315 static int cryptoapi_rsa_pub_enc(int flen, const unsigned char *from, 316 unsigned char *to, RSA *rsa, int padding) 317 { 318 wpa_printf(MSG_DEBUG, "%s - not implemented", __func__); 319 return 0; 320 } 321 322 323 static int cryptoapi_rsa_pub_dec(int flen, const unsigned char *from, 324 unsigned char *to, RSA *rsa, int padding) 325 { 326 wpa_printf(MSG_DEBUG, "%s - not implemented", __func__); 327 return 0; 328 } 329 330 331 static int cryptoapi_rsa_priv_enc(int flen, const unsigned char *from, 332 unsigned char *to, RSA *rsa, int padding) 333 { 334 struct cryptoapi_rsa_data *priv = 335 (struct cryptoapi_rsa_data *) rsa->meth->app_data; 336 HCRYPTHASH hash; 337 DWORD hash_size, len, i; 338 unsigned char *buf = NULL; 339 int ret = 0; 340 341 if (priv == NULL) { 342 RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, 343 ERR_R_PASSED_NULL_PARAMETER); 344 return 0; 345 } 346 347 if (padding != RSA_PKCS1_PADDING) { 348 RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, 349 RSA_R_UNKNOWN_PADDING_TYPE); 350 return 0; 351 } 352 353 if (flen != 16 /* MD5 */ + 20 /* SHA-1 */) { 354 wpa_printf(MSG_INFO, "%s - only MD5-SHA1 hash supported", 355 __func__); 356 RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, 357 RSA_R_INVALID_MESSAGE_LENGTH); 358 return 0; 359 } 360 361 if (!CryptCreateHash(priv->crypt_prov, CALG_SSL3_SHAMD5, 0, 0, &hash)) 362 { 363 cryptoapi_error("CryptCreateHash failed"); 364 return 0; 365 } 366 367 len = sizeof(hash_size); 368 if (!CryptGetHashParam(hash, HP_HASHSIZE, (BYTE *) &hash_size, &len, 369 0)) { 370 cryptoapi_error("CryptGetHashParam failed"); 371 goto err; 372 } 373 374 if ((int) hash_size != flen) { 375 wpa_printf(MSG_INFO, "CryptoAPI: Invalid hash size (%u != %d)", 376 (unsigned) hash_size, flen); 377 RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, 378 RSA_R_INVALID_MESSAGE_LENGTH); 379 goto err; 380 } 381 if (!CryptSetHashParam(hash, HP_HASHVAL, (BYTE * ) from, 0)) { 382 cryptoapi_error("CryptSetHashParam failed"); 383 goto err; 384 } 385 386 len = RSA_size(rsa); 387 buf = os_malloc(len); 388 if (buf == NULL) { 389 RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, ERR_R_MALLOC_FAILURE); 390 goto err; 391 } 392 393 if (!CryptSignHash(hash, priv->key_spec, NULL, 0, buf, &len)) { 394 cryptoapi_error("CryptSignHash failed"); 395 goto err; 396 } 397 398 for (i = 0; i < len; i++) 399 to[i] = buf[len - i - 1]; 400 ret = len; 401 402 err: 403 os_free(buf); 404 CryptDestroyHash(hash); 405 406 return ret; 407 } 408 409 410 static int cryptoapi_rsa_priv_dec(int flen, const unsigned char *from, 411 unsigned char *to, RSA *rsa, int padding) 412 { 413 wpa_printf(MSG_DEBUG, "%s - not implemented", __func__); 414 return 0; 415 } 416 417 418 static void cryptoapi_free_data(struct cryptoapi_rsa_data *priv) 419 { 420 if (priv == NULL) 421 return; 422 if (priv->crypt_prov && priv->free_crypt_prov) 423 CryptReleaseContext(priv->crypt_prov, 0); 424 if (priv->cert) 425 CertFreeCertificateContext(priv->cert); 426 os_free(priv); 427 } 428 429 430 static int cryptoapi_finish(RSA *rsa) 431 { 432 cryptoapi_free_data((struct cryptoapi_rsa_data *) rsa->meth->app_data); 433 os_free((void *) rsa->meth); 434 rsa->meth = NULL; 435 return 1; 436 } 437 438 439 static const CERT_CONTEXT * cryptoapi_find_cert(const char *name, DWORD store) 440 { 441 HCERTSTORE cs; 442 const CERT_CONTEXT *ret = NULL; 443 444 cs = CertOpenStore((LPCSTR) CERT_STORE_PROV_SYSTEM, 0, 0, 445 store | CERT_STORE_OPEN_EXISTING_FLAG | 446 CERT_STORE_READONLY_FLAG, L"MY"); 447 if (cs == NULL) { 448 cryptoapi_error("Failed to open 'My system store'"); 449 return NULL; 450 } 451 452 if (strncmp(name, "cert://", 7) == 0) { 453 unsigned short wbuf[255]; 454 MultiByteToWideChar(CP_ACP, 0, name + 7, -1, wbuf, 255); 455 ret = CertFindCertificateInStore(cs, X509_ASN_ENCODING | 456 PKCS_7_ASN_ENCODING, 457 0, CERT_FIND_SUBJECT_STR, 458 wbuf, NULL); 459 } else if (strncmp(name, "hash://", 7) == 0) { 460 CRYPT_HASH_BLOB blob; 461 int len; 462 const char *hash = name + 7; 463 unsigned char *buf; 464 465 len = os_strlen(hash) / 2; 466 buf = os_malloc(len); 467 if (buf && hexstr2bin(hash, buf, len) == 0) { 468 blob.cbData = len; 469 blob.pbData = buf; 470 ret = CertFindCertificateInStore(cs, 471 X509_ASN_ENCODING | 472 PKCS_7_ASN_ENCODING, 473 0, CERT_FIND_HASH, 474 &blob, NULL); 475 } 476 os_free(buf); 477 } 478 479 CertCloseStore(cs, 0); 480 481 return ret; 482 } 483 484 485 static int tls_cryptoapi_cert(SSL *ssl, const char *name) 486 { 487 X509 *cert = NULL; 488 RSA *rsa = NULL, *pub_rsa; 489 struct cryptoapi_rsa_data *priv; 490 RSA_METHOD *rsa_meth; 491 492 if (name == NULL || 493 (strncmp(name, "cert://", 7) != 0 && 494 strncmp(name, "hash://", 7) != 0)) 495 return -1; 496 497 priv = os_zalloc(sizeof(*priv)); 498 rsa_meth = os_zalloc(sizeof(*rsa_meth)); 499 if (priv == NULL || rsa_meth == NULL) { 500 wpa_printf(MSG_WARNING, "CryptoAPI: Failed to allocate memory " 501 "for CryptoAPI RSA method"); 502 os_free(priv); 503 os_free(rsa_meth); 504 return -1; 505 } 506 507 priv->cert = cryptoapi_find_cert(name, CERT_SYSTEM_STORE_CURRENT_USER); 508 if (priv->cert == NULL) { 509 priv->cert = cryptoapi_find_cert( 510 name, CERT_SYSTEM_STORE_LOCAL_MACHINE); 511 } 512 if (priv->cert == NULL) { 513 wpa_printf(MSG_INFO, "CryptoAPI: Could not find certificate " 514 "'%s'", name); 515 goto err; 516 } 517 518 cert = d2i_X509(NULL, 519 (const unsigned char **) &priv->cert->pbCertEncoded, 520 priv->cert->cbCertEncoded); 521 if (cert == NULL) { 522 wpa_printf(MSG_INFO, "CryptoAPI: Could not process X509 DER " 523 "encoding"); 524 goto err; 525 } 526 527 if (!CryptAcquireCertificatePrivateKey(priv->cert, 528 CRYPT_ACQUIRE_COMPARE_KEY_FLAG, 529 NULL, &priv->crypt_prov, 530 &priv->key_spec, 531 &priv->free_crypt_prov)) { 532 cryptoapi_error("Failed to acquire a private key for the " 533 "certificate"); 534 goto err; 535 } 536 537 rsa_meth->name = "Microsoft CryptoAPI RSA Method"; 538 rsa_meth->rsa_pub_enc = cryptoapi_rsa_pub_enc; 539 rsa_meth->rsa_pub_dec = cryptoapi_rsa_pub_dec; 540 rsa_meth->rsa_priv_enc = cryptoapi_rsa_priv_enc; 541 rsa_meth->rsa_priv_dec = cryptoapi_rsa_priv_dec; 542 rsa_meth->finish = cryptoapi_finish; 543 rsa_meth->flags = RSA_METHOD_FLAG_NO_CHECK; 544 rsa_meth->app_data = (char *) priv; 545 546 rsa = RSA_new(); 547 if (rsa == NULL) { 548 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_FILE, 549 ERR_R_MALLOC_FAILURE); 550 goto err; 551 } 552 553 if (!SSL_use_certificate(ssl, cert)) { 554 RSA_free(rsa); 555 rsa = NULL; 556 goto err; 557 } 558 pub_rsa = cert->cert_info->key->pkey->pkey.rsa; 559 X509_free(cert); 560 cert = NULL; 561 562 rsa->n = BN_dup(pub_rsa->n); 563 rsa->e = BN_dup(pub_rsa->e); 564 if (!RSA_set_method(rsa, rsa_meth)) 565 goto err; 566 567 if (!SSL_use_RSAPrivateKey(ssl, rsa)) 568 goto err; 569 RSA_free(rsa); 570 571 return 0; 572 573 err: 574 if (cert) 575 X509_free(cert); 576 if (rsa) 577 RSA_free(rsa); 578 else { 579 os_free(rsa_meth); 580 cryptoapi_free_data(priv); 581 } 582 return -1; 583 } 584 585 586 static int tls_cryptoapi_ca_cert(SSL_CTX *ssl_ctx, SSL *ssl, const char *name) 587 { 588 HCERTSTORE cs; 589 PCCERT_CONTEXT ctx = NULL; 590 X509 *cert; 591 char buf[128]; 592 const char *store; 593 #ifdef UNICODE 594 WCHAR *wstore; 595 #endif /* UNICODE */ 596 597 if (name == NULL || strncmp(name, "cert_store://", 13) != 0) 598 return -1; 599 600 store = name + 13; 601 #ifdef UNICODE 602 wstore = os_malloc((os_strlen(store) + 1) * sizeof(WCHAR)); 603 if (wstore == NULL) 604 return -1; 605 wsprintf(wstore, L"%S", store); 606 cs = CertOpenSystemStore(0, wstore); 607 os_free(wstore); 608 #else /* UNICODE */ 609 cs = CertOpenSystemStore(0, store); 610 #endif /* UNICODE */ 611 if (cs == NULL) { 612 wpa_printf(MSG_DEBUG, "%s: failed to open system cert store " 613 "'%s': error=%d", __func__, store, 614 (int) GetLastError()); 615 return -1; 616 } 617 618 while ((ctx = CertEnumCertificatesInStore(cs, ctx))) { 619 cert = d2i_X509(NULL, 620 (const unsigned char **) &ctx->pbCertEncoded, 621 ctx->cbCertEncoded); 622 if (cert == NULL) { 623 wpa_printf(MSG_INFO, "CryptoAPI: Could not process " 624 "X509 DER encoding for CA cert"); 625 continue; 626 } 627 628 X509_NAME_oneline(X509_get_subject_name(cert), buf, 629 sizeof(buf)); 630 wpa_printf(MSG_DEBUG, "OpenSSL: Loaded CA certificate for " 631 "system certificate store: subject='%s'", buf); 632 633 if (!X509_STORE_add_cert(SSL_CTX_get_cert_store(ssl_ctx), 634 cert)) { 635 tls_show_errors(MSG_WARNING, __func__, 636 "Failed to add ca_cert to OpenSSL " 637 "certificate store"); 638 } 639 640 X509_free(cert); 641 } 642 643 if (!CertCloseStore(cs, 0)) { 644 wpa_printf(MSG_DEBUG, "%s: failed to close system cert store " 645 "'%s': error=%d", __func__, name + 13, 646 (int) GetLastError()); 647 } 648 649 return 0; 650 } 651 652 653 #else /* CONFIG_NATIVE_WINDOWS */ 654 655 static int tls_cryptoapi_cert(SSL *ssl, const char *name) 656 { 657 return -1; 658 } 659 660 #endif /* CONFIG_NATIVE_WINDOWS */ 661 662 663 static void ssl_info_cb(const SSL *ssl, int where, int ret) 664 { 665 const char *str; 666 int w; 667 668 wpa_printf(MSG_DEBUG, "SSL: (where=0x%x ret=0x%x)", where, ret); 669 w = where & ~SSL_ST_MASK; 670 if (w & SSL_ST_CONNECT) 671 str = "SSL_connect"; 672 else if (w & SSL_ST_ACCEPT) 673 str = "SSL_accept"; 674 else 675 str = "undefined"; 676 677 if (where & SSL_CB_LOOP) { 678 wpa_printf(MSG_DEBUG, "SSL: %s:%s", 679 str, SSL_state_string_long(ssl)); 680 } else if (where & SSL_CB_ALERT) { 681 struct tls_connection *conn = SSL_get_app_data((SSL *) ssl); 682 wpa_printf(MSG_INFO, "SSL: SSL3 alert: %s:%s:%s", 683 where & SSL_CB_READ ? 684 "read (remote end reported an error)" : 685 "write (local SSL3 detected an error)", 686 SSL_alert_type_string_long(ret), 687 SSL_alert_desc_string_long(ret)); 688 if ((ret >> 8) == SSL3_AL_FATAL) { 689 if (where & SSL_CB_READ) 690 conn->read_alerts++; 691 else 692 conn->write_alerts++; 693 } 694 if (conn->context->event_cb != NULL) { 695 union tls_event_data ev; 696 struct tls_context *context = conn->context; 697 os_memset(&ev, 0, sizeof(ev)); 698 ev.alert.is_local = !(where & SSL_CB_READ); 699 ev.alert.type = SSL_alert_type_string_long(ret); 700 ev.alert.description = SSL_alert_desc_string_long(ret); 701 context->event_cb(context->cb_ctx, TLS_ALERT, &ev); 702 } 703 } else if (where & SSL_CB_EXIT && ret <= 0) { 704 wpa_printf(MSG_DEBUG, "SSL: %s:%s in %s", 705 str, ret == 0 ? "failed" : "error", 706 SSL_state_string_long(ssl)); 707 } 708 } 709 710 711 #ifndef OPENSSL_NO_ENGINE 712 /** 713 * tls_engine_load_dynamic_generic - load any openssl engine 714 * @pre: an array of commands and values that load an engine initialized 715 * in the engine specific function 716 * @post: an array of commands and values that initialize an already loaded 717 * engine (or %NULL if not required) 718 * @id: the engine id of the engine to load (only required if post is not %NULL 719 * 720 * This function is a generic function that loads any openssl engine. 721 * 722 * Returns: 0 on success, -1 on failure 723 */ 724 static int tls_engine_load_dynamic_generic(const char *pre[], 725 const char *post[], const char *id) 726 { 727 ENGINE *engine; 728 const char *dynamic_id = "dynamic"; 729 730 engine = ENGINE_by_id(id); 731 if (engine) { 732 wpa_printf(MSG_DEBUG, "ENGINE: engine '%s' is already " 733 "available", id); 734 /* 735 * If it was auto-loaded by ENGINE_by_id() we might still 736 * need to tell it which PKCS#11 module to use in legacy 737 * (non-p11-kit) environments. Do so now; even if it was 738 * properly initialised before, setting it again will be 739 * harmless. 740 */ 741 goto found; 742 } 743 ERR_clear_error(); 744 745 engine = ENGINE_by_id(dynamic_id); 746 if (engine == NULL) { 747 wpa_printf(MSG_INFO, "ENGINE: Can't find engine %s [%s]", 748 dynamic_id, 749 ERR_error_string(ERR_get_error(), NULL)); 750 return -1; 751 } 752 753 /* Perform the pre commands. This will load the engine. */ 754 while (pre && pre[0]) { 755 wpa_printf(MSG_DEBUG, "ENGINE: '%s' '%s'", pre[0], pre[1]); 756 if (ENGINE_ctrl_cmd_string(engine, pre[0], pre[1], 0) == 0) { 757 wpa_printf(MSG_INFO, "ENGINE: ctrl cmd_string failed: " 758 "%s %s [%s]", pre[0], pre[1], 759 ERR_error_string(ERR_get_error(), NULL)); 760 ENGINE_free(engine); 761 return -1; 762 } 763 pre += 2; 764 } 765 766 /* 767 * Free the reference to the "dynamic" engine. The loaded engine can 768 * now be looked up using ENGINE_by_id(). 769 */ 770 ENGINE_free(engine); 771 772 engine = ENGINE_by_id(id); 773 if (engine == NULL) { 774 wpa_printf(MSG_INFO, "ENGINE: Can't find engine %s [%s]", 775 id, ERR_error_string(ERR_get_error(), NULL)); 776 return -1; 777 } 778 found: 779 while (post && post[0]) { 780 wpa_printf(MSG_DEBUG, "ENGINE: '%s' '%s'", post[0], post[1]); 781 if (ENGINE_ctrl_cmd_string(engine, post[0], post[1], 0) == 0) { 782 wpa_printf(MSG_DEBUG, "ENGINE: ctrl cmd_string failed:" 783 " %s %s [%s]", post[0], post[1], 784 ERR_error_string(ERR_get_error(), NULL)); 785 ENGINE_remove(engine); 786 ENGINE_free(engine); 787 return -1; 788 } 789 post += 2; 790 } 791 ENGINE_free(engine); 792 793 return 0; 794 } 795 796 797 /** 798 * tls_engine_load_dynamic_pkcs11 - load the pkcs11 engine provided by opensc 799 * @pkcs11_so_path: pksc11_so_path from the configuration 800 * @pcks11_module_path: pkcs11_module_path from the configuration 801 */ 802 static int tls_engine_load_dynamic_pkcs11(const char *pkcs11_so_path, 803 const char *pkcs11_module_path) 804 { 805 char *engine_id = "pkcs11"; 806 const char *pre_cmd[] = { 807 "SO_PATH", NULL /* pkcs11_so_path */, 808 "ID", NULL /* engine_id */, 809 "LIST_ADD", "1", 810 /* "NO_VCHECK", "1", */ 811 "LOAD", NULL, 812 NULL, NULL 813 }; 814 const char *post_cmd[] = { 815 "MODULE_PATH", NULL /* pkcs11_module_path */, 816 NULL, NULL 817 }; 818 819 if (!pkcs11_so_path) 820 return 0; 821 822 pre_cmd[1] = pkcs11_so_path; 823 pre_cmd[3] = engine_id; 824 if (pkcs11_module_path) 825 post_cmd[1] = pkcs11_module_path; 826 else 827 post_cmd[0] = NULL; 828 829 wpa_printf(MSG_DEBUG, "ENGINE: Loading pkcs11 Engine from %s", 830 pkcs11_so_path); 831 832 return tls_engine_load_dynamic_generic(pre_cmd, post_cmd, engine_id); 833 } 834 835 836 /** 837 * tls_engine_load_dynamic_opensc - load the opensc engine provided by opensc 838 * @opensc_so_path: opensc_so_path from the configuration 839 */ 840 static int tls_engine_load_dynamic_opensc(const char *opensc_so_path) 841 { 842 char *engine_id = "opensc"; 843 const char *pre_cmd[] = { 844 "SO_PATH", NULL /* opensc_so_path */, 845 "ID", NULL /* engine_id */, 846 "LIST_ADD", "1", 847 "LOAD", NULL, 848 NULL, NULL 849 }; 850 851 if (!opensc_so_path) 852 return 0; 853 854 pre_cmd[1] = opensc_so_path; 855 pre_cmd[3] = engine_id; 856 857 wpa_printf(MSG_DEBUG, "ENGINE: Loading OpenSC Engine from %s", 858 opensc_so_path); 859 860 return tls_engine_load_dynamic_generic(pre_cmd, NULL, engine_id); 861 } 862 #endif /* OPENSSL_NO_ENGINE */ 863 864 865 static void remove_session_cb(SSL_CTX *ctx, SSL_SESSION *sess) 866 { 867 struct wpabuf *buf; 868 869 if (tls_ex_idx_session < 0) 870 return; 871 buf = SSL_SESSION_get_ex_data(sess, tls_ex_idx_session); 872 if (!buf) 873 return; 874 wpa_printf(MSG_DEBUG, 875 "OpenSSL: Free application session data %p (sess %p)", 876 buf, sess); 877 wpabuf_free(buf); 878 879 SSL_SESSION_set_ex_data(sess, tls_ex_idx_session, NULL); 880 } 881 882 883 void * tls_init(const struct tls_config *conf) 884 { 885 struct tls_data *data; 886 SSL_CTX *ssl; 887 struct tls_context *context; 888 const char *ciphers; 889 890 if (tls_openssl_ref_count == 0) { 891 tls_global = context = tls_context_new(conf); 892 if (context == NULL) 893 return NULL; 894 #ifdef CONFIG_FIPS 895 #ifdef OPENSSL_FIPS 896 if (conf && conf->fips_mode) { 897 static int fips_enabled = 0; 898 899 if (!fips_enabled && !FIPS_mode_set(1)) { 900 wpa_printf(MSG_ERROR, "Failed to enable FIPS " 901 "mode"); 902 ERR_load_crypto_strings(); 903 ERR_print_errors_fp(stderr); 904 os_free(tls_global); 905 tls_global = NULL; 906 return NULL; 907 } else { 908 wpa_printf(MSG_INFO, "Running in FIPS mode"); 909 fips_enabled = 1; 910 } 911 } 912 #else /* OPENSSL_FIPS */ 913 if (conf && conf->fips_mode) { 914 wpa_printf(MSG_ERROR, "FIPS mode requested, but not " 915 "supported"); 916 os_free(tls_global); 917 tls_global = NULL; 918 return NULL; 919 } 920 #endif /* OPENSSL_FIPS */ 921 #endif /* CONFIG_FIPS */ 922 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) 923 SSL_load_error_strings(); 924 SSL_library_init(); 925 #ifndef OPENSSL_NO_SHA256 926 EVP_add_digest(EVP_sha256()); 927 #endif /* OPENSSL_NO_SHA256 */ 928 /* TODO: if /dev/urandom is available, PRNG is seeded 929 * automatically. If this is not the case, random data should 930 * be added here. */ 931 932 #ifdef PKCS12_FUNCS 933 #ifndef OPENSSL_NO_RC2 934 /* 935 * 40-bit RC2 is commonly used in PKCS#12 files, so enable it. 936 * This is enabled by PKCS12_PBE_add() in OpenSSL 0.9.8 937 * versions, but it looks like OpenSSL 1.0.0 does not do that 938 * anymore. 939 */ 940 EVP_add_cipher(EVP_rc2_40_cbc()); 941 #endif /* OPENSSL_NO_RC2 */ 942 PKCS12_PBE_add(); 943 #endif /* PKCS12_FUNCS */ 944 #endif /* < 1.1.0 */ 945 } else { 946 context = tls_context_new(conf); 947 if (context == NULL) 948 return NULL; 949 } 950 tls_openssl_ref_count++; 951 952 data = os_zalloc(sizeof(*data)); 953 if (data) 954 ssl = SSL_CTX_new(SSLv23_method()); 955 else 956 ssl = NULL; 957 if (ssl == NULL) { 958 tls_openssl_ref_count--; 959 if (context != tls_global) 960 os_free(context); 961 if (tls_openssl_ref_count == 0) { 962 os_free(tls_global); 963 tls_global = NULL; 964 } 965 os_free(data); 966 return NULL; 967 } 968 data->ssl = ssl; 969 if (conf) 970 data->tls_session_lifetime = conf->tls_session_lifetime; 971 972 SSL_CTX_set_options(ssl, SSL_OP_NO_SSLv2); 973 SSL_CTX_set_options(ssl, SSL_OP_NO_SSLv3); 974 975 #ifdef SSL_MODE_NO_AUTO_CHAIN 976 /* Number of deployed use cases assume the default OpenSSL behavior of 977 * auto chaining the local certificate is in use. BoringSSL removed this 978 * functionality by default, so we need to restore it here to avoid 979 * breaking existing use cases. */ 980 SSL_CTX_clear_mode(ssl, SSL_MODE_NO_AUTO_CHAIN); 981 #endif /* SSL_MODE_NO_AUTO_CHAIN */ 982 983 SSL_CTX_set_info_callback(ssl, ssl_info_cb); 984 SSL_CTX_set_app_data(ssl, context); 985 if (data->tls_session_lifetime > 0) { 986 SSL_CTX_set_quiet_shutdown(ssl, 1); 987 /* 988 * Set default context here. In practice, this will be replaced 989 * by the per-EAP method context in tls_connection_set_verify(). 990 */ 991 SSL_CTX_set_session_id_context(ssl, (u8 *) "hostapd", 7); 992 SSL_CTX_set_session_cache_mode(ssl, SSL_SESS_CACHE_SERVER); 993 SSL_CTX_set_timeout(ssl, data->tls_session_lifetime); 994 SSL_CTX_sess_set_remove_cb(ssl, remove_session_cb); 995 } else { 996 SSL_CTX_set_session_cache_mode(ssl, SSL_SESS_CACHE_OFF); 997 } 998 999 if (tls_ex_idx_session < 0) { 1000 tls_ex_idx_session = SSL_SESSION_get_ex_new_index( 1001 0, NULL, NULL, NULL, NULL); 1002 if (tls_ex_idx_session < 0) { 1003 tls_deinit(data); 1004 return NULL; 1005 } 1006 } 1007 1008 #ifndef OPENSSL_NO_ENGINE 1009 wpa_printf(MSG_DEBUG, "ENGINE: Loading dynamic engine"); 1010 ERR_load_ENGINE_strings(); 1011 ENGINE_load_dynamic(); 1012 1013 if (conf && 1014 (conf->opensc_engine_path || conf->pkcs11_engine_path || 1015 conf->pkcs11_module_path)) { 1016 if (tls_engine_load_dynamic_opensc(conf->opensc_engine_path) || 1017 tls_engine_load_dynamic_pkcs11(conf->pkcs11_engine_path, 1018 conf->pkcs11_module_path)) { 1019 tls_deinit(data); 1020 return NULL; 1021 } 1022 } 1023 #endif /* OPENSSL_NO_ENGINE */ 1024 1025 if (conf && conf->openssl_ciphers) 1026 ciphers = conf->openssl_ciphers; 1027 else 1028 ciphers = "DEFAULT:!EXP:!LOW"; 1029 if (SSL_CTX_set_cipher_list(ssl, ciphers) != 1) { 1030 wpa_printf(MSG_ERROR, 1031 "OpenSSL: Failed to set cipher string '%s'", 1032 ciphers); 1033 tls_deinit(data); 1034 return NULL; 1035 } 1036 1037 return data; 1038 } 1039 1040 1041 void tls_deinit(void *ssl_ctx) 1042 { 1043 struct tls_data *data = ssl_ctx; 1044 SSL_CTX *ssl = data->ssl; 1045 struct tls_context *context = SSL_CTX_get_app_data(ssl); 1046 if (context != tls_global) 1047 os_free(context); 1048 if (data->tls_session_lifetime > 0) 1049 SSL_CTX_flush_sessions(ssl, 0); 1050 SSL_CTX_free(ssl); 1051 1052 tls_openssl_ref_count--; 1053 if (tls_openssl_ref_count == 0) { 1054 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) 1055 #ifndef OPENSSL_NO_ENGINE 1056 ENGINE_cleanup(); 1057 #endif /* OPENSSL_NO_ENGINE */ 1058 CRYPTO_cleanup_all_ex_data(); 1059 ERR_remove_thread_state(NULL); 1060 ERR_free_strings(); 1061 EVP_cleanup(); 1062 #endif /* < 1.1.0 */ 1063 os_free(tls_global->ocsp_stapling_response); 1064 tls_global->ocsp_stapling_response = NULL; 1065 os_free(tls_global); 1066 tls_global = NULL; 1067 } 1068 1069 os_free(data); 1070 } 1071 1072 1073 #ifndef OPENSSL_NO_ENGINE 1074 1075 /* Cryptoki return values */ 1076 #define CKR_PIN_INCORRECT 0x000000a0 1077 #define CKR_PIN_INVALID 0x000000a1 1078 #define CKR_PIN_LEN_RANGE 0x000000a2 1079 1080 /* libp11 */ 1081 #define ERR_LIB_PKCS11 ERR_LIB_USER 1082 1083 static int tls_is_pin_error(unsigned int err) 1084 { 1085 return ERR_GET_LIB(err) == ERR_LIB_PKCS11 && 1086 (ERR_GET_REASON(err) == CKR_PIN_INCORRECT || 1087 ERR_GET_REASON(err) == CKR_PIN_INVALID || 1088 ERR_GET_REASON(err) == CKR_PIN_LEN_RANGE); 1089 } 1090 1091 #endif /* OPENSSL_NO_ENGINE */ 1092 1093 1094 #ifdef ANDROID 1095 /* EVP_PKEY_from_keystore comes from system/security/keystore-engine. */ 1096 EVP_PKEY * EVP_PKEY_from_keystore(const char *key_id); 1097 #endif /* ANDROID */ 1098 1099 static int tls_engine_init(struct tls_connection *conn, const char *engine_id, 1100 const char *pin, const char *key_id, 1101 const char *cert_id, const char *ca_cert_id) 1102 { 1103 #if defined(ANDROID) && defined(OPENSSL_IS_BORINGSSL) 1104 #if !defined(OPENSSL_NO_ENGINE) 1105 #error "This code depends on OPENSSL_NO_ENGINE being defined by BoringSSL." 1106 #endif 1107 if (!key_id) 1108 return TLS_SET_PARAMS_ENGINE_PRV_INIT_FAILED; 1109 conn->engine = NULL; 1110 conn->private_key = EVP_PKEY_from_keystore(key_id); 1111 if (!conn->private_key) { 1112 wpa_printf(MSG_ERROR, 1113 "ENGINE: cannot load private key with id '%s' [%s]", 1114 key_id, 1115 ERR_error_string(ERR_get_error(), NULL)); 1116 return TLS_SET_PARAMS_ENGINE_PRV_INIT_FAILED; 1117 } 1118 #endif /* ANDROID && OPENSSL_IS_BORINGSSL */ 1119 1120 #ifndef OPENSSL_NO_ENGINE 1121 int ret = -1; 1122 if (engine_id == NULL) { 1123 wpa_printf(MSG_ERROR, "ENGINE: Engine ID not set"); 1124 return -1; 1125 } 1126 1127 ERR_clear_error(); 1128 #ifdef ANDROID 1129 ENGINE_load_dynamic(); 1130 #endif 1131 conn->engine = ENGINE_by_id(engine_id); 1132 if (!conn->engine) { 1133 wpa_printf(MSG_ERROR, "ENGINE: engine %s not available [%s]", 1134 engine_id, ERR_error_string(ERR_get_error(), NULL)); 1135 goto err; 1136 } 1137 if (ENGINE_init(conn->engine) != 1) { 1138 wpa_printf(MSG_ERROR, "ENGINE: engine init failed " 1139 "(engine: %s) [%s]", engine_id, 1140 ERR_error_string(ERR_get_error(), NULL)); 1141 goto err; 1142 } 1143 wpa_printf(MSG_DEBUG, "ENGINE: engine initialized"); 1144 1145 #ifndef ANDROID 1146 if (pin && ENGINE_ctrl_cmd_string(conn->engine, "PIN", pin, 0) == 0) { 1147 wpa_printf(MSG_ERROR, "ENGINE: cannot set pin [%s]", 1148 ERR_error_string(ERR_get_error(), NULL)); 1149 goto err; 1150 } 1151 #endif 1152 if (key_id) { 1153 /* 1154 * Ensure that the ENGINE does not attempt to use the OpenSSL 1155 * UI system to obtain a PIN, if we didn't provide one. 1156 */ 1157 struct { 1158 const void *password; 1159 const char *prompt_info; 1160 } key_cb = { "", NULL }; 1161 1162 /* load private key first in-case PIN is required for cert */ 1163 conn->private_key = ENGINE_load_private_key(conn->engine, 1164 key_id, NULL, 1165 &key_cb); 1166 if (!conn->private_key) { 1167 unsigned long err = ERR_get_error(); 1168 1169 wpa_printf(MSG_ERROR, 1170 "ENGINE: cannot load private key with id '%s' [%s]", 1171 key_id, 1172 ERR_error_string(err, NULL)); 1173 if (tls_is_pin_error(err)) 1174 ret = TLS_SET_PARAMS_ENGINE_PRV_BAD_PIN; 1175 else 1176 ret = TLS_SET_PARAMS_ENGINE_PRV_INIT_FAILED; 1177 goto err; 1178 } 1179 } 1180 1181 /* handle a certificate and/or CA certificate */ 1182 if (cert_id || ca_cert_id) { 1183 const char *cmd_name = "LOAD_CERT_CTRL"; 1184 1185 /* test if the engine supports a LOAD_CERT_CTRL */ 1186 if (!ENGINE_ctrl(conn->engine, ENGINE_CTRL_GET_CMD_FROM_NAME, 1187 0, (void *)cmd_name, NULL)) { 1188 wpa_printf(MSG_ERROR, "ENGINE: engine does not support" 1189 " loading certificates"); 1190 ret = TLS_SET_PARAMS_ENGINE_PRV_INIT_FAILED; 1191 goto err; 1192 } 1193 } 1194 1195 return 0; 1196 1197 err: 1198 if (conn->engine) { 1199 ENGINE_free(conn->engine); 1200 conn->engine = NULL; 1201 } 1202 1203 if (conn->private_key) { 1204 EVP_PKEY_free(conn->private_key); 1205 conn->private_key = NULL; 1206 } 1207 1208 return ret; 1209 #else /* OPENSSL_NO_ENGINE */ 1210 return 0; 1211 #endif /* OPENSSL_NO_ENGINE */ 1212 } 1213 1214 1215 static void tls_engine_deinit(struct tls_connection *conn) 1216 { 1217 #if defined(ANDROID) || !defined(OPENSSL_NO_ENGINE) 1218 wpa_printf(MSG_DEBUG, "ENGINE: engine deinit"); 1219 if (conn->private_key) { 1220 EVP_PKEY_free(conn->private_key); 1221 conn->private_key = NULL; 1222 } 1223 if (conn->engine) { 1224 #if !defined(OPENSSL_IS_BORINGSSL) 1225 ENGINE_finish(conn->engine); 1226 #endif /* !OPENSSL_IS_BORINGSSL */ 1227 conn->engine = NULL; 1228 } 1229 #endif /* ANDROID || !OPENSSL_NO_ENGINE */ 1230 } 1231 1232 1233 int tls_get_errors(void *ssl_ctx) 1234 { 1235 int count = 0; 1236 unsigned long err; 1237 1238 while ((err = ERR_get_error())) { 1239 wpa_printf(MSG_INFO, "TLS - SSL error: %s", 1240 ERR_error_string(err, NULL)); 1241 count++; 1242 } 1243 1244 return count; 1245 } 1246 1247 1248 static const char * openssl_content_type(int content_type) 1249 { 1250 switch (content_type) { 1251 case 20: 1252 return "change cipher spec"; 1253 case 21: 1254 return "alert"; 1255 case 22: 1256 return "handshake"; 1257 case 23: 1258 return "application data"; 1259 case 24: 1260 return "heartbeat"; 1261 case 256: 1262 return "TLS header info"; /* pseudo content type */ 1263 default: 1264 return "?"; 1265 } 1266 } 1267 1268 1269 static const char * openssl_handshake_type(int content_type, const u8 *buf, 1270 size_t len) 1271 { 1272 if (content_type != 22 || !buf || len == 0) 1273 return ""; 1274 switch (buf[0]) { 1275 case 0: 1276 return "hello request"; 1277 case 1: 1278 return "client hello"; 1279 case 2: 1280 return "server hello"; 1281 case 4: 1282 return "new session ticket"; 1283 case 11: 1284 return "certificate"; 1285 case 12: 1286 return "server key exchange"; 1287 case 13: 1288 return "certificate request"; 1289 case 14: 1290 return "server hello done"; 1291 case 15: 1292 return "certificate verify"; 1293 case 16: 1294 return "client key exchange"; 1295 case 20: 1296 return "finished"; 1297 case 21: 1298 return "certificate url"; 1299 case 22: 1300 return "certificate status"; 1301 default: 1302 return "?"; 1303 } 1304 } 1305 1306 1307 static void tls_msg_cb(int write_p, int version, int content_type, 1308 const void *buf, size_t len, SSL *ssl, void *arg) 1309 { 1310 struct tls_connection *conn = arg; 1311 const u8 *pos = buf; 1312 1313 if (write_p == 2) { 1314 wpa_printf(MSG_DEBUG, 1315 "OpenSSL: session ver=0x%x content_type=%d", 1316 version, content_type); 1317 wpa_hexdump_key(MSG_MSGDUMP, "OpenSSL: Data", buf, len); 1318 return; 1319 } 1320 1321 wpa_printf(MSG_DEBUG, "OpenSSL: %s ver=0x%x content_type=%d (%s/%s)", 1322 write_p ? "TX" : "RX", version, content_type, 1323 openssl_content_type(content_type), 1324 openssl_handshake_type(content_type, buf, len)); 1325 wpa_hexdump_key(MSG_MSGDUMP, "OpenSSL: Message", buf, len); 1326 if (content_type == 24 && len >= 3 && pos[0] == 1) { 1327 size_t payload_len = WPA_GET_BE16(pos + 1); 1328 if (payload_len + 3 > len) { 1329 wpa_printf(MSG_ERROR, "OpenSSL: Heartbeat attack detected"); 1330 conn->invalid_hb_used = 1; 1331 } 1332 } 1333 } 1334 1335 1336 struct tls_connection * tls_connection_init(void *ssl_ctx) 1337 { 1338 struct tls_data *data = ssl_ctx; 1339 SSL_CTX *ssl = data->ssl; 1340 struct tls_connection *conn; 1341 long options; 1342 struct tls_context *context = SSL_CTX_get_app_data(ssl); 1343 1344 conn = os_zalloc(sizeof(*conn)); 1345 if (conn == NULL) 1346 return NULL; 1347 conn->ssl_ctx = ssl; 1348 conn->ssl = SSL_new(ssl); 1349 if (conn->ssl == NULL) { 1350 tls_show_errors(MSG_INFO, __func__, 1351 "Failed to initialize new SSL connection"); 1352 os_free(conn); 1353 return NULL; 1354 } 1355 1356 conn->context = context; 1357 SSL_set_app_data(conn->ssl, conn); 1358 SSL_set_msg_callback(conn->ssl, tls_msg_cb); 1359 SSL_set_msg_callback_arg(conn->ssl, conn); 1360 options = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | 1361 SSL_OP_SINGLE_DH_USE; 1362 #ifdef SSL_OP_NO_COMPRESSION 1363 options |= SSL_OP_NO_COMPRESSION; 1364 #endif /* SSL_OP_NO_COMPRESSION */ 1365 SSL_set_options(conn->ssl, options); 1366 1367 conn->ssl_in = BIO_new(BIO_s_mem()); 1368 if (!conn->ssl_in) { 1369 tls_show_errors(MSG_INFO, __func__, 1370 "Failed to create a new BIO for ssl_in"); 1371 SSL_free(conn->ssl); 1372 os_free(conn); 1373 return NULL; 1374 } 1375 1376 conn->ssl_out = BIO_new(BIO_s_mem()); 1377 if (!conn->ssl_out) { 1378 tls_show_errors(MSG_INFO, __func__, 1379 "Failed to create a new BIO for ssl_out"); 1380 SSL_free(conn->ssl); 1381 BIO_free(conn->ssl_in); 1382 os_free(conn); 1383 return NULL; 1384 } 1385 1386 SSL_set_bio(conn->ssl, conn->ssl_in, conn->ssl_out); 1387 1388 return conn; 1389 } 1390 1391 1392 void tls_connection_deinit(void *ssl_ctx, struct tls_connection *conn) 1393 { 1394 if (conn == NULL) 1395 return; 1396 if (conn->success_data) { 1397 /* 1398 * Make sure ssl_clear_bad_session() does not remove this 1399 * session. 1400 */ 1401 SSL_set_quiet_shutdown(conn->ssl, 1); 1402 SSL_shutdown(conn->ssl); 1403 } 1404 SSL_free(conn->ssl); 1405 tls_engine_deinit(conn); 1406 os_free(conn->subject_match); 1407 os_free(conn->altsubject_match); 1408 os_free(conn->suffix_match); 1409 os_free(conn->domain_match); 1410 os_free(conn->session_ticket); 1411 os_free(conn); 1412 } 1413 1414 1415 int tls_connection_established(void *ssl_ctx, struct tls_connection *conn) 1416 { 1417 return conn ? SSL_is_init_finished(conn->ssl) : 0; 1418 } 1419 1420 1421 int tls_connection_shutdown(void *ssl_ctx, struct tls_connection *conn) 1422 { 1423 if (conn == NULL) 1424 return -1; 1425 1426 /* Shutdown previous TLS connection without notifying the peer 1427 * because the connection was already terminated in practice 1428 * and "close notify" shutdown alert would confuse AS. */ 1429 SSL_set_quiet_shutdown(conn->ssl, 1); 1430 SSL_shutdown(conn->ssl); 1431 return SSL_clear(conn->ssl) == 1 ? 0 : -1; 1432 } 1433 1434 1435 static int tls_match_altsubject_component(X509 *cert, int type, 1436 const char *value, size_t len) 1437 { 1438 GENERAL_NAME *gen; 1439 void *ext; 1440 int found = 0; 1441 stack_index_t i; 1442 1443 ext = X509_get_ext_d2i(cert, NID_subject_alt_name, NULL, NULL); 1444 1445 for (i = 0; ext && i < sk_GENERAL_NAME_num(ext); i++) { 1446 gen = sk_GENERAL_NAME_value(ext, i); 1447 if (gen->type != type) 1448 continue; 1449 if (os_strlen((char *) gen->d.ia5->data) == len && 1450 os_memcmp(value, gen->d.ia5->data, len) == 0) 1451 found++; 1452 } 1453 1454 sk_GENERAL_NAME_pop_free(ext, GENERAL_NAME_free); 1455 1456 return found; 1457 } 1458 1459 1460 static int tls_match_altsubject(X509 *cert, const char *match) 1461 { 1462 int type; 1463 const char *pos, *end; 1464 size_t len; 1465 1466 pos = match; 1467 do { 1468 if (os_strncmp(pos, "EMAIL:", 6) == 0) { 1469 type = GEN_EMAIL; 1470 pos += 6; 1471 } else if (os_strncmp(pos, "DNS:", 4) == 0) { 1472 type = GEN_DNS; 1473 pos += 4; 1474 } else if (os_strncmp(pos, "URI:", 4) == 0) { 1475 type = GEN_URI; 1476 pos += 4; 1477 } else { 1478 wpa_printf(MSG_INFO, "TLS: Invalid altSubjectName " 1479 "match '%s'", pos); 1480 return 0; 1481 } 1482 end = os_strchr(pos, ';'); 1483 while (end) { 1484 if (os_strncmp(end + 1, "EMAIL:", 6) == 0 || 1485 os_strncmp(end + 1, "DNS:", 4) == 0 || 1486 os_strncmp(end + 1, "URI:", 4) == 0) 1487 break; 1488 end = os_strchr(end + 1, ';'); 1489 } 1490 if (end) 1491 len = end - pos; 1492 else 1493 len = os_strlen(pos); 1494 if (tls_match_altsubject_component(cert, type, pos, len) > 0) 1495 return 1; 1496 pos = end + 1; 1497 } while (end); 1498 1499 return 0; 1500 } 1501 1502 1503 #ifndef CONFIG_NATIVE_WINDOWS 1504 static int domain_suffix_match(const u8 *val, size_t len, const char *match, 1505 int full) 1506 { 1507 size_t i, match_len; 1508 1509 /* Check for embedded nuls that could mess up suffix matching */ 1510 for (i = 0; i < len; i++) { 1511 if (val[i] == '\0') { 1512 wpa_printf(MSG_DEBUG, "TLS: Embedded null in a string - reject"); 1513 return 0; 1514 } 1515 } 1516 1517 match_len = os_strlen(match); 1518 if (match_len > len || (full && match_len != len)) 1519 return 0; 1520 1521 if (os_strncasecmp((const char *) val + len - match_len, match, 1522 match_len) != 0) 1523 return 0; /* no match */ 1524 1525 if (match_len == len) 1526 return 1; /* exact match */ 1527 1528 if (val[len - match_len - 1] == '.') 1529 return 1; /* full label match completes suffix match */ 1530 1531 wpa_printf(MSG_DEBUG, "TLS: Reject due to incomplete label match"); 1532 return 0; 1533 } 1534 #endif /* CONFIG_NATIVE_WINDOWS */ 1535 1536 1537 static int tls_match_suffix(X509 *cert, const char *match, int full) 1538 { 1539 #ifdef CONFIG_NATIVE_WINDOWS 1540 /* wincrypt.h has conflicting X509_NAME definition */ 1541 return -1; 1542 #else /* CONFIG_NATIVE_WINDOWS */ 1543 GENERAL_NAME *gen; 1544 void *ext; 1545 int i; 1546 stack_index_t j; 1547 int dns_name = 0; 1548 X509_NAME *name; 1549 1550 wpa_printf(MSG_DEBUG, "TLS: Match domain against %s%s", 1551 full ? "": "suffix ", match); 1552 1553 ext = X509_get_ext_d2i(cert, NID_subject_alt_name, NULL, NULL); 1554 1555 for (j = 0; ext && j < sk_GENERAL_NAME_num(ext); j++) { 1556 gen = sk_GENERAL_NAME_value(ext, j); 1557 if (gen->type != GEN_DNS) 1558 continue; 1559 dns_name++; 1560 wpa_hexdump_ascii(MSG_DEBUG, "TLS: Certificate dNSName", 1561 gen->d.dNSName->data, 1562 gen->d.dNSName->length); 1563 if (domain_suffix_match(gen->d.dNSName->data, 1564 gen->d.dNSName->length, match, full) == 1565 1) { 1566 wpa_printf(MSG_DEBUG, "TLS: %s in dNSName found", 1567 full ? "Match" : "Suffix match"); 1568 sk_GENERAL_NAME_pop_free(ext, GENERAL_NAME_free); 1569 return 1; 1570 } 1571 } 1572 sk_GENERAL_NAME_pop_free(ext, GENERAL_NAME_free); 1573 1574 if (dns_name) { 1575 wpa_printf(MSG_DEBUG, "TLS: None of the dNSName(s) matched"); 1576 return 0; 1577 } 1578 1579 name = X509_get_subject_name(cert); 1580 i = -1; 1581 for (;;) { 1582 X509_NAME_ENTRY *e; 1583 ASN1_STRING *cn; 1584 1585 i = X509_NAME_get_index_by_NID(name, NID_commonName, i); 1586 if (i == -1) 1587 break; 1588 e = X509_NAME_get_entry(name, i); 1589 if (e == NULL) 1590 continue; 1591 cn = X509_NAME_ENTRY_get_data(e); 1592 if (cn == NULL) 1593 continue; 1594 wpa_hexdump_ascii(MSG_DEBUG, "TLS: Certificate commonName", 1595 cn->data, cn->length); 1596 if (domain_suffix_match(cn->data, cn->length, match, full) == 1) 1597 { 1598 wpa_printf(MSG_DEBUG, "TLS: %s in commonName found", 1599 full ? "Match" : "Suffix match"); 1600 return 1; 1601 } 1602 } 1603 1604 wpa_printf(MSG_DEBUG, "TLS: No CommonName %smatch found", 1605 full ? "": "suffix "); 1606 return 0; 1607 #endif /* CONFIG_NATIVE_WINDOWS */ 1608 } 1609 1610 1611 static enum tls_fail_reason openssl_tls_fail_reason(int err) 1612 { 1613 switch (err) { 1614 case X509_V_ERR_CERT_REVOKED: 1615 return TLS_FAIL_REVOKED; 1616 case X509_V_ERR_CERT_NOT_YET_VALID: 1617 case X509_V_ERR_CRL_NOT_YET_VALID: 1618 return TLS_FAIL_NOT_YET_VALID; 1619 case X509_V_ERR_CERT_HAS_EXPIRED: 1620 case X509_V_ERR_CRL_HAS_EXPIRED: 1621 return TLS_FAIL_EXPIRED; 1622 case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT: 1623 case X509_V_ERR_UNABLE_TO_GET_CRL: 1624 case X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER: 1625 case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: 1626 case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY: 1627 case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: 1628 case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE: 1629 case X509_V_ERR_CERT_CHAIN_TOO_LONG: 1630 case X509_V_ERR_PATH_LENGTH_EXCEEDED: 1631 case X509_V_ERR_INVALID_CA: 1632 return TLS_FAIL_UNTRUSTED; 1633 case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE: 1634 case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE: 1635 case X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY: 1636 case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD: 1637 case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD: 1638 case X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD: 1639 case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD: 1640 case X509_V_ERR_CERT_UNTRUSTED: 1641 case X509_V_ERR_CERT_REJECTED: 1642 return TLS_FAIL_BAD_CERTIFICATE; 1643 default: 1644 return TLS_FAIL_UNSPECIFIED; 1645 } 1646 } 1647 1648 1649 static struct wpabuf * get_x509_cert(X509 *cert) 1650 { 1651 struct wpabuf *buf; 1652 u8 *tmp; 1653 1654 int cert_len = i2d_X509(cert, NULL); 1655 if (cert_len <= 0) 1656 return NULL; 1657 1658 buf = wpabuf_alloc(cert_len); 1659 if (buf == NULL) 1660 return NULL; 1661 1662 tmp = wpabuf_put(buf, cert_len); 1663 i2d_X509(cert, &tmp); 1664 return buf; 1665 } 1666 1667 1668 static void openssl_tls_fail_event(struct tls_connection *conn, 1669 X509 *err_cert, int err, int depth, 1670 const char *subject, const char *err_str, 1671 enum tls_fail_reason reason) 1672 { 1673 union tls_event_data ev; 1674 struct wpabuf *cert = NULL; 1675 struct tls_context *context = conn->context; 1676 1677 if (context->event_cb == NULL) 1678 return; 1679 1680 cert = get_x509_cert(err_cert); 1681 os_memset(&ev, 0, sizeof(ev)); 1682 ev.cert_fail.reason = reason != TLS_FAIL_UNSPECIFIED ? 1683 reason : openssl_tls_fail_reason(err); 1684 ev.cert_fail.depth = depth; 1685 ev.cert_fail.subject = subject; 1686 ev.cert_fail.reason_txt = err_str; 1687 ev.cert_fail.cert = cert; 1688 context->event_cb(context->cb_ctx, TLS_CERT_CHAIN_FAILURE, &ev); 1689 wpabuf_free(cert); 1690 } 1691 1692 1693 static void openssl_tls_cert_event(struct tls_connection *conn, 1694 X509 *err_cert, int depth, 1695 const char *subject) 1696 { 1697 struct wpabuf *cert = NULL; 1698 union tls_event_data ev; 1699 struct tls_context *context = conn->context; 1700 char *altsubject[TLS_MAX_ALT_SUBJECT]; 1701 int alt, num_altsubject = 0; 1702 GENERAL_NAME *gen; 1703 void *ext; 1704 stack_index_t i; 1705 #ifdef CONFIG_SHA256 1706 u8 hash[32]; 1707 #endif /* CONFIG_SHA256 */ 1708 1709 if (context->event_cb == NULL) 1710 return; 1711 1712 os_memset(&ev, 0, sizeof(ev)); 1713 if (conn->cert_probe || (conn->flags & TLS_CONN_EXT_CERT_CHECK) || 1714 context->cert_in_cb) { 1715 cert = get_x509_cert(err_cert); 1716 ev.peer_cert.cert = cert; 1717 } 1718 #ifdef CONFIG_SHA256 1719 if (cert) { 1720 const u8 *addr[1]; 1721 size_t len[1]; 1722 addr[0] = wpabuf_head(cert); 1723 len[0] = wpabuf_len(cert); 1724 if (sha256_vector(1, addr, len, hash) == 0) { 1725 ev.peer_cert.hash = hash; 1726 ev.peer_cert.hash_len = sizeof(hash); 1727 } 1728 } 1729 #endif /* CONFIG_SHA256 */ 1730 ev.peer_cert.depth = depth; 1731 ev.peer_cert.subject = subject; 1732 1733 ext = X509_get_ext_d2i(err_cert, NID_subject_alt_name, NULL, NULL); 1734 for (i = 0; ext && i < sk_GENERAL_NAME_num(ext); i++) { 1735 char *pos; 1736 1737 if (num_altsubject == TLS_MAX_ALT_SUBJECT) 1738 break; 1739 gen = sk_GENERAL_NAME_value(ext, i); 1740 if (gen->type != GEN_EMAIL && 1741 gen->type != GEN_DNS && 1742 gen->type != GEN_URI) 1743 continue; 1744 1745 pos = os_malloc(10 + gen->d.ia5->length + 1); 1746 if (pos == NULL) 1747 break; 1748 altsubject[num_altsubject++] = pos; 1749 1750 switch (gen->type) { 1751 case GEN_EMAIL: 1752 os_memcpy(pos, "EMAIL:", 6); 1753 pos += 6; 1754 break; 1755 case GEN_DNS: 1756 os_memcpy(pos, "DNS:", 4); 1757 pos += 4; 1758 break; 1759 case GEN_URI: 1760 os_memcpy(pos, "URI:", 4); 1761 pos += 4; 1762 break; 1763 } 1764 1765 os_memcpy(pos, gen->d.ia5->data, gen->d.ia5->length); 1766 pos += gen->d.ia5->length; 1767 *pos = '\0'; 1768 } 1769 sk_GENERAL_NAME_pop_free(ext, GENERAL_NAME_free); 1770 1771 for (alt = 0; alt < num_altsubject; alt++) 1772 ev.peer_cert.altsubject[alt] = altsubject[alt]; 1773 ev.peer_cert.num_altsubject = num_altsubject; 1774 1775 context->event_cb(context->cb_ctx, TLS_PEER_CERTIFICATE, &ev); 1776 wpabuf_free(cert); 1777 for (alt = 0; alt < num_altsubject; alt++) 1778 os_free(altsubject[alt]); 1779 } 1780 1781 1782 static int tls_verify_cb(int preverify_ok, X509_STORE_CTX *x509_ctx) 1783 { 1784 char buf[256]; 1785 X509 *err_cert; 1786 int err, depth; 1787 SSL *ssl; 1788 struct tls_connection *conn; 1789 struct tls_context *context; 1790 char *match, *altmatch, *suffix_match, *domain_match; 1791 const char *err_str; 1792 1793 err_cert = X509_STORE_CTX_get_current_cert(x509_ctx); 1794 if (!err_cert) 1795 return 0; 1796 1797 err = X509_STORE_CTX_get_error(x509_ctx); 1798 depth = X509_STORE_CTX_get_error_depth(x509_ctx); 1799 ssl = X509_STORE_CTX_get_ex_data(x509_ctx, 1800 SSL_get_ex_data_X509_STORE_CTX_idx()); 1801 X509_NAME_oneline(X509_get_subject_name(err_cert), buf, sizeof(buf)); 1802 1803 conn = SSL_get_app_data(ssl); 1804 if (conn == NULL) 1805 return 0; 1806 1807 if (depth == 0) 1808 conn->peer_cert = err_cert; 1809 else if (depth == 1) 1810 conn->peer_issuer = err_cert; 1811 else if (depth == 2) 1812 conn->peer_issuer_issuer = err_cert; 1813 1814 context = conn->context; 1815 match = conn->subject_match; 1816 altmatch = conn->altsubject_match; 1817 suffix_match = conn->suffix_match; 1818 domain_match = conn->domain_match; 1819 1820 if (!preverify_ok && !conn->ca_cert_verify) 1821 preverify_ok = 1; 1822 if (!preverify_ok && depth > 0 && conn->server_cert_only) 1823 preverify_ok = 1; 1824 if (!preverify_ok && (conn->flags & TLS_CONN_DISABLE_TIME_CHECKS) && 1825 (err == X509_V_ERR_CERT_HAS_EXPIRED || 1826 err == X509_V_ERR_CERT_NOT_YET_VALID)) { 1827 wpa_printf(MSG_DEBUG, "OpenSSL: Ignore certificate validity " 1828 "time mismatch"); 1829 preverify_ok = 1; 1830 } 1831 1832 err_str = X509_verify_cert_error_string(err); 1833 1834 #ifdef CONFIG_SHA256 1835 /* 1836 * Do not require preverify_ok so we can explicity allow otherwise 1837 * invalid pinned server certificates. 1838 */ 1839 if (depth == 0 && conn->server_cert_only) { 1840 struct wpabuf *cert; 1841 cert = get_x509_cert(err_cert); 1842 if (!cert) { 1843 wpa_printf(MSG_DEBUG, "OpenSSL: Could not fetch " 1844 "server certificate data"); 1845 preverify_ok = 0; 1846 } else { 1847 u8 hash[32]; 1848 const u8 *addr[1]; 1849 size_t len[1]; 1850 addr[0] = wpabuf_head(cert); 1851 len[0] = wpabuf_len(cert); 1852 if (sha256_vector(1, addr, len, hash) < 0 || 1853 os_memcmp(conn->srv_cert_hash, hash, 32) != 0) { 1854 err_str = "Server certificate mismatch"; 1855 err = X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN; 1856 preverify_ok = 0; 1857 } else if (!preverify_ok) { 1858 /* 1859 * Certificate matches pinned certificate, allow 1860 * regardless of other problems. 1861 */ 1862 wpa_printf(MSG_DEBUG, 1863 "OpenSSL: Ignore validation issues for a pinned server certificate"); 1864 preverify_ok = 1; 1865 } 1866 wpabuf_free(cert); 1867 } 1868 } 1869 #endif /* CONFIG_SHA256 */ 1870 1871 if (!preverify_ok) { 1872 wpa_printf(MSG_WARNING, "TLS: Certificate verification failed," 1873 " error %d (%s) depth %d for '%s'", err, err_str, 1874 depth, buf); 1875 openssl_tls_fail_event(conn, err_cert, err, depth, buf, 1876 err_str, TLS_FAIL_UNSPECIFIED); 1877 return preverify_ok; 1878 } 1879 1880 wpa_printf(MSG_DEBUG, "TLS: tls_verify_cb - preverify_ok=%d " 1881 "err=%d (%s) ca_cert_verify=%d depth=%d buf='%s'", 1882 preverify_ok, err, err_str, 1883 conn->ca_cert_verify, depth, buf); 1884 if (depth == 0 && match && os_strstr(buf, match) == NULL) { 1885 wpa_printf(MSG_WARNING, "TLS: Subject '%s' did not " 1886 "match with '%s'", buf, match); 1887 preverify_ok = 0; 1888 openssl_tls_fail_event(conn, err_cert, err, depth, buf, 1889 "Subject mismatch", 1890 TLS_FAIL_SUBJECT_MISMATCH); 1891 } else if (depth == 0 && altmatch && 1892 !tls_match_altsubject(err_cert, altmatch)) { 1893 wpa_printf(MSG_WARNING, "TLS: altSubjectName match " 1894 "'%s' not found", altmatch); 1895 preverify_ok = 0; 1896 openssl_tls_fail_event(conn, err_cert, err, depth, buf, 1897 "AltSubject mismatch", 1898 TLS_FAIL_ALTSUBJECT_MISMATCH); 1899 } else if (depth == 0 && suffix_match && 1900 !tls_match_suffix(err_cert, suffix_match, 0)) { 1901 wpa_printf(MSG_WARNING, "TLS: Domain suffix match '%s' not found", 1902 suffix_match); 1903 preverify_ok = 0; 1904 openssl_tls_fail_event(conn, err_cert, err, depth, buf, 1905 "Domain suffix mismatch", 1906 TLS_FAIL_DOMAIN_SUFFIX_MISMATCH); 1907 } else if (depth == 0 && domain_match && 1908 !tls_match_suffix(err_cert, domain_match, 1)) { 1909 wpa_printf(MSG_WARNING, "TLS: Domain match '%s' not found", 1910 domain_match); 1911 preverify_ok = 0; 1912 openssl_tls_fail_event(conn, err_cert, err, depth, buf, 1913 "Domain mismatch", 1914 TLS_FAIL_DOMAIN_MISMATCH); 1915 } else 1916 openssl_tls_cert_event(conn, err_cert, depth, buf); 1917 1918 if (conn->cert_probe && preverify_ok && depth == 0) { 1919 wpa_printf(MSG_DEBUG, "OpenSSL: Reject server certificate " 1920 "on probe-only run"); 1921 preverify_ok = 0; 1922 openssl_tls_fail_event(conn, err_cert, err, depth, buf, 1923 "Server certificate chain probe", 1924 TLS_FAIL_SERVER_CHAIN_PROBE); 1925 } 1926 1927 #ifdef OPENSSL_IS_BORINGSSL 1928 if (depth == 0 && (conn->flags & TLS_CONN_REQUEST_OCSP) && 1929 preverify_ok) { 1930 enum ocsp_result res; 1931 1932 res = check_ocsp_resp(conn->ssl_ctx, conn->ssl, err_cert, 1933 conn->peer_issuer, 1934 conn->peer_issuer_issuer); 1935 if (res == OCSP_REVOKED) { 1936 preverify_ok = 0; 1937 openssl_tls_fail_event(conn, err_cert, err, depth, buf, 1938 "certificate revoked", 1939 TLS_FAIL_REVOKED); 1940 if (err == X509_V_OK) 1941 X509_STORE_CTX_set_error( 1942 x509_ctx, X509_V_ERR_CERT_REVOKED); 1943 } else if (res != OCSP_GOOD && 1944 (conn->flags & TLS_CONN_REQUIRE_OCSP)) { 1945 preverify_ok = 0; 1946 openssl_tls_fail_event(conn, err_cert, err, depth, buf, 1947 "bad certificate status response", 1948 TLS_FAIL_UNSPECIFIED); 1949 } 1950 } 1951 #endif /* OPENSSL_IS_BORINGSSL */ 1952 1953 if (depth == 0 && preverify_ok && context->event_cb != NULL) 1954 context->event_cb(context->cb_ctx, 1955 TLS_CERT_CHAIN_SUCCESS, NULL); 1956 1957 return preverify_ok; 1958 } 1959 1960 1961 #ifndef OPENSSL_NO_STDIO 1962 static int tls_load_ca_der(struct tls_data *data, const char *ca_cert) 1963 { 1964 SSL_CTX *ssl_ctx = data->ssl; 1965 X509_LOOKUP *lookup; 1966 int ret = 0; 1967 1968 lookup = X509_STORE_add_lookup(SSL_CTX_get_cert_store(ssl_ctx), 1969 X509_LOOKUP_file()); 1970 if (lookup == NULL) { 1971 tls_show_errors(MSG_WARNING, __func__, 1972 "Failed add lookup for X509 store"); 1973 return -1; 1974 } 1975 1976 if (!X509_LOOKUP_load_file(lookup, ca_cert, X509_FILETYPE_ASN1)) { 1977 unsigned long err = ERR_peek_error(); 1978 tls_show_errors(MSG_WARNING, __func__, 1979 "Failed load CA in DER format"); 1980 if (ERR_GET_LIB(err) == ERR_LIB_X509 && 1981 ERR_GET_REASON(err) == X509_R_CERT_ALREADY_IN_HASH_TABLE) { 1982 wpa_printf(MSG_DEBUG, "OpenSSL: %s - ignoring " 1983 "cert already in hash table error", 1984 __func__); 1985 } else 1986 ret = -1; 1987 } 1988 1989 return ret; 1990 } 1991 #endif /* OPENSSL_NO_STDIO */ 1992 1993 1994 static int tls_connection_ca_cert(struct tls_data *data, 1995 struct tls_connection *conn, 1996 const char *ca_cert, const u8 *ca_cert_blob, 1997 size_t ca_cert_blob_len, const char *ca_path) 1998 { 1999 SSL_CTX *ssl_ctx = data->ssl; 2000 X509_STORE *store; 2001 2002 /* 2003 * Remove previously configured trusted CA certificates before adding 2004 * new ones. 2005 */ 2006 store = X509_STORE_new(); 2007 if (store == NULL) { 2008 wpa_printf(MSG_DEBUG, "OpenSSL: %s - failed to allocate new " 2009 "certificate store", __func__); 2010 return -1; 2011 } 2012 SSL_CTX_set_cert_store(ssl_ctx, store); 2013 2014 SSL_set_verify(conn->ssl, SSL_VERIFY_PEER, tls_verify_cb); 2015 conn->ca_cert_verify = 1; 2016 2017 if (ca_cert && os_strncmp(ca_cert, "probe://", 8) == 0) { 2018 wpa_printf(MSG_DEBUG, "OpenSSL: Probe for server certificate " 2019 "chain"); 2020 conn->cert_probe = 1; 2021 conn->ca_cert_verify = 0; 2022 return 0; 2023 } 2024 2025 if (ca_cert && os_strncmp(ca_cert, "hash://", 7) == 0) { 2026 #ifdef CONFIG_SHA256 2027 const char *pos = ca_cert + 7; 2028 if (os_strncmp(pos, "server/sha256/", 14) != 0) { 2029 wpa_printf(MSG_DEBUG, "OpenSSL: Unsupported ca_cert " 2030 "hash value '%s'", ca_cert); 2031 return -1; 2032 } 2033 pos += 14; 2034 if (os_strlen(pos) != 32 * 2) { 2035 wpa_printf(MSG_DEBUG, "OpenSSL: Unexpected SHA256 " 2036 "hash length in ca_cert '%s'", ca_cert); 2037 return -1; 2038 } 2039 if (hexstr2bin(pos, conn->srv_cert_hash, 32) < 0) { 2040 wpa_printf(MSG_DEBUG, "OpenSSL: Invalid SHA256 hash " 2041 "value in ca_cert '%s'", ca_cert); 2042 return -1; 2043 } 2044 conn->server_cert_only = 1; 2045 wpa_printf(MSG_DEBUG, "OpenSSL: Checking only server " 2046 "certificate match"); 2047 return 0; 2048 #else /* CONFIG_SHA256 */ 2049 wpa_printf(MSG_INFO, "No SHA256 included in the build - " 2050 "cannot validate server certificate hash"); 2051 return -1; 2052 #endif /* CONFIG_SHA256 */ 2053 } 2054 2055 if (ca_cert_blob) { 2056 X509 *cert = d2i_X509(NULL, 2057 (const unsigned char **) &ca_cert_blob, 2058 ca_cert_blob_len); 2059 if (cert == NULL) { 2060 tls_show_errors(MSG_WARNING, __func__, 2061 "Failed to parse ca_cert_blob"); 2062 return -1; 2063 } 2064 2065 if (!X509_STORE_add_cert(SSL_CTX_get_cert_store(ssl_ctx), 2066 cert)) { 2067 unsigned long err = ERR_peek_error(); 2068 tls_show_errors(MSG_WARNING, __func__, 2069 "Failed to add ca_cert_blob to " 2070 "certificate store"); 2071 if (ERR_GET_LIB(err) == ERR_LIB_X509 && 2072 ERR_GET_REASON(err) == 2073 X509_R_CERT_ALREADY_IN_HASH_TABLE) { 2074 wpa_printf(MSG_DEBUG, "OpenSSL: %s - ignoring " 2075 "cert already in hash table error", 2076 __func__); 2077 } else { 2078 X509_free(cert); 2079 return -1; 2080 } 2081 } 2082 X509_free(cert); 2083 wpa_printf(MSG_DEBUG, "OpenSSL: %s - added ca_cert_blob " 2084 "to certificate store", __func__); 2085 return 0; 2086 } 2087 2088 #ifdef ANDROID 2089 /* Single alias */ 2090 if (ca_cert && os_strncmp("keystore://", ca_cert, 11) == 0) { 2091 if (tls_add_ca_from_keystore(SSL_CTX_get_cert_store(ssl_ctx), 2092 &ca_cert[11]) < 0) 2093 return -1; 2094 SSL_set_verify(conn->ssl, SSL_VERIFY_PEER, tls_verify_cb); 2095 return 0; 2096 } 2097 2098 /* Multiple aliases separated by space */ 2099 if (ca_cert && os_strncmp("keystores://", ca_cert, 12) == 0) { 2100 char *aliases = os_strdup(&ca_cert[12]); 2101 const char *delim = " "; 2102 int rc = 0; 2103 char *savedptr; 2104 char *alias; 2105 2106 if (!aliases) 2107 return -1; 2108 alias = strtok_r(aliases, delim, &savedptr); 2109 for (; alias; alias = strtok_r(NULL, delim, &savedptr)) { 2110 if (tls_add_ca_from_keystore_encoded( 2111 SSL_CTX_get_cert_store(ssl_ctx), alias)) { 2112 wpa_printf(MSG_WARNING, 2113 "OpenSSL: %s - Failed to add ca_cert %s from keystore", 2114 __func__, alias); 2115 rc = -1; 2116 break; 2117 } 2118 } 2119 os_free(aliases); 2120 if (rc) 2121 return rc; 2122 2123 SSL_set_verify(conn->ssl, SSL_VERIFY_PEER, tls_verify_cb); 2124 return 0; 2125 } 2126 #endif /* ANDROID */ 2127 2128 #ifdef CONFIG_NATIVE_WINDOWS 2129 if (ca_cert && tls_cryptoapi_ca_cert(ssl_ctx, conn->ssl, ca_cert) == 2130 0) { 2131 wpa_printf(MSG_DEBUG, "OpenSSL: Added CA certificates from " 2132 "system certificate store"); 2133 return 0; 2134 } 2135 #endif /* CONFIG_NATIVE_WINDOWS */ 2136 2137 if (ca_cert || ca_path) { 2138 #ifndef OPENSSL_NO_STDIO 2139 if (SSL_CTX_load_verify_locations(ssl_ctx, ca_cert, ca_path) != 2140 1) { 2141 tls_show_errors(MSG_WARNING, __func__, 2142 "Failed to load root certificates"); 2143 if (ca_cert && 2144 tls_load_ca_der(data, ca_cert) == 0) { 2145 wpa_printf(MSG_DEBUG, "OpenSSL: %s - loaded " 2146 "DER format CA certificate", 2147 __func__); 2148 } else 2149 return -1; 2150 } else { 2151 wpa_printf(MSG_DEBUG, "TLS: Trusted root " 2152 "certificate(s) loaded"); 2153 tls_get_errors(data); 2154 } 2155 #else /* OPENSSL_NO_STDIO */ 2156 wpa_printf(MSG_DEBUG, "OpenSSL: %s - OPENSSL_NO_STDIO", 2157 __func__); 2158 return -1; 2159 #endif /* OPENSSL_NO_STDIO */ 2160 } else { 2161 /* No ca_cert configured - do not try to verify server 2162 * certificate */ 2163 conn->ca_cert_verify = 0; 2164 } 2165 2166 return 0; 2167 } 2168 2169 2170 static int tls_global_ca_cert(struct tls_data *data, const char *ca_cert) 2171 { 2172 SSL_CTX *ssl_ctx = data->ssl; 2173 2174 if (ca_cert) { 2175 if (SSL_CTX_load_verify_locations(ssl_ctx, ca_cert, NULL) != 1) 2176 { 2177 tls_show_errors(MSG_WARNING, __func__, 2178 "Failed to load root certificates"); 2179 return -1; 2180 } 2181 2182 wpa_printf(MSG_DEBUG, "TLS: Trusted root " 2183 "certificate(s) loaded"); 2184 2185 #ifndef OPENSSL_NO_STDIO 2186 /* Add the same CAs to the client certificate requests */ 2187 SSL_CTX_set_client_CA_list(ssl_ctx, 2188 SSL_load_client_CA_file(ca_cert)); 2189 #endif /* OPENSSL_NO_STDIO */ 2190 } 2191 2192 return 0; 2193 } 2194 2195 2196 int tls_global_set_verify(void *ssl_ctx, int check_crl) 2197 { 2198 int flags; 2199 2200 if (check_crl) { 2201 struct tls_data *data = ssl_ctx; 2202 X509_STORE *cs = SSL_CTX_get_cert_store(data->ssl); 2203 if (cs == NULL) { 2204 tls_show_errors(MSG_INFO, __func__, "Failed to get " 2205 "certificate store when enabling " 2206 "check_crl"); 2207 return -1; 2208 } 2209 flags = X509_V_FLAG_CRL_CHECK; 2210 if (check_crl == 2) 2211 flags |= X509_V_FLAG_CRL_CHECK_ALL; 2212 X509_STORE_set_flags(cs, flags); 2213 } 2214 return 0; 2215 } 2216 2217 2218 static int tls_connection_set_subject_match(struct tls_connection *conn, 2219 const char *subject_match, 2220 const char *altsubject_match, 2221 const char *suffix_match, 2222 const char *domain_match) 2223 { 2224 os_free(conn->subject_match); 2225 conn->subject_match = NULL; 2226 if (subject_match) { 2227 conn->subject_match = os_strdup(subject_match); 2228 if (conn->subject_match == NULL) 2229 return -1; 2230 } 2231 2232 os_free(conn->altsubject_match); 2233 conn->altsubject_match = NULL; 2234 if (altsubject_match) { 2235 conn->altsubject_match = os_strdup(altsubject_match); 2236 if (conn->altsubject_match == NULL) 2237 return -1; 2238 } 2239 2240 os_free(conn->suffix_match); 2241 conn->suffix_match = NULL; 2242 if (suffix_match) { 2243 conn->suffix_match = os_strdup(suffix_match); 2244 if (conn->suffix_match == NULL) 2245 return -1; 2246 } 2247 2248 os_free(conn->domain_match); 2249 conn->domain_match = NULL; 2250 if (domain_match) { 2251 conn->domain_match = os_strdup(domain_match); 2252 if (conn->domain_match == NULL) 2253 return -1; 2254 } 2255 2256 return 0; 2257 } 2258 2259 2260 static void tls_set_conn_flags(SSL *ssl, unsigned int flags) 2261 { 2262 #ifdef SSL_OP_NO_TICKET 2263 if (flags & TLS_CONN_DISABLE_SESSION_TICKET) 2264 SSL_set_options(ssl, SSL_OP_NO_TICKET); 2265 else 2266 SSL_clear_options(ssl, SSL_OP_NO_TICKET); 2267 #endif /* SSL_OP_NO_TICKET */ 2268 2269 #ifdef SSL_OP_NO_TLSv1 2270 if (flags & TLS_CONN_DISABLE_TLSv1_0) 2271 SSL_set_options(ssl, SSL_OP_NO_TLSv1); 2272 else 2273 SSL_clear_options(ssl, SSL_OP_NO_TLSv1); 2274 #endif /* SSL_OP_NO_TLSv1 */ 2275 #ifdef SSL_OP_NO_TLSv1_1 2276 if (flags & TLS_CONN_DISABLE_TLSv1_1) 2277 SSL_set_options(ssl, SSL_OP_NO_TLSv1_1); 2278 else 2279 SSL_clear_options(ssl, SSL_OP_NO_TLSv1_1); 2280 #endif /* SSL_OP_NO_TLSv1_1 */ 2281 #ifdef SSL_OP_NO_TLSv1_2 2282 if (flags & TLS_CONN_DISABLE_TLSv1_2) 2283 SSL_set_options(ssl, SSL_OP_NO_TLSv1_2); 2284 else 2285 SSL_clear_options(ssl, SSL_OP_NO_TLSv1_2); 2286 #endif /* SSL_OP_NO_TLSv1_2 */ 2287 } 2288 2289 2290 int tls_connection_set_verify(void *ssl_ctx, struct tls_connection *conn, 2291 int verify_peer, unsigned int flags, 2292 const u8 *session_ctx, size_t session_ctx_len) 2293 { 2294 static int counter = 0; 2295 struct tls_data *data = ssl_ctx; 2296 2297 if (conn == NULL) 2298 return -1; 2299 2300 if (verify_peer) { 2301 conn->ca_cert_verify = 1; 2302 SSL_set_verify(conn->ssl, SSL_VERIFY_PEER | 2303 SSL_VERIFY_FAIL_IF_NO_PEER_CERT | 2304 SSL_VERIFY_CLIENT_ONCE, tls_verify_cb); 2305 } else { 2306 conn->ca_cert_verify = 0; 2307 SSL_set_verify(conn->ssl, SSL_VERIFY_NONE, NULL); 2308 } 2309 2310 tls_set_conn_flags(conn->ssl, flags); 2311 conn->flags = flags; 2312 2313 SSL_set_accept_state(conn->ssl); 2314 2315 if (data->tls_session_lifetime == 0) { 2316 /* 2317 * Set session id context to a unique value to make sure 2318 * session resumption cannot be used either through session 2319 * caching or TLS ticket extension. 2320 */ 2321 counter++; 2322 SSL_set_session_id_context(conn->ssl, 2323 (const unsigned char *) &counter, 2324 sizeof(counter)); 2325 } else if (session_ctx) { 2326 SSL_set_session_id_context(conn->ssl, session_ctx, 2327 session_ctx_len); 2328 } 2329 2330 return 0; 2331 } 2332 2333 2334 static int tls_connection_client_cert(struct tls_connection *conn, 2335 const char *client_cert, 2336 const u8 *client_cert_blob, 2337 size_t client_cert_blob_len) 2338 { 2339 if (client_cert == NULL && client_cert_blob == NULL) 2340 return 0; 2341 2342 #ifdef PKCS12_FUNCS 2343 #if OPENSSL_VERSION_NUMBER < 0x10002000L || defined(LIBRESSL_VERSION_NUMBER) 2344 /* 2345 * Clear previously set extra chain certificates, if any, from PKCS#12 2346 * processing in tls_parse_pkcs12() to allow OpenSSL to build a new 2347 * chain properly. 2348 */ 2349 SSL_CTX_clear_extra_chain_certs(conn->ssl_ctx); 2350 #endif /* OPENSSL_VERSION_NUMBER < 0x10002000L */ 2351 #endif /* PKCS12_FUNCS */ 2352 2353 if (client_cert_blob && 2354 SSL_use_certificate_ASN1(conn->ssl, (u8 *) client_cert_blob, 2355 client_cert_blob_len) == 1) { 2356 wpa_printf(MSG_DEBUG, "OpenSSL: SSL_use_certificate_ASN1 --> " 2357 "OK"); 2358 return 0; 2359 } else if (client_cert_blob) { 2360 tls_show_errors(MSG_DEBUG, __func__, 2361 "SSL_use_certificate_ASN1 failed"); 2362 } 2363 2364 if (client_cert == NULL) 2365 return -1; 2366 2367 #ifdef ANDROID 2368 if (os_strncmp("keystore://", client_cert, 11) == 0) { 2369 BIO *bio = BIO_from_keystore(&client_cert[11]); 2370 X509 *x509 = NULL; 2371 int ret = -1; 2372 if (bio) 2373 x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL); 2374 2375 if (x509) { 2376 if (SSL_use_certificate(conn->ssl, x509) == 1) 2377 ret = 0; 2378 X509_free(x509); 2379 } 2380 2381 /* Read additional certificates into the chain. */ 2382 while (bio) { 2383 x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL); 2384 if (x509) { 2385 /* Takes ownership of x509 */ 2386 SSL_add0_chain_cert(conn->ssl, x509); 2387 } else { 2388 BIO_free(bio); 2389 bio = NULL; 2390 } 2391 } 2392 return ret; 2393 } 2394 #endif /* ANDROID */ 2395 2396 #ifndef OPENSSL_NO_STDIO 2397 if (SSL_use_certificate_file(conn->ssl, client_cert, 2398 SSL_FILETYPE_ASN1) == 1) { 2399 wpa_printf(MSG_DEBUG, "OpenSSL: SSL_use_certificate_file (DER)" 2400 " --> OK"); 2401 return 0; 2402 } 2403 2404 if (SSL_use_certificate_file(conn->ssl, client_cert, 2405 SSL_FILETYPE_PEM) == 1) { 2406 ERR_clear_error(); 2407 wpa_printf(MSG_DEBUG, "OpenSSL: SSL_use_certificate_file (PEM)" 2408 " --> OK"); 2409 return 0; 2410 } 2411 2412 tls_show_errors(MSG_DEBUG, __func__, 2413 "SSL_use_certificate_file failed"); 2414 #else /* OPENSSL_NO_STDIO */ 2415 wpa_printf(MSG_DEBUG, "OpenSSL: %s - OPENSSL_NO_STDIO", __func__); 2416 #endif /* OPENSSL_NO_STDIO */ 2417 2418 return -1; 2419 } 2420 2421 2422 static int tls_global_client_cert(struct tls_data *data, 2423 const char *client_cert) 2424 { 2425 #ifndef OPENSSL_NO_STDIO 2426 SSL_CTX *ssl_ctx = data->ssl; 2427 2428 if (client_cert == NULL) 2429 return 0; 2430 2431 if (SSL_CTX_use_certificate_file(ssl_ctx, client_cert, 2432 SSL_FILETYPE_ASN1) != 1 && 2433 SSL_CTX_use_certificate_chain_file(ssl_ctx, client_cert) != 1 && 2434 SSL_CTX_use_certificate_file(ssl_ctx, client_cert, 2435 SSL_FILETYPE_PEM) != 1) { 2436 tls_show_errors(MSG_INFO, __func__, 2437 "Failed to load client certificate"); 2438 return -1; 2439 } 2440 return 0; 2441 #else /* OPENSSL_NO_STDIO */ 2442 if (client_cert == NULL) 2443 return 0; 2444 wpa_printf(MSG_DEBUG, "OpenSSL: %s - OPENSSL_NO_STDIO", __func__); 2445 return -1; 2446 #endif /* OPENSSL_NO_STDIO */ 2447 } 2448 2449 2450 static int tls_passwd_cb(char *buf, int size, int rwflag, void *password) 2451 { 2452 if (password == NULL) { 2453 return 0; 2454 } 2455 os_strlcpy(buf, (char *) password, size); 2456 return os_strlen(buf); 2457 } 2458 2459 2460 #ifdef PKCS12_FUNCS 2461 static int tls_parse_pkcs12(struct tls_data *data, SSL *ssl, PKCS12 *p12, 2462 const char *passwd) 2463 { 2464 EVP_PKEY *pkey; 2465 X509 *cert; 2466 STACK_OF(X509) *certs; 2467 int res = 0; 2468 char buf[256]; 2469 2470 pkey = NULL; 2471 cert = NULL; 2472 certs = NULL; 2473 if (!passwd) 2474 passwd = ""; 2475 if (!PKCS12_parse(p12, passwd, &pkey, &cert, &certs)) { 2476 tls_show_errors(MSG_DEBUG, __func__, 2477 "Failed to parse PKCS12 file"); 2478 PKCS12_free(p12); 2479 return -1; 2480 } 2481 wpa_printf(MSG_DEBUG, "TLS: Successfully parsed PKCS12 data"); 2482 2483 if (cert) { 2484 X509_NAME_oneline(X509_get_subject_name(cert), buf, 2485 sizeof(buf)); 2486 wpa_printf(MSG_DEBUG, "TLS: Got certificate from PKCS12: " 2487 "subject='%s'", buf); 2488 if (ssl) { 2489 if (SSL_use_certificate(ssl, cert) != 1) 2490 res = -1; 2491 } else { 2492 if (SSL_CTX_use_certificate(data->ssl, cert) != 1) 2493 res = -1; 2494 } 2495 X509_free(cert); 2496 } 2497 2498 if (pkey) { 2499 wpa_printf(MSG_DEBUG, "TLS: Got private key from PKCS12"); 2500 if (ssl) { 2501 if (SSL_use_PrivateKey(ssl, pkey) != 1) 2502 res = -1; 2503 } else { 2504 if (SSL_CTX_use_PrivateKey(data->ssl, pkey) != 1) 2505 res = -1; 2506 } 2507 EVP_PKEY_free(pkey); 2508 } 2509 2510 if (certs) { 2511 #if OPENSSL_VERSION_NUMBER >= 0x10002000L && !defined(LIBRESSL_VERSION_NUMBER) 2512 if (ssl) 2513 SSL_clear_chain_certs(ssl); 2514 else 2515 SSL_CTX_clear_chain_certs(data->ssl); 2516 while ((cert = sk_X509_pop(certs)) != NULL) { 2517 X509_NAME_oneline(X509_get_subject_name(cert), buf, 2518 sizeof(buf)); 2519 wpa_printf(MSG_DEBUG, "TLS: additional certificate" 2520 " from PKCS12: subject='%s'", buf); 2521 if ((ssl && SSL_add1_chain_cert(ssl, cert) != 1) || 2522 (!ssl && SSL_CTX_add1_chain_cert(data->ssl, 2523 cert) != 1)) { 2524 tls_show_errors(MSG_DEBUG, __func__, 2525 "Failed to add additional certificate"); 2526 res = -1; 2527 X509_free(cert); 2528 break; 2529 } 2530 X509_free(cert); 2531 } 2532 if (!res) { 2533 /* Try to continue anyway */ 2534 } 2535 sk_X509_pop_free(certs, X509_free); 2536 #ifndef OPENSSL_IS_BORINGSSL 2537 if (ssl) 2538 res = SSL_build_cert_chain( 2539 ssl, 2540 SSL_BUILD_CHAIN_FLAG_CHECK | 2541 SSL_BUILD_CHAIN_FLAG_IGNORE_ERROR); 2542 else 2543 res = SSL_CTX_build_cert_chain( 2544 data->ssl, 2545 SSL_BUILD_CHAIN_FLAG_CHECK | 2546 SSL_BUILD_CHAIN_FLAG_IGNORE_ERROR); 2547 if (!res) { 2548 tls_show_errors(MSG_DEBUG, __func__, 2549 "Failed to build certificate chain"); 2550 } else if (res == 2) { 2551 wpa_printf(MSG_DEBUG, 2552 "TLS: Ignore certificate chain verification error when building chain with PKCS#12 extra certificates"); 2553 } 2554 #endif /* OPENSSL_IS_BORINGSSL */ 2555 /* 2556 * Try to continue regardless of result since it is possible for 2557 * the extra certificates not to be required. 2558 */ 2559 res = 0; 2560 #else /* OPENSSL_VERSION_NUMBER >= 0x10002000L */ 2561 SSL_CTX_clear_extra_chain_certs(data->ssl); 2562 while ((cert = sk_X509_pop(certs)) != NULL) { 2563 X509_NAME_oneline(X509_get_subject_name(cert), buf, 2564 sizeof(buf)); 2565 wpa_printf(MSG_DEBUG, "TLS: additional certificate" 2566 " from PKCS12: subject='%s'", buf); 2567 /* 2568 * There is no SSL equivalent for the chain cert - so 2569 * always add it to the context... 2570 */ 2571 if (SSL_CTX_add_extra_chain_cert(data->ssl, cert) != 1) 2572 { 2573 X509_free(cert); 2574 res = -1; 2575 break; 2576 } 2577 } 2578 sk_X509_pop_free(certs, X509_free); 2579 #endif /* OPENSSL_VERSION_NUMBER >= 0x10002000L */ 2580 } 2581 2582 PKCS12_free(p12); 2583 2584 if (res < 0) 2585 tls_get_errors(data); 2586 2587 return res; 2588 } 2589 #endif /* PKCS12_FUNCS */ 2590 2591 2592 static int tls_read_pkcs12(struct tls_data *data, SSL *ssl, 2593 const char *private_key, const char *passwd) 2594 { 2595 #ifdef PKCS12_FUNCS 2596 FILE *f; 2597 PKCS12 *p12; 2598 2599 f = fopen(private_key, "rb"); 2600 if (f == NULL) 2601 return -1; 2602 2603 p12 = d2i_PKCS12_fp(f, NULL); 2604 fclose(f); 2605 2606 if (p12 == NULL) { 2607 tls_show_errors(MSG_INFO, __func__, 2608 "Failed to use PKCS#12 file"); 2609 return -1; 2610 } 2611 2612 return tls_parse_pkcs12(data, ssl, p12, passwd); 2613 2614 #else /* PKCS12_FUNCS */ 2615 wpa_printf(MSG_INFO, "TLS: PKCS12 support disabled - cannot read " 2616 "p12/pfx files"); 2617 return -1; 2618 #endif /* PKCS12_FUNCS */ 2619 } 2620 2621 2622 static int tls_read_pkcs12_blob(struct tls_data *data, SSL *ssl, 2623 const u8 *blob, size_t len, const char *passwd) 2624 { 2625 #ifdef PKCS12_FUNCS 2626 PKCS12 *p12; 2627 2628 p12 = d2i_PKCS12(NULL, (const unsigned char **) &blob, len); 2629 if (p12 == NULL) { 2630 tls_show_errors(MSG_INFO, __func__, 2631 "Failed to use PKCS#12 blob"); 2632 return -1; 2633 } 2634 2635 return tls_parse_pkcs12(data, ssl, p12, passwd); 2636 2637 #else /* PKCS12_FUNCS */ 2638 wpa_printf(MSG_INFO, "TLS: PKCS12 support disabled - cannot parse " 2639 "p12/pfx blobs"); 2640 return -1; 2641 #endif /* PKCS12_FUNCS */ 2642 } 2643 2644 2645 #ifndef OPENSSL_NO_ENGINE 2646 static int tls_engine_get_cert(struct tls_connection *conn, 2647 const char *cert_id, 2648 X509 **cert) 2649 { 2650 /* this runs after the private key is loaded so no PIN is required */ 2651 struct { 2652 const char *cert_id; 2653 X509 *cert; 2654 } params; 2655 params.cert_id = cert_id; 2656 params.cert = NULL; 2657 2658 if (!ENGINE_ctrl_cmd(conn->engine, "LOAD_CERT_CTRL", 2659 0, ¶ms, NULL, 1)) { 2660 unsigned long err = ERR_get_error(); 2661 2662 wpa_printf(MSG_ERROR, "ENGINE: cannot load client cert with id" 2663 " '%s' [%s]", cert_id, 2664 ERR_error_string(err, NULL)); 2665 if (tls_is_pin_error(err)) 2666 return TLS_SET_PARAMS_ENGINE_PRV_BAD_PIN; 2667 return TLS_SET_PARAMS_ENGINE_PRV_INIT_FAILED; 2668 } 2669 if (!params.cert) { 2670 wpa_printf(MSG_ERROR, "ENGINE: did not properly cert with id" 2671 " '%s'", cert_id); 2672 return TLS_SET_PARAMS_ENGINE_PRV_INIT_FAILED; 2673 } 2674 *cert = params.cert; 2675 return 0; 2676 } 2677 #endif /* OPENSSL_NO_ENGINE */ 2678 2679 2680 static int tls_connection_engine_client_cert(struct tls_connection *conn, 2681 const char *cert_id) 2682 { 2683 #ifndef OPENSSL_NO_ENGINE 2684 X509 *cert; 2685 2686 if (tls_engine_get_cert(conn, cert_id, &cert)) 2687 return -1; 2688 2689 if (!SSL_use_certificate(conn->ssl, cert)) { 2690 tls_show_errors(MSG_ERROR, __func__, 2691 "SSL_use_certificate failed"); 2692 X509_free(cert); 2693 return -1; 2694 } 2695 X509_free(cert); 2696 wpa_printf(MSG_DEBUG, "ENGINE: SSL_use_certificate --> " 2697 "OK"); 2698 return 0; 2699 2700 #else /* OPENSSL_NO_ENGINE */ 2701 return -1; 2702 #endif /* OPENSSL_NO_ENGINE */ 2703 } 2704 2705 2706 static int tls_connection_engine_ca_cert(struct tls_data *data, 2707 struct tls_connection *conn, 2708 const char *ca_cert_id) 2709 { 2710 #ifndef OPENSSL_NO_ENGINE 2711 X509 *cert; 2712 SSL_CTX *ssl_ctx = data->ssl; 2713 X509_STORE *store; 2714 2715 if (tls_engine_get_cert(conn, ca_cert_id, &cert)) 2716 return -1; 2717 2718 /* start off the same as tls_connection_ca_cert */ 2719 store = X509_STORE_new(); 2720 if (store == NULL) { 2721 wpa_printf(MSG_DEBUG, "OpenSSL: %s - failed to allocate new " 2722 "certificate store", __func__); 2723 X509_free(cert); 2724 return -1; 2725 } 2726 SSL_CTX_set_cert_store(ssl_ctx, store); 2727 if (!X509_STORE_add_cert(store, cert)) { 2728 unsigned long err = ERR_peek_error(); 2729 tls_show_errors(MSG_WARNING, __func__, 2730 "Failed to add CA certificate from engine " 2731 "to certificate store"); 2732 if (ERR_GET_LIB(err) == ERR_LIB_X509 && 2733 ERR_GET_REASON(err) == X509_R_CERT_ALREADY_IN_HASH_TABLE) { 2734 wpa_printf(MSG_DEBUG, "OpenSSL: %s - ignoring cert" 2735 " already in hash table error", 2736 __func__); 2737 } else { 2738 X509_free(cert); 2739 return -1; 2740 } 2741 } 2742 X509_free(cert); 2743 wpa_printf(MSG_DEBUG, "OpenSSL: %s - added CA certificate from engine " 2744 "to certificate store", __func__); 2745 SSL_set_verify(conn->ssl, SSL_VERIFY_PEER, tls_verify_cb); 2746 conn->ca_cert_verify = 1; 2747 2748 return 0; 2749 2750 #else /* OPENSSL_NO_ENGINE */ 2751 return -1; 2752 #endif /* OPENSSL_NO_ENGINE */ 2753 } 2754 2755 2756 static int tls_connection_engine_private_key(struct tls_connection *conn) 2757 { 2758 #if defined(ANDROID) || !defined(OPENSSL_NO_ENGINE) 2759 if (SSL_use_PrivateKey(conn->ssl, conn->private_key) != 1) { 2760 tls_show_errors(MSG_ERROR, __func__, 2761 "ENGINE: cannot use private key for TLS"); 2762 return -1; 2763 } 2764 if (!SSL_check_private_key(conn->ssl)) { 2765 tls_show_errors(MSG_INFO, __func__, 2766 "Private key failed verification"); 2767 return -1; 2768 } 2769 return 0; 2770 #else /* OPENSSL_NO_ENGINE */ 2771 wpa_printf(MSG_ERROR, "SSL: Configuration uses engine, but " 2772 "engine support was not compiled in"); 2773 return -1; 2774 #endif /* OPENSSL_NO_ENGINE */ 2775 } 2776 2777 2778 static int tls_connection_private_key(struct tls_data *data, 2779 struct tls_connection *conn, 2780 const char *private_key, 2781 const char *private_key_passwd, 2782 const u8 *private_key_blob, 2783 size_t private_key_blob_len) 2784 { 2785 SSL_CTX *ssl_ctx = data->ssl; 2786 char *passwd; 2787 int ok; 2788 2789 if (private_key == NULL && private_key_blob == NULL) 2790 return 0; 2791 2792 if (private_key_passwd) { 2793 passwd = os_strdup(private_key_passwd); 2794 if (passwd == NULL) 2795 return -1; 2796 } else 2797 passwd = NULL; 2798 2799 SSL_CTX_set_default_passwd_cb(ssl_ctx, tls_passwd_cb); 2800 SSL_CTX_set_default_passwd_cb_userdata(ssl_ctx, passwd); 2801 2802 ok = 0; 2803 while (private_key_blob) { 2804 if (SSL_use_PrivateKey_ASN1(EVP_PKEY_RSA, conn->ssl, 2805 (u8 *) private_key_blob, 2806 private_key_blob_len) == 1) { 2807 wpa_printf(MSG_DEBUG, "OpenSSL: SSL_use_PrivateKey_" 2808 "ASN1(EVP_PKEY_RSA) --> OK"); 2809 ok = 1; 2810 break; 2811 } 2812 2813 if (SSL_use_PrivateKey_ASN1(EVP_PKEY_DSA, conn->ssl, 2814 (u8 *) private_key_blob, 2815 private_key_blob_len) == 1) { 2816 wpa_printf(MSG_DEBUG, "OpenSSL: SSL_use_PrivateKey_" 2817 "ASN1(EVP_PKEY_DSA) --> OK"); 2818 ok = 1; 2819 break; 2820 } 2821 2822 if (SSL_use_RSAPrivateKey_ASN1(conn->ssl, 2823 (u8 *) private_key_blob, 2824 private_key_blob_len) == 1) { 2825 wpa_printf(MSG_DEBUG, "OpenSSL: " 2826 "SSL_use_RSAPrivateKey_ASN1 --> OK"); 2827 ok = 1; 2828 break; 2829 } 2830 2831 if (tls_read_pkcs12_blob(data, conn->ssl, private_key_blob, 2832 private_key_blob_len, passwd) == 0) { 2833 wpa_printf(MSG_DEBUG, "OpenSSL: PKCS#12 as blob --> " 2834 "OK"); 2835 ok = 1; 2836 break; 2837 } 2838 2839 break; 2840 } 2841 2842 while (!ok && private_key) { 2843 #ifndef OPENSSL_NO_STDIO 2844 if (SSL_use_PrivateKey_file(conn->ssl, private_key, 2845 SSL_FILETYPE_ASN1) == 1) { 2846 wpa_printf(MSG_DEBUG, "OpenSSL: " 2847 "SSL_use_PrivateKey_File (DER) --> OK"); 2848 ok = 1; 2849 break; 2850 } 2851 2852 if (SSL_use_PrivateKey_file(conn->ssl, private_key, 2853 SSL_FILETYPE_PEM) == 1) { 2854 wpa_printf(MSG_DEBUG, "OpenSSL: " 2855 "SSL_use_PrivateKey_File (PEM) --> OK"); 2856 ok = 1; 2857 break; 2858 } 2859 #else /* OPENSSL_NO_STDIO */ 2860 wpa_printf(MSG_DEBUG, "OpenSSL: %s - OPENSSL_NO_STDIO", 2861 __func__); 2862 #endif /* OPENSSL_NO_STDIO */ 2863 2864 if (tls_read_pkcs12(data, conn->ssl, private_key, passwd) 2865 == 0) { 2866 wpa_printf(MSG_DEBUG, "OpenSSL: Reading PKCS#12 file " 2867 "--> OK"); 2868 ok = 1; 2869 break; 2870 } 2871 2872 if (tls_cryptoapi_cert(conn->ssl, private_key) == 0) { 2873 wpa_printf(MSG_DEBUG, "OpenSSL: Using CryptoAPI to " 2874 "access certificate store --> OK"); 2875 ok = 1; 2876 break; 2877 } 2878 2879 break; 2880 } 2881 2882 if (!ok) { 2883 tls_show_errors(MSG_INFO, __func__, 2884 "Failed to load private key"); 2885 os_free(passwd); 2886 return -1; 2887 } 2888 ERR_clear_error(); 2889 SSL_CTX_set_default_passwd_cb(ssl_ctx, NULL); 2890 os_free(passwd); 2891 2892 if (!SSL_check_private_key(conn->ssl)) { 2893 tls_show_errors(MSG_INFO, __func__, "Private key failed " 2894 "verification"); 2895 return -1; 2896 } 2897 2898 wpa_printf(MSG_DEBUG, "SSL: Private key loaded successfully"); 2899 return 0; 2900 } 2901 2902 2903 static int tls_global_private_key(struct tls_data *data, 2904 const char *private_key, 2905 const char *private_key_passwd) 2906 { 2907 SSL_CTX *ssl_ctx = data->ssl; 2908 char *passwd; 2909 2910 if (private_key == NULL) 2911 return 0; 2912 2913 if (private_key_passwd) { 2914 passwd = os_strdup(private_key_passwd); 2915 if (passwd == NULL) 2916 return -1; 2917 } else 2918 passwd = NULL; 2919 2920 SSL_CTX_set_default_passwd_cb(ssl_ctx, tls_passwd_cb); 2921 SSL_CTX_set_default_passwd_cb_userdata(ssl_ctx, passwd); 2922 if ( 2923 #ifndef OPENSSL_NO_STDIO 2924 SSL_CTX_use_PrivateKey_file(ssl_ctx, private_key, 2925 SSL_FILETYPE_ASN1) != 1 && 2926 SSL_CTX_use_PrivateKey_file(ssl_ctx, private_key, 2927 SSL_FILETYPE_PEM) != 1 && 2928 #endif /* OPENSSL_NO_STDIO */ 2929 tls_read_pkcs12(data, NULL, private_key, passwd)) { 2930 tls_show_errors(MSG_INFO, __func__, 2931 "Failed to load private key"); 2932 os_free(passwd); 2933 ERR_clear_error(); 2934 return -1; 2935 } 2936 os_free(passwd); 2937 ERR_clear_error(); 2938 SSL_CTX_set_default_passwd_cb(ssl_ctx, NULL); 2939 2940 if (!SSL_CTX_check_private_key(ssl_ctx)) { 2941 tls_show_errors(MSG_INFO, __func__, 2942 "Private key failed verification"); 2943 return -1; 2944 } 2945 2946 return 0; 2947 } 2948 2949 2950 static int tls_connection_dh(struct tls_connection *conn, const char *dh_file) 2951 { 2952 #ifdef OPENSSL_NO_DH 2953 if (dh_file == NULL) 2954 return 0; 2955 wpa_printf(MSG_ERROR, "TLS: openssl does not include DH support, but " 2956 "dh_file specified"); 2957 return -1; 2958 #else /* OPENSSL_NO_DH */ 2959 DH *dh; 2960 BIO *bio; 2961 2962 /* TODO: add support for dh_blob */ 2963 if (dh_file == NULL) 2964 return 0; 2965 if (conn == NULL) 2966 return -1; 2967 2968 bio = BIO_new_file(dh_file, "r"); 2969 if (bio == NULL) { 2970 wpa_printf(MSG_INFO, "TLS: Failed to open DH file '%s': %s", 2971 dh_file, ERR_error_string(ERR_get_error(), NULL)); 2972 return -1; 2973 } 2974 dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); 2975 BIO_free(bio); 2976 #ifndef OPENSSL_NO_DSA 2977 while (dh == NULL) { 2978 DSA *dsa; 2979 wpa_printf(MSG_DEBUG, "TLS: Failed to parse DH file '%s': %s -" 2980 " trying to parse as DSA params", dh_file, 2981 ERR_error_string(ERR_get_error(), NULL)); 2982 bio = BIO_new_file(dh_file, "r"); 2983 if (bio == NULL) 2984 break; 2985 dsa = PEM_read_bio_DSAparams(bio, NULL, NULL, NULL); 2986 BIO_free(bio); 2987 if (!dsa) { 2988 wpa_printf(MSG_DEBUG, "TLS: Failed to parse DSA file " 2989 "'%s': %s", dh_file, 2990 ERR_error_string(ERR_get_error(), NULL)); 2991 break; 2992 } 2993 2994 wpa_printf(MSG_DEBUG, "TLS: DH file in DSA param format"); 2995 dh = DSA_dup_DH(dsa); 2996 DSA_free(dsa); 2997 if (dh == NULL) { 2998 wpa_printf(MSG_INFO, "TLS: Failed to convert DSA " 2999 "params into DH params"); 3000 break; 3001 } 3002 break; 3003 } 3004 #endif /* !OPENSSL_NO_DSA */ 3005 if (dh == NULL) { 3006 wpa_printf(MSG_INFO, "TLS: Failed to read/parse DH/DSA file " 3007 "'%s'", dh_file); 3008 return -1; 3009 } 3010 3011 if (SSL_set_tmp_dh(conn->ssl, dh) != 1) { 3012 wpa_printf(MSG_INFO, "TLS: Failed to set DH params from '%s': " 3013 "%s", dh_file, 3014 ERR_error_string(ERR_get_error(), NULL)); 3015 DH_free(dh); 3016 return -1; 3017 } 3018 DH_free(dh); 3019 return 0; 3020 #endif /* OPENSSL_NO_DH */ 3021 } 3022 3023 3024 static int tls_global_dh(struct tls_data *data, const char *dh_file) 3025 { 3026 #ifdef OPENSSL_NO_DH 3027 if (dh_file == NULL) 3028 return 0; 3029 wpa_printf(MSG_ERROR, "TLS: openssl does not include DH support, but " 3030 "dh_file specified"); 3031 return -1; 3032 #else /* OPENSSL_NO_DH */ 3033 SSL_CTX *ssl_ctx = data->ssl; 3034 DH *dh; 3035 BIO *bio; 3036 3037 /* TODO: add support for dh_blob */ 3038 if (dh_file == NULL) 3039 return 0; 3040 if (ssl_ctx == NULL) 3041 return -1; 3042 3043 bio = BIO_new_file(dh_file, "r"); 3044 if (bio == NULL) { 3045 wpa_printf(MSG_INFO, "TLS: Failed to open DH file '%s': %s", 3046 dh_file, ERR_error_string(ERR_get_error(), NULL)); 3047 return -1; 3048 } 3049 dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); 3050 BIO_free(bio); 3051 #ifndef OPENSSL_NO_DSA 3052 while (dh == NULL) { 3053 DSA *dsa; 3054 wpa_printf(MSG_DEBUG, "TLS: Failed to parse DH file '%s': %s -" 3055 " trying to parse as DSA params", dh_file, 3056 ERR_error_string(ERR_get_error(), NULL)); 3057 bio = BIO_new_file(dh_file, "r"); 3058 if (bio == NULL) 3059 break; 3060 dsa = PEM_read_bio_DSAparams(bio, NULL, NULL, NULL); 3061 BIO_free(bio); 3062 if (!dsa) { 3063 wpa_printf(MSG_DEBUG, "TLS: Failed to parse DSA file " 3064 "'%s': %s", dh_file, 3065 ERR_error_string(ERR_get_error(), NULL)); 3066 break; 3067 } 3068 3069 wpa_printf(MSG_DEBUG, "TLS: DH file in DSA param format"); 3070 dh = DSA_dup_DH(dsa); 3071 DSA_free(dsa); 3072 if (dh == NULL) { 3073 wpa_printf(MSG_INFO, "TLS: Failed to convert DSA " 3074 "params into DH params"); 3075 break; 3076 } 3077 break; 3078 } 3079 #endif /* !OPENSSL_NO_DSA */ 3080 if (dh == NULL) { 3081 wpa_printf(MSG_INFO, "TLS: Failed to read/parse DH/DSA file " 3082 "'%s'", dh_file); 3083 return -1; 3084 } 3085 3086 if (SSL_CTX_set_tmp_dh(ssl_ctx, dh) != 1) { 3087 wpa_printf(MSG_INFO, "TLS: Failed to set DH params from '%s': " 3088 "%s", dh_file, 3089 ERR_error_string(ERR_get_error(), NULL)); 3090 DH_free(dh); 3091 return -1; 3092 } 3093 DH_free(dh); 3094 return 0; 3095 #endif /* OPENSSL_NO_DH */ 3096 } 3097 3098 3099 int tls_connection_get_random(void *ssl_ctx, struct tls_connection *conn, 3100 struct tls_random *keys) 3101 { 3102 SSL *ssl; 3103 3104 if (conn == NULL || keys == NULL) 3105 return -1; 3106 ssl = conn->ssl; 3107 if (ssl == NULL) 3108 return -1; 3109 3110 os_memset(keys, 0, sizeof(*keys)); 3111 keys->client_random = conn->client_random; 3112 keys->client_random_len = SSL_get_client_random( 3113 ssl, conn->client_random, sizeof(conn->client_random)); 3114 keys->server_random = conn->server_random; 3115 keys->server_random_len = SSL_get_server_random( 3116 ssl, conn->server_random, sizeof(conn->server_random)); 3117 3118 return 0; 3119 } 3120 3121 3122 #ifdef OPENSSL_NEED_EAP_FAST_PRF 3123 static int openssl_get_keyblock_size(SSL *ssl) 3124 { 3125 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) 3126 const EVP_CIPHER *c; 3127 const EVP_MD *h; 3128 int md_size; 3129 3130 if (ssl->enc_read_ctx == NULL || ssl->enc_read_ctx->cipher == NULL || 3131 ssl->read_hash == NULL) 3132 return -1; 3133 3134 c = ssl->enc_read_ctx->cipher; 3135 h = EVP_MD_CTX_md(ssl->read_hash); 3136 if (h) 3137 md_size = EVP_MD_size(h); 3138 else if (ssl->s3) 3139 md_size = ssl->s3->tmp.new_mac_secret_size; 3140 else 3141 return -1; 3142 3143 wpa_printf(MSG_DEBUG, "OpenSSL: keyblock size: key_len=%d MD_size=%d " 3144 "IV_len=%d", EVP_CIPHER_key_length(c), md_size, 3145 EVP_CIPHER_iv_length(c)); 3146 return 2 * (EVP_CIPHER_key_length(c) + 3147 md_size + 3148 EVP_CIPHER_iv_length(c)); 3149 #else 3150 const SSL_CIPHER *ssl_cipher; 3151 int cipher, digest; 3152 const EVP_CIPHER *c; 3153 const EVP_MD *h; 3154 3155 ssl_cipher = SSL_get_current_cipher(ssl); 3156 if (!ssl_cipher) 3157 return -1; 3158 cipher = SSL_CIPHER_get_cipher_nid(ssl_cipher); 3159 digest = SSL_CIPHER_get_digest_nid(ssl_cipher); 3160 wpa_printf(MSG_DEBUG, "OpenSSL: cipher nid %d digest nid %d", 3161 cipher, digest); 3162 if (cipher < 0 || digest < 0) 3163 return -1; 3164 c = EVP_get_cipherbynid(cipher); 3165 h = EVP_get_digestbynid(digest); 3166 if (!c || !h) 3167 return -1; 3168 3169 wpa_printf(MSG_DEBUG, 3170 "OpenSSL: keyblock size: key_len=%d MD_size=%d IV_len=%d", 3171 EVP_CIPHER_key_length(c), EVP_MD_size(h), 3172 EVP_CIPHER_iv_length(c)); 3173 return 2 * (EVP_CIPHER_key_length(c) + EVP_MD_size(h) + 3174 EVP_CIPHER_iv_length(c)); 3175 #endif 3176 } 3177 #endif /* OPENSSL_NEED_EAP_FAST_PRF */ 3178 3179 3180 int tls_connection_export_key(void *tls_ctx, struct tls_connection *conn, 3181 const char *label, u8 *out, size_t out_len) 3182 { 3183 if (!conn || 3184 SSL_export_keying_material(conn->ssl, out, out_len, label, 3185 os_strlen(label), NULL, 0, 0) != 1) 3186 return -1; 3187 return 0; 3188 } 3189 3190 3191 int tls_connection_get_eap_fast_key(void *tls_ctx, struct tls_connection *conn, 3192 u8 *out, size_t out_len) 3193 { 3194 #ifdef OPENSSL_NEED_EAP_FAST_PRF 3195 SSL *ssl; 3196 SSL_SESSION *sess; 3197 u8 *rnd; 3198 int ret = -1; 3199 int skip = 0; 3200 u8 *tmp_out = NULL; 3201 u8 *_out = out; 3202 unsigned char client_random[SSL3_RANDOM_SIZE]; 3203 unsigned char server_random[SSL3_RANDOM_SIZE]; 3204 unsigned char master_key[64]; 3205 size_t master_key_len; 3206 const char *ver; 3207 3208 /* 3209 * TLS library did not support EAP-FAST key generation, so get the 3210 * needed TLS session parameters and use an internal implementation of 3211 * TLS PRF to derive the key. 3212 */ 3213 3214 if (conn == NULL) 3215 return -1; 3216 ssl = conn->ssl; 3217 if (ssl == NULL) 3218 return -1; 3219 ver = SSL_get_version(ssl); 3220 sess = SSL_get_session(ssl); 3221 if (!ver || !sess) 3222 return -1; 3223 3224 skip = openssl_get_keyblock_size(ssl); 3225 if (skip < 0) 3226 return -1; 3227 tmp_out = os_malloc(skip + out_len); 3228 if (!tmp_out) 3229 return -1; 3230 _out = tmp_out; 3231 3232 rnd = os_malloc(2 * SSL3_RANDOM_SIZE); 3233 if (!rnd) { 3234 os_free(tmp_out); 3235 return -1; 3236 } 3237 3238 SSL_get_client_random(ssl, client_random, sizeof(client_random)); 3239 SSL_get_server_random(ssl, server_random, sizeof(server_random)); 3240 master_key_len = SSL_SESSION_get_master_key(sess, master_key, 3241 sizeof(master_key)); 3242 3243 os_memcpy(rnd, server_random, SSL3_RANDOM_SIZE); 3244 os_memcpy(rnd + SSL3_RANDOM_SIZE, client_random, SSL3_RANDOM_SIZE); 3245 3246 if (os_strcmp(ver, "TLSv1.2") == 0) { 3247 tls_prf_sha256(master_key, master_key_len, 3248 "key expansion", rnd, 2 * SSL3_RANDOM_SIZE, 3249 _out, skip + out_len); 3250 ret = 0; 3251 } else if (tls_prf_sha1_md5(master_key, master_key_len, 3252 "key expansion", rnd, 2 * SSL3_RANDOM_SIZE, 3253 _out, skip + out_len) == 0) { 3254 ret = 0; 3255 } 3256 os_memset(master_key, 0, sizeof(master_key)); 3257 os_free(rnd); 3258 if (ret == 0) 3259 os_memcpy(out, _out + skip, out_len); 3260 bin_clear_free(tmp_out, skip); 3261 3262 return ret; 3263 #else /* OPENSSL_NEED_EAP_FAST_PRF */ 3264 wpa_printf(MSG_ERROR, 3265 "OpenSSL: EAP-FAST keys cannot be exported in FIPS mode"); 3266 return -1; 3267 #endif /* OPENSSL_NEED_EAP_FAST_PRF */ 3268 } 3269 3270 3271 static struct wpabuf * 3272 openssl_handshake(struct tls_connection *conn, const struct wpabuf *in_data, 3273 int server) 3274 { 3275 int res; 3276 struct wpabuf *out_data; 3277 3278 /* 3279 * Give TLS handshake data from the server (if available) to OpenSSL 3280 * for processing. 3281 */ 3282 if (in_data && wpabuf_len(in_data) > 0 && 3283 BIO_write(conn->ssl_in, wpabuf_head(in_data), wpabuf_len(in_data)) 3284 < 0) { 3285 tls_show_errors(MSG_INFO, __func__, 3286 "Handshake failed - BIO_write"); 3287 return NULL; 3288 } 3289 3290 /* Initiate TLS handshake or continue the existing handshake */ 3291 if (server) 3292 res = SSL_accept(conn->ssl); 3293 else 3294 res = SSL_connect(conn->ssl); 3295 if (res != 1) { 3296 int err = SSL_get_error(conn->ssl, res); 3297 if (err == SSL_ERROR_WANT_READ) 3298 wpa_printf(MSG_DEBUG, "SSL: SSL_connect - want " 3299 "more data"); 3300 else if (err == SSL_ERROR_WANT_WRITE) 3301 wpa_printf(MSG_DEBUG, "SSL: SSL_connect - want to " 3302 "write"); 3303 else { 3304 tls_show_errors(MSG_INFO, __func__, "SSL_connect"); 3305 conn->failed++; 3306 } 3307 } 3308 3309 /* Get the TLS handshake data to be sent to the server */ 3310 res = BIO_ctrl_pending(conn->ssl_out); 3311 wpa_printf(MSG_DEBUG, "SSL: %d bytes pending from ssl_out", res); 3312 out_data = wpabuf_alloc(res); 3313 if (out_data == NULL) { 3314 wpa_printf(MSG_DEBUG, "SSL: Failed to allocate memory for " 3315 "handshake output (%d bytes)", res); 3316 if (BIO_reset(conn->ssl_out) < 0) { 3317 tls_show_errors(MSG_INFO, __func__, 3318 "BIO_reset failed"); 3319 } 3320 return NULL; 3321 } 3322 res = res == 0 ? 0 : BIO_read(conn->ssl_out, wpabuf_mhead(out_data), 3323 res); 3324 if (res < 0) { 3325 tls_show_errors(MSG_INFO, __func__, 3326 "Handshake failed - BIO_read"); 3327 if (BIO_reset(conn->ssl_out) < 0) { 3328 tls_show_errors(MSG_INFO, __func__, 3329 "BIO_reset failed"); 3330 } 3331 wpabuf_free(out_data); 3332 return NULL; 3333 } 3334 wpabuf_put(out_data, res); 3335 3336 return out_data; 3337 } 3338 3339 3340 static struct wpabuf * 3341 openssl_get_appl_data(struct tls_connection *conn, size_t max_len) 3342 { 3343 struct wpabuf *appl_data; 3344 int res; 3345 3346 appl_data = wpabuf_alloc(max_len + 100); 3347 if (appl_data == NULL) 3348 return NULL; 3349 3350 res = SSL_read(conn->ssl, wpabuf_mhead(appl_data), 3351 wpabuf_size(appl_data)); 3352 if (res < 0) { 3353 int err = SSL_get_error(conn->ssl, res); 3354 if (err == SSL_ERROR_WANT_READ || 3355 err == SSL_ERROR_WANT_WRITE) { 3356 wpa_printf(MSG_DEBUG, "SSL: No Application Data " 3357 "included"); 3358 } else { 3359 tls_show_errors(MSG_INFO, __func__, 3360 "Failed to read possible " 3361 "Application Data"); 3362 } 3363 wpabuf_free(appl_data); 3364 return NULL; 3365 } 3366 3367 wpabuf_put(appl_data, res); 3368 wpa_hexdump_buf_key(MSG_MSGDUMP, "SSL: Application Data in Finished " 3369 "message", appl_data); 3370 3371 return appl_data; 3372 } 3373 3374 3375 static struct wpabuf * 3376 openssl_connection_handshake(struct tls_connection *conn, 3377 const struct wpabuf *in_data, 3378 struct wpabuf **appl_data, int server) 3379 { 3380 struct wpabuf *out_data; 3381 3382 if (appl_data) 3383 *appl_data = NULL; 3384 3385 out_data = openssl_handshake(conn, in_data, server); 3386 if (out_data == NULL) 3387 return NULL; 3388 if (conn->invalid_hb_used) { 3389 wpa_printf(MSG_INFO, "TLS: Heartbeat attack detected - do not send response"); 3390 wpabuf_free(out_data); 3391 return NULL; 3392 } 3393 3394 if (SSL_is_init_finished(conn->ssl)) { 3395 wpa_printf(MSG_DEBUG, 3396 "OpenSSL: Handshake finished - resumed=%d", 3397 tls_connection_resumed(conn->ssl_ctx, conn)); 3398 if (appl_data && in_data) 3399 *appl_data = openssl_get_appl_data(conn, 3400 wpabuf_len(in_data)); 3401 } 3402 3403 if (conn->invalid_hb_used) { 3404 wpa_printf(MSG_INFO, "TLS: Heartbeat attack detected - do not send response"); 3405 if (appl_data) { 3406 wpabuf_free(*appl_data); 3407 *appl_data = NULL; 3408 } 3409 wpabuf_free(out_data); 3410 return NULL; 3411 } 3412 3413 return out_data; 3414 } 3415 3416 3417 struct wpabuf * 3418 tls_connection_handshake(void *ssl_ctx, struct tls_connection *conn, 3419 const struct wpabuf *in_data, 3420 struct wpabuf **appl_data) 3421 { 3422 return openssl_connection_handshake(conn, in_data, appl_data, 0); 3423 } 3424 3425 3426 struct wpabuf * tls_connection_server_handshake(void *tls_ctx, 3427 struct tls_connection *conn, 3428 const struct wpabuf *in_data, 3429 struct wpabuf **appl_data) 3430 { 3431 return openssl_connection_handshake(conn, in_data, appl_data, 1); 3432 } 3433 3434 3435 struct wpabuf * tls_connection_encrypt(void *tls_ctx, 3436 struct tls_connection *conn, 3437 const struct wpabuf *in_data) 3438 { 3439 int res; 3440 struct wpabuf *buf; 3441 3442 if (conn == NULL) 3443 return NULL; 3444 3445 /* Give plaintext data for OpenSSL to encrypt into the TLS tunnel. */ 3446 if ((res = BIO_reset(conn->ssl_in)) < 0 || 3447 (res = BIO_reset(conn->ssl_out)) < 0) { 3448 tls_show_errors(MSG_INFO, __func__, "BIO_reset failed"); 3449 return NULL; 3450 } 3451 res = SSL_write(conn->ssl, wpabuf_head(in_data), wpabuf_len(in_data)); 3452 if (res < 0) { 3453 tls_show_errors(MSG_INFO, __func__, 3454 "Encryption failed - SSL_write"); 3455 return NULL; 3456 } 3457 3458 /* Read encrypted data to be sent to the server */ 3459 buf = wpabuf_alloc(wpabuf_len(in_data) + 300); 3460 if (buf == NULL) 3461 return NULL; 3462 res = BIO_read(conn->ssl_out, wpabuf_mhead(buf), wpabuf_size(buf)); 3463 if (res < 0) { 3464 tls_show_errors(MSG_INFO, __func__, 3465 "Encryption failed - BIO_read"); 3466 wpabuf_free(buf); 3467 return NULL; 3468 } 3469 wpabuf_put(buf, res); 3470 3471 return buf; 3472 } 3473 3474 3475 struct wpabuf * tls_connection_decrypt(void *tls_ctx, 3476 struct tls_connection *conn, 3477 const struct wpabuf *in_data) 3478 { 3479 int res; 3480 struct wpabuf *buf; 3481 3482 /* Give encrypted data from TLS tunnel for OpenSSL to decrypt. */ 3483 res = BIO_write(conn->ssl_in, wpabuf_head(in_data), 3484 wpabuf_len(in_data)); 3485 if (res < 0) { 3486 tls_show_errors(MSG_INFO, __func__, 3487 "Decryption failed - BIO_write"); 3488 return NULL; 3489 } 3490 if (BIO_reset(conn->ssl_out) < 0) { 3491 tls_show_errors(MSG_INFO, __func__, "BIO_reset failed"); 3492 return NULL; 3493 } 3494 3495 /* Read decrypted data for further processing */ 3496 /* 3497 * Even though we try to disable TLS compression, it is possible that 3498 * this cannot be done with all TLS libraries. Add extra buffer space 3499 * to handle the possibility of the decrypted data being longer than 3500 * input data. 3501 */ 3502 buf = wpabuf_alloc((wpabuf_len(in_data) + 500) * 3); 3503 if (buf == NULL) 3504 return NULL; 3505 res = SSL_read(conn->ssl, wpabuf_mhead(buf), wpabuf_size(buf)); 3506 if (res < 0) { 3507 tls_show_errors(MSG_INFO, __func__, 3508 "Decryption failed - SSL_read"); 3509 wpabuf_free(buf); 3510 return NULL; 3511 } 3512 wpabuf_put(buf, res); 3513 3514 if (conn->invalid_hb_used) { 3515 wpa_printf(MSG_INFO, "TLS: Heartbeat attack detected - do not send response"); 3516 wpabuf_free(buf); 3517 return NULL; 3518 } 3519 3520 return buf; 3521 } 3522 3523 3524 int tls_connection_resumed(void *ssl_ctx, struct tls_connection *conn) 3525 { 3526 return conn ? SSL_cache_hit(conn->ssl) : 0; 3527 } 3528 3529 3530 int tls_connection_set_cipher_list(void *tls_ctx, struct tls_connection *conn, 3531 u8 *ciphers) 3532 { 3533 char buf[500], *pos, *end; 3534 u8 *c; 3535 int ret; 3536 3537 if (conn == NULL || conn->ssl == NULL || ciphers == NULL) 3538 return -1; 3539 3540 buf[0] = '\0'; 3541 pos = buf; 3542 end = pos + sizeof(buf); 3543 3544 c = ciphers; 3545 while (*c != TLS_CIPHER_NONE) { 3546 const char *suite; 3547 3548 switch (*c) { 3549 case TLS_CIPHER_RC4_SHA: 3550 suite = "RC4-SHA"; 3551 break; 3552 case TLS_CIPHER_AES128_SHA: 3553 suite = "AES128-SHA"; 3554 break; 3555 case TLS_CIPHER_RSA_DHE_AES128_SHA: 3556 suite = "DHE-RSA-AES128-SHA"; 3557 break; 3558 case TLS_CIPHER_ANON_DH_AES128_SHA: 3559 suite = "ADH-AES128-SHA"; 3560 break; 3561 case TLS_CIPHER_RSA_DHE_AES256_SHA: 3562 suite = "DHE-RSA-AES256-SHA"; 3563 break; 3564 case TLS_CIPHER_AES256_SHA: 3565 suite = "AES256-SHA"; 3566 break; 3567 default: 3568 wpa_printf(MSG_DEBUG, "TLS: Unsupported " 3569 "cipher selection: %d", *c); 3570 return -1; 3571 } 3572 ret = os_snprintf(pos, end - pos, ":%s", suite); 3573 if (os_snprintf_error(end - pos, ret)) 3574 break; 3575 pos += ret; 3576 3577 c++; 3578 } 3579 3580 wpa_printf(MSG_DEBUG, "OpenSSL: cipher suites: %s", buf + 1); 3581 3582 #if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER) 3583 #if defined(EAP_FAST) || defined(EAP_FAST_DYNAMIC) || defined(EAP_SERVER_FAST) 3584 if (os_strstr(buf, ":ADH-")) { 3585 /* 3586 * Need to drop to security level 0 to allow anonymous 3587 * cipher suites for EAP-FAST. 3588 */ 3589 SSL_set_security_level(conn->ssl, 0); 3590 } else if (SSL_get_security_level(conn->ssl) == 0) { 3591 /* Force at least security level 1 */ 3592 SSL_set_security_level(conn->ssl, 1); 3593 } 3594 #endif /* EAP_FAST || EAP_FAST_DYNAMIC || EAP_SERVER_FAST */ 3595 #endif 3596 3597 if (SSL_set_cipher_list(conn->ssl, buf + 1) != 1) { 3598 tls_show_errors(MSG_INFO, __func__, 3599 "Cipher suite configuration failed"); 3600 return -1; 3601 } 3602 3603 return 0; 3604 } 3605 3606 3607 int tls_get_version(void *ssl_ctx, struct tls_connection *conn, 3608 char *buf, size_t buflen) 3609 { 3610 const char *name; 3611 if (conn == NULL || conn->ssl == NULL) 3612 return -1; 3613 3614 name = SSL_get_version(conn->ssl); 3615 if (name == NULL) 3616 return -1; 3617 3618 os_strlcpy(buf, name, buflen); 3619 return 0; 3620 } 3621 3622 3623 int tls_get_cipher(void *ssl_ctx, struct tls_connection *conn, 3624 char *buf, size_t buflen) 3625 { 3626 const char *name; 3627 if (conn == NULL || conn->ssl == NULL) 3628 return -1; 3629 3630 name = SSL_get_cipher(conn->ssl); 3631 if (name == NULL) 3632 return -1; 3633 3634 os_strlcpy(buf, name, buflen); 3635 return 0; 3636 } 3637 3638 3639 int tls_connection_enable_workaround(void *ssl_ctx, 3640 struct tls_connection *conn) 3641 { 3642 SSL_set_options(conn->ssl, SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS); 3643 3644 return 0; 3645 } 3646 3647 3648 #if defined(EAP_FAST) || defined(EAP_FAST_DYNAMIC) || defined(EAP_SERVER_FAST) 3649 /* ClientHello TLS extensions require a patch to openssl, so this function is 3650 * commented out unless explicitly needed for EAP-FAST in order to be able to 3651 * build this file with unmodified openssl. */ 3652 int tls_connection_client_hello_ext(void *ssl_ctx, struct tls_connection *conn, 3653 int ext_type, const u8 *data, 3654 size_t data_len) 3655 { 3656 if (conn == NULL || conn->ssl == NULL || ext_type != 35) 3657 return -1; 3658 3659 if (SSL_set_session_ticket_ext(conn->ssl, (void *) data, 3660 data_len) != 1) 3661 return -1; 3662 3663 return 0; 3664 } 3665 #endif /* EAP_FAST || EAP_FAST_DYNAMIC || EAP_SERVER_FAST */ 3666 3667 3668 int tls_connection_get_failed(void *ssl_ctx, struct tls_connection *conn) 3669 { 3670 if (conn == NULL) 3671 return -1; 3672 return conn->failed; 3673 } 3674 3675 3676 int tls_connection_get_read_alerts(void *ssl_ctx, struct tls_connection *conn) 3677 { 3678 if (conn == NULL) 3679 return -1; 3680 return conn->read_alerts; 3681 } 3682 3683 3684 int tls_connection_get_write_alerts(void *ssl_ctx, struct tls_connection *conn) 3685 { 3686 if (conn == NULL) 3687 return -1; 3688 return conn->write_alerts; 3689 } 3690 3691 3692 #ifdef HAVE_OCSP 3693 3694 static void ocsp_debug_print_resp(OCSP_RESPONSE *rsp) 3695 { 3696 #ifndef CONFIG_NO_STDOUT_DEBUG 3697 BIO *out; 3698 size_t rlen; 3699 char *txt; 3700 int res; 3701 3702 if (wpa_debug_level > MSG_DEBUG) 3703 return; 3704 3705 out = BIO_new(BIO_s_mem()); 3706 if (!out) 3707 return; 3708 3709 OCSP_RESPONSE_print(out, rsp, 0); 3710 rlen = BIO_ctrl_pending(out); 3711 txt = os_malloc(rlen + 1); 3712 if (!txt) { 3713 BIO_free(out); 3714 return; 3715 } 3716 3717 res = BIO_read(out, txt, rlen); 3718 if (res > 0) { 3719 txt[res] = '\0'; 3720 wpa_printf(MSG_DEBUG, "OpenSSL: OCSP Response\n%s", txt); 3721 } 3722 os_free(txt); 3723 BIO_free(out); 3724 #endif /* CONFIG_NO_STDOUT_DEBUG */ 3725 } 3726 3727 3728 static void debug_print_cert(X509 *cert, const char *title) 3729 { 3730 #ifndef CONFIG_NO_STDOUT_DEBUG 3731 BIO *out; 3732 size_t rlen; 3733 char *txt; 3734 int res; 3735 3736 if (wpa_debug_level > MSG_DEBUG) 3737 return; 3738 3739 out = BIO_new(BIO_s_mem()); 3740 if (!out) 3741 return; 3742 3743 X509_print(out, cert); 3744 rlen = BIO_ctrl_pending(out); 3745 txt = os_malloc(rlen + 1); 3746 if (!txt) { 3747 BIO_free(out); 3748 return; 3749 } 3750 3751 res = BIO_read(out, txt, rlen); 3752 if (res > 0) { 3753 txt[res] = '\0'; 3754 wpa_printf(MSG_DEBUG, "OpenSSL: %s\n%s", title, txt); 3755 } 3756 os_free(txt); 3757 3758 BIO_free(out); 3759 #endif /* CONFIG_NO_STDOUT_DEBUG */ 3760 } 3761 3762 3763 static int ocsp_resp_cb(SSL *s, void *arg) 3764 { 3765 struct tls_connection *conn = arg; 3766 const unsigned char *p; 3767 int len, status, reason; 3768 OCSP_RESPONSE *rsp; 3769 OCSP_BASICRESP *basic; 3770 OCSP_CERTID *id; 3771 ASN1_GENERALIZEDTIME *produced_at, *this_update, *next_update; 3772 X509_STORE *store; 3773 STACK_OF(X509) *certs = NULL; 3774 3775 len = SSL_get_tlsext_status_ocsp_resp(s, &p); 3776 if (!p) { 3777 wpa_printf(MSG_DEBUG, "OpenSSL: No OCSP response received"); 3778 return (conn->flags & TLS_CONN_REQUIRE_OCSP) ? 0 : 1; 3779 } 3780 3781 wpa_hexdump(MSG_DEBUG, "OpenSSL: OCSP response", p, len); 3782 3783 rsp = d2i_OCSP_RESPONSE(NULL, &p, len); 3784 if (!rsp) { 3785 wpa_printf(MSG_INFO, "OpenSSL: Failed to parse OCSP response"); 3786 return 0; 3787 } 3788 3789 ocsp_debug_print_resp(rsp); 3790 3791 status = OCSP_response_status(rsp); 3792 if (status != OCSP_RESPONSE_STATUS_SUCCESSFUL) { 3793 wpa_printf(MSG_INFO, "OpenSSL: OCSP responder error %d (%s)", 3794 status, OCSP_response_status_str(status)); 3795 return 0; 3796 } 3797 3798 basic = OCSP_response_get1_basic(rsp); 3799 if (!basic) { 3800 wpa_printf(MSG_INFO, "OpenSSL: Could not find BasicOCSPResponse"); 3801 return 0; 3802 } 3803 3804 store = SSL_CTX_get_cert_store(conn->ssl_ctx); 3805 if (conn->peer_issuer) { 3806 debug_print_cert(conn->peer_issuer, "Add OCSP issuer"); 3807 3808 if (X509_STORE_add_cert(store, conn->peer_issuer) != 1) { 3809 tls_show_errors(MSG_INFO, __func__, 3810 "OpenSSL: Could not add issuer to certificate store"); 3811 } 3812 certs = sk_X509_new_null(); 3813 if (certs) { 3814 X509 *cert; 3815 cert = X509_dup(conn->peer_issuer); 3816 if (cert && !sk_X509_push(certs, cert)) { 3817 tls_show_errors( 3818 MSG_INFO, __func__, 3819 "OpenSSL: Could not add issuer to OCSP responder trust store"); 3820 X509_free(cert); 3821 sk_X509_free(certs); 3822 certs = NULL; 3823 } 3824 if (certs && conn->peer_issuer_issuer) { 3825 cert = X509_dup(conn->peer_issuer_issuer); 3826 if (cert && !sk_X509_push(certs, cert)) { 3827 tls_show_errors( 3828 MSG_INFO, __func__, 3829 "OpenSSL: Could not add issuer's issuer to OCSP responder trust store"); 3830 X509_free(cert); 3831 } 3832 } 3833 } 3834 } 3835 3836 status = OCSP_basic_verify(basic, certs, store, OCSP_TRUSTOTHER); 3837 sk_X509_pop_free(certs, X509_free); 3838 if (status <= 0) { 3839 tls_show_errors(MSG_INFO, __func__, 3840 "OpenSSL: OCSP response failed verification"); 3841 OCSP_BASICRESP_free(basic); 3842 OCSP_RESPONSE_free(rsp); 3843 return 0; 3844 } 3845 3846 wpa_printf(MSG_DEBUG, "OpenSSL: OCSP response verification succeeded"); 3847 3848 if (!conn->peer_cert) { 3849 wpa_printf(MSG_DEBUG, "OpenSSL: Peer certificate not available for OCSP status check"); 3850 OCSP_BASICRESP_free(basic); 3851 OCSP_RESPONSE_free(rsp); 3852 return 0; 3853 } 3854 3855 if (!conn->peer_issuer) { 3856 wpa_printf(MSG_DEBUG, "OpenSSL: Peer issuer certificate not available for OCSP status check"); 3857 OCSP_BASICRESP_free(basic); 3858 OCSP_RESPONSE_free(rsp); 3859 return 0; 3860 } 3861 3862 id = OCSP_cert_to_id(NULL, conn->peer_cert, conn->peer_issuer); 3863 if (!id) { 3864 wpa_printf(MSG_DEBUG, "OpenSSL: Could not create OCSP certificate identifier"); 3865 OCSP_BASICRESP_free(basic); 3866 OCSP_RESPONSE_free(rsp); 3867 return 0; 3868 } 3869 3870 if (!OCSP_resp_find_status(basic, id, &status, &reason, &produced_at, 3871 &this_update, &next_update)) { 3872 wpa_printf(MSG_INFO, "OpenSSL: Could not find current server certificate from OCSP response%s", 3873 (conn->flags & TLS_CONN_REQUIRE_OCSP) ? "" : 3874 " (OCSP not required)"); 3875 OCSP_CERTID_free(id); 3876 OCSP_BASICRESP_free(basic); 3877 OCSP_RESPONSE_free(rsp); 3878 return (conn->flags & TLS_CONN_REQUIRE_OCSP) ? 0 : 1; 3879 } 3880 OCSP_CERTID_free(id); 3881 3882 if (!OCSP_check_validity(this_update, next_update, 5 * 60, -1)) { 3883 tls_show_errors(MSG_INFO, __func__, 3884 "OpenSSL: OCSP status times invalid"); 3885 OCSP_BASICRESP_free(basic); 3886 OCSP_RESPONSE_free(rsp); 3887 return 0; 3888 } 3889 3890 OCSP_BASICRESP_free(basic); 3891 OCSP_RESPONSE_free(rsp); 3892 3893 wpa_printf(MSG_DEBUG, "OpenSSL: OCSP status for server certificate: %s", 3894 OCSP_cert_status_str(status)); 3895 3896 if (status == V_OCSP_CERTSTATUS_GOOD) 3897 return 1; 3898 if (status == V_OCSP_CERTSTATUS_REVOKED) 3899 return 0; 3900 if (conn->flags & TLS_CONN_REQUIRE_OCSP) { 3901 wpa_printf(MSG_DEBUG, "OpenSSL: OCSP status unknown, but OCSP required"); 3902 return 0; 3903 } 3904 wpa_printf(MSG_DEBUG, "OpenSSL: OCSP status unknown, but OCSP was not required, so allow connection to continue"); 3905 return 1; 3906 } 3907 3908 3909 static int ocsp_status_cb(SSL *s, void *arg) 3910 { 3911 char *tmp; 3912 char *resp; 3913 size_t len; 3914 3915 if (tls_global->ocsp_stapling_response == NULL) { 3916 wpa_printf(MSG_DEBUG, "OpenSSL: OCSP status callback - no response configured"); 3917 return SSL_TLSEXT_ERR_OK; 3918 } 3919 3920 resp = os_readfile(tls_global->ocsp_stapling_response, &len); 3921 if (resp == NULL) { 3922 wpa_printf(MSG_DEBUG, "OpenSSL: OCSP status callback - could not read response file"); 3923 /* TODO: Build OCSPResponse with responseStatus = internalError 3924 */ 3925 return SSL_TLSEXT_ERR_OK; 3926 } 3927 wpa_printf(MSG_DEBUG, "OpenSSL: OCSP status callback - send cached response"); 3928 tmp = OPENSSL_malloc(len); 3929 if (tmp == NULL) { 3930 os_free(resp); 3931 return SSL_TLSEXT_ERR_ALERT_FATAL; 3932 } 3933 3934 os_memcpy(tmp, resp, len); 3935 os_free(resp); 3936 SSL_set_tlsext_status_ocsp_resp(s, tmp, len); 3937 3938 return SSL_TLSEXT_ERR_OK; 3939 } 3940 3941 #endif /* HAVE_OCSP */ 3942 3943 3944 int tls_connection_set_params(void *tls_ctx, struct tls_connection *conn, 3945 const struct tls_connection_params *params) 3946 { 3947 struct tls_data *data = tls_ctx; 3948 int ret; 3949 unsigned long err; 3950 int can_pkcs11 = 0; 3951 const char *key_id = params->key_id; 3952 const char *cert_id = params->cert_id; 3953 const char *ca_cert_id = params->ca_cert_id; 3954 const char *engine_id = params->engine ? params->engine_id : NULL; 3955 3956 if (conn == NULL) 3957 return -1; 3958 3959 if (params->flags & TLS_CONN_REQUIRE_OCSP_ALL) { 3960 wpa_printf(MSG_INFO, 3961 "OpenSSL: ocsp=3 not supported"); 3962 return -1; 3963 } 3964 3965 /* 3966 * If the engine isn't explicitly configured, and any of the 3967 * cert/key fields are actually PKCS#11 URIs, then automatically 3968 * use the PKCS#11 ENGINE. 3969 */ 3970 if (!engine_id || os_strcmp(engine_id, "pkcs11") == 0) 3971 can_pkcs11 = 1; 3972 3973 if (!key_id && params->private_key && can_pkcs11 && 3974 os_strncmp(params->private_key, "pkcs11:", 7) == 0) { 3975 can_pkcs11 = 2; 3976 key_id = params->private_key; 3977 } 3978 3979 if (!cert_id && params->client_cert && can_pkcs11 && 3980 os_strncmp(params->client_cert, "pkcs11:", 7) == 0) { 3981 can_pkcs11 = 2; 3982 cert_id = params->client_cert; 3983 } 3984 3985 if (!ca_cert_id && params->ca_cert && can_pkcs11 && 3986 os_strncmp(params->ca_cert, "pkcs11:", 7) == 0) { 3987 can_pkcs11 = 2; 3988 ca_cert_id = params->ca_cert; 3989 } 3990 3991 /* If we need to automatically enable the PKCS#11 ENGINE, do so. */ 3992 if (can_pkcs11 == 2 && !engine_id) 3993 engine_id = "pkcs11"; 3994 3995 #if defined(EAP_FAST) || defined(EAP_FAST_DYNAMIC) || defined(EAP_SERVER_FAST) 3996 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) 3997 if (params->flags & TLS_CONN_EAP_FAST) { 3998 wpa_printf(MSG_DEBUG, 3999 "OpenSSL: Use TLSv1_method() for EAP-FAST"); 4000 if (SSL_set_ssl_method(conn->ssl, TLSv1_method()) != 1) { 4001 tls_show_errors(MSG_INFO, __func__, 4002 "Failed to set TLSv1_method() for EAP-FAST"); 4003 return -1; 4004 } 4005 } 4006 #endif 4007 #endif /* EAP_FAST || EAP_FAST_DYNAMIC || EAP_SERVER_FAST */ 4008 4009 while ((err = ERR_get_error())) { 4010 wpa_printf(MSG_INFO, "%s: Clearing pending SSL error: %s", 4011 __func__, ERR_error_string(err, NULL)); 4012 } 4013 4014 if (engine_id) { 4015 wpa_printf(MSG_DEBUG, "SSL: Initializing TLS engine"); 4016 ret = tls_engine_init(conn, engine_id, params->pin, 4017 key_id, cert_id, ca_cert_id); 4018 if (ret) 4019 return ret; 4020 } 4021 if (tls_connection_set_subject_match(conn, 4022 params->subject_match, 4023 params->altsubject_match, 4024 params->suffix_match, 4025 params->domain_match)) 4026 return -1; 4027 4028 if (engine_id && ca_cert_id) { 4029 if (tls_connection_engine_ca_cert(data, conn, ca_cert_id)) 4030 return TLS_SET_PARAMS_ENGINE_PRV_VERIFY_FAILED; 4031 } else if (tls_connection_ca_cert(data, conn, params->ca_cert, 4032 params->ca_cert_blob, 4033 params->ca_cert_blob_len, 4034 params->ca_path)) 4035 return -1; 4036 4037 if (engine_id && cert_id) { 4038 if (tls_connection_engine_client_cert(conn, cert_id)) 4039 return TLS_SET_PARAMS_ENGINE_PRV_VERIFY_FAILED; 4040 } else if (tls_connection_client_cert(conn, params->client_cert, 4041 params->client_cert_blob, 4042 params->client_cert_blob_len)) 4043 return -1; 4044 4045 if (engine_id && key_id) { 4046 wpa_printf(MSG_DEBUG, "TLS: Using private key from engine"); 4047 if (tls_connection_engine_private_key(conn)) 4048 return TLS_SET_PARAMS_ENGINE_PRV_VERIFY_FAILED; 4049 } else if (tls_connection_private_key(data, conn, 4050 params->private_key, 4051 params->private_key_passwd, 4052 params->private_key_blob, 4053 params->private_key_blob_len)) { 4054 wpa_printf(MSG_INFO, "TLS: Failed to load private key '%s'", 4055 params->private_key); 4056 return -1; 4057 } 4058 4059 if (tls_connection_dh(conn, params->dh_file)) { 4060 wpa_printf(MSG_INFO, "TLS: Failed to load DH file '%s'", 4061 params->dh_file); 4062 return -1; 4063 } 4064 4065 if (params->openssl_ciphers && 4066 SSL_set_cipher_list(conn->ssl, params->openssl_ciphers) != 1) { 4067 wpa_printf(MSG_INFO, 4068 "OpenSSL: Failed to set cipher string '%s'", 4069 params->openssl_ciphers); 4070 return -1; 4071 } 4072 4073 tls_set_conn_flags(conn->ssl, params->flags); 4074 4075 #ifdef OPENSSL_IS_BORINGSSL 4076 if (params->flags & TLS_CONN_REQUEST_OCSP) { 4077 SSL_enable_ocsp_stapling(conn->ssl); 4078 } 4079 #else /* OPENSSL_IS_BORINGSSL */ 4080 #ifdef HAVE_OCSP 4081 if (params->flags & TLS_CONN_REQUEST_OCSP) { 4082 SSL_CTX *ssl_ctx = data->ssl; 4083 SSL_set_tlsext_status_type(conn->ssl, TLSEXT_STATUSTYPE_ocsp); 4084 SSL_CTX_set_tlsext_status_cb(ssl_ctx, ocsp_resp_cb); 4085 SSL_CTX_set_tlsext_status_arg(ssl_ctx, conn); 4086 } 4087 #else /* HAVE_OCSP */ 4088 if (params->flags & TLS_CONN_REQUIRE_OCSP) { 4089 wpa_printf(MSG_INFO, 4090 "OpenSSL: No OCSP support included - reject configuration"); 4091 return -1; 4092 } 4093 if (params->flags & TLS_CONN_REQUEST_OCSP) { 4094 wpa_printf(MSG_DEBUG, 4095 "OpenSSL: No OCSP support included - allow optional OCSP case to continue"); 4096 } 4097 #endif /* HAVE_OCSP */ 4098 #endif /* OPENSSL_IS_BORINGSSL */ 4099 4100 conn->flags = params->flags; 4101 4102 tls_get_errors(data); 4103 4104 return 0; 4105 } 4106 4107 4108 int tls_global_set_params(void *tls_ctx, 4109 const struct tls_connection_params *params) 4110 { 4111 struct tls_data *data = tls_ctx; 4112 SSL_CTX *ssl_ctx = data->ssl; 4113 unsigned long err; 4114 4115 while ((err = ERR_get_error())) { 4116 wpa_printf(MSG_INFO, "%s: Clearing pending SSL error: %s", 4117 __func__, ERR_error_string(err, NULL)); 4118 } 4119 4120 if (tls_global_ca_cert(data, params->ca_cert) || 4121 tls_global_client_cert(data, params->client_cert) || 4122 tls_global_private_key(data, params->private_key, 4123 params->private_key_passwd) || 4124 tls_global_dh(data, params->dh_file)) { 4125 wpa_printf(MSG_INFO, "TLS: Failed to set global parameters"); 4126 return -1; 4127 } 4128 4129 if (params->openssl_ciphers && 4130 SSL_CTX_set_cipher_list(ssl_ctx, params->openssl_ciphers) != 1) { 4131 wpa_printf(MSG_INFO, 4132 "OpenSSL: Failed to set cipher string '%s'", 4133 params->openssl_ciphers); 4134 return -1; 4135 } 4136 4137 #ifdef SSL_OP_NO_TICKET 4138 if (params->flags & TLS_CONN_DISABLE_SESSION_TICKET) 4139 SSL_CTX_set_options(ssl_ctx, SSL_OP_NO_TICKET); 4140 else 4141 SSL_CTX_clear_options(ssl_ctx, SSL_OP_NO_TICKET); 4142 #endif /* SSL_OP_NO_TICKET */ 4143 4144 #ifdef HAVE_OCSP 4145 SSL_CTX_set_tlsext_status_cb(ssl_ctx, ocsp_status_cb); 4146 SSL_CTX_set_tlsext_status_arg(ssl_ctx, ssl_ctx); 4147 os_free(tls_global->ocsp_stapling_response); 4148 if (params->ocsp_stapling_response) 4149 tls_global->ocsp_stapling_response = 4150 os_strdup(params->ocsp_stapling_response); 4151 else 4152 tls_global->ocsp_stapling_response = NULL; 4153 #endif /* HAVE_OCSP */ 4154 4155 return 0; 4156 } 4157 4158 4159 #if defined(EAP_FAST) || defined(EAP_FAST_DYNAMIC) || defined(EAP_SERVER_FAST) 4160 /* Pre-shared secred requires a patch to openssl, so this function is 4161 * commented out unless explicitly needed for EAP-FAST in order to be able to 4162 * build this file with unmodified openssl. */ 4163 4164 #if (defined(OPENSSL_IS_BORINGSSL) || OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) 4165 static int tls_sess_sec_cb(SSL *s, void *secret, int *secret_len, 4166 STACK_OF(SSL_CIPHER) *peer_ciphers, 4167 const SSL_CIPHER **cipher, void *arg) 4168 #else /* OPENSSL_IS_BORINGSSL */ 4169 static int tls_sess_sec_cb(SSL *s, void *secret, int *secret_len, 4170 STACK_OF(SSL_CIPHER) *peer_ciphers, 4171 SSL_CIPHER **cipher, void *arg) 4172 #endif /* OPENSSL_IS_BORINGSSL */ 4173 { 4174 struct tls_connection *conn = arg; 4175 int ret; 4176 4177 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) 4178 if (conn == NULL || conn->session_ticket_cb == NULL) 4179 return 0; 4180 4181 ret = conn->session_ticket_cb(conn->session_ticket_cb_ctx, 4182 conn->session_ticket, 4183 conn->session_ticket_len, 4184 s->s3->client_random, 4185 s->s3->server_random, secret); 4186 #else 4187 unsigned char client_random[SSL3_RANDOM_SIZE]; 4188 unsigned char server_random[SSL3_RANDOM_SIZE]; 4189 4190 if (conn == NULL || conn->session_ticket_cb == NULL) 4191 return 0; 4192 4193 SSL_get_client_random(s, client_random, sizeof(client_random)); 4194 SSL_get_server_random(s, server_random, sizeof(server_random)); 4195 4196 ret = conn->session_ticket_cb(conn->session_ticket_cb_ctx, 4197 conn->session_ticket, 4198 conn->session_ticket_len, 4199 client_random, 4200 server_random, secret); 4201 #endif 4202 4203 os_free(conn->session_ticket); 4204 conn->session_ticket = NULL; 4205 4206 if (ret <= 0) 4207 return 0; 4208 4209 *secret_len = SSL_MAX_MASTER_KEY_LENGTH; 4210 return 1; 4211 } 4212 4213 4214 static int tls_session_ticket_ext_cb(SSL *s, const unsigned char *data, 4215 int len, void *arg) 4216 { 4217 struct tls_connection *conn = arg; 4218 4219 if (conn == NULL || conn->session_ticket_cb == NULL) 4220 return 0; 4221 4222 wpa_printf(MSG_DEBUG, "OpenSSL: %s: length=%d", __func__, len); 4223 4224 os_free(conn->session_ticket); 4225 conn->session_ticket = NULL; 4226 4227 wpa_hexdump(MSG_DEBUG, "OpenSSL: ClientHello SessionTicket " 4228 "extension", data, len); 4229 4230 conn->session_ticket = os_malloc(len); 4231 if (conn->session_ticket == NULL) 4232 return 0; 4233 4234 os_memcpy(conn->session_ticket, data, len); 4235 conn->session_ticket_len = len; 4236 4237 return 1; 4238 } 4239 #endif /* EAP_FAST || EAP_FAST_DYNAMIC || EAP_SERVER_FAST */ 4240 4241 4242 int tls_connection_set_session_ticket_cb(void *tls_ctx, 4243 struct tls_connection *conn, 4244 tls_session_ticket_cb cb, 4245 void *ctx) 4246 { 4247 #if defined(EAP_FAST) || defined(EAP_FAST_DYNAMIC) || defined(EAP_SERVER_FAST) 4248 conn->session_ticket_cb = cb; 4249 conn->session_ticket_cb_ctx = ctx; 4250 4251 if (cb) { 4252 if (SSL_set_session_secret_cb(conn->ssl, tls_sess_sec_cb, 4253 conn) != 1) 4254 return -1; 4255 SSL_set_session_ticket_ext_cb(conn->ssl, 4256 tls_session_ticket_ext_cb, conn); 4257 } else { 4258 if (SSL_set_session_secret_cb(conn->ssl, NULL, NULL) != 1) 4259 return -1; 4260 SSL_set_session_ticket_ext_cb(conn->ssl, NULL, NULL); 4261 } 4262 4263 return 0; 4264 #else /* EAP_FAST || EAP_FAST_DYNAMIC || EAP_SERVER_FAST */ 4265 return -1; 4266 #endif /* EAP_FAST || EAP_FAST_DYNAMIC || EAP_SERVER_FAST */ 4267 } 4268 4269 4270 int tls_get_library_version(char *buf, size_t buf_len) 4271 { 4272 #if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER) 4273 return os_snprintf(buf, buf_len, "OpenSSL build=%s run=%s", 4274 OPENSSL_VERSION_TEXT, 4275 OpenSSL_version(OPENSSL_VERSION)); 4276 #else 4277 return os_snprintf(buf, buf_len, "OpenSSL build=%s run=%s", 4278 OPENSSL_VERSION_TEXT, 4279 SSLeay_version(SSLEAY_VERSION)); 4280 #endif 4281 } 4282 4283 4284 void tls_connection_set_success_data(struct tls_connection *conn, 4285 struct wpabuf *data) 4286 { 4287 SSL_SESSION *sess; 4288 struct wpabuf *old; 4289 4290 if (tls_ex_idx_session < 0) 4291 goto fail; 4292 sess = SSL_get_session(conn->ssl); 4293 if (!sess) 4294 goto fail; 4295 old = SSL_SESSION_get_ex_data(sess, tls_ex_idx_session); 4296 if (old) { 4297 wpa_printf(MSG_DEBUG, "OpenSSL: Replacing old success data %p", 4298 old); 4299 wpabuf_free(old); 4300 } 4301 if (SSL_SESSION_set_ex_data(sess, tls_ex_idx_session, data) != 1) 4302 goto fail; 4303 4304 wpa_printf(MSG_DEBUG, "OpenSSL: Stored success data %p", data); 4305 conn->success_data = 1; 4306 return; 4307 4308 fail: 4309 wpa_printf(MSG_INFO, "OpenSSL: Failed to store success data"); 4310 wpabuf_free(data); 4311 } 4312 4313 4314 void tls_connection_set_success_data_resumed(struct tls_connection *conn) 4315 { 4316 wpa_printf(MSG_DEBUG, 4317 "OpenSSL: Success data accepted for resumed session"); 4318 conn->success_data = 1; 4319 } 4320 4321 4322 const struct wpabuf * 4323 tls_connection_get_success_data(struct tls_connection *conn) 4324 { 4325 SSL_SESSION *sess; 4326 4327 if (tls_ex_idx_session < 0 || 4328 !(sess = SSL_get_session(conn->ssl))) 4329 return NULL; 4330 return SSL_SESSION_get_ex_data(sess, tls_ex_idx_session); 4331 } 4332 4333 4334 void tls_connection_remove_session(struct tls_connection *conn) 4335 { 4336 SSL_SESSION *sess; 4337 4338 sess = SSL_get_session(conn->ssl); 4339 if (!sess) 4340 return; 4341 4342 if (SSL_CTX_remove_session(conn->ssl_ctx, sess) != 1) 4343 wpa_printf(MSG_DEBUG, 4344 "OpenSSL: Session was not cached"); 4345 else 4346 wpa_printf(MSG_DEBUG, 4347 "OpenSSL: Removed cached session to disable session resumption"); 4348 } 4349