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