Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[platform/kernel/linux-starfive.git] / net / mac80211 / wep.c
index 3d9e928..b75c2c5 100644 (file)
@@ -27,30 +27,9 @@ int ieee80211_wep_init(struct ieee80211_local *local)
        /* start WEP IV from a random value */
        get_random_bytes(&local->wep_iv, IEEE80211_WEP_IV_LEN);
 
-       local->wep_tx_tfm = crypto_alloc_cipher("arc4", 0, 0);
-       if (IS_ERR(local->wep_tx_tfm)) {
-               local->wep_rx_tfm = ERR_PTR(-EINVAL);
-               return PTR_ERR(local->wep_tx_tfm);
-       }
-
-       local->wep_rx_tfm = crypto_alloc_cipher("arc4", 0, 0);
-       if (IS_ERR(local->wep_rx_tfm)) {
-               crypto_free_cipher(local->wep_tx_tfm);
-               local->wep_tx_tfm = ERR_PTR(-EINVAL);
-               return PTR_ERR(local->wep_rx_tfm);
-       }
-
        return 0;
 }
 
-void ieee80211_wep_free(struct ieee80211_local *local)
-{
-       if (!IS_ERR(local->wep_tx_tfm))
-               crypto_free_cipher(local->wep_tx_tfm);
-       if (!IS_ERR(local->wep_rx_tfm))
-               crypto_free_cipher(local->wep_rx_tfm);
-}
-
 static inline bool ieee80211_wep_weak_iv(u32 iv, int keylen)
 {
        /*
@@ -128,21 +107,17 @@ static void ieee80211_wep_remove_iv(struct ieee80211_local *local,
 /* Perform WEP encryption using given key. data buffer must have tailroom
  * for 4-byte ICV. data_len must not include this ICV. Note: this function
  * does _not_ add IV. data = RC4(data | CRC32(data)) */
-int ieee80211_wep_encrypt_data(struct crypto_cipher *tfm, u8 *rc4key,
+int ieee80211_wep_encrypt_data(struct arc4_ctx *ctx, u8 *rc4key,
                               size_t klen, u8 *data, size_t data_len)
 {
        __le32 icv;
-       int i;
-
-       if (IS_ERR(tfm))
-               return -1;
 
        icv = cpu_to_le32(~crc32_le(~0, data, data_len));
        put_unaligned(icv, (__le32 *)(data + data_len));
 
-       crypto_cipher_setkey(tfm, rc4key, klen);
-       for (i = 0; i < data_len + IEEE80211_WEP_ICV_LEN; i++)
-               crypto_cipher_encrypt_one(tfm, data + i, data + i);
+       arc4_setkey(ctx, rc4key, klen);
+       arc4_crypt(ctx, data, data, data_len + IEEE80211_WEP_ICV_LEN);
+       memzero_explicit(ctx, sizeof(*ctx));
 
        return 0;
 }
@@ -181,7 +156,7 @@ int ieee80211_wep_encrypt(struct ieee80211_local *local,
        /* Add room for ICV */
        skb_put(skb, IEEE80211_WEP_ICV_LEN);
 
-       return ieee80211_wep_encrypt_data(local->wep_tx_tfm, rc4key, keylen + 3,
+       return ieee80211_wep_encrypt_data(&local->wep_tx_ctx, rc4key, keylen + 3,
                                          iv + IEEE80211_WEP_IV_LEN, len);
 }
 
@@ -189,18 +164,14 @@ int ieee80211_wep_encrypt(struct ieee80211_local *local,
 /* Perform WEP decryption using given key. data buffer includes encrypted
  * payload, including 4-byte ICV, but _not_ IV. data_len must not include ICV.
  * Return 0 on success and -1 on ICV mismatch. */
-int ieee80211_wep_decrypt_data(struct crypto_cipher *tfm, u8 *rc4key,
+int ieee80211_wep_decrypt_data(struct arc4_ctx *ctx, u8 *rc4key,
                               size_t klen, u8 *data, size_t data_len)
 {
        __le32 crc;
-       int i;
-
-       if (IS_ERR(tfm))
-               return -1;
 
-       crypto_cipher_setkey(tfm, rc4key, klen);
-       for (i = 0; i < data_len + IEEE80211_WEP_ICV_LEN; i++)
-               crypto_cipher_decrypt_one(tfm, data + i, data + i);
+       arc4_setkey(ctx, rc4key, klen);
+       arc4_crypt(ctx, data, data, data_len + IEEE80211_WEP_ICV_LEN);
+       memzero_explicit(ctx, sizeof(*ctx));
 
        crc = cpu_to_le32(~crc32_le(~0, data, data_len));
        if (memcmp(&crc, data + data_len, IEEE80211_WEP_ICV_LEN) != 0)
@@ -253,7 +224,7 @@ static int ieee80211_wep_decrypt(struct ieee80211_local *local,
        /* Copy rest of the WEP key (the secret part) */
        memcpy(rc4key + 3, key->conf.key, key->conf.keylen);
 
-       if (ieee80211_wep_decrypt_data(local->wep_rx_tfm, rc4key, klen,
+       if (ieee80211_wep_decrypt_data(&local->wep_rx_ctx, rc4key, klen,
                                       skb->data + hdrlen +
                                       IEEE80211_WEP_IV_LEN, len))
                ret = -1;