]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - net/wireless/util.c
Merge tag 'mac80211-next-for-davem-2019-04-26' of git://git.kernel.org/pub/scm/linux...
[linux.git] / net / wireless / util.c
index 75899b62bdc9ed2116a1420a6035c904307f4838..cf63b635afc098eeafe7462bd41b86a7e433b85c 100644 (file)
@@ -237,14 +237,23 @@ int cfg80211_validate_key_settings(struct cfg80211_registered_device *rdev,
        case WLAN_CIPHER_SUITE_CCMP_256:
        case WLAN_CIPHER_SUITE_GCMP:
        case WLAN_CIPHER_SUITE_GCMP_256:
-               /* Disallow pairwise keys with non-zero index unless it's WEP
-                * or a vendor specific cipher (because current deployments use
-                * pairwise WEP keys with non-zero indices and for vendor
-                * specific ciphers this should be validated in the driver or
-                * hardware level - but 802.11i clearly specifies to use zero)
+               /* IEEE802.11-2016 allows only 0 and - when using 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 (pairwise && key_idx)
+               if (params->mode == NL80211_KEY_NO_TX) {
+                       if (!wiphy_ext_feature_isset(&rdev->wiphy,
+                                                    NL80211_EXT_FEATURE_EXT_KEY_ID))
+                               return -EINVAL;
+                       else if (!pairwise || key_idx < 0 || key_idx > 1)
+                               return -EINVAL;
+               } else if ((pairwise && key_idx) ||
+                          params->mode == NL80211_KEY_SET_TX) {
                        return -EINVAL;
+               }
                break;
        case WLAN_CIPHER_SUITE_AES_CMAC:
        case WLAN_CIPHER_SUITE_BIP_CMAC_256: