Merge branch 'vendor/WPA_SUPPLICANT'
[dragonfly.git] / contrib / hostapd / src / eap_peer / eap.c
1 /*
2  * EAP peer state machines (RFC 4137)
3  * Copyright (c) 2004-2014, 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  * This file implements the Peer State Machine as defined in RFC 4137. The used
9  * states and state transitions match mostly with the RFC. However, there are
10  * couple of additional transitions for working around small issues noticed
11  * during testing. These exceptions are explained in comments within the
12  * functions in this file. The method functions, m.func(), are similar to the
13  * ones used in RFC 4137, but some small changes have used here to optimize
14  * operations and to add functionality needed for fast re-authentication
15  * (session resumption).
16  */
17
18 #include "includes.h"
19
20 #include "common.h"
21 #include "pcsc_funcs.h"
22 #include "state_machine.h"
23 #include "ext_password.h"
24 #include "crypto/crypto.h"
25 #include "crypto/tls.h"
26 #include "common/wpa_ctrl.h"
27 #include "eap_common/eap_wsc_common.h"
28 #include "eap_i.h"
29 #include "eap_config.h"
30
31 #define STATE_MACHINE_DATA struct eap_sm
32 #define STATE_MACHINE_DEBUG_PREFIX "EAP"
33
34 #define EAP_MAX_AUTH_ROUNDS 50
35 #define EAP_CLIENT_TIMEOUT_DEFAULT 60
36
37
38 static Boolean eap_sm_allowMethod(struct eap_sm *sm, int vendor,
39                                   EapType method);
40 static struct wpabuf * eap_sm_buildNak(struct eap_sm *sm, int id);
41 static void eap_sm_processIdentity(struct eap_sm *sm,
42                                    const struct wpabuf *req);
43 static void eap_sm_processNotify(struct eap_sm *sm, const struct wpabuf *req);
44 static struct wpabuf * eap_sm_buildNotify(int id);
45 static void eap_sm_parseEapReq(struct eap_sm *sm, const struct wpabuf *req);
46 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
47 static const char * eap_sm_method_state_txt(EapMethodState state);
48 static const char * eap_sm_decision_txt(EapDecision decision);
49 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
50
51
52
53 static Boolean eapol_get_bool(struct eap_sm *sm, enum eapol_bool_var var)
54 {
55         return sm->eapol_cb->get_bool(sm->eapol_ctx, var);
56 }
57
58
59 static void eapol_set_bool(struct eap_sm *sm, enum eapol_bool_var var,
60                            Boolean value)
61 {
62         sm->eapol_cb->set_bool(sm->eapol_ctx, var, value);
63 }
64
65
66 static unsigned int eapol_get_int(struct eap_sm *sm, enum eapol_int_var var)
67 {
68         return sm->eapol_cb->get_int(sm->eapol_ctx, var);
69 }
70
71
72 static void eapol_set_int(struct eap_sm *sm, enum eapol_int_var var,
73                           unsigned int value)
74 {
75         sm->eapol_cb->set_int(sm->eapol_ctx, var, value);
76 }
77
78
79 static struct wpabuf * eapol_get_eapReqData(struct eap_sm *sm)
80 {
81         return sm->eapol_cb->get_eapReqData(sm->eapol_ctx);
82 }
83
84
85 static void eap_notify_status(struct eap_sm *sm, const char *status,
86                                       const char *parameter)
87 {
88         wpa_printf(MSG_DEBUG, "EAP: Status notification: %s (param=%s)",
89                    status, parameter);
90         if (sm->eapol_cb->notify_status)
91                 sm->eapol_cb->notify_status(sm->eapol_ctx, status, parameter);
92 }
93
94
95 static void eap_deinit_prev_method(struct eap_sm *sm, const char *txt)
96 {
97         ext_password_free(sm->ext_pw_buf);
98         sm->ext_pw_buf = NULL;
99
100         if (sm->m == NULL || sm->eap_method_priv == NULL)
101                 return;
102
103         wpa_printf(MSG_DEBUG, "EAP: deinitialize previously used EAP method "
104                    "(%d, %s) at %s", sm->selectedMethod, sm->m->name, txt);
105         sm->m->deinit(sm, sm->eap_method_priv);
106         sm->eap_method_priv = NULL;
107         sm->m = NULL;
108 }
109
110
111 /**
112  * eap_allowed_method - Check whether EAP method is allowed
113  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
114  * @vendor: Vendor-Id for expanded types or 0 = IETF for legacy types
115  * @method: EAP type
116  * Returns: 1 = allowed EAP method, 0 = not allowed
117  */
118 int eap_allowed_method(struct eap_sm *sm, int vendor, u32 method)
119 {
120         struct eap_peer_config *config = eap_get_config(sm);
121         int i;
122         struct eap_method_type *m;
123
124         if (config == NULL || config->eap_methods == NULL)
125                 return 1;
126
127         m = config->eap_methods;
128         for (i = 0; m[i].vendor != EAP_VENDOR_IETF ||
129                      m[i].method != EAP_TYPE_NONE; i++) {
130                 if (m[i].vendor == vendor && m[i].method == method)
131                         return 1;
132         }
133         return 0;
134 }
135
136
137 /*
138  * This state initializes state machine variables when the machine is
139  * activated (portEnabled = TRUE). This is also used when re-starting
140  * authentication (eapRestart == TRUE).
141  */
142 SM_STATE(EAP, INITIALIZE)
143 {
144         SM_ENTRY(EAP, INITIALIZE);
145         if (sm->fast_reauth && sm->m && sm->m->has_reauth_data &&
146             sm->m->has_reauth_data(sm, sm->eap_method_priv) &&
147             !sm->prev_failure) {
148                 wpa_printf(MSG_DEBUG, "EAP: maintaining EAP method data for "
149                            "fast reauthentication");
150                 sm->m->deinit_for_reauth(sm, sm->eap_method_priv);
151         } else {
152                 eap_deinit_prev_method(sm, "INITIALIZE");
153         }
154         sm->selectedMethod = EAP_TYPE_NONE;
155         sm->methodState = METHOD_NONE;
156         sm->allowNotifications = TRUE;
157         sm->decision = DECISION_FAIL;
158         sm->ClientTimeout = EAP_CLIENT_TIMEOUT_DEFAULT;
159         eapol_set_int(sm, EAPOL_idleWhile, sm->ClientTimeout);
160         eapol_set_bool(sm, EAPOL_eapSuccess, FALSE);
161         eapol_set_bool(sm, EAPOL_eapFail, FALSE);
162         os_free(sm->eapKeyData);
163         sm->eapKeyData = NULL;
164         os_free(sm->eapSessionId);
165         sm->eapSessionId = NULL;
166         sm->eapKeyAvailable = FALSE;
167         eapol_set_bool(sm, EAPOL_eapRestart, FALSE);
168         sm->lastId = -1; /* new session - make sure this does not match with
169                           * the first EAP-Packet */
170         /*
171          * RFC 4137 does not reset eapResp and eapNoResp here. However, this
172          * seemed to be able to trigger cases where both were set and if EAPOL
173          * state machine uses eapNoResp first, it may end up not sending a real
174          * reply correctly. This occurred when the workaround in FAIL state set
175          * eapNoResp = TRUE.. Maybe that workaround needs to be fixed to do
176          * something else(?)
177          */
178         eapol_set_bool(sm, EAPOL_eapResp, FALSE);
179         eapol_set_bool(sm, EAPOL_eapNoResp, FALSE);
180         sm->num_rounds = 0;
181         sm->prev_failure = 0;
182         sm->expected_failure = 0;
183 }
184
185
186 /*
187  * This state is reached whenever service from the lower layer is interrupted
188  * or unavailable (portEnabled == FALSE). Immediate transition to INITIALIZE
189  * occurs when the port becomes enabled.
190  */
191 SM_STATE(EAP, DISABLED)
192 {
193         SM_ENTRY(EAP, DISABLED);
194         sm->num_rounds = 0;
195         /*
196          * RFC 4137 does not describe clearing of idleWhile here, but doing so
197          * allows the timer tick to be stopped more quickly when EAP is not in
198          * use.
199          */
200         eapol_set_int(sm, EAPOL_idleWhile, 0);
201 }
202
203
204 /*
205  * The state machine spends most of its time here, waiting for something to
206  * happen. This state is entered unconditionally from INITIALIZE, DISCARD, and
207  * SEND_RESPONSE states.
208  */
209 SM_STATE(EAP, IDLE)
210 {
211         SM_ENTRY(EAP, IDLE);
212 }
213
214
215 /*
216  * This state is entered when an EAP packet is received (eapReq == TRUE) to
217  * parse the packet header.
218  */
219 SM_STATE(EAP, RECEIVED)
220 {
221         const struct wpabuf *eapReqData;
222
223         SM_ENTRY(EAP, RECEIVED);
224         eapReqData = eapol_get_eapReqData(sm);
225         /* parse rxReq, rxSuccess, rxFailure, reqId, reqMethod */
226         eap_sm_parseEapReq(sm, eapReqData);
227         sm->num_rounds++;
228 }
229
230
231 /*
232  * This state is entered when a request for a new type comes in. Either the
233  * correct method is started, or a Nak response is built.
234  */
235 SM_STATE(EAP, GET_METHOD)
236 {
237         int reinit;
238         EapType method;
239         const struct eap_method *eap_method;
240
241         SM_ENTRY(EAP, GET_METHOD);
242
243         if (sm->reqMethod == EAP_TYPE_EXPANDED)
244                 method = sm->reqVendorMethod;
245         else
246                 method = sm->reqMethod;
247
248         eap_method = eap_peer_get_eap_method(sm->reqVendor, method);
249
250         if (!eap_sm_allowMethod(sm, sm->reqVendor, method)) {
251                 wpa_printf(MSG_DEBUG, "EAP: vendor %u method %u not allowed",
252                            sm->reqVendor, method);
253                 wpa_msg(sm->msg_ctx, MSG_INFO, WPA_EVENT_EAP_PROPOSED_METHOD
254                         "vendor=%u method=%u -> NAK",
255                         sm->reqVendor, method);
256                 eap_notify_status(sm, "refuse proposed method",
257                                   eap_method ?  eap_method->name : "unknown");
258                 goto nak;
259         }
260
261         wpa_msg(sm->msg_ctx, MSG_INFO, WPA_EVENT_EAP_PROPOSED_METHOD
262                 "vendor=%u method=%u", sm->reqVendor, method);
263
264         eap_notify_status(sm, "accept proposed method",
265                           eap_method ?  eap_method->name : "unknown");
266         /*
267          * RFC 4137 does not define specific operation for fast
268          * re-authentication (session resumption). The design here is to allow
269          * the previously used method data to be maintained for
270          * re-authentication if the method support session resumption.
271          * Otherwise, the previously used method data is freed and a new method
272          * is allocated here.
273          */
274         if (sm->fast_reauth &&
275             sm->m && sm->m->vendor == sm->reqVendor &&
276             sm->m->method == method &&
277             sm->m->has_reauth_data &&
278             sm->m->has_reauth_data(sm, sm->eap_method_priv)) {
279                 wpa_printf(MSG_DEBUG, "EAP: Using previous method data"
280                            " for fast re-authentication");
281                 reinit = 1;
282         } else {
283                 eap_deinit_prev_method(sm, "GET_METHOD");
284                 reinit = 0;
285         }
286
287         sm->selectedMethod = sm->reqMethod;
288         if (sm->m == NULL)
289                 sm->m = eap_method;
290         if (!sm->m) {
291                 wpa_printf(MSG_DEBUG, "EAP: Could not find selected method: "
292                            "vendor %d method %d",
293                            sm->reqVendor, method);
294                 goto nak;
295         }
296
297         sm->ClientTimeout = EAP_CLIENT_TIMEOUT_DEFAULT;
298
299         wpa_printf(MSG_DEBUG, "EAP: Initialize selected EAP method: "
300                    "vendor %u method %u (%s)",
301                    sm->reqVendor, method, sm->m->name);
302         if (reinit)
303                 sm->eap_method_priv = sm->m->init_for_reauth(
304                         sm, sm->eap_method_priv);
305         else
306                 sm->eap_method_priv = sm->m->init(sm);
307
308         if (sm->eap_method_priv == NULL) {
309                 struct eap_peer_config *config = eap_get_config(sm);
310                 wpa_msg(sm->msg_ctx, MSG_INFO,
311                         "EAP: Failed to initialize EAP method: vendor %u "
312                         "method %u (%s)",
313                         sm->reqVendor, method, sm->m->name);
314                 sm->m = NULL;
315                 sm->methodState = METHOD_NONE;
316                 sm->selectedMethod = EAP_TYPE_NONE;
317                 if (sm->reqMethod == EAP_TYPE_TLS && config &&
318                     (config->pending_req_pin ||
319                      config->pending_req_passphrase)) {
320                         /*
321                          * Return without generating Nak in order to allow
322                          * entering of PIN code or passphrase to retry the
323                          * current EAP packet.
324                          */
325                         wpa_printf(MSG_DEBUG, "EAP: Pending PIN/passphrase "
326                                    "request - skip Nak");
327                         return;
328                 }
329
330                 goto nak;
331         }
332
333         sm->methodState = METHOD_INIT;
334         wpa_msg(sm->msg_ctx, MSG_INFO, WPA_EVENT_EAP_METHOD
335                 "EAP vendor %u method %u (%s) selected",
336                 sm->reqVendor, method, sm->m->name);
337         return;
338
339 nak:
340         wpabuf_free(sm->eapRespData);
341         sm->eapRespData = NULL;
342         sm->eapRespData = eap_sm_buildNak(sm, sm->reqId);
343 }
344
345
346 /*
347  * The method processing happens here. The request from the authenticator is
348  * processed, and an appropriate response packet is built.
349  */
350 SM_STATE(EAP, METHOD)
351 {
352         struct wpabuf *eapReqData;
353         struct eap_method_ret ret;
354         int min_len = 1;
355
356         SM_ENTRY(EAP, METHOD);
357         if (sm->m == NULL) {
358                 wpa_printf(MSG_WARNING, "EAP::METHOD - method not selected");
359                 return;
360         }
361
362         eapReqData = eapol_get_eapReqData(sm);
363         if (sm->m->vendor == EAP_VENDOR_IETF && sm->m->method == EAP_TYPE_LEAP)
364                 min_len = 0; /* LEAP uses EAP-Success without payload */
365         if (!eap_hdr_len_valid(eapReqData, min_len))
366                 return;
367
368         /*
369          * Get ignore, methodState, decision, allowNotifications, and
370          * eapRespData. RFC 4137 uses three separate method procedure (check,
371          * process, and buildResp) in this state. These have been combined into
372          * a single function call to m->process() in order to optimize EAP
373          * method implementation interface a bit. These procedures are only
374          * used from within this METHOD state, so there is no need to keep
375          * these as separate C functions.
376          *
377          * The RFC 4137 procedures return values as follows:
378          * ignore = m.check(eapReqData)
379          * (methodState, decision, allowNotifications) = m.process(eapReqData)
380          * eapRespData = m.buildResp(reqId)
381          */
382         os_memset(&ret, 0, sizeof(ret));
383         ret.ignore = sm->ignore;
384         ret.methodState = sm->methodState;
385         ret.decision = sm->decision;
386         ret.allowNotifications = sm->allowNotifications;
387         wpabuf_free(sm->eapRespData);
388         sm->eapRespData = NULL;
389         sm->eapRespData = sm->m->process(sm, sm->eap_method_priv, &ret,
390                                          eapReqData);
391         wpa_printf(MSG_DEBUG, "EAP: method process -> ignore=%s "
392                    "methodState=%s decision=%s eapRespData=%p",
393                    ret.ignore ? "TRUE" : "FALSE",
394                    eap_sm_method_state_txt(ret.methodState),
395                    eap_sm_decision_txt(ret.decision),
396                    sm->eapRespData);
397
398         sm->ignore = ret.ignore;
399         if (sm->ignore)
400                 return;
401         sm->methodState = ret.methodState;
402         sm->decision = ret.decision;
403         sm->allowNotifications = ret.allowNotifications;
404
405         if (sm->m->isKeyAvailable && sm->m->getKey &&
406             sm->m->isKeyAvailable(sm, sm->eap_method_priv)) {
407                 os_free(sm->eapKeyData);
408                 sm->eapKeyData = sm->m->getKey(sm, sm->eap_method_priv,
409                                                &sm->eapKeyDataLen);
410                 os_free(sm->eapSessionId);
411                 sm->eapSessionId = NULL;
412                 if (sm->m->getSessionId) {
413                         sm->eapSessionId = sm->m->getSessionId(
414                                 sm, sm->eap_method_priv,
415                                 &sm->eapSessionIdLen);
416                         wpa_hexdump(MSG_DEBUG, "EAP: Session-Id",
417                                     sm->eapSessionId, sm->eapSessionIdLen);
418                 }
419         }
420 }
421
422
423 /*
424  * This state signals the lower layer that a response packet is ready to be
425  * sent.
426  */
427 SM_STATE(EAP, SEND_RESPONSE)
428 {
429         SM_ENTRY(EAP, SEND_RESPONSE);
430         wpabuf_free(sm->lastRespData);
431         if (sm->eapRespData) {
432                 if (sm->workaround)
433                         os_memcpy(sm->last_md5, sm->req_md5, 16);
434                 sm->lastId = sm->reqId;
435                 sm->lastRespData = wpabuf_dup(sm->eapRespData);
436                 eapol_set_bool(sm, EAPOL_eapResp, TRUE);
437         } else {
438                 wpa_printf(MSG_DEBUG, "EAP: No eapRespData available");
439                 sm->lastRespData = NULL;
440         }
441         eapol_set_bool(sm, EAPOL_eapReq, FALSE);
442         eapol_set_int(sm, EAPOL_idleWhile, sm->ClientTimeout);
443 }
444
445
446 /*
447  * This state signals the lower layer that the request was discarded, and no
448  * response packet will be sent at this time.
449  */
450 SM_STATE(EAP, DISCARD)
451 {
452         SM_ENTRY(EAP, DISCARD);
453         eapol_set_bool(sm, EAPOL_eapReq, FALSE);
454         eapol_set_bool(sm, EAPOL_eapNoResp, TRUE);
455 }
456
457
458 /*
459  * Handles requests for Identity method and builds a response.
460  */
461 SM_STATE(EAP, IDENTITY)
462 {
463         const struct wpabuf *eapReqData;
464
465         SM_ENTRY(EAP, IDENTITY);
466         eapReqData = eapol_get_eapReqData(sm);
467         if (!eap_hdr_len_valid(eapReqData, 1))
468                 return;
469         eap_sm_processIdentity(sm, eapReqData);
470         wpabuf_free(sm->eapRespData);
471         sm->eapRespData = NULL;
472         sm->eapRespData = eap_sm_buildIdentity(sm, sm->reqId, 0);
473 }
474
475
476 /*
477  * Handles requests for Notification method and builds a response.
478  */
479 SM_STATE(EAP, NOTIFICATION)
480 {
481         const struct wpabuf *eapReqData;
482
483         SM_ENTRY(EAP, NOTIFICATION);
484         eapReqData = eapol_get_eapReqData(sm);
485         if (!eap_hdr_len_valid(eapReqData, 1))
486                 return;
487         eap_sm_processNotify(sm, eapReqData);
488         wpabuf_free(sm->eapRespData);
489         sm->eapRespData = NULL;
490         sm->eapRespData = eap_sm_buildNotify(sm->reqId);
491 }
492
493
494 /*
495  * This state retransmits the previous response packet.
496  */
497 SM_STATE(EAP, RETRANSMIT)
498 {
499         SM_ENTRY(EAP, RETRANSMIT);
500         wpabuf_free(sm->eapRespData);
501         if (sm->lastRespData)
502                 sm->eapRespData = wpabuf_dup(sm->lastRespData);
503         else
504                 sm->eapRespData = NULL;
505 }
506
507
508 /*
509  * This state is entered in case of a successful completion of authentication
510  * and state machine waits here until port is disabled or EAP authentication is
511  * restarted.
512  */
513 SM_STATE(EAP, SUCCESS)
514 {
515         SM_ENTRY(EAP, SUCCESS);
516         if (sm->eapKeyData != NULL)
517                 sm->eapKeyAvailable = TRUE;
518         eapol_set_bool(sm, EAPOL_eapSuccess, TRUE);
519
520         /*
521          * RFC 4137 does not clear eapReq here, but this seems to be required
522          * to avoid processing the same request twice when state machine is
523          * initialized.
524          */
525         eapol_set_bool(sm, EAPOL_eapReq, FALSE);
526
527         /*
528          * RFC 4137 does not set eapNoResp here, but this seems to be required
529          * to get EAPOL Supplicant backend state machine into SUCCESS state. In
530          * addition, either eapResp or eapNoResp is required to be set after
531          * processing the received EAP frame.
532          */
533         eapol_set_bool(sm, EAPOL_eapNoResp, TRUE);
534
535         wpa_msg(sm->msg_ctx, MSG_INFO, WPA_EVENT_EAP_SUCCESS
536                 "EAP authentication completed successfully");
537 }
538
539
540 /*
541  * This state is entered in case of a failure and state machine waits here
542  * until port is disabled or EAP authentication is restarted.
543  */
544 SM_STATE(EAP, FAILURE)
545 {
546         SM_ENTRY(EAP, FAILURE);
547         eapol_set_bool(sm, EAPOL_eapFail, TRUE);
548
549         /*
550          * RFC 4137 does not clear eapReq here, but this seems to be required
551          * to avoid processing the same request twice when state machine is
552          * initialized.
553          */
554         eapol_set_bool(sm, EAPOL_eapReq, FALSE);
555
556         /*
557          * RFC 4137 does not set eapNoResp here. However, either eapResp or
558          * eapNoResp is required to be set after processing the received EAP
559          * frame.
560          */
561         eapol_set_bool(sm, EAPOL_eapNoResp, TRUE);
562
563         wpa_msg(sm->msg_ctx, MSG_INFO, WPA_EVENT_EAP_FAILURE
564                 "EAP authentication failed");
565
566         sm->prev_failure = 1;
567 }
568
569
570 static int eap_success_workaround(struct eap_sm *sm, int reqId, int lastId)
571 {
572         /*
573          * At least Microsoft IAS and Meetinghouse Aegis seem to be sending
574          * EAP-Success/Failure with lastId + 1 even though RFC 3748 and
575          * RFC 4137 require that reqId == lastId. In addition, it looks like
576          * Ringmaster v2.1.2.0 would be using lastId + 2 in EAP-Success.
577          *
578          * Accept this kind of Id if EAP workarounds are enabled. These are
579          * unauthenticated plaintext messages, so this should have minimal
580          * security implications (bit easier to fake EAP-Success/Failure).
581          */
582         if (sm->workaround && (reqId == ((lastId + 1) & 0xff) ||
583                                reqId == ((lastId + 2) & 0xff))) {
584                 wpa_printf(MSG_DEBUG, "EAP: Workaround for unexpected "
585                            "identifier field in EAP Success: "
586                            "reqId=%d lastId=%d (these are supposed to be "
587                            "same)", reqId, lastId);
588                 return 1;
589         }
590         wpa_printf(MSG_DEBUG, "EAP: EAP-Success Id mismatch - reqId=%d "
591                    "lastId=%d", reqId, lastId);
592         return 0;
593 }
594
595
596 /*
597  * RFC 4137 - Appendix A.1: EAP Peer State Machine - State transitions
598  */
599
600 static void eap_peer_sm_step_idle(struct eap_sm *sm)
601 {
602         /*
603          * The first three transitions are from RFC 4137. The last two are
604          * local additions to handle special cases with LEAP and PEAP server
605          * not sending EAP-Success in some cases.
606          */
607         if (eapol_get_bool(sm, EAPOL_eapReq))
608                 SM_ENTER(EAP, RECEIVED);
609         else if ((eapol_get_bool(sm, EAPOL_altAccept) &&
610                   sm->decision != DECISION_FAIL) ||
611                  (eapol_get_int(sm, EAPOL_idleWhile) == 0 &&
612                   sm->decision == DECISION_UNCOND_SUCC))
613                 SM_ENTER(EAP, SUCCESS);
614         else if (eapol_get_bool(sm, EAPOL_altReject) ||
615                  (eapol_get_int(sm, EAPOL_idleWhile) == 0 &&
616                   sm->decision != DECISION_UNCOND_SUCC) ||
617                  (eapol_get_bool(sm, EAPOL_altAccept) &&
618                   sm->methodState != METHOD_CONT &&
619                   sm->decision == DECISION_FAIL))
620                 SM_ENTER(EAP, FAILURE);
621         else if (sm->selectedMethod == EAP_TYPE_LEAP &&
622                  sm->leap_done && sm->decision != DECISION_FAIL &&
623                  sm->methodState == METHOD_DONE)
624                 SM_ENTER(EAP, SUCCESS);
625         else if (sm->selectedMethod == EAP_TYPE_PEAP &&
626                  sm->peap_done && sm->decision != DECISION_FAIL &&
627                  sm->methodState == METHOD_DONE)
628                 SM_ENTER(EAP, SUCCESS);
629 }
630
631
632 static int eap_peer_req_is_duplicate(struct eap_sm *sm)
633 {
634         int duplicate;
635
636         duplicate = (sm->reqId == sm->lastId) && sm->rxReq;
637         if (sm->workaround && duplicate &&
638             os_memcmp(sm->req_md5, sm->last_md5, 16) != 0) {
639                 /*
640                  * RFC 4137 uses (reqId == lastId) as the only verification for
641                  * duplicate EAP requests. However, this misses cases where the
642                  * AS is incorrectly using the same id again; and
643                  * unfortunately, such implementations exist. Use MD5 hash as
644                  * an extra verification for the packets being duplicate to
645                  * workaround these issues.
646                  */
647                 wpa_printf(MSG_DEBUG, "EAP: AS used the same Id again, but "
648                            "EAP packets were not identical");
649                 wpa_printf(MSG_DEBUG, "EAP: workaround - assume this is not a "
650                            "duplicate packet");
651                 duplicate = 0;
652         }
653
654         return duplicate;
655 }
656
657
658 static void eap_peer_sm_step_received(struct eap_sm *sm)
659 {
660         int duplicate = eap_peer_req_is_duplicate(sm);
661
662         /*
663          * Two special cases below for LEAP are local additions to work around
664          * odd LEAP behavior (EAP-Success in the middle of authentication and
665          * then swapped roles). Other transitions are based on RFC 4137.
666          */
667         if (sm->rxSuccess && sm->decision != DECISION_FAIL &&
668             (sm->reqId == sm->lastId ||
669              eap_success_workaround(sm, sm->reqId, sm->lastId)))
670                 SM_ENTER(EAP, SUCCESS);
671         else if (sm->methodState != METHOD_CONT &&
672                  ((sm->rxFailure &&
673                    sm->decision != DECISION_UNCOND_SUCC) ||
674                   (sm->rxSuccess && sm->decision == DECISION_FAIL &&
675                    (sm->selectedMethod != EAP_TYPE_LEAP ||
676                     sm->methodState != METHOD_MAY_CONT))) &&
677                  (sm->reqId == sm->lastId ||
678                   eap_success_workaround(sm, sm->reqId, sm->lastId)))
679                 SM_ENTER(EAP, FAILURE);
680         else if (sm->rxReq && duplicate)
681                 SM_ENTER(EAP, RETRANSMIT);
682         else if (sm->rxReq && !duplicate &&
683                  sm->reqMethod == EAP_TYPE_NOTIFICATION &&
684                  sm->allowNotifications)
685                 SM_ENTER(EAP, NOTIFICATION);
686         else if (sm->rxReq && !duplicate &&
687                  sm->selectedMethod == EAP_TYPE_NONE &&
688                  sm->reqMethod == EAP_TYPE_IDENTITY)
689                 SM_ENTER(EAP, IDENTITY);
690         else if (sm->rxReq && !duplicate &&
691                  sm->selectedMethod == EAP_TYPE_NONE &&
692                  sm->reqMethod != EAP_TYPE_IDENTITY &&
693                  sm->reqMethod != EAP_TYPE_NOTIFICATION)
694                 SM_ENTER(EAP, GET_METHOD);
695         else if (sm->rxReq && !duplicate &&
696                  sm->reqMethod == sm->selectedMethod &&
697                  sm->methodState != METHOD_DONE)
698                 SM_ENTER(EAP, METHOD);
699         else if (sm->selectedMethod == EAP_TYPE_LEAP &&
700                  (sm->rxSuccess || sm->rxResp))
701                 SM_ENTER(EAP, METHOD);
702         else
703                 SM_ENTER(EAP, DISCARD);
704 }
705
706
707 static void eap_peer_sm_step_local(struct eap_sm *sm)
708 {
709         switch (sm->EAP_state) {
710         case EAP_INITIALIZE:
711                 SM_ENTER(EAP, IDLE);
712                 break;
713         case EAP_DISABLED:
714                 if (eapol_get_bool(sm, EAPOL_portEnabled) &&
715                     !sm->force_disabled)
716                         SM_ENTER(EAP, INITIALIZE);
717                 break;
718         case EAP_IDLE:
719                 eap_peer_sm_step_idle(sm);
720                 break;
721         case EAP_RECEIVED:
722                 eap_peer_sm_step_received(sm);
723                 break;
724         case EAP_GET_METHOD:
725                 if (sm->selectedMethod == sm->reqMethod)
726                         SM_ENTER(EAP, METHOD);
727                 else
728                         SM_ENTER(EAP, SEND_RESPONSE);
729                 break;
730         case EAP_METHOD:
731                 /*
732                  * Note: RFC 4137 uses methodState == DONE && decision == FAIL
733                  * as the condition. eapRespData == NULL here is used to allow
734                  * final EAP method response to be sent without having to change
735                  * all methods to either use methodState MAY_CONT or leaving
736                  * decision to something else than FAIL in cases where the only
737                  * expected response is EAP-Failure.
738                  */
739                 if (sm->ignore)
740                         SM_ENTER(EAP, DISCARD);
741                 else if (sm->methodState == METHOD_DONE &&
742                          sm->decision == DECISION_FAIL && !sm->eapRespData)
743                         SM_ENTER(EAP, FAILURE);
744                 else
745                         SM_ENTER(EAP, SEND_RESPONSE);
746                 break;
747         case EAP_SEND_RESPONSE:
748                 SM_ENTER(EAP, IDLE);
749                 break;
750         case EAP_DISCARD:
751                 SM_ENTER(EAP, IDLE);
752                 break;
753         case EAP_IDENTITY:
754                 SM_ENTER(EAP, SEND_RESPONSE);
755                 break;
756         case EAP_NOTIFICATION:
757                 SM_ENTER(EAP, SEND_RESPONSE);
758                 break;
759         case EAP_RETRANSMIT:
760                 SM_ENTER(EAP, SEND_RESPONSE);
761                 break;
762         case EAP_SUCCESS:
763                 break;
764         case EAP_FAILURE:
765                 break;
766         }
767 }
768
769
770 SM_STEP(EAP)
771 {
772         /* Global transitions */
773         if (eapol_get_bool(sm, EAPOL_eapRestart) &&
774             eapol_get_bool(sm, EAPOL_portEnabled))
775                 SM_ENTER_GLOBAL(EAP, INITIALIZE);
776         else if (!eapol_get_bool(sm, EAPOL_portEnabled) || sm->force_disabled)
777                 SM_ENTER_GLOBAL(EAP, DISABLED);
778         else if (sm->num_rounds > EAP_MAX_AUTH_ROUNDS) {
779                 /* RFC 4137 does not place any limit on number of EAP messages
780                  * in an authentication session. However, some error cases have
781                  * ended up in a state were EAP messages were sent between the
782                  * peer and server in a loop (e.g., TLS ACK frame in both
783                  * direction). Since this is quite undesired outcome, limit the
784                  * total number of EAP round-trips and abort authentication if
785                  * this limit is exceeded.
786                  */
787                 if (sm->num_rounds == EAP_MAX_AUTH_ROUNDS + 1) {
788                         wpa_msg(sm->msg_ctx, MSG_INFO, "EAP: more than %d "
789                                 "authentication rounds - abort",
790                                 EAP_MAX_AUTH_ROUNDS);
791                         sm->num_rounds++;
792                         SM_ENTER_GLOBAL(EAP, FAILURE);
793                 }
794         } else {
795                 /* Local transitions */
796                 eap_peer_sm_step_local(sm);
797         }
798 }
799
800
801 static Boolean eap_sm_allowMethod(struct eap_sm *sm, int vendor,
802                                   EapType method)
803 {
804         if (!eap_allowed_method(sm, vendor, method)) {
805                 wpa_printf(MSG_DEBUG, "EAP: configuration does not allow: "
806                            "vendor %u method %u", vendor, method);
807                 return FALSE;
808         }
809         if (eap_peer_get_eap_method(vendor, method))
810                 return TRUE;
811         wpa_printf(MSG_DEBUG, "EAP: not included in build: "
812                    "vendor %u method %u", vendor, method);
813         return FALSE;
814 }
815
816
817 static struct wpabuf * eap_sm_build_expanded_nak(
818         struct eap_sm *sm, int id, const struct eap_method *methods,
819         size_t count)
820 {
821         struct wpabuf *resp;
822         int found = 0;
823         const struct eap_method *m;
824
825         wpa_printf(MSG_DEBUG, "EAP: Building expanded EAP-Nak");
826
827         /* RFC 3748 - 5.3.2: Expanded Nak */
828         resp = eap_msg_alloc(EAP_VENDOR_IETF, EAP_TYPE_EXPANDED,
829                              8 + 8 * (count + 1), EAP_CODE_RESPONSE, id);
830         if (resp == NULL)
831                 return NULL;
832
833         wpabuf_put_be24(resp, EAP_VENDOR_IETF);
834         wpabuf_put_be32(resp, EAP_TYPE_NAK);
835
836         for (m = methods; m; m = m->next) {
837                 if (sm->reqVendor == m->vendor &&
838                     sm->reqVendorMethod == m->method)
839                         continue; /* do not allow the current method again */
840                 if (eap_allowed_method(sm, m->vendor, m->method)) {
841                         wpa_printf(MSG_DEBUG, "EAP: allowed type: "
842                                    "vendor=%u method=%u",
843                                    m->vendor, m->method);
844                         wpabuf_put_u8(resp, EAP_TYPE_EXPANDED);
845                         wpabuf_put_be24(resp, m->vendor);
846                         wpabuf_put_be32(resp, m->method);
847
848                         found++;
849                 }
850         }
851         if (!found) {
852                 wpa_printf(MSG_DEBUG, "EAP: no more allowed methods");
853                 wpabuf_put_u8(resp, EAP_TYPE_EXPANDED);
854                 wpabuf_put_be24(resp, EAP_VENDOR_IETF);
855                 wpabuf_put_be32(resp, EAP_TYPE_NONE);
856         }
857
858         eap_update_len(resp);
859
860         return resp;
861 }
862
863
864 static struct wpabuf * eap_sm_buildNak(struct eap_sm *sm, int id)
865 {
866         struct wpabuf *resp;
867         u8 *start;
868         int found = 0, expanded_found = 0;
869         size_t count;
870         const struct eap_method *methods, *m;
871
872         wpa_printf(MSG_DEBUG, "EAP: Building EAP-Nak (requested type %u "
873                    "vendor=%u method=%u not allowed)", sm->reqMethod,
874                    sm->reqVendor, sm->reqVendorMethod);
875         methods = eap_peer_get_methods(&count);
876         if (methods == NULL)
877                 return NULL;
878         if (sm->reqMethod == EAP_TYPE_EXPANDED)
879                 return eap_sm_build_expanded_nak(sm, id, methods, count);
880
881         /* RFC 3748 - 5.3.1: Legacy Nak */
882         resp = eap_msg_alloc(EAP_VENDOR_IETF, EAP_TYPE_NAK,
883                              sizeof(struct eap_hdr) + 1 + count + 1,
884                              EAP_CODE_RESPONSE, id);
885         if (resp == NULL)
886                 return NULL;
887
888         start = wpabuf_put(resp, 0);
889         for (m = methods; m; m = m->next) {
890                 if (m->vendor == EAP_VENDOR_IETF && m->method == sm->reqMethod)
891                         continue; /* do not allow the current method again */
892                 if (eap_allowed_method(sm, m->vendor, m->method)) {
893                         if (m->vendor != EAP_VENDOR_IETF) {
894                                 if (expanded_found)
895                                         continue;
896                                 expanded_found = 1;
897                                 wpabuf_put_u8(resp, EAP_TYPE_EXPANDED);
898                         } else
899                                 wpabuf_put_u8(resp, m->method);
900                         found++;
901                 }
902         }
903         if (!found)
904                 wpabuf_put_u8(resp, EAP_TYPE_NONE);
905         wpa_hexdump(MSG_DEBUG, "EAP: allowed methods", start, found);
906
907         eap_update_len(resp);
908
909         return resp;
910 }
911
912
913 static void eap_sm_processIdentity(struct eap_sm *sm, const struct wpabuf *req)
914 {
915         const u8 *pos;
916         size_t msg_len;
917
918         wpa_msg(sm->msg_ctx, MSG_INFO, WPA_EVENT_EAP_STARTED
919                 "EAP authentication started");
920         eap_notify_status(sm, "started", "");
921
922         pos = eap_hdr_validate(EAP_VENDOR_IETF, EAP_TYPE_IDENTITY, req,
923                                &msg_len);
924         if (pos == NULL)
925                 return;
926
927         /*
928          * RFC 3748 - 5.1: Identity
929          * Data field may contain a displayable message in UTF-8. If this
930          * includes NUL-character, only the data before that should be
931          * displayed. Some EAP implementasitons may piggy-back additional
932          * options after the NUL.
933          */
934         /* TODO: could save displayable message so that it can be shown to the
935          * user in case of interaction is required */
936         wpa_hexdump_ascii(MSG_DEBUG, "EAP: EAP-Request Identity data",
937                           pos, msg_len);
938 }
939
940
941 #ifdef PCSC_FUNCS
942
943 /*
944  * Rules for figuring out MNC length based on IMSI for SIM cards that do not
945  * include MNC length field.
946  */
947 static int mnc_len_from_imsi(const char *imsi)
948 {
949         char mcc_str[4];
950         unsigned int mcc;
951
952         os_memcpy(mcc_str, imsi, 3);
953         mcc_str[3] = '\0';
954         mcc = atoi(mcc_str);
955
956         if (mcc == 228)
957                 return 2; /* Networks in Switzerland use 2-digit MNC */
958         if (mcc == 244)
959                 return 2; /* Networks in Finland use 2-digit MNC */
960
961         return -1;
962 }
963
964
965 static int eap_sm_append_3gpp_realm(struct eap_sm *sm, char *imsi,
966                                     size_t max_len, size_t *imsi_len)
967 {
968         int mnc_len;
969         char *pos, mnc[4];
970
971         if (*imsi_len + 36 > max_len) {
972                 wpa_printf(MSG_WARNING, "No room for realm in IMSI buffer");
973                 return -1;
974         }
975
976         /* MNC (2 or 3 digits) */
977         mnc_len = scard_get_mnc_len(sm->scard_ctx);
978         if (mnc_len < 0)
979                 mnc_len = mnc_len_from_imsi(imsi);
980         if (mnc_len < 0) {
981                 wpa_printf(MSG_INFO, "Failed to get MNC length from (U)SIM "
982                            "assuming 3");
983                 mnc_len = 3;
984         }
985
986         if (mnc_len == 2) {
987                 mnc[0] = '0';
988                 mnc[1] = imsi[3];
989                 mnc[2] = imsi[4];
990         } else if (mnc_len == 3) {
991                 mnc[0] = imsi[3];
992                 mnc[1] = imsi[4];
993                 mnc[2] = imsi[5];
994         }
995         mnc[3] = '\0';
996
997         pos = imsi + *imsi_len;
998         pos += os_snprintf(pos, imsi + max_len - pos,
999                            "@wlan.mnc%s.mcc%c%c%c.3gppnetwork.org",
1000                            mnc, imsi[0], imsi[1], imsi[2]);
1001         *imsi_len = pos - imsi;
1002
1003         return 0;
1004 }
1005
1006
1007 static int eap_sm_imsi_identity(struct eap_sm *sm,
1008                                 struct eap_peer_config *conf)
1009 {
1010         enum { EAP_SM_SIM, EAP_SM_AKA, EAP_SM_AKA_PRIME } method = EAP_SM_SIM;
1011         char imsi[100];
1012         size_t imsi_len;
1013         struct eap_method_type *m = conf->eap_methods;
1014         int i;
1015
1016         imsi_len = sizeof(imsi);
1017         if (scard_get_imsi(sm->scard_ctx, imsi, &imsi_len)) {
1018                 wpa_printf(MSG_WARNING, "Failed to get IMSI from SIM");
1019                 return -1;
1020         }
1021
1022         wpa_hexdump_ascii(MSG_DEBUG, "IMSI", (u8 *) imsi, imsi_len);
1023
1024         if (imsi_len < 7) {
1025                 wpa_printf(MSG_WARNING, "Too short IMSI for SIM identity");
1026                 return -1;
1027         }
1028
1029         if (eap_sm_append_3gpp_realm(sm, imsi, sizeof(imsi), &imsi_len) < 0) {
1030                 wpa_printf(MSG_WARNING, "Could not add realm to SIM identity");
1031                 return -1;
1032         }
1033         wpa_hexdump_ascii(MSG_DEBUG, "IMSI + realm", (u8 *) imsi, imsi_len);
1034
1035         for (i = 0; m && (m[i].vendor != EAP_VENDOR_IETF ||
1036                           m[i].method != EAP_TYPE_NONE); i++) {
1037                 if (m[i].vendor == EAP_VENDOR_IETF &&
1038                     m[i].method == EAP_TYPE_AKA_PRIME) {
1039                         method = EAP_SM_AKA_PRIME;
1040                         break;
1041                 }
1042
1043                 if (m[i].vendor == EAP_VENDOR_IETF &&
1044                     m[i].method == EAP_TYPE_AKA) {
1045                         method = EAP_SM_AKA;
1046                         break;
1047                 }
1048         }
1049
1050         os_free(conf->identity);
1051         conf->identity = os_malloc(1 + imsi_len);
1052         if (conf->identity == NULL) {
1053                 wpa_printf(MSG_WARNING, "Failed to allocate buffer for "
1054                            "IMSI-based identity");
1055                 return -1;
1056         }
1057
1058         switch (method) {
1059         case EAP_SM_SIM:
1060                 conf->identity[0] = '1';
1061                 break;
1062         case EAP_SM_AKA:
1063                 conf->identity[0] = '0';
1064                 break;
1065         case EAP_SM_AKA_PRIME:
1066                 conf->identity[0] = '6';
1067                 break;
1068         }
1069         os_memcpy(conf->identity + 1, imsi, imsi_len);
1070         conf->identity_len = 1 + imsi_len;
1071
1072         return 0;
1073 }
1074
1075 #endif /* PCSC_FUNCS */
1076
1077
1078 static int eap_sm_set_scard_pin(struct eap_sm *sm,
1079                                 struct eap_peer_config *conf)
1080 {
1081 #ifdef PCSC_FUNCS
1082         if (scard_set_pin(sm->scard_ctx, conf->pin)) {
1083                 /*
1084                  * Make sure the same PIN is not tried again in order to avoid
1085                  * blocking SIM.
1086                  */
1087                 os_free(conf->pin);
1088                 conf->pin = NULL;
1089
1090                 wpa_printf(MSG_WARNING, "PIN validation failed");
1091                 eap_sm_request_pin(sm);
1092                 return -1;
1093         }
1094         return 0;
1095 #else /* PCSC_FUNCS */
1096         return -1;
1097 #endif /* PCSC_FUNCS */
1098 }
1099
1100 static int eap_sm_get_scard_identity(struct eap_sm *sm,
1101                                      struct eap_peer_config *conf)
1102 {
1103 #ifdef PCSC_FUNCS
1104         if (eap_sm_set_scard_pin(sm, conf))
1105                 return -1;
1106
1107         return eap_sm_imsi_identity(sm, conf);
1108 #else /* PCSC_FUNCS */
1109         return -1;
1110 #endif /* PCSC_FUNCS */
1111 }
1112
1113
1114 /**
1115  * eap_sm_buildIdentity - Build EAP-Identity/Response for the current network
1116  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
1117  * @id: EAP identifier for the packet
1118  * @encrypted: Whether the packet is for encrypted tunnel (EAP phase 2)
1119  * Returns: Pointer to the allocated EAP-Identity/Response packet or %NULL on
1120  * failure
1121  *
1122  * This function allocates and builds an EAP-Identity/Response packet for the
1123  * current network. The caller is responsible for freeing the returned data.
1124  */
1125 struct wpabuf * eap_sm_buildIdentity(struct eap_sm *sm, int id, int encrypted)
1126 {
1127         struct eap_peer_config *config = eap_get_config(sm);
1128         struct wpabuf *resp;
1129         const u8 *identity;
1130         size_t identity_len;
1131
1132         if (config == NULL) {
1133                 wpa_printf(MSG_WARNING, "EAP: buildIdentity: configuration "
1134                            "was not available");
1135                 return NULL;
1136         }
1137
1138         if (sm->m && sm->m->get_identity &&
1139             (identity = sm->m->get_identity(sm, sm->eap_method_priv,
1140                                             &identity_len)) != NULL) {
1141                 wpa_hexdump_ascii(MSG_DEBUG, "EAP: using method re-auth "
1142                                   "identity", identity, identity_len);
1143         } else if (!encrypted && config->anonymous_identity) {
1144                 identity = config->anonymous_identity;
1145                 identity_len = config->anonymous_identity_len;
1146                 wpa_hexdump_ascii(MSG_DEBUG, "EAP: using anonymous identity",
1147                                   identity, identity_len);
1148         } else {
1149                 identity = config->identity;
1150                 identity_len = config->identity_len;
1151                 wpa_hexdump_ascii(MSG_DEBUG, "EAP: using real identity",
1152                                   identity, identity_len);
1153         }
1154
1155         if (identity == NULL) {
1156                 wpa_printf(MSG_WARNING, "EAP: buildIdentity: identity "
1157                            "configuration was not available");
1158                 if (config->pcsc) {
1159                         if (eap_sm_get_scard_identity(sm, config) < 0)
1160                                 return NULL;
1161                         identity = config->identity;
1162                         identity_len = config->identity_len;
1163                         wpa_hexdump_ascii(MSG_DEBUG, "permanent identity from "
1164                                           "IMSI", identity, identity_len);
1165                 } else {
1166                         eap_sm_request_identity(sm);
1167                         return NULL;
1168                 }
1169         } else if (config->pcsc) {
1170                 if (eap_sm_set_scard_pin(sm, config) < 0)
1171                         return NULL;
1172         }
1173
1174         resp = eap_msg_alloc(EAP_VENDOR_IETF, EAP_TYPE_IDENTITY, identity_len,
1175                              EAP_CODE_RESPONSE, id);
1176         if (resp == NULL)
1177                 return NULL;
1178
1179         wpabuf_put_data(resp, identity, identity_len);
1180
1181         return resp;
1182 }
1183
1184
1185 static void eap_sm_processNotify(struct eap_sm *sm, const struct wpabuf *req)
1186 {
1187         const u8 *pos;
1188         char *msg;
1189         size_t i, msg_len;
1190
1191         pos = eap_hdr_validate(EAP_VENDOR_IETF, EAP_TYPE_NOTIFICATION, req,
1192                                &msg_len);
1193         if (pos == NULL)
1194                 return;
1195         wpa_hexdump_ascii(MSG_DEBUG, "EAP: EAP-Request Notification data",
1196                           pos, msg_len);
1197
1198         msg = os_malloc(msg_len + 1);
1199         if (msg == NULL)
1200                 return;
1201         for (i = 0; i < msg_len; i++)
1202                 msg[i] = isprint(pos[i]) ? (char) pos[i] : '_';
1203         msg[msg_len] = '\0';
1204         wpa_msg(sm->msg_ctx, MSG_INFO, "%s%s",
1205                 WPA_EVENT_EAP_NOTIFICATION, msg);
1206         os_free(msg);
1207 }
1208
1209
1210 static struct wpabuf * eap_sm_buildNotify(int id)
1211 {
1212         struct wpabuf *resp;
1213
1214         wpa_printf(MSG_DEBUG, "EAP: Generating EAP-Response Notification");
1215         resp = eap_msg_alloc(EAP_VENDOR_IETF, EAP_TYPE_NOTIFICATION, 0,
1216                              EAP_CODE_RESPONSE, id);
1217         if (resp == NULL)
1218                 return NULL;
1219
1220         return resp;
1221 }
1222
1223
1224 static void eap_sm_parseEapReq(struct eap_sm *sm, const struct wpabuf *req)
1225 {
1226         const struct eap_hdr *hdr;
1227         size_t plen;
1228         const u8 *pos;
1229
1230         sm->rxReq = sm->rxResp = sm->rxSuccess = sm->rxFailure = FALSE;
1231         sm->reqId = 0;
1232         sm->reqMethod = EAP_TYPE_NONE;
1233         sm->reqVendor = EAP_VENDOR_IETF;
1234         sm->reqVendorMethod = EAP_TYPE_NONE;
1235
1236         if (req == NULL || wpabuf_len(req) < sizeof(*hdr))
1237                 return;
1238
1239         hdr = wpabuf_head(req);
1240         plen = be_to_host16(hdr->length);
1241         if (plen > wpabuf_len(req)) {
1242                 wpa_printf(MSG_DEBUG, "EAP: Ignored truncated EAP-Packet "
1243                            "(len=%lu plen=%lu)",
1244                            (unsigned long) wpabuf_len(req),
1245                            (unsigned long) plen);
1246                 return;
1247         }
1248
1249         sm->reqId = hdr->identifier;
1250
1251         if (sm->workaround) {
1252                 const u8 *addr[1];
1253                 addr[0] = wpabuf_head(req);
1254                 md5_vector(1, addr, &plen, sm->req_md5);
1255         }
1256
1257         switch (hdr->code) {
1258         case EAP_CODE_REQUEST:
1259                 if (plen < sizeof(*hdr) + 1) {
1260                         wpa_printf(MSG_DEBUG, "EAP: Too short EAP-Request - "
1261                                    "no Type field");
1262                         return;
1263                 }
1264                 sm->rxReq = TRUE;
1265                 pos = (const u8 *) (hdr + 1);
1266                 sm->reqMethod = *pos++;
1267                 if (sm->reqMethod == EAP_TYPE_EXPANDED) {
1268                         if (plen < sizeof(*hdr) + 8) {
1269                                 wpa_printf(MSG_DEBUG, "EAP: Ignored truncated "
1270                                            "expanded EAP-Packet (plen=%lu)",
1271                                            (unsigned long) plen);
1272                                 return;
1273                         }
1274                         sm->reqVendor = WPA_GET_BE24(pos);
1275                         pos += 3;
1276                         sm->reqVendorMethod = WPA_GET_BE32(pos);
1277                 }
1278                 wpa_printf(MSG_DEBUG, "EAP: Received EAP-Request id=%d "
1279                            "method=%u vendor=%u vendorMethod=%u",
1280                            sm->reqId, sm->reqMethod, sm->reqVendor,
1281                            sm->reqVendorMethod);
1282                 break;
1283         case EAP_CODE_RESPONSE:
1284                 if (sm->selectedMethod == EAP_TYPE_LEAP) {
1285                         /*
1286                          * LEAP differs from RFC 4137 by using reversed roles
1287                          * for mutual authentication and because of this, we
1288                          * need to accept EAP-Response frames if LEAP is used.
1289                          */
1290                         if (plen < sizeof(*hdr) + 1) {
1291                                 wpa_printf(MSG_DEBUG, "EAP: Too short "
1292                                            "EAP-Response - no Type field");
1293                                 return;
1294                         }
1295                         sm->rxResp = TRUE;
1296                         pos = (const u8 *) (hdr + 1);
1297                         sm->reqMethod = *pos;
1298                         wpa_printf(MSG_DEBUG, "EAP: Received EAP-Response for "
1299                                    "LEAP method=%d id=%d",
1300                                    sm->reqMethod, sm->reqId);
1301                         break;
1302                 }
1303                 wpa_printf(MSG_DEBUG, "EAP: Ignored EAP-Response");
1304                 break;
1305         case EAP_CODE_SUCCESS:
1306                 wpa_printf(MSG_DEBUG, "EAP: Received EAP-Success");
1307                 eap_notify_status(sm, "completion", "success");
1308                 sm->rxSuccess = TRUE;
1309                 break;
1310         case EAP_CODE_FAILURE:
1311                 wpa_printf(MSG_DEBUG, "EAP: Received EAP-Failure");
1312                 eap_notify_status(sm, "completion", "failure");
1313                 sm->rxFailure = TRUE;
1314                 break;
1315         default:
1316                 wpa_printf(MSG_DEBUG, "EAP: Ignored EAP-Packet with unknown "
1317                            "code %d", hdr->code);
1318                 break;
1319         }
1320 }
1321
1322
1323 static void eap_peer_sm_tls_event(void *ctx, enum tls_event ev,
1324                                   union tls_event_data *data)
1325 {
1326         struct eap_sm *sm = ctx;
1327         char *hash_hex = NULL;
1328
1329         switch (ev) {
1330         case TLS_CERT_CHAIN_SUCCESS:
1331                 eap_notify_status(sm, "remote certificate verification",
1332                                   "success");
1333                 break;
1334         case TLS_CERT_CHAIN_FAILURE:
1335                 wpa_msg(sm->msg_ctx, MSG_INFO, WPA_EVENT_EAP_TLS_CERT_ERROR
1336                         "reason=%d depth=%d subject='%s' err='%s'",
1337                         data->cert_fail.reason,
1338                         data->cert_fail.depth,
1339                         data->cert_fail.subject,
1340                         data->cert_fail.reason_txt);
1341                 eap_notify_status(sm, "remote certificate verification",
1342                                   data->cert_fail.reason_txt);
1343                 break;
1344         case TLS_PEER_CERTIFICATE:
1345                 if (!sm->eapol_cb->notify_cert)
1346                         break;
1347
1348                 if (data->peer_cert.hash) {
1349                         size_t len = data->peer_cert.hash_len * 2 + 1;
1350                         hash_hex = os_malloc(len);
1351                         if (hash_hex) {
1352                                 wpa_snprintf_hex(hash_hex, len,
1353                                                  data->peer_cert.hash,
1354                                                  data->peer_cert.hash_len);
1355                         }
1356                 }
1357
1358                 sm->eapol_cb->notify_cert(sm->eapol_ctx,
1359                                           data->peer_cert.depth,
1360                                           data->peer_cert.subject,
1361                                           hash_hex, data->peer_cert.cert);
1362                 break;
1363         case TLS_ALERT:
1364                 if (data->alert.is_local)
1365                         eap_notify_status(sm, "local TLS alert",
1366                                           data->alert.description);
1367                 else
1368                         eap_notify_status(sm, "remote TLS alert",
1369                                           data->alert.description);
1370                 break;
1371         }
1372
1373         os_free(hash_hex);
1374 }
1375
1376
1377 /**
1378  * eap_peer_sm_init - Allocate and initialize EAP peer state machine
1379  * @eapol_ctx: Context data to be used with eapol_cb calls
1380  * @eapol_cb: Pointer to EAPOL callback functions
1381  * @msg_ctx: Context data for wpa_msg() calls
1382  * @conf: EAP configuration
1383  * Returns: Pointer to the allocated EAP state machine or %NULL on failure
1384  *
1385  * This function allocates and initializes an EAP state machine. In addition,
1386  * this initializes TLS library for the new EAP state machine. eapol_cb pointer
1387  * will be in use until eap_peer_sm_deinit() is used to deinitialize this EAP
1388  * state machine. Consequently, the caller must make sure that this data
1389  * structure remains alive while the EAP state machine is active.
1390  */
1391 struct eap_sm * eap_peer_sm_init(void *eapol_ctx,
1392                                  struct eapol_callbacks *eapol_cb,
1393                                  void *msg_ctx, struct eap_config *conf)
1394 {
1395         struct eap_sm *sm;
1396         struct tls_config tlsconf;
1397
1398         sm = os_zalloc(sizeof(*sm));
1399         if (sm == NULL)
1400                 return NULL;
1401         sm->eapol_ctx = eapol_ctx;
1402         sm->eapol_cb = eapol_cb;
1403         sm->msg_ctx = msg_ctx;
1404         sm->ClientTimeout = EAP_CLIENT_TIMEOUT_DEFAULT;
1405         sm->wps = conf->wps;
1406
1407         os_memset(&tlsconf, 0, sizeof(tlsconf));
1408         tlsconf.opensc_engine_path = conf->opensc_engine_path;
1409         tlsconf.pkcs11_engine_path = conf->pkcs11_engine_path;
1410         tlsconf.pkcs11_module_path = conf->pkcs11_module_path;
1411 #ifdef CONFIG_FIPS
1412         tlsconf.fips_mode = 1;
1413 #endif /* CONFIG_FIPS */
1414         tlsconf.event_cb = eap_peer_sm_tls_event;
1415         tlsconf.cb_ctx = sm;
1416         tlsconf.cert_in_cb = conf->cert_in_cb;
1417         sm->ssl_ctx = tls_init(&tlsconf);
1418         if (sm->ssl_ctx == NULL) {
1419                 wpa_printf(MSG_WARNING, "SSL: Failed to initialize TLS "
1420                            "context.");
1421                 os_free(sm);
1422                 return NULL;
1423         }
1424
1425         sm->ssl_ctx2 = tls_init(&tlsconf);
1426         if (sm->ssl_ctx2 == NULL) {
1427                 wpa_printf(MSG_INFO, "SSL: Failed to initialize TLS "
1428                            "context (2).");
1429                 /* Run without separate TLS context within TLS tunnel */
1430         }
1431
1432         return sm;
1433 }
1434
1435
1436 /**
1437  * eap_peer_sm_deinit - Deinitialize and free an EAP peer state machine
1438  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
1439  *
1440  * This function deinitializes EAP state machine and frees all allocated
1441  * resources.
1442  */
1443 void eap_peer_sm_deinit(struct eap_sm *sm)
1444 {
1445         if (sm == NULL)
1446                 return;
1447         eap_deinit_prev_method(sm, "EAP deinit");
1448         eap_sm_abort(sm);
1449         if (sm->ssl_ctx2)
1450                 tls_deinit(sm->ssl_ctx2);
1451         tls_deinit(sm->ssl_ctx);
1452         os_free(sm);
1453 }
1454
1455
1456 /**
1457  * eap_peer_sm_step - Step EAP peer state machine
1458  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
1459  * Returns: 1 if EAP state was changed or 0 if not
1460  *
1461  * This function advances EAP state machine to a new state to match with the
1462  * current variables. This should be called whenever variables used by the EAP
1463  * state machine have changed.
1464  */
1465 int eap_peer_sm_step(struct eap_sm *sm)
1466 {
1467         int res = 0;
1468         do {
1469                 sm->changed = FALSE;
1470                 SM_STEP_RUN(EAP);
1471                 if (sm->changed)
1472                         res = 1;
1473         } while (sm->changed);
1474         return res;
1475 }
1476
1477
1478 /**
1479  * eap_sm_abort - Abort EAP authentication
1480  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
1481  *
1482  * Release system resources that have been allocated for the authentication
1483  * session without fully deinitializing the EAP state machine.
1484  */
1485 void eap_sm_abort(struct eap_sm *sm)
1486 {
1487         wpabuf_free(sm->lastRespData);
1488         sm->lastRespData = NULL;
1489         wpabuf_free(sm->eapRespData);
1490         sm->eapRespData = NULL;
1491         os_free(sm->eapKeyData);
1492         sm->eapKeyData = NULL;
1493         os_free(sm->eapSessionId);
1494         sm->eapSessionId = NULL;
1495
1496         /* This is not clearly specified in the EAP statemachines draft, but
1497          * it seems necessary to make sure that some of the EAPOL variables get
1498          * cleared for the next authentication. */
1499         eapol_set_bool(sm, EAPOL_eapSuccess, FALSE);
1500 }
1501
1502
1503 #ifdef CONFIG_CTRL_IFACE
1504 static const char * eap_sm_state_txt(int state)
1505 {
1506         switch (state) {
1507         case EAP_INITIALIZE:
1508                 return "INITIALIZE";
1509         case EAP_DISABLED:
1510                 return "DISABLED";
1511         case EAP_IDLE:
1512                 return "IDLE";
1513         case EAP_RECEIVED:
1514                 return "RECEIVED";
1515         case EAP_GET_METHOD:
1516                 return "GET_METHOD";
1517         case EAP_METHOD:
1518                 return "METHOD";
1519         case EAP_SEND_RESPONSE:
1520                 return "SEND_RESPONSE";
1521         case EAP_DISCARD:
1522                 return "DISCARD";
1523         case EAP_IDENTITY:
1524                 return "IDENTITY";
1525         case EAP_NOTIFICATION:
1526                 return "NOTIFICATION";
1527         case EAP_RETRANSMIT:
1528                 return "RETRANSMIT";
1529         case EAP_SUCCESS:
1530                 return "SUCCESS";
1531         case EAP_FAILURE:
1532                 return "FAILURE";
1533         default:
1534                 return "UNKNOWN";
1535         }
1536 }
1537 #endif /* CONFIG_CTRL_IFACE */
1538
1539
1540 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
1541 static const char * eap_sm_method_state_txt(EapMethodState state)
1542 {
1543         switch (state) {
1544         case METHOD_NONE:
1545                 return "NONE";
1546         case METHOD_INIT:
1547                 return "INIT";
1548         case METHOD_CONT:
1549                 return "CONT";
1550         case METHOD_MAY_CONT:
1551                 return "MAY_CONT";
1552         case METHOD_DONE:
1553                 return "DONE";
1554         default:
1555                 return "UNKNOWN";
1556         }
1557 }
1558
1559
1560 static const char * eap_sm_decision_txt(EapDecision decision)
1561 {
1562         switch (decision) {
1563         case DECISION_FAIL:
1564                 return "FAIL";
1565         case DECISION_COND_SUCC:
1566                 return "COND_SUCC";
1567         case DECISION_UNCOND_SUCC:
1568                 return "UNCOND_SUCC";
1569         default:
1570                 return "UNKNOWN";
1571         }
1572 }
1573 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
1574
1575
1576 #ifdef CONFIG_CTRL_IFACE
1577
1578 /**
1579  * eap_sm_get_status - Get EAP state machine status
1580  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
1581  * @buf: Buffer for status information
1582  * @buflen: Maximum buffer length
1583  * @verbose: Whether to include verbose status information
1584  * Returns: Number of bytes written to buf.
1585  *
1586  * Query EAP state machine for status information. This function fills in a
1587  * text area with current status information from the EAPOL state machine. If
1588  * the buffer (buf) is not large enough, status information will be truncated
1589  * to fit the buffer.
1590  */
1591 int eap_sm_get_status(struct eap_sm *sm, char *buf, size_t buflen, int verbose)
1592 {
1593         int len, ret;
1594
1595         if (sm == NULL)
1596                 return 0;
1597
1598         len = os_snprintf(buf, buflen,
1599                           "EAP state=%s\n",
1600                           eap_sm_state_txt(sm->EAP_state));
1601         if (len < 0 || (size_t) len >= buflen)
1602                 return 0;
1603
1604         if (sm->selectedMethod != EAP_TYPE_NONE) {
1605                 const char *name;
1606                 if (sm->m) {
1607                         name = sm->m->name;
1608                 } else {
1609                         const struct eap_method *m =
1610                                 eap_peer_get_eap_method(EAP_VENDOR_IETF,
1611                                                         sm->selectedMethod);
1612                         if (m)
1613                                 name = m->name;
1614                         else
1615                                 name = "?";
1616                 }
1617                 ret = os_snprintf(buf + len, buflen - len,
1618                                   "selectedMethod=%d (EAP-%s)\n",
1619                                   sm->selectedMethod, name);
1620                 if (ret < 0 || (size_t) ret >= buflen - len)
1621                         return len;
1622                 len += ret;
1623
1624                 if (sm->m && sm->m->get_status) {
1625                         len += sm->m->get_status(sm, sm->eap_method_priv,
1626                                                  buf + len, buflen - len,
1627                                                  verbose);
1628                 }
1629         }
1630
1631         if (verbose) {
1632                 ret = os_snprintf(buf + len, buflen - len,
1633                                   "reqMethod=%d\n"
1634                                   "methodState=%s\n"
1635                                   "decision=%s\n"
1636                                   "ClientTimeout=%d\n",
1637                                   sm->reqMethod,
1638                                   eap_sm_method_state_txt(sm->methodState),
1639                                   eap_sm_decision_txt(sm->decision),
1640                                   sm->ClientTimeout);
1641                 if (ret < 0 || (size_t) ret >= buflen - len)
1642                         return len;
1643                 len += ret;
1644         }
1645
1646         return len;
1647 }
1648 #endif /* CONFIG_CTRL_IFACE */
1649
1650
1651 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
1652 static void eap_sm_request(struct eap_sm *sm, enum wpa_ctrl_req_type field,
1653                            const char *msg, size_t msglen)
1654 {
1655         struct eap_peer_config *config;
1656         const char *txt = NULL;
1657         char *tmp;
1658
1659         if (sm == NULL)
1660                 return;
1661         config = eap_get_config(sm);
1662         if (config == NULL)
1663                 return;
1664
1665         switch (field) {
1666         case WPA_CTRL_REQ_EAP_IDENTITY:
1667                 config->pending_req_identity++;
1668                 break;
1669         case WPA_CTRL_REQ_EAP_PASSWORD:
1670                 config->pending_req_password++;
1671                 break;
1672         case WPA_CTRL_REQ_EAP_NEW_PASSWORD:
1673                 config->pending_req_new_password++;
1674                 break;
1675         case WPA_CTRL_REQ_EAP_PIN:
1676                 config->pending_req_pin++;
1677                 break;
1678         case WPA_CTRL_REQ_EAP_OTP:
1679                 if (msg) {
1680                         tmp = os_malloc(msglen + 3);
1681                         if (tmp == NULL)
1682                                 return;
1683                         tmp[0] = '[';
1684                         os_memcpy(tmp + 1, msg, msglen);
1685                         tmp[msglen + 1] = ']';
1686                         tmp[msglen + 2] = '\0';
1687                         txt = tmp;
1688                         os_free(config->pending_req_otp);
1689                         config->pending_req_otp = tmp;
1690                         config->pending_req_otp_len = msglen + 3;
1691                 } else {
1692                         if (config->pending_req_otp == NULL)
1693                                 return;
1694                         txt = config->pending_req_otp;
1695                 }
1696                 break;
1697         case WPA_CTRL_REQ_EAP_PASSPHRASE:
1698                 config->pending_req_passphrase++;
1699                 break;
1700         case WPA_CTRL_REQ_SIM:
1701                 txt = msg;
1702                 break;
1703         default:
1704                 return;
1705         }
1706
1707         if (sm->eapol_cb->eap_param_needed)
1708                 sm->eapol_cb->eap_param_needed(sm->eapol_ctx, field, txt);
1709 }
1710 #else /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
1711 #define eap_sm_request(sm, type, msg, msglen) do { } while (0)
1712 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
1713
1714 const char * eap_sm_get_method_name(struct eap_sm *sm)
1715 {
1716         if (sm->m == NULL)
1717                 return "UNKNOWN";
1718         return sm->m->name;
1719 }
1720
1721
1722 /**
1723  * eap_sm_request_identity - Request identity from user (ctrl_iface)
1724  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
1725  *
1726  * EAP methods can call this function to request identity information for the
1727  * current network. This is normally called when the identity is not included
1728  * in the network configuration. The request will be sent to monitor programs
1729  * through the control interface.
1730  */
1731 void eap_sm_request_identity(struct eap_sm *sm)
1732 {
1733         eap_sm_request(sm, WPA_CTRL_REQ_EAP_IDENTITY, NULL, 0);
1734 }
1735
1736
1737 /**
1738  * eap_sm_request_password - Request password from user (ctrl_iface)
1739  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
1740  *
1741  * EAP methods can call this function to request password information for the
1742  * current network. This is normally called when the password is not included
1743  * in the network configuration. The request will be sent to monitor programs
1744  * through the control interface.
1745  */
1746 void eap_sm_request_password(struct eap_sm *sm)
1747 {
1748         eap_sm_request(sm, WPA_CTRL_REQ_EAP_PASSWORD, NULL, 0);
1749 }
1750
1751
1752 /**
1753  * eap_sm_request_new_password - Request new password from user (ctrl_iface)
1754  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
1755  *
1756  * EAP methods can call this function to request new password information for
1757  * the current network. This is normally called when the EAP method indicates
1758  * that the current password has expired and password change is required. The
1759  * request will be sent to monitor programs through the control interface.
1760  */
1761 void eap_sm_request_new_password(struct eap_sm *sm)
1762 {
1763         eap_sm_request(sm, WPA_CTRL_REQ_EAP_NEW_PASSWORD, NULL, 0);
1764 }
1765
1766
1767 /**
1768  * eap_sm_request_pin - Request SIM or smart card PIN from user (ctrl_iface)
1769  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
1770  *
1771  * EAP methods can call this function to request SIM or smart card PIN
1772  * information for the current network. This is normally called when the PIN is
1773  * not included in the network configuration. The request will be sent to
1774  * monitor programs through the control interface.
1775  */
1776 void eap_sm_request_pin(struct eap_sm *sm)
1777 {
1778         eap_sm_request(sm, WPA_CTRL_REQ_EAP_PIN, NULL, 0);
1779 }
1780
1781
1782 /**
1783  * eap_sm_request_otp - Request one time password from user (ctrl_iface)
1784  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
1785  * @msg: Message to be displayed to the user when asking for OTP
1786  * @msg_len: Length of the user displayable message
1787  *
1788  * EAP methods can call this function to request open time password (OTP) for
1789  * the current network. The request will be sent to monitor programs through
1790  * the control interface.
1791  */
1792 void eap_sm_request_otp(struct eap_sm *sm, const char *msg, size_t msg_len)
1793 {
1794         eap_sm_request(sm, WPA_CTRL_REQ_EAP_OTP, msg, msg_len);
1795 }
1796
1797
1798 /**
1799  * eap_sm_request_passphrase - Request passphrase from user (ctrl_iface)
1800  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
1801  *
1802  * EAP methods can call this function to request passphrase for a private key
1803  * for the current network. This is normally called when the passphrase is not
1804  * included in the network configuration. The request will be sent to monitor
1805  * programs through the control interface.
1806  */
1807 void eap_sm_request_passphrase(struct eap_sm *sm)
1808 {
1809         eap_sm_request(sm, WPA_CTRL_REQ_EAP_PASSPHRASE, NULL, 0);
1810 }
1811
1812
1813 /**
1814  * eap_sm_request_sim - Request external SIM processing
1815  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
1816  * @req: EAP method specific request
1817  */
1818 void eap_sm_request_sim(struct eap_sm *sm, const char *req)
1819 {
1820         eap_sm_request(sm, WPA_CTRL_REQ_SIM, req, os_strlen(req));
1821 }
1822
1823
1824 /**
1825  * eap_sm_notify_ctrl_attached - Notification of attached monitor
1826  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
1827  *
1828  * Notify EAP state machines that a monitor was attached to the control
1829  * interface to trigger re-sending of pending requests for user input.
1830  */
1831 void eap_sm_notify_ctrl_attached(struct eap_sm *sm)
1832 {
1833         struct eap_peer_config *config = eap_get_config(sm);
1834
1835         if (config == NULL)
1836                 return;
1837
1838         /* Re-send any pending requests for user data since a new control
1839          * interface was added. This handles cases where the EAP authentication
1840          * starts immediately after system startup when the user interface is
1841          * not yet running. */
1842         if (config->pending_req_identity)
1843                 eap_sm_request_identity(sm);
1844         if (config->pending_req_password)
1845                 eap_sm_request_password(sm);
1846         if (config->pending_req_new_password)
1847                 eap_sm_request_new_password(sm);
1848         if (config->pending_req_otp)
1849                 eap_sm_request_otp(sm, NULL, 0);
1850         if (config->pending_req_pin)
1851                 eap_sm_request_pin(sm);
1852         if (config->pending_req_passphrase)
1853                 eap_sm_request_passphrase(sm);
1854 }
1855
1856
1857 static int eap_allowed_phase2_type(int vendor, int type)
1858 {
1859         if (vendor != EAP_VENDOR_IETF)
1860                 return 0;
1861         return type != EAP_TYPE_PEAP && type != EAP_TYPE_TTLS &&
1862                 type != EAP_TYPE_FAST;
1863 }
1864
1865
1866 /**
1867  * eap_get_phase2_type - Get EAP type for the given EAP phase 2 method name
1868  * @name: EAP method name, e.g., MD5
1869  * @vendor: Buffer for returning EAP Vendor-Id
1870  * Returns: EAP method type or %EAP_TYPE_NONE if not found
1871  *
1872  * This function maps EAP type names into EAP type numbers that are allowed for
1873  * Phase 2, i.e., for tunneled authentication. Phase 2 is used, e.g., with
1874  * EAP-PEAP, EAP-TTLS, and EAP-FAST.
1875  */
1876 u32 eap_get_phase2_type(const char *name, int *vendor)
1877 {
1878         int v;
1879         u8 type = eap_peer_get_type(name, &v);
1880         if (eap_allowed_phase2_type(v, type)) {
1881                 *vendor = v;
1882                 return type;
1883         }
1884         *vendor = EAP_VENDOR_IETF;
1885         return EAP_TYPE_NONE;
1886 }
1887
1888
1889 /**
1890  * eap_get_phase2_types - Get list of allowed EAP phase 2 types
1891  * @config: Pointer to a network configuration
1892  * @count: Pointer to a variable to be filled with number of returned EAP types
1893  * Returns: Pointer to allocated type list or %NULL on failure
1894  *
1895  * This function generates an array of allowed EAP phase 2 (tunneled) types for
1896  * the given network configuration.
1897  */
1898 struct eap_method_type * eap_get_phase2_types(struct eap_peer_config *config,
1899                                               size_t *count)
1900 {
1901         struct eap_method_type *buf;
1902         u32 method;
1903         int vendor;
1904         size_t mcount;
1905         const struct eap_method *methods, *m;
1906
1907         methods = eap_peer_get_methods(&mcount);
1908         if (methods == NULL)
1909                 return NULL;
1910         *count = 0;
1911         buf = os_malloc(mcount * sizeof(struct eap_method_type));
1912         if (buf == NULL)
1913                 return NULL;
1914
1915         for (m = methods; m; m = m->next) {
1916                 vendor = m->vendor;
1917                 method = m->method;
1918                 if (eap_allowed_phase2_type(vendor, method)) {
1919                         if (vendor == EAP_VENDOR_IETF &&
1920                             method == EAP_TYPE_TLS && config &&
1921                             config->private_key2 == NULL)
1922                                 continue;
1923                         buf[*count].vendor = vendor;
1924                         buf[*count].method = method;
1925                         (*count)++;
1926                 }
1927         }
1928
1929         return buf;
1930 }
1931
1932
1933 /**
1934  * eap_set_fast_reauth - Update fast_reauth setting
1935  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
1936  * @enabled: 1 = Fast reauthentication is enabled, 0 = Disabled
1937  */
1938 void eap_set_fast_reauth(struct eap_sm *sm, int enabled)
1939 {
1940         sm->fast_reauth = enabled;
1941 }
1942
1943
1944 /**
1945  * eap_set_workaround - Update EAP workarounds setting
1946  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
1947  * @workaround: 1 = Enable EAP workarounds, 0 = Disable EAP workarounds
1948  */
1949 void eap_set_workaround(struct eap_sm *sm, unsigned int workaround)
1950 {
1951         sm->workaround = workaround;
1952 }
1953
1954
1955 /**
1956  * eap_get_config - Get current network configuration
1957  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
1958  * Returns: Pointer to the current network configuration or %NULL if not found
1959  *
1960  * EAP peer methods should avoid using this function if they can use other
1961  * access functions, like eap_get_config_identity() and
1962  * eap_get_config_password(), that do not require direct access to
1963  * struct eap_peer_config.
1964  */
1965 struct eap_peer_config * eap_get_config(struct eap_sm *sm)
1966 {
1967         return sm->eapol_cb->get_config(sm->eapol_ctx);
1968 }
1969
1970
1971 /**
1972  * eap_get_config_identity - Get identity from the network configuration
1973  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
1974  * @len: Buffer for the length of the identity
1975  * Returns: Pointer to the identity or %NULL if not found
1976  */
1977 const u8 * eap_get_config_identity(struct eap_sm *sm, size_t *len)
1978 {
1979         struct eap_peer_config *config = eap_get_config(sm);
1980         if (config == NULL)
1981                 return NULL;
1982         *len = config->identity_len;
1983         return config->identity;
1984 }
1985
1986
1987 static int eap_get_ext_password(struct eap_sm *sm,
1988                                 struct eap_peer_config *config)
1989 {
1990         char *name;
1991
1992         if (config->password == NULL)
1993                 return -1;
1994
1995         name = os_zalloc(config->password_len + 1);
1996         if (name == NULL)
1997                 return -1;
1998         os_memcpy(name, config->password, config->password_len);
1999
2000         ext_password_free(sm->ext_pw_buf);
2001         sm->ext_pw_buf = ext_password_get(sm->ext_pw, name);
2002         os_free(name);
2003
2004         return sm->ext_pw_buf == NULL ? -1 : 0;
2005 }
2006
2007
2008 /**
2009  * eap_get_config_password - Get password from the network configuration
2010  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2011  * @len: Buffer for the length of the password
2012  * Returns: Pointer to the password or %NULL if not found
2013  */
2014 const u8 * eap_get_config_password(struct eap_sm *sm, size_t *len)
2015 {
2016         struct eap_peer_config *config = eap_get_config(sm);
2017         if (config == NULL)
2018                 return NULL;
2019
2020         if (config->flags & EAP_CONFIG_FLAGS_EXT_PASSWORD) {
2021                 if (eap_get_ext_password(sm, config) < 0)
2022                         return NULL;
2023                 *len = wpabuf_len(sm->ext_pw_buf);
2024                 return wpabuf_head(sm->ext_pw_buf);
2025         }
2026
2027         *len = config->password_len;
2028         return config->password;
2029 }
2030
2031
2032 /**
2033  * eap_get_config_password2 - Get password from the network configuration
2034  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2035  * @len: Buffer for the length of the password
2036  * @hash: Buffer for returning whether the password is stored as a
2037  * NtPasswordHash instead of plaintext password; can be %NULL if this
2038  * information is not needed
2039  * Returns: Pointer to the password or %NULL if not found
2040  */
2041 const u8 * eap_get_config_password2(struct eap_sm *sm, size_t *len, int *hash)
2042 {
2043         struct eap_peer_config *config = eap_get_config(sm);
2044         if (config == NULL)
2045                 return NULL;
2046
2047         if (config->flags & EAP_CONFIG_FLAGS_EXT_PASSWORD) {
2048                 if (eap_get_ext_password(sm, config) < 0)
2049                         return NULL;
2050                 if (hash)
2051                         *hash = 0;
2052                 *len = wpabuf_len(sm->ext_pw_buf);
2053                 return wpabuf_head(sm->ext_pw_buf);
2054         }
2055
2056         *len = config->password_len;
2057         if (hash)
2058                 *hash = !!(config->flags & EAP_CONFIG_FLAGS_PASSWORD_NTHASH);
2059         return config->password;
2060 }
2061
2062
2063 /**
2064  * eap_get_config_new_password - Get new password from network configuration
2065  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2066  * @len: Buffer for the length of the new password
2067  * Returns: Pointer to the new password or %NULL if not found
2068  */
2069 const u8 * eap_get_config_new_password(struct eap_sm *sm, size_t *len)
2070 {
2071         struct eap_peer_config *config = eap_get_config(sm);
2072         if (config == NULL)
2073                 return NULL;
2074         *len = config->new_password_len;
2075         return config->new_password;
2076 }
2077
2078
2079 /**
2080  * eap_get_config_otp - Get one-time password from the network configuration
2081  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2082  * @len: Buffer for the length of the one-time password
2083  * Returns: Pointer to the one-time password or %NULL if not found
2084  */
2085 const u8 * eap_get_config_otp(struct eap_sm *sm, size_t *len)
2086 {
2087         struct eap_peer_config *config = eap_get_config(sm);
2088         if (config == NULL)
2089                 return NULL;
2090         *len = config->otp_len;
2091         return config->otp;
2092 }
2093
2094
2095 /**
2096  * eap_clear_config_otp - Clear used one-time password
2097  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2098  *
2099  * This function clears a used one-time password (OTP) from the current network
2100  * configuration. This should be called when the OTP has been used and is not
2101  * needed anymore.
2102  */
2103 void eap_clear_config_otp(struct eap_sm *sm)
2104 {
2105         struct eap_peer_config *config = eap_get_config(sm);
2106         if (config == NULL)
2107                 return;
2108         os_memset(config->otp, 0, config->otp_len);
2109         os_free(config->otp);
2110         config->otp = NULL;
2111         config->otp_len = 0;
2112 }
2113
2114
2115 /**
2116  * eap_get_config_phase1 - Get phase1 data from the network configuration
2117  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2118  * Returns: Pointer to the phase1 data or %NULL if not found
2119  */
2120 const char * eap_get_config_phase1(struct eap_sm *sm)
2121 {
2122         struct eap_peer_config *config = eap_get_config(sm);
2123         if (config == NULL)
2124                 return NULL;
2125         return config->phase1;
2126 }
2127
2128
2129 /**
2130  * eap_get_config_phase2 - Get phase2 data from the network configuration
2131  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2132  * Returns: Pointer to the phase1 data or %NULL if not found
2133  */
2134 const char * eap_get_config_phase2(struct eap_sm *sm)
2135 {
2136         struct eap_peer_config *config = eap_get_config(sm);
2137         if (config == NULL)
2138                 return NULL;
2139         return config->phase2;
2140 }
2141
2142
2143 int eap_get_config_fragment_size(struct eap_sm *sm)
2144 {
2145         struct eap_peer_config *config = eap_get_config(sm);
2146         if (config == NULL)
2147                 return -1;
2148         return config->fragment_size;
2149 }
2150
2151
2152 /**
2153  * eap_key_available - Get key availability (eapKeyAvailable variable)
2154  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2155  * Returns: 1 if EAP keying material is available, 0 if not
2156  */
2157 int eap_key_available(struct eap_sm *sm)
2158 {
2159         return sm ? sm->eapKeyAvailable : 0;
2160 }
2161
2162
2163 /**
2164  * eap_notify_success - Notify EAP state machine about external success trigger
2165  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2166  *
2167  * This function is called when external event, e.g., successful completion of
2168  * WPA-PSK key handshake, is indicating that EAP state machine should move to
2169  * success state. This is mainly used with security modes that do not use EAP
2170  * state machine (e.g., WPA-PSK).
2171  */
2172 void eap_notify_success(struct eap_sm *sm)
2173 {
2174         if (sm) {
2175                 sm->decision = DECISION_COND_SUCC;
2176                 sm->EAP_state = EAP_SUCCESS;
2177         }
2178 }
2179
2180
2181 /**
2182  * eap_notify_lower_layer_success - Notification of lower layer success
2183  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2184  *
2185  * Notify EAP state machines that a lower layer has detected a successful
2186  * authentication. This is used to recover from dropped EAP-Success messages.
2187  */
2188 void eap_notify_lower_layer_success(struct eap_sm *sm)
2189 {
2190         if (sm == NULL)
2191                 return;
2192
2193         if (eapol_get_bool(sm, EAPOL_eapSuccess) ||
2194             sm->decision == DECISION_FAIL ||
2195             (sm->methodState != METHOD_MAY_CONT &&
2196              sm->methodState != METHOD_DONE))
2197                 return;
2198
2199         if (sm->eapKeyData != NULL)
2200                 sm->eapKeyAvailable = TRUE;
2201         eapol_set_bool(sm, EAPOL_eapSuccess, TRUE);
2202         wpa_msg(sm->msg_ctx, MSG_INFO, WPA_EVENT_EAP_SUCCESS
2203                 "EAP authentication completed successfully (based on lower "
2204                 "layer success)");
2205 }
2206
2207
2208 /**
2209  * eap_get_eapSessionId - Get Session-Id from EAP state machine
2210  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2211  * @len: Pointer to variable that will be set to number of bytes in the session
2212  * Returns: Pointer to the EAP Session-Id or %NULL on failure
2213  *
2214  * Fetch EAP Session-Id from the EAP state machine. The Session-Id is available
2215  * only after a successful authentication. EAP state machine continues to manage
2216  * the Session-Id and the caller must not change or free the returned data.
2217  */
2218 const u8 * eap_get_eapSessionId(struct eap_sm *sm, size_t *len)
2219 {
2220         if (sm == NULL || sm->eapSessionId == NULL) {
2221                 *len = 0;
2222                 return NULL;
2223         }
2224
2225         *len = sm->eapSessionIdLen;
2226         return sm->eapSessionId;
2227 }
2228
2229
2230 /**
2231  * eap_get_eapKeyData - Get master session key (MSK) from EAP state machine
2232  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2233  * @len: Pointer to variable that will be set to number of bytes in the key
2234  * Returns: Pointer to the EAP keying data or %NULL on failure
2235  *
2236  * Fetch EAP keying material (MSK, eapKeyData) from the EAP state machine. The
2237  * key is available only after a successful authentication. EAP state machine
2238  * continues to manage the key data and the caller must not change or free the
2239  * returned data.
2240  */
2241 const u8 * eap_get_eapKeyData(struct eap_sm *sm, size_t *len)
2242 {
2243         if (sm == NULL || sm->eapKeyData == NULL) {
2244                 *len = 0;
2245                 return NULL;
2246         }
2247
2248         *len = sm->eapKeyDataLen;
2249         return sm->eapKeyData;
2250 }
2251
2252
2253 /**
2254  * eap_get_eapKeyData - Get EAP response data
2255  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2256  * Returns: Pointer to the EAP response (eapRespData) or %NULL on failure
2257  *
2258  * Fetch EAP response (eapRespData) from the EAP state machine. This data is
2259  * available when EAP state machine has processed an incoming EAP request. The
2260  * EAP state machine does not maintain a reference to the response after this
2261  * function is called and the caller is responsible for freeing the data.
2262  */
2263 struct wpabuf * eap_get_eapRespData(struct eap_sm *sm)
2264 {
2265         struct wpabuf *resp;
2266
2267         if (sm == NULL || sm->eapRespData == NULL)
2268                 return NULL;
2269
2270         resp = sm->eapRespData;
2271         sm->eapRespData = NULL;
2272
2273         return resp;
2274 }
2275
2276
2277 /**
2278  * eap_sm_register_scard_ctx - Notification of smart card context
2279  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2280  * @ctx: Context data for smart card operations
2281  *
2282  * Notify EAP state machines of context data for smart card operations. This
2283  * context data will be used as a parameter for scard_*() functions.
2284  */
2285 void eap_register_scard_ctx(struct eap_sm *sm, void *ctx)
2286 {
2287         if (sm)
2288                 sm->scard_ctx = ctx;
2289 }
2290
2291
2292 /**
2293  * eap_set_config_blob - Set or add a named configuration blob
2294  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2295  * @blob: New value for the blob
2296  *
2297  * Adds a new configuration blob or replaces the current value of an existing
2298  * blob.
2299  */
2300 void eap_set_config_blob(struct eap_sm *sm, struct wpa_config_blob *blob)
2301 {
2302 #ifndef CONFIG_NO_CONFIG_BLOBS
2303         sm->eapol_cb->set_config_blob(sm->eapol_ctx, blob);
2304 #endif /* CONFIG_NO_CONFIG_BLOBS */
2305 }
2306
2307
2308 /**
2309  * eap_get_config_blob - Get a named configuration blob
2310  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2311  * @name: Name of the blob
2312  * Returns: Pointer to blob data or %NULL if not found
2313  */
2314 const struct wpa_config_blob * eap_get_config_blob(struct eap_sm *sm,
2315                                                    const char *name)
2316 {
2317 #ifndef CONFIG_NO_CONFIG_BLOBS
2318         return sm->eapol_cb->get_config_blob(sm->eapol_ctx, name);
2319 #else /* CONFIG_NO_CONFIG_BLOBS */
2320         return NULL;
2321 #endif /* CONFIG_NO_CONFIG_BLOBS */
2322 }
2323
2324
2325 /**
2326  * eap_set_force_disabled - Set force_disabled flag
2327  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2328  * @disabled: 1 = EAP disabled, 0 = EAP enabled
2329  *
2330  * This function is used to force EAP state machine to be disabled when it is
2331  * not in use (e.g., with WPA-PSK or plaintext connections).
2332  */
2333 void eap_set_force_disabled(struct eap_sm *sm, int disabled)
2334 {
2335         sm->force_disabled = disabled;
2336 }
2337
2338
2339 /**
2340  * eap_set_external_sim - Set external_sim flag
2341  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2342  * @external_sim: Whether external SIM/USIM processing is used
2343  */
2344 void eap_set_external_sim(struct eap_sm *sm, int external_sim)
2345 {
2346         sm->external_sim = external_sim;
2347 }
2348
2349
2350  /**
2351  * eap_notify_pending - Notify that EAP method is ready to re-process a request
2352  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2353  *
2354  * An EAP method can perform a pending operation (e.g., to get a response from
2355  * an external process). Once the response is available, this function can be
2356  * used to request EAPOL state machine to retry delivering the previously
2357  * received (and still unanswered) EAP request to EAP state machine.
2358  */
2359 void eap_notify_pending(struct eap_sm *sm)
2360 {
2361         sm->eapol_cb->notify_pending(sm->eapol_ctx);
2362 }
2363
2364
2365 /**
2366  * eap_invalidate_cached_session - Mark cached session data invalid
2367  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2368  */
2369 void eap_invalidate_cached_session(struct eap_sm *sm)
2370 {
2371         if (sm)
2372                 eap_deinit_prev_method(sm, "invalidate");
2373 }
2374
2375
2376 int eap_is_wps_pbc_enrollee(struct eap_peer_config *conf)
2377 {
2378         if (conf->identity_len != WSC_ID_ENROLLEE_LEN ||
2379             os_memcmp(conf->identity, WSC_ID_ENROLLEE, WSC_ID_ENROLLEE_LEN))
2380                 return 0; /* Not a WPS Enrollee */
2381
2382         if (conf->phase1 == NULL || os_strstr(conf->phase1, "pbc=1") == NULL)
2383                 return 0; /* Not using PBC */
2384
2385         return 1;
2386 }
2387
2388
2389 int eap_is_wps_pin_enrollee(struct eap_peer_config *conf)
2390 {
2391         if (conf->identity_len != WSC_ID_ENROLLEE_LEN ||
2392             os_memcmp(conf->identity, WSC_ID_ENROLLEE, WSC_ID_ENROLLEE_LEN))
2393                 return 0; /* Not a WPS Enrollee */
2394
2395         if (conf->phase1 == NULL || os_strstr(conf->phase1, "pin=") == NULL)
2396                 return 0; /* Not using PIN */
2397
2398         return 1;
2399 }
2400
2401
2402 void eap_sm_set_ext_pw_ctx(struct eap_sm *sm, struct ext_password_data *ext)
2403 {
2404         ext_password_free(sm->ext_pw_buf);
2405         sm->ext_pw_buf = NULL;
2406         sm->ext_pw = ext;
2407 }
2408
2409
2410 /**
2411  * eap_set_anon_id - Set or add anonymous identity
2412  * @sm: Pointer to EAP state machine allocated with eap_peer_sm_init()
2413  * @id: Anonymous identity (e.g., EAP-SIM pseudonym) or %NULL to clear
2414  * @len: Length of anonymous identity in octets
2415  */
2416 void eap_set_anon_id(struct eap_sm *sm, const u8 *id, size_t len)
2417 {
2418         if (sm->eapol_cb->set_anon_id)
2419                 sm->eapol_cb->set_anon_id(sm->eapol_ctx, id, len);
2420 }
2421
2422
2423 int eap_peer_was_failure_expected(struct eap_sm *sm)
2424 {
2425         return sm->expected_failure;
2426 }