1 /* 2 * TLSv1 server - write 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 "md5.h" 19 #include "sha1.h" 20 #include "x509v3.h" 21 #include "tls.h" 22 #include "tlsv1_common.h" 23 #include "tlsv1_record.h" 24 #include "tlsv1_server.h" 25 #include "tlsv1_server_i.h" 26 27 28 static size_t tls_server_cert_chain_der_len(struct tlsv1_server *conn) 29 { 30 size_t len = 0; 31 struct x509_certificate *cert; 32 33 cert = conn->cred->cert; 34 while (cert) { 35 len += 3 + cert->cert_len; 36 if (x509_certificate_self_signed(cert)) 37 break; 38 cert = x509_certificate_get_subject(conn->cred->trusted_certs, 39 &cert->issuer); 40 } 41 42 return len; 43 } 44 45 46 static int tls_write_server_hello(struct tlsv1_server *conn, 47 u8 **msgpos, u8 *end) 48 { 49 u8 *pos, *rhdr, *hs_start, *hs_length; 50 struct os_time now; 51 size_t rlen; 52 53 pos = *msgpos; 54 55 wpa_printf(MSG_DEBUG, "TLSv1: Send ServerHello"); 56 rhdr = pos; 57 pos += TLS_RECORD_HEADER_LEN; 58 59 os_get_time(&now); 60 WPA_PUT_BE32(conn->server_random, now.sec); 61 if (os_get_random(conn->server_random + 4, TLS_RANDOM_LEN - 4)) { 62 wpa_printf(MSG_ERROR, "TLSv1: Could not generate " 63 "server_random"); 64 return -1; 65 } 66 wpa_hexdump(MSG_MSGDUMP, "TLSv1: server_random", 67 conn->server_random, TLS_RANDOM_LEN); 68 69 conn->session_id_len = TLS_SESSION_ID_MAX_LEN; 70 if (os_get_random(conn->session_id, conn->session_id_len)) { 71 wpa_printf(MSG_ERROR, "TLSv1: Could not generate " 72 "session_id"); 73 return -1; 74 } 75 wpa_hexdump(MSG_MSGDUMP, "TLSv1: session_id", 76 conn->session_id, conn->session_id_len); 77 78 /* opaque fragment[TLSPlaintext.length] */ 79 80 /* Handshake */ 81 hs_start = pos; 82 /* HandshakeType msg_type */ 83 *pos++ = TLS_HANDSHAKE_TYPE_SERVER_HELLO; 84 /* uint24 length (to be filled) */ 85 hs_length = pos; 86 pos += 3; 87 /* body - ServerHello */ 88 /* ProtocolVersion server_version */ 89 WPA_PUT_BE16(pos, TLS_VERSION); 90 pos += 2; 91 /* Random random: uint32 gmt_unix_time, opaque random_bytes */ 92 os_memcpy(pos, conn->server_random, TLS_RANDOM_LEN); 93 pos += TLS_RANDOM_LEN; 94 /* SessionID session_id */ 95 *pos++ = conn->session_id_len; 96 os_memcpy(pos, conn->session_id, conn->session_id_len); 97 pos += conn->session_id_len; 98 /* CipherSuite cipher_suite */ 99 WPA_PUT_BE16(pos, conn->cipher_suite); 100 pos += 2; 101 /* CompressionMethod compression_method */ 102 *pos++ = TLS_COMPRESSION_NULL; 103 104 if (conn->session_ticket && conn->session_ticket_cb) { 105 int res = conn->session_ticket_cb( 106 conn->session_ticket_cb_ctx, 107 conn->session_ticket, conn->session_ticket_len, 108 conn->client_random, conn->server_random, 109 conn->master_secret); 110 if (res < 0) { 111 wpa_printf(MSG_DEBUG, "TLSv1: SessionTicket callback " 112 "indicated failure"); 113 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 114 TLS_ALERT_HANDSHAKE_FAILURE); 115 return -1; 116 } 117 conn->use_session_ticket = res; 118 119 if (conn->use_session_ticket) { 120 if (tlsv1_server_derive_keys(conn, NULL, 0) < 0) { 121 wpa_printf(MSG_DEBUG, "TLSv1: Failed to " 122 "derive keys"); 123 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 124 TLS_ALERT_INTERNAL_ERROR); 125 return -1; 126 } 127 } 128 129 /* 130 * RFC 4507 specifies that server would include an empty 131 * SessionTicket extension in ServerHello and a 132 * NewSessionTicket message after the ServerHello. However, 133 * EAP-FAST (RFC 4851), i.e., the only user of SessionTicket 134 * extension at the moment, does not use such extensions. 135 * 136 * TODO: Add support for configuring RFC 4507 behavior and make 137 * EAP-FAST disable it. 138 */ 139 } 140 141 WPA_PUT_BE24(hs_length, pos - hs_length - 3); 142 tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start); 143 144 if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE, 145 rhdr, end - rhdr, pos - hs_start, &rlen) < 0) { 146 wpa_printf(MSG_DEBUG, "TLSv1: Failed to create TLS record"); 147 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 148 TLS_ALERT_INTERNAL_ERROR); 149 return -1; 150 } 151 pos = rhdr + rlen; 152 153 *msgpos = pos; 154 155 return 0; 156 } 157 158 159 static int tls_write_server_certificate(struct tlsv1_server *conn, 160 u8 **msgpos, u8 *end) 161 { 162 u8 *pos, *rhdr, *hs_start, *hs_length, *cert_start; 163 size_t rlen; 164 struct x509_certificate *cert; 165 const struct tls_cipher_suite *suite; 166 167 suite = tls_get_cipher_suite(conn->rl.cipher_suite); 168 if (suite && suite->key_exchange == TLS_KEY_X_DH_anon) { 169 wpa_printf(MSG_DEBUG, "TLSv1: Do not send Certificate when " 170 "using anonymous DH"); 171 return 0; 172 } 173 174 pos = *msgpos; 175 176 wpa_printf(MSG_DEBUG, "TLSv1: Send Certificate"); 177 rhdr = pos; 178 pos += TLS_RECORD_HEADER_LEN; 179 180 /* opaque fragment[TLSPlaintext.length] */ 181 182 /* Handshake */ 183 hs_start = pos; 184 /* HandshakeType msg_type */ 185 *pos++ = TLS_HANDSHAKE_TYPE_CERTIFICATE; 186 /* uint24 length (to be filled) */ 187 hs_length = pos; 188 pos += 3; 189 /* body - Certificate */ 190 /* uint24 length (to be filled) */ 191 cert_start = pos; 192 pos += 3; 193 cert = conn->cred->cert; 194 while (cert) { 195 if (pos + 3 + cert->cert_len > end) { 196 wpa_printf(MSG_DEBUG, "TLSv1: Not enough buffer space " 197 "for Certificate (cert_len=%lu left=%lu)", 198 (unsigned long) cert->cert_len, 199 (unsigned long) (end - pos)); 200 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 201 TLS_ALERT_INTERNAL_ERROR); 202 return -1; 203 } 204 WPA_PUT_BE24(pos, cert->cert_len); 205 pos += 3; 206 os_memcpy(pos, cert->cert_start, cert->cert_len); 207 pos += cert->cert_len; 208 209 if (x509_certificate_self_signed(cert)) 210 break; 211 cert = x509_certificate_get_subject(conn->cred->trusted_certs, 212 &cert->issuer); 213 } 214 if (cert == conn->cred->cert || cert == NULL) { 215 /* 216 * Server was not configured with all the needed certificates 217 * to form a full certificate chain. The client may fail to 218 * validate the chain unless it is configured with all the 219 * missing CA certificates. 220 */ 221 wpa_printf(MSG_DEBUG, "TLSv1: Full server certificate chain " 222 "not configured - validation may fail"); 223 } 224 WPA_PUT_BE24(cert_start, pos - cert_start - 3); 225 226 WPA_PUT_BE24(hs_length, pos - hs_length - 3); 227 228 if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE, 229 rhdr, end - rhdr, pos - hs_start, &rlen) < 0) { 230 wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record"); 231 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 232 TLS_ALERT_INTERNAL_ERROR); 233 return -1; 234 } 235 pos = rhdr + rlen; 236 237 tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start); 238 239 *msgpos = pos; 240 241 return 0; 242 } 243 244 245 static int tls_write_server_key_exchange(struct tlsv1_server *conn, 246 u8 **msgpos, u8 *end) 247 { 248 tls_key_exchange keyx; 249 const struct tls_cipher_suite *suite; 250 #ifdef EAP_FAST 251 u8 *pos, *rhdr, *hs_start, *hs_length; 252 size_t rlen; 253 u8 *dh_ys; 254 size_t dh_ys_len; 255 #endif /* EAP_FAST */ 256 257 suite = tls_get_cipher_suite(conn->rl.cipher_suite); 258 if (suite == NULL) 259 keyx = TLS_KEY_X_NULL; 260 else 261 keyx = suite->key_exchange; 262 263 if (!tls_server_key_exchange_allowed(conn->rl.cipher_suite)) { 264 wpa_printf(MSG_DEBUG, "TLSv1: No ServerKeyExchange needed"); 265 return 0; 266 } 267 268 if (keyx != TLS_KEY_X_DH_anon) { 269 /* TODO? */ 270 wpa_printf(MSG_DEBUG, "TLSv1: ServerKeyExchange not yet " 271 "supported with key exchange type %d", keyx); 272 return -1; 273 } 274 275 #ifdef EAP_FAST 276 if (conn->cred == NULL || conn->cred->dh_p == NULL || 277 conn->cred->dh_g == NULL) { 278 wpa_printf(MSG_DEBUG, "TLSv1: No DH parameters available for " 279 "ServerKeyExhcange"); 280 return -1; 281 } 282 283 os_free(conn->dh_secret); 284 conn->dh_secret_len = conn->cred->dh_p_len; 285 conn->dh_secret = os_malloc(conn->dh_secret_len); 286 if (conn->dh_secret == NULL) { 287 wpa_printf(MSG_DEBUG, "TLSv1: Failed to allocate " 288 "memory for secret (Diffie-Hellman)"); 289 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 290 TLS_ALERT_INTERNAL_ERROR); 291 return -1; 292 } 293 if (os_get_random(conn->dh_secret, conn->dh_secret_len)) { 294 wpa_printf(MSG_DEBUG, "TLSv1: Failed to get random " 295 "data for Diffie-Hellman"); 296 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 297 TLS_ALERT_INTERNAL_ERROR); 298 os_free(conn->dh_secret); 299 conn->dh_secret = NULL; 300 return -1; 301 } 302 303 if (os_memcmp(conn->dh_secret, conn->cred->dh_p, conn->dh_secret_len) > 304 0) 305 conn->dh_secret[0] = 0; /* make sure secret < p */ 306 307 pos = conn->dh_secret; 308 while (pos + 1 < conn->dh_secret + conn->dh_secret_len && *pos == 0) 309 pos++; 310 if (pos != conn->dh_secret) { 311 os_memmove(conn->dh_secret, pos, 312 conn->dh_secret_len - (pos - conn->dh_secret)); 313 conn->dh_secret_len -= pos - conn->dh_secret; 314 } 315 wpa_hexdump_key(MSG_DEBUG, "TLSv1: DH server's secret value", 316 conn->dh_secret, conn->dh_secret_len); 317 318 /* Ys = g^secret mod p */ 319 dh_ys_len = conn->cred->dh_p_len; 320 dh_ys = os_malloc(dh_ys_len); 321 if (dh_ys == NULL) { 322 wpa_printf(MSG_DEBUG, "TLSv1: Failed to allocate memory for " 323 "Diffie-Hellman"); 324 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 325 TLS_ALERT_INTERNAL_ERROR); 326 return -1; 327 } 328 if (crypto_mod_exp(conn->cred->dh_g, conn->cred->dh_g_len, 329 conn->dh_secret, conn->dh_secret_len, 330 conn->cred->dh_p, conn->cred->dh_p_len, 331 dh_ys, &dh_ys_len)) { 332 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 333 TLS_ALERT_INTERNAL_ERROR); 334 os_free(dh_ys); 335 return -1; 336 } 337 338 wpa_hexdump(MSG_DEBUG, "TLSv1: DH Ys (server's public value)", 339 dh_ys, dh_ys_len); 340 341 /* 342 * struct { 343 * select (KeyExchangeAlgorithm) { 344 * case diffie_hellman: 345 * ServerDHParams params; 346 * Signature signed_params; 347 * case rsa: 348 * ServerRSAParams params; 349 * Signature signed_params; 350 * }; 351 * } ServerKeyExchange; 352 * 353 * struct { 354 * opaque dh_p<1..2^16-1>; 355 * opaque dh_g<1..2^16-1>; 356 * opaque dh_Ys<1..2^16-1>; 357 * } ServerDHParams; 358 */ 359 360 pos = *msgpos; 361 362 wpa_printf(MSG_DEBUG, "TLSv1: Send ServerKeyExchange"); 363 rhdr = pos; 364 pos += TLS_RECORD_HEADER_LEN; 365 366 /* opaque fragment[TLSPlaintext.length] */ 367 368 /* Handshake */ 369 hs_start = pos; 370 /* HandshakeType msg_type */ 371 *pos++ = TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE; 372 /* uint24 length (to be filled) */ 373 hs_length = pos; 374 pos += 3; 375 376 /* body - ServerDHParams */ 377 /* dh_p */ 378 if (pos + 2 + conn->cred->dh_p_len > end) { 379 wpa_printf(MSG_DEBUG, "TLSv1: Not enough buffer space for " 380 "dh_p"); 381 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 382 TLS_ALERT_INTERNAL_ERROR); 383 os_free(dh_ys); 384 return -1; 385 } 386 WPA_PUT_BE16(pos, conn->cred->dh_p_len); 387 pos += 2; 388 os_memcpy(pos, conn->cred->dh_p, conn->cred->dh_p_len); 389 pos += conn->cred->dh_p_len; 390 391 /* dh_g */ 392 if (pos + 2 + conn->cred->dh_g_len > end) { 393 wpa_printf(MSG_DEBUG, "TLSv1: Not enough buffer space for " 394 "dh_g"); 395 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 396 TLS_ALERT_INTERNAL_ERROR); 397 os_free(dh_ys); 398 return -1; 399 } 400 WPA_PUT_BE16(pos, conn->cred->dh_g_len); 401 pos += 2; 402 os_memcpy(pos, conn->cred->dh_g, conn->cred->dh_g_len); 403 pos += conn->cred->dh_g_len; 404 405 /* dh_Ys */ 406 if (pos + 2 + dh_ys_len > end) { 407 wpa_printf(MSG_DEBUG, "TLSv1: Not enough buffer space for " 408 "dh_Ys"); 409 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 410 TLS_ALERT_INTERNAL_ERROR); 411 os_free(dh_ys); 412 return -1; 413 } 414 WPA_PUT_BE16(pos, dh_ys_len); 415 pos += 2; 416 os_memcpy(pos, dh_ys, dh_ys_len); 417 pos += dh_ys_len; 418 os_free(dh_ys); 419 420 WPA_PUT_BE24(hs_length, pos - hs_length - 3); 421 422 if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE, 423 rhdr, end - rhdr, pos - hs_start, &rlen) < 0) { 424 wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record"); 425 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 426 TLS_ALERT_INTERNAL_ERROR); 427 return -1; 428 } 429 pos = rhdr + rlen; 430 431 tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start); 432 433 *msgpos = pos; 434 435 return 0; 436 #else /* EAP_FAST */ 437 return -1; 438 #endif /* EAP_FAST */ 439 } 440 441 442 static int tls_write_server_certificate_request(struct tlsv1_server *conn, 443 u8 **msgpos, u8 *end) 444 { 445 u8 *pos, *rhdr, *hs_start, *hs_length; 446 size_t rlen; 447 448 if (!conn->verify_peer) { 449 wpa_printf(MSG_DEBUG, "TLSv1: No CertificateRequest needed"); 450 return 0; 451 } 452 453 pos = *msgpos; 454 455 wpa_printf(MSG_DEBUG, "TLSv1: Send CertificateRequest"); 456 rhdr = pos; 457 pos += TLS_RECORD_HEADER_LEN; 458 459 /* opaque fragment[TLSPlaintext.length] */ 460 461 /* Handshake */ 462 hs_start = pos; 463 /* HandshakeType msg_type */ 464 *pos++ = TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST; 465 /* uint24 length (to be filled) */ 466 hs_length = pos; 467 pos += 3; 468 /* body - CertificateRequest */ 469 470 /* 471 * enum { 472 * rsa_sign(1), dss_sign(2), rsa_fixed_dh(3), dss_fixed_dh(4), 473 * (255) 474 * } ClientCertificateType; 475 * ClientCertificateType certificate_types<1..2^8-1> 476 */ 477 *pos++ = 1; 478 *pos++ = 1; /* rsa_sign */ 479 480 /* 481 * opaque DistinguishedName<1..2^16-1> 482 * DistinguishedName certificate_authorities<3..2^16-1> 483 */ 484 /* TODO: add support for listing DNs for trusted CAs */ 485 WPA_PUT_BE16(pos, 0); 486 pos += 2; 487 488 WPA_PUT_BE24(hs_length, pos - hs_length - 3); 489 490 if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE, 491 rhdr, end - rhdr, pos - hs_start, &rlen) < 0) { 492 wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record"); 493 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 494 TLS_ALERT_INTERNAL_ERROR); 495 return -1; 496 } 497 pos = rhdr + rlen; 498 499 tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start); 500 501 *msgpos = pos; 502 503 return 0; 504 } 505 506 507 static int tls_write_server_hello_done(struct tlsv1_server *conn, 508 u8 **msgpos, u8 *end) 509 { 510 u8 *pos, *rhdr, *hs_start, *hs_length; 511 size_t rlen; 512 513 pos = *msgpos; 514 515 wpa_printf(MSG_DEBUG, "TLSv1: Send ServerHelloDone"); 516 rhdr = pos; 517 pos += TLS_RECORD_HEADER_LEN; 518 519 /* opaque fragment[TLSPlaintext.length] */ 520 521 /* Handshake */ 522 hs_start = pos; 523 /* HandshakeType msg_type */ 524 *pos++ = TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE; 525 /* uint24 length (to be filled) */ 526 hs_length = pos; 527 pos += 3; 528 /* body - ServerHelloDone (empty) */ 529 530 WPA_PUT_BE24(hs_length, pos - hs_length - 3); 531 532 if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE, 533 rhdr, end - rhdr, pos - hs_start, &rlen) < 0) { 534 wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record"); 535 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 536 TLS_ALERT_INTERNAL_ERROR); 537 return -1; 538 } 539 pos = rhdr + rlen; 540 541 tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start); 542 543 *msgpos = pos; 544 545 return 0; 546 } 547 548 549 static int tls_write_server_change_cipher_spec(struct tlsv1_server *conn, 550 u8 **msgpos, u8 *end) 551 { 552 u8 *pos, *rhdr; 553 size_t rlen; 554 555 pos = *msgpos; 556 557 wpa_printf(MSG_DEBUG, "TLSv1: Send ChangeCipherSpec"); 558 rhdr = pos; 559 pos += TLS_RECORD_HEADER_LEN; 560 *pos = TLS_CHANGE_CIPHER_SPEC; 561 if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC, 562 rhdr, end - rhdr, 1, &rlen) < 0) { 563 wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record"); 564 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 565 TLS_ALERT_INTERNAL_ERROR); 566 return -1; 567 } 568 569 if (tlsv1_record_change_write_cipher(&conn->rl) < 0) { 570 wpa_printf(MSG_DEBUG, "TLSv1: Failed to set write cipher for " 571 "record layer"); 572 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 573 TLS_ALERT_INTERNAL_ERROR); 574 return -1; 575 } 576 577 *msgpos = rhdr + rlen; 578 579 return 0; 580 } 581 582 583 static int tls_write_server_finished(struct tlsv1_server *conn, 584 u8 **msgpos, u8 *end) 585 { 586 u8 *pos, *rhdr, *hs_start, *hs_length; 587 size_t rlen, hlen; 588 u8 verify_data[TLS_VERIFY_DATA_LEN]; 589 u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN]; 590 591 pos = *msgpos; 592 593 wpa_printf(MSG_DEBUG, "TLSv1: Send Finished"); 594 595 /* Encrypted Handshake Message: Finished */ 596 597 hlen = MD5_MAC_LEN; 598 if (conn->verify.md5_server == NULL || 599 crypto_hash_finish(conn->verify.md5_server, hash, &hlen) < 0) { 600 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 601 TLS_ALERT_INTERNAL_ERROR); 602 conn->verify.md5_server = NULL; 603 crypto_hash_finish(conn->verify.sha1_server, NULL, NULL); 604 conn->verify.sha1_server = NULL; 605 return -1; 606 } 607 conn->verify.md5_server = NULL; 608 hlen = SHA1_MAC_LEN; 609 if (conn->verify.sha1_server == NULL || 610 crypto_hash_finish(conn->verify.sha1_server, hash + MD5_MAC_LEN, 611 &hlen) < 0) { 612 conn->verify.sha1_server = NULL; 613 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 614 TLS_ALERT_INTERNAL_ERROR); 615 return -1; 616 } 617 conn->verify.sha1_server = NULL; 618 619 if (tls_prf(conn->master_secret, TLS_MASTER_SECRET_LEN, 620 "server finished", hash, MD5_MAC_LEN + SHA1_MAC_LEN, 621 verify_data, TLS_VERIFY_DATA_LEN)) { 622 wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate verify_data"); 623 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 624 TLS_ALERT_INTERNAL_ERROR); 625 return -1; 626 } 627 wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (server)", 628 verify_data, TLS_VERIFY_DATA_LEN); 629 630 rhdr = pos; 631 pos += TLS_RECORD_HEADER_LEN; 632 /* Handshake */ 633 hs_start = pos; 634 /* HandshakeType msg_type */ 635 *pos++ = TLS_HANDSHAKE_TYPE_FINISHED; 636 /* uint24 length (to be filled) */ 637 hs_length = pos; 638 pos += 3; 639 os_memcpy(pos, verify_data, TLS_VERIFY_DATA_LEN); 640 pos += TLS_VERIFY_DATA_LEN; 641 WPA_PUT_BE24(hs_length, pos - hs_length - 3); 642 tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start); 643 644 if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE, 645 rhdr, end - rhdr, pos - hs_start, &rlen) < 0) { 646 wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record"); 647 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 648 TLS_ALERT_INTERNAL_ERROR); 649 return -1; 650 } 651 652 pos = rhdr + rlen; 653 654 *msgpos = pos; 655 656 return 0; 657 } 658 659 660 static u8 * tls_send_server_hello(struct tlsv1_server *conn, size_t *out_len) 661 { 662 u8 *msg, *end, *pos; 663 size_t msglen; 664 665 *out_len = 0; 666 667 msglen = 1000 + tls_server_cert_chain_der_len(conn); 668 669 msg = os_malloc(msglen); 670 if (msg == NULL) 671 return NULL; 672 673 pos = msg; 674 end = msg + msglen; 675 676 if (tls_write_server_hello(conn, &pos, end) < 0) { 677 os_free(msg); 678 return NULL; 679 } 680 681 if (conn->use_session_ticket) { 682 /* Abbreviated handshake using session ticket; RFC 4507 */ 683 if (tls_write_server_change_cipher_spec(conn, &pos, end) < 0 || 684 tls_write_server_finished(conn, &pos, end) < 0) { 685 os_free(msg); 686 return NULL; 687 } 688 689 *out_len = pos - msg; 690 691 conn->state = CHANGE_CIPHER_SPEC; 692 693 return msg; 694 } 695 696 /* Full handshake */ 697 if (tls_write_server_certificate(conn, &pos, end) < 0 || 698 tls_write_server_key_exchange(conn, &pos, end) < 0 || 699 tls_write_server_certificate_request(conn, &pos, end) < 0 || 700 tls_write_server_hello_done(conn, &pos, end) < 0) { 701 os_free(msg); 702 return NULL; 703 } 704 705 *out_len = pos - msg; 706 707 conn->state = CLIENT_CERTIFICATE; 708 709 return msg; 710 } 711 712 713 static u8 * tls_send_change_cipher_spec(struct tlsv1_server *conn, 714 size_t *out_len) 715 { 716 u8 *msg, *end, *pos; 717 718 *out_len = 0; 719 720 msg = os_malloc(1000); 721 if (msg == NULL) 722 return NULL; 723 724 pos = msg; 725 end = msg + 1000; 726 727 if (tls_write_server_change_cipher_spec(conn, &pos, end) < 0 || 728 tls_write_server_finished(conn, &pos, end) < 0) { 729 os_free(msg); 730 return NULL; 731 } 732 733 *out_len = pos - msg; 734 735 wpa_printf(MSG_DEBUG, "TLSv1: Handshake completed successfully"); 736 conn->state = ESTABLISHED; 737 738 return msg; 739 } 740 741 742 u8 * tlsv1_server_handshake_write(struct tlsv1_server *conn, size_t *out_len) 743 { 744 switch (conn->state) { 745 case SERVER_HELLO: 746 return tls_send_server_hello(conn, out_len); 747 case SERVER_CHANGE_CIPHER_SPEC: 748 return tls_send_change_cipher_spec(conn, out_len); 749 default: 750 if (conn->state == ESTABLISHED && conn->use_session_ticket) { 751 /* Abbreviated handshake was already completed. */ 752 return NULL; 753 } 754 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected state %d while " 755 "generating reply", conn->state); 756 return NULL; 757 } 758 } 759 760 761 u8 * tlsv1_server_send_alert(struct tlsv1_server *conn, u8 level, 762 u8 description, size_t *out_len) 763 { 764 u8 *alert, *pos, *length; 765 766 wpa_printf(MSG_DEBUG, "TLSv1: Send Alert(%d:%d)", level, description); 767 *out_len = 0; 768 769 alert = os_malloc(10); 770 if (alert == NULL) 771 return NULL; 772 773 pos = alert; 774 775 /* TLSPlaintext */ 776 /* ContentType type */ 777 *pos++ = TLS_CONTENT_TYPE_ALERT; 778 /* ProtocolVersion version */ 779 WPA_PUT_BE16(pos, TLS_VERSION); 780 pos += 2; 781 /* uint16 length (to be filled) */ 782 length = pos; 783 pos += 2; 784 /* opaque fragment[TLSPlaintext.length] */ 785 786 /* Alert */ 787 /* AlertLevel level */ 788 *pos++ = level; 789 /* AlertDescription description */ 790 *pos++ = description; 791 792 WPA_PUT_BE16(length, pos - length - 2); 793 *out_len = pos - alert; 794 795 return alert; 796 } 797