Lines Matching refs:sm
40 static bool eap_sm_allowMethod(struct eap_sm *sm, int vendor,
42 static struct wpabuf * eap_sm_buildNak(struct eap_sm *sm, int id);
43 static void eap_sm_processIdentity(struct eap_sm *sm,
45 static void eap_sm_processNotify(struct eap_sm *sm, const struct wpabuf *req);
47 static void eap_sm_parseEapReq(struct eap_sm *sm, const struct wpabuf *req);
52 static void eap_sm_request(struct eap_sm *sm, enum wpa_ctrl_req_type field,
57 static bool eapol_get_bool(struct eap_sm *sm, enum eapol_bool_var var) in eapol_get_bool() argument
59 return sm->eapol_cb->get_bool(sm->eapol_ctx, var); in eapol_get_bool()
63 static void eapol_set_bool(struct eap_sm *sm, enum eapol_bool_var var, in eapol_set_bool() argument
66 sm->eapol_cb->set_bool(sm->eapol_ctx, var, value); in eapol_set_bool()
70 static unsigned int eapol_get_int(struct eap_sm *sm, enum eapol_int_var var) in eapol_get_int() argument
72 return sm->eapol_cb->get_int(sm->eapol_ctx, var); in eapol_get_int()
76 static void eapol_set_int(struct eap_sm *sm, enum eapol_int_var var, in eapol_set_int() argument
79 sm->eapol_cb->set_int(sm->eapol_ctx, var, value); in eapol_set_int()
83 static struct wpabuf * eapol_get_eapReqData(struct eap_sm *sm) in eapol_get_eapReqData() argument
85 return sm->eapol_cb->get_eapReqData(sm->eapol_ctx); in eapol_get_eapReqData()
89 static void eap_notify_status(struct eap_sm *sm, const char *status, in eap_notify_status() argument
94 if (sm->eapol_cb->notify_status) in eap_notify_status()
95 sm->eapol_cb->notify_status(sm->eapol_ctx, status, parameter); in eap_notify_status()
99 static void eap_report_error(struct eap_sm *sm, int error_code) in eap_report_error() argument
102 if (sm->eapol_cb->notify_eap_error) in eap_report_error()
103 sm->eapol_cb->notify_eap_error(sm->eapol_ctx, error_code); in eap_report_error()
107 static void eap_sm_free_key(struct eap_sm *sm) in eap_sm_free_key() argument
109 if (sm->eapKeyData) { in eap_sm_free_key()
110 bin_clear_free(sm->eapKeyData, sm->eapKeyDataLen); in eap_sm_free_key()
111 sm->eapKeyData = NULL; in eap_sm_free_key()
116 static void eap_deinit_prev_method(struct eap_sm *sm, const char *txt) in eap_deinit_prev_method() argument
118 ext_password_free(sm->ext_pw_buf); in eap_deinit_prev_method()
119 sm->ext_pw_buf = NULL; in eap_deinit_prev_method()
121 if (sm->m == NULL || sm->eap_method_priv == NULL) in eap_deinit_prev_method()
125 "(%d, %s) at %s", sm->selectedMethod, sm->m->name, txt); in eap_deinit_prev_method()
126 sm->m->deinit(sm, sm->eap_method_priv); in eap_deinit_prev_method()
127 sm->eap_method_priv = NULL; in eap_deinit_prev_method()
128 sm->m = NULL; in eap_deinit_prev_method()
140 static int eap_config_allowed_method(struct eap_sm *sm, in eap_config_allowed_method() argument
167 int eap_allowed_method(struct eap_sm *sm, int vendor, u32 method) in eap_allowed_method() argument
169 return eap_config_allowed_method(sm, eap_get_config(sm), vendor, in eap_allowed_method()
175 static int eap_sm_append_3gpp_realm(struct eap_sm *sm, char *imsi, in eap_sm_append_3gpp_realm() argument
219 if (sm->fast_reauth && sm->m && sm->m->has_reauth_data && in SM_STATE()
220 sm->m->has_reauth_data(sm, sm->eap_method_priv) && in SM_STATE()
221 !sm->prev_failure && in SM_STATE()
222 sm->last_config == eap_get_config(sm)) { in SM_STATE()
225 sm->m->deinit_for_reauth(sm, sm->eap_method_priv); in SM_STATE()
227 sm->last_config = eap_get_config(sm); in SM_STATE()
228 eap_deinit_prev_method(sm, "INITIALIZE"); in SM_STATE()
230 sm->selectedMethod = EAP_TYPE_NONE; in SM_STATE()
231 sm->methodState = METHOD_NONE; in SM_STATE()
232 sm->allowNotifications = true; in SM_STATE()
233 sm->decision = DECISION_FAIL; in SM_STATE()
234 sm->ClientTimeout = EAP_CLIENT_TIMEOUT_DEFAULT; in SM_STATE()
235 eapol_set_int(sm, EAPOL_idleWhile, sm->ClientTimeout); in SM_STATE()
236 eapol_set_bool(sm, EAPOL_eapSuccess, false); in SM_STATE()
237 eapol_set_bool(sm, EAPOL_eapFail, false); in SM_STATE()
238 eap_sm_free_key(sm); in SM_STATE()
239 os_free(sm->eapSessionId); in SM_STATE()
240 sm->eapSessionId = NULL; in SM_STATE()
241 sm->eapKeyAvailable = false; in SM_STATE()
242 eapol_set_bool(sm, EAPOL_eapRestart, false); in SM_STATE()
243 sm->lastId = -1; /* new session - make sure this does not match with in SM_STATE()
253 eapol_set_bool(sm, EAPOL_eapResp, false); in SM_STATE()
254 eapol_set_bool(sm, EAPOL_eapNoResp, false); in SM_STATE()
262 sm->ignore = 0; in SM_STATE()
263 sm->num_rounds = 0; in SM_STATE()
264 sm->num_rounds_short = 0; in SM_STATE()
265 sm->prev_failure = 0; in SM_STATE()
266 sm->expected_failure = 0; in SM_STATE()
267 sm->reauthInit = false; in SM_STATE()
268 sm->erp_seq = (u32) -1; in SM_STATE()
269 sm->use_machine_cred = 0; in SM_STATE()
270 sm->eap_fast_mschapv2 = false; in SM_STATE()
282 sm->num_rounds = 0; in SM_STATE()
283 sm->num_rounds_short = 0; in SM_STATE()
289 eapol_set_int(sm, EAPOL_idleWhile, 0); in SM_STATE()
313 eapReqData = eapol_get_eapReqData(sm); in SM_STATE()
315 eap_sm_parseEapReq(sm, eapReqData); in SM_STATE()
316 sm->num_rounds++; in SM_STATE()
318 sm->num_rounds_short++; in SM_STATE()
320 sm->num_rounds_short = 0; in SM_STATE()
336 if (sm->reqMethod == EAP_TYPE_EXPANDED) in SM_STATE()
337 method = sm->reqVendorMethod; in SM_STATE()
339 method = sm->reqMethod; in SM_STATE()
341 eap_method = eap_peer_get_eap_method(sm->reqVendor, method); in SM_STATE()
343 if (!eap_sm_allowMethod(sm, sm->reqVendor, method)) { in SM_STATE()
345 sm->reqVendor, method); in SM_STATE()
346 wpa_msg(sm->msg_ctx, MSG_INFO, WPA_EVENT_EAP_PROPOSED_METHOD in SM_STATE()
348 sm->reqVendor, method); in SM_STATE()
349 eap_notify_status(sm, "refuse proposed method", in SM_STATE()
354 wpa_msg(sm->msg_ctx, MSG_INFO, WPA_EVENT_EAP_PROPOSED_METHOD in SM_STATE()
355 "vendor=%u method=%u", sm->reqVendor, method); in SM_STATE()
357 eap_notify_status(sm, "accept proposed method", in SM_STATE()
367 if (sm->fast_reauth && in SM_STATE()
368 sm->m && sm->m->vendor == sm->reqVendor && in SM_STATE()
369 sm->m->method == method && in SM_STATE()
370 sm->m->has_reauth_data && in SM_STATE()
371 sm->m->has_reauth_data(sm, sm->eap_method_priv)) { in SM_STATE()
376 eap_deinit_prev_method(sm, "GET_METHOD"); in SM_STATE()
380 sm->selectedMethod = sm->reqMethod; in SM_STATE()
381 if (sm->m == NULL) in SM_STATE()
382 sm->m = eap_method; in SM_STATE()
383 if (!sm->m) { in SM_STATE()
386 sm->reqVendor, method); in SM_STATE()
390 sm->ClientTimeout = EAP_CLIENT_TIMEOUT_DEFAULT; in SM_STATE()
394 sm->reqVendor, method, sm->m->name); in SM_STATE()
396 sm->eap_method_priv = sm->m->init_for_reauth( in SM_STATE()
397 sm, sm->eap_method_priv); in SM_STATE()
399 sm->waiting_ext_cert_check = 0; in SM_STATE()
400 sm->ext_cert_check = 0; in SM_STATE()
401 sm->eap_method_priv = sm->m->init(sm); in SM_STATE()
404 if (sm->eap_method_priv == NULL) { in SM_STATE()
405 struct eap_peer_config *config = eap_get_config(sm); in SM_STATE()
406 wpa_msg(sm->msg_ctx, MSG_INFO, in SM_STATE()
409 sm->reqVendor, method, sm->m->name); in SM_STATE()
410 sm->m = NULL; in SM_STATE()
411 sm->methodState = METHOD_NONE; in SM_STATE()
412 sm->selectedMethod = EAP_TYPE_NONE; in SM_STATE()
413 if (sm->reqMethod == EAP_TYPE_TLS && config && in SM_STATE()
429 sm->methodState = METHOD_INIT; in SM_STATE()
430 wpa_msg(sm->msg_ctx, MSG_INFO, WPA_EVENT_EAP_METHOD in SM_STATE()
432 sm->reqVendor, method, sm->m->name); in SM_STATE()
436 wpabuf_free(sm->eapRespData); in SM_STATE()
437 sm->eapRespData = NULL; in SM_STATE()
438 sm->eapRespData = eap_sm_buildNak(sm, sm->reqId); in SM_STATE()
444 static char * eap_get_realm(struct eap_sm *sm, struct eap_peer_config *config) in eap_get_realm() argument
490 sm->eapol_cb->get_imsi && in eap_get_realm()
491 (eap_config_allowed_method(sm, config, EAP_VENDOR_IETF, in eap_get_realm()
493 eap_config_allowed_method(sm, config, EAP_VENDOR_IETF, in eap_get_realm()
495 eap_config_allowed_method(sm, config, EAP_VENDOR_IETF, in eap_get_realm()
502 mnc_len = sm->eapol_cb->get_imsi(sm->eapol_ctx, config->sim_num, in eap_get_realm()
508 if (eap_sm_append_3gpp_realm(sm, imsi, sizeof(imsi), &imsi_len, in eap_get_realm()
527 static char * eap_home_realm(struct eap_sm *sm) in eap_home_realm() argument
529 return eap_get_realm(sm, eap_get_config(sm)); in eap_home_realm()
534 eap_erp_get_key(struct eap_sm *sm, const char *realm) in eap_erp_get_key() argument
538 dl_list_for_each(erp, &sm->erp_keys, struct eap_erp_key, list) { in eap_erp_get_key()
554 eap_erp_get_key_nai(struct eap_sm *sm, const char *nai) in eap_erp_get_key_nai() argument
558 dl_list_for_each(erp, &sm->erp_keys, struct eap_erp_key, list) { in eap_erp_get_key_nai()
574 static void eap_erp_remove_keys_realm(struct eap_sm *sm, const char *realm) in eap_erp_remove_keys_realm() argument
578 while ((erp = eap_erp_get_key(sm, realm)) != NULL) { in eap_erp_remove_keys_realm()
586 int eap_peer_update_erp_next_seq_num(struct eap_sm *sm, u16 next_seq_num) in eap_peer_update_erp_next_seq_num() argument
591 home_realm = eap_home_realm(sm); in eap_peer_update_erp_next_seq_num()
597 erp = eap_erp_get_key(sm, home_realm); in eap_peer_update_erp_next_seq_num()
620 int eap_peer_get_erp_info(struct eap_sm *sm, struct eap_peer_config *config, in eap_peer_get_erp_info() argument
631 home_realm = eap_get_realm(sm, config); in eap_peer_get_erp_info()
633 home_realm = eap_home_realm(sm); in eap_peer_get_erp_info()
639 erp = eap_erp_get_key(sm, home_realm); in eap_peer_get_erp_info()
671 void eap_peer_erp_free_keys(struct eap_sm *sm) in eap_peer_erp_free_keys() argument
676 dl_list_for_each_safe(erp, tmp, &sm->erp_keys, struct eap_erp_key, list) in eap_peer_erp_free_keys()
685 void eap_peer_erp_init(struct eap_sm *sm, u8 *ext_session_id, in eap_peer_erp_init() argument
701 realm = eap_home_realm(sm); in eap_peer_erp_init()
706 eap_erp_remove_keys_realm(sm, realm); in eap_peer_erp_init()
727 emsk = sm->m->get_emsk(sm, sm->eap_method_priv, &emsk_len); in eap_peer_erp_init()
742 session_id = sm->eapSessionId; in eap_peer_erp_init()
743 session_id_len = sm->eapSessionIdLen; in eap_peer_erp_init()
787 dl_list_add(&sm->erp_keys, &erp->list); in eap_peer_erp_init()
802 struct wpabuf * eap_peer_build_erp_reauth_start(struct eap_sm *sm, u8 eap_id) in eap_peer_build_erp_reauth_start() argument
809 realm = eap_home_realm(sm); in eap_peer_build_erp_reauth_start()
813 erp = eap_erp_get_key(sm, realm); in eap_peer_build_erp_reauth_start()
850 sm->erp_seq = erp->next_seq; in eap_peer_build_erp_reauth_start()
859 static int eap_peer_erp_reauth_start(struct eap_sm *sm, u8 eap_id) in eap_peer_erp_reauth_start() argument
863 msg = eap_peer_build_erp_reauth_start(sm, eap_id); in eap_peer_erp_reauth_start()
868 wpabuf_free(sm->eapRespData); in eap_peer_erp_reauth_start()
869 sm->eapRespData = msg; in eap_peer_erp_reauth_start()
870 sm->reauthInit = true; in eap_peer_erp_reauth_start()
887 if (sm->m == NULL) { in SM_STATE()
892 eapReqData = eapol_get_eapReqData(sm); in SM_STATE()
893 if (sm->m->vendor == EAP_VENDOR_IETF && sm->m->method == EAP_TYPE_LEAP) in SM_STATE()
913 ret.ignore = sm->ignore; in SM_STATE()
914 ret.methodState = sm->methodState; in SM_STATE()
915 ret.decision = sm->decision; in SM_STATE()
916 ret.allowNotifications = sm->allowNotifications; in SM_STATE()
917 wpabuf_free(sm->eapRespData); in SM_STATE()
918 sm->eapRespData = NULL; in SM_STATE()
919 sm->eapRespData = sm->m->process(sm, sm->eap_method_priv, &ret, in SM_STATE()
926 sm->eapRespData); in SM_STATE()
928 sm->ignore = ret.ignore; in SM_STATE()
929 if (sm->ignore) in SM_STATE()
931 sm->methodState = ret.methodState; in SM_STATE()
932 sm->decision = ret.decision; in SM_STATE()
933 sm->allowNotifications = ret.allowNotifications; in SM_STATE()
935 if (sm->m->isKeyAvailable && sm->m->getKey && in SM_STATE()
936 sm->m->isKeyAvailable(sm, sm->eap_method_priv)) { in SM_STATE()
937 eap_sm_free_key(sm); in SM_STATE()
938 sm->eapKeyData = sm->m->getKey(sm, sm->eap_method_priv, in SM_STATE()
939 &sm->eapKeyDataLen); in SM_STATE()
940 os_free(sm->eapSessionId); in SM_STATE()
941 sm->eapSessionId = NULL; in SM_STATE()
942 if (sm->m->getSessionId) { in SM_STATE()
943 sm->eapSessionId = sm->m->getSessionId( in SM_STATE()
944 sm, sm->eap_method_priv, in SM_STATE()
945 &sm->eapSessionIdLen); in SM_STATE()
947 sm->eapSessionId, sm->eapSessionIdLen); in SM_STATE()
960 wpabuf_free(sm->lastRespData); in SM_STATE()
961 if (sm->eapRespData) { in SM_STATE()
962 if (wpabuf_len(sm->eapRespData) >= 20) in SM_STATE()
963 sm->num_rounds_short = 0; in SM_STATE()
964 if (sm->workaround) in SM_STATE()
965 os_memcpy(sm->last_sha1, sm->req_sha1, 20); in SM_STATE()
966 sm->lastId = sm->reqId; in SM_STATE()
967 sm->lastRespData = wpabuf_dup(sm->eapRespData); in SM_STATE()
968 eapol_set_bool(sm, EAPOL_eapResp, true); in SM_STATE()
971 sm->lastRespData = NULL; in SM_STATE()
973 eapol_set_bool(sm, EAPOL_eapReq, false); in SM_STATE()
974 eapol_set_int(sm, EAPOL_idleWhile, sm->ClientTimeout); in SM_STATE()
975 sm->reauthInit = false; in SM_STATE()
986 eapol_set_bool(sm, EAPOL_eapReq, false); in SM_STATE()
987 eapol_set_bool(sm, EAPOL_eapNoResp, true); in SM_STATE()
999 eapReqData = eapol_get_eapReqData(sm); in SM_STATE()
1002 eap_sm_processIdentity(sm, eapReqData); in SM_STATE()
1003 wpabuf_free(sm->eapRespData); in SM_STATE()
1004 sm->eapRespData = NULL; in SM_STATE()
1005 sm->eapRespData = eap_sm_buildIdentity(sm, sm->reqId, 0); in SM_STATE()
1017 eapReqData = eapol_get_eapReqData(sm); in SM_STATE()
1020 eap_sm_processNotify(sm, eapReqData); in SM_STATE()
1021 wpabuf_free(sm->eapRespData); in SM_STATE()
1022 sm->eapRespData = NULL; in SM_STATE()
1023 sm->eapRespData = eap_sm_buildNotify(sm->reqId); in SM_STATE()
1033 wpabuf_free(sm->eapRespData); in SM_STATE()
1034 if (sm->lastRespData) in SM_STATE()
1035 sm->eapRespData = wpabuf_dup(sm->lastRespData); in SM_STATE()
1037 sm->eapRespData = NULL; in SM_STATE()
1048 struct eap_peer_config *config = eap_get_config(sm); in SM_STATE()
1051 if (sm->eapKeyData != NULL) in SM_STATE()
1052 sm->eapKeyAvailable = true; in SM_STATE()
1053 eapol_set_bool(sm, EAPOL_eapSuccess, true); in SM_STATE()
1060 eapol_set_bool(sm, EAPOL_eapReq, false); in SM_STATE()
1068 eapol_set_bool(sm, EAPOL_eapNoResp, true); in SM_STATE()
1070 wpa_msg(sm->msg_ctx, MSG_INFO, WPA_EVENT_EAP_SUCCESS in SM_STATE()
1073 if (!config || !sm->m) { in SM_STATE()
1087 if (config->erp && sm->m->get_emsk && sm->eapSessionId && in SM_STATE()
1088 sm->m->isKeyAvailable && in SM_STATE()
1089 sm->m->isKeyAvailable(sm, sm->eap_method_priv)) in SM_STATE()
1090 eap_peer_erp_init(sm, NULL, 0, NULL, 0); in SM_STATE()
1101 eapol_set_bool(sm, EAPOL_eapFail, true); in SM_STATE()
1108 eapol_set_bool(sm, EAPOL_eapReq, false); in SM_STATE()
1115 eapol_set_bool(sm, EAPOL_eapNoResp, true); in SM_STATE()
1117 wpa_msg(sm->msg_ctx, MSG_INFO, WPA_EVENT_EAP_FAILURE in SM_STATE()
1120 sm->prev_failure = 1; in SM_STATE()
1124 static int eap_success_workaround(struct eap_sm *sm, int reqId, int lastId) in eap_success_workaround() argument
1136 if (sm->workaround && (reqId == ((lastId + 1) & 0xff) || in eap_success_workaround()
1154 static void eap_peer_sm_step_idle(struct eap_sm *sm) in eap_peer_sm_step_idle() argument
1161 if (eapol_get_bool(sm, EAPOL_eapReq)) in eap_peer_sm_step_idle()
1163 else if ((eapol_get_bool(sm, EAPOL_altAccept) && in eap_peer_sm_step_idle()
1164 sm->decision != DECISION_FAIL) || in eap_peer_sm_step_idle()
1165 (eapol_get_int(sm, EAPOL_idleWhile) == 0 && in eap_peer_sm_step_idle()
1166 sm->decision == DECISION_UNCOND_SUCC)) in eap_peer_sm_step_idle()
1168 else if (eapol_get_bool(sm, EAPOL_altReject) || in eap_peer_sm_step_idle()
1169 (eapol_get_int(sm, EAPOL_idleWhile) == 0 && in eap_peer_sm_step_idle()
1170 sm->decision != DECISION_UNCOND_SUCC) || in eap_peer_sm_step_idle()
1171 (eapol_get_bool(sm, EAPOL_altAccept) && in eap_peer_sm_step_idle()
1172 sm->methodState != METHOD_CONT && in eap_peer_sm_step_idle()
1173 sm->decision == DECISION_FAIL)) in eap_peer_sm_step_idle()
1175 else if (sm->selectedMethod == EAP_TYPE_LEAP && in eap_peer_sm_step_idle()
1176 sm->leap_done && sm->decision != DECISION_FAIL && in eap_peer_sm_step_idle()
1177 sm->methodState == METHOD_DONE) in eap_peer_sm_step_idle()
1179 else if (sm->selectedMethod == EAP_TYPE_PEAP && in eap_peer_sm_step_idle()
1180 sm->peap_done && sm->decision != DECISION_FAIL && in eap_peer_sm_step_idle()
1181 sm->methodState == METHOD_DONE) in eap_peer_sm_step_idle()
1186 static int eap_peer_req_is_duplicate(struct eap_sm *sm) in eap_peer_req_is_duplicate() argument
1190 duplicate = (sm->reqId == sm->lastId) && sm->rxReq; in eap_peer_req_is_duplicate()
1191 if (sm->workaround && duplicate && in eap_peer_req_is_duplicate()
1192 os_memcmp(sm->req_sha1, sm->last_sha1, 20) != 0) { in eap_peer_req_is_duplicate()
1212 static int eap_peer_sm_allow_canned(struct eap_sm *sm) in eap_peer_sm_allow_canned() argument
1214 struct eap_peer_config *config = eap_get_config(sm); in eap_peer_sm_allow_canned()
1221 static void eap_peer_sm_step_received(struct eap_sm *sm) in eap_peer_sm_step_received() argument
1223 int duplicate = eap_peer_req_is_duplicate(sm); in eap_peer_sm_step_received()
1230 if (sm->rxSuccess && sm->decision != DECISION_FAIL && in eap_peer_sm_step_received()
1231 (sm->reqId == sm->lastId || in eap_peer_sm_step_received()
1232 eap_success_workaround(sm, sm->reqId, sm->lastId))) in eap_peer_sm_step_received()
1234 else if (sm->workaround && sm->lastId == -1 && sm->rxSuccess && in eap_peer_sm_step_received()
1235 !sm->rxFailure && !sm->rxReq && eap_peer_sm_allow_canned(sm)) in eap_peer_sm_step_received()
1237 else if (sm->workaround && sm->lastId == -1 && sm->rxFailure && in eap_peer_sm_step_received()
1238 !sm->rxReq && sm->methodState != METHOD_CONT && in eap_peer_sm_step_received()
1239 eap_peer_sm_allow_canned(sm)) in eap_peer_sm_step_received()
1241 else if (sm->workaround && sm->rxSuccess && !sm->rxFailure && in eap_peer_sm_step_received()
1242 !sm->rxReq && sm->methodState != METHOD_CONT && in eap_peer_sm_step_received()
1243 eap_peer_sm_allow_canned(sm)) in eap_peer_sm_step_received()
1245 else if (sm->methodState != METHOD_CONT && in eap_peer_sm_step_received()
1246 ((sm->rxFailure && in eap_peer_sm_step_received()
1247 sm->decision != DECISION_UNCOND_SUCC) || in eap_peer_sm_step_received()
1248 (sm->rxSuccess && sm->decision == DECISION_FAIL && in eap_peer_sm_step_received()
1249 (sm->selectedMethod != EAP_TYPE_LEAP || in eap_peer_sm_step_received()
1250 sm->methodState != METHOD_MAY_CONT))) && in eap_peer_sm_step_received()
1251 (sm->reqId == sm->lastId || in eap_peer_sm_step_received()
1252 eap_success_workaround(sm, sm->reqId, sm->lastId))) in eap_peer_sm_step_received()
1254 else if (sm->rxReq && duplicate) in eap_peer_sm_step_received()
1256 else if (sm->rxReq && !duplicate && in eap_peer_sm_step_received()
1257 sm->reqMethod == EAP_TYPE_NOTIFICATION && in eap_peer_sm_step_received()
1258 sm->allowNotifications) in eap_peer_sm_step_received()
1260 else if (sm->rxReq && !duplicate && in eap_peer_sm_step_received()
1261 sm->selectedMethod == EAP_TYPE_NONE && in eap_peer_sm_step_received()
1262 sm->reqMethod == EAP_TYPE_IDENTITY) in eap_peer_sm_step_received()
1264 else if (sm->rxReq && !duplicate && in eap_peer_sm_step_received()
1265 sm->selectedMethod == EAP_TYPE_NONE && in eap_peer_sm_step_received()
1266 sm->reqMethod != EAP_TYPE_IDENTITY && in eap_peer_sm_step_received()
1267 sm->reqMethod != EAP_TYPE_NOTIFICATION) in eap_peer_sm_step_received()
1269 else if (sm->rxReq && !duplicate && in eap_peer_sm_step_received()
1270 sm->reqMethod == sm->selectedMethod && in eap_peer_sm_step_received()
1271 sm->methodState != METHOD_DONE) in eap_peer_sm_step_received()
1273 else if (sm->selectedMethod == EAP_TYPE_LEAP && in eap_peer_sm_step_received()
1274 (sm->rxSuccess || sm->rxResp)) in eap_peer_sm_step_received()
1276 else if (sm->reauthInit) in eap_peer_sm_step_received()
1283 static void eap_peer_sm_step_local(struct eap_sm *sm) in eap_peer_sm_step_local() argument
1285 switch (sm->EAP_state) { in eap_peer_sm_step_local()
1290 if (eapol_get_bool(sm, EAPOL_portEnabled) && in eap_peer_sm_step_local()
1291 !sm->force_disabled) in eap_peer_sm_step_local()
1295 eap_peer_sm_step_idle(sm); in eap_peer_sm_step_local()
1298 eap_peer_sm_step_received(sm); in eap_peer_sm_step_local()
1301 if (sm->selectedMethod == sm->reqMethod) in eap_peer_sm_step_local()
1315 if (sm->ignore) in eap_peer_sm_step_local()
1317 else if (sm->methodState == METHOD_DONE && in eap_peer_sm_step_local()
1318 sm->decision == DECISION_FAIL && !sm->eapRespData) in eap_peer_sm_step_local()
1349 if (eapol_get_bool(sm, EAPOL_eapRestart) && in SM_STEP()
1350 eapol_get_bool(sm, EAPOL_portEnabled)) in SM_STEP()
1352 else if (!eapol_get_bool(sm, EAPOL_portEnabled) || sm->force_disabled) in SM_STEP()
1354 else if (sm->num_rounds > EAP_MAX_AUTH_ROUNDS) { in SM_STEP()
1363 if (sm->num_rounds == EAP_MAX_AUTH_ROUNDS + 1) { in SM_STEP()
1364 wpa_msg(sm->msg_ctx, MSG_INFO, "EAP: more than %d " in SM_STEP()
1367 sm->num_rounds++; in SM_STEP()
1370 } else if (sm->num_rounds_short > EAP_MAX_AUTH_ROUNDS_SHORT) { in SM_STEP()
1371 if (sm->num_rounds_short == EAP_MAX_AUTH_ROUNDS_SHORT + 1) { in SM_STEP()
1372 wpa_msg(sm->msg_ctx, MSG_INFO, in SM_STEP()
1375 sm->num_rounds_short++; in SM_STEP()
1380 eap_peer_sm_step_local(sm); in SM_STEP()
1385 static bool eap_sm_allowMethod(struct eap_sm *sm, int vendor, in eap_sm_allowMethod() argument
1388 if (!eap_allowed_method(sm, vendor, method)) { in eap_sm_allowMethod()
1402 struct eap_sm *sm, int id, const struct eap_method *methods, in eap_sm_build_expanded_nak() argument
1421 if (sm->reqVendor == m->vendor && in eap_sm_build_expanded_nak()
1422 sm->reqVendorMethod == m->method) in eap_sm_build_expanded_nak()
1424 if (eap_allowed_method(sm, m->vendor, m->method)) { in eap_sm_build_expanded_nak()
1448 static struct wpabuf * eap_sm_buildNak(struct eap_sm *sm, int id) in eap_sm_buildNak() argument
1457 "vendor=%u method=%u not allowed)", sm->reqMethod, in eap_sm_buildNak()
1458 sm->reqVendor, sm->reqVendorMethod); in eap_sm_buildNak()
1462 if (sm->reqMethod == EAP_TYPE_EXPANDED) in eap_sm_buildNak()
1463 return eap_sm_build_expanded_nak(sm, id, methods, count); in eap_sm_buildNak()
1474 if (m->vendor == EAP_VENDOR_IETF && m->method == sm->reqMethod) in eap_sm_buildNak()
1476 if (eap_allowed_method(sm, m->vendor, m->method)) { in eap_sm_buildNak()
1497 static void eap_sm_processIdentity(struct eap_sm *sm, const struct wpabuf *req) in eap_sm_processIdentity() argument
1502 wpa_msg(sm->msg_ctx, MSG_INFO, WPA_EVENT_EAP_STARTED in eap_sm_processIdentity()
1504 eap_notify_status(sm, "started", ""); in eap_sm_processIdentity()
1549 static int eap_sm_imsi_identity(struct eap_sm *sm, in eap_sm_imsi_identity() argument
1559 if (scard_get_imsi(sm->scard_ctx, imsi, &imsi_len)) { in eap_sm_imsi_identity()
1572 mnc_len = scard_get_mnc_len(sm->scard_ctx); in eap_sm_imsi_identity()
1581 if (eap_sm_append_3gpp_realm(sm, imsi, sizeof(imsi), &imsi_len, in eap_sm_imsi_identity()
1629 static int eap_sm_set_scard_pin(struct eap_sm *sm, in eap_sm_set_scard_pin() argument
1632 if (scard_set_pin(sm->scard_ctx, conf->cert.pin)) { in eap_sm_set_scard_pin()
1641 eap_sm_request_pin(sm); in eap_sm_set_scard_pin()
1648 static int eap_sm_get_scard_identity(struct eap_sm *sm, in eap_sm_get_scard_identity() argument
1651 if (eap_sm_set_scard_pin(sm, conf)) in eap_sm_get_scard_identity()
1654 return eap_sm_imsi_identity(sm, conf); in eap_sm_get_scard_identity()
1671 struct wpabuf * eap_sm_buildIdentity(struct eap_sm *sm, int id, int encrypted) in eap_sm_buildIdentity() argument
1673 struct eap_peer_config *config = eap_get_config(sm); in eap_sm_buildIdentity()
1685 if (sm->m && sm->m->get_identity && in eap_sm_buildIdentity()
1686 (identity = sm->m->get_identity(sm, sm->eap_method_priv, in eap_sm_buildIdentity()
1695 } else if (sm->use_machine_cred) { in eap_sm_buildIdentity()
1734 if (eap_sm_get_scard_identity(sm, config) < 0) in eap_sm_buildIdentity()
1741 } else if (eap_sm_set_scard_pin(sm, config) < 0) { in eap_sm_buildIdentity()
1750 eap_sm_request_identity(sm); in eap_sm_buildIdentity()
1761 os_free(sm->identity); in eap_sm_buildIdentity()
1762 sm->identity = os_memdup(identity, identity_len); in eap_sm_buildIdentity()
1763 sm->identity_len = identity_len; in eap_sm_buildIdentity()
1771 static void eap_sm_processNotify(struct eap_sm *sm, const struct wpabuf *req) in eap_sm_processNotify() argument
1790 wpa_msg(sm->msg_ctx, MSG_INFO, "%s%s", in eap_sm_processNotify()
1804 static void eap_peer_initiate(struct eap_sm *sm, const struct eap_hdr *hdr, in eap_peer_initiate() argument
1844 if (eap_peer_erp_reauth_start(sm, hdr->identifier) == 0) in eap_peer_initiate()
1851 eapol_set_bool(sm, EAPOL_eapTriggerStart, true); in eap_peer_initiate()
1855 void eap_peer_finish(struct eap_sm *sm, const struct eap_hdr *hdr, size_t len) in eap_peer_finish() argument
1895 if (seq != sm->erp_seq) { in eap_peer_finish()
1926 erp = eap_erp_get_key_nai(sm, nai); in eap_peer_finish()
1975 eapol_set_bool(sm, EAPOL_eapFail, true); in eap_peer_finish()
1976 eapol_set_bool(sm, EAPOL_eapReq, false); in eap_peer_finish()
1977 eapol_set_bool(sm, EAPOL_eapNoResp, true); in eap_peer_finish()
1978 wpa_msg(sm->msg_ctx, MSG_INFO, WPA_EVENT_EAP_FAILURE in eap_peer_finish()
1980 sm->prev_failure = 1; in eap_peer_finish()
1987 eap_sm_free_key(sm); in eap_peer_finish()
1988 sm->eapKeyDataLen = 0; in eap_peer_finish()
1989 sm->eapKeyData = os_malloc(erp->rRK_len); in eap_peer_finish()
1990 if (!sm->eapKeyData) in eap_peer_finish()
1992 sm->eapKeyDataLen = erp->rRK_len; in eap_peer_finish()
1999 sm->eapKeyData, erp->rRK_len) < 0) { in eap_peer_finish()
2001 eap_sm_free_key(sm); in eap_peer_finish()
2005 sm->eapKeyData, sm->eapKeyDataLen); in eap_peer_finish()
2006 sm->eapKeyAvailable = true; in eap_peer_finish()
2007 eapol_set_bool(sm, EAPOL_eapSuccess, true); in eap_peer_finish()
2008 eapol_set_bool(sm, EAPOL_eapReq, false); in eap_peer_finish()
2009 eapol_set_bool(sm, EAPOL_eapNoResp, true); in eap_peer_finish()
2010 wpa_msg(sm->msg_ctx, MSG_INFO, WPA_EVENT_EAP_SUCCESS in eap_peer_finish()
2016 static void eap_sm_parseEapReq(struct eap_sm *sm, const struct wpabuf *req) in eap_sm_parseEapReq() argument
2022 sm->rxReq = sm->rxResp = sm->rxSuccess = sm->rxFailure = false; in eap_sm_parseEapReq()
2023 sm->reqId = 0; in eap_sm_parseEapReq()
2024 sm->reqMethod = EAP_TYPE_NONE; in eap_sm_parseEapReq()
2025 sm->reqVendor = EAP_VENDOR_IETF; in eap_sm_parseEapReq()
2026 sm->reqVendorMethod = EAP_TYPE_NONE; in eap_sm_parseEapReq()
2041 sm->reqId = hdr->identifier; in eap_sm_parseEapReq()
2043 if (sm->workaround) { in eap_sm_parseEapReq()
2046 sha1_vector(1, addr, &plen, sm->req_sha1); in eap_sm_parseEapReq()
2056 sm->rxReq = true; in eap_sm_parseEapReq()
2058 sm->reqMethod = *pos++; in eap_sm_parseEapReq()
2059 if (sm->reqMethod == EAP_TYPE_EXPANDED) { in eap_sm_parseEapReq()
2066 sm->reqVendor = WPA_GET_BE24(pos); in eap_sm_parseEapReq()
2068 sm->reqVendorMethod = WPA_GET_BE32(pos); in eap_sm_parseEapReq()
2072 sm->reqId, sm->reqMethod, sm->reqVendor, in eap_sm_parseEapReq()
2073 sm->reqVendorMethod); in eap_sm_parseEapReq()
2076 if (sm->selectedMethod == EAP_TYPE_LEAP) { in eap_sm_parseEapReq()
2087 sm->rxResp = true; in eap_sm_parseEapReq()
2089 sm->reqMethod = *pos; in eap_sm_parseEapReq()
2092 sm->reqMethod, sm->reqId); in eap_sm_parseEapReq()
2099 eap_notify_status(sm, "completion", "success"); in eap_sm_parseEapReq()
2100 sm->rxSuccess = true; in eap_sm_parseEapReq()
2104 eap_notify_status(sm, "completion", "failure"); in eap_sm_parseEapReq()
2107 if (sm->m && sm->m->get_error_code) { in eap_sm_parseEapReq()
2110 error_code = sm->m->get_error_code(sm->eap_method_priv); in eap_sm_parseEapReq()
2112 eap_report_error(sm, error_code); in eap_sm_parseEapReq()
2114 sm->rxFailure = true; in eap_sm_parseEapReq()
2117 eap_peer_initiate(sm, hdr, plen); in eap_sm_parseEapReq()
2120 eap_peer_finish(sm, hdr, plen); in eap_sm_parseEapReq()
2133 struct eap_sm *sm = ctx; in eap_peer_sm_tls_event() local
2138 eap_notify_status(sm, "remote certificate verification", in eap_peer_sm_tls_event()
2140 if (sm->ext_cert_check) { in eap_peer_sm_tls_event()
2141 sm->waiting_ext_cert_check = 1; in eap_peer_sm_tls_event()
2142 eap_sm_request(sm, WPA_CTRL_REQ_EXT_CERT_CHECK, in eap_peer_sm_tls_event()
2147 wpa_msg(sm->msg_ctx, MSG_INFO, WPA_EVENT_EAP_TLS_CERT_ERROR in eap_peer_sm_tls_event()
2153 eap_notify_status(sm, "remote certificate verification", in eap_peer_sm_tls_event()
2157 if (!sm->eapol_cb->notify_cert) in eap_peer_sm_tls_event()
2170 sm->eapol_cb->notify_cert(sm->eapol_ctx, &data->peer_cert, in eap_peer_sm_tls_event()
2175 eap_notify_status(sm, "local TLS alert", in eap_peer_sm_tls_event()
2178 eap_notify_status(sm, "remote TLS alert", in eap_peer_sm_tls_event()
2184 eap_notify_status(sm, "unsafe server renegotiation", "failure"); in eap_peer_sm_tls_event()
2210 struct eap_sm *sm; in eap_peer_sm_init() local
2213 sm = os_zalloc(sizeof(*sm)); in eap_peer_sm_init()
2214 if (sm == NULL) in eap_peer_sm_init()
2216 sm->eapol_ctx = eapol_ctx; in eap_peer_sm_init()
2217 sm->eapol_cb = eapol_cb; in eap_peer_sm_init()
2218 sm->msg_ctx = msg_ctx; in eap_peer_sm_init()
2219 sm->ClientTimeout = EAP_CLIENT_TIMEOUT_DEFAULT; in eap_peer_sm_init()
2220 sm->wps = conf->wps; in eap_peer_sm_init()
2221 dl_list_init(&sm->erp_keys); in eap_peer_sm_init()
2238 tlsconf.cb_ctx = sm; in eap_peer_sm_init()
2240 sm->ssl_ctx = tls_init(&tlsconf); in eap_peer_sm_init()
2241 if (sm->ssl_ctx == NULL) { in eap_peer_sm_init()
2244 os_free(sm); in eap_peer_sm_init()
2248 sm->ssl_ctx2 = tls_init(&tlsconf); in eap_peer_sm_init()
2249 if (sm->ssl_ctx2 == NULL) { in eap_peer_sm_init()
2255 return sm; in eap_peer_sm_init()
2266 void eap_peer_sm_deinit(struct eap_sm *sm) in eap_peer_sm_deinit() argument
2268 if (sm == NULL) in eap_peer_sm_deinit()
2270 eap_deinit_prev_method(sm, "EAP deinit"); in eap_peer_sm_deinit()
2271 eap_sm_abort(sm); in eap_peer_sm_deinit()
2272 if (sm->ssl_ctx2) in eap_peer_sm_deinit()
2273 tls_deinit(sm->ssl_ctx2); in eap_peer_sm_deinit()
2274 tls_deinit(sm->ssl_ctx); in eap_peer_sm_deinit()
2275 eap_peer_erp_free_keys(sm); in eap_peer_sm_deinit()
2276 os_free(sm->identity); in eap_peer_sm_deinit()
2277 os_free(sm); in eap_peer_sm_deinit()
2290 int eap_peer_sm_step(struct eap_sm *sm) in eap_peer_sm_step() argument
2294 sm->changed = false; in eap_peer_sm_step()
2296 if (sm->changed) in eap_peer_sm_step()
2298 } while (sm->changed); in eap_peer_sm_step()
2310 void eap_sm_abort(struct eap_sm *sm) in eap_sm_abort() argument
2312 wpabuf_free(sm->lastRespData); in eap_sm_abort()
2313 sm->lastRespData = NULL; in eap_sm_abort()
2314 wpabuf_free(sm->eapRespData); in eap_sm_abort()
2315 sm->eapRespData = NULL; in eap_sm_abort()
2316 eap_sm_free_key(sm); in eap_sm_abort()
2317 os_free(sm->eapSessionId); in eap_sm_abort()
2318 sm->eapSessionId = NULL; in eap_sm_abort()
2323 eapol_set_bool(sm, EAPOL_eapSuccess, false); in eap_sm_abort()
2415 int eap_sm_get_status(struct eap_sm *sm, char *buf, size_t buflen, int verbose) in eap_sm_get_status() argument
2419 if (sm == NULL) in eap_sm_get_status()
2424 eap_sm_state_txt(sm->EAP_state)); in eap_sm_get_status()
2428 if (sm->selectedMethod != EAP_TYPE_NONE) { in eap_sm_get_status()
2430 if (sm->m) { in eap_sm_get_status()
2431 name = sm->m->name; in eap_sm_get_status()
2435 sm->selectedMethod); in eap_sm_get_status()
2443 sm->selectedMethod, name); in eap_sm_get_status()
2448 if (sm->m && sm->m->get_status) { in eap_sm_get_status()
2449 len += sm->m->get_status(sm, sm->eap_method_priv, in eap_sm_get_status()
2461 sm->reqMethod, in eap_sm_get_status()
2462 eap_sm_method_state_txt(sm->methodState), in eap_sm_get_status()
2463 eap_sm_decision_txt(sm->decision), in eap_sm_get_status()
2464 sm->ClientTimeout); in eap_sm_get_status()
2475 static void eap_sm_request(struct eap_sm *sm, enum wpa_ctrl_req_type field, in eap_sm_request() argument
2483 if (sm == NULL) in eap_sm_request()
2485 config = eap_get_config(sm); in eap_sm_request()
2534 if (sm->eapol_cb->eap_param_needed) in eap_sm_request()
2535 sm->eapol_cb->eap_param_needed(sm->eapol_ctx, field, txt); in eap_sm_request()
2540 const char * eap_sm_get_method_name(struct eap_sm *sm) in eap_sm_get_method_name() argument
2542 if (sm->m == NULL) in eap_sm_get_method_name()
2544 return sm->m->name; in eap_sm_get_method_name()
2557 void eap_sm_request_identity(struct eap_sm *sm) in eap_sm_request_identity() argument
2559 eap_sm_request(sm, WPA_CTRL_REQ_EAP_IDENTITY, NULL, 0); in eap_sm_request_identity()
2572 void eap_sm_request_password(struct eap_sm *sm) in eap_sm_request_password() argument
2574 eap_sm_request(sm, WPA_CTRL_REQ_EAP_PASSWORD, NULL, 0); in eap_sm_request_password()
2587 void eap_sm_request_new_password(struct eap_sm *sm) in eap_sm_request_new_password() argument
2589 eap_sm_request(sm, WPA_CTRL_REQ_EAP_NEW_PASSWORD, NULL, 0); in eap_sm_request_new_password()
2602 void eap_sm_request_pin(struct eap_sm *sm) in eap_sm_request_pin() argument
2604 eap_sm_request(sm, WPA_CTRL_REQ_EAP_PIN, NULL, 0); in eap_sm_request_pin()
2618 void eap_sm_request_otp(struct eap_sm *sm, const char *msg, size_t msg_len) in eap_sm_request_otp() argument
2620 eap_sm_request(sm, WPA_CTRL_REQ_EAP_OTP, msg, msg_len); in eap_sm_request_otp()
2633 void eap_sm_request_passphrase(struct eap_sm *sm) in eap_sm_request_passphrase() argument
2635 eap_sm_request(sm, WPA_CTRL_REQ_EAP_PASSPHRASE, NULL, 0); in eap_sm_request_passphrase()
2644 void eap_sm_request_sim(struct eap_sm *sm, const char *req) in eap_sm_request_sim() argument
2646 eap_sm_request(sm, WPA_CTRL_REQ_SIM, req, os_strlen(req)); in eap_sm_request_sim()
2657 void eap_sm_notify_ctrl_attached(struct eap_sm *sm) in eap_sm_notify_ctrl_attached() argument
2659 struct eap_peer_config *config = eap_get_config(sm); in eap_sm_notify_ctrl_attached()
2669 eap_sm_request_identity(sm); in eap_sm_notify_ctrl_attached()
2671 eap_sm_request_password(sm); in eap_sm_notify_ctrl_attached()
2673 eap_sm_request_new_password(sm); in eap_sm_notify_ctrl_attached()
2675 eap_sm_request_otp(sm, NULL, 0); in eap_sm_notify_ctrl_attached()
2677 eap_sm_request_pin(sm); in eap_sm_notify_ctrl_attached()
2679 eap_sm_request_passphrase(sm); in eap_sm_notify_ctrl_attached()
2766 void eap_set_fast_reauth(struct eap_sm *sm, int enabled) in eap_set_fast_reauth() argument
2768 sm->fast_reauth = enabled; in eap_set_fast_reauth()
2777 void eap_set_workaround(struct eap_sm *sm, unsigned int workaround) in eap_set_workaround() argument
2779 sm->workaround = workaround; in eap_set_workaround()
2793 struct eap_peer_config * eap_get_config(struct eap_sm *sm) in eap_get_config() argument
2795 return sm->eapol_cb->get_config(sm->eapol_ctx); in eap_get_config()
2805 const u8 * eap_get_config_identity(struct eap_sm *sm, size_t *len) in eap_get_config_identity() argument
2807 struct eap_peer_config *config = eap_get_config(sm); in eap_get_config_identity()
2812 if (sm->use_machine_cred) { in eap_get_config_identity()
2822 static int eap_get_ext_password(struct eap_sm *sm, in eap_get_ext_password() argument
2829 if (sm->use_machine_cred) { in eap_get_ext_password()
2845 ext_password_free(sm->ext_pw_buf); in eap_get_ext_password()
2846 sm->ext_pw_buf = ext_password_get(sm->ext_pw, name); in eap_get_ext_password()
2849 return sm->ext_pw_buf == NULL ? -1 : 0; in eap_get_ext_password()
2859 const u8 * eap_get_config_password(struct eap_sm *sm, size_t *len) in eap_get_config_password() argument
2861 struct eap_peer_config *config = eap_get_config(sm); in eap_get_config_password()
2866 if ((sm->use_machine_cred && in eap_get_config_password()
2868 (!sm->use_machine_cred && in eap_get_config_password()
2870 if (eap_get_ext_password(sm, config) < 0) in eap_get_config_password()
2872 *len = wpabuf_len(sm->ext_pw_buf); in eap_get_config_password()
2873 return wpabuf_head(sm->ext_pw_buf); in eap_get_config_password()
2876 if (sm->use_machine_cred) { in eap_get_config_password()
2895 const u8 * eap_get_config_password2(struct eap_sm *sm, size_t *len, int *hash) in eap_get_config_password2() argument
2897 struct eap_peer_config *config = eap_get_config(sm); in eap_get_config_password2()
2902 if ((sm->use_machine_cred && in eap_get_config_password2()
2904 (!sm->use_machine_cred && in eap_get_config_password2()
2906 if (eap_get_ext_password(sm, config) < 0) in eap_get_config_password2()
2910 *len = wpabuf_len(sm->ext_pw_buf); in eap_get_config_password2()
2911 return wpabuf_head(sm->ext_pw_buf); in eap_get_config_password2()
2914 if (sm->use_machine_cred) { in eap_get_config_password2()
2935 const u8 * eap_get_config_new_password(struct eap_sm *sm, size_t *len) in eap_get_config_new_password() argument
2937 struct eap_peer_config *config = eap_get_config(sm); in eap_get_config_new_password()
2951 const u8 * eap_get_config_otp(struct eap_sm *sm, size_t *len) in eap_get_config_otp() argument
2953 struct eap_peer_config *config = eap_get_config(sm); in eap_get_config_otp()
2969 void eap_clear_config_otp(struct eap_sm *sm) in eap_clear_config_otp() argument
2971 struct eap_peer_config *config = eap_get_config(sm); in eap_clear_config_otp()
2986 const char * eap_get_config_phase1(struct eap_sm *sm) in eap_get_config_phase1() argument
2988 struct eap_peer_config *config = eap_get_config(sm); in eap_get_config_phase1()
3000 const char * eap_get_config_phase2(struct eap_sm *sm) in eap_get_config_phase2() argument
3002 struct eap_peer_config *config = eap_get_config(sm); in eap_get_config_phase2()
3009 int eap_get_config_fragment_size(struct eap_sm *sm) in eap_get_config_fragment_size() argument
3011 struct eap_peer_config *config = eap_get_config(sm); in eap_get_config_fragment_size()
3023 int eap_key_available(struct eap_sm *sm) in eap_key_available() argument
3025 return sm ? sm->eapKeyAvailable : 0; in eap_key_available()
3038 void eap_notify_success(struct eap_sm *sm) in eap_notify_success() argument
3040 if (sm) { in eap_notify_success()
3041 sm->decision = DECISION_COND_SUCC; in eap_notify_success()
3042 sm->EAP_state = EAP_SUCCESS; in eap_notify_success()
3054 void eap_notify_lower_layer_success(struct eap_sm *sm) in eap_notify_lower_layer_success() argument
3056 if (sm == NULL) in eap_notify_lower_layer_success()
3059 if (eapol_get_bool(sm, EAPOL_eapSuccess) || in eap_notify_lower_layer_success()
3060 sm->decision == DECISION_FAIL || in eap_notify_lower_layer_success()
3061 (sm->methodState != METHOD_MAY_CONT && in eap_notify_lower_layer_success()
3062 sm->methodState != METHOD_DONE)) in eap_notify_lower_layer_success()
3065 if (sm->eapKeyData != NULL) in eap_notify_lower_layer_success()
3066 sm->eapKeyAvailable = true; in eap_notify_lower_layer_success()
3067 eapol_set_bool(sm, EAPOL_eapSuccess, true); in eap_notify_lower_layer_success()
3068 wpa_msg(sm->msg_ctx, MSG_INFO, WPA_EVENT_EAP_SUCCESS in eap_notify_lower_layer_success()
3084 const u8 * eap_get_eapSessionId(struct eap_sm *sm, size_t *len) in eap_get_eapSessionId() argument
3086 if (sm == NULL || sm->eapSessionId == NULL) { in eap_get_eapSessionId()
3091 *len = sm->eapSessionIdLen; in eap_get_eapSessionId()
3092 return sm->eapSessionId; in eap_get_eapSessionId()
3107 const u8 * eap_get_eapKeyData(struct eap_sm *sm, size_t *len) in eap_get_eapKeyData() argument
3109 if (sm == NULL || sm->eapKeyData == NULL) { in eap_get_eapKeyData()
3114 *len = sm->eapKeyDataLen; in eap_get_eapKeyData()
3115 return sm->eapKeyData; in eap_get_eapKeyData()
3129 struct wpabuf * eap_get_eapRespData(struct eap_sm *sm) in eap_get_eapRespData() argument
3133 if (sm == NULL || sm->eapRespData == NULL) in eap_get_eapRespData()
3136 resp = sm->eapRespData; in eap_get_eapRespData()
3137 sm->eapRespData = NULL; in eap_get_eapRespData()
3151 void eap_register_scard_ctx(struct eap_sm *sm, void *ctx) in eap_register_scard_ctx() argument
3153 if (sm) in eap_register_scard_ctx()
3154 sm->scard_ctx = ctx; in eap_register_scard_ctx()
3166 void eap_set_config_blob(struct eap_sm *sm, struct wpa_config_blob *blob) in eap_set_config_blob() argument
3169 sm->eapol_cb->set_config_blob(sm->eapol_ctx, blob); in eap_set_config_blob()
3180 const struct wpa_config_blob * eap_get_config_blob(struct eap_sm *sm, in eap_get_config_blob() argument
3184 return sm->eapol_cb->get_config_blob(sm->eapol_ctx, name); in eap_get_config_blob()
3199 void eap_set_force_disabled(struct eap_sm *sm, int disabled) in eap_set_force_disabled() argument
3201 sm->force_disabled = disabled; in eap_set_force_disabled()
3210 void eap_set_external_sim(struct eap_sm *sm, int external_sim) in eap_set_external_sim() argument
3212 sm->external_sim = external_sim; in eap_set_external_sim()
3225 void eap_notify_pending(struct eap_sm *sm) in eap_notify_pending() argument
3227 sm->eapol_cb->notify_pending(sm->eapol_ctx); in eap_notify_pending()
3235 void eap_invalidate_cached_session(struct eap_sm *sm) in eap_invalidate_cached_session() argument
3237 if (sm) in eap_invalidate_cached_session()
3238 eap_deinit_prev_method(sm, "invalidate"); in eap_invalidate_cached_session()
3268 void eap_sm_set_ext_pw_ctx(struct eap_sm *sm, struct ext_password_data *ext) in eap_sm_set_ext_pw_ctx() argument
3270 ext_password_free(sm->ext_pw_buf); in eap_sm_set_ext_pw_ctx()
3271 sm->ext_pw_buf = NULL; in eap_sm_set_ext_pw_ctx()
3272 sm->ext_pw = ext; in eap_sm_set_ext_pw_ctx()
3282 void eap_set_anon_id(struct eap_sm *sm, const u8 *id, size_t len) in eap_set_anon_id() argument
3284 if (sm->eapol_cb->set_anon_id) in eap_set_anon_id()
3285 sm->eapol_cb->set_anon_id(sm->eapol_ctx, id, len); in eap_set_anon_id()
3289 int eap_peer_was_failure_expected(struct eap_sm *sm) in eap_peer_was_failure_expected() argument
3291 return sm->expected_failure; in eap_peer_was_failure_expected()