mesh: Use variable length MGTK for RX
authorJouni Malinen <j@w1.fi>
Sat, 18 Jun 2016 11:45:35 +0000 (14:45 +0300)
committerJouni Malinen <j@w1.fi>
Sun, 19 Jun 2016 17:18:09 +0000 (20:18 +0300)
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 <j@w1.fi>
src/ap/sta_info.h
wpa_supplicant/mesh_mpm.c
wpa_supplicant/mesh_rsn.c

index 6b520bc..b5ed918 100644 (file)
@@ -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 */
 
index 84c5b6b..090198d 100644 (file)
@@ -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);
index 0fa0fbf..db2a608 100644 (file)
@@ -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: