wifi: cfg80211: Support 32 bytes KCK key in GTK rekey offload
authorShivani Baranwal <quic_shivbara@quicinc.com>
Tue, 6 Dec 2022 14:37:15 +0000 (20:07 +0530)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 18 Jan 2023 16:31:50 +0000 (17:31 +0100)
Currently, maximum KCK key length supported for GTK rekey offload is 24
bytes but with some newer AKMs the KCK key length can be 32 bytes. e.g.,
00-0F-AC:24 AKM suite with SAE finite cyclic group 21. Add support to
allow 32 bytes KCK keys in GTK rekey offload.

Signed-off-by: Shivani Baranwal <quic_shivbara@quicinc.com>
Signed-off-by: Veerendranath Jakkam <quic_vjakkam@quicinc.com>
Link: https://lore.kernel.org/r/20221206143715.1802987-3-quic_vjakkam@quicinc.com
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
include/uapi/linux/nl80211.h
net/wireless/nl80211.c

index 1f8f827290a2bd1dc1795bb187e48ec9ecffd7e2..f96db7ad64f101edefad1bdb6748dd9d69b9d746 100644 (file)
@@ -4682,6 +4682,7 @@ struct cfg80211_ops {
  *     in order to not have them reachable in normal drivers, until we have
  *     complete feature/interface combinations/etc. advertisement. No driver
  *     should set this flag for now.
+ * @WIPHY_FLAG_SUPPORTS_EXT_KCK_32: The device supports 32-byte KCK keys.
  */
 enum wiphy_flags {
        WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK         = BIT(0),
@@ -4694,7 +4695,7 @@ enum wiphy_flags {
        WIPHY_FLAG_CONTROL_PORT_PROTOCOL        = BIT(7),
        WIPHY_FLAG_IBSS_RSN                     = BIT(8),
        WIPHY_FLAG_MESH_AUTH                    = BIT(10),
-       /* use hole at 11 */
+       WIPHY_FLAG_SUPPORTS_EXT_KCK_32          = BIT(11),
        /* use hole at 12 */
        WIPHY_FLAG_SUPPORTS_FW_ROAM             = BIT(13),
        WIPHY_FLAG_AP_UAPSD                     = BIT(14),
index c14a91bbca7c9e6000978174becfa3e52982d1d2..429bdc39996298b61fd7366dae623ce1d8dccc1f 100644 (file)
@@ -5869,6 +5869,7 @@ enum plink_actions {
 #define NL80211_KEK_LEN                        16
 #define NL80211_KCK_EXT_LEN            24
 #define NL80211_KEK_EXT_LEN            32
+#define NL80211_KCK_EXT_LEN_32         32
 #define NL80211_REPLAY_CTR_LEN         8
 
 /**
index 02b9a0280896cb702f9fc66347a8f643f6e752a0..64cf6110ce9db5f778f3a2199c6fe5e3a8d9c018 100644 (file)
@@ -883,7 +883,7 @@ nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = {
        },
        [NL80211_REKEY_DATA_KCK] = {
                .type = NLA_BINARY,
-               .len = NL80211_KCK_EXT_LEN
+               .len = NL80211_KCK_EXT_LEN_32
        },
        [NL80211_REKEY_DATA_REPLAY_CTR] = NLA_POLICY_EXACT_LEN(NL80211_REPLAY_CTR_LEN),
        [NL80211_REKEY_DATA_AKM] = { .type = NLA_U32 },
@@ -13809,7 +13809,9 @@ static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info)
                return -ERANGE;
        if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN &&
            !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK &&
-             nla_len(tb[NL80211_REKEY_DATA_KCK]) == NL80211_KCK_EXT_LEN))
+             nla_len(tb[NL80211_REKEY_DATA_KCK]) == NL80211_KCK_EXT_LEN) &&
+            !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KCK_32 &&
+              nla_len(tb[NL80211_REKEY_DATA_KCK]) == NL80211_KCK_EXT_LEN_32))
                return -ERANGE;
 
        rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]);