From a4eec3c2305856bfb228daac6b047f6baf80c12e Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Sat, 18 Jun 2016 14:45:35 +0300 Subject: [PATCH] mesh: Use variable length MGTK for RX This extends the data structures to allow variable length MGTK to be stored for RX. This is needed as an initial step towards supporting different cipher suites. Signed-off-by: Jouni Malinen --- src/ap/sta_info.h | 3 ++- wpa_supplicant/mesh_mpm.c | 10 ++++++---- wpa_supplicant/mesh_rsn.c | 1 + 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/ap/sta_info.h b/src/ap/sta_info.h index 6b520bc2a..b5ed91801 100644 --- a/src/ap/sta_info.h +++ b/src/ap/sta_info.h @@ -87,7 +87,8 @@ struct sta_info { u8 aek[32]; /* SHA256 digest length */ u8 mtk[WPA_TK_MAX_LEN]; size_t mtk_len; - u8 mgtk[16]; + u8 mgtk[WPA_TK_MAX_LEN]; + size_t mgtk_len; u8 sae_auth_retry; #endif /* CONFIG_MESH */ diff --git a/wpa_supplicant/mesh_mpm.c b/wpa_supplicant/mesh_mpm.c index 84c5b6b36..090198d48 100644 --- a/wpa_supplicant/mesh_mpm.c +++ b/wpa_supplicant/mesh_mpm.c @@ -797,15 +797,17 @@ static void mesh_mpm_plink_estab(struct wpa_supplicant *wpa_s, /* TODO: support for other ciphers */ wpa_drv_set_key(wpa_s, WPA_ALG_CCMP, sta->addr, 0, 0, seq, sizeof(seq), sta->mtk, sta->mtk_len); + + wpa_hexdump_key(MSG_DEBUG, "mesh: RX MGTK", + sta->mgtk, sta->mgtk_len); + /* TODO: support for other ciphers */ + /* FIX: key index.. */ wpa_drv_set_key(wpa_s, WPA_ALG_CCMP, sta->addr, 1, 0, seq, sizeof(seq), - sta->mgtk, sizeof(sta->mgtk)); + sta->mgtk, sta->mgtk_len); wpa_drv_set_key(wpa_s, WPA_ALG_IGTK, sta->addr, 4, 0, seq, sizeof(seq), sta->mgtk, sizeof(sta->mgtk)); - - wpa_hexdump_key(MSG_DEBUG, "mgtk:", - sta->mgtk, sizeof(sta->mgtk)); } wpa_mesh_set_plink_state(wpa_s, sta, PLINK_ESTAB); diff --git a/wpa_supplicant/mesh_rsn.c b/wpa_supplicant/mesh_rsn.c index 0fa0fbf33..db2a60800 100644 --- a/wpa_supplicant/mesh_rsn.c +++ b/wpa_supplicant/mesh_rsn.c @@ -640,6 +640,7 @@ int mesh_rsn_process_ampe(struct wpa_supplicant *wpa_s, struct sta_info *sta, os_memcpy(sta->peer_nonce, ampe->local_nonce, sizeof(ampe->local_nonce)); os_memcpy(sta->mgtk, ampe->mgtk, sizeof(ampe->mgtk)); + sta->mgtk_len = sizeof(ampe->mgtk); /* todo parse mgtk expiration */ free: