1 /* 2 * TLSv1 client - read handshake message 3 * Copyright (c) 2006-2007, Jouni Malinen <j (at) 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 "crypto/md5.h" 19 #include "crypto/sha1.h" 20 #include "crypto/tls.h" 21 #include "x509v3.h" 22 #include "tlsv1_common.h" 23 #include "tlsv1_record.h" 24 #include "tlsv1_client.h" 25 #include "tlsv1_client_i.h" 26 27 static int tls_process_server_key_exchange(struct tlsv1_client *conn, u8 ct, 28 const u8 *in_data, size_t *in_len); 29 static int tls_process_certificate_request(struct tlsv1_client *conn, u8 ct, 30 const u8 *in_data, size_t *in_len); 31 static int tls_process_server_hello_done(struct tlsv1_client *conn, u8 ct, 32 const u8 *in_data, size_t *in_len); 33 34 35 static int tls_process_server_hello(struct tlsv1_client *conn, u8 ct, 36 const u8 *in_data, size_t *in_len) 37 { 38 const u8 *pos, *end; 39 size_t left, len, i; 40 u16 cipher_suite; 41 42 if (ct != TLS_CONTENT_TYPE_HANDSHAKE) { 43 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; " 44 "received content type 0x%x", ct); 45 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 46 TLS_ALERT_UNEXPECTED_MESSAGE); 47 return -1; 48 } 49 50 pos = in_data; 51 left = *in_len; 52 53 if (left < 4) 54 goto decode_error; 55 56 /* HandshakeType msg_type */ 57 if (*pos != TLS_HANDSHAKE_TYPE_SERVER_HELLO) { 58 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake " 59 "message %d (expected ServerHello)", *pos); 60 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 61 TLS_ALERT_UNEXPECTED_MESSAGE); 62 return -1; 63 } 64 wpa_printf(MSG_DEBUG, "TLSv1: Received ServerHello"); 65 pos++; 66 /* uint24 length */ 67 len = WPA_GET_BE24(pos); 68 pos += 3; 69 left -= 4; 70 71 if (len > left) 72 goto decode_error; 73 74 /* body - ServerHello */ 75 76 wpa_hexdump(MSG_MSGDUMP, "TLSv1: ServerHello", pos, len); 77 end = pos + len; 78 79 /* ProtocolVersion server_version */ 80 if (end - pos < 2) 81 goto decode_error; 82 if (WPA_GET_BE16(pos) != TLS_VERSION) { 83 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected protocol version in " 84 "ServerHello"); 85 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 86 TLS_ALERT_PROTOCOL_VERSION); 87 return -1; 88 } 89 pos += 2; 90 91 /* Random random */ 92 if (end - pos < TLS_RANDOM_LEN) 93 goto decode_error; 94 95 os_memcpy(conn->server_random, pos, TLS_RANDOM_LEN); 96 pos += TLS_RANDOM_LEN; 97 wpa_hexdump(MSG_MSGDUMP, "TLSv1: server_random", 98 conn->server_random, TLS_RANDOM_LEN); 99 100 /* SessionID session_id */ 101 if (end - pos < 1) 102 goto decode_error; 103 if (end - pos < 1 + *pos || *pos > TLS_SESSION_ID_MAX_LEN) 104 goto decode_error; 105 if (conn->session_id_len && conn->session_id_len == *pos && 106 os_memcmp(conn->session_id, pos + 1, conn->session_id_len) == 0) { 107 pos += 1 + conn->session_id_len; 108 wpa_printf(MSG_DEBUG, "TLSv1: Resuming old session"); 109 conn->session_resumed = 1; 110 } else { 111 conn->session_id_len = *pos; 112 pos++; 113 os_memcpy(conn->session_id, pos, conn->session_id_len); 114 pos += conn->session_id_len; 115 } 116 wpa_hexdump(MSG_MSGDUMP, "TLSv1: session_id", 117 conn->session_id, conn->session_id_len); 118 119 /* CipherSuite cipher_suite */ 120 if (end - pos < 2) 121 goto decode_error; 122 cipher_suite = WPA_GET_BE16(pos); 123 pos += 2; 124 for (i = 0; i < conn->num_cipher_suites; i++) { 125 if (cipher_suite == conn->cipher_suites[i]) 126 break; 127 } 128 if (i == conn->num_cipher_suites) { 129 wpa_printf(MSG_INFO, "TLSv1: Server selected unexpected " 130 "cipher suite 0x%04x", cipher_suite); 131 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 132 TLS_ALERT_ILLEGAL_PARAMETER); 133 return -1; 134 } 135 136 if (conn->session_resumed && cipher_suite != conn->prev_cipher_suite) { 137 wpa_printf(MSG_DEBUG, "TLSv1: Server selected a different " 138 "cipher suite for a resumed connection (0x%04x != " 139 "0x%04x)", cipher_suite, conn->prev_cipher_suite); 140 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 141 TLS_ALERT_ILLEGAL_PARAMETER); 142 return -1; 143 } 144 145 if (tlsv1_record_set_cipher_suite(&conn->rl, cipher_suite) < 0) { 146 wpa_printf(MSG_DEBUG, "TLSv1: Failed to set CipherSuite for " 147 "record layer"); 148 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 149 TLS_ALERT_INTERNAL_ERROR); 150 return -1; 151 } 152 153 conn->prev_cipher_suite = cipher_suite; 154 155 /* CompressionMethod compression_method */ 156 if (end - pos < 1) 157 goto decode_error; 158 if (*pos != TLS_COMPRESSION_NULL) { 159 wpa_printf(MSG_INFO, "TLSv1: Server selected unexpected " 160 "compression 0x%02x", *pos); 161 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 162 TLS_ALERT_ILLEGAL_PARAMETER); 163 return -1; 164 } 165 pos++; 166 167 if (end != pos) { 168 /* TODO: ServerHello extensions */ 169 wpa_hexdump(MSG_DEBUG, "TLSv1: Unexpected extra data in the " 170 "end of ServerHello", pos, end - pos); 171 goto decode_error; 172 } 173 174 if (conn->session_ticket_included && conn->session_ticket_cb) { 175 /* TODO: include SessionTicket extension if one was included in 176 * ServerHello */ 177 int res = conn->session_ticket_cb( 178 conn->session_ticket_cb_ctx, NULL, 0, 179 conn->client_random, conn->server_random, 180 conn->master_secret); 181 if (res < 0) { 182 wpa_printf(MSG_DEBUG, "TLSv1: SessionTicket callback " 183 "indicated failure"); 184 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 185 TLS_ALERT_HANDSHAKE_FAILURE); 186 return -1; 187 } 188 conn->use_session_ticket = !!res; 189 } 190 191 if ((conn->session_resumed || conn->use_session_ticket) && 192 tls_derive_keys(conn, NULL, 0)) { 193 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive keys"); 194 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 195 TLS_ALERT_INTERNAL_ERROR); 196 return -1; 197 } 198 199 *in_len = end - in_data; 200 201 conn->state = (conn->session_resumed || conn->use_session_ticket) ? 202 SERVER_CHANGE_CIPHER_SPEC : SERVER_CERTIFICATE; 203 204 return 0; 205 206 decode_error: 207 wpa_printf(MSG_DEBUG, "TLSv1: Failed to decode ServerHello"); 208 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 209 return -1; 210 } 211 212 213 static int tls_process_certificate(struct tlsv1_client *conn, u8 ct, 214 const u8 *in_data, size_t *in_len) 215 { 216 const u8 *pos, *end; 217 size_t left, len, list_len, cert_len, idx; 218 u8 type; 219 struct x509_certificate *chain = NULL, *last = NULL, *cert; 220 int reason; 221 222 if (ct != TLS_CONTENT_TYPE_HANDSHAKE) { 223 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; " 224 "received content type 0x%x", ct); 225 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 226 TLS_ALERT_UNEXPECTED_MESSAGE); 227 return -1; 228 } 229 230 pos = in_data; 231 left = *in_len; 232 233 if (left < 4) { 234 wpa_printf(MSG_DEBUG, "TLSv1: Too short Certificate message " 235 "(len=%lu)", (unsigned long) left); 236 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 237 return -1; 238 } 239 240 type = *pos++; 241 len = WPA_GET_BE24(pos); 242 pos += 3; 243 left -= 4; 244 245 if (len > left) { 246 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected Certificate message " 247 "length (len=%lu != left=%lu)", 248 (unsigned long) len, (unsigned long) left); 249 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 250 return -1; 251 } 252 253 if (type == TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE) 254 return tls_process_server_key_exchange(conn, ct, in_data, 255 in_len); 256 if (type == TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST) 257 return tls_process_certificate_request(conn, ct, in_data, 258 in_len); 259 if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE) 260 return tls_process_server_hello_done(conn, ct, in_data, 261 in_len); 262 if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE) { 263 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake " 264 "message %d (expected Certificate/" 265 "ServerKeyExchange/CertificateRequest/" 266 "ServerHelloDone)", type); 267 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 268 TLS_ALERT_UNEXPECTED_MESSAGE); 269 return -1; 270 } 271 272 wpa_printf(MSG_DEBUG, 273 "TLSv1: Received Certificate (certificate_list len %lu)", 274 (unsigned long) len); 275 276 /* 277 * opaque ASN.1Cert<2^24-1>; 278 * 279 * struct { 280 * ASN.1Cert certificate_list<1..2^24-1>; 281 * } Certificate; 282 */ 283 284 end = pos + len; 285 286 if (end - pos < 3) { 287 wpa_printf(MSG_DEBUG, "TLSv1: Too short Certificate " 288 "(left=%lu)", (unsigned long) left); 289 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 290 return -1; 291 } 292 293 list_len = WPA_GET_BE24(pos); 294 pos += 3; 295 296 if ((size_t) (end - pos) != list_len) { 297 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected certificate_list " 298 "length (len=%lu left=%lu)", 299 (unsigned long) list_len, 300 (unsigned long) (end - pos)); 301 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 302 return -1; 303 } 304 305 idx = 0; 306 while (pos < end) { 307 if (end - pos < 3) { 308 wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse " 309 "certificate_list"); 310 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 311 TLS_ALERT_DECODE_ERROR); 312 x509_certificate_chain_free(chain); 313 return -1; 314 } 315 316 cert_len = WPA_GET_BE24(pos); 317 pos += 3; 318 319 if ((size_t) (end - pos) < cert_len) { 320 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected certificate " 321 "length (len=%lu left=%lu)", 322 (unsigned long) cert_len, 323 (unsigned long) (end - pos)); 324 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 325 TLS_ALERT_DECODE_ERROR); 326 x509_certificate_chain_free(chain); 327 return -1; 328 } 329 330 wpa_printf(MSG_DEBUG, "TLSv1: Certificate %lu (len %lu)", 331 (unsigned long) idx, (unsigned long) cert_len); 332 333 if (idx == 0) { 334 crypto_public_key_free(conn->server_rsa_key); 335 if (tls_parse_cert(pos, cert_len, 336 &conn->server_rsa_key)) { 337 wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse " 338 "the certificate"); 339 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 340 TLS_ALERT_BAD_CERTIFICATE); 341 x509_certificate_chain_free(chain); 342 return -1; 343 } 344 } 345 346 cert = x509_certificate_parse(pos, cert_len); 347 if (cert == NULL) { 348 wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse " 349 "the certificate"); 350 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 351 TLS_ALERT_BAD_CERTIFICATE); 352 x509_certificate_chain_free(chain); 353 return -1; 354 } 355 356 if (last == NULL) 357 chain = cert; 358 else 359 last->next = cert; 360 last = cert; 361 362 idx++; 363 pos += cert_len; 364 } 365 366 if (conn->cred && 367 x509_certificate_chain_validate(conn->cred->trusted_certs, chain, 368 &reason, conn->disable_time_checks) 369 < 0) { 370 int tls_reason; 371 wpa_printf(MSG_DEBUG, "TLSv1: Server certificate chain " 372 "validation failed (reason=%d)", reason); 373 switch (reason) { 374 case X509_VALIDATE_BAD_CERTIFICATE: 375 tls_reason = TLS_ALERT_BAD_CERTIFICATE; 376 break; 377 case X509_VALIDATE_UNSUPPORTED_CERTIFICATE: 378 tls_reason = TLS_ALERT_UNSUPPORTED_CERTIFICATE; 379 break; 380 case X509_VALIDATE_CERTIFICATE_REVOKED: 381 tls_reason = TLS_ALERT_CERTIFICATE_REVOKED; 382 break; 383 case X509_VALIDATE_CERTIFICATE_EXPIRED: 384 tls_reason = TLS_ALERT_CERTIFICATE_EXPIRED; 385 break; 386 case X509_VALIDATE_CERTIFICATE_UNKNOWN: 387 tls_reason = TLS_ALERT_CERTIFICATE_UNKNOWN; 388 break; 389 case X509_VALIDATE_UNKNOWN_CA: 390 tls_reason = TLS_ALERT_UNKNOWN_CA; 391 break; 392 default: 393 tls_reason = TLS_ALERT_BAD_CERTIFICATE; 394 break; 395 } 396 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, tls_reason); 397 x509_certificate_chain_free(chain); 398 return -1; 399 } 400 401 x509_certificate_chain_free(chain); 402 403 *in_len = end - in_data; 404 405 conn->state = SERVER_KEY_EXCHANGE; 406 407 return 0; 408 } 409 410 411 static int tlsv1_process_diffie_hellman(struct tlsv1_client *conn, 412 const u8 *buf, size_t len) 413 { 414 const u8 *pos, *end; 415 416 tlsv1_client_free_dh(conn); 417 418 pos = buf; 419 end = buf + len; 420 421 if (end - pos < 3) 422 goto fail; 423 conn->dh_p_len = WPA_GET_BE16(pos); 424 pos += 2; 425 if (conn->dh_p_len == 0 || end - pos < (int) conn->dh_p_len) { 426 wpa_printf(MSG_DEBUG, "TLSv1: Invalid dh_p length %lu", 427 (unsigned long) conn->dh_p_len); 428 goto fail; 429 } 430 conn->dh_p = os_malloc(conn->dh_p_len); 431 if (conn->dh_p == NULL) 432 goto fail; 433 os_memcpy(conn->dh_p, pos, conn->dh_p_len); 434 pos += conn->dh_p_len; 435 wpa_hexdump(MSG_DEBUG, "TLSv1: DH p (prime)", 436 conn->dh_p, conn->dh_p_len); 437 438 if (end - pos < 3) 439 goto fail; 440 conn->dh_g_len = WPA_GET_BE16(pos); 441 pos += 2; 442 if (conn->dh_g_len == 0 || end - pos < (int) conn->dh_g_len) 443 goto fail; 444 conn->dh_g = os_malloc(conn->dh_g_len); 445 if (conn->dh_g == NULL) 446 goto fail; 447 os_memcpy(conn->dh_g, pos, conn->dh_g_len); 448 pos += conn->dh_g_len; 449 wpa_hexdump(MSG_DEBUG, "TLSv1: DH g (generator)", 450 conn->dh_g, conn->dh_g_len); 451 if (conn->dh_g_len == 1 && conn->dh_g[0] < 2) 452 goto fail; 453 454 if (end - pos < 3) 455 goto fail; 456 conn->dh_ys_len = WPA_GET_BE16(pos); 457 pos += 2; 458 if (conn->dh_ys_len == 0 || end - pos < (int) conn->dh_ys_len) 459 goto fail; 460 conn->dh_ys = os_malloc(conn->dh_ys_len); 461 if (conn->dh_ys == NULL) 462 goto fail; 463 os_memcpy(conn->dh_ys, pos, conn->dh_ys_len); 464 pos += conn->dh_ys_len; 465 wpa_hexdump(MSG_DEBUG, "TLSv1: DH Ys (server's public value)", 466 conn->dh_ys, conn->dh_ys_len); 467 468 return 0; 469 470 fail: 471 wpa_printf(MSG_DEBUG, "TLSv1: Processing DH params failed"); 472 tlsv1_client_free_dh(conn); 473 return -1; 474 } 475 476 477 static int tls_process_server_key_exchange(struct tlsv1_client *conn, u8 ct, 478 const u8 *in_data, size_t *in_len) 479 { 480 const u8 *pos, *end; 481 size_t left, len; 482 u8 type; 483 const struct tls_cipher_suite *suite; 484 485 if (ct != TLS_CONTENT_TYPE_HANDSHAKE) { 486 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; " 487 "received content type 0x%x", ct); 488 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 489 TLS_ALERT_UNEXPECTED_MESSAGE); 490 return -1; 491 } 492 493 pos = in_data; 494 left = *in_len; 495 496 if (left < 4) { 497 wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerKeyExchange " 498 "(Left=%lu)", (unsigned long) left); 499 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 500 return -1; 501 } 502 503 type = *pos++; 504 len = WPA_GET_BE24(pos); 505 pos += 3; 506 left -= 4; 507 508 if (len > left) { 509 wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerKeyExchange " 510 "length (len=%lu != left=%lu)", 511 (unsigned long) len, (unsigned long) left); 512 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 513 return -1; 514 } 515 516 end = pos + len; 517 518 if (type == TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST) 519 return tls_process_certificate_request(conn, ct, in_data, 520 in_len); 521 if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE) 522 return tls_process_server_hello_done(conn, ct, in_data, 523 in_len); 524 if (type != TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE) { 525 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake " 526 "message %d (expected ServerKeyExchange/" 527 "CertificateRequest/ServerHelloDone)", type); 528 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 529 TLS_ALERT_UNEXPECTED_MESSAGE); 530 return -1; 531 } 532 533 wpa_printf(MSG_DEBUG, "TLSv1: Received ServerKeyExchange"); 534 535 if (!tls_server_key_exchange_allowed(conn->rl.cipher_suite)) { 536 wpa_printf(MSG_DEBUG, "TLSv1: ServerKeyExchange not allowed " 537 "with the selected cipher suite"); 538 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 539 TLS_ALERT_UNEXPECTED_MESSAGE); 540 return -1; 541 } 542 543 wpa_hexdump(MSG_DEBUG, "TLSv1: ServerKeyExchange", pos, len); 544 suite = tls_get_cipher_suite(conn->rl.cipher_suite); 545 if (suite && suite->key_exchange == TLS_KEY_X_DH_anon) { 546 if (tlsv1_process_diffie_hellman(conn, pos, len) < 0) { 547 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 548 TLS_ALERT_DECODE_ERROR); 549 return -1; 550 } 551 } else { 552 wpa_printf(MSG_DEBUG, "TLSv1: UnexpectedServerKeyExchange"); 553 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 554 TLS_ALERT_UNEXPECTED_MESSAGE); 555 return -1; 556 } 557 558 *in_len = end - in_data; 559 560 conn->state = SERVER_CERTIFICATE_REQUEST; 561 562 return 0; 563 } 564 565 566 static int tls_process_certificate_request(struct tlsv1_client *conn, u8 ct, 567 const u8 *in_data, size_t *in_len) 568 { 569 const u8 *pos, *end; 570 size_t left, len; 571 u8 type; 572 573 if (ct != TLS_CONTENT_TYPE_HANDSHAKE) { 574 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; " 575 "received content type 0x%x", ct); 576 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 577 TLS_ALERT_UNEXPECTED_MESSAGE); 578 return -1; 579 } 580 581 pos = in_data; 582 left = *in_len; 583 584 if (left < 4) { 585 wpa_printf(MSG_DEBUG, "TLSv1: Too short CertificateRequest " 586 "(left=%lu)", (unsigned long) left); 587 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 588 return -1; 589 } 590 591 type = *pos++; 592 len = WPA_GET_BE24(pos); 593 pos += 3; 594 left -= 4; 595 596 if (len > left) { 597 wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in CertificateRequest " 598 "length (len=%lu != left=%lu)", 599 (unsigned long) len, (unsigned long) left); 600 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 601 return -1; 602 } 603 604 end = pos + len; 605 606 if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE) 607 return tls_process_server_hello_done(conn, ct, in_data, 608 in_len); 609 if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST) { 610 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake " 611 "message %d (expected CertificateRequest/" 612 "ServerHelloDone)", type); 613 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 614 TLS_ALERT_UNEXPECTED_MESSAGE); 615 return -1; 616 } 617 618 wpa_printf(MSG_DEBUG, "TLSv1: Received CertificateRequest"); 619 620 conn->certificate_requested = 1; 621 622 *in_len = end - in_data; 623 624 conn->state = SERVER_HELLO_DONE; 625 626 return 0; 627 } 628 629 630 static int tls_process_server_hello_done(struct tlsv1_client *conn, u8 ct, 631 const u8 *in_data, size_t *in_len) 632 { 633 const u8 *pos, *end; 634 size_t left, len; 635 u8 type; 636 637 if (ct != TLS_CONTENT_TYPE_HANDSHAKE) { 638 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; " 639 "received content type 0x%x", ct); 640 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 641 TLS_ALERT_UNEXPECTED_MESSAGE); 642 return -1; 643 } 644 645 pos = in_data; 646 left = *in_len; 647 648 if (left < 4) { 649 wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerHelloDone " 650 "(left=%lu)", (unsigned long) left); 651 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 652 return -1; 653 } 654 655 type = *pos++; 656 len = WPA_GET_BE24(pos); 657 pos += 3; 658 left -= 4; 659 660 if (len > left) { 661 wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerHelloDone " 662 "length (len=%lu != left=%lu)", 663 (unsigned long) len, (unsigned long) left); 664 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 665 return -1; 666 } 667 end = pos + len; 668 669 if (type != TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE) { 670 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake " 671 "message %d (expected ServerHelloDone)", type); 672 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 673 TLS_ALERT_UNEXPECTED_MESSAGE); 674 return -1; 675 } 676 677 wpa_printf(MSG_DEBUG, "TLSv1: Received ServerHelloDone"); 678 679 *in_len = end - in_data; 680 681 conn->state = CLIENT_KEY_EXCHANGE; 682 683 return 0; 684 } 685 686 687 static int tls_process_server_change_cipher_spec(struct tlsv1_client *conn, 688 u8 ct, const u8 *in_data, 689 size_t *in_len) 690 { 691 const u8 *pos; 692 size_t left; 693 694 if (ct != TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC) { 695 wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; " 696 "received content type 0x%x", ct); 697 if (conn->use_session_ticket) { 698 int res; 699 wpa_printf(MSG_DEBUG, "TLSv1: Server may have " 700 "rejected SessionTicket"); 701 conn->use_session_ticket = 0; 702 703 /* Notify upper layers that SessionTicket failed */ 704 res = conn->session_ticket_cb( 705 conn->session_ticket_cb_ctx, NULL, 0, NULL, 706 NULL, NULL); 707 if (res < 0) { 708 wpa_printf(MSG_DEBUG, "TLSv1: SessionTicket " 709 "callback indicated failure"); 710 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 711 TLS_ALERT_HANDSHAKE_FAILURE); 712 return -1; 713 } 714 715 conn->state = SERVER_CERTIFICATE; 716 return tls_process_certificate(conn, ct, in_data, 717 in_len); 718 } 719 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 720 TLS_ALERT_UNEXPECTED_MESSAGE); 721 return -1; 722 } 723 724 pos = in_data; 725 left = *in_len; 726 727 if (left < 1) { 728 wpa_printf(MSG_DEBUG, "TLSv1: Too short ChangeCipherSpec"); 729 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 730 return -1; 731 } 732 733 if (*pos != TLS_CHANGE_CIPHER_SPEC) { 734 wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; " 735 "received data 0x%x", *pos); 736 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 737 TLS_ALERT_UNEXPECTED_MESSAGE); 738 return -1; 739 } 740 741 wpa_printf(MSG_DEBUG, "TLSv1: Received ChangeCipherSpec"); 742 if (tlsv1_record_change_read_cipher(&conn->rl) < 0) { 743 wpa_printf(MSG_DEBUG, "TLSv1: Failed to change read cipher " 744 "for record layer"); 745 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 746 TLS_ALERT_INTERNAL_ERROR); 747 return -1; 748 } 749 750 *in_len = pos + 1 - in_data; 751 752 conn->state = SERVER_FINISHED; 753 754 return 0; 755 } 756 757 758 static int tls_process_server_finished(struct tlsv1_client *conn, u8 ct, 759 const u8 *in_data, size_t *in_len) 760 { 761 const u8 *pos, *end; 762 size_t left, len, hlen; 763 u8 verify_data[TLS_VERIFY_DATA_LEN]; 764 u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN]; 765 766 if (ct != TLS_CONTENT_TYPE_HANDSHAKE) { 767 wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; " 768 "received content type 0x%x", ct); 769 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 770 TLS_ALERT_UNEXPECTED_MESSAGE); 771 return -1; 772 } 773 774 pos = in_data; 775 left = *in_len; 776 777 if (left < 4) { 778 wpa_printf(MSG_DEBUG, "TLSv1: Too short record (left=%lu) for " 779 "Finished", 780 (unsigned long) left); 781 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 782 TLS_ALERT_DECODE_ERROR); 783 return -1; 784 } 785 786 if (pos[0] != TLS_HANDSHAKE_TYPE_FINISHED) { 787 wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; received " 788 "type 0x%x", pos[0]); 789 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 790 TLS_ALERT_UNEXPECTED_MESSAGE); 791 return -1; 792 } 793 794 len = WPA_GET_BE24(pos + 1); 795 796 pos += 4; 797 left -= 4; 798 799 if (len > left) { 800 wpa_printf(MSG_DEBUG, "TLSv1: Too short buffer for Finished " 801 "(len=%lu > left=%lu)", 802 (unsigned long) len, (unsigned long) left); 803 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 804 TLS_ALERT_DECODE_ERROR); 805 return -1; 806 } 807 end = pos + len; 808 if (len != TLS_VERIFY_DATA_LEN) { 809 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected verify_data length " 810 "in Finished: %lu (expected %d)", 811 (unsigned long) len, TLS_VERIFY_DATA_LEN); 812 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 813 TLS_ALERT_DECODE_ERROR); 814 return -1; 815 } 816 wpa_hexdump(MSG_MSGDUMP, "TLSv1: verify_data in Finished", 817 pos, TLS_VERIFY_DATA_LEN); 818 819 hlen = MD5_MAC_LEN; 820 if (conn->verify.md5_server == NULL || 821 crypto_hash_finish(conn->verify.md5_server, hash, &hlen) < 0) { 822 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 823 TLS_ALERT_INTERNAL_ERROR); 824 conn->verify.md5_server = NULL; 825 crypto_hash_finish(conn->verify.sha1_server, NULL, NULL); 826 conn->verify.sha1_server = NULL; 827 return -1; 828 } 829 conn->verify.md5_server = NULL; 830 hlen = SHA1_MAC_LEN; 831 if (conn->verify.sha1_server == NULL || 832 crypto_hash_finish(conn->verify.sha1_server, hash + MD5_MAC_LEN, 833 &hlen) < 0) { 834 conn->verify.sha1_server = NULL; 835 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 836 TLS_ALERT_INTERNAL_ERROR); 837 return -1; 838 } 839 conn->verify.sha1_server = NULL; 840 841 if (tls_prf(conn->master_secret, TLS_MASTER_SECRET_LEN, 842 "server finished", hash, MD5_MAC_LEN + SHA1_MAC_LEN, 843 verify_data, TLS_VERIFY_DATA_LEN)) { 844 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive verify_data"); 845 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 846 TLS_ALERT_DECRYPT_ERROR); 847 return -1; 848 } 849 wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (server)", 850 verify_data, TLS_VERIFY_DATA_LEN); 851 852 if (os_memcmp(pos, verify_data, TLS_VERIFY_DATA_LEN) != 0) { 853 wpa_printf(MSG_INFO, "TLSv1: Mismatch in verify_data"); 854 return -1; 855 } 856 857 wpa_printf(MSG_DEBUG, "TLSv1: Received Finished"); 858 859 *in_len = end - in_data; 860 861 conn->state = (conn->session_resumed || conn->use_session_ticket) ? 862 CHANGE_CIPHER_SPEC : ACK_FINISHED; 863 864 return 0; 865 } 866 867 868 static int tls_process_application_data(struct tlsv1_client *conn, u8 ct, 869 const u8 *in_data, size_t *in_len, 870 u8 **out_data, size_t *out_len) 871 { 872 const u8 *pos; 873 size_t left; 874 875 if (ct != TLS_CONTENT_TYPE_APPLICATION_DATA) { 876 wpa_printf(MSG_DEBUG, "TLSv1: Expected Application Data; " 877 "received content type 0x%x", ct); 878 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 879 TLS_ALERT_UNEXPECTED_MESSAGE); 880 return -1; 881 } 882 883 pos = in_data; 884 left = *in_len; 885 886 wpa_hexdump(MSG_DEBUG, "TLSv1: Application Data included in Handshake", 887 pos, left); 888 889 *out_data = os_malloc(left); 890 if (*out_data) { 891 os_memcpy(*out_data, pos, left); 892 *out_len = left; 893 } 894 895 return 0; 896 } 897 898 899 int tlsv1_client_process_handshake(struct tlsv1_client *conn, u8 ct, 900 const u8 *buf, size_t *len, 901 u8 **out_data, size_t *out_len) 902 { 903 if (ct == TLS_CONTENT_TYPE_ALERT) { 904 if (*len < 2) { 905 wpa_printf(MSG_DEBUG, "TLSv1: Alert underflow"); 906 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 907 TLS_ALERT_DECODE_ERROR); 908 return -1; 909 } 910 wpa_printf(MSG_DEBUG, "TLSv1: Received alert %d:%d", 911 buf[0], buf[1]); 912 *len = 2; 913 conn->state = FAILED; 914 return -1; 915 } 916 917 if (ct == TLS_CONTENT_TYPE_HANDSHAKE && *len >= 4 && 918 buf[0] == TLS_HANDSHAKE_TYPE_HELLO_REQUEST) { 919 size_t hr_len = WPA_GET_BE24(buf + 1); 920 if (hr_len > *len - 4) { 921 wpa_printf(MSG_DEBUG, "TLSv1: HelloRequest underflow"); 922 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 923 TLS_ALERT_DECODE_ERROR); 924 return -1; 925 } 926 wpa_printf(MSG_DEBUG, "TLSv1: Ignored HelloRequest"); 927 *len = 4 + hr_len; 928 return 0; 929 } 930 931 switch (conn->state) { 932 case SERVER_HELLO: 933 if (tls_process_server_hello(conn, ct, buf, len)) 934 return -1; 935 break; 936 case SERVER_CERTIFICATE: 937 if (tls_process_certificate(conn, ct, buf, len)) 938 return -1; 939 break; 940 case SERVER_KEY_EXCHANGE: 941 if (tls_process_server_key_exchange(conn, ct, buf, len)) 942 return -1; 943 break; 944 case SERVER_CERTIFICATE_REQUEST: 945 if (tls_process_certificate_request(conn, ct, buf, len)) 946 return -1; 947 break; 948 case SERVER_HELLO_DONE: 949 if (tls_process_server_hello_done(conn, ct, buf, len)) 950 return -1; 951 break; 952 case SERVER_CHANGE_CIPHER_SPEC: 953 if (tls_process_server_change_cipher_spec(conn, ct, buf, len)) 954 return -1; 955 break; 956 case SERVER_FINISHED: 957 if (tls_process_server_finished(conn, ct, buf, len)) 958 return -1; 959 break; 960 case ACK_FINISHED: 961 if (out_data && 962 tls_process_application_data(conn, ct, buf, len, out_data, 963 out_len)) 964 return -1; 965 break; 966 default: 967 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected state %d " 968 "while processing received message", 969 conn->state); 970 return -1; 971 } 972 973 if (ct == TLS_CONTENT_TYPE_HANDSHAKE) 974 tls_verify_hash_add(&conn->verify, buf, *len); 975 976 return 0; 977 } 978