cfg80211: Fix Extended Key ID key install checks
Fix two shortcomings in the Extended Key ID API:
1) Allow the userspace to install pairwise keys using keyid 1 without
NL80211_KEY_NO_TX set. This allows the userspace to install and
activate pairwise keys with keyid 1 in the same way as for keyid 0,
simplifying the API usage for e.g. FILS and FT key installs.
2) IEEE 802.11 - 2016 restricts Extended Key ID usage to CCMP/GCMP
ciphers in IEEE 802.11 - 2016 "9.4.2.25.4 RSN capabilities".
Enforce that when installing a key.
Cc: stable@vger.kernel.org # 5.2
Fixes: 6cdd3979a2
("nl80211/cfg80211: Extended Key ID support")
Signed-off-by: Alexander Wetzel <alexander@wetzel-home.de>
Link: https://lore.kernel.org/r/20190805123400.51567-1-alexander@wetzel-home.de
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
5fd2f91ad4
commit
b67fd72e84
|
@ -233,25 +233,30 @@ int cfg80211_validate_key_settings(struct cfg80211_registered_device *rdev,
|
|||
|
||||
switch (params->cipher) {
|
||||
case WLAN_CIPHER_SUITE_TKIP:
|
||||
/* Extended Key ID can only be used with CCMP/GCMP ciphers */
|
||||
if ((pairwise && key_idx) ||
|
||||
params->mode != NL80211_KEY_RX_TX)
|
||||
return -EINVAL;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_CCMP:
|
||||
case WLAN_CIPHER_SUITE_CCMP_256:
|
||||
case WLAN_CIPHER_SUITE_GCMP:
|
||||
case WLAN_CIPHER_SUITE_GCMP_256:
|
||||
/* IEEE802.11-2016 allows only 0 and - when using Extended Key
|
||||
* ID - 1 as index for pairwise keys.
|
||||
/* IEEE802.11-2016 allows only 0 and - when supporting
|
||||
* Extended Key ID - 1 as index for pairwise keys.
|
||||
* @NL80211_KEY_NO_TX is only allowed for pairwise keys when
|
||||
* the driver supports Extended Key ID.
|
||||
* @NL80211_KEY_SET_TX can't be set when installing and
|
||||
* validating a key.
|
||||
*/
|
||||
if (params->mode == NL80211_KEY_NO_TX) {
|
||||
if (!wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_EXT_KEY_ID))
|
||||
if ((params->mode == NL80211_KEY_NO_TX && !pairwise) ||
|
||||
params->mode == NL80211_KEY_SET_TX)
|
||||
return -EINVAL;
|
||||
if (wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_EXT_KEY_ID)) {
|
||||
if (pairwise && (key_idx < 0 || key_idx > 1))
|
||||
return -EINVAL;
|
||||
else if (!pairwise || key_idx < 0 || key_idx > 1)
|
||||
return -EINVAL;
|
||||
} else if ((pairwise && key_idx) ||
|
||||
params->mode == NL80211_KEY_SET_TX) {
|
||||
} else if (pairwise && key_idx) {
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue