static void eap_eke_process(struct eap_sm *sm, void *priv, struct wpabuf *respData) { struct eap_eke_data *data = priv; u8 eke_exch; size_t len; const u8 *pos, *end; pos = eap_hdr_validate(EAP_VENDOR_IETF, EAP_TYPE_EKE, respData, &len); if (pos == NULL || len < 1) return; eke_exch = *pos; end = pos + len; pos++; wpa_hexdump(MSG_DEBUG, "EAP-EKE: Received payload", pos, end - pos); switch (eke_exch) { case EAP_EKE_ID: eap_eke_process_identity(sm, data, respData, pos, end - pos); break; case EAP_EKE_COMMIT: eap_eke_process_commit(sm, data, respData, pos, end - pos); break; case EAP_EKE_CONFIRM: eap_eke_process_confirm(sm, data, respData, pos, end - pos); break; case EAP_EKE_FAILURE: eap_eke_process_failure(sm, data, respData, pos, end - pos); break; } }
static struct wpabuf * eap_eke_process(struct eap_sm *sm, void *priv, struct eap_method_ret *ret, const struct wpabuf *reqData) { struct eap_eke_data *data = priv; struct wpabuf *resp; const u8 *pos, *end; size_t len; u8 eke_exch; pos = eap_hdr_validate(EAP_VENDOR_IETF, EAP_TYPE_EKE, reqData, &len); if (pos == NULL || len < 1) { ret->ignore = TRUE; return NULL; } end = pos + len; eke_exch = *pos++; wpa_printf(MSG_DEBUG, "EAP-EKE: Received frame: exch %d", eke_exch); wpa_hexdump(MSG_DEBUG, "EAP-EKE: Received Data", pos, end - pos); ret->ignore = FALSE; ret->methodState = METHOD_MAY_CONT; ret->decision = DECISION_FAIL; ret->allowNotifications = TRUE; switch (eke_exch) { case EAP_EKE_ID: resp = eap_eke_process_id(data, ret, reqData, pos, end - pos); break; case EAP_EKE_COMMIT: resp = eap_eke_process_commit(sm, data, ret, reqData, pos, end - pos); break; case EAP_EKE_CONFIRM: resp = eap_eke_process_confirm(data, ret, reqData, pos, end - pos); break; case EAP_EKE_FAILURE: resp = eap_eke_process_failure(data, ret, reqData, pos, end - pos); break; default: wpa_printf(MSG_DEBUG, "EAP-EKE: Ignoring message with unknown EKE-Exch %d", eke_exch); ret->ignore = TRUE; return NULL; } if (ret->methodState == METHOD_DONE) ret->allowNotifications = FALSE; return resp; }