]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
SAE: Clear keys from memory on disassociation
authorJouni Malinen <j@w1.fi>
Mon, 29 Dec 2014 16:40:10 +0000 (18:40 +0200)
committerJouni Malinen <j@w1.fi>
Mon, 29 Dec 2014 18:00:02 +0000 (20:00 +0200)
There is no need to keep temporary keys in memory beyond the end of the
association, so explicitly clear any SAE buffers that can contain keys
as soon as such keys are not needed.

Signed-off-by: Jouni Malinen <j@w1.fi>
src/common/sae.c
wpa_supplicant/events.c
wpa_supplicant/sme.c
wpa_supplicant/sme.h

index 87d49b63069e054bff84cb0334fed2a79ee373bb..588895808fde2bd01cc8f96b0c96f6e0589d0121 100644 (file)
@@ -88,7 +88,7 @@ void sae_clear_temp_data(struct sae_data *sae)
        crypto_ec_point_deinit(tmp->own_commit_element_ecc, 0);
        crypto_ec_point_deinit(tmp->peer_commit_element_ecc, 0);
        wpabuf_free(tmp->anti_clogging_token);
-       os_free(sae->tmp);
+       bin_clear_free(tmp, sizeof(*tmp));
        sae->tmp = NULL;
 }
 
@@ -624,8 +624,10 @@ static int sae_derive_keys(struct sae_data *sae, const u8 *k)
        wpa_hexdump(MSG_DEBUG, "SAE: PMKID", val, SAE_PMKID_LEN);
        sha256_prf(keyseed, sizeof(keyseed), "SAE KCK and PMK",
                   val, sae->tmp->prime_len, keys, sizeof(keys));
+       os_memset(keyseed, 0, sizeof(keyseed));
        os_memcpy(sae->tmp->kck, keys, SAE_KCK_LEN);
        os_memcpy(sae->pmk, keys + SAE_KCK_LEN, SAE_PMK_LEN);
+       os_memset(keys, 0, sizeof(keys));
        wpa_hexdump_key(MSG_DEBUG, "SAE: KCK", sae->tmp->kck, SAE_KCK_LEN);
        wpa_hexdump_key(MSG_DEBUG, "SAE: PMK", sae->pmk, SAE_PMK_LEN);
 
index 5ef64e65fe1532416afc80aee16474a495650dd3..7fe92ea871075c60ec27cc5f2e85d08c751ba090 100644 (file)
@@ -202,20 +202,12 @@ void wpa_supplicant_mark_disassoc(struct wpa_supplicant *wpa_s)
        bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
        os_memset(wpa_s->bssid, 0, ETH_ALEN);
        os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
-#ifdef CONFIG_SME
-       wpa_s->sme.prev_bssid_set = 0;
-#endif /* CONFIG_SME */
+       sme_clear_on_disassoc(wpa_s);
 #ifdef CONFIG_P2P
        os_memset(wpa_s->go_dev_addr, 0, ETH_ALEN);
 #endif /* CONFIG_P2P */
        wpa_s->current_bss = NULL;
        wpa_s->assoc_freq = 0;
-#ifdef CONFIG_IEEE80211R
-#ifdef CONFIG_SME
-       if (wpa_s->sme.ft_ies)
-               sme_update_ft_ies(wpa_s, NULL, NULL, 0);
-#endif /* CONFIG_SME */
-#endif /* CONFIG_IEEE80211R */
 
        if (bssid_changed)
                wpas_notify_bssid_changed(wpa_s);
index 53caadebb214f01f4b674aad32cf245a608cc038..80c280a1ed38de3106a60aac283f5235be88adf8 100644 (file)
@@ -1099,6 +1099,21 @@ void sme_disassoc_while_authenticating(struct wpa_supplicant *wpa_s,
 }
 
 
+void sme_clear_on_disassoc(struct wpa_supplicant *wpa_s)
+{
+       wpa_s->sme.prev_bssid_set = 0;
+#ifdef CONFIG_SAE
+       wpabuf_free(wpa_s->sme.sae_token);
+       wpa_s->sme.sae_token = NULL;
+       sae_clear_data(&wpa_s->sme.sae);
+#endif /* CONFIG_SAE */
+#ifdef CONFIG_IEEE80211R
+       if (wpa_s->sme.ft_ies)
+               sme_update_ft_ies(wpa_s, NULL, NULL, 0);
+#endif /* CONFIG_IEEE80211R */
+}
+
+
 void sme_deinit(struct wpa_supplicant *wpa_s)
 {
        os_free(wpa_s->sme.ft_ies);
@@ -1107,11 +1122,7 @@ void sme_deinit(struct wpa_supplicant *wpa_s)
 #ifdef CONFIG_IEEE80211W
        sme_stop_sa_query(wpa_s);
 #endif /* CONFIG_IEEE80211W */
-#ifdef CONFIG_SAE
-       wpabuf_free(wpa_s->sme.sae_token);
-       wpa_s->sme.sae_token = NULL;
-       sae_clear_data(&wpa_s->sme.sae);
-#endif /* CONFIG_SAE */
+       sme_clear_on_disassoc(wpa_s);
 
        eloop_cancel_timeout(sme_assoc_timer, wpa_s, NULL);
        eloop_cancel_timeout(sme_auth_timer, wpa_s, NULL);
index 04404c184d34427707af6d453ee0452cf66117fa..fd5c3b4e1ed8315cfec1e1afb339fa9b6940314b 100644 (file)
@@ -33,6 +33,7 @@ void sme_sa_query_rx(struct wpa_supplicant *wpa_s, const u8 *sa,
 void sme_state_changed(struct wpa_supplicant *wpa_s);
 void sme_disassoc_while_authenticating(struct wpa_supplicant *wpa_s,
                                       const u8 *prev_pending_bssid);
+void sme_clear_on_disassoc(struct wpa_supplicant *wpa_s);
 void sme_deinit(struct wpa_supplicant *wpa_s);
 
 int sme_proc_obss_scan(struct wpa_supplicant *wpa_s);
@@ -94,6 +95,10 @@ sme_disassoc_while_authenticating(struct wpa_supplicant *wpa_s,
 {
 }
 
+static inline void sme_clear_on_disassoc(struct wpa_supplicant *wpa_s)
+{
+}
+
 static inline void sme_deinit(struct wpa_supplicant *wpa_s)
 {
 }