From e963e64f9bc1fd4b488cd0e0e8f5b4cf21c41a6b Mon Sep 17 00:00:00 2001 From: James Prestwood Date: Wed, 10 Apr 2019 14:52:26 -0700 Subject: [PATCH] eap: export session ID as key materials ERP/FILS requires the session ID which is derived internally to an EAP method. --- src/eap-aka.c | 6 ++++-- src/eap-mschapv2.c | 2 +- src/eap-peap.c | 2 +- src/eap-private.h | 3 ++- src/eap-pwd.c | 3 ++- src/eap-sim.c | 8 ++++++-- src/eap-tls.c | 4 +++- src/eap-ttls.c | 3 ++- src/eap.c | 6 ++++-- src/eap.h | 1 + src/eapol.c | 2 ++ wired/ethdev.c | 1 + 12 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/eap-aka.c b/src/eap-aka.c index f1bf8787..1ab7008b 100644 --- a/src/eap-aka.c +++ b/src/eap-aka.c @@ -273,7 +273,8 @@ static void check_milenage_cb(const uint8_t *res, const uint8_t *ck, if (!aka->protected) { eap_method_success(eap); - eap_set_key_material(eap, aka->msk, 32, NULL, 0, NULL, 0); + eap_set_key_material(eap, aka->msk, 32, NULL, 0, NULL, 0, + NULL, 0); aka->state = EAP_AKA_STATE_SUCCESS; } @@ -502,7 +503,8 @@ static void handle_notification(struct eap_state *eap, const uint8_t *pkt, * Server sent successful result indication */ eap_method_success(eap); - eap_set_key_material(eap, aka->msk, 32, NULL, 0, NULL, 0); + eap_set_key_material(eap, aka->msk, 32, NULL, 0, NULL, 0, + NULL, 0); /* * Build response packet diff --git a/src/eap-mschapv2.c b/src/eap-mschapv2.c index e1f4ab5d..61a97952 100644 --- a/src/eap-mschapv2.c +++ b/src/eap-mschapv2.c @@ -349,7 +349,7 @@ static void eap_mschapv2_handle_success(struct eap_state *eap, eap_send_response(eap, EAP_TYPE_MSCHAPV2, buffer, sizeof(buffer)); /* The eapol set_key_material only needs msk, and that's all we got */ - eap_set_key_material(eap, session_key, 32, NULL, 0, NULL, 0); + eap_set_key_material(eap, session_key, 32, NULL, 0, NULL, 0, NULL, 0); done: if (!ret) diff --git a/src/eap-peap.c b/src/eap-peap.c index 520f5d1d..ea768632 100644 --- a/src/eap-peap.c +++ b/src/eap-peap.c @@ -201,7 +201,7 @@ static bool eap_peap_tunnel_ready(struct eap_state *eap, eap_tls_common_tunnel_prf_get_bytes(eap, true, "client EAP encryption", msk_emsk, 128); - eap_set_key_material(eap, msk_emsk + 0, 64, NULL, 0, NULL, 0); + eap_set_key_material(eap, msk_emsk + 0, 64, NULL, 0, NULL, 0, NULL, 0); explicit_bzero(msk_emsk, sizeof(msk_emsk)); eap_tls_common_send_empty_response(eap); diff --git a/src/eap-private.h b/src/eap-private.h index aef30998..0387d286 100644 --- a/src/eap-private.h +++ b/src/eap-private.h @@ -121,7 +121,8 @@ void eap_send_response(struct eap_state *eap, void eap_set_key_material(struct eap_state *eap, const uint8_t *msk_data, size_t msk_len, const uint8_t *emsk_data, size_t emsk_len, - const uint8_t *iv, size_t iv_len); + const uint8_t *iv, size_t iv_len, + const uint8_t *session_id, size_t session_len); void eap_start_complete_timeout(struct eap_state *eap); diff --git a/src/eap-pwd.c b/src/eap-pwd.c index 56d09802..ccdaa704 100644 --- a/src/eap-pwd.c +++ b/src/eap-pwd.c @@ -541,7 +541,8 @@ static void eap_pwd_handle_confirm(struct eap_state *eap, scalar_s, clen); kdf(mk, 32, (const char *) session_id, 33, msk_emsk, 128); - eap_set_key_material(eap, msk_emsk, 64, msk_emsk + 64, 64, NULL, 0); + eap_set_key_material(eap, msk_emsk, 64, msk_emsk + 64, 64, NULL, 0, + session_id, sizeof(session_id)); explicit_bzero(mk, sizeof(mk)); explicit_bzero(msk_emsk, sizeof(msk_emsk)); diff --git a/src/eap-sim.c b/src/eap-sim.c index 59b40205..1281561a 100644 --- a/src/eap-sim.c +++ b/src/eap-sim.c @@ -379,7 +379,9 @@ static void gsm_callback(const uint8_t *sres, const uint8_t *kc, * Result indication not required, we must accept success. */ eap_method_success(eap); - eap_set_key_material(eap, sim->msk, 32, NULL, 0, NULL, 0); + /* TODO: Derive Session-ID */ + eap_set_key_material(eap, sim->msk, 32, NULL, 0, NULL, 0, + NULL, 0); sim->state = EAP_SIM_STATE_SUCCESS; } @@ -532,7 +534,9 @@ static void handle_notification(struct eap_state *eap, const uint8_t *pkt, * Server sent successful result indication */ eap_method_success(eap); - eap_set_key_material(eap, sim->msk, 32, NULL, 0, NULL, 0); + /* TODO: Derive Session-ID */ + eap_set_key_material(eap, sim->msk, 32, NULL, 0, NULL, 0, + NULL, 0); /* * Build response packet diff --git a/src/eap-tls.c b/src/eap-tls.c index 1dfb0f24..025702cd 100644 --- a/src/eap-tls.c +++ b/src/eap-tls.c @@ -49,7 +49,9 @@ static bool eap_tls_tunnel_ready(struct eap_state *eap, eap_tls_common_tunnel_prf_get_bytes(eap, false, "client EAP encryption", iv, 64); - eap_set_key_material(eap, msk_emsk + 0, 64, msk_emsk + 64, 64, iv, 64); + /* TODO: Derive Session-ID */ + eap_set_key_material(eap, msk_emsk + 0, 64, msk_emsk + 64, 64, iv, 64, + NULL, 0); explicit_bzero(msk_emsk, sizeof(msk_emsk)); explicit_bzero(iv, sizeof(iv)); diff --git a/src/eap-ttls.c b/src/eap-ttls.c index a1ee4319..00559cb7 100644 --- a/src/eap-ttls.c +++ b/src/eap-ttls.c @@ -920,7 +920,8 @@ static bool eap_ttls_tunnel_ready(struct eap_state *eap, eap_tls_common_tunnel_prf_get_bytes(eap, true, "ttls keying material", msk_emsk, 128); - eap_set_key_material(eap, msk_emsk + 0, 64, msk_emsk + 64, 64, NULL, 0); + eap_set_key_material(eap, msk_emsk + 0, 64, msk_emsk + 64, 64, NULL, 0, + NULL, 0); explicit_bzero(msk_emsk, sizeof(msk_emsk)); if (phase2->ops->init) diff --git a/src/eap.c b/src/eap.c index d68d1bc9..8ca44367 100644 --- a/src/eap.c +++ b/src/eap.c @@ -598,13 +598,15 @@ const char *eap_get_method_name(struct eap_state *eap) void eap_set_key_material(struct eap_state *eap, const uint8_t *msk_data, size_t msk_len, const uint8_t *emsk_data, size_t emsk_len, - const uint8_t *iv, size_t iv_len) + const uint8_t *iv, size_t iv_len, + const uint8_t *session_id, size_t session_len) { if (!eap->set_key_material) return; eap->set_key_material(msk_data, msk_len, emsk_data, emsk_len, - iv, iv_len, eap->user_data); + iv, iv_len, session_id, session_len, + eap->user_data); } void eap_method_event(struct eap_state *eap, unsigned int id, const void *data) diff --git a/src/eap.h b/src/eap.h index 83d161c8..b3fedecf 100644 --- a/src/eap.h +++ b/src/eap.h @@ -58,6 +58,7 @@ typedef void (*eap_tx_packet_func_t)(const uint8_t *eap_data, size_t len, typedef void (*eap_key_material_func_t)(const uint8_t *msk_data, size_t msk_len, const uint8_t *emsk_data, size_t emsk_len, const uint8_t *iv, size_t iv_len, + const uint8_t *session_id, size_t session_len, void *user_data); typedef void (*eap_complete_func_t)(enum eap_result result, void *user_data); typedef void (*eap_event_func_t)(unsigned int event, const void *event_data, diff --git a/src/eapol.c b/src/eapol.c index 2345c8bf..0d882e96 100644 --- a/src/eapol.c +++ b/src/eapol.c @@ -1948,6 +1948,7 @@ static void eapol_eap_complete_cb(enum eap_result result, void *user_data) static void eapol_eap_results_cb(const uint8_t *msk_data, size_t msk_len, const uint8_t *emsk_data, size_t emsk_len, const uint8_t *iv, size_t iv_len, + const uint8_t *session_id, size_t session_len, void *user_data) { struct eapol_sm *sm = user_data; @@ -2372,6 +2373,7 @@ static void preauth_eap_complete_cb(enum eap_result result, void *user_data) static void preauth_eap_results_cb(const uint8_t *msk_data, size_t msk_len, const uint8_t *emsk_data, size_t emsk_len, const uint8_t *iv, size_t iv_len, + const uint8_t *session_id, size_t session_len, void *user_data) { struct preauth_sm *sm = user_data; diff --git a/wired/ethdev.c b/wired/ethdev.c index 187caa51..81c07e00 100644 --- a/wired/ethdev.c +++ b/wired/ethdev.c @@ -183,6 +183,7 @@ static void eap_complete(enum eap_result result, void *user_data) static void eap_key_material(const uint8_t *msk_data, size_t msk_len, const uint8_t *emsk_data, size_t emsk_len, const uint8_t *iv, size_t iv_len, + const uint8_t *session_id, size_t session_len, void *user_data) { l_debug("EAP key material received");