]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Clear temporary keys from WPA supplicant state machine when not needed
authorJouni Malinen <j@w1.fi>
Mon, 29 Dec 2014 11:00:03 +0000 (13:00 +0200)
committerJouni Malinen <j@w1.fi>
Mon, 29 Dec 2014 17:44:51 +0000 (19:44 +0200)
PMK and PTK are not needed in the supplicant state machine after
disassociation since core wpa_supplicant will reconfigure them for the
next association. As such, clear these from heap in
wpa_sm_notify_disassoc() to reduce time and number of places storing key
material in memory. In addition, clear FT keys in case of
CONFIG_IEEE80211R=y build (sm->xxkey stored a copy of PSK in case of
FT-PSK).

Signed-off-by: Jouni Malinen <j@w1.fi>
src/rsn_supp/wpa.c

index 7c2761cc6dace27778733018658803bf76921b76..9a6153adcbf74a1f19160eb818141a3d99882dd5 100644 (file)
@@ -2140,6 +2140,7 @@ void wpa_sm_deinit(struct wpa_sm *sm)
        os_free(sm->assoc_wpa_ie);
        os_free(sm->ap_wpa_ie);
        os_free(sm->ap_rsn_ie);
+       wpa_sm_drop_sa(sm);
        os_free(sm->ctx);
        peerkey_deinit(sm);
 #ifdef CONFIG_IEEE80211R
@@ -2228,6 +2229,9 @@ void wpa_sm_notify_disassoc(struct wpa_sm *sm)
 #ifdef CONFIG_TDLS
        wpa_tdls_disassoc(sm);
 #endif /* CONFIG_TDLS */
+
+       /* Keys are not needed in the WPA state machine anymore */
+       wpa_sm_drop_sa(sm);
 }
 
 
@@ -2700,7 +2704,6 @@ int wpa_sm_pmksa_cache_list(struct wpa_sm *sm, char *buf, size_t len)
 }
 
 
-#ifdef CONFIG_TESTING_OPTIONS
 void wpa_sm_drop_sa(struct wpa_sm *sm)
 {
        wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG, "WPA: Clear old PMK and PTK");
@@ -2709,8 +2712,12 @@ void wpa_sm_drop_sa(struct wpa_sm *sm)
        os_memset(sm->pmk, 0, sizeof(sm->pmk));
        os_memset(&sm->ptk, 0, sizeof(sm->ptk));
        os_memset(&sm->tptk, 0, sizeof(sm->tptk));
+#ifdef CONFIG_IEEE80211R
+       os_memset(sm->xxkey, 0, sizeof(sm->xxkey));
+       os_memset(sm->pmk_r0, 0, sizeof(sm->pmk_r0));
+       os_memset(sm->pmk_r1, 0, sizeof(sm->pmk_r1));
+#endif /* CONFIG_IEEE80211R */
 }
-#endif /* CONFIG_TESTING_OPTIONS */
 
 
 int wpa_sm_has_ptk(struct wpa_sm *sm)