staging: wfx: fix support for cipher AES_CMAC (multicast PMF)
authorJérôme Pouiller <jerome.pouiller@silabs.com>
Tue, 25 Aug 2020 08:58:21 +0000 (10:58 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 28 Aug 2020 10:19:50 +0000 (12:19 +0200)
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: Jérôme Pouiller <jerome.pouiller@silabs.com>
Link: https://lore.kernel.org/r/20200825085828.399505-5-Jerome.Pouiller@silabs.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/wfx/data_tx.c
drivers/staging/wfx/key.c

index 41f9afd41e145df70f315d697b5c76eb7ae46f9a..d16b516ad7cfec706e8d644cf356b4966a54894a 100644 (file)
@@ -325,6 +325,8 @@ static int wfx_tx_get_icv_len(struct ieee80211_key_conf *hw_key)
 
        if (!hw_key)
                return 0;
+       if (hw_key->cipher == WLAN_CIPHER_SUITE_AES_CMAC)
+               return 0;
        mic_space = (hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) ? 8 : 0;
        return hw_key->icv_len + mic_space;
 }
@@ -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));
        // Fill tx_priv
        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
        WARN(skb_headroom(skb) < wmsg_len, "not enough space in skb");
index 6165df59ecf9f23d49d15786e9bc5fd36510b9c1..728e5f8d3b7c5752780884e4adf438e51f8f2ebf 100644 (file)
@@ -198,8 +198,8 @@ static int wfx_add_key(struct wfx_vif *wvif, struct ieee80211_sta *sta,
                else
                        k.type = fill_sms4_group(&k.key.wapi_group_key, key);
        } else if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC) {
-               k.type = fill_aes_cmac_group(&k.key.igtk_group_key, key,
-                                            &seq);
+               k.type = fill_aes_cmac_group(&k.key.igtk_group_key, key, &seq);
+               key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIE;
        } else {
                dev_warn(wdev->dev, "unsupported key type %d\n", key->cipher);
                wfx_free_key(wdev, idx);