OSDN Git Service

iwlwifi: mvm: d3: support GCMP ciphers
authorJohannes Berg <johannes.berg@intel.com>
Wed, 30 Sep 2020 13:31:18 +0000 (16:31 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Thu, 1 Oct 2020 19:00:58 +0000 (22:00 +0300)
We really should support GCMP ciphers (both sizes) since
all the handling is identical to CCMP, except for the one
case where the key material is copied.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20200930161256.ec44673fae83.I8a9232600b99e27213eb9ea69bf46e8d25d7f260@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/d3.c

index f027029..5f6092d 100644 (file)
@@ -313,6 +313,8 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
                data->use_rsc_tsc = true;
                break;
        case WLAN_CIPHER_SUITE_CCMP:
+       case WLAN_CIPHER_SUITE_GCMP:
+       case WLAN_CIPHER_SUITE_GCMP_256:
                if (sta) {
                        u64 pn64;
 
@@ -1405,6 +1407,8 @@ static void iwl_mvm_set_key_rx_seq(struct iwl_mvm *mvm,
 
        switch (key->cipher) {
        case WLAN_CIPHER_SUITE_CCMP:
+       case WLAN_CIPHER_SUITE_GCMP:
+       case WLAN_CIPHER_SUITE_GCMP_256:
                iwl_mvm_set_aes_rx_seq(mvm, rsc->aes.multicast_rsc, NULL, key);
                break;
        case WLAN_CIPHER_SUITE_TKIP:
@@ -1441,6 +1445,8 @@ static void iwl_mvm_d3_update_keys(struct ieee80211_hw *hw,
                /* ignore WEP completely, nothing to do */
                return;
        case WLAN_CIPHER_SUITE_CCMP:
+       case WLAN_CIPHER_SUITE_GCMP:
+       case WLAN_CIPHER_SUITE_GCMP_256:
        case WLAN_CIPHER_SUITE_TKIP:
                /* we support these */
                break;
@@ -1466,6 +1472,8 @@ static void iwl_mvm_d3_update_keys(struct ieee80211_hw *hw,
 
                switch (key->cipher) {
                case WLAN_CIPHER_SUITE_CCMP:
+               case WLAN_CIPHER_SUITE_GCMP:
+               case WLAN_CIPHER_SUITE_GCMP_256:
                        iwl_mvm_set_aes_rx_seq(data->mvm, sc->aes.unicast_rsc,
                                               sta, key);
                        atomic64_set(&key->tx_pn, le64_to_cpu(sc->aes.tsc.pn));
@@ -1548,11 +1556,21 @@ static bool iwl_mvm_setup_connection_keep(struct iwl_mvm *mvm,
 
                switch (gtkdata.cipher) {
                case WLAN_CIPHER_SUITE_CCMP:
+               case WLAN_CIPHER_SUITE_GCMP:
+                       BUILD_BUG_ON(WLAN_KEY_LEN_CCMP != WLAN_KEY_LEN_GCMP);
+                       BUILD_BUG_ON(sizeof(conf.key) < WLAN_KEY_LEN_CCMP);
                        conf.conf.keylen = WLAN_KEY_LEN_CCMP;
                        memcpy(conf.conf.key, status->gtk[0].key,
                               WLAN_KEY_LEN_CCMP);
                        break;
+               case WLAN_CIPHER_SUITE_GCMP_256:
+                       BUILD_BUG_ON(sizeof(conf.key) < WLAN_KEY_LEN_GCMP_256);
+                       conf.conf.keylen = WLAN_KEY_LEN_GCMP_256;
+                       memcpy(conf.conf.key, status->gtk[0].key,
+                              WLAN_KEY_LEN_GCMP_256);
+                       break;
                case WLAN_CIPHER_SUITE_TKIP:
+                       BUILD_BUG_ON(sizeof(conf.key) < WLAN_KEY_LEN_TKIP);
                        conf.conf.keylen = WLAN_KEY_LEN_TKIP;
                        memcpy(conf.conf.key, status->gtk[0].key, 16);
                        /* leave TX MIC key zeroed, we don't use it anyway */