DPP2: PFS for PTK derivation
Use Diffie-Hellman key exchange to derivate additional material for PMK-to-PTK derivation to get PFS. The Diffie-Hellman Parameter element (defined in OWE RFC 8110) is used in association frames to exchange the DH public keys. For backwards compatibility, ignore missing request/response DH parameter and fall back to no PFS in such cases. Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
This commit is contained in:
parent
ecacd9ccd4
commit
10ec6a5f38
17 changed files with 330 additions and 2 deletions
|
@ -2638,6 +2638,8 @@ void wpas_dpp_deinit(struct wpa_supplicant *wpa_s)
|
|||
eloop_cancel_timeout(wpas_dpp_auth_resp_retry_timeout, wpa_s, NULL);
|
||||
#ifdef CONFIG_DPP2
|
||||
eloop_cancel_timeout(wpas_dpp_config_result_wait_timeout, wpa_s, NULL);
|
||||
dpp_pfs_free(wpa_s->dpp_pfs);
|
||||
wpa_s->dpp_pfs = NULL;
|
||||
#endif /* CONFIG_DPP2 */
|
||||
offchannel_send_action_done(wpa_s);
|
||||
wpas_dpp_listen_stop(wpa_s);
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include "common/ieee802_11_defs.h"
|
||||
#include "common/ieee802_11_common.h"
|
||||
#include "common/gas_server.h"
|
||||
#include "common/dpp.h"
|
||||
#include "crypto/random.h"
|
||||
#include "blacklist.h"
|
||||
#include "wpas_glue.h"
|
||||
|
@ -2498,6 +2499,28 @@ static int wpa_supplicant_event_associnfo(struct wpa_supplicant *wpa_s,
|
|||
}
|
||||
#endif /* CONFIG_OWE */
|
||||
|
||||
#ifdef CONFIG_DPP2
|
||||
wpa_sm_set_dpp_z(wpa_s->wpa, NULL);
|
||||
if (wpa_s->key_mgmt == WPA_KEY_MGMT_DPP && wpa_s->dpp_pfs) {
|
||||
struct ieee802_11_elems elems;
|
||||
|
||||
if (ieee802_11_parse_elems(data->assoc_info.resp_ies,
|
||||
data->assoc_info.resp_ies_len,
|
||||
&elems, 0) == ParseFailed ||
|
||||
!elems.owe_dh)
|
||||
goto no_pfs;
|
||||
if (dpp_pfs_process(wpa_s->dpp_pfs, elems.owe_dh,
|
||||
elems.owe_dh_len) < 0) {
|
||||
wpa_supplicant_deauthenticate(wpa_s,
|
||||
WLAN_REASON_UNSPECIFIED);
|
||||
return -1;
|
||||
}
|
||||
|
||||
wpa_sm_set_dpp_z(wpa_s->wpa, wpa_s->dpp_pfs->secret);
|
||||
}
|
||||
no_pfs:
|
||||
#endif /* CONFIG_DPP2 */
|
||||
|
||||
#ifdef CONFIG_IEEE80211R
|
||||
#ifdef CONFIG_SME
|
||||
if (wpa_s->sme.auth_alg == WPA_AUTH_ALG_FT) {
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include "eapol_supp/eapol_supp_sm.h"
|
||||
#include "common/wpa_common.h"
|
||||
#include "common/sae.h"
|
||||
#include "common/dpp.h"
|
||||
#include "rsn_supp/wpa.h"
|
||||
#include "rsn_supp/pmksa_cache.h"
|
||||
#include "config.h"
|
||||
|
@ -1571,6 +1572,36 @@ void sme_associate(struct wpa_supplicant *wpa_s, enum wpas_mode mode,
|
|||
}
|
||||
#endif /* CONFIG_OWE */
|
||||
|
||||
#ifdef CONFIG_DPP2
|
||||
if (wpa_s->key_mgmt == WPA_KEY_MGMT_DPP && wpa_s->current_ssid &&
|
||||
wpa_s->current_ssid->dpp_netaccesskey) {
|
||||
struct wpa_ssid *ssid = wpa_s->current_ssid;
|
||||
|
||||
dpp_pfs_free(wpa_s->dpp_pfs);
|
||||
wpa_s->dpp_pfs = dpp_pfs_init(ssid->dpp_netaccesskey,
|
||||
ssid->dpp_netaccesskey_len);
|
||||
if (!wpa_s->dpp_pfs) {
|
||||
wpa_printf(MSG_DEBUG, "DPP: Could not initialize PFS");
|
||||
/* Try to continue without PFS */
|
||||
goto pfs_fail;
|
||||
}
|
||||
if (wpa_s->sme.assoc_req_ie_len +
|
||||
wpabuf_len(wpa_s->dpp_pfs->ie) >
|
||||
sizeof(wpa_s->sme.assoc_req_ie)) {
|
||||
wpa_printf(MSG_ERROR,
|
||||
"DPP: Not enough buffer room for own Association Request frame elements");
|
||||
dpp_pfs_free(wpa_s->dpp_pfs);
|
||||
wpa_s->dpp_pfs = NULL;
|
||||
goto pfs_fail;
|
||||
}
|
||||
os_memcpy(wpa_s->sme.assoc_req_ie + wpa_s->sme.assoc_req_ie_len,
|
||||
wpabuf_head(wpa_s->dpp_pfs->ie),
|
||||
wpabuf_len(wpa_s->dpp_pfs->ie));
|
||||
wpa_s->sme.assoc_req_ie_len += wpabuf_len(wpa_s->dpp_pfs->ie);
|
||||
}
|
||||
pfs_fail:
|
||||
#endif /* CONFIG_DPP2 */
|
||||
|
||||
if (wpa_s->current_ssid && wpa_s->current_ssid->multi_ap_backhaul_sta) {
|
||||
size_t multi_ap_ie_len;
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include "common/ieee802_11_defs.h"
|
||||
#include "common/hw_features_common.h"
|
||||
#include "common/gas_server.h"
|
||||
#include "common/dpp.h"
|
||||
#include "p2p/p2p.h"
|
||||
#include "fst/fst.h"
|
||||
#include "blacklist.h"
|
||||
|
@ -2832,6 +2833,28 @@ static u8 * wpas_populate_assoc_ies(
|
|||
}
|
||||
#endif /* CONFIG_OWE */
|
||||
|
||||
#ifdef CONFIG_DPP2
|
||||
if (wpa_sm_get_key_mgmt(wpa_s->wpa) == WPA_KEY_MGMT_DPP &&
|
||||
ssid->dpp_netaccesskey) {
|
||||
dpp_pfs_free(wpa_s->dpp_pfs);
|
||||
wpa_s->dpp_pfs = dpp_pfs_init(ssid->dpp_netaccesskey,
|
||||
ssid->dpp_netaccesskey_len);
|
||||
if (!wpa_s->dpp_pfs) {
|
||||
wpa_printf(MSG_DEBUG, "DPP: Could not initialize PFS");
|
||||
/* Try to continue without PFS */
|
||||
goto pfs_fail;
|
||||
}
|
||||
if (wpabuf_len(wpa_s->dpp_pfs->ie) <=
|
||||
max_wpa_ie_len - wpa_ie_len) {
|
||||
os_memcpy(wpa_ie + wpa_ie_len,
|
||||
wpabuf_head(wpa_s->dpp_pfs->ie),
|
||||
wpabuf_len(wpa_s->dpp_pfs->ie));
|
||||
wpa_ie_len += wpabuf_len(wpa_s->dpp_pfs->ie);
|
||||
}
|
||||
}
|
||||
pfs_fail:
|
||||
#endif /* CONFIG_DPP2 */
|
||||
|
||||
#ifdef CONFIG_IEEE80211R
|
||||
/*
|
||||
* Add MDIE under these conditions: the network profile allows FT,
|
||||
|
|
|
@ -1236,6 +1236,9 @@ struct wpa_supplicant {
|
|||
unsigned int dpp_resp_wait_time;
|
||||
unsigned int dpp_resp_max_tries;
|
||||
unsigned int dpp_resp_retry_time;
|
||||
#ifdef CONFIG_DPP2
|
||||
struct dpp_pfs *dpp_pfs;
|
||||
#endif /* CONFIG_DPP2 */
|
||||
#ifdef CONFIG_TESTING_OPTIONS
|
||||
char *dpp_config_obj_override;
|
||||
char *dpp_discovery_override;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue