]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
wlantest: Implement TKIP replay detection
authorJouni Malinen <j@w1.fi>
Sat, 13 Nov 2010 10:40:36 +0000 (12:40 +0200)
committerJouni Malinen <j@w1.fi>
Sat, 13 Nov 2010 10:40:36 +0000 (12:40 +0200)
wlantest/rx_data.c
wlantest/tkip.c
wlantest/wlantest.h

index ffeb556e49f3a37557d325f9ab215ce93c08f43f..ab0ab0f3ffd8cae86b65b308a0bcae41adde1982 100644 (file)
@@ -979,8 +979,10 @@ static void rx_data_bss_prot_group(struct wlantest *wt,
                return;
        }
 
-       /* TODO: different replay protection for TKIP */
-       ccmp_get_pn(pn, data);
+       if (bss->group_cipher == WPA_CIPHER_TKIP)
+               tkip_get_pn(pn, data);
+       else
+               ccmp_get_pn(pn, data);
        if (os_memcmp(pn, bss->rsc[keyid], 6) <= 0) {
                wpa_printf(MSG_INFO, "CCMP/TKIP replay detected: SA=" MACSTR,
                           MAC2STR(hdr->addr2));
@@ -1061,7 +1063,10 @@ static void rx_data_bss_prot(struct wlantest *wt,
                rsc = sta->rsc_fromds[tid];
 
 
-       ccmp_get_pn(pn, data);
+       if (sta->pairwise_cipher == WPA_CIPHER_TKIP)
+               tkip_get_pn(pn, data);
+       else
+               ccmp_get_pn(pn, data);
        if (os_memcmp(pn, rsc, 6) <= 0) {
                wpa_printf(MSG_INFO, "CCMP/TKIP replay detected: SA=" MACSTR,
                           MAC2STR(hdr->addr2));
index eb26dfa31143d33f522a3cd56184df677703b38f..2f8d28d94637c7d880999f3d6e51a9a6249d0eca 100644 (file)
@@ -392,3 +392,14 @@ u8 * tkip_decrypt(const u8 *tk, const struct ieee80211_hdr *hdr,
        *decrypted_len = plain_len - 8;
        return plain;
 }
+
+
+void tkip_get_pn(u8 *pn, const u8 *data)
+{
+       pn[0] = data[7]; /* PN5 */
+       pn[1] = data[6]; /* PN4 */
+       pn[2] = data[5]; /* PN3 */
+       pn[3] = data[4]; /* PN2 */
+       pn[4] = data[0]; /* PN1 */
+       pn[5] = data[2]; /* PN0 */
+}
index beb80fbf50854434dfebdec574125dbad0db05b8..c76d22fe630f5ba366723acecb94d029e7727f5c 100644 (file)
@@ -155,5 +155,6 @@ void ccmp_get_pn(u8 *pn, const u8 *data);
 
 u8 * tkip_decrypt(const u8 *tk, const struct ieee80211_hdr *hdr,
                  const u8 *data, size_t data_len, size_t *decrypted_len);
+void tkip_get_pn(u8 *pn, const u8 *data);
 
 #endif /* WLANTEST_H */