1/* 2 * hostapd / EAP-TTLS (RFC 5281) 3 * Copyright (c) 2004-2008, Jouni Malinen <j@w1.fi> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 as 7 * published by the Free Software Foundation. 8 * 9 * Alternatively, this software may be distributed under the terms of BSD 10 * license. 11 * 12 * See README and COPYING for more details. 13 */ 14 15#include "includes.h" 16 17#include "common.h" 18#include "eap_server/eap_i.h" 19#include "eap_server/eap_tls_common.h" 20#include "ms_funcs.h" 21#include "sha1.h" 22#include "eap_common/chap.h" 23#include "tls.h" 24#include "eap_common/eap_ttls.h" 25 26 27/* Maximum supported TTLS version 28 * 0 = RFC 5281 29 * 1 = draft-funk-eap-ttls-v1-00.txt 30 */ 31#ifndef EAP_TTLS_VERSION 32#define EAP_TTLS_VERSION 0 /* TTLSv1 implementation is not yet complete */ 33#endif /* EAP_TTLS_VERSION */ 34 35 36#define MSCHAPV2_KEY_LEN 16 37 38 39static void eap_ttls_reset(struct eap_sm *sm, void *priv); 40 41 42struct eap_ttls_data { 43 struct eap_ssl_data ssl; 44 enum { 45 START, PHASE1, PHASE2_START, PHASE2_METHOD, 46 PHASE2_MSCHAPV2_RESP, PHASE_FINISHED, SUCCESS, FAILURE 47 } state; 48 49 int ttls_version; 50 int force_version; 51 const struct eap_method *phase2_method; 52 void *phase2_priv; 53 int mschapv2_resp_ok; 54 u8 mschapv2_auth_response[20]; 55 u8 mschapv2_ident; 56 int tls_ia_configured; 57 struct wpabuf *pending_phase2_eap_resp; 58 int tnc_started; 59}; 60 61 62static const char * eap_ttls_state_txt(int state) 63{ 64 switch (state) { 65 case START: 66 return "START"; 67 case PHASE1: 68 return "PHASE1"; 69 case PHASE2_START: 70 return "PHASE2_START"; 71 case PHASE2_METHOD: 72 return "PHASE2_METHOD"; 73 case PHASE2_MSCHAPV2_RESP: 74 return "PHASE2_MSCHAPV2_RESP"; 75 case PHASE_FINISHED: 76 return "PHASE_FINISHED"; 77 case SUCCESS: 78 return "SUCCESS"; 79 case FAILURE: 80 return "FAILURE"; 81 default: 82 return "Unknown?!"; 83 } 84} 85 86 87static void eap_ttls_state(struct eap_ttls_data *data, int state) 88{ 89 wpa_printf(MSG_DEBUG, "EAP-TTLS: %s -> %s", 90 eap_ttls_state_txt(data->state), 91 eap_ttls_state_txt(state)); 92 data->state = state; 93} 94 95 96static u8 * eap_ttls_avp_hdr(u8 *avphdr, u32 avp_code, u32 vendor_id, 97 int mandatory, size_t len) 98{ 99 struct ttls_avp_vendor *avp; 100 u8 flags; 101 size_t hdrlen; 102 103 avp = (struct ttls_avp_vendor *) avphdr; 104 flags = mandatory ? AVP_FLAGS_MANDATORY : 0; 105 if (vendor_id) { 106 flags |= AVP_FLAGS_VENDOR; 107 hdrlen = sizeof(*avp); 108 avp->vendor_id = host_to_be32(vendor_id); 109 } else { 110 hdrlen = sizeof(struct ttls_avp); 111 } 112 113 avp->avp_code = host_to_be32(avp_code); 114 avp->avp_length = host_to_be32((flags << 24) | (hdrlen + len)); 115 116 return avphdr + hdrlen; 117} 118 119 120static struct wpabuf * eap_ttls_avp_encapsulate(struct wpabuf *resp, 121 u32 avp_code, int mandatory) 122{ 123 struct wpabuf *avp; 124 u8 *pos; 125 126 avp = wpabuf_alloc(sizeof(struct ttls_avp) + wpabuf_len(resp) + 4); 127 if (avp == NULL) { 128 wpabuf_free(resp); 129 return NULL; 130 } 131 132 pos = eap_ttls_avp_hdr(wpabuf_mhead(avp), avp_code, 0, mandatory, 133 wpabuf_len(resp)); 134 os_memcpy(pos, wpabuf_head(resp), wpabuf_len(resp)); 135 pos += wpabuf_len(resp); 136 AVP_PAD((const u8 *) wpabuf_head(avp), pos); 137 wpabuf_free(resp); 138 wpabuf_put(avp, pos - (u8 *) wpabuf_head(avp)); 139 return avp; 140} 141 142 143struct eap_ttls_avp { 144 /* Note: eap is allocated memory; caller is responsible for freeing 145 * it. All the other pointers are pointing to the packet data, i.e., 146 * they must not be freed separately. */ 147 u8 *eap; 148 size_t eap_len; 149 u8 *user_name; 150 size_t user_name_len; 151 u8 *user_password; 152 size_t user_password_len; 153 u8 *chap_challenge; 154 size_t chap_challenge_len; 155 u8 *chap_password; 156 size_t chap_password_len; 157 u8 *mschap_challenge; 158 size_t mschap_challenge_len; 159 u8 *mschap_response; 160 size_t mschap_response_len; 161 u8 *mschap2_response; 162 size_t mschap2_response_len; 163}; 164 165 166static int eap_ttls_avp_parse(u8 *buf, size_t len, struct eap_ttls_avp *parse) 167{ 168 struct ttls_avp *avp; 169 u8 *pos; 170 int left; 171 172 pos = buf; 173 left = len; 174 os_memset(parse, 0, sizeof(*parse)); 175 176 while (left > 0) { 177 u32 avp_code, avp_length, vendor_id = 0; 178 u8 avp_flags, *dpos; 179 size_t pad, dlen; 180 avp = (struct ttls_avp *) pos; 181 avp_code = be_to_host32(avp->avp_code); 182 avp_length = be_to_host32(avp->avp_length); 183 avp_flags = (avp_length >> 24) & 0xff; 184 avp_length &= 0xffffff; 185 wpa_printf(MSG_DEBUG, "EAP-TTLS: AVP: code=%d flags=0x%02x " 186 "length=%d", (int) avp_code, avp_flags, 187 (int) avp_length); 188 if ((int) avp_length > left) { 189 wpa_printf(MSG_WARNING, "EAP-TTLS: AVP overflow " 190 "(len=%d, left=%d) - dropped", 191 (int) avp_length, left); 192 goto fail; 193 } 194 if (avp_length < sizeof(*avp)) { 195 wpa_printf(MSG_WARNING, "EAP-TTLS: Invalid AVP length " 196 "%d", avp_length); 197 goto fail; 198 } 199 dpos = (u8 *) (avp + 1); 200 dlen = avp_length - sizeof(*avp); 201 if (avp_flags & AVP_FLAGS_VENDOR) { 202 if (dlen < 4) { 203 wpa_printf(MSG_WARNING, "EAP-TTLS: vendor AVP " 204 "underflow"); 205 goto fail; 206 } 207 vendor_id = be_to_host32(* (be32 *) dpos); 208 wpa_printf(MSG_DEBUG, "EAP-TTLS: AVP vendor_id %d", 209 (int) vendor_id); 210 dpos += 4; 211 dlen -= 4; 212 } 213 214 wpa_hexdump(MSG_DEBUG, "EAP-TTLS: AVP data", dpos, dlen); 215 216 if (vendor_id == 0 && avp_code == RADIUS_ATTR_EAP_MESSAGE) { 217 wpa_printf(MSG_DEBUG, "EAP-TTLS: AVP - EAP Message"); 218 if (parse->eap == NULL) { 219 parse->eap = os_malloc(dlen); 220 if (parse->eap == NULL) { 221 wpa_printf(MSG_WARNING, "EAP-TTLS: " 222 "failed to allocate memory " 223 "for Phase 2 EAP data"); 224 goto fail; 225 } 226 os_memcpy(parse->eap, dpos, dlen); 227 parse->eap_len = dlen; 228 } else { 229 u8 *neweap = os_realloc(parse->eap, 230 parse->eap_len + dlen); 231 if (neweap == NULL) { 232 wpa_printf(MSG_WARNING, "EAP-TTLS: " 233 "failed to allocate memory " 234 "for Phase 2 EAP data"); 235 goto fail; 236 } 237 os_memcpy(neweap + parse->eap_len, dpos, dlen); 238 parse->eap = neweap; 239 parse->eap_len += dlen; 240 } 241 } else if (vendor_id == 0 && 242 avp_code == RADIUS_ATTR_USER_NAME) { 243 wpa_hexdump_ascii(MSG_DEBUG, "EAP-TTLS: User-Name", 244 dpos, dlen); 245 parse->user_name = dpos; 246 parse->user_name_len = dlen; 247 } else if (vendor_id == 0 && 248 avp_code == RADIUS_ATTR_USER_PASSWORD) { 249 u8 *password = dpos; 250 size_t password_len = dlen; 251 while (password_len > 0 && 252 password[password_len - 1] == '\0') { 253 password_len--; 254 } 255 wpa_hexdump_ascii_key(MSG_DEBUG, "EAP-TTLS: " 256 "User-Password (PAP)", 257 password, password_len); 258 parse->user_password = password; 259 parse->user_password_len = password_len; 260 } else if (vendor_id == 0 && 261 avp_code == RADIUS_ATTR_CHAP_CHALLENGE) { 262 wpa_hexdump(MSG_DEBUG, 263 "EAP-TTLS: CHAP-Challenge (CHAP)", 264 dpos, dlen); 265 parse->chap_challenge = dpos; 266 parse->chap_challenge_len = dlen; 267 } else if (vendor_id == 0 && 268 avp_code == RADIUS_ATTR_CHAP_PASSWORD) { 269 wpa_hexdump(MSG_DEBUG, 270 "EAP-TTLS: CHAP-Password (CHAP)", 271 dpos, dlen); 272 parse->chap_password = dpos; 273 parse->chap_password_len = dlen; 274 } else if (vendor_id == RADIUS_VENDOR_ID_MICROSOFT && 275 avp_code == RADIUS_ATTR_MS_CHAP_CHALLENGE) { 276 wpa_hexdump(MSG_DEBUG, 277 "EAP-TTLS: MS-CHAP-Challenge", 278 dpos, dlen); 279 parse->mschap_challenge = dpos; 280 parse->mschap_challenge_len = dlen; 281 } else if (vendor_id == RADIUS_VENDOR_ID_MICROSOFT && 282 avp_code == RADIUS_ATTR_MS_CHAP_RESPONSE) { 283 wpa_hexdump(MSG_DEBUG, 284 "EAP-TTLS: MS-CHAP-Response (MSCHAP)", 285 dpos, dlen); 286 parse->mschap_response = dpos; 287 parse->mschap_response_len = dlen; 288 } else if (vendor_id == RADIUS_VENDOR_ID_MICROSOFT && 289 avp_code == RADIUS_ATTR_MS_CHAP2_RESPONSE) { 290 wpa_hexdump(MSG_DEBUG, 291 "EAP-TTLS: MS-CHAP2-Response (MSCHAPV2)", 292 dpos, dlen); 293 parse->mschap2_response = dpos; 294 parse->mschap2_response_len = dlen; 295 } else if (avp_flags & AVP_FLAGS_MANDATORY) { 296 wpa_printf(MSG_WARNING, "EAP-TTLS: Unsupported " 297 "mandatory AVP code %d vendor_id %d - " 298 "dropped", (int) avp_code, (int) vendor_id); 299 goto fail; 300 } else { 301 wpa_printf(MSG_DEBUG, "EAP-TTLS: Ignoring unsupported " 302 "AVP code %d vendor_id %d", 303 (int) avp_code, (int) vendor_id); 304 } 305 306 pad = (4 - (avp_length & 3)) & 3; 307 pos += avp_length + pad; 308 left -= avp_length + pad; 309 } 310 311 return 0; 312 313fail: 314 os_free(parse->eap); 315 parse->eap = NULL; 316 return -1; 317} 318 319 320static u8 * eap_ttls_implicit_challenge(struct eap_sm *sm, 321 struct eap_ttls_data *data, size_t len) 322{ 323 struct tls_keys keys; 324 u8 *challenge, *rnd; 325 326 if (data->ttls_version == 0) { 327 return eap_server_tls_derive_key(sm, &data->ssl, 328 "ttls challenge", len); 329 } 330 331 os_memset(&keys, 0, sizeof(keys)); 332 if (tls_connection_get_keys(sm->ssl_ctx, data->ssl.conn, &keys) || 333 keys.client_random == NULL || keys.server_random == NULL || 334 keys.inner_secret == NULL) { 335 wpa_printf(MSG_INFO, "EAP-TTLS: Could not get inner secret, " 336 "client random, or server random to derive " 337 "implicit challenge"); 338 return NULL; 339 } 340 341 rnd = os_malloc(keys.client_random_len + keys.server_random_len); 342 challenge = os_malloc(len); 343 if (rnd == NULL || challenge == NULL) { 344 wpa_printf(MSG_INFO, "EAP-TTLS: No memory for implicit " 345 "challenge derivation"); 346 os_free(rnd); 347 os_free(challenge); 348 return NULL; 349 } 350 os_memcpy(rnd, keys.server_random, keys.server_random_len); 351 os_memcpy(rnd + keys.server_random_len, keys.client_random, 352 keys.client_random_len); 353 354 if (tls_prf(keys.inner_secret, keys.inner_secret_len, 355 "inner application challenge", rnd, 356 keys.client_random_len + keys.server_random_len, 357 challenge, len)) { 358 wpa_printf(MSG_DEBUG, "EAP-TTLS: Failed to derive implicit " 359 "challenge"); 360 os_free(rnd); 361 os_free(challenge); 362 return NULL; 363 } 364 365 os_free(rnd); 366 367 wpa_hexdump_key(MSG_DEBUG, "EAP-TTLS: Derived implicit challenge", 368 challenge, len); 369 370 return challenge; 371} 372 373 374static void * eap_ttls_init(struct eap_sm *sm) 375{ 376 struct eap_ttls_data *data; 377 378 data = os_zalloc(sizeof(*data)); 379 if (data == NULL) 380 return NULL; 381 data->ttls_version = EAP_TTLS_VERSION; 382 data->force_version = -1; 383 if (sm->user && sm->user->force_version >= 0) { 384 data->force_version = sm->user->force_version; 385 wpa_printf(MSG_DEBUG, "EAP-TTLS: forcing version %d", 386 data->force_version); 387 data->ttls_version = data->force_version; 388 } 389 data->state = START; 390 391 if (!(tls_capabilities(sm->ssl_ctx) & TLS_CAPABILITY_IA) && 392 data->ttls_version > 0) { 393 if (data->force_version > 0) { 394 wpa_printf(MSG_INFO, "EAP-TTLS: Forced TTLSv%d and " 395 "TLS library does not support TLS/IA.", 396 data->force_version); 397 eap_ttls_reset(sm, data); 398 return NULL; 399 } 400 data->ttls_version = 0; 401 } 402 403 if (eap_server_tls_ssl_init(sm, &data->ssl, 0)) { 404 wpa_printf(MSG_INFO, "EAP-TTLS: Failed to initialize SSL."); 405 eap_ttls_reset(sm, data); 406 return NULL; 407 } 408 409 return data; 410} 411 412 413static void eap_ttls_reset(struct eap_sm *sm, void *priv) 414{ 415 struct eap_ttls_data *data = priv; 416 if (data == NULL) 417 return; 418 if (data->phase2_priv && data->phase2_method) 419 data->phase2_method->reset(sm, data->phase2_priv); 420 eap_server_tls_ssl_deinit(sm, &data->ssl); 421 wpabuf_free(data->pending_phase2_eap_resp); 422 os_free(data); 423} 424 425 426static struct wpabuf * eap_ttls_build_start(struct eap_sm *sm, 427 struct eap_ttls_data *data, u8 id) 428{ 429 struct wpabuf *req; 430 431 req = eap_msg_alloc(EAP_VENDOR_IETF, EAP_TYPE_TTLS, 1, 432 EAP_CODE_REQUEST, id); 433 if (req == NULL) { 434 wpa_printf(MSG_ERROR, "EAP-TTLS: Failed to allocate memory for" 435 " request"); 436 eap_ttls_state(data, FAILURE); 437 return NULL; 438 } 439 440 wpabuf_put_u8(req, EAP_TLS_FLAGS_START | data->ttls_version); 441 442 eap_ttls_state(data, PHASE1); 443 444 return req; 445} 446 447 448static struct wpabuf * eap_ttls_build_phase2_eap_req( 449 struct eap_sm *sm, struct eap_ttls_data *data, u8 id) 450{ 451 struct wpabuf *buf, *encr_req; 452 u8 *req; 453 size_t req_len; 454 455 456 buf = data->phase2_method->buildReq(sm, data->phase2_priv, id); 457 if (buf == NULL) 458 return NULL; 459 460 wpa_hexdump_buf_key(MSG_DEBUG, 461 "EAP-TTLS/EAP: Encapsulate Phase 2 data", buf); 462 463 buf = eap_ttls_avp_encapsulate(buf, RADIUS_ATTR_EAP_MESSAGE, 1); 464 if (buf == NULL) { 465 wpa_printf(MSG_DEBUG, "EAP-TTLS/EAP: Failed to encapsulate " 466 "packet"); 467 return NULL; 468 } 469 470 req = wpabuf_mhead(buf); 471 req_len = wpabuf_len(buf); 472 wpa_hexdump_key(MSG_DEBUG, "EAP-TTLS/EAP: Encrypt encapsulated Phase " 473 "2 data", req, req_len); 474 475 encr_req = eap_server_tls_encrypt(sm, &data->ssl, req, req_len); 476 wpabuf_free(buf); 477 478 return encr_req; 479} 480 481 482static struct wpabuf * eap_ttls_build_phase2_mschapv2( 483 struct eap_sm *sm, struct eap_ttls_data *data) 484{ 485 struct wpabuf *encr_req; 486 u8 *req, *pos, *end; 487 int ret; 488 size_t req_len; 489 490 pos = req = os_malloc(100); 491 if (req == NULL) 492 return NULL; 493 end = req + 100; 494 495 if (data->mschapv2_resp_ok) { 496 pos = eap_ttls_avp_hdr(pos, RADIUS_ATTR_MS_CHAP2_SUCCESS, 497 RADIUS_VENDOR_ID_MICROSOFT, 1, 43); 498 *pos++ = data->mschapv2_ident; 499 ret = os_snprintf((char *) pos, end - pos, "S="); 500 if (ret >= 0 && ret < end - pos) 501 pos += ret; 502 pos += wpa_snprintf_hex_uppercase( 503 (char *) pos, end - pos, data->mschapv2_auth_response, 504 sizeof(data->mschapv2_auth_response)); 505 } else { 506 pos = eap_ttls_avp_hdr(pos, RADIUS_ATTR_MS_CHAP_ERROR, 507 RADIUS_VENDOR_ID_MICROSOFT, 1, 6); 508 os_memcpy(pos, "Failed", 6); 509 pos += 6; 510 AVP_PAD(req, pos); 511 } 512 513 req_len = pos - req; 514 wpa_hexdump_key(MSG_DEBUG, "EAP-TTLS/MSCHAPV2: Encrypting Phase 2 " 515 "data", req, req_len); 516 517 encr_req = eap_server_tls_encrypt(sm, &data->ssl, req, req_len); 518 os_free(req); 519 520 return encr_req; 521} 522 523 524static struct wpabuf * eap_ttls_build_phase_finished( 525 struct eap_sm *sm, struct eap_ttls_data *data, int final) 526{ 527 int len; 528 struct wpabuf *req; 529 const int max_len = 300; 530 531 req = wpabuf_alloc(max_len); 532 if (req == NULL) 533 return NULL; 534 535 len = tls_connection_ia_send_phase_finished(sm->ssl_ctx, 536 data->ssl.conn, final, 537 wpabuf_mhead(req), 538 max_len); 539 if (len < 0) { 540 wpabuf_free(req); 541 return NULL; 542 } 543 wpabuf_put(req, len); 544 545 return req; 546} 547 548 549static struct wpabuf * eap_ttls_buildReq(struct eap_sm *sm, void *priv, u8 id) 550{ 551 struct eap_ttls_data *data = priv; 552 553 if (data->ssl.state == FRAG_ACK) { 554 return eap_server_tls_build_ack(id, EAP_TYPE_TTLS, 555 data->ttls_version); 556 } 557 558 if (data->ssl.state == WAIT_FRAG_ACK) { 559 return eap_server_tls_build_msg(&data->ssl, EAP_TYPE_TTLS, 560 data->ttls_version, id); 561 } 562 563 switch (data->state) { 564 case START: 565 return eap_ttls_build_start(sm, data, id); 566 case PHASE1: 567 if (tls_connection_established(sm->ssl_ctx, data->ssl.conn)) { 568 wpa_printf(MSG_DEBUG, "EAP-TTLS: Phase1 done, " 569 "starting Phase2"); 570 eap_ttls_state(data, PHASE2_START); 571 } 572 break; 573 case PHASE2_METHOD: 574 wpabuf_free(data->ssl.out_buf); 575 data->ssl.out_used = 0; 576 data->ssl.out_buf = eap_ttls_build_phase2_eap_req(sm, data, 577 id); 578 break; 579 case PHASE2_MSCHAPV2_RESP: 580 wpabuf_free(data->ssl.out_buf); 581 data->ssl.out_used = 0; 582 data->ssl.out_buf = eap_ttls_build_phase2_mschapv2(sm, data); 583 break; 584 case PHASE_FINISHED: 585 wpabuf_free(data->ssl.out_buf); 586 data->ssl.out_used = 0; 587 data->ssl.out_buf = eap_ttls_build_phase_finished(sm, data, 1); 588 break; 589 default: 590 wpa_printf(MSG_DEBUG, "EAP-TTLS: %s - unexpected state %d", 591 __func__, data->state); 592 return NULL; 593 } 594 595 return eap_server_tls_build_msg(&data->ssl, EAP_TYPE_TTLS, 596 data->ttls_version, id); 597} 598 599 600static Boolean eap_ttls_check(struct eap_sm *sm, void *priv, 601 struct wpabuf *respData) 602{ 603 const u8 *pos; 604 size_t len; 605 606 pos = eap_hdr_validate(EAP_VENDOR_IETF, EAP_TYPE_TTLS, respData, &len); 607 if (pos == NULL || len < 1) { 608 wpa_printf(MSG_INFO, "EAP-TTLS: Invalid frame"); 609 return TRUE; 610 } 611 612 return FALSE; 613} 614 615 616static int eap_ttls_ia_permute_inner_secret(struct eap_sm *sm, 617 struct eap_ttls_data *data, 618 const u8 *key, size_t key_len) 619{ 620 u8 *buf; 621 size_t buf_len; 622 int ret; 623 624 if (key) { 625 buf_len = 2 + key_len; 626 buf = os_malloc(buf_len); 627 if (buf == NULL) 628 return -1; 629 WPA_PUT_BE16(buf, key_len); 630 os_memcpy(buf + 2, key, key_len); 631 } else { 632 buf = NULL; 633 buf_len = 0; 634 } 635 636 wpa_hexdump_key(MSG_DEBUG, "EAP-TTLS: Session keys for TLS/IA inner " 637 "secret permutation", buf, buf_len); 638 ret = tls_connection_ia_permute_inner_secret(sm->ssl_ctx, 639 data->ssl.conn, 640 buf, buf_len); 641 os_free(buf); 642 643 return ret; 644} 645 646 647static void eap_ttls_process_phase2_pap(struct eap_sm *sm, 648 struct eap_ttls_data *data, 649 const u8 *user_password, 650 size_t user_password_len) 651{ 652 if (!sm->user || !sm->user->password || sm->user->password_hash || 653 !(sm->user->ttls_auth & EAP_TTLS_AUTH_PAP)) { 654 wpa_printf(MSG_DEBUG, "EAP-TTLS/PAP: No plaintext user " 655 "password configured"); 656 eap_ttls_state(data, FAILURE); 657 return; 658 } 659 660 if (sm->user->password_len != user_password_len || 661 os_memcmp(sm->user->password, user_password, user_password_len) != 662 0) { 663 wpa_printf(MSG_DEBUG, "EAP-TTLS/PAP: Invalid user password"); 664 eap_ttls_state(data, FAILURE); 665 return; 666 } 667 668 wpa_printf(MSG_DEBUG, "EAP-TTLS/PAP: Correct user password"); 669 eap_ttls_state(data, data->ttls_version > 0 ? PHASE_FINISHED : 670 SUCCESS); 671} 672 673 674static void eap_ttls_process_phase2_chap(struct eap_sm *sm, 675 struct eap_ttls_data *data, 676 const u8 *challenge, 677 size_t challenge_len, 678 const u8 *password, 679 size_t password_len) 680{ 681 u8 *chal, hash[CHAP_MD5_LEN]; 682 683 if (challenge == NULL || password == NULL || 684 challenge_len != EAP_TTLS_CHAP_CHALLENGE_LEN || 685 password_len != 1 + EAP_TTLS_CHAP_PASSWORD_LEN) { 686 wpa_printf(MSG_DEBUG, "EAP-TTLS/CHAP: Invalid CHAP attributes " 687 "(challenge len %lu password len %lu)", 688 (unsigned long) challenge_len, 689 (unsigned long) password_len); 690 eap_ttls_state(data, FAILURE); 691 return; 692 } 693 694 if (!sm->user || !sm->user->password || sm->user->password_hash || 695 !(sm->user->ttls_auth & EAP_TTLS_AUTH_CHAP)) { 696 wpa_printf(MSG_DEBUG, "EAP-TTLS/CHAP: No plaintext user " 697 "password configured"); 698 eap_ttls_state(data, FAILURE); 699 return; 700 } 701 702 chal = eap_ttls_implicit_challenge(sm, data, 703 EAP_TTLS_CHAP_CHALLENGE_LEN + 1); 704 if (chal == NULL) { 705 wpa_printf(MSG_DEBUG, "EAP-TTLS/CHAP: Failed to generate " 706 "challenge from TLS data"); 707 eap_ttls_state(data, FAILURE); 708 return; 709 } 710 711 if (os_memcmp(challenge, chal, EAP_TTLS_CHAP_CHALLENGE_LEN) != 0 || 712 password[0] != chal[EAP_TTLS_CHAP_CHALLENGE_LEN]) { 713 wpa_printf(MSG_DEBUG, "EAP-TTLS/CHAP: Challenge mismatch"); 714 os_free(chal); 715 eap_ttls_state(data, FAILURE); 716 return; 717 } 718 os_free(chal); 719 720 /* MD5(Ident + Password + Challenge) */ 721 chap_md5(password[0], sm->user->password, sm->user->password_len, 722 challenge, challenge_len, hash); 723 724 if (os_memcmp(hash, password + 1, EAP_TTLS_CHAP_PASSWORD_LEN) == 0) { 725 wpa_printf(MSG_DEBUG, "EAP-TTLS/CHAP: Correct user password"); 726 eap_ttls_state(data, data->ttls_version > 0 ? PHASE_FINISHED : 727 SUCCESS); 728 } else { 729 wpa_printf(MSG_DEBUG, "EAP-TTLS/CHAP: Invalid user password"); 730 eap_ttls_state(data, FAILURE); 731 } 732} 733 734 735static void eap_ttls_process_phase2_mschap(struct eap_sm *sm, 736 struct eap_ttls_data *data, 737 u8 *challenge, size_t challenge_len, 738 u8 *response, size_t response_len) 739{ 740 u8 *chal, nt_response[24]; 741 742 if (challenge == NULL || response == NULL || 743 challenge_len != EAP_TTLS_MSCHAP_CHALLENGE_LEN || 744 response_len != EAP_TTLS_MSCHAP_RESPONSE_LEN) { 745 wpa_printf(MSG_DEBUG, "EAP-TTLS/MSCHAP: Invalid MS-CHAP " 746 "attributes (challenge len %lu response len %lu)", 747 (unsigned long) challenge_len, 748 (unsigned long) response_len); 749 eap_ttls_state(data, FAILURE); 750 return; 751 } 752 753 if (!sm->user || !sm->user->password || 754 !(sm->user->ttls_auth & EAP_TTLS_AUTH_MSCHAP)) { 755 wpa_printf(MSG_DEBUG, "EAP-TTLS/MSCHAP: No user password " 756 "configured"); 757 eap_ttls_state(data, FAILURE); 758 return; 759 } 760 761 chal = eap_ttls_implicit_challenge(sm, data, 762 EAP_TTLS_MSCHAP_CHALLENGE_LEN + 1); 763 if (chal == NULL) { 764 wpa_printf(MSG_DEBUG, "EAP-TTLS/MSCHAP: Failed to generate " 765 "challenge from TLS data"); 766 eap_ttls_state(data, FAILURE); 767 return; 768 } 769 770 if (os_memcmp(challenge, chal, EAP_TTLS_MSCHAP_CHALLENGE_LEN) != 0 || 771 response[0] != chal[EAP_TTLS_MSCHAP_CHALLENGE_LEN]) { 772 wpa_printf(MSG_DEBUG, "EAP-TTLS/MSCHAP: Challenge mismatch"); 773 os_free(chal); 774 eap_ttls_state(data, FAILURE); 775 return; 776 } 777 os_free(chal); 778 779 if (sm->user->password_hash) 780 challenge_response(challenge, sm->user->password, nt_response); 781 else 782 nt_challenge_response(challenge, sm->user->password, 783 sm->user->password_len, nt_response); 784 785 if (os_memcmp(nt_response, response + 2 + 24, 24) == 0) { 786 wpa_printf(MSG_DEBUG, "EAP-TTLS/MSCHAP: Correct response"); 787 eap_ttls_state(data, data->ttls_version > 0 ? PHASE_FINISHED : 788 SUCCESS); 789 } else { 790 wpa_printf(MSG_DEBUG, "EAP-TTLS/MSCHAP: Invalid NT-Response"); 791 wpa_hexdump(MSG_MSGDUMP, "EAP-TTLS/MSCHAP: Received", 792 response + 2 + 24, 24); 793 wpa_hexdump(MSG_MSGDUMP, "EAP-TTLS/MSCHAP: Expected", 794 nt_response, 24); 795 eap_ttls_state(data, FAILURE); 796 } 797} 798 799 800static void eap_ttls_process_phase2_mschapv2(struct eap_sm *sm, 801 struct eap_ttls_data *data, 802 u8 *challenge, 803 size_t challenge_len, 804 u8 *response, size_t response_len) 805{ 806 u8 *chal, *username, nt_response[24], *rx_resp, *peer_challenge, 807 *auth_challenge; 808 size_t username_len, i; 809 810 if (challenge == NULL || response == NULL || 811 challenge_len != EAP_TTLS_MSCHAPV2_CHALLENGE_LEN || 812 response_len != EAP_TTLS_MSCHAPV2_RESPONSE_LEN) { 813 wpa_printf(MSG_DEBUG, "EAP-TTLS/MSCHAPV2: Invalid MS-CHAP2 " 814 "attributes (challenge len %lu response len %lu)", 815 (unsigned long) challenge_len, 816 (unsigned long) response_len); 817 eap_ttls_state(data, FAILURE); 818 return; 819 } 820 821 if (!sm->user || !sm->user->password || 822 !(sm->user->ttls_auth & EAP_TTLS_AUTH_MSCHAPV2)) { 823 wpa_printf(MSG_DEBUG, "EAP-TTLS/MSCHAPV2: No user password " 824 "configured"); 825 eap_ttls_state(data, FAILURE); 826 return; 827 } 828 829 /* MSCHAPv2 does not include optional domain name in the 830 * challenge-response calculation, so remove domain prefix 831 * (if present). */ 832 username = sm->identity; 833 username_len = sm->identity_len; 834 for (i = 0; i < username_len; i++) { 835 if (username[i] == '\\') { 836 username_len -= i + 1; 837 username += i + 1; 838 break; 839 } 840 } 841 842 chal = eap_ttls_implicit_challenge( 843 sm, data, EAP_TTLS_MSCHAPV2_CHALLENGE_LEN + 1); 844 if (chal == NULL) { 845 wpa_printf(MSG_DEBUG, "EAP-TTLS/MSCHAPV2: Failed to generate " 846 "challenge from TLS data"); 847 eap_ttls_state(data, FAILURE); 848 return; 849 } 850 851 if (os_memcmp(challenge, chal, EAP_TTLS_MSCHAPV2_CHALLENGE_LEN) != 0 || 852 response[0] != chal[EAP_TTLS_MSCHAPV2_CHALLENGE_LEN]) { 853 wpa_printf(MSG_DEBUG, "EAP-TTLS/MSCHAPV2: Challenge mismatch"); 854 os_free(chal); 855 eap_ttls_state(data, FAILURE); 856 return; 857 } 858 os_free(chal); 859 860 auth_challenge = challenge; 861 peer_challenge = response + 2; 862 863 wpa_hexdump_ascii(MSG_MSGDUMP, "EAP-TTLS/MSCHAPV2: User", 864 username, username_len); 865 wpa_hexdump(MSG_MSGDUMP, "EAP-TTLS/MSCHAPV2: auth_challenge", 866 auth_challenge, EAP_TTLS_MSCHAPV2_CHALLENGE_LEN); 867 wpa_hexdump(MSG_MSGDUMP, "EAP-TTLS/MSCHAPV2: peer_challenge", 868 peer_challenge, EAP_TTLS_MSCHAPV2_CHALLENGE_LEN); 869 870 if (sm->user->password_hash) { 871 generate_nt_response_pwhash(auth_challenge, peer_challenge, 872 username, username_len, 873 sm->user->password, 874 nt_response); 875 } else { 876 generate_nt_response(auth_challenge, peer_challenge, 877 username, username_len, 878 sm->user->password, 879 sm->user->password_len, 880 nt_response); 881 } 882 883 rx_resp = response + 2 + EAP_TTLS_MSCHAPV2_CHALLENGE_LEN + 8; 884 if (os_memcmp(nt_response, rx_resp, 24) == 0) { 885 wpa_printf(MSG_DEBUG, "EAP-TTLS/MSCHAPV2: Correct " 886 "NT-Response"); 887 data->mschapv2_resp_ok = 1; 888 if (data->ttls_version > 0) { 889 const u8 *pw_hash; 890 u8 pw_hash_buf[16], pw_hash_hash[16], master_key[16]; 891 u8 session_key[2 * MSCHAPV2_KEY_LEN]; 892 893 if (sm->user->password_hash) 894 pw_hash = sm->user->password; 895 else { 896 nt_password_hash(sm->user->password, 897 sm->user->password_len, 898 pw_hash_buf); 899 pw_hash = pw_hash_buf; 900 } 901 hash_nt_password_hash(pw_hash, pw_hash_hash); 902 get_master_key(pw_hash_hash, nt_response, master_key); 903 get_asymetric_start_key(master_key, session_key, 904 MSCHAPV2_KEY_LEN, 0, 0); 905 get_asymetric_start_key(master_key, 906 session_key + MSCHAPV2_KEY_LEN, 907 MSCHAPV2_KEY_LEN, 1, 0); 908 eap_ttls_ia_permute_inner_secret(sm, data, 909 session_key, 910 sizeof(session_key)); 911 } 912 913 if (sm->user->password_hash) { 914 generate_authenticator_response_pwhash( 915 sm->user->password, 916 peer_challenge, auth_challenge, 917 username, username_len, nt_response, 918 data->mschapv2_auth_response); 919 } else { 920 generate_authenticator_response( 921 sm->user->password, sm->user->password_len, 922 peer_challenge, auth_challenge, 923 username, username_len, nt_response, 924 data->mschapv2_auth_response); 925 } 926 } else { 927 wpa_printf(MSG_DEBUG, "EAP-TTLS/MSCHAPV2: Invalid " 928 "NT-Response"); 929 wpa_hexdump(MSG_MSGDUMP, "EAP-TTLS/MSCHAPV2: Received", 930 rx_resp, 24); 931 wpa_hexdump(MSG_MSGDUMP, "EAP-TTLS/MSCHAPV2: Expected", 932 nt_response, 24); 933 data->mschapv2_resp_ok = 0; 934 } 935 eap_ttls_state(data, PHASE2_MSCHAPV2_RESP); 936 data->mschapv2_ident = response[0]; 937} 938 939 940static int eap_ttls_phase2_eap_init(struct eap_sm *sm, 941 struct eap_ttls_data *data, 942 EapType eap_type) 943{ 944 if (data->phase2_priv && data->phase2_method) { 945 data->phase2_method->reset(sm, data->phase2_priv); 946 data->phase2_method = NULL; 947 data->phase2_priv = NULL; 948 } 949 data->phase2_method = eap_server_get_eap_method(EAP_VENDOR_IETF, 950 eap_type); 951 if (!data->phase2_method) 952 return -1; 953 954 sm->init_phase2 = 1; 955 data->phase2_priv = data->phase2_method->init(sm); 956 sm->init_phase2 = 0; 957 return data->phase2_priv == NULL ? -1 : 0; 958} 959 960 961static void eap_ttls_process_phase2_eap_response(struct eap_sm *sm, 962 struct eap_ttls_data *data, 963 u8 *in_data, size_t in_len) 964{ 965 u8 next_type = EAP_TYPE_NONE; 966 struct eap_hdr *hdr; 967 u8 *pos; 968 size_t left; 969 struct wpabuf buf; 970 const struct eap_method *m = data->phase2_method; 971 void *priv = data->phase2_priv; 972 973 if (priv == NULL) { 974 wpa_printf(MSG_DEBUG, "EAP-TTLS/EAP: %s - Phase2 not " 975 "initialized?!", __func__); 976 return; 977 } 978 979 hdr = (struct eap_hdr *) in_data; 980 pos = (u8 *) (hdr + 1); 981 982 if (in_len > sizeof(*hdr) && *pos == EAP_TYPE_NAK) { 983 left = in_len - sizeof(*hdr); 984 wpa_hexdump(MSG_DEBUG, "EAP-TTLS/EAP: Phase2 type Nak'ed; " 985 "allowed types", pos + 1, left - 1); 986 eap_sm_process_nak(sm, pos + 1, left - 1); 987 if (sm->user && sm->user_eap_method_index < EAP_MAX_METHODS && 988 sm->user->methods[sm->user_eap_method_index].method != 989 EAP_TYPE_NONE) { 990 next_type = sm->user->methods[ 991 sm->user_eap_method_index++].method; 992 wpa_printf(MSG_DEBUG, "EAP-TTLS: try EAP type %d", 993 next_type); 994 if (eap_ttls_phase2_eap_init(sm, data, next_type)) { 995 wpa_printf(MSG_DEBUG, "EAP-TTLS: Failed to " 996 "initialize EAP type %d", 997 next_type); 998 eap_ttls_state(data, FAILURE); 999 return; 1000 } 1001 } else { 1002 eap_ttls_state(data, FAILURE); 1003 } 1004 return; 1005 } 1006 1007 wpabuf_set(&buf, in_data, in_len); 1008 1009 if (m->check(sm, priv, &buf)) { 1010 wpa_printf(MSG_DEBUG, "EAP-TTLS/EAP: Phase2 check() asked to " 1011 "ignore the packet"); 1012 return; 1013 } 1014 1015 m->process(sm, priv, &buf); 1016 1017 if (sm->method_pending == METHOD_PENDING_WAIT) { 1018 wpa_printf(MSG_DEBUG, "EAP-TTLS/EAP: Phase2 method is in " 1019 "pending wait state - save decrypted response"); 1020 wpabuf_free(data->pending_phase2_eap_resp); 1021 data->pending_phase2_eap_resp = wpabuf_dup(&buf); 1022 } 1023 1024 if (!m->isDone(sm, priv)) 1025 return; 1026 1027 if (!m->isSuccess(sm, priv)) { 1028 wpa_printf(MSG_DEBUG, "EAP-TTLS/EAP: Phase2 method failed"); 1029 eap_ttls_state(data, FAILURE); 1030 return; 1031 } 1032 1033 switch (data->state) { 1034 case PHASE2_START: 1035 if (eap_user_get(sm, sm->identity, sm->identity_len, 1) != 0) { 1036 wpa_hexdump_ascii(MSG_DEBUG, "EAP_TTLS: Phase2 " 1037 "Identity not found in the user " 1038 "database", 1039 sm->identity, sm->identity_len); 1040 eap_ttls_state(data, FAILURE); 1041 break; 1042 } 1043 1044 eap_ttls_state(data, PHASE2_METHOD); 1045 next_type = sm->user->methods[0].method; 1046 sm->user_eap_method_index = 1; 1047 wpa_printf(MSG_DEBUG, "EAP-TTLS: try EAP type %d", next_type); 1048 if (eap_ttls_phase2_eap_init(sm, data, next_type)) { 1049 wpa_printf(MSG_DEBUG, "EAP-TTLS: Failed to initialize " 1050 "EAP type %d", next_type); 1051 eap_ttls_state(data, FAILURE); 1052 } 1053 break; 1054 case PHASE2_METHOD: 1055 if (data->ttls_version > 0) { 1056 if (m->getKey) { 1057 u8 *key; 1058 size_t key_len; 1059 key = m->getKey(sm, priv, &key_len); 1060 eap_ttls_ia_permute_inner_secret(sm, data, 1061 key, key_len); 1062 } 1063 eap_ttls_state(data, PHASE_FINISHED); 1064 } else 1065 eap_ttls_state(data, SUCCESS); 1066 break; 1067 case FAILURE: 1068 break; 1069 default: 1070 wpa_printf(MSG_DEBUG, "EAP-TTLS: %s - unexpected state %d", 1071 __func__, data->state); 1072 break; 1073 } 1074} 1075 1076 1077static void eap_ttls_process_phase2_eap(struct eap_sm *sm, 1078 struct eap_ttls_data *data, 1079 const u8 *eap, size_t eap_len) 1080{ 1081 struct eap_hdr *hdr; 1082 size_t len; 1083 1084 if (data->state == PHASE2_START) { 1085 wpa_printf(MSG_DEBUG, "EAP-TTLS/EAP: initializing Phase 2"); 1086 if (eap_ttls_phase2_eap_init(sm, data, EAP_TYPE_IDENTITY) < 0) 1087 { 1088 wpa_printf(MSG_DEBUG, "EAP-TTLS/EAP: failed to " 1089 "initialize EAP-Identity"); 1090 return; 1091 } 1092 } 1093 1094 if (eap_len < sizeof(*hdr)) { 1095 wpa_printf(MSG_DEBUG, "EAP-TTLS/EAP: too short Phase 2 EAP " 1096 "packet (len=%lu)", (unsigned long) eap_len); 1097 return; 1098 } 1099 1100 hdr = (struct eap_hdr *) eap; 1101 len = be_to_host16(hdr->length); 1102 wpa_printf(MSG_DEBUG, "EAP-TTLS/EAP: received Phase 2 EAP: code=%d " 1103 "identifier=%d length=%lu", hdr->code, hdr->identifier, 1104 (unsigned long) len); 1105 if (len > eap_len) { 1106 wpa_printf(MSG_INFO, "EAP-TTLS/EAP: Length mismatch in Phase 2" 1107 " EAP frame (hdr len=%lu, data len in AVP=%lu)", 1108 (unsigned long) len, (unsigned long) eap_len); 1109 return; 1110 } 1111 1112 switch (hdr->code) { 1113 case EAP_CODE_RESPONSE: 1114 eap_ttls_process_phase2_eap_response(sm, data, (u8 *) hdr, 1115 len); 1116 break; 1117 default: 1118 wpa_printf(MSG_INFO, "EAP-TTLS/EAP: Unexpected code=%d in " 1119 "Phase 2 EAP header", hdr->code); 1120 break; 1121 } 1122} 1123 1124 1125static void eap_ttls_process_phase2(struct eap_sm *sm, 1126 struct eap_ttls_data *data, 1127 struct wpabuf *in_buf) 1128{ 1129 u8 *in_decrypted; 1130 int len_decrypted; 1131 struct eap_ttls_avp parse; 1132 size_t buf_len; 1133 u8 *in_data; 1134 size_t in_len; 1135 1136 in_data = wpabuf_mhead(in_buf); 1137 in_len = wpabuf_len(in_buf); 1138 1139 wpa_printf(MSG_DEBUG, "EAP-TTLS: received %lu bytes encrypted data for" 1140 " Phase 2", (unsigned long) in_len); 1141 1142 if (data->pending_phase2_eap_resp) { 1143 wpa_printf(MSG_DEBUG, "EAP-TTLS: Pending Phase 2 EAP response " 1144 "- skip decryption and use old data"); 1145 eap_ttls_process_phase2_eap( 1146 sm, data, wpabuf_head(data->pending_phase2_eap_resp), 1147 wpabuf_len(data->pending_phase2_eap_resp)); 1148 wpabuf_free(data->pending_phase2_eap_resp); 1149 data->pending_phase2_eap_resp = NULL; 1150 return; 1151 } 1152 1153 buf_len = in_len; 1154 /* 1155 * Even though we try to disable TLS compression, it is possible that 1156 * this cannot be done with all TLS libraries. Add extra buffer space 1157 * to handle the possibility of the decrypted data being longer than 1158 * input data. 1159 */ 1160 buf_len += 500; 1161 buf_len *= 3; 1162 in_decrypted = os_malloc(buf_len); 1163 if (in_decrypted == NULL) { 1164 wpa_printf(MSG_WARNING, "EAP-TTLS: failed to allocate memory " 1165 "for decryption"); 1166 return; 1167 } 1168 1169 len_decrypted = tls_connection_decrypt(sm->ssl_ctx, data->ssl.conn, 1170 in_data, in_len, 1171 in_decrypted, buf_len); 1172 if (len_decrypted < 0) { 1173 wpa_printf(MSG_INFO, "EAP-TTLS: Failed to decrypt Phase 2 " 1174 "data"); 1175 os_free(in_decrypted); 1176 eap_ttls_state(data, FAILURE); 1177 return; 1178 } 1179 1180 if (data->state == PHASE_FINISHED) { 1181 if (len_decrypted == 0 && 1182 tls_connection_ia_final_phase_finished(sm->ssl_ctx, 1183 data->ssl.conn)) { 1184 wpa_printf(MSG_DEBUG, "EAP-TTLS: FinalPhaseFinished " 1185 "received"); 1186 eap_ttls_state(data, SUCCESS); 1187 } else { 1188 wpa_printf(MSG_INFO, "EAP-TTLS: Did not receive valid " 1189 "FinalPhaseFinished"); 1190 eap_ttls_state(data, FAILURE); 1191 } 1192 1193 os_free(in_decrypted); 1194 return; 1195 } 1196 1197 wpa_hexdump_key(MSG_DEBUG, "EAP-TTLS: Decrypted Phase 2 EAP", 1198 in_decrypted, len_decrypted); 1199 1200 if (eap_ttls_avp_parse(in_decrypted, len_decrypted, &parse) < 0) { 1201 wpa_printf(MSG_DEBUG, "EAP-TTLS: Failed to parse AVPs"); 1202 os_free(in_decrypted); 1203 eap_ttls_state(data, FAILURE); 1204 return; 1205 } 1206 1207 if (parse.user_name) { 1208 os_free(sm->identity); 1209 sm->identity = os_malloc(parse.user_name_len); 1210 if (sm->identity) { 1211 os_memcpy(sm->identity, parse.user_name, 1212 parse.user_name_len); 1213 sm->identity_len = parse.user_name_len; 1214 } 1215 if (eap_user_get(sm, parse.user_name, parse.user_name_len, 1) 1216 != 0) { 1217 wpa_printf(MSG_DEBUG, "EAP-TTLS: Phase2 Identity not " 1218 "found in the user database"); 1219 eap_ttls_state(data, FAILURE); 1220 goto done; 1221 } 1222 } 1223 1224#ifdef EAP_TNC 1225 if (data->tnc_started && parse.eap == NULL) { 1226 wpa_printf(MSG_DEBUG, "EAP-TTLS: TNC started but no EAP " 1227 "response from peer"); 1228 eap_ttls_state(data, FAILURE); 1229 goto done; 1230 } 1231#endif /* EAP_TNC */ 1232 1233 if (parse.eap) { 1234 eap_ttls_process_phase2_eap(sm, data, parse.eap, 1235 parse.eap_len); 1236 } else if (parse.user_password) { 1237 eap_ttls_process_phase2_pap(sm, data, parse.user_password, 1238 parse.user_password_len); 1239 } else if (parse.chap_password) { 1240 eap_ttls_process_phase2_chap(sm, data, 1241 parse.chap_challenge, 1242 parse.chap_challenge_len, 1243 parse.chap_password, 1244 parse.chap_password_len); 1245 } else if (parse.mschap_response) { 1246 eap_ttls_process_phase2_mschap(sm, data, 1247 parse.mschap_challenge, 1248 parse.mschap_challenge_len, 1249 parse.mschap_response, 1250 parse.mschap_response_len); 1251 } else if (parse.mschap2_response) { 1252 eap_ttls_process_phase2_mschapv2(sm, data, 1253 parse.mschap_challenge, 1254 parse.mschap_challenge_len, 1255 parse.mschap2_response, 1256 parse.mschap2_response_len); 1257 } 1258 1259done: 1260 os_free(in_decrypted); 1261 os_free(parse.eap); 1262} 1263 1264 1265static void eap_ttls_start_tnc(struct eap_sm *sm, struct eap_ttls_data *data) 1266{ 1267#ifdef EAP_TNC 1268 if (!sm->tnc || data->state != SUCCESS || data->tnc_started) 1269 return; 1270 1271 wpa_printf(MSG_DEBUG, "EAP-TTLS: Initialize TNC"); 1272 if (eap_ttls_phase2_eap_init(sm, data, EAP_TYPE_TNC)) { 1273 wpa_printf(MSG_DEBUG, "EAP-TTLS: Failed to initialize TNC"); 1274 eap_ttls_state(data, FAILURE); 1275 return; 1276 } 1277 1278 data->tnc_started = 1; 1279 eap_ttls_state(data, PHASE2_METHOD); 1280#endif /* EAP_TNC */ 1281} 1282 1283 1284static int eap_ttls_process_version(struct eap_sm *sm, void *priv, 1285 int peer_version) 1286{ 1287 struct eap_ttls_data *data = priv; 1288 if (peer_version < data->ttls_version) { 1289 wpa_printf(MSG_DEBUG, "EAP-TTLS: peer ver=%d, own ver=%d; " 1290 "use version %d", 1291 peer_version, data->ttls_version, peer_version); 1292 data->ttls_version = peer_version; 1293 } 1294 1295 if (data->ttls_version > 0 && !data->tls_ia_configured) { 1296 if (tls_connection_set_ia(sm->ssl_ctx, data->ssl.conn, 1)) { 1297 wpa_printf(MSG_INFO, "EAP-TTLS: Failed to enable " 1298 "TLS/IA"); 1299 return -1; 1300 } 1301 data->tls_ia_configured = 1; 1302 } 1303 1304 return 0; 1305} 1306 1307 1308static void eap_ttls_process_msg(struct eap_sm *sm, void *priv, 1309 const struct wpabuf *respData) 1310{ 1311 struct eap_ttls_data *data = priv; 1312 1313 switch (data->state) { 1314 case PHASE1: 1315 if (eap_server_tls_phase1(sm, &data->ssl) < 0) 1316 eap_ttls_state(data, FAILURE); 1317 break; 1318 case PHASE2_START: 1319 case PHASE2_METHOD: 1320 case PHASE_FINISHED: 1321 eap_ttls_process_phase2(sm, data, data->ssl.in_buf); 1322 eap_ttls_start_tnc(sm, data); 1323 break; 1324 case PHASE2_MSCHAPV2_RESP: 1325 if (data->mschapv2_resp_ok && wpabuf_len(data->ssl.in_buf) == 1326 0) { 1327 wpa_printf(MSG_DEBUG, "EAP-TTLS/MSCHAPV2: Peer " 1328 "acknowledged response"); 1329 eap_ttls_state(data, data->ttls_version > 0 ? 1330 PHASE_FINISHED : SUCCESS); 1331 } else if (!data->mschapv2_resp_ok) { 1332 wpa_printf(MSG_DEBUG, "EAP-TTLS/MSCHAPV2: Peer " 1333 "acknowledged error"); 1334 eap_ttls_state(data, FAILURE); 1335 } else { 1336 wpa_printf(MSG_DEBUG, "EAP-TTLS/MSCHAPV2: Unexpected " 1337 "frame from peer (payload len %lu, " 1338 "expected empty frame)", 1339 (unsigned long) 1340 wpabuf_len(data->ssl.in_buf)); 1341 eap_ttls_state(data, FAILURE); 1342 } 1343 eap_ttls_start_tnc(sm, data); 1344 break; 1345 default: 1346 wpa_printf(MSG_DEBUG, "EAP-TTLS: Unexpected state %d in %s", 1347 data->state, __func__); 1348 break; 1349 } 1350} 1351 1352 1353static void eap_ttls_process(struct eap_sm *sm, void *priv, 1354 struct wpabuf *respData) 1355{ 1356 struct eap_ttls_data *data = priv; 1357 if (eap_server_tls_process(sm, &data->ssl, respData, data, 1358 EAP_TYPE_TTLS, eap_ttls_process_version, 1359 eap_ttls_process_msg) < 0) 1360 eap_ttls_state(data, FAILURE); 1361} 1362 1363 1364static Boolean eap_ttls_isDone(struct eap_sm *sm, void *priv) 1365{ 1366 struct eap_ttls_data *data = priv; 1367 return data->state == SUCCESS || data->state == FAILURE; 1368} 1369 1370 1371static u8 * eap_ttls_v1_derive_key(struct eap_sm *sm, 1372 struct eap_ttls_data *data) 1373{ 1374 struct tls_keys keys; 1375 u8 *rnd, *key; 1376 1377 os_memset(&keys, 0, sizeof(keys)); 1378 if (tls_connection_get_keys(sm->ssl_ctx, data->ssl.conn, &keys) || 1379 keys.client_random == NULL || keys.server_random == NULL || 1380 keys.inner_secret == NULL) { 1381 wpa_printf(MSG_INFO, "EAP-TTLS: Could not get inner secret, " 1382 "client random, or server random to derive keying " 1383 "material"); 1384 return NULL; 1385 } 1386 1387 rnd = os_malloc(keys.client_random_len + keys.server_random_len); 1388 key = os_malloc(EAP_TLS_KEY_LEN); 1389 if (rnd == NULL || key == NULL) { 1390 wpa_printf(MSG_INFO, "EAP-TTLS: No memory for key derivation"); 1391 os_free(rnd); 1392 os_free(key); 1393 return NULL; 1394 } 1395 os_memcpy(rnd, keys.client_random, keys.client_random_len); 1396 os_memcpy(rnd + keys.client_random_len, keys.server_random, 1397 keys.server_random_len); 1398 1399 if (tls_prf(keys.inner_secret, keys.inner_secret_len, 1400 "ttls v1 keying material", rnd, keys.client_random_len + 1401 keys.server_random_len, key, EAP_TLS_KEY_LEN)) { 1402 wpa_printf(MSG_DEBUG, "EAP-TTLS: Failed to derive key"); 1403 os_free(rnd); 1404 os_free(key); 1405 return NULL; 1406 } 1407 1408 wpa_hexdump(MSG_DEBUG, "EAP-TTLS: client/server random", 1409 rnd, keys.client_random_len + keys.server_random_len); 1410 wpa_hexdump_key(MSG_DEBUG, "EAP-TTLS: TLS/IA inner secret", 1411 keys.inner_secret, keys.inner_secret_len); 1412 1413 os_free(rnd); 1414 1415 return key; 1416} 1417 1418 1419static u8 * eap_ttls_getKey(struct eap_sm *sm, void *priv, size_t *len) 1420{ 1421 struct eap_ttls_data *data = priv; 1422 u8 *eapKeyData; 1423 1424 if (data->state != SUCCESS) 1425 return NULL; 1426 1427 if (data->ttls_version == 0) { 1428 eapKeyData = eap_server_tls_derive_key(sm, &data->ssl, 1429 "ttls keying material", 1430 EAP_TLS_KEY_LEN); 1431 } else { 1432 eapKeyData = eap_ttls_v1_derive_key(sm, data); 1433 } 1434 1435 if (eapKeyData) { 1436 *len = EAP_TLS_KEY_LEN; 1437 wpa_hexdump_key(MSG_DEBUG, "EAP-TTLS: Derived key", 1438 eapKeyData, EAP_TLS_KEY_LEN); 1439 } else { 1440 wpa_printf(MSG_DEBUG, "EAP-TTLS: Failed to derive key"); 1441 } 1442 1443 return eapKeyData; 1444} 1445 1446 1447static Boolean eap_ttls_isSuccess(struct eap_sm *sm, void *priv) 1448{ 1449 struct eap_ttls_data *data = priv; 1450 return data->state == SUCCESS; 1451} 1452 1453 1454int eap_server_ttls_register(void) 1455{ 1456 struct eap_method *eap; 1457 int ret; 1458 1459 eap = eap_server_method_alloc(EAP_SERVER_METHOD_INTERFACE_VERSION, 1460 EAP_VENDOR_IETF, EAP_TYPE_TTLS, "TTLS"); 1461 if (eap == NULL) 1462 return -1; 1463 1464 eap->init = eap_ttls_init; 1465 eap->reset = eap_ttls_reset; 1466 eap->buildReq = eap_ttls_buildReq; 1467 eap->check = eap_ttls_check; 1468 eap->process = eap_ttls_process; 1469 eap->isDone = eap_ttls_isDone; 1470 eap->getKey = eap_ttls_getKey; 1471 eap->isSuccess = eap_ttls_isSuccess; 1472 1473 ret = eap_server_method_register(eap); 1474 if (ret) 1475 eap_server_method_free(eap); 1476 return ret; 1477} 1478