]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
wlantest: Store last received GTK for each STA
authorJouni Malinen <j@w1.fi>
Thu, 22 Dec 2011 14:59:25 +0000 (16:59 +0200)
committerJouni Malinen <j@w1.fi>
Thu, 22 Dec 2011 14:59:25 +0000 (16:59 +0200)
This allows info_sta command to be used to fetch the last received GTK
separately for each STA.

Signed-hostap: Jouni Malinen <j@w1.fi>

wlantest/ctrl.c
wlantest/rx_eapol.c
wlantest/wlantest.h
wlantest/wlantest_cli.c
wlantest/wlantest_ctrl.h

index 2132b2bf56284e8574a23453acf21f3150f42f3b..32509b35837def280de0e2474297ba1a99f962ca 100644 (file)
@@ -990,6 +990,15 @@ static void info_print_state(char *buf, size_t len, int state)
 }
 
 
+static void info_print_gtk(char *buf, size_t len, struct wlantest_sta *sta)
+{
+       size_t pos;
+
+       pos = os_snprintf(buf, len, "IDX=%d,GTK=", sta->gtk_idx);
+       wpa_snprintf_hex(buf + pos, len - pos, sta->gtk, sta->gtk_len);
+}
+
+
 static void ctrl_info_sta(struct wlantest *wt, int sock, u8 *cmd, size_t clen)
 {
        u8 *addr;
@@ -1029,6 +1038,9 @@ static void ctrl_info_sta(struct wlantest *wt, int sock, u8 *cmd, size_t clen)
        case WLANTEST_STA_INFO_STATE:
                info_print_state(resp, sizeof(resp), sta->state);
                break;
+       case WLANTEST_STA_INFO_GTK:
+               info_print_gtk(resp, sizeof(resp), sta);
+               break;
        default:
                ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
                return;
index e98dbe2702117d2d0d44eed36e58772c192cfe04..7619bafbd64de5ada80e8871917d98305cb5eeb1 100644 (file)
@@ -326,8 +326,8 @@ static u8 * decrypt_eapol_key_data(const u8 *kek, u16 ver,
 }
 
 
-static void learn_kde_keys(struct wlantest_bss *bss, const u8 *buf, size_t len,
-                          const u8 *rsc)
+static void learn_kde_keys(struct wlantest_bss *bss, struct wlantest_sta *sta,
+                          const u8 *buf, size_t len, const u8 *rsc)
 {
        struct wpa_eapol_ie_parse ie;
 
@@ -361,7 +361,9 @@ static void learn_kde_keys(struct wlantest_bss *bss, const u8 *buf, size_t len,
                        wpa_hexdump(MSG_DEBUG, "GTK", ie.gtk + 2,
                                    ie.gtk_len - 2);
                        bss->gtk_len[id] = ie.gtk_len - 2;
+                       sta->gtk_len = ie.gtk_len - 2;
                        os_memcpy(bss->gtk[id], ie.gtk + 2, ie.gtk_len - 2);
+                       os_memcpy(sta->gtk, ie.gtk + 2, ie.gtk_len - 2);
                        bss->rsc[id][0] = rsc[5];
                        bss->rsc[id][1] = rsc[4];
                        bss->rsc[id][2] = rsc[3];
@@ -369,6 +371,7 @@ static void learn_kde_keys(struct wlantest_bss *bss, const u8 *buf, size_t len,
                        bss->rsc[id][4] = rsc[1];
                        bss->rsc[id][5] = rsc[0];
                        bss->gtk_idx = id;
+                       sta->gtk_idx = id;
                        wpa_hexdump(MSG_DEBUG, "RSC", bss->rsc[id], 6);
                } else {
                        wpa_printf(MSG_INFO, "Invalid GTK KDE length %u",
@@ -561,7 +564,7 @@ static void rx_data_eapol_key_3_of_4(struct wlantest *wt, const u8 *dst,
                            bss->rsnie[0] ? 2 + bss->rsnie[1] : 0);
        }
 
-       learn_kde_keys(bss, decrypted, decrypted_len, hdr->key_rsc);
+       learn_kde_keys(bss, sta, decrypted, decrypted_len, hdr->key_rsc);
        os_free(decrypted_buf);
 }
 
@@ -711,7 +714,8 @@ static void rx_data_eapol_key_1_of_2(struct wlantest *wt, const u8 *dst,
                                     decrypted, plain_len);
        }
        if (sta->proto & WPA_PROTO_RSN)
-               learn_kde_keys(bss, decrypted, decrypted_len, hdr->key_rsc);
+               learn_kde_keys(bss, sta, decrypted, decrypted_len,
+                              hdr->key_rsc);
        else {
                int klen = bss->group_cipher == WPA_CIPHER_TKIP ? 32 : 16;
                if (decrypted_len == klen) {
index 4c65d4839cce314f259f77bd066a5764dbaaf7dc..18ea3b9c5299a5aa8bc47b8315bb1bf333e1336d 100644 (file)
@@ -93,6 +93,10 @@ struct wlantest_sta {
 
        int pwrmgt;
        int pspoll;
+
+       u8 gtk[32];
+       size_t gtk_len;
+       int gtk_idx;
 };
 
 struct wlantest_tdls {
index 6377fc141564c784e81fafc0c7ea836ec9533e93..b9574889f2a71ae2375ecf0e1f6bf10d83ac46e0 100644 (file)
@@ -1226,6 +1226,7 @@ static const struct sta_infos sta_infos[] = {
        { "key_mgmt", WLANTEST_STA_INFO_KEY_MGMT },
        { "rsn_capab", WLANTEST_STA_INFO_RSN_CAPAB },
        { "state", WLANTEST_STA_INFO_STATE },
+       { "gtk", WLANTEST_STA_INFO_GTK },
        { NULL, 0 }
 };
 
index 9731bd6f00e398f534260b019eaf7df2bb90bdb1..b0c8123161501c36e567b8a08510c4443e0e9f20 100644 (file)
@@ -157,6 +157,7 @@ enum wlantest_sta_info {
        WLANTEST_STA_INFO_KEY_MGMT,
        WLANTEST_STA_INFO_RSN_CAPAB,
        WLANTEST_STA_INFO_STATE,
+       WLANTEST_STA_INFO_GTK,
 };
 
 enum wlantest_bss_info {