tlsv1_server_read.c revision 209158
1/* 2 * TLSv1 server - read handshake message 3 * Copyright (c) 2006-2007, Jouni Malinen <j@w1.fi> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 as 7 * published by the Free Software Foundation. 8 * 9 * Alternatively, this software may be distributed under the terms of BSD 10 * license. 11 * 12 * See README and COPYING for more details. 13 */ 14 15#include "includes.h" 16 17#include "common.h" 18#include "md5.h" 19#include "sha1.h" 20#include "x509v3.h" 21#include "tls.h" 22#include "tlsv1_common.h" 23#include "tlsv1_record.h" 24#include "tlsv1_server.h" 25#include "tlsv1_server_i.h" 26 27 28static int tls_process_client_key_exchange(struct tlsv1_server *conn, u8 ct, 29 const u8 *in_data, size_t *in_len); 30static int tls_process_change_cipher_spec(struct tlsv1_server *conn, 31 u8 ct, const u8 *in_data, 32 size_t *in_len); 33 34 35static int tls_process_client_hello(struct tlsv1_server *conn, u8 ct, 36 const u8 *in_data, size_t *in_len) 37{ 38 const u8 *pos, *end, *c; 39 size_t left, len, i, j; 40 u16 cipher_suite; 41 u16 num_suites; 42 int compr_null_found; 43 u16 ext_type, ext_len; 44 45 if (ct != TLS_CONTENT_TYPE_HANDSHAKE) { 46 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; " 47 "received content type 0x%x", ct); 48 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 49 TLS_ALERT_UNEXPECTED_MESSAGE); 50 return -1; 51 } 52 53 pos = in_data; 54 left = *in_len; 55 56 if (left < 4) 57 goto decode_error; 58 59 /* HandshakeType msg_type */ 60 if (*pos != TLS_HANDSHAKE_TYPE_CLIENT_HELLO) { 61 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake " 62 "message %d (expected ClientHello)", *pos); 63 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 64 TLS_ALERT_UNEXPECTED_MESSAGE); 65 return -1; 66 } 67 wpa_printf(MSG_DEBUG, "TLSv1: Received ClientHello"); 68 pos++; 69 /* uint24 length */ 70 len = WPA_GET_BE24(pos); 71 pos += 3; 72 left -= 4; 73 74 if (len > left) 75 goto decode_error; 76 77 /* body - ClientHello */ 78 79 wpa_hexdump(MSG_MSGDUMP, "TLSv1: ClientHello", pos, len); 80 end = pos + len; 81 82 /* ProtocolVersion client_version */ 83 if (end - pos < 2) 84 goto decode_error; 85 conn->client_version = WPA_GET_BE16(pos); 86 wpa_printf(MSG_DEBUG, "TLSv1: Client version %d.%d", 87 conn->client_version >> 8, conn->client_version & 0xff); 88 if (conn->client_version < TLS_VERSION) { 89 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected protocol version in " 90 "ClientHello"); 91 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 92 TLS_ALERT_PROTOCOL_VERSION); 93 return -1; 94 } 95 pos += 2; 96 97 /* Random random */ 98 if (end - pos < TLS_RANDOM_LEN) 99 goto decode_error; 100 101 os_memcpy(conn->client_random, pos, TLS_RANDOM_LEN); 102 pos += TLS_RANDOM_LEN; 103 wpa_hexdump(MSG_MSGDUMP, "TLSv1: client_random", 104 conn->client_random, TLS_RANDOM_LEN); 105 106 /* SessionID session_id */ 107 if (end - pos < 1) 108 goto decode_error; 109 if (end - pos < 1 + *pos || *pos > TLS_SESSION_ID_MAX_LEN) 110 goto decode_error; 111 wpa_hexdump(MSG_MSGDUMP, "TLSv1: client session_id", pos + 1, *pos); 112 pos += 1 + *pos; 113 /* TODO: add support for session resumption */ 114 115 /* CipherSuite cipher_suites<2..2^16-1> */ 116 if (end - pos < 2) 117 goto decode_error; 118 num_suites = WPA_GET_BE16(pos); 119 pos += 2; 120 if (end - pos < num_suites) 121 goto decode_error; 122 wpa_hexdump(MSG_MSGDUMP, "TLSv1: client cipher suites", 123 pos, num_suites); 124 if (num_suites & 1) 125 goto decode_error; 126 num_suites /= 2; 127 128 cipher_suite = 0; 129 for (i = 0; !cipher_suite && i < conn->num_cipher_suites; i++) { 130 c = pos; 131 for (j = 0; j < num_suites; j++) { 132 u16 tmp = WPA_GET_BE16(c); 133 c += 2; 134 if (!cipher_suite && tmp == conn->cipher_suites[i]) { 135 cipher_suite = tmp; 136 break; 137 } 138 } 139 } 140 pos += num_suites * 2; 141 if (!cipher_suite) { 142 wpa_printf(MSG_INFO, "TLSv1: No supported cipher suite " 143 "available"); 144 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 145 TLS_ALERT_ILLEGAL_PARAMETER); 146 return -1; 147 } 148 149 if (tlsv1_record_set_cipher_suite(&conn->rl, cipher_suite) < 0) { 150 wpa_printf(MSG_DEBUG, "TLSv1: Failed to set CipherSuite for " 151 "record layer"); 152 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 153 TLS_ALERT_INTERNAL_ERROR); 154 return -1; 155 } 156 157 conn->cipher_suite = cipher_suite; 158 159 /* CompressionMethod compression_methods<1..2^8-1> */ 160 if (end - pos < 1) 161 goto decode_error; 162 num_suites = *pos++; 163 if (end - pos < num_suites) 164 goto decode_error; 165 wpa_hexdump(MSG_MSGDUMP, "TLSv1: client compression_methods", 166 pos, num_suites); 167 compr_null_found = 0; 168 for (i = 0; i < num_suites; i++) { 169 if (*pos++ == TLS_COMPRESSION_NULL) 170 compr_null_found = 1; 171 } 172 if (!compr_null_found) { 173 wpa_printf(MSG_INFO, "TLSv1: Client does not accept NULL " 174 "compression"); 175 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 176 TLS_ALERT_ILLEGAL_PARAMETER); 177 return -1; 178 } 179 180 if (end - pos == 1) { 181 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected extra octet in the " 182 "end of ClientHello: 0x%02x", *pos); 183 goto decode_error; 184 } 185 186 if (end - pos >= 2) { 187 /* Extension client_hello_extension_list<0..2^16-1> */ 188 ext_len = WPA_GET_BE16(pos); 189 pos += 2; 190 191 wpa_printf(MSG_DEBUG, "TLSv1: %u bytes of ClientHello " 192 "extensions", ext_len); 193 if (end - pos != ext_len) { 194 wpa_printf(MSG_DEBUG, "TLSv1: Invalid ClientHello " 195 "extension list length %u (expected %u)", 196 ext_len, (unsigned int) (end - pos)); 197 goto decode_error; 198 } 199 200 /* 201 * struct { 202 * ExtensionType extension_type (0..65535) 203 * opaque extension_data<0..2^16-1> 204 * } Extension; 205 */ 206 207 while (pos < end) { 208 if (end - pos < 2) { 209 wpa_printf(MSG_DEBUG, "TLSv1: Invalid " 210 "extension_type field"); 211 goto decode_error; 212 } 213 214 ext_type = WPA_GET_BE16(pos); 215 pos += 2; 216 217 if (end - pos < 2) { 218 wpa_printf(MSG_DEBUG, "TLSv1: Invalid " 219 "extension_data length field"); 220 goto decode_error; 221 } 222 223 ext_len = WPA_GET_BE16(pos); 224 pos += 2; 225 226 if (end - pos < ext_len) { 227 wpa_printf(MSG_DEBUG, "TLSv1: Invalid " 228 "extension_data field"); 229 goto decode_error; 230 } 231 232 wpa_printf(MSG_DEBUG, "TLSv1: ClientHello Extension " 233 "type %u", ext_type); 234 wpa_hexdump(MSG_MSGDUMP, "TLSv1: ClientHello " 235 "Extension data", pos, ext_len); 236 237 if (ext_type == TLS_EXT_SESSION_TICKET) { 238 os_free(conn->session_ticket); 239 conn->session_ticket = os_malloc(ext_len); 240 if (conn->session_ticket) { 241 os_memcpy(conn->session_ticket, pos, 242 ext_len); 243 conn->session_ticket_len = ext_len; 244 } 245 } 246 247 pos += ext_len; 248 } 249 } 250 251 *in_len = end - in_data; 252 253 wpa_printf(MSG_DEBUG, "TLSv1: ClientHello OK - proceed to " 254 "ServerHello"); 255 conn->state = SERVER_HELLO; 256 257 return 0; 258 259decode_error: 260 wpa_printf(MSG_DEBUG, "TLSv1: Failed to decode ClientHello"); 261 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 262 TLS_ALERT_DECODE_ERROR); 263 return -1; 264} 265 266 267static int tls_process_certificate(struct tlsv1_server *conn, u8 ct, 268 const u8 *in_data, size_t *in_len) 269{ 270 const u8 *pos, *end; 271 size_t left, len, list_len, cert_len, idx; 272 u8 type; 273 struct x509_certificate *chain = NULL, *last = NULL, *cert; 274 int reason; 275 276 if (ct != TLS_CONTENT_TYPE_HANDSHAKE) { 277 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; " 278 "received content type 0x%x", ct); 279 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 280 TLS_ALERT_UNEXPECTED_MESSAGE); 281 return -1; 282 } 283 284 pos = in_data; 285 left = *in_len; 286 287 if (left < 4) { 288 wpa_printf(MSG_DEBUG, "TLSv1: Too short Certificate message " 289 "(len=%lu)", (unsigned long) left); 290 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 291 TLS_ALERT_DECODE_ERROR); 292 return -1; 293 } 294 295 type = *pos++; 296 len = WPA_GET_BE24(pos); 297 pos += 3; 298 left -= 4; 299 300 if (len > left) { 301 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected Certificate message " 302 "length (len=%lu != left=%lu)", 303 (unsigned long) len, (unsigned long) left); 304 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 305 TLS_ALERT_DECODE_ERROR); 306 return -1; 307 } 308 309 if (type == TLS_HANDSHAKE_TYPE_CLIENT_KEY_EXCHANGE) { 310 if (conn->verify_peer) { 311 wpa_printf(MSG_DEBUG, "TLSv1: Client did not include " 312 "Certificate"); 313 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 314 TLS_ALERT_UNEXPECTED_MESSAGE); 315 return -1; 316 } 317 318 return tls_process_client_key_exchange(conn, ct, in_data, 319 in_len); 320 } 321 if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE) { 322 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake " 323 "message %d (expected Certificate/" 324 "ClientKeyExchange)", type); 325 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 326 TLS_ALERT_UNEXPECTED_MESSAGE); 327 return -1; 328 } 329 330 wpa_printf(MSG_DEBUG, 331 "TLSv1: Received Certificate (certificate_list len %lu)", 332 (unsigned long) len); 333 334 /* 335 * opaque ASN.1Cert<2^24-1>; 336 * 337 * struct { 338 * ASN.1Cert certificate_list<1..2^24-1>; 339 * } Certificate; 340 */ 341 342 end = pos + len; 343 344 if (end - pos < 3) { 345 wpa_printf(MSG_DEBUG, "TLSv1: Too short Certificate " 346 "(left=%lu)", (unsigned long) left); 347 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 348 TLS_ALERT_DECODE_ERROR); 349 return -1; 350 } 351 352 list_len = WPA_GET_BE24(pos); 353 pos += 3; 354 355 if ((size_t) (end - pos) != list_len) { 356 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected certificate_list " 357 "length (len=%lu left=%lu)", 358 (unsigned long) list_len, 359 (unsigned long) (end - pos)); 360 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 361 TLS_ALERT_DECODE_ERROR); 362 return -1; 363 } 364 365 idx = 0; 366 while (pos < end) { 367 if (end - pos < 3) { 368 wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse " 369 "certificate_list"); 370 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 371 TLS_ALERT_DECODE_ERROR); 372 x509_certificate_chain_free(chain); 373 return -1; 374 } 375 376 cert_len = WPA_GET_BE24(pos); 377 pos += 3; 378 379 if ((size_t) (end - pos) < cert_len) { 380 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected certificate " 381 "length (len=%lu left=%lu)", 382 (unsigned long) cert_len, 383 (unsigned long) (end - pos)); 384 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 385 TLS_ALERT_DECODE_ERROR); 386 x509_certificate_chain_free(chain); 387 return -1; 388 } 389 390 wpa_printf(MSG_DEBUG, "TLSv1: Certificate %lu (len %lu)", 391 (unsigned long) idx, (unsigned long) cert_len); 392 393 if (idx == 0) { 394 crypto_public_key_free(conn->client_rsa_key); 395 if (tls_parse_cert(pos, cert_len, 396 &conn->client_rsa_key)) { 397 wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse " 398 "the certificate"); 399 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 400 TLS_ALERT_BAD_CERTIFICATE); 401 x509_certificate_chain_free(chain); 402 return -1; 403 } 404 } 405 406 cert = x509_certificate_parse(pos, cert_len); 407 if (cert == NULL) { 408 wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse " 409 "the certificate"); 410 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 411 TLS_ALERT_BAD_CERTIFICATE); 412 x509_certificate_chain_free(chain); 413 return -1; 414 } 415 416 if (last == NULL) 417 chain = cert; 418 else 419 last->next = cert; 420 last = cert; 421 422 idx++; 423 pos += cert_len; 424 } 425 426 if (x509_certificate_chain_validate(conn->cred->trusted_certs, chain, 427 &reason) < 0) { 428 int tls_reason; 429 wpa_printf(MSG_DEBUG, "TLSv1: Server certificate chain " 430 "validation failed (reason=%d)", reason); 431 switch (reason) { 432 case X509_VALIDATE_BAD_CERTIFICATE: 433 tls_reason = TLS_ALERT_BAD_CERTIFICATE; 434 break; 435 case X509_VALIDATE_UNSUPPORTED_CERTIFICATE: 436 tls_reason = TLS_ALERT_UNSUPPORTED_CERTIFICATE; 437 break; 438 case X509_VALIDATE_CERTIFICATE_REVOKED: 439 tls_reason = TLS_ALERT_CERTIFICATE_REVOKED; 440 break; 441 case X509_VALIDATE_CERTIFICATE_EXPIRED: 442 tls_reason = TLS_ALERT_CERTIFICATE_EXPIRED; 443 break; 444 case X509_VALIDATE_CERTIFICATE_UNKNOWN: 445 tls_reason = TLS_ALERT_CERTIFICATE_UNKNOWN; 446 break; 447 case X509_VALIDATE_UNKNOWN_CA: 448 tls_reason = TLS_ALERT_UNKNOWN_CA; 449 break; 450 default: 451 tls_reason = TLS_ALERT_BAD_CERTIFICATE; 452 break; 453 } 454 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, tls_reason); 455 x509_certificate_chain_free(chain); 456 return -1; 457 } 458 459 x509_certificate_chain_free(chain); 460 461 *in_len = end - in_data; 462 463 conn->state = CLIENT_KEY_EXCHANGE; 464 465 return 0; 466} 467 468 469static int tls_process_client_key_exchange_rsa( 470 struct tlsv1_server *conn, const u8 *pos, const u8 *end) 471{ 472 u8 *out; 473 size_t outlen, outbuflen; 474 u16 encr_len; 475 int res; 476 int use_random = 0; 477 478 if (end - pos < 2) { 479 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 480 TLS_ALERT_DECODE_ERROR); 481 return -1; 482 } 483 484 encr_len = WPA_GET_BE16(pos); 485 pos += 2; 486 487 outbuflen = outlen = end - pos; 488 out = os_malloc(outlen >= TLS_PRE_MASTER_SECRET_LEN ? 489 outlen : TLS_PRE_MASTER_SECRET_LEN); 490 if (out == NULL) { 491 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 492 TLS_ALERT_INTERNAL_ERROR); 493 return -1; 494 } 495 496 /* 497 * struct { 498 * ProtocolVersion client_version; 499 * opaque random[46]; 500 * } PreMasterSecret; 501 * 502 * struct { 503 * public-key-encrypted PreMasterSecret pre_master_secret; 504 * } EncryptedPreMasterSecret; 505 */ 506 507 /* 508 * Note: To avoid Bleichenbacher attack, we do not report decryption or 509 * parsing errors from EncryptedPreMasterSecret processing to the 510 * client. Instead, a random pre-master secret is used to force the 511 * handshake to fail. 512 */ 513 514 if (crypto_private_key_decrypt_pkcs1_v15(conn->cred->key, 515 pos, end - pos, 516 out, &outlen) < 0) { 517 wpa_printf(MSG_DEBUG, "TLSv1: Failed to decrypt " 518 "PreMasterSecret (encr_len=%d outlen=%lu)", 519 (int) (end - pos), (unsigned long) outlen); 520 use_random = 1; 521 } 522 523 if (outlen != TLS_PRE_MASTER_SECRET_LEN) { 524 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected PreMasterSecret " 525 "length %lu", (unsigned long) outlen); 526 use_random = 1; 527 } 528 529 if (WPA_GET_BE16(out) != conn->client_version) { 530 wpa_printf(MSG_DEBUG, "TLSv1: Client version in " 531 "ClientKeyExchange does not match with version in " 532 "ClientHello"); 533 use_random = 1; 534 } 535 536 if (use_random) { 537 wpa_printf(MSG_DEBUG, "TLSv1: Using random premaster secret " 538 "to avoid revealing information about private key"); 539 outlen = TLS_PRE_MASTER_SECRET_LEN; 540 if (os_get_random(out, outlen)) { 541 wpa_printf(MSG_DEBUG, "TLSv1: Failed to get random " 542 "data"); 543 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 544 TLS_ALERT_INTERNAL_ERROR); 545 os_free(out); 546 return -1; 547 } 548 } 549 550 res = tlsv1_server_derive_keys(conn, out, outlen); 551 552 /* Clear the pre-master secret since it is not needed anymore */ 553 os_memset(out, 0, outbuflen); 554 os_free(out); 555 556 if (res) { 557 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive keys"); 558 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 559 TLS_ALERT_INTERNAL_ERROR); 560 return -1; 561 } 562 563 return 0; 564} 565 566 567static int tls_process_client_key_exchange_dh_anon( 568 struct tlsv1_server *conn, const u8 *pos, const u8 *end) 569{ 570#ifdef EAP_FAST 571 const u8 *dh_yc; 572 u16 dh_yc_len; 573 u8 *shared; 574 size_t shared_len; 575 int res; 576 577 /* 578 * struct { 579 * select (PublicValueEncoding) { 580 * case implicit: struct { }; 581 * case explicit: opaque dh_Yc<1..2^16-1>; 582 * } dh_public; 583 * } ClientDiffieHellmanPublic; 584 */ 585 586 wpa_hexdump(MSG_MSGDUMP, "TLSv1: ClientDiffieHellmanPublic", 587 pos, end - pos); 588 589 if (end == pos) { 590 wpa_printf(MSG_DEBUG, "TLSv1: Implicit public value encoding " 591 "not supported"); 592 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 593 TLS_ALERT_INTERNAL_ERROR); 594 return -1; 595 } 596 597 if (end - pos < 3) { 598 wpa_printf(MSG_DEBUG, "TLSv1: Invalid client public value " 599 "length"); 600 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 601 TLS_ALERT_DECODE_ERROR); 602 return -1; 603 } 604 605 dh_yc_len = WPA_GET_BE16(pos); 606 dh_yc = pos + 2; 607 608 if (dh_yc + dh_yc_len > end) { 609 wpa_printf(MSG_DEBUG, "TLSv1: Client public value overflow " 610 "(length %d)", dh_yc_len); 611 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 612 TLS_ALERT_DECODE_ERROR); 613 return -1; 614 } 615 616 wpa_hexdump(MSG_DEBUG, "TLSv1: DH Yc (client's public value)", 617 dh_yc, dh_yc_len); 618 619 if (conn->cred == NULL || conn->cred->dh_p == NULL || 620 conn->dh_secret == NULL) { 621 wpa_printf(MSG_DEBUG, "TLSv1: No DH parameters available"); 622 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 623 TLS_ALERT_INTERNAL_ERROR); 624 return -1; 625 } 626 627 shared_len = conn->cred->dh_p_len; 628 shared = os_malloc(shared_len); 629 if (shared == NULL) { 630 wpa_printf(MSG_DEBUG, "TLSv1: Could not allocate memory for " 631 "DH"); 632 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 633 TLS_ALERT_INTERNAL_ERROR); 634 return -1; 635 } 636 637 /* shared = Yc^secret mod p */ 638 if (crypto_mod_exp(dh_yc, dh_yc_len, conn->dh_secret, 639 conn->dh_secret_len, 640 conn->cred->dh_p, conn->cred->dh_p_len, 641 shared, &shared_len)) { 642 os_free(shared); 643 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 644 TLS_ALERT_INTERNAL_ERROR); 645 return -1; 646 } 647 wpa_hexdump_key(MSG_DEBUG, "TLSv1: Shared secret from DH key exchange", 648 shared, shared_len); 649 650 os_memset(conn->dh_secret, 0, conn->dh_secret_len); 651 os_free(conn->dh_secret); 652 conn->dh_secret = NULL; 653 654 res = tlsv1_server_derive_keys(conn, shared, shared_len); 655 656 /* Clear the pre-master secret since it is not needed anymore */ 657 os_memset(shared, 0, shared_len); 658 os_free(shared); 659 660 if (res) { 661 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive keys"); 662 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 663 TLS_ALERT_INTERNAL_ERROR); 664 return -1; 665 } 666 667 return 0; 668#else /* EAP_FAST */ 669 return -1; 670#endif /* EAP_FAST */ 671} 672 673 674static int tls_process_client_key_exchange(struct tlsv1_server *conn, u8 ct, 675 const u8 *in_data, size_t *in_len) 676{ 677 const u8 *pos, *end; 678 size_t left, len; 679 u8 type; 680 tls_key_exchange keyx; 681 const struct tls_cipher_suite *suite; 682 683 if (ct != TLS_CONTENT_TYPE_HANDSHAKE) { 684 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; " 685 "received content type 0x%x", ct); 686 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 687 TLS_ALERT_UNEXPECTED_MESSAGE); 688 return -1; 689 } 690 691 pos = in_data; 692 left = *in_len; 693 694 if (left < 4) { 695 wpa_printf(MSG_DEBUG, "TLSv1: Too short ClientKeyExchange " 696 "(Left=%lu)", (unsigned long) left); 697 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 698 TLS_ALERT_DECODE_ERROR); 699 return -1; 700 } 701 702 type = *pos++; 703 len = WPA_GET_BE24(pos); 704 pos += 3; 705 left -= 4; 706 707 if (len > left) { 708 wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ClientKeyExchange " 709 "length (len=%lu != left=%lu)", 710 (unsigned long) len, (unsigned long) left); 711 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 712 TLS_ALERT_DECODE_ERROR); 713 return -1; 714 } 715 716 end = pos + len; 717 718 if (type != TLS_HANDSHAKE_TYPE_CLIENT_KEY_EXCHANGE) { 719 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake " 720 "message %d (expected ClientKeyExchange)", type); 721 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 722 TLS_ALERT_UNEXPECTED_MESSAGE); 723 return -1; 724 } 725 726 wpa_printf(MSG_DEBUG, "TLSv1: Received ClientKeyExchange"); 727 728 wpa_hexdump(MSG_DEBUG, "TLSv1: ClientKeyExchange", pos, len); 729 730 suite = tls_get_cipher_suite(conn->rl.cipher_suite); 731 if (suite == NULL) 732 keyx = TLS_KEY_X_NULL; 733 else 734 keyx = suite->key_exchange; 735 736 if (keyx == TLS_KEY_X_DH_anon && 737 tls_process_client_key_exchange_dh_anon(conn, pos, end) < 0) 738 return -1; 739 740 if (keyx != TLS_KEY_X_DH_anon && 741 tls_process_client_key_exchange_rsa(conn, pos, end) < 0) 742 return -1; 743 744 *in_len = end - in_data; 745 746 conn->state = CERTIFICATE_VERIFY; 747 748 return 0; 749} 750 751 752static int tls_process_certificate_verify(struct tlsv1_server *conn, u8 ct, 753 const u8 *in_data, size_t *in_len) 754{ 755 const u8 *pos, *end; 756 size_t left, len; 757 u8 type; 758 size_t hlen, buflen; 759 u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN], *hpos, *buf; 760 enum { SIGN_ALG_RSA, SIGN_ALG_DSA } alg = SIGN_ALG_RSA; 761 u16 slen; 762 763 if (ct == TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC) { 764 if (conn->verify_peer) { 765 wpa_printf(MSG_DEBUG, "TLSv1: Client did not include " 766 "CertificateVerify"); 767 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 768 TLS_ALERT_UNEXPECTED_MESSAGE); 769 return -1; 770 } 771 772 return tls_process_change_cipher_spec(conn, ct, in_data, 773 in_len); 774 } 775 776 if (ct != TLS_CONTENT_TYPE_HANDSHAKE) { 777 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; " 778 "received content type 0x%x", ct); 779 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 780 TLS_ALERT_UNEXPECTED_MESSAGE); 781 return -1; 782 } 783 784 pos = in_data; 785 left = *in_len; 786 787 if (left < 4) { 788 wpa_printf(MSG_DEBUG, "TLSv1: Too short CertificateVerify " 789 "message (len=%lu)", (unsigned long) left); 790 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 791 TLS_ALERT_DECODE_ERROR); 792 return -1; 793 } 794 795 type = *pos++; 796 len = WPA_GET_BE24(pos); 797 pos += 3; 798 left -= 4; 799 800 if (len > left) { 801 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected CertificateVerify " 802 "message length (len=%lu != left=%lu)", 803 (unsigned long) len, (unsigned long) left); 804 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 805 TLS_ALERT_DECODE_ERROR); 806 return -1; 807 } 808 809 end = pos + len; 810 811 if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE_VERIFY) { 812 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake " 813 "message %d (expected CertificateVerify)", type); 814 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 815 TLS_ALERT_UNEXPECTED_MESSAGE); 816 return -1; 817 } 818 819 wpa_printf(MSG_DEBUG, "TLSv1: Received CertificateVerify"); 820 821 /* 822 * struct { 823 * Signature signature; 824 * } CertificateVerify; 825 */ 826 827 hpos = hash; 828 829 if (alg == SIGN_ALG_RSA) { 830 hlen = MD5_MAC_LEN; 831 if (conn->verify.md5_cert == NULL || 832 crypto_hash_finish(conn->verify.md5_cert, hpos, &hlen) < 0) 833 { 834 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 835 TLS_ALERT_INTERNAL_ERROR); 836 conn->verify.md5_cert = NULL; 837 crypto_hash_finish(conn->verify.sha1_cert, NULL, NULL); 838 conn->verify.sha1_cert = NULL; 839 return -1; 840 } 841 hpos += MD5_MAC_LEN; 842 } else 843 crypto_hash_finish(conn->verify.md5_cert, NULL, NULL); 844 845 conn->verify.md5_cert = NULL; 846 hlen = SHA1_MAC_LEN; 847 if (conn->verify.sha1_cert == NULL || 848 crypto_hash_finish(conn->verify.sha1_cert, hpos, &hlen) < 0) { 849 conn->verify.sha1_cert = NULL; 850 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 851 TLS_ALERT_INTERNAL_ERROR); 852 return -1; 853 } 854 conn->verify.sha1_cert = NULL; 855 856 if (alg == SIGN_ALG_RSA) 857 hlen += MD5_MAC_LEN; 858 859 wpa_hexdump(MSG_MSGDUMP, "TLSv1: CertificateVerify hash", hash, hlen); 860 861 if (end - pos < 2) { 862 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 863 TLS_ALERT_DECODE_ERROR); 864 return -1; 865 } 866 slen = WPA_GET_BE16(pos); 867 pos += 2; 868 if (end - pos < slen) { 869 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 870 TLS_ALERT_DECODE_ERROR); 871 return -1; 872 } 873 874 wpa_hexdump(MSG_MSGDUMP, "TLSv1: Signature", pos, end - pos); 875 if (conn->client_rsa_key == NULL) { 876 wpa_printf(MSG_DEBUG, "TLSv1: No client public key to verify " 877 "signature"); 878 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 879 TLS_ALERT_INTERNAL_ERROR); 880 return -1; 881 } 882 883 buflen = end - pos; 884 buf = os_malloc(end - pos); 885 if (crypto_public_key_decrypt_pkcs1(conn->client_rsa_key, 886 pos, end - pos, buf, &buflen) < 0) 887 { 888 wpa_printf(MSG_DEBUG, "TLSv1: Failed to decrypt signature"); 889 os_free(buf); 890 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 891 TLS_ALERT_DECRYPT_ERROR); 892 return -1; 893 } 894 895 wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: Decrypted Signature", 896 buf, buflen); 897 898 if (buflen != hlen || os_memcmp(buf, hash, buflen) != 0) { 899 wpa_printf(MSG_DEBUG, "TLSv1: Invalid Signature in " 900 "CertificateVerify - did not match with calculated " 901 "hash"); 902 os_free(buf); 903 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 904 TLS_ALERT_DECRYPT_ERROR); 905 return -1; 906 } 907 908 os_free(buf); 909 910 *in_len = end - in_data; 911 912 conn->state = CHANGE_CIPHER_SPEC; 913 914 return 0; 915} 916 917 918static int tls_process_change_cipher_spec(struct tlsv1_server *conn, 919 u8 ct, const u8 *in_data, 920 size_t *in_len) 921{ 922 const u8 *pos; 923 size_t left; 924 925 if (ct != TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC) { 926 wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; " 927 "received content type 0x%x", ct); 928 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 929 TLS_ALERT_UNEXPECTED_MESSAGE); 930 return -1; 931 } 932 933 pos = in_data; 934 left = *in_len; 935 936 if (left < 1) { 937 wpa_printf(MSG_DEBUG, "TLSv1: Too short ChangeCipherSpec"); 938 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 939 TLS_ALERT_DECODE_ERROR); 940 return -1; 941 } 942 943 if (*pos != TLS_CHANGE_CIPHER_SPEC) { 944 wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; " 945 "received data 0x%x", *pos); 946 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 947 TLS_ALERT_UNEXPECTED_MESSAGE); 948 return -1; 949 } 950 951 wpa_printf(MSG_DEBUG, "TLSv1: Received ChangeCipherSpec"); 952 if (tlsv1_record_change_read_cipher(&conn->rl) < 0) { 953 wpa_printf(MSG_DEBUG, "TLSv1: Failed to change read cipher " 954 "for record layer"); 955 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 956 TLS_ALERT_INTERNAL_ERROR); 957 return -1; 958 } 959 960 *in_len = pos + 1 - in_data; 961 962 conn->state = CLIENT_FINISHED; 963 964 return 0; 965} 966 967 968static int tls_process_client_finished(struct tlsv1_server *conn, u8 ct, 969 const u8 *in_data, size_t *in_len) 970{ 971 const u8 *pos, *end; 972 size_t left, len, hlen; 973 u8 verify_data[TLS_VERIFY_DATA_LEN]; 974 u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN]; 975 976 if (ct != TLS_CONTENT_TYPE_HANDSHAKE) { 977 wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; " 978 "received content type 0x%x", ct); 979 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 980 TLS_ALERT_UNEXPECTED_MESSAGE); 981 return -1; 982 } 983 984 pos = in_data; 985 left = *in_len; 986 987 if (left < 4) { 988 wpa_printf(MSG_DEBUG, "TLSv1: Too short record (left=%lu) for " 989 "Finished", 990 (unsigned long) left); 991 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 992 TLS_ALERT_DECODE_ERROR); 993 return -1; 994 } 995 996 if (pos[0] != TLS_HANDSHAKE_TYPE_FINISHED) { 997 wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; received " 998 "type 0x%x", pos[0]); 999 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 1000 TLS_ALERT_UNEXPECTED_MESSAGE); 1001 return -1; 1002 } 1003 1004 len = WPA_GET_BE24(pos + 1); 1005 1006 pos += 4; 1007 left -= 4; 1008 1009 if (len > left) { 1010 wpa_printf(MSG_DEBUG, "TLSv1: Too short buffer for Finished " 1011 "(len=%lu > left=%lu)", 1012 (unsigned long) len, (unsigned long) left); 1013 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 1014 TLS_ALERT_DECODE_ERROR); 1015 return -1; 1016 } 1017 end = pos + len; 1018 if (len != TLS_VERIFY_DATA_LEN) { 1019 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected verify_data length " 1020 "in Finished: %lu (expected %d)", 1021 (unsigned long) len, TLS_VERIFY_DATA_LEN); 1022 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 1023 TLS_ALERT_DECODE_ERROR); 1024 return -1; 1025 } 1026 wpa_hexdump(MSG_MSGDUMP, "TLSv1: verify_data in Finished", 1027 pos, TLS_VERIFY_DATA_LEN); 1028 1029 hlen = MD5_MAC_LEN; 1030 if (conn->verify.md5_client == NULL || 1031 crypto_hash_finish(conn->verify.md5_client, hash, &hlen) < 0) { 1032 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 1033 TLS_ALERT_INTERNAL_ERROR); 1034 conn->verify.md5_client = NULL; 1035 crypto_hash_finish(conn->verify.sha1_client, NULL, NULL); 1036 conn->verify.sha1_client = NULL; 1037 return -1; 1038 } 1039 conn->verify.md5_client = NULL; 1040 hlen = SHA1_MAC_LEN; 1041 if (conn->verify.sha1_client == NULL || 1042 crypto_hash_finish(conn->verify.sha1_client, hash + MD5_MAC_LEN, 1043 &hlen) < 0) { 1044 conn->verify.sha1_client = NULL; 1045 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 1046 TLS_ALERT_INTERNAL_ERROR); 1047 return -1; 1048 } 1049 conn->verify.sha1_client = NULL; 1050 1051 if (tls_prf(conn->master_secret, TLS_MASTER_SECRET_LEN, 1052 "client finished", hash, MD5_MAC_LEN + SHA1_MAC_LEN, 1053 verify_data, TLS_VERIFY_DATA_LEN)) { 1054 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive verify_data"); 1055 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 1056 TLS_ALERT_DECRYPT_ERROR); 1057 return -1; 1058 } 1059 wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (client)", 1060 verify_data, TLS_VERIFY_DATA_LEN); 1061 1062 if (os_memcmp(pos, verify_data, TLS_VERIFY_DATA_LEN) != 0) { 1063 wpa_printf(MSG_INFO, "TLSv1: Mismatch in verify_data"); 1064 return -1; 1065 } 1066 1067 wpa_printf(MSG_DEBUG, "TLSv1: Received Finished"); 1068 1069 *in_len = end - in_data; 1070 1071 if (conn->use_session_ticket) { 1072 /* Abbreviated handshake using session ticket; RFC 4507 */ 1073 wpa_printf(MSG_DEBUG, "TLSv1: Abbreviated handshake completed " 1074 "successfully"); 1075 conn->state = ESTABLISHED; 1076 } else { 1077 /* Full handshake */ 1078 conn->state = SERVER_CHANGE_CIPHER_SPEC; 1079 } 1080 1081 return 0; 1082} 1083 1084 1085int tlsv1_server_process_handshake(struct tlsv1_server *conn, u8 ct, 1086 const u8 *buf, size_t *len) 1087{ 1088 if (ct == TLS_CONTENT_TYPE_ALERT) { 1089 if (*len < 2) { 1090 wpa_printf(MSG_DEBUG, "TLSv1: Alert underflow"); 1091 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 1092 TLS_ALERT_DECODE_ERROR); 1093 return -1; 1094 } 1095 wpa_printf(MSG_DEBUG, "TLSv1: Received alert %d:%d", 1096 buf[0], buf[1]); 1097 *len = 2; 1098 conn->state = FAILED; 1099 return -1; 1100 } 1101 1102 switch (conn->state) { 1103 case CLIENT_HELLO: 1104 if (tls_process_client_hello(conn, ct, buf, len)) 1105 return -1; 1106 break; 1107 case CLIENT_CERTIFICATE: 1108 if (tls_process_certificate(conn, ct, buf, len)) 1109 return -1; 1110 break; 1111 case CLIENT_KEY_EXCHANGE: 1112 if (tls_process_client_key_exchange(conn, ct, buf, len)) 1113 return -1; 1114 break; 1115 case CERTIFICATE_VERIFY: 1116 if (tls_process_certificate_verify(conn, ct, buf, len)) 1117 return -1; 1118 break; 1119 case CHANGE_CIPHER_SPEC: 1120 if (tls_process_change_cipher_spec(conn, ct, buf, len)) 1121 return -1; 1122 break; 1123 case CLIENT_FINISHED: 1124 if (tls_process_client_finished(conn, ct, buf, len)) 1125 return -1; 1126 break; 1127 default: 1128 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected state %d " 1129 "while processing received message", 1130 conn->state); 1131 return -1; 1132 } 1133 1134 if (ct == TLS_CONTENT_TYPE_HANDSHAKE) 1135 tls_verify_hash_add(&conn->verify, buf, *len); 1136 1137 return 0; 1138} 1139