Commit 0a3279d3 authored by Jérôme Pouiller's avatar Jérôme Pouiller Committed by Greg Kroah-Hartman

staging: wfx: fix support for cipher AES_CMAC (multicast PMF)

When MFP is enabled, the multicast management frames are not protected,
in fact. Instead, but they should include an IE containing the MMIC of
the frames (i.e. a cryptographic signature).

Until now, the driver didn't correctly detect this kind of frames (they
are not marked protected but they are associated to a key) and didn't
ask to the device to encrypt them.

In add, the device is not able to generate the IE itself. Mac80211 has
to generate the IE and let the device compute the MMIC.
Signed-off-by: default avatarJérôme Pouiller <jerome.pouiller@silabs.com>
Link: https://lore.kernel.org/r/20200825085828.399505-5-Jerome.Pouiller@silabs.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 152df506
...@@ -325,6 +325,8 @@ static int wfx_tx_get_icv_len(struct ieee80211_key_conf *hw_key) ...@@ -325,6 +325,8 @@ static int wfx_tx_get_icv_len(struct ieee80211_key_conf *hw_key)
if (!hw_key) if (!hw_key)
return 0; return 0;
if (hw_key->cipher == WLAN_CIPHER_SUITE_AES_CMAC)
return 0;
mic_space = (hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) ? 8 : 0; mic_space = (hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) ? 8 : 0;
return hw_key->icv_len + mic_space; return hw_key->icv_len + mic_space;
} }
...@@ -350,8 +352,7 @@ static int wfx_tx_inner(struct wfx_vif *wvif, struct ieee80211_sta *sta, ...@@ -350,8 +352,7 @@ static int wfx_tx_inner(struct wfx_vif *wvif, struct ieee80211_sta *sta,
memset(tx_info->rate_driver_data, 0, sizeof(struct wfx_tx_priv)); memset(tx_info->rate_driver_data, 0, sizeof(struct wfx_tx_priv));
// Fill tx_priv // Fill tx_priv
tx_priv = (struct wfx_tx_priv *)tx_info->rate_driver_data; tx_priv = (struct wfx_tx_priv *)tx_info->rate_driver_data;
if (ieee80211_has_protected(hdr->frame_control)) tx_priv->hw_key = hw_key;
tx_priv->hw_key = hw_key;
// Fill hif_msg // Fill hif_msg
WARN(skb_headroom(skb) < wmsg_len, "not enough space in skb"); WARN(skb_headroom(skb) < wmsg_len, "not enough space in skb");
......
...@@ -198,8 +198,8 @@ static int wfx_add_key(struct wfx_vif *wvif, struct ieee80211_sta *sta, ...@@ -198,8 +198,8 @@ static int wfx_add_key(struct wfx_vif *wvif, struct ieee80211_sta *sta,
else else
k.type = fill_sms4_group(&k.key.wapi_group_key, key); k.type = fill_sms4_group(&k.key.wapi_group_key, key);
} else if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC) { } else if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC) {
k.type = fill_aes_cmac_group(&k.key.igtk_group_key, key, k.type = fill_aes_cmac_group(&k.key.igtk_group_key, key, &seq);
&seq); key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIE;
} else { } else {
dev_warn(wdev->dev, "unsupported key type %d\n", key->cipher); dev_warn(wdev->dev, "unsupported key type %d\n", key->cipher);
wfx_free_key(wdev, idx); wfx_free_key(wdev, idx);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment