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:
		
				
					committed by
					
						 Johannes Berg
						Johannes Berg
					
				
			
			
				
	
			
			
			
						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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user