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