1 /* 2 * wpa_supplicant: TLSv1 client (RFC 2246) 3 * Copyright (c) 2006, 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 "base64.h" 19 #include "md5.h" 20 #include "sha1.h" 21 #include "crypto.h" 22 #include "tls.h" 23 #include "tlsv1_common.h" 24 #include "tlsv1_client.h" 25 #include "x509v3.h" 26 27 /* TODO: 28 * Support for a message fragmented across several records (RFC 2246, 6.2.1) 29 */ 30 31 struct tlsv1_client { 32 enum { 33 CLIENT_HELLO, SERVER_HELLO, SERVER_CERTIFICATE, 34 SERVER_KEY_EXCHANGE, SERVER_CERTIFICATE_REQUEST, 35 SERVER_HELLO_DONE, CLIENT_KEY_EXCHANGE, CHANGE_CIPHER_SPEC, 36 SERVER_CHANGE_CIPHER_SPEC, SERVER_FINISHED, ACK_FINISHED, 37 ESTABLISHED, FAILED 38 } state; 39 40 struct tlsv1_record_layer rl; 41 42 u8 session_id[TLS_SESSION_ID_MAX_LEN]; 43 size_t session_id_len; 44 u8 client_random[TLS_RANDOM_LEN]; 45 u8 server_random[TLS_RANDOM_LEN]; 46 u8 master_secret[TLS_MASTER_SECRET_LEN]; 47 48 u8 alert_level; 49 u8 alert_description; 50 51 unsigned int certificate_requested:1; 52 unsigned int session_resumed:1; 53 unsigned int ticket:1; 54 unsigned int ticket_key:1; 55 56 struct crypto_public_key *server_rsa_key; 57 58 struct crypto_hash *verify_md5_client; 59 struct crypto_hash *verify_sha1_client; 60 struct crypto_hash *verify_md5_server; 61 struct crypto_hash *verify_sha1_server; 62 struct crypto_hash *verify_md5_cert; 63 struct crypto_hash *verify_sha1_cert; 64 65 #define MAX_CIPHER_COUNT 30 66 u16 cipher_suites[MAX_CIPHER_COUNT]; 67 size_t num_cipher_suites; 68 69 u16 prev_cipher_suite; 70 71 u8 *client_hello_ext; 72 size_t client_hello_ext_len; 73 74 /* The prime modulus used for Diffie-Hellman */ 75 u8 *dh_p; 76 size_t dh_p_len; 77 /* The generator used for Diffie-Hellman */ 78 u8 *dh_g; 79 size_t dh_g_len; 80 /* The server's Diffie-Hellman public value */ 81 u8 *dh_ys; 82 size_t dh_ys_len; 83 84 struct x509_certificate *trusted_certs; 85 struct x509_certificate *client_cert; 86 struct crypto_private_key *client_key; 87 }; 88 89 90 static int tls_derive_keys(struct tlsv1_client *conn, 91 const u8 *pre_master_secret, 92 size_t pre_master_secret_len); 93 static int tls_process_server_key_exchange(struct tlsv1_client *conn, u8 ct, 94 const u8 *in_data, size_t *in_len); 95 static int tls_process_certificate_request(struct tlsv1_client *conn, u8 ct, 96 const u8 *in_data, size_t *in_len); 97 static int tls_process_server_hello_done(struct tlsv1_client *conn, u8 ct, 98 const u8 *in_data, size_t *in_len); 99 100 101 static void tls_alert(struct tlsv1_client *conn, u8 level, u8 description) 102 { 103 conn->alert_level = level; 104 conn->alert_description = description; 105 } 106 107 108 static void tls_verify_hash_add(struct tlsv1_client *conn, const u8 *buf, 109 size_t len) 110 { 111 if (conn->verify_md5_client && conn->verify_sha1_client) { 112 crypto_hash_update(conn->verify_md5_client, buf, len); 113 crypto_hash_update(conn->verify_sha1_client, buf, len); 114 } 115 if (conn->verify_md5_server && conn->verify_sha1_server) { 116 crypto_hash_update(conn->verify_md5_server, buf, len); 117 crypto_hash_update(conn->verify_sha1_server, buf, len); 118 } 119 if (conn->verify_md5_cert && conn->verify_sha1_cert) { 120 crypto_hash_update(conn->verify_md5_cert, buf, len); 121 crypto_hash_update(conn->verify_sha1_cert, buf, len); 122 } 123 } 124 125 126 static u8 * tls_send_alert(struct tlsv1_client *conn, 127 u8 level, u8 description, 128 size_t *out_len) 129 { 130 u8 *alert, *pos, *length; 131 132 wpa_printf(MSG_DEBUG, "TLSv1: Send Alert(%d:%d)", level, description); 133 *out_len = 0; 134 135 alert = os_malloc(10); 136 if (alert == NULL) 137 return NULL; 138 139 pos = alert; 140 141 /* TLSPlaintext */ 142 /* ContentType type */ 143 *pos++ = TLS_CONTENT_TYPE_ALERT; 144 /* ProtocolVersion version */ 145 WPA_PUT_BE16(pos, TLS_VERSION); 146 pos += 2; 147 /* uint16 length (to be filled) */ 148 length = pos; 149 pos += 2; 150 /* opaque fragment[TLSPlaintext.length] */ 151 152 /* Alert */ 153 /* AlertLevel level */ 154 *pos++ = level; 155 /* AlertDescription description */ 156 *pos++ = description; 157 158 WPA_PUT_BE16(length, pos - length - 2); 159 *out_len = pos - alert; 160 161 return alert; 162 } 163 164 165 static u8 * tls_send_client_hello(struct tlsv1_client *conn, 166 size_t *out_len) 167 { 168 u8 *hello, *end, *pos, *hs_length, *hs_start, *rhdr; 169 struct os_time now; 170 size_t len, i; 171 172 wpa_printf(MSG_DEBUG, "TLSv1: Send ClientHello"); 173 *out_len = 0; 174 175 os_get_time(&now); 176 WPA_PUT_BE32(conn->client_random, now.sec); 177 if (os_get_random(conn->client_random + 4, TLS_RANDOM_LEN - 4)) { 178 wpa_printf(MSG_ERROR, "TLSv1: Could not generate " 179 "client_random"); 180 return NULL; 181 } 182 wpa_hexdump(MSG_MSGDUMP, "TLSv1: client_random", 183 conn->client_random, TLS_RANDOM_LEN); 184 185 len = 100 + conn->num_cipher_suites * 2 + conn->client_hello_ext_len; 186 hello = os_malloc(len); 187 if (hello == NULL) 188 return NULL; 189 end = hello + len; 190 191 rhdr = hello; 192 pos = rhdr + TLS_RECORD_HEADER_LEN; 193 194 /* opaque fragment[TLSPlaintext.length] */ 195 196 /* Handshake */ 197 hs_start = pos; 198 /* HandshakeType msg_type */ 199 *pos++ = TLS_HANDSHAKE_TYPE_CLIENT_HELLO; 200 /* uint24 length (to be filled) */ 201 hs_length = pos; 202 pos += 3; 203 /* body - ClientHello */ 204 /* ProtocolVersion client_version */ 205 WPA_PUT_BE16(pos, TLS_VERSION); 206 pos += 2; 207 /* Random random: uint32 gmt_unix_time, opaque random_bytes */ 208 os_memcpy(pos, conn->client_random, TLS_RANDOM_LEN); 209 pos += TLS_RANDOM_LEN; 210 /* SessionID session_id */ 211 *pos++ = conn->session_id_len; 212 os_memcpy(pos, conn->session_id, conn->session_id_len); 213 pos += conn->session_id_len; 214 /* CipherSuite cipher_suites<2..2^16-1> */ 215 WPA_PUT_BE16(pos, 2 * conn->num_cipher_suites); 216 pos += 2; 217 for (i = 0; i < conn->num_cipher_suites; i++) { 218 WPA_PUT_BE16(pos, conn->cipher_suites[i]); 219 pos += 2; 220 } 221 /* CompressionMethod compression_methods<1..2^8-1> */ 222 *pos++ = 1; 223 *pos++ = TLS_COMPRESSION_NULL; 224 225 if (conn->client_hello_ext) { 226 os_memcpy(pos, conn->client_hello_ext, 227 conn->client_hello_ext_len); 228 pos += conn->client_hello_ext_len; 229 } 230 231 WPA_PUT_BE24(hs_length, pos - hs_length - 3); 232 tls_verify_hash_add(conn, hs_start, pos - hs_start); 233 234 if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE, 235 rhdr, end - rhdr, pos - hs_start, out_len) < 0) { 236 wpa_printf(MSG_DEBUG, "TLSv1: Failed to create TLS record"); 237 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 238 TLS_ALERT_INTERNAL_ERROR); 239 os_free(hello); 240 return NULL; 241 } 242 243 conn->state = SERVER_HELLO; 244 245 return hello; 246 } 247 248 249 static int tls_process_server_hello(struct tlsv1_client *conn, u8 ct, 250 const u8 *in_data, size_t *in_len) 251 { 252 const u8 *pos, *end; 253 size_t left, len, i; 254 u16 cipher_suite; 255 256 if (ct != TLS_CONTENT_TYPE_HANDSHAKE) { 257 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; " 258 "received content type 0x%x", ct); 259 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 260 TLS_ALERT_UNEXPECTED_MESSAGE); 261 return -1; 262 } 263 264 pos = in_data; 265 left = *in_len; 266 267 if (left < 4) 268 goto decode_error; 269 270 /* HandshakeType msg_type */ 271 if (*pos != TLS_HANDSHAKE_TYPE_SERVER_HELLO) { 272 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake " 273 "message %d (expected ServerHello)", *pos); 274 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 275 TLS_ALERT_UNEXPECTED_MESSAGE); 276 return -1; 277 } 278 wpa_printf(MSG_DEBUG, "TLSv1: Received ServerHello"); 279 pos++; 280 /* uint24 length */ 281 len = WPA_GET_BE24(pos); 282 pos += 3; 283 left -= 4; 284 285 if (len > left) 286 goto decode_error; 287 288 /* body - ServerHello */ 289 290 wpa_hexdump(MSG_MSGDUMP, "TLSv1: ServerHello", pos, len); 291 end = pos + len; 292 293 /* ProtocolVersion server_version */ 294 if (end - pos < 2) 295 goto decode_error; 296 if (WPA_GET_BE16(pos) != TLS_VERSION) { 297 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected protocol version in " 298 "ServerHello"); 299 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 300 TLS_ALERT_PROTOCOL_VERSION); 301 return -1; 302 } 303 pos += 2; 304 305 /* Random random */ 306 if (end - pos < TLS_RANDOM_LEN) 307 goto decode_error; 308 309 os_memcpy(conn->server_random, pos, TLS_RANDOM_LEN); 310 pos += TLS_RANDOM_LEN; 311 wpa_hexdump(MSG_MSGDUMP, "TLSv1: server_random", 312 conn->server_random, TLS_RANDOM_LEN); 313 314 /* SessionID session_id */ 315 if (end - pos < 1) 316 goto decode_error; 317 if (end - pos < 1 + *pos || *pos > TLS_SESSION_ID_MAX_LEN) 318 goto decode_error; 319 if (conn->session_id_len && conn->session_id_len == *pos && 320 os_memcmp(conn->session_id, pos + 1, conn->session_id_len) == 0) { 321 pos += 1 + conn->session_id_len; 322 wpa_printf(MSG_DEBUG, "TLSv1: Resuming old session"); 323 conn->session_resumed = 1; 324 } else { 325 conn->session_id_len = *pos; 326 pos++; 327 os_memcpy(conn->session_id, pos, conn->session_id_len); 328 pos += conn->session_id_len; 329 } 330 wpa_hexdump(MSG_MSGDUMP, "TLSv1: session_id", 331 conn->session_id, conn->session_id_len); 332 333 /* CipherSuite cipher_suite */ 334 if (end - pos < 2) 335 goto decode_error; 336 cipher_suite = WPA_GET_BE16(pos); 337 pos += 2; 338 for (i = 0; i < conn->num_cipher_suites; i++) { 339 if (cipher_suite == conn->cipher_suites[i]) 340 break; 341 } 342 if (i == conn->num_cipher_suites) { 343 wpa_printf(MSG_INFO, "TLSv1: Server selected unexpected " 344 "cipher suite 0x%04x", cipher_suite); 345 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 346 TLS_ALERT_ILLEGAL_PARAMETER); 347 return -1; 348 } 349 350 if (conn->session_resumed && cipher_suite != conn->prev_cipher_suite) { 351 wpa_printf(MSG_DEBUG, "TLSv1: Server selected a different " 352 "cipher suite for a resumed connection (0x%04x != " 353 "0x%04x)", cipher_suite, conn->prev_cipher_suite); 354 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 355 TLS_ALERT_ILLEGAL_PARAMETER); 356 return -1; 357 } 358 359 if (tlsv1_record_set_cipher_suite(&conn->rl, cipher_suite) < 0) { 360 wpa_printf(MSG_DEBUG, "TLSv1: Failed to set CipherSuite for " 361 "record layer"); 362 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 363 TLS_ALERT_INTERNAL_ERROR); 364 return -1; 365 } 366 367 conn->prev_cipher_suite = cipher_suite; 368 369 if (conn->session_resumed || conn->ticket_key) 370 tls_derive_keys(conn, NULL, 0); 371 372 /* CompressionMethod compression_method */ 373 if (end - pos < 1) 374 goto decode_error; 375 if (*pos != TLS_COMPRESSION_NULL) { 376 wpa_printf(MSG_INFO, "TLSv1: Server selected unexpected " 377 "compression 0x%02x", *pos); 378 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 379 TLS_ALERT_ILLEGAL_PARAMETER); 380 return -1; 381 } 382 pos++; 383 384 if (end != pos) { 385 wpa_hexdump(MSG_DEBUG, "TLSv1: Unexpected extra data in the " 386 "end of ServerHello", pos, end - pos); 387 goto decode_error; 388 } 389 390 *in_len = end - in_data; 391 392 conn->state = (conn->session_resumed || conn->ticket) ? 393 SERVER_CHANGE_CIPHER_SPEC : SERVER_CERTIFICATE; 394 395 return 0; 396 397 decode_error: 398 wpa_printf(MSG_DEBUG, "TLSv1: Failed to decode ServerHello"); 399 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 400 return -1; 401 } 402 403 404 static int tls_server_key_exchange_allowed(struct tlsv1_client *conn) 405 { 406 const struct tls_cipher_suite *suite; 407 408 /* RFC 2246, Section 7.4.3 */ 409 suite = tls_get_cipher_suite(conn->rl.cipher_suite); 410 if (suite == NULL) 411 return 0; 412 413 switch (suite->key_exchange) { 414 case TLS_KEY_X_DHE_DSS: 415 case TLS_KEY_X_DHE_DSS_EXPORT: 416 case TLS_KEY_X_DHE_RSA: 417 case TLS_KEY_X_DHE_RSA_EXPORT: 418 case TLS_KEY_X_DH_anon_EXPORT: 419 case TLS_KEY_X_DH_anon: 420 return 1; 421 case TLS_KEY_X_RSA_EXPORT: 422 return 1 /* FIX: public key len > 512 bits */; 423 default: 424 return 0; 425 } 426 } 427 428 429 static int tls_process_certificate(struct tlsv1_client *conn, u8 ct, 430 const u8 *in_data, size_t *in_len) 431 { 432 const u8 *pos, *end; 433 size_t left, len, list_len, cert_len, idx; 434 u8 type; 435 struct x509_certificate *chain = NULL, *last = NULL, *cert; 436 int reason; 437 438 if (ct != TLS_CONTENT_TYPE_HANDSHAKE) { 439 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; " 440 "received content type 0x%x", ct); 441 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 442 TLS_ALERT_UNEXPECTED_MESSAGE); 443 return -1; 444 } 445 446 pos = in_data; 447 left = *in_len; 448 449 if (left < 4) { 450 wpa_printf(MSG_DEBUG, "TLSv1: Too short Certificate message " 451 "(len=%lu)", (unsigned long) left); 452 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 453 return -1; 454 } 455 456 type = *pos++; 457 len = WPA_GET_BE24(pos); 458 pos += 3; 459 left -= 4; 460 461 if (len > left) { 462 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected Certificate message " 463 "length (len=%lu != left=%lu)", 464 (unsigned long) len, (unsigned long) left); 465 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 466 return -1; 467 } 468 469 if (type == TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE) 470 return tls_process_server_key_exchange(conn, ct, in_data, 471 in_len); 472 if (type == TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST) 473 return tls_process_certificate_request(conn, ct, in_data, 474 in_len); 475 if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE) 476 return tls_process_server_hello_done(conn, ct, in_data, 477 in_len); 478 if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE) { 479 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake " 480 "message %d (expected Certificate/" 481 "ServerKeyExchange/CertificateRequest/" 482 "ServerHelloDone)", type); 483 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 484 TLS_ALERT_UNEXPECTED_MESSAGE); 485 return -1; 486 } 487 488 wpa_printf(MSG_DEBUG, 489 "TLSv1: Received Certificate (certificate_list len %lu)", 490 (unsigned long) len); 491 492 /* 493 * opaque ASN.1Cert<2^24-1>; 494 * 495 * struct { 496 * ASN.1Cert certificate_list<1..2^24-1>; 497 * } Certificate; 498 */ 499 500 end = pos + len; 501 502 if (end - pos < 3) { 503 wpa_printf(MSG_DEBUG, "TLSv1: Too short Certificate " 504 "(left=%lu)", (unsigned long) left); 505 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 506 return -1; 507 } 508 509 list_len = WPA_GET_BE24(pos); 510 pos += 3; 511 512 if ((size_t) (end - pos) != list_len) { 513 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected certificate_list " 514 "length (len=%lu left=%lu)", 515 (unsigned long) list_len, 516 (unsigned long) (end - pos)); 517 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 518 return -1; 519 } 520 521 idx = 0; 522 while (pos < end) { 523 if (end - pos < 3) { 524 wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse " 525 "certificate_list"); 526 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 527 TLS_ALERT_DECODE_ERROR); 528 x509_certificate_chain_free(chain); 529 return -1; 530 } 531 532 cert_len = WPA_GET_BE24(pos); 533 pos += 3; 534 535 if ((size_t) (end - pos) < cert_len) { 536 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected certificate " 537 "length (len=%lu left=%lu)", 538 (unsigned long) cert_len, 539 (unsigned long) (end - pos)); 540 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 541 TLS_ALERT_DECODE_ERROR); 542 x509_certificate_chain_free(chain); 543 return -1; 544 } 545 546 wpa_printf(MSG_DEBUG, "TLSv1: Certificate %lu (len %lu)", 547 (unsigned long) idx, (unsigned long) cert_len); 548 549 if (idx == 0) { 550 crypto_public_key_free(conn->server_rsa_key); 551 if (tls_parse_cert(pos, cert_len, 552 &conn->server_rsa_key)) { 553 wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse " 554 "the certificate"); 555 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 556 TLS_ALERT_BAD_CERTIFICATE); 557 x509_certificate_chain_free(chain); 558 return -1; 559 } 560 } 561 562 cert = x509_certificate_parse(pos, cert_len); 563 if (cert == NULL) { 564 wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse " 565 "the certificate"); 566 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 567 TLS_ALERT_BAD_CERTIFICATE); 568 x509_certificate_chain_free(chain); 569 return -1; 570 } 571 572 if (last == NULL) 573 chain = cert; 574 else 575 last->next = cert; 576 last = cert; 577 578 idx++; 579 pos += cert_len; 580 } 581 582 if (x509_certificate_chain_validate(conn->trusted_certs, chain, 583 &reason) < 0) { 584 int tls_reason; 585 wpa_printf(MSG_DEBUG, "TLSv1: Server certificate chain " 586 "validation failed (reason=%d)", reason); 587 switch (reason) { 588 case X509_VALIDATE_BAD_CERTIFICATE: 589 tls_reason = TLS_ALERT_BAD_CERTIFICATE; 590 break; 591 case X509_VALIDATE_UNSUPPORTED_CERTIFICATE: 592 tls_reason = TLS_ALERT_UNSUPPORTED_CERTIFICATE; 593 break; 594 case X509_VALIDATE_CERTIFICATE_REVOKED: 595 tls_reason = TLS_ALERT_CERTIFICATE_REVOKED; 596 break; 597 case X509_VALIDATE_CERTIFICATE_EXPIRED: 598 tls_reason = TLS_ALERT_CERTIFICATE_EXPIRED; 599 break; 600 case X509_VALIDATE_CERTIFICATE_UNKNOWN: 601 tls_reason = TLS_ALERT_CERTIFICATE_UNKNOWN; 602 break; 603 case X509_VALIDATE_UNKNOWN_CA: 604 tls_reason = TLS_ALERT_UNKNOWN_CA; 605 break; 606 default: 607 tls_reason = TLS_ALERT_BAD_CERTIFICATE; 608 break; 609 } 610 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, tls_reason); 611 x509_certificate_chain_free(chain); 612 return -1; 613 } 614 615 x509_certificate_chain_free(chain); 616 617 *in_len = end - in_data; 618 619 conn->state = SERVER_KEY_EXCHANGE; 620 621 return 0; 622 } 623 624 625 static void tlsv1_client_free_dh(struct tlsv1_client *conn) 626 { 627 os_free(conn->dh_p); 628 os_free(conn->dh_g); 629 os_free(conn->dh_ys); 630 conn->dh_p = conn->dh_g = conn->dh_ys = NULL; 631 } 632 633 634 static int tlsv1_process_diffie_hellman(struct tlsv1_client *conn, 635 const u8 *buf, size_t len) 636 { 637 const u8 *pos, *end; 638 639 tlsv1_client_free_dh(conn); 640 641 pos = buf; 642 end = buf + len; 643 644 if (end - pos < 3) 645 goto fail; 646 conn->dh_p_len = WPA_GET_BE16(pos); 647 pos += 2; 648 if (conn->dh_p_len == 0 || end - pos < (int) conn->dh_p_len) 649 goto fail; 650 conn->dh_p = os_malloc(conn->dh_p_len); 651 if (conn->dh_p == NULL) 652 goto fail; 653 os_memcpy(conn->dh_p, pos, conn->dh_p_len); 654 pos += conn->dh_p_len; 655 wpa_hexdump(MSG_DEBUG, "TLSv1: DH p (prime)", 656 conn->dh_p, conn->dh_p_len); 657 658 if (end - pos < 3) 659 goto fail; 660 conn->dh_g_len = WPA_GET_BE16(pos); 661 pos += 2; 662 if (conn->dh_g_len == 0 || end - pos < (int) conn->dh_g_len) 663 goto fail; 664 conn->dh_g = os_malloc(conn->dh_g_len); 665 if (conn->dh_g == NULL) 666 goto fail; 667 os_memcpy(conn->dh_g, pos, conn->dh_g_len); 668 pos += conn->dh_g_len; 669 wpa_hexdump(MSG_DEBUG, "TLSv1: DH g (generator)", 670 conn->dh_g, conn->dh_g_len); 671 if (conn->dh_g_len == 1 && conn->dh_g[0] < 2) 672 goto fail; 673 674 if (end - pos < 3) 675 goto fail; 676 conn->dh_ys_len = WPA_GET_BE16(pos); 677 pos += 2; 678 if (conn->dh_ys_len == 0 || end - pos < (int) conn->dh_ys_len) 679 goto fail; 680 conn->dh_ys = os_malloc(conn->dh_ys_len); 681 if (conn->dh_ys == NULL) 682 goto fail; 683 os_memcpy(conn->dh_ys, pos, conn->dh_ys_len); 684 pos += conn->dh_ys_len; 685 wpa_hexdump(MSG_DEBUG, "TLSv1: DH Ys (server's public value)", 686 conn->dh_ys, conn->dh_ys_len); 687 688 return 0; 689 690 fail: 691 tlsv1_client_free_dh(conn); 692 return -1; 693 } 694 695 696 static int tls_process_server_key_exchange(struct tlsv1_client *conn, u8 ct, 697 const u8 *in_data, size_t *in_len) 698 { 699 const u8 *pos, *end; 700 size_t left, len; 701 u8 type; 702 const struct tls_cipher_suite *suite; 703 704 if (ct != TLS_CONTENT_TYPE_HANDSHAKE) { 705 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; " 706 "received content type 0x%x", ct); 707 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 708 TLS_ALERT_UNEXPECTED_MESSAGE); 709 return -1; 710 } 711 712 pos = in_data; 713 left = *in_len; 714 715 if (left < 4) { 716 wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerKeyExchange " 717 "(Left=%lu)", (unsigned long) left); 718 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 719 return -1; 720 } 721 722 type = *pos++; 723 len = WPA_GET_BE24(pos); 724 pos += 3; 725 left -= 4; 726 727 if (len > left) { 728 wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerKeyExchange " 729 "length (len=%lu != left=%lu)", 730 (unsigned long) len, (unsigned long) left); 731 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 732 return -1; 733 } 734 735 end = pos + len; 736 737 if (type == TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST) 738 return tls_process_certificate_request(conn, ct, in_data, 739 in_len); 740 if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE) 741 return tls_process_server_hello_done(conn, ct, in_data, 742 in_len); 743 if (type != TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE) { 744 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake " 745 "message %d (expected ServerKeyExchange/" 746 "CertificateRequest/ServerHelloDone)", type); 747 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 748 TLS_ALERT_UNEXPECTED_MESSAGE); 749 return -1; 750 } 751 752 wpa_printf(MSG_DEBUG, "TLSv1: Received ServerKeyExchange"); 753 754 if (!tls_server_key_exchange_allowed(conn)) { 755 wpa_printf(MSG_DEBUG, "TLSv1: ServerKeyExchange not allowed " 756 "with the selected cipher suite"); 757 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 758 TLS_ALERT_UNEXPECTED_MESSAGE); 759 return -1; 760 } 761 762 wpa_hexdump(MSG_DEBUG, "TLSv1: ServerKeyExchange", pos, len); 763 suite = tls_get_cipher_suite(conn->rl.cipher_suite); 764 if (suite && suite->key_exchange == TLS_KEY_X_DH_anon) { 765 if (tlsv1_process_diffie_hellman(conn, pos, len) < 0) { 766 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 767 TLS_ALERT_DECODE_ERROR); 768 return -1; 769 } 770 } else { 771 wpa_printf(MSG_DEBUG, "TLSv1: UnexpectedServerKeyExchange"); 772 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 773 TLS_ALERT_UNEXPECTED_MESSAGE); 774 return -1; 775 } 776 777 *in_len = end - in_data; 778 779 conn->state = SERVER_CERTIFICATE_REQUEST; 780 781 return 0; 782 } 783 784 785 static int tls_process_certificate_request(struct tlsv1_client *conn, u8 ct, 786 const u8 *in_data, size_t *in_len) 787 { 788 const u8 *pos, *end; 789 size_t left, len; 790 u8 type; 791 792 if (ct != TLS_CONTENT_TYPE_HANDSHAKE) { 793 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; " 794 "received content type 0x%x", ct); 795 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 796 TLS_ALERT_UNEXPECTED_MESSAGE); 797 return -1; 798 } 799 800 pos = in_data; 801 left = *in_len; 802 803 if (left < 4) { 804 wpa_printf(MSG_DEBUG, "TLSv1: Too short CertificateRequest " 805 "(left=%lu)", (unsigned long) left); 806 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 807 return -1; 808 } 809 810 type = *pos++; 811 len = WPA_GET_BE24(pos); 812 pos += 3; 813 left -= 4; 814 815 if (len > left) { 816 wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in CertificateRequest " 817 "length (len=%lu != left=%lu)", 818 (unsigned long) len, (unsigned long) left); 819 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 820 return -1; 821 } 822 823 end = pos + len; 824 825 if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE) 826 return tls_process_server_hello_done(conn, ct, in_data, 827 in_len); 828 if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST) { 829 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake " 830 "message %d (expected CertificateRequest/" 831 "ServerHelloDone)", type); 832 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 833 TLS_ALERT_UNEXPECTED_MESSAGE); 834 return -1; 835 } 836 837 wpa_printf(MSG_DEBUG, "TLSv1: Received CertificateRequest"); 838 839 conn->certificate_requested = 1; 840 841 *in_len = end - in_data; 842 843 conn->state = SERVER_HELLO_DONE; 844 845 return 0; 846 } 847 848 849 static int tls_process_server_hello_done(struct tlsv1_client *conn, u8 ct, 850 const u8 *in_data, size_t *in_len) 851 { 852 const u8 *pos, *end; 853 size_t left, len; 854 u8 type; 855 856 if (ct != TLS_CONTENT_TYPE_HANDSHAKE) { 857 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; " 858 "received content type 0x%x", ct); 859 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 860 TLS_ALERT_UNEXPECTED_MESSAGE); 861 return -1; 862 } 863 864 pos = in_data; 865 left = *in_len; 866 867 if (left < 4) { 868 wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerHelloDone " 869 "(left=%lu)", (unsigned long) left); 870 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 871 return -1; 872 } 873 874 type = *pos++; 875 len = WPA_GET_BE24(pos); 876 pos += 3; 877 left -= 4; 878 879 if (len > left) { 880 wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerHelloDone " 881 "length (len=%lu != left=%lu)", 882 (unsigned long) len, (unsigned long) left); 883 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 884 return -1; 885 } 886 end = pos + len; 887 888 if (type != TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE) { 889 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake " 890 "message %d (expected ServerHelloDone)", type); 891 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 892 TLS_ALERT_UNEXPECTED_MESSAGE); 893 return -1; 894 } 895 896 wpa_printf(MSG_DEBUG, "TLSv1: Received ServerHelloDone"); 897 898 *in_len = end - in_data; 899 900 conn->state = CLIENT_KEY_EXCHANGE; 901 902 return 0; 903 } 904 905 906 static int tls_process_server_change_cipher_spec(struct tlsv1_client *conn, 907 u8 ct, const u8 *in_data, 908 size_t *in_len) 909 { 910 const u8 *pos; 911 size_t left; 912 913 if (ct != TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC) { 914 wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; " 915 "received content type 0x%x", ct); 916 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 917 TLS_ALERT_UNEXPECTED_MESSAGE); 918 return -1; 919 } 920 921 pos = in_data; 922 left = *in_len; 923 924 if (left < 1) { 925 wpa_printf(MSG_DEBUG, "TLSv1: Too short ChangeCipherSpec"); 926 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR); 927 return -1; 928 } 929 930 if (*pos != TLS_CHANGE_CIPHER_SPEC) { 931 wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; " 932 "received data 0x%x", *pos); 933 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 934 TLS_ALERT_UNEXPECTED_MESSAGE); 935 return -1; 936 } 937 938 wpa_printf(MSG_DEBUG, "TLSv1: Received ChangeCipherSpec"); 939 if (tlsv1_record_change_read_cipher(&conn->rl) < 0) { 940 wpa_printf(MSG_DEBUG, "TLSv1: Failed to change read cipher " 941 "for record layer"); 942 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 943 TLS_ALERT_INTERNAL_ERROR); 944 return -1; 945 } 946 947 *in_len = pos + 1 - in_data; 948 949 conn->state = SERVER_FINISHED; 950 951 return 0; 952 } 953 954 955 static int tls_process_server_finished(struct tlsv1_client *conn, u8 ct, 956 const u8 *in_data, size_t *in_len) 957 { 958 const u8 *pos, *end; 959 size_t left, len, hlen; 960 u8 verify_data[TLS_VERIFY_DATA_LEN]; 961 u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN]; 962 963 if (ct != TLS_CONTENT_TYPE_HANDSHAKE) { 964 wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; " 965 "received content type 0x%x", ct); 966 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 967 TLS_ALERT_UNEXPECTED_MESSAGE); 968 return -1; 969 } 970 971 pos = in_data; 972 left = *in_len; 973 974 if (left < 4) { 975 wpa_printf(MSG_DEBUG, "TLSv1: Too short record (left=%lu) for " 976 "Finished", 977 (unsigned long) left); 978 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 979 TLS_ALERT_DECODE_ERROR); 980 return -1; 981 } 982 983 if (pos[0] != TLS_HANDSHAKE_TYPE_FINISHED) { 984 wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; received " 985 "type 0x%x", pos[0]); 986 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 987 TLS_ALERT_UNEXPECTED_MESSAGE); 988 return -1; 989 } 990 991 len = WPA_GET_BE24(pos + 1); 992 993 pos += 4; 994 left -= 4; 995 996 if (len > left) { 997 wpa_printf(MSG_DEBUG, "TLSv1: Too short buffer for Finished " 998 "(len=%lu > left=%lu)", 999 (unsigned long) len, (unsigned long) left); 1000 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1001 TLS_ALERT_DECODE_ERROR); 1002 return -1; 1003 } 1004 end = pos + len; 1005 if (len != TLS_VERIFY_DATA_LEN) { 1006 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected verify_data length " 1007 "in Finished: %lu (expected %d)", 1008 (unsigned long) len, TLS_VERIFY_DATA_LEN); 1009 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1010 TLS_ALERT_DECODE_ERROR); 1011 return -1; 1012 } 1013 wpa_hexdump(MSG_MSGDUMP, "TLSv1: verify_data in Finished", 1014 pos, TLS_VERIFY_DATA_LEN); 1015 1016 hlen = MD5_MAC_LEN; 1017 if (conn->verify_md5_server == NULL || 1018 crypto_hash_finish(conn->verify_md5_server, hash, &hlen) < 0) { 1019 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1020 TLS_ALERT_INTERNAL_ERROR); 1021 conn->verify_md5_server = NULL; 1022 crypto_hash_finish(conn->verify_sha1_server, NULL, NULL); 1023 conn->verify_sha1_server = NULL; 1024 return -1; 1025 } 1026 conn->verify_md5_server = NULL; 1027 hlen = SHA1_MAC_LEN; 1028 if (conn->verify_sha1_server == NULL || 1029 crypto_hash_finish(conn->verify_sha1_server, hash + MD5_MAC_LEN, 1030 &hlen) < 0) { 1031 conn->verify_sha1_server = NULL; 1032 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1033 TLS_ALERT_INTERNAL_ERROR); 1034 return -1; 1035 } 1036 conn->verify_sha1_server = NULL; 1037 1038 if (tls_prf(conn->master_secret, TLS_MASTER_SECRET_LEN, 1039 "server finished", hash, MD5_MAC_LEN + SHA1_MAC_LEN, 1040 verify_data, TLS_VERIFY_DATA_LEN)) { 1041 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive verify_data"); 1042 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1043 TLS_ALERT_DECRYPT_ERROR); 1044 return -1; 1045 } 1046 wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (server)", 1047 verify_data, TLS_VERIFY_DATA_LEN); 1048 1049 if (os_memcmp(pos, verify_data, TLS_VERIFY_DATA_LEN) != 0) { 1050 wpa_printf(MSG_INFO, "TLSv1: Mismatch in verify_data"); 1051 return -1; 1052 } 1053 1054 wpa_printf(MSG_DEBUG, "TLSv1: Received Finished"); 1055 1056 *in_len = end - in_data; 1057 1058 conn->state = (conn->session_resumed || conn->ticket) ? 1059 CHANGE_CIPHER_SPEC : ACK_FINISHED; 1060 1061 return 0; 1062 } 1063 1064 1065 static int tls_derive_pre_master_secret(u8 *pre_master_secret) 1066 { 1067 WPA_PUT_BE16(pre_master_secret, TLS_VERSION); 1068 if (os_get_random(pre_master_secret + 2, 1069 TLS_PRE_MASTER_SECRET_LEN - 2)) 1070 return -1; 1071 return 0; 1072 } 1073 1074 1075 static int tls_derive_keys(struct tlsv1_client *conn, 1076 const u8 *pre_master_secret, 1077 size_t pre_master_secret_len) 1078 { 1079 u8 seed[2 * TLS_RANDOM_LEN]; 1080 u8 key_block[TLS_MAX_KEY_BLOCK_LEN]; 1081 u8 *pos; 1082 size_t key_block_len; 1083 1084 if (pre_master_secret) { 1085 wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: pre_master_secret", 1086 pre_master_secret, pre_master_secret_len); 1087 os_memcpy(seed, conn->client_random, TLS_RANDOM_LEN); 1088 os_memcpy(seed + TLS_RANDOM_LEN, conn->server_random, 1089 TLS_RANDOM_LEN); 1090 if (tls_prf(pre_master_secret, pre_master_secret_len, 1091 "master secret", seed, 2 * TLS_RANDOM_LEN, 1092 conn->master_secret, TLS_MASTER_SECRET_LEN)) { 1093 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive " 1094 "master_secret"); 1095 return -1; 1096 } 1097 wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: master_secret", 1098 conn->master_secret, TLS_MASTER_SECRET_LEN); 1099 } 1100 1101 os_memcpy(seed, conn->server_random, TLS_RANDOM_LEN); 1102 os_memcpy(seed + TLS_RANDOM_LEN, conn->client_random, TLS_RANDOM_LEN); 1103 key_block_len = 2 * (conn->rl.hash_size + conn->rl.key_material_len + 1104 conn->rl.iv_size); 1105 if (tls_prf(conn->master_secret, TLS_MASTER_SECRET_LEN, 1106 "key expansion", seed, 2 * TLS_RANDOM_LEN, 1107 key_block, key_block_len)) { 1108 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive key_block"); 1109 return -1; 1110 } 1111 wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: key_block", 1112 key_block, key_block_len); 1113 1114 pos = key_block; 1115 1116 /* client_write_MAC_secret */ 1117 os_memcpy(conn->rl.write_mac_secret, pos, conn->rl.hash_size); 1118 pos += conn->rl.hash_size; 1119 /* server_write_MAC_secret */ 1120 os_memcpy(conn->rl.read_mac_secret, pos, conn->rl.hash_size); 1121 pos += conn->rl.hash_size; 1122 1123 /* client_write_key */ 1124 os_memcpy(conn->rl.write_key, pos, conn->rl.key_material_len); 1125 pos += conn->rl.key_material_len; 1126 /* server_write_key */ 1127 os_memcpy(conn->rl.read_key, pos, conn->rl.key_material_len); 1128 pos += conn->rl.key_material_len; 1129 1130 /* client_write_IV */ 1131 os_memcpy(conn->rl.write_iv, pos, conn->rl.iv_size); 1132 pos += conn->rl.iv_size; 1133 /* server_write_IV */ 1134 os_memcpy(conn->rl.read_iv, pos, conn->rl.iv_size); 1135 pos += conn->rl.iv_size; 1136 1137 return 0; 1138 } 1139 1140 1141 static int tls_write_client_certificate(struct tlsv1_client *conn, 1142 u8 **msgpos, u8 *end) 1143 { 1144 u8 *pos, *rhdr, *hs_start, *hs_length, *cert_start; 1145 size_t rlen; 1146 struct x509_certificate *cert; 1147 1148 pos = *msgpos; 1149 1150 wpa_printf(MSG_DEBUG, "TLSv1: Send Certificate"); 1151 rhdr = pos; 1152 pos += TLS_RECORD_HEADER_LEN; 1153 1154 /* opaque fragment[TLSPlaintext.length] */ 1155 1156 /* Handshake */ 1157 hs_start = pos; 1158 /* HandshakeType msg_type */ 1159 *pos++ = TLS_HANDSHAKE_TYPE_CERTIFICATE; 1160 /* uint24 length (to be filled) */ 1161 hs_length = pos; 1162 pos += 3; 1163 /* body - Certificate */ 1164 /* uint24 length (to be filled) */ 1165 cert_start = pos; 1166 pos += 3; 1167 cert = conn->client_cert; 1168 while (cert) { 1169 if (pos + 3 + cert->cert_len > end) { 1170 wpa_printf(MSG_DEBUG, "TLSv1: Not enough buffer space " 1171 "for Certificate (cert_len=%lu left=%lu)", 1172 (unsigned long) cert->cert_len, 1173 (unsigned long) (end - pos)); 1174 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1175 TLS_ALERT_INTERNAL_ERROR); 1176 return -1; 1177 } 1178 WPA_PUT_BE24(pos, cert->cert_len); 1179 pos += 3; 1180 os_memcpy(pos, cert->cert_start, cert->cert_len); 1181 pos += cert->cert_len; 1182 1183 if (x509_certificate_self_signed(cert)) 1184 break; 1185 cert = x509_certificate_get_subject(conn->trusted_certs, 1186 &cert->issuer); 1187 } 1188 if (cert == conn->client_cert || cert == NULL) { 1189 /* 1190 * Client was not configured with all the needed certificates 1191 * to form a full certificate chain. The server may fail to 1192 * validate the chain unless it is configured with all the 1193 * missing CA certificates. 1194 */ 1195 wpa_printf(MSG_DEBUG, "TLSv1: Full client certificate chain " 1196 "not configured - validation may fail"); 1197 } 1198 WPA_PUT_BE24(cert_start, pos - cert_start - 3); 1199 1200 WPA_PUT_BE24(hs_length, pos - hs_length - 3); 1201 1202 if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE, 1203 rhdr, end - rhdr, pos - hs_start, &rlen) < 0) { 1204 wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record"); 1205 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1206 TLS_ALERT_INTERNAL_ERROR); 1207 return -1; 1208 } 1209 pos = rhdr + rlen; 1210 1211 tls_verify_hash_add(conn, hs_start, pos - hs_start); 1212 1213 *msgpos = pos; 1214 1215 return 0; 1216 } 1217 1218 1219 static int tlsv1_key_x_anon_dh(struct tlsv1_client *conn, u8 **pos, u8 *end) 1220 { 1221 #ifdef EAP_FAST 1222 /* ClientDiffieHellmanPublic */ 1223 u8 *csecret, *csecret_start, *dh_yc, *shared; 1224 size_t csecret_len, dh_yc_len, shared_len; 1225 1226 csecret_len = conn->dh_p_len; 1227 csecret = os_malloc(csecret_len); 1228 if (csecret == NULL) { 1229 wpa_printf(MSG_DEBUG, "TLSv1: Failed to allocate " 1230 "memory for Yc (Diffie-Hellman)"); 1231 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1232 TLS_ALERT_INTERNAL_ERROR); 1233 return -1; 1234 } 1235 if (os_get_random(csecret, csecret_len)) { 1236 wpa_printf(MSG_DEBUG, "TLSv1: Failed to get random " 1237 "data for Diffie-Hellman"); 1238 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1239 TLS_ALERT_INTERNAL_ERROR); 1240 os_free(csecret); 1241 return -1; 1242 } 1243 1244 if (os_memcmp(csecret, conn->dh_p, csecret_len) > 0) 1245 csecret[0] = 0; /* make sure Yc < p */ 1246 1247 csecret_start = csecret; 1248 while (csecret_len > 1 && *csecret_start == 0) { 1249 csecret_start++; 1250 csecret_len--; 1251 } 1252 wpa_hexdump_key(MSG_DEBUG, "TLSv1: DH client's secret value", 1253 csecret_start, csecret_len); 1254 1255 /* Yc = g^csecret mod p */ 1256 dh_yc_len = conn->dh_p_len; 1257 dh_yc = os_malloc(dh_yc_len); 1258 if (dh_yc == NULL) { 1259 wpa_printf(MSG_DEBUG, "TLSv1: Failed to allocate " 1260 "memory for Diffie-Hellman"); 1261 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1262 TLS_ALERT_INTERNAL_ERROR); 1263 os_free(csecret); 1264 return -1; 1265 } 1266 crypto_mod_exp(conn->dh_g, conn->dh_g_len, 1267 csecret_start, csecret_len, 1268 conn->dh_p, conn->dh_p_len, 1269 dh_yc, &dh_yc_len); 1270 1271 wpa_hexdump(MSG_DEBUG, "TLSv1: DH Yc (client's public value)", 1272 dh_yc, dh_yc_len); 1273 1274 WPA_PUT_BE16(*pos, dh_yc_len); 1275 *pos += 2; 1276 if (*pos + dh_yc_len > end) { 1277 wpa_printf(MSG_DEBUG, "TLSv1: Not enough room in the " 1278 "message buffer for Yc"); 1279 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1280 TLS_ALERT_INTERNAL_ERROR); 1281 os_free(csecret); 1282 os_free(dh_yc); 1283 return -1; 1284 } 1285 os_memcpy(*pos, dh_yc, dh_yc_len); 1286 *pos += dh_yc_len; 1287 os_free(dh_yc); 1288 1289 shared_len = conn->dh_p_len; 1290 shared = os_malloc(shared_len); 1291 if (shared == NULL) { 1292 wpa_printf(MSG_DEBUG, "TLSv1: Could not allocate memory for " 1293 "DH"); 1294 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1295 TLS_ALERT_INTERNAL_ERROR); 1296 os_free(csecret); 1297 return -1; 1298 } 1299 1300 /* shared = Ys^csecret mod p */ 1301 crypto_mod_exp(conn->dh_ys, conn->dh_ys_len, 1302 csecret_start, csecret_len, 1303 conn->dh_p, conn->dh_p_len, 1304 shared, &shared_len); 1305 wpa_hexdump_key(MSG_DEBUG, "TLSv1: Shared secret from DH key exchange", 1306 shared, shared_len); 1307 1308 os_memset(csecret_start, 0, csecret_len); 1309 os_free(csecret); 1310 if (tls_derive_keys(conn, shared, shared_len)) { 1311 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive keys"); 1312 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1313 TLS_ALERT_INTERNAL_ERROR); 1314 os_free(shared); 1315 return -1; 1316 } 1317 os_memset(shared, 0, shared_len); 1318 os_free(shared); 1319 tlsv1_client_free_dh(conn); 1320 return 0; 1321 #else /* EAP_FAST */ 1322 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_INTERNAL_ERROR); 1323 return -1; 1324 #endif /* EAP_FAST */ 1325 } 1326 1327 1328 static int tlsv1_key_x_rsa(struct tlsv1_client *conn, u8 **pos, u8 *end) 1329 { 1330 u8 pre_master_secret[TLS_PRE_MASTER_SECRET_LEN]; 1331 size_t clen; 1332 int res; 1333 1334 if (tls_derive_pre_master_secret(pre_master_secret) < 0 || 1335 tls_derive_keys(conn, pre_master_secret, 1336 TLS_PRE_MASTER_SECRET_LEN)) { 1337 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive keys"); 1338 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1339 TLS_ALERT_INTERNAL_ERROR); 1340 return -1; 1341 } 1342 1343 /* EncryptedPreMasterSecret */ 1344 if (conn->server_rsa_key == NULL) { 1345 wpa_printf(MSG_DEBUG, "TLSv1: No server RSA key to " 1346 "use for encrypting pre-master secret"); 1347 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1348 TLS_ALERT_INTERNAL_ERROR); 1349 return -1; 1350 } 1351 1352 /* RSA encrypted value is encoded with PKCS #1 v1.5 block type 2. */ 1353 *pos += 2; 1354 clen = end - *pos; 1355 res = crypto_public_key_encrypt_pkcs1_v15( 1356 conn->server_rsa_key, 1357 pre_master_secret, TLS_PRE_MASTER_SECRET_LEN, 1358 *pos, &clen); 1359 os_memset(pre_master_secret, 0, TLS_PRE_MASTER_SECRET_LEN); 1360 if (res < 0) { 1361 wpa_printf(MSG_DEBUG, "TLSv1: RSA encryption failed"); 1362 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1363 TLS_ALERT_INTERNAL_ERROR); 1364 return -1; 1365 } 1366 WPA_PUT_BE16(*pos - 2, clen); 1367 wpa_hexdump(MSG_MSGDUMP, "TLSv1: Encrypted pre_master_secret", 1368 *pos, clen); 1369 *pos += clen; 1370 1371 return 0; 1372 } 1373 1374 1375 static int tls_write_client_key_exchange(struct tlsv1_client *conn, 1376 u8 **msgpos, u8 *end) 1377 { 1378 u8 *pos, *rhdr, *hs_start, *hs_length; 1379 size_t rlen; 1380 tls_key_exchange keyx; 1381 const struct tls_cipher_suite *suite; 1382 1383 suite = tls_get_cipher_suite(conn->rl.cipher_suite); 1384 if (suite == NULL) 1385 keyx = TLS_KEY_X_NULL; 1386 else 1387 keyx = suite->key_exchange; 1388 1389 pos = *msgpos; 1390 1391 wpa_printf(MSG_DEBUG, "TLSv1: Send ClientKeyExchange"); 1392 1393 rhdr = pos; 1394 pos += TLS_RECORD_HEADER_LEN; 1395 1396 /* opaque fragment[TLSPlaintext.length] */ 1397 1398 /* Handshake */ 1399 hs_start = pos; 1400 /* HandshakeType msg_type */ 1401 *pos++ = TLS_HANDSHAKE_TYPE_CLIENT_KEY_EXCHANGE; 1402 /* uint24 length (to be filled) */ 1403 hs_length = pos; 1404 pos += 3; 1405 /* body - ClientKeyExchange */ 1406 if (keyx == TLS_KEY_X_DH_anon) { 1407 if (tlsv1_key_x_anon_dh(conn, &pos, end) < 0) 1408 return -1; 1409 } else { 1410 if (tlsv1_key_x_rsa(conn, &pos, end) < 0) 1411 return -1; 1412 } 1413 1414 WPA_PUT_BE24(hs_length, pos - hs_length - 3); 1415 1416 if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE, 1417 rhdr, end - rhdr, pos - hs_start, &rlen) < 0) { 1418 wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record"); 1419 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1420 TLS_ALERT_INTERNAL_ERROR); 1421 return -1; 1422 } 1423 pos = rhdr + rlen; 1424 tls_verify_hash_add(conn, hs_start, pos - hs_start); 1425 1426 *msgpos = pos; 1427 1428 return 0; 1429 } 1430 1431 1432 static int tls_write_client_certificate_verify(struct tlsv1_client *conn, 1433 u8 **msgpos, u8 *end) 1434 { 1435 u8 *pos, *rhdr, *hs_start, *hs_length, *signed_start; 1436 size_t rlen, hlen, clen; 1437 u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN], *hpos; 1438 enum { SIGN_ALG_RSA, SIGN_ALG_DSA } alg = SIGN_ALG_RSA; 1439 1440 pos = *msgpos; 1441 1442 wpa_printf(MSG_DEBUG, "TLSv1: Send CertificateVerify"); 1443 rhdr = pos; 1444 pos += TLS_RECORD_HEADER_LEN; 1445 1446 /* Handshake */ 1447 hs_start = pos; 1448 /* HandshakeType msg_type */ 1449 *pos++ = TLS_HANDSHAKE_TYPE_CERTIFICATE_VERIFY; 1450 /* uint24 length (to be filled) */ 1451 hs_length = pos; 1452 pos += 3; 1453 1454 /* 1455 * RFC 2246: 7.4.3 and 7.4.8: 1456 * Signature signature 1457 * 1458 * RSA: 1459 * digitally-signed struct { 1460 * opaque md5_hash[16]; 1461 * opaque sha_hash[20]; 1462 * }; 1463 * 1464 * DSA: 1465 * digitally-signed struct { 1466 * opaque sha_hash[20]; 1467 * }; 1468 * 1469 * The hash values are calculated over all handshake messages sent or 1470 * received starting at ClientHello up to, but not including, this 1471 * CertificateVerify message, including the type and length fields of 1472 * the handshake messages. 1473 */ 1474 1475 hpos = hash; 1476 1477 if (alg == SIGN_ALG_RSA) { 1478 hlen = MD5_MAC_LEN; 1479 if (conn->verify_md5_cert == NULL || 1480 crypto_hash_finish(conn->verify_md5_cert, hpos, &hlen) < 0) 1481 { 1482 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1483 TLS_ALERT_INTERNAL_ERROR); 1484 conn->verify_md5_cert = NULL; 1485 crypto_hash_finish(conn->verify_sha1_cert, NULL, NULL); 1486 conn->verify_sha1_cert = NULL; 1487 return -1; 1488 } 1489 hpos += MD5_MAC_LEN; 1490 } else 1491 crypto_hash_finish(conn->verify_md5_cert, NULL, NULL); 1492 1493 conn->verify_md5_cert = NULL; 1494 hlen = SHA1_MAC_LEN; 1495 if (conn->verify_sha1_cert == NULL || 1496 crypto_hash_finish(conn->verify_sha1_cert, hpos, &hlen) < 0) { 1497 conn->verify_sha1_cert = NULL; 1498 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1499 TLS_ALERT_INTERNAL_ERROR); 1500 return -1; 1501 } 1502 conn->verify_sha1_cert = NULL; 1503 1504 if (alg == SIGN_ALG_RSA) 1505 hlen += MD5_MAC_LEN; 1506 1507 wpa_hexdump(MSG_MSGDUMP, "TLSv1: CertificateVerify hash", hash, hlen); 1508 1509 /* 1510 * RFC 2246, 4.7: 1511 * In digital signing, one-way hash functions are used as input for a 1512 * signing algorithm. A digitally-signed element is encoded as an 1513 * opaque vector <0..2^16-1>, where the length is specified by the 1514 * signing algorithm and key. 1515 * 1516 * In RSA signing, a 36-byte structure of two hashes (one SHA and one 1517 * MD5) is signed (encrypted with the private key). It is encoded with 1518 * PKCS #1 block type 0 or type 1 as described in [PKCS1]. 1519 */ 1520 signed_start = pos; /* length to be filled */ 1521 pos += 2; 1522 clen = end - pos; 1523 if (crypto_private_key_sign_pkcs1(conn->client_key, hash, hlen, 1524 pos, &clen) < 0) { 1525 wpa_printf(MSG_DEBUG, "TLSv1: Failed to sign hash (PKCS #1)"); 1526 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1527 TLS_ALERT_INTERNAL_ERROR); 1528 return -1; 1529 } 1530 WPA_PUT_BE16(signed_start, clen); 1531 1532 pos += clen; 1533 1534 WPA_PUT_BE24(hs_length, pos - hs_length - 3); 1535 1536 if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE, 1537 rhdr, end - rhdr, pos - hs_start, &rlen) < 0) { 1538 wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record"); 1539 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1540 TLS_ALERT_INTERNAL_ERROR); 1541 return -1; 1542 } 1543 pos = rhdr + rlen; 1544 1545 tls_verify_hash_add(conn, hs_start, pos - hs_start); 1546 1547 *msgpos = pos; 1548 1549 return 0; 1550 } 1551 1552 1553 static int tls_write_client_change_cipher_spec(struct tlsv1_client *conn, 1554 u8 **msgpos, u8 *end) 1555 { 1556 u8 *pos, *rhdr; 1557 size_t rlen; 1558 1559 pos = *msgpos; 1560 1561 wpa_printf(MSG_DEBUG, "TLSv1: Send ChangeCipherSpec"); 1562 rhdr = pos; 1563 pos += TLS_RECORD_HEADER_LEN; 1564 *pos = TLS_CHANGE_CIPHER_SPEC; 1565 if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC, 1566 rhdr, end - rhdr, 1, &rlen) < 0) { 1567 wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record"); 1568 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1569 TLS_ALERT_INTERNAL_ERROR); 1570 return -1; 1571 } 1572 1573 if (tlsv1_record_change_write_cipher(&conn->rl) < 0) { 1574 wpa_printf(MSG_DEBUG, "TLSv1: Failed to set write cipher for " 1575 "record layer"); 1576 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1577 TLS_ALERT_INTERNAL_ERROR); 1578 return -1; 1579 } 1580 1581 *msgpos = rhdr + rlen; 1582 1583 return 0; 1584 } 1585 1586 1587 static int tls_write_client_finished(struct tlsv1_client *conn, 1588 u8 **msgpos, u8 *end) 1589 { 1590 u8 *pos, *rhdr, *hs_start, *hs_length; 1591 size_t rlen, hlen; 1592 u8 verify_data[TLS_VERIFY_DATA_LEN]; 1593 u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN]; 1594 1595 pos = *msgpos; 1596 1597 wpa_printf(MSG_DEBUG, "TLSv1: Send Finished"); 1598 1599 /* Encrypted Handshake Message: Finished */ 1600 1601 hlen = MD5_MAC_LEN; 1602 if (conn->verify_md5_client == NULL || 1603 crypto_hash_finish(conn->verify_md5_client, hash, &hlen) < 0) { 1604 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1605 TLS_ALERT_INTERNAL_ERROR); 1606 conn->verify_md5_client = NULL; 1607 crypto_hash_finish(conn->verify_sha1_client, NULL, NULL); 1608 conn->verify_sha1_client = NULL; 1609 return -1; 1610 } 1611 conn->verify_md5_client = NULL; 1612 hlen = SHA1_MAC_LEN; 1613 if (conn->verify_sha1_client == NULL || 1614 crypto_hash_finish(conn->verify_sha1_client, hash + MD5_MAC_LEN, 1615 &hlen) < 0) { 1616 conn->verify_sha1_client = NULL; 1617 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1618 TLS_ALERT_INTERNAL_ERROR); 1619 return -1; 1620 } 1621 conn->verify_sha1_client = NULL; 1622 1623 if (tls_prf(conn->master_secret, TLS_MASTER_SECRET_LEN, 1624 "client finished", hash, MD5_MAC_LEN + SHA1_MAC_LEN, 1625 verify_data, TLS_VERIFY_DATA_LEN)) { 1626 wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate verify_data"); 1627 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1628 TLS_ALERT_INTERNAL_ERROR); 1629 return -1; 1630 } 1631 wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (client)", 1632 verify_data, TLS_VERIFY_DATA_LEN); 1633 1634 rhdr = pos; 1635 pos += TLS_RECORD_HEADER_LEN; 1636 /* Handshake */ 1637 hs_start = pos; 1638 /* HandshakeType msg_type */ 1639 *pos++ = TLS_HANDSHAKE_TYPE_FINISHED; 1640 /* uint24 length (to be filled) */ 1641 hs_length = pos; 1642 pos += 3; 1643 os_memcpy(pos, verify_data, TLS_VERIFY_DATA_LEN); 1644 pos += TLS_VERIFY_DATA_LEN; 1645 WPA_PUT_BE24(hs_length, pos - hs_length - 3); 1646 tls_verify_hash_add(conn, hs_start, pos - hs_start); 1647 1648 if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE, 1649 rhdr, end - rhdr, pos - hs_start, &rlen) < 0) { 1650 wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record"); 1651 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1652 TLS_ALERT_INTERNAL_ERROR); 1653 return -1; 1654 } 1655 1656 pos = rhdr + rlen; 1657 1658 *msgpos = pos; 1659 1660 return 0; 1661 } 1662 1663 1664 static size_t tls_client_cert_chain_der_len(struct tlsv1_client *conn) 1665 { 1666 size_t len = 0; 1667 struct x509_certificate *cert; 1668 1669 cert = conn->client_cert; 1670 while (cert) { 1671 len += 3 + cert->cert_len; 1672 if (x509_certificate_self_signed(cert)) 1673 break; 1674 cert = x509_certificate_get_subject(conn->trusted_certs, 1675 &cert->issuer); 1676 } 1677 1678 return len; 1679 } 1680 1681 1682 static u8 * tls_send_client_key_exchange(struct tlsv1_client *conn, 1683 size_t *out_len) 1684 { 1685 u8 *msg, *end, *pos; 1686 size_t msglen; 1687 1688 *out_len = 0; 1689 1690 msglen = 1000; 1691 if (conn->certificate_requested) 1692 msglen += tls_client_cert_chain_der_len(conn); 1693 1694 msg = os_malloc(msglen); 1695 if (msg == NULL) 1696 return NULL; 1697 1698 pos = msg; 1699 end = msg + msglen; 1700 1701 if (conn->certificate_requested) { 1702 if (tls_write_client_certificate(conn, &pos, end) < 0) { 1703 os_free(msg); 1704 return NULL; 1705 } 1706 } 1707 1708 if (tls_write_client_key_exchange(conn, &pos, end) < 0 || 1709 (conn->certificate_requested && conn->client_key && 1710 tls_write_client_certificate_verify(conn, &pos, end) < 0) || 1711 tls_write_client_change_cipher_spec(conn, &pos, end) < 0 || 1712 tls_write_client_finished(conn, &pos, end) < 0) { 1713 os_free(msg); 1714 return NULL; 1715 } 1716 1717 *out_len = pos - msg; 1718 1719 conn->state = SERVER_CHANGE_CIPHER_SPEC; 1720 1721 return msg; 1722 } 1723 1724 1725 static u8 * tls_send_change_cipher_spec(struct tlsv1_client *conn, 1726 size_t *out_len) 1727 { 1728 u8 *msg, *end, *pos; 1729 1730 *out_len = 0; 1731 1732 msg = os_malloc(1000); 1733 if (msg == NULL) 1734 return NULL; 1735 1736 pos = msg; 1737 end = msg + 1000; 1738 1739 if (tls_write_client_change_cipher_spec(conn, &pos, end) < 0 || 1740 tls_write_client_finished(conn, &pos, end) < 0) { 1741 os_free(msg); 1742 return NULL; 1743 } 1744 1745 *out_len = pos - msg; 1746 1747 wpa_printf(MSG_DEBUG, "TLSv1: Session resumption completed " 1748 "successfully"); 1749 conn->state = ESTABLISHED; 1750 1751 return msg; 1752 } 1753 1754 1755 static int tlsv1_client_process_handshake(struct tlsv1_client *conn, u8 ct, 1756 const u8 *buf, size_t *len) 1757 { 1758 if (ct == TLS_CONTENT_TYPE_HANDSHAKE && *len >= 4 && 1759 buf[0] == TLS_HANDSHAKE_TYPE_HELLO_REQUEST) { 1760 size_t hr_len = WPA_GET_BE24(buf + 1); 1761 if (hr_len > *len - 4) { 1762 wpa_printf(MSG_DEBUG, "TLSv1: HelloRequest underflow"); 1763 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1764 TLS_ALERT_DECODE_ERROR); 1765 return -1; 1766 } 1767 wpa_printf(MSG_DEBUG, "TLSv1: Ignored HelloRequest"); 1768 *len = 4 + hr_len; 1769 return 0; 1770 } 1771 1772 switch (conn->state) { 1773 case SERVER_HELLO: 1774 if (tls_process_server_hello(conn, ct, buf, len)) 1775 return -1; 1776 break; 1777 case SERVER_CERTIFICATE: 1778 if (tls_process_certificate(conn, ct, buf, len)) 1779 return -1; 1780 break; 1781 case SERVER_KEY_EXCHANGE: 1782 if (tls_process_server_key_exchange(conn, ct, buf, len)) 1783 return -1; 1784 break; 1785 case SERVER_CERTIFICATE_REQUEST: 1786 if (tls_process_certificate_request(conn, ct, buf, len)) 1787 return -1; 1788 break; 1789 case SERVER_HELLO_DONE: 1790 if (tls_process_server_hello_done(conn, ct, buf, len)) 1791 return -1; 1792 break; 1793 case SERVER_CHANGE_CIPHER_SPEC: 1794 if (tls_process_server_change_cipher_spec(conn, ct, buf, len)) 1795 return -1; 1796 break; 1797 case SERVER_FINISHED: 1798 if (tls_process_server_finished(conn, ct, buf, len)) 1799 return -1; 1800 break; 1801 default: 1802 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected state %d " 1803 "while processing received message", 1804 conn->state); 1805 return -1; 1806 } 1807 1808 if (ct == TLS_CONTENT_TYPE_HANDSHAKE) 1809 tls_verify_hash_add(conn, buf, *len); 1810 1811 return 0; 1812 } 1813 1814 1815 /** 1816 * tlsv1_client_handshake - Process TLS handshake 1817 * @conn: TLSv1 client connection data from tlsv1_client_init() 1818 * @in_data: Input data from TLS peer 1819 * @in_len: Input data length 1820 * @out_len: Length of the output buffer. 1821 * Returns: Pointer to output data, %NULL on failure 1822 */ 1823 u8 * tlsv1_client_handshake(struct tlsv1_client *conn, 1824 const u8 *in_data, size_t in_len, 1825 size_t *out_len) 1826 { 1827 const u8 *pos, *end; 1828 u8 *msg = NULL, *in_msg, *in_pos, *in_end, alert, ct; 1829 size_t in_msg_len; 1830 1831 if (conn->state == CLIENT_HELLO) { 1832 if (in_len) 1833 return NULL; 1834 return tls_send_client_hello(conn, out_len); 1835 } 1836 1837 if (in_data == NULL || in_len == 0) 1838 return NULL; 1839 1840 pos = in_data; 1841 end = in_data + in_len; 1842 in_msg = os_malloc(in_len); 1843 if (in_msg == NULL) 1844 return NULL; 1845 1846 /* Each received packet may include multiple records */ 1847 while (pos < end) { 1848 in_msg_len = in_len; 1849 if (tlsv1_record_receive(&conn->rl, pos, end - pos, 1850 in_msg, &in_msg_len, &alert)) { 1851 wpa_printf(MSG_DEBUG, "TLSv1: Processing received " 1852 "record failed"); 1853 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, alert); 1854 goto failed; 1855 } 1856 ct = pos[0]; 1857 1858 in_pos = in_msg; 1859 in_end = in_msg + in_msg_len; 1860 1861 /* Each received record may include multiple messages of the 1862 * same ContentType. */ 1863 while (in_pos < in_end) { 1864 in_msg_len = in_end - in_pos; 1865 if (tlsv1_client_process_handshake(conn, ct, in_pos, 1866 &in_msg_len) < 0) 1867 goto failed; 1868 in_pos += in_msg_len; 1869 } 1870 1871 pos += TLS_RECORD_HEADER_LEN + WPA_GET_BE16(pos + 3); 1872 } 1873 1874 os_free(in_msg); 1875 in_msg = NULL; 1876 1877 switch (conn->state) { 1878 case CLIENT_KEY_EXCHANGE: 1879 msg = tls_send_client_key_exchange(conn, out_len); 1880 break; 1881 case CHANGE_CIPHER_SPEC: 1882 msg = tls_send_change_cipher_spec(conn, out_len); 1883 break; 1884 case ACK_FINISHED: 1885 wpa_printf(MSG_DEBUG, "TLSv1: Handshake completed " 1886 "successfully"); 1887 conn->state = ESTABLISHED; 1888 /* Need to return something to get final TLS ACK. */ 1889 msg = os_malloc(1); 1890 *out_len = 0; 1891 break; 1892 default: 1893 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected state %d while " 1894 "generating reply", conn->state); 1895 break; 1896 } 1897 1898 failed: 1899 os_free(in_msg); 1900 if (conn->alert_level) { 1901 conn->state = FAILED; 1902 os_free(msg); 1903 msg = tls_send_alert(conn, conn->alert_level, 1904 conn->alert_description, out_len); 1905 } 1906 1907 return msg; 1908 } 1909 1910 1911 /** 1912 * tlsv1_client_encrypt - Encrypt data into TLS tunnel 1913 * @conn: TLSv1 client connection data from tlsv1_client_init() 1914 * @in_data: Pointer to plaintext data to be encrypted 1915 * @in_len: Input buffer length 1916 * @out_data: Pointer to output buffer (encrypted TLS data) 1917 * @out_len: Maximum out_data length 1918 * Returns: Number of bytes written to out_data, -1 on failure 1919 * 1920 * This function is used after TLS handshake has been completed successfully to 1921 * send data in the encrypted tunnel. 1922 */ 1923 int tlsv1_client_encrypt(struct tlsv1_client *conn, 1924 const u8 *in_data, size_t in_len, 1925 u8 *out_data, size_t out_len) 1926 { 1927 size_t rlen; 1928 1929 wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: Plaintext AppData", 1930 in_data, in_len); 1931 1932 os_memcpy(out_data + TLS_RECORD_HEADER_LEN, in_data, in_len); 1933 1934 if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_APPLICATION_DATA, 1935 out_data, out_len, in_len, &rlen) < 0) { 1936 wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record"); 1937 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1938 TLS_ALERT_INTERNAL_ERROR); 1939 return -1; 1940 } 1941 1942 return rlen; 1943 } 1944 1945 1946 /** 1947 * tlsv1_client_decrypt - Decrypt data from TLS tunnel 1948 * @conn: TLSv1 client connection data from tlsv1_client_init() 1949 * @in_data: Pointer to input buffer (encrypted TLS data) 1950 * @in_len: Input buffer length 1951 * @out_data: Pointer to output buffer (decrypted data from TLS tunnel) 1952 * @out_len: Maximum out_data length 1953 * Returns: Number of bytes written to out_data, -1 on failure 1954 * 1955 * This function is used after TLS handshake has been completed successfully to 1956 * receive data from the encrypted tunnel. 1957 */ 1958 int tlsv1_client_decrypt(struct tlsv1_client *conn, 1959 const u8 *in_data, size_t in_len, 1960 u8 *out_data, size_t out_len) 1961 { 1962 const u8 *in_end, *pos; 1963 int res; 1964 u8 alert, *out_end, *out_pos; 1965 size_t olen; 1966 1967 pos = in_data; 1968 in_end = in_data + in_len; 1969 out_pos = out_data; 1970 out_end = out_data + out_len; 1971 1972 while (pos < in_end) { 1973 if (pos[0] != TLS_CONTENT_TYPE_APPLICATION_DATA) { 1974 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected content type " 1975 "0x%x", pos[0]); 1976 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1977 TLS_ALERT_UNEXPECTED_MESSAGE); 1978 return -1; 1979 } 1980 1981 olen = out_end - out_pos; 1982 res = tlsv1_record_receive(&conn->rl, pos, in_end - pos, 1983 out_pos, &olen, &alert); 1984 if (res < 0) { 1985 wpa_printf(MSG_DEBUG, "TLSv1: Record layer processing " 1986 "failed"); 1987 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, alert); 1988 return -1; 1989 } 1990 out_pos += olen; 1991 if (out_pos > out_end) { 1992 wpa_printf(MSG_DEBUG, "TLSv1: Buffer not large enough " 1993 "for processing the received record"); 1994 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, 1995 TLS_ALERT_INTERNAL_ERROR); 1996 return -1; 1997 } 1998 1999 pos += TLS_RECORD_HEADER_LEN + WPA_GET_BE16(pos + 3); 2000 } 2001 2002 return out_pos - out_data; 2003 } 2004 2005 2006 /** 2007 * tlsv1_client_global_init - Initialize TLSv1 client 2008 * Returns: 0 on success, -1 on failure 2009 * 2010 * This function must be called before using any other TLSv1 client functions. 2011 */ 2012 int tlsv1_client_global_init(void) 2013 { 2014 return crypto_global_init(); 2015 } 2016 2017 2018 /** 2019 * tlsv1_client_global_deinit - Deinitialize TLSv1 client 2020 * 2021 * This function can be used to deinitialize the TLSv1 client that was 2022 * initialized by calling tlsv1_client_global_init(). No TLSv1 client functions 2023 * can be called after this before calling tlsv1_client_global_init() again. 2024 */ 2025 void tlsv1_client_global_deinit(void) 2026 { 2027 crypto_global_deinit(); 2028 } 2029 2030 2031 static void tlsv1_client_free_verify_hashes(struct tlsv1_client *conn) 2032 { 2033 crypto_hash_finish(conn->verify_md5_client, NULL, NULL); 2034 crypto_hash_finish(conn->verify_md5_server, NULL, NULL); 2035 crypto_hash_finish(conn->verify_md5_cert, NULL, NULL); 2036 crypto_hash_finish(conn->verify_sha1_client, NULL, NULL); 2037 crypto_hash_finish(conn->verify_sha1_server, NULL, NULL); 2038 crypto_hash_finish(conn->verify_sha1_cert, NULL, NULL); 2039 conn->verify_md5_client = NULL; 2040 conn->verify_md5_server = NULL; 2041 conn->verify_md5_cert = NULL; 2042 conn->verify_sha1_client = NULL; 2043 conn->verify_sha1_server = NULL; 2044 conn->verify_sha1_cert = NULL; 2045 } 2046 2047 2048 static int tlsv1_client_init_verify_hashes(struct tlsv1_client *conn) 2049 { 2050 conn->verify_md5_client = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 2051 0); 2052 conn->verify_md5_server = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 2053 0); 2054 conn->verify_md5_cert = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0); 2055 conn->verify_sha1_client = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 2056 0); 2057 conn->verify_sha1_server = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 2058 0); 2059 conn->verify_sha1_cert = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 2060 0); 2061 if (conn->verify_md5_client == NULL || 2062 conn->verify_md5_server == NULL || 2063 conn->verify_md5_cert == NULL || 2064 conn->verify_sha1_client == NULL || 2065 conn->verify_sha1_server == NULL || 2066 conn->verify_sha1_cert == NULL) { 2067 tlsv1_client_free_verify_hashes(conn); 2068 return -1; 2069 } 2070 return 0; 2071 } 2072 2073 2074 /** 2075 * tlsv1_client_init - Initialize TLSv1 client connection 2076 * Returns: Pointer to TLSv1 client connection data or %NULL on failure 2077 */ 2078 struct tlsv1_client * tlsv1_client_init(void) 2079 { 2080 struct tlsv1_client *conn; 2081 size_t count; 2082 u16 *suites; 2083 2084 conn = os_zalloc(sizeof(*conn)); 2085 if (conn == NULL) 2086 return NULL; 2087 2088 conn->state = CLIENT_HELLO; 2089 2090 if (tlsv1_client_init_verify_hashes(conn) < 0) { 2091 wpa_printf(MSG_DEBUG, "TLSv1: Failed to initialize verify " 2092 "hash"); 2093 os_free(conn); 2094 return NULL; 2095 } 2096 2097 count = 0; 2098 suites = conn->cipher_suites; 2099 #ifndef CONFIG_CRYPTO_INTERNAL 2100 suites[count++] = TLS_RSA_WITH_AES_256_CBC_SHA; 2101 #endif /* CONFIG_CRYPTO_INTERNAL */ 2102 suites[count++] = TLS_RSA_WITH_AES_128_CBC_SHA; 2103 suites[count++] = TLS_RSA_WITH_3DES_EDE_CBC_SHA; 2104 suites[count++] = TLS_RSA_WITH_RC4_128_SHA; 2105 suites[count++] = TLS_RSA_WITH_RC4_128_MD5; 2106 conn->num_cipher_suites = count; 2107 2108 return conn; 2109 } 2110 2111 2112 /** 2113 * tlsv1_client_deinit - Deinitialize TLSv1 client connection 2114 * @conn: TLSv1 client connection data from tlsv1_client_init() 2115 */ 2116 void tlsv1_client_deinit(struct tlsv1_client *conn) 2117 { 2118 crypto_public_key_free(conn->server_rsa_key); 2119 tlsv1_record_set_cipher_suite(&conn->rl, TLS_NULL_WITH_NULL_NULL); 2120 tlsv1_record_change_write_cipher(&conn->rl); 2121 tlsv1_record_change_read_cipher(&conn->rl); 2122 tlsv1_client_free_verify_hashes(conn); 2123 os_free(conn->client_hello_ext); 2124 tlsv1_client_free_dh(conn); 2125 x509_certificate_chain_free(conn->trusted_certs); 2126 x509_certificate_chain_free(conn->client_cert); 2127 crypto_private_key_free(conn->client_key); 2128 os_free(conn); 2129 } 2130 2131 2132 /** 2133 * tlsv1_client_established - Check whether connection has been established 2134 * @conn: TLSv1 client connection data from tlsv1_client_init() 2135 * Returns: 1 if connection is established, 0 if not 2136 */ 2137 int tlsv1_client_established(struct tlsv1_client *conn) 2138 { 2139 return conn->state == ESTABLISHED; 2140 } 2141 2142 2143 /** 2144 * tlsv1_client_prf - Use TLS-PRF to derive keying material 2145 * @conn: TLSv1 client connection data from tlsv1_client_init() 2146 * @label: Label (e.g., description of the key) for PRF 2147 * @server_random_first: seed is 0 = client_random|server_random, 2148 * 1 = server_random|client_random 2149 * @out: Buffer for output data from TLS-PRF 2150 * @out_len: Length of the output buffer 2151 * Returns: 0 on success, -1 on failure 2152 */ 2153 int tlsv1_client_prf(struct tlsv1_client *conn, const char *label, 2154 int server_random_first, u8 *out, size_t out_len) 2155 { 2156 u8 seed[2 * TLS_RANDOM_LEN]; 2157 2158 if (conn->state != ESTABLISHED) 2159 return -1; 2160 2161 if (server_random_first) { 2162 os_memcpy(seed, conn->server_random, TLS_RANDOM_LEN); 2163 os_memcpy(seed + TLS_RANDOM_LEN, conn->client_random, 2164 TLS_RANDOM_LEN); 2165 } else { 2166 os_memcpy(seed, conn->client_random, TLS_RANDOM_LEN); 2167 os_memcpy(seed + TLS_RANDOM_LEN, conn->server_random, 2168 TLS_RANDOM_LEN); 2169 } 2170 2171 return tls_prf(conn->master_secret, TLS_MASTER_SECRET_LEN, 2172 label, seed, 2 * TLS_RANDOM_LEN, out, out_len); 2173 } 2174 2175 2176 /** 2177 * tlsv1_client_get_cipher - Get current cipher name 2178 * @conn: TLSv1 client connection data from tlsv1_client_init() 2179 * @buf: Buffer for the cipher name 2180 * @buflen: buf size 2181 * Returns: 0 on success, -1 on failure 2182 * 2183 * Get the name of the currently used cipher. 2184 */ 2185 int tlsv1_client_get_cipher(struct tlsv1_client *conn, char *buf, 2186 size_t buflen) 2187 { 2188 char *cipher; 2189 2190 switch (conn->rl.cipher_suite) { 2191 case TLS_RSA_WITH_RC4_128_MD5: 2192 cipher = "RC4-MD5"; 2193 break; 2194 case TLS_RSA_WITH_RC4_128_SHA: 2195 cipher = "RC4-SHA"; 2196 break; 2197 case TLS_RSA_WITH_DES_CBC_SHA: 2198 cipher = "DES-CBC-SHA"; 2199 break; 2200 case TLS_RSA_WITH_3DES_EDE_CBC_SHA: 2201 cipher = "DES-CBC3-SHA"; 2202 break; 2203 default: 2204 return -1; 2205 } 2206 2207 os_snprintf(buf, buflen, "%s", cipher); 2208 return 0; 2209 } 2210 2211 2212 /** 2213 * tlsv1_client_shutdown - Shutdown TLS connection 2214 * @conn: TLSv1 client connection data from tlsv1_client_init() 2215 * Returns: 0 on success, -1 on failure 2216 */ 2217 int tlsv1_client_shutdown(struct tlsv1_client *conn) 2218 { 2219 conn->state = CLIENT_HELLO; 2220 2221 tlsv1_client_free_verify_hashes(conn); 2222 if (tlsv1_client_init_verify_hashes(conn) < 0) { 2223 wpa_printf(MSG_DEBUG, "TLSv1: Failed to re-initialize verify " 2224 "hash"); 2225 return -1; 2226 } 2227 2228 tlsv1_record_set_cipher_suite(&conn->rl, TLS_NULL_WITH_NULL_NULL); 2229 tlsv1_record_change_write_cipher(&conn->rl); 2230 tlsv1_record_change_read_cipher(&conn->rl); 2231 2232 conn->certificate_requested = 0; 2233 crypto_public_key_free(conn->server_rsa_key); 2234 conn->server_rsa_key = NULL; 2235 conn->session_resumed = 0; 2236 2237 return 0; 2238 } 2239 2240 2241 /** 2242 * tlsv1_client_resumed - Was session resumption used 2243 * @conn: TLSv1 client connection data from tlsv1_client_init() 2244 * Returns: 1 if current session used session resumption, 0 if not 2245 */ 2246 int tlsv1_client_resumed(struct tlsv1_client *conn) 2247 { 2248 return !!conn->session_resumed; 2249 } 2250 2251 2252 /** 2253 * tlsv1_client_hello_ext - Set TLS extension for ClientHello 2254 * @conn: TLSv1 client connection data from tlsv1_client_init() 2255 * @ext_type: Extension type 2256 * @data: Extension payload (%NULL to remove extension) 2257 * @data_len: Extension payload length 2258 * Returns: 0 on success, -1 on failure 2259 */ 2260 int tlsv1_client_hello_ext(struct tlsv1_client *conn, int ext_type, 2261 const u8 *data, size_t data_len) 2262 { 2263 u8 *pos; 2264 2265 conn->ticket = 0; 2266 os_free(conn->client_hello_ext); 2267 conn->client_hello_ext = NULL; 2268 conn->client_hello_ext_len = 0; 2269 2270 if (data == NULL || data_len == 0) 2271 return 0; 2272 2273 pos = conn->client_hello_ext = os_malloc(6 + data_len); 2274 if (pos == NULL) 2275 return -1; 2276 2277 WPA_PUT_BE16(pos, 4 + data_len); 2278 pos += 2; 2279 WPA_PUT_BE16(pos, ext_type); 2280 pos += 2; 2281 WPA_PUT_BE16(pos, data_len); 2282 pos += 2; 2283 os_memcpy(pos, data, data_len); 2284 conn->client_hello_ext_len = 6 + data_len; 2285 2286 if (ext_type == TLS_EXT_PAC_OPAQUE) { 2287 conn->ticket = 1; 2288 wpa_printf(MSG_DEBUG, "TLSv1: Using session ticket"); 2289 } 2290 2291 return 0; 2292 } 2293 2294 2295 /** 2296 * tlsv1_client_get_keys - Get master key and random data from TLS connection 2297 * @conn: TLSv1 client connection data from tlsv1_client_init() 2298 * @keys: Structure of key/random data (filled on success) 2299 * Returns: 0 on success, -1 on failure 2300 */ 2301 int tlsv1_client_get_keys(struct tlsv1_client *conn, struct tls_keys *keys) 2302 { 2303 os_memset(keys, 0, sizeof(*keys)); 2304 if (conn->state == CLIENT_HELLO) 2305 return -1; 2306 2307 keys->client_random = conn->client_random; 2308 keys->client_random_len = TLS_RANDOM_LEN; 2309 2310 if (conn->state != SERVER_HELLO) { 2311 keys->server_random = conn->server_random; 2312 keys->server_random_len = TLS_RANDOM_LEN; 2313 keys->master_key = conn->master_secret; 2314 keys->master_key_len = TLS_MASTER_SECRET_LEN; 2315 } 2316 2317 return 0; 2318 } 2319 2320 2321 /** 2322 * tlsv1_client_set_master_key - Configure master secret for TLS connection 2323 * @conn: TLSv1 client connection data from tlsv1_client_init() 2324 * @key: TLS pre-master-secret 2325 * @key_len: length of key in bytes 2326 * Returns: 0 on success, -1 on failure 2327 */ 2328 int tlsv1_client_set_master_key(struct tlsv1_client *conn, 2329 const u8 *key, size_t key_len) 2330 { 2331 if (key_len > TLS_MASTER_SECRET_LEN) 2332 return -1; 2333 wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: master_secret from session " 2334 "ticket", key, key_len); 2335 os_memcpy(conn->master_secret, key, key_len); 2336 conn->ticket_key = 1; 2337 2338 return 0; 2339 } 2340 2341 2342 /** 2343 * tlsv1_client_get_keyblock_size - Get TLS key_block size 2344 * @conn: TLSv1 client connection data from tlsv1_client_init() 2345 * Returns: Size of the key_block for the negotiated cipher suite or -1 on 2346 * failure 2347 */ 2348 int tlsv1_client_get_keyblock_size(struct tlsv1_client *conn) 2349 { 2350 if (conn->state == CLIENT_HELLO || conn->state == SERVER_HELLO) 2351 return -1; 2352 2353 return 2 * (conn->rl.hash_size + conn->rl.key_material_len + 2354 conn->rl.iv_size); 2355 } 2356 2357 2358 /** 2359 * tlsv1_client_set_cipher_list - Configure acceptable cipher suites 2360 * @conn: TLSv1 client connection data from tlsv1_client_init() 2361 * @ciphers: Zero (TLS_CIPHER_NONE) terminated list of allowed ciphers 2362 * (TLS_CIPHER_*). 2363 * Returns: 0 on success, -1 on failure 2364 */ 2365 int tlsv1_client_set_cipher_list(struct tlsv1_client *conn, u8 *ciphers) 2366 { 2367 #ifdef EAP_FAST 2368 size_t count; 2369 u16 *suites; 2370 2371 /* TODO: implement proper configuration of cipher suites */ 2372 if (ciphers[0] == TLS_CIPHER_ANON_DH_AES128_SHA) { 2373 count = 0; 2374 suites = conn->cipher_suites; 2375 suites[count++] = TLS_DH_anon_WITH_AES_256_CBC_SHA; 2376 suites[count++] = TLS_DH_anon_WITH_AES_128_CBC_SHA; 2377 suites[count++] = TLS_DH_anon_WITH_3DES_EDE_CBC_SHA; 2378 suites[count++] = TLS_DH_anon_WITH_RC4_128_MD5; 2379 suites[count++] = TLS_DH_anon_WITH_DES_CBC_SHA; 2380 conn->num_cipher_suites = count; 2381 } 2382 2383 return 0; 2384 #else /* EAP_FAST */ 2385 return -1; 2386 #endif /* EAP_FAST */ 2387 } 2388 2389 2390 static int tlsv1_client_add_cert_der(struct x509_certificate **chain, 2391 const u8 *buf, size_t len) 2392 { 2393 struct x509_certificate *cert; 2394 char name[128]; 2395 2396 cert = x509_certificate_parse(buf, len); 2397 if (cert == NULL) { 2398 wpa_printf(MSG_INFO, "TLSv1: %s - failed to parse certificate", 2399 __func__); 2400 return -1; 2401 } 2402 2403 cert->next = *chain; 2404 *chain = cert; 2405 2406 x509_name_string(&cert->subject, name, sizeof(name)); 2407 wpa_printf(MSG_DEBUG, "TLSv1: Added certificate: %s", name); 2408 2409 return 0; 2410 } 2411 2412 2413 static const char *pem_cert_begin = "-----BEGIN CERTIFICATE-----"; 2414 static const char *pem_cert_end = "-----END CERTIFICATE-----"; 2415 2416 2417 static const u8 * search_tag(const char *tag, const u8 *buf, size_t len) 2418 { 2419 size_t i, plen; 2420 2421 plen = os_strlen(tag); 2422 if (len < plen) 2423 return NULL; 2424 2425 for (i = 0; i < len - plen; i++) { 2426 if (os_memcmp(buf + i, tag, plen) == 0) 2427 return buf + i; 2428 } 2429 2430 return NULL; 2431 } 2432 2433 2434 static int tlsv1_client_add_cert(struct x509_certificate **chain, 2435 const u8 *buf, size_t len) 2436 { 2437 const u8 *pos, *end; 2438 unsigned char *der; 2439 size_t der_len; 2440 2441 pos = search_tag(pem_cert_begin, buf, len); 2442 if (!pos) { 2443 wpa_printf(MSG_DEBUG, "TLSv1: No PEM certificate tag found - " 2444 "assume DER format"); 2445 return tlsv1_client_add_cert_der(chain, buf, len); 2446 } 2447 2448 wpa_printf(MSG_DEBUG, "TLSv1: Converting PEM format certificate into " 2449 "DER format"); 2450 2451 while (pos) { 2452 pos += os_strlen(pem_cert_begin); 2453 end = search_tag(pem_cert_end, pos, buf + len - pos); 2454 if (end == NULL) { 2455 wpa_printf(MSG_INFO, "TLSv1: Could not find PEM " 2456 "certificate end tag (%s)", pem_cert_end); 2457 return -1; 2458 } 2459 2460 der = base64_decode(pos, end - pos, &der_len); 2461 if (der == NULL) { 2462 wpa_printf(MSG_INFO, "TLSv1: Could not decode PEM " 2463 "certificate"); 2464 return -1; 2465 } 2466 2467 if (tlsv1_client_add_cert_der(chain, der, der_len) < 0) { 2468 wpa_printf(MSG_INFO, "TLSv1: Failed to parse PEM " 2469 "certificate after DER conversion"); 2470 os_free(der); 2471 return -1; 2472 } 2473 2474 os_free(der); 2475 2476 end += os_strlen(pem_cert_end); 2477 pos = search_tag(pem_cert_begin, end, buf + len - end); 2478 } 2479 2480 return 0; 2481 } 2482 2483 2484 static int tlsv1_client_set_cert_chain(struct x509_certificate **chain, 2485 const char *cert, const u8 *cert_blob, 2486 size_t cert_blob_len) 2487 { 2488 if (cert_blob) 2489 return tlsv1_client_add_cert(chain, cert_blob, cert_blob_len); 2490 2491 if (cert) { 2492 u8 *buf; 2493 size_t len; 2494 int ret; 2495 2496 buf = (u8 *) os_readfile(cert, &len); 2497 if (buf == NULL) { 2498 wpa_printf(MSG_INFO, "TLSv1: Failed to read '%s'", 2499 cert); 2500 return -1; 2501 } 2502 2503 ret = tlsv1_client_add_cert(chain, buf, len); 2504 os_free(buf); 2505 return ret; 2506 } 2507 2508 return 0; 2509 } 2510 2511 2512 /** 2513 * tlsv1_client_set_ca_cert - Set trusted CA certificate(s) 2514 * @conn: TLSv1 client connection data from tlsv1_client_init() 2515 * @cert: File or reference name for X.509 certificate in PEM or DER format 2516 * @cert_blob: cert as inlined data or %NULL if not used 2517 * @cert_blob_len: ca_cert_blob length 2518 * @path: Path to CA certificates (not yet supported) 2519 * Returns: 0 on success, -1 on failure 2520 */ 2521 int tlsv1_client_set_ca_cert(struct tlsv1_client *conn, const char *cert, 2522 const u8 *cert_blob, size_t cert_blob_len, 2523 const char *path) 2524 { 2525 if (tlsv1_client_set_cert_chain(&conn->trusted_certs, cert, 2526 cert_blob, cert_blob_len) < 0) 2527 return -1; 2528 2529 if (path) { 2530 /* TODO: add support for reading number of certificate files */ 2531 wpa_printf(MSG_INFO, "TLSv1: Use of CA certificate directory " 2532 "not yet supported"); 2533 return -1; 2534 } 2535 2536 return 0; 2537 } 2538 2539 2540 /** 2541 * tlsv1_client_set_client_cert - Set client certificate 2542 * @conn: TLSv1 client connection data from tlsv1_client_init() 2543 * @cert: File or reference name for X.509 certificate in PEM or DER format 2544 * @cert_blob: cert as inlined data or %NULL if not used 2545 * @cert_blob_len: ca_cert_blob length 2546 * Returns: 0 on success, -1 on failure 2547 */ 2548 int tlsv1_client_set_client_cert(struct tlsv1_client *conn, const char *cert, 2549 const u8 *cert_blob, size_t cert_blob_len) 2550 { 2551 return tlsv1_client_set_cert_chain(&conn->client_cert, cert, 2552 cert_blob, cert_blob_len); 2553 } 2554 2555 2556 static int tlsv1_client_set_key(struct tlsv1_client *conn, 2557 const u8 *key, size_t len) 2558 { 2559 conn->client_key = crypto_private_key_import(key, len); 2560 if (conn->client_key == NULL) { 2561 wpa_printf(MSG_INFO, "TLSv1: Failed to parse private key"); 2562 return -1; 2563 } 2564 return 0; 2565 } 2566 2567 2568 /** 2569 * tlsv1_client_set_private_key - Set client private key 2570 * @conn: TLSv1 client connection data from tlsv1_client_init() 2571 * @private_key: File or reference name for the key in PEM or DER format 2572 * @private_key_passwd: Passphrase for decrypted private key, %NULL if no 2573 * passphrase is used. 2574 * @private_key_blob: private_key as inlined data or %NULL if not used 2575 * @private_key_blob_len: private_key_blob length 2576 * Returns: 0 on success, -1 on failure 2577 */ 2578 int tlsv1_client_set_private_key(struct tlsv1_client *conn, 2579 const char *private_key, 2580 const char *private_key_passwd, 2581 const u8 *private_key_blob, 2582 size_t private_key_blob_len) 2583 { 2584 crypto_private_key_free(conn->client_key); 2585 conn->client_key = NULL; 2586 2587 if (private_key_blob) 2588 return tlsv1_client_set_key(conn, private_key_blob, 2589 private_key_blob_len); 2590 2591 if (private_key) { 2592 u8 *buf; 2593 size_t len; 2594 int ret; 2595 2596 buf = (u8 *) os_readfile(private_key, &len); 2597 if (buf == NULL) { 2598 wpa_printf(MSG_INFO, "TLSv1: Failed to read '%s'", 2599 private_key); 2600 return -1; 2601 } 2602 2603 ret = tlsv1_client_set_key(conn, buf, len); 2604 os_free(buf); 2605 return ret; 2606 } 2607 2608 return 0; 2609 } 2610