ath6kl: Add support for configuring SMS4 keys
authorDai Shuibing <shuibing@qca.qualcomm.com>
Thu, 3 Nov 2011 09:39:37 +0000 (11:39 +0200)
committerKalle Valo <kvalo@qca.qualcomm.com>
Sun, 13 Nov 2011 08:57:38 +0000 (10:57 +0200)
Indicate support for WPI-SMS4 cipher and allow SMS4 keys to be
configured.

Signed-off-by: Dai Shuibing <shuibing@qca.qualcomm.com>
Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath6kl/cfg80211.c
drivers/net/wireless/ath/ath6kl/common.h

index 4d1394a3dc190b66147ebb506c22e0c1e1261968..d2b23da8bdd69c039603458291a9806d5af6d9ed 100644 (file)
@@ -203,6 +203,10 @@ static int ath6kl_set_cipher(struct ath6kl_vif *vif, u32 cipher, bool ucast)
                *ar_cipher = AES_CRYPT;
                *ar_cipher_len = 0;
                break;
+       case WLAN_CIPHER_SUITE_SMS4:
+               *ar_cipher = WAPI_CRYPT;
+               *ar_cipher_len = 0;
+               break;
        default:
                ath6kl_err("cipher 0x%x not supported\n", cipher);
                return -ENOTSUPP;
@@ -935,13 +939,19 @@ static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
                key_usage = GROUP_USAGE;
 
        if (params) {
+               int seq_len = params->seq_len;
+               if (params->cipher == WLAN_CIPHER_SUITE_SMS4 &&
+                   seq_len > ATH6KL_KEY_SEQ_LEN) {
+                       /* Only first half of the WPI PN is configured */
+                       seq_len = ATH6KL_KEY_SEQ_LEN;
+               }
                if (params->key_len > WLAN_MAX_KEY_LEN ||
-                   params->seq_len > sizeof(key->seq))
+                   seq_len > sizeof(key->seq))
                        return -EINVAL;
 
                key->key_len = params->key_len;
                memcpy(key->key, params->key, key->key_len);
-               key->seq_len = params->seq_len;
+               key->seq_len = seq_len;
                memcpy(key->seq, params->seq, key->seq_len);
                key->cipher = params->cipher;
        }
@@ -959,6 +969,9 @@ static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
        case WLAN_CIPHER_SUITE_CCMP:
                key_type = AES_CRYPT;
                break;
+       case WLAN_CIPHER_SUITE_SMS4:
+               key_type = WAPI_CRYPT;
+               break;
 
        default:
                return -ENOTSUPP;
@@ -1451,6 +1464,7 @@ static const u32 cipher_suites[] = {
        WLAN_CIPHER_SUITE_TKIP,
        WLAN_CIPHER_SUITE_CCMP,
        CCKM_KRK_CIPHER_SUITE,
+       WLAN_CIPHER_SUITE_SMS4,
 };
 
 static bool is_rate_legacy(s32 rate)
index 41e465f29e6312afdde51bea46d39c84960abf2f..bfd6597763daa9dcb953aeb413cc5b62c68fcde4 100644 (file)
@@ -71,6 +71,7 @@ enum crypto_type {
        WEP_CRYPT           = 0x02,
        TKIP_CRYPT          = 0x04,
        AES_CRYPT           = 0x08,
+       WAPI_CRYPT          = 0x10,
 };
 
 struct htc_endpoint_credit_dist;