mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
ANDROID: GKI: cfg80211: Include length of kek in rekey data
With support for new AKM suites (example FILS-SHA256), the KEK length can now be more than NL80211_KEK_LEN and the KCK length can be zero. Add changes in cfg80211 to specify the length of KEK, and make KCK optional. Make NL80211_REKEY_DATA_KEK as NLA_BINARY to enforce a maximum length check. Also add macro CFG80211_REKEY_DATA_KEK_LEN to indicate support for including KEK length in rekey data. CRs-Fixed: 2087759 Change-Id: Ica8dbb8614e0a9c3905e125b4a5254e43821984e Signed-off-by: Vidyullatha Kanchanapally <vidyullatha@codeaurora.org> Signed-off-by: Ankita Bajaj <bankita@codeaurora.org> Signed-off-by: Hardik Kantilal Patel <hkpatel@codeaurora.org> (cherry picked from commit 1daf1a378a61ab77a9497e81b1c0de2bbeca70c1) Bug: 154523213 Signed-off-by: Connor O'Brien <connoro@google.com>
This commit is contained in:
committed by
Connor O'Brien
parent
b93e441e0d
commit
f18ae83998
@@ -25,6 +25,9 @@
|
||||
#include <linux/net.h>
|
||||
#include <net/regulatory.h>
|
||||
|
||||
/* Indicate support for including KEK length in rekey data */
|
||||
#define CFG80211_REKEY_DATA_KEK_LEN 1
|
||||
|
||||
/**
|
||||
* DOC: Introduction
|
||||
*
|
||||
@@ -2671,12 +2674,14 @@ struct cfg80211_wowlan_wakeup {
|
||||
|
||||
/**
|
||||
* struct cfg80211_gtk_rekey_data - rekey data
|
||||
* @kek: key encryption key (NL80211_KEK_LEN bytes)
|
||||
* @kek: key encryption key
|
||||
* @kck: key confirmation key (NL80211_KCK_LEN bytes)
|
||||
* @replay_ctr: replay counter (NL80211_REPLAY_CTR_LEN bytes)
|
||||
* @kek_len: Length of @kek in octets
|
||||
*/
|
||||
struct cfg80211_gtk_rekey_data {
|
||||
const u8 *kek, *kck, *replay_ctr;
|
||||
size_t kek_len;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -539,7 +539,8 @@ nl80211_coalesce_policy[NUM_NL80211_ATTR_COALESCE_RULE] = {
|
||||
/* policy for GTK rekey offload attributes */
|
||||
static const struct nla_policy
|
||||
nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = {
|
||||
[NL80211_REKEY_DATA_KEK] = { .len = NL80211_KEK_LEN },
|
||||
[NL80211_REKEY_DATA_KEK] = { .type = NLA_BINARY,
|
||||
.len = FILS_MAX_KEK_LEN },
|
||||
[NL80211_REKEY_DATA_KCK] = { .len = NL80211_KCK_LEN },
|
||||
[NL80211_REKEY_DATA_REPLAY_CTR] = { .len = NL80211_REPLAY_CTR_LEN },
|
||||
};
|
||||
@@ -11625,15 +11626,27 @@ static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info)
|
||||
if (!tb[NL80211_REKEY_DATA_REPLAY_CTR] || !tb[NL80211_REKEY_DATA_KEK] ||
|
||||
!tb[NL80211_REKEY_DATA_KCK])
|
||||
return -EINVAL;
|
||||
if (!tb[NL80211_REKEY_DATA_KEK] || !tb[NL80211_REKEY_DATA_REPLAY_CTR] ||
|
||||
(!wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) &&
|
||||
!wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_FILS_STA) &&
|
||||
!tb[NL80211_REKEY_DATA_KCK]))
|
||||
return -EINVAL;
|
||||
|
||||
if (nla_len(tb[NL80211_REKEY_DATA_REPLAY_CTR]) != NL80211_REPLAY_CTR_LEN)
|
||||
return -ERANGE;
|
||||
if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN)
|
||||
if (nla_len(tb[NL80211_REKEY_DATA_KEK]) < NL80211_KEK_LEN)
|
||||
return -ERANGE;
|
||||
if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN)
|
||||
if (tb[NL80211_REKEY_DATA_KCK] &&
|
||||
nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN)
|
||||
return -ERANGE;
|
||||
|
||||
memset(&rekey_data, 0, sizeof(rekey_data));
|
||||
rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]);
|
||||
rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]);
|
||||
rekey_data.kek_len = nla_len(tb[NL80211_REKEY_DATA_KEK]);
|
||||
if (tb[NL80211_REKEY_DATA_KCK])
|
||||
rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]);
|
||||
rekey_data.replay_ctr = nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]);
|
||||
|
||||
wdev_lock(wdev);
|
||||
|
||||
Reference in New Issue
Block a user