EAP peer: Cache decrypted requests for EAP-SIM/AKA/AKA'

Add an internal flag which indicates to tunneled EAP methods (FAST,
PEAP, TTLS) that they should cache decrypted EAP-SIM/AKA/AKA' requests.
This allows EAP-SIM/AKA/AKA' to be tunneled within these outer methods
while using an external SIM authenticator over the control interface.

Signed-off-by: Paul Stewart <pstew@google.com>
This commit is contained in:
Paul Stewart 2017-02-08 16:46:41 -08:00 committed by Jouni Malinen
parent c299dea558
commit ed9b1c16d5
6 changed files with 20 additions and 5 deletions

View file

@ -2246,6 +2246,7 @@ static void eap_sm_request(struct eap_sm *sm, enum wpa_ctrl_req_type field,
config->pending_req_passphrase++; config->pending_req_passphrase++;
break; break;
case WPA_CTRL_REQ_SIM: case WPA_CTRL_REQ_SIM:
config->pending_req_sim++;
txt = msg; txt = msg;
break; break;
case WPA_CTRL_REQ_EXT_CERT_CHECK: case WPA_CTRL_REQ_EXT_CERT_CHECK:

View file

@ -627,6 +627,15 @@ struct eap_peer_config {
*/ */
int pending_req_passphrase; int pending_req_passphrase;
/**
* pending_req_sim - Pending SIM request
*
* This field should not be set in configuration step. It is only used
* internally when control interface is used to request needed
* information.
*/
int pending_req_sim;
/** /**
* pending_req_otp - Whether there is a pending OTP request * pending_req_otp - Whether there is a pending OTP request
* *

View file

@ -484,7 +484,8 @@ static int eap_fast_phase2_request(struct eap_sm *sm,
if (*resp == NULL && config && if (*resp == NULL && config &&
(config->pending_req_identity || config->pending_req_password || (config->pending_req_identity || config->pending_req_password ||
config->pending_req_otp || config->pending_req_new_password)) { config->pending_req_otp || config->pending_req_new_password ||
config->pending_req_sim)) {
wpabuf_free(data->pending_phase2_req); wpabuf_free(data->pending_phase2_req);
data->pending_phase2_req = wpabuf_alloc_copy(hdr, len); data->pending_phase2_req = wpabuf_alloc_copy(hdr, len);
} else if (*resp == NULL) } else if (*resp == NULL)

View file

@ -726,7 +726,8 @@ static int eap_peap_phase2_request(struct eap_sm *sm,
if (*resp == NULL && if (*resp == NULL &&
(config->pending_req_identity || config->pending_req_password || (config->pending_req_identity || config->pending_req_password ||
config->pending_req_otp || config->pending_req_new_password)) { config->pending_req_otp || config->pending_req_new_password ||
config->pending_req_sim)) {
wpabuf_free(data->pending_phase2_req); wpabuf_free(data->pending_phase2_req);
data->pending_phase2_req = wpabuf_alloc_copy(hdr, len); data->pending_phase2_req = wpabuf_alloc_copy(hdr, len);
} }

View file

@ -458,7 +458,7 @@ static int eap_ttls_phase2_request_eap(struct eap_sm *sm,
if (*resp == NULL && if (*resp == NULL &&
(config->pending_req_identity || config->pending_req_password || (config->pending_req_identity || config->pending_req_password ||
config->pending_req_otp)) { config->pending_req_otp || config->pending_req_sim)) {
return 0; return 0;
} }
@ -1280,7 +1280,8 @@ static int eap_ttls_process_decrypted(struct eap_sm *sm,
} else if (config->pending_req_identity || } else if (config->pending_req_identity ||
config->pending_req_password || config->pending_req_password ||
config->pending_req_otp || config->pending_req_otp ||
config->pending_req_new_password) { config->pending_req_new_password ||
config->pending_req_sim) {
wpabuf_free(data->pending_phase2_req); wpabuf_free(data->pending_phase2_req);
data->pending_phase2_req = wpabuf_dup(in_decrypted); data->pending_phase2_req = wpabuf_dup(in_decrypted);
} }
@ -1317,7 +1318,8 @@ static int eap_ttls_implicit_identity_request(struct eap_sm *sm,
(config->pending_req_identity || (config->pending_req_identity ||
config->pending_req_password || config->pending_req_password ||
config->pending_req_otp || config->pending_req_otp ||
config->pending_req_new_password)) { config->pending_req_new_password ||
config->pending_req_sim)) {
/* /*
* Use empty buffer to force implicit request * Use empty buffer to force implicit request
* processing when EAP request is re-processed after * processing when EAP request is re-processed after

View file

@ -5974,6 +5974,7 @@ int wpa_supplicant_ctrl_iface_ctrl_rsp_handle(struct wpa_supplicant *wpa_s,
case WPA_CTRL_REQ_SIM: case WPA_CTRL_REQ_SIM:
str_clear_free(eap->external_sim_resp); str_clear_free(eap->external_sim_resp);
eap->external_sim_resp = os_strdup(value); eap->external_sim_resp = os_strdup(value);
eap->pending_req_sim = 0;
break; break;
case WPA_CTRL_REQ_PSK_PASSPHRASE: case WPA_CTRL_REQ_PSK_PASSPHRASE:
if (wpa_config_set(ssid, "psk", value, 0) < 0) if (wpa_config_set(ssid, "psk", value, 0) < 0)