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