aboutsummaryrefslogtreecommitdiffstats
path: root/wpa_supplicant/ibss_rsn.c
diff options
context:
space:
mode:
authorJouni Malinen <j@w1.fi>2017-01-14 11:56:18 (GMT)
committerJouni Malinen <j@w1.fi>2017-01-14 11:56:18 (GMT)
commitb98706c14b8ff8439e596c60eb123b78eb4f5a8f (patch)
tree12dc02560901fc4eddd0f225b91e1972dcb5e8dd /wpa_supplicant/ibss_rsn.c
parentc5420f9c921bcd7288e5b07fc4e86ab461398c66 (diff)
downloadhostap-b98706c14b8ff8439e596c60eb123b78eb4f5a8f.zip
hostap-b98706c14b8ff8439e596c60eb123b78eb4f5a8f.tar.gz
hostap-b98706c14b8ff8439e596c60eb123b78eb4f5a8f.tar.bz2
RSN IBSS: Fix TK clearing on Authentication frame RX
When wpa_supplicant was processing a received Authentication frame (seq 1) from a peer STA for which there was already a TK configured to the driver, debug log claimed that the PTK gets cleared, but the actual call to clear the key was actually dropped due to AUTH vs. SUPP set_key selection. Fix this by explicitly clearing the TK in case it was set and an Authentication frame (seq 1) is received. This fixes some cases where EAPOL-Key frames were sent encrypted using the old key when a peer STA restarted itself and lost the key and had to re-join the IBSS. Previously, that state required timing out the 4-way handshake and Deauthentication frame exchange to recover. Signed-off-by: Jouni Malinen <j@w1.fi>
Diffstat (limited to 'wpa_supplicant/ibss_rsn.c')
-rw-r--r--wpa_supplicant/ibss_rsn.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/wpa_supplicant/ibss_rsn.c b/wpa_supplicant/ibss_rsn.c
index 53d7d57..c29d8d3 100644
--- a/wpa_supplicant/ibss_rsn.c
+++ b/wpa_supplicant/ibss_rsn.c
@@ -838,6 +838,18 @@ static void ibss_rsn_handle_auth_1_of_2(struct ibss_rsn *ibss_rsn,
MAC2STR(addr));
if (peer &&
+ peer->authentication_status & (IBSS_RSN_SET_PTK_SUPP |
+ IBSS_RSN_SET_PTK_AUTH)) {
+ /* Clear the TK for this pair to allow recovery from the case
+ * where the peer STA has restarted and lost its key while we
+ * still have a pairwise key configured. */
+ wpa_printf(MSG_DEBUG, "RSN: Clear pairwise key for peer "
+ MACSTR, MAC2STR(addr));
+ wpa_drv_set_key(ibss_rsn->wpa_s, WPA_ALG_NONE, addr, 0, 0,
+ NULL, 0, NULL, 0);
+ }
+
+ if (peer &&
peer->authentication_status & IBSS_RSN_AUTH_EAPOL_BY_PEER) {
if (peer->own_auth_tx.sec) {
struct os_reltime now, diff;