From 0c98b6b2d2d5cc9c9f741c4a5ea85b668ac81e27 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Fri, 25 Mar 2011 21:28:22 +0000 Subject: [PATCH] mac80211: add a pending patch to remove the dependency on ecb SVN-Revision: 26295 --- .../mac80211/patches/300-pending_work.patch | 158 ++++++++++++++++++ 1 file changed, 158 insertions(+) diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch index 40fd32db26..4cd18b4c71 100644 --- a/package/mac80211/patches/300-pending_work.patch +++ b/package/mac80211/patches/300-pending_work.patch @@ -84,3 +84,161 @@ } static void +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -814,8 +814,8 @@ struct ieee80211_local { + + struct rate_control_ref *rate_ctrl; + +- struct crypto_blkcipher *wep_tx_tfm; +- struct crypto_blkcipher *wep_rx_tfm; ++ struct crypto_cipher *wep_tx_tfm; ++ struct crypto_cipher *wep_rx_tfm; + u32 wep_iv; + + /* see iface.c */ +--- a/net/mac80211/tkip.c ++++ b/net/mac80211/tkip.c +@@ -202,7 +202,7 @@ EXPORT_SYMBOL(ieee80211_get_tkip_key); + * @payload_len is the length of payload (_not_ including IV/ICV length). + * @ta is the transmitter addresses. + */ +-int ieee80211_tkip_encrypt_data(struct crypto_blkcipher *tfm, ++int ieee80211_tkip_encrypt_data(struct crypto_cipher *tfm, + struct ieee80211_key *key, + u8 *pos, size_t payload_len, u8 *ta) + { +@@ -223,7 +223,7 @@ int ieee80211_tkip_encrypt_data(struct c + * beginning of the buffer containing IEEE 802.11 header payload, i.e., + * including IV, Ext. IV, real data, Michael MIC, ICV. @payload_len is the + * length of payload, including IV, Ext. IV, MIC, ICV. */ +-int ieee80211_tkip_decrypt_data(struct crypto_blkcipher *tfm, ++int ieee80211_tkip_decrypt_data(struct crypto_cipher *tfm, + struct ieee80211_key *key, + u8 *payload, size_t payload_len, u8 *ta, + u8 *ra, int only_iv, int queue, +--- a/net/mac80211/tkip.h ++++ b/net/mac80211/tkip.h +@@ -15,7 +15,7 @@ + + u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key, u16 iv16); + +-int ieee80211_tkip_encrypt_data(struct crypto_blkcipher *tfm, ++int ieee80211_tkip_encrypt_data(struct crypto_cipher *tfm, + struct ieee80211_key *key, + u8 *pos, size_t payload_len, u8 *ta); + enum { +@@ -24,7 +24,7 @@ enum { + TKIP_DECRYPT_INVALID_KEYIDX = -2, + TKIP_DECRYPT_REPLAY = -3, + }; +-int ieee80211_tkip_decrypt_data(struct crypto_blkcipher *tfm, ++int ieee80211_tkip_decrypt_data(struct crypto_cipher *tfm, + struct ieee80211_key *key, + u8 *payload, size_t payload_len, u8 *ta, + u8 *ra, int only_iv, int queue, +--- a/net/mac80211/wep.c ++++ b/net/mac80211/wep.c +@@ -30,17 +30,15 @@ int ieee80211_wep_init(struct ieee80211_ + /* start WEP IV from a random value */ + get_random_bytes(&local->wep_iv, WEP_IV_LEN); + +- local->wep_tx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, +- CRYPTO_ALG_ASYNC); ++ local->wep_tx_tfm = crypto_alloc_cipher("arc4", 0, CRYPTO_ALG_ASYNC); + 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_blkcipher("ecb(arc4)", 0, +- CRYPTO_ALG_ASYNC); ++ local->wep_rx_tfm = crypto_alloc_cipher("arc4", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(local->wep_rx_tfm)) { +- crypto_free_blkcipher(local->wep_tx_tfm); ++ crypto_free_cipher(local->wep_tx_tfm); + local->wep_tx_tfm = ERR_PTR(-EINVAL); + return PTR_ERR(local->wep_rx_tfm); + } +@@ -51,9 +49,9 @@ int ieee80211_wep_init(struct ieee80211_ + void ieee80211_wep_free(struct ieee80211_local *local) + { + if (!IS_ERR(local->wep_tx_tfm)) +- crypto_free_blkcipher(local->wep_tx_tfm); ++ crypto_free_cipher(local->wep_tx_tfm); + if (!IS_ERR(local->wep_rx_tfm)) +- crypto_free_blkcipher(local->wep_rx_tfm); ++ crypto_free_cipher(local->wep_rx_tfm); + } + + static inline bool ieee80211_wep_weak_iv(u32 iv, int keylen) +@@ -127,12 +125,11 @@ static void ieee80211_wep_remove_iv(stru + /* 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_blkcipher *tfm, u8 *rc4key, ++int ieee80211_wep_encrypt_data(struct crypto_cipher *tfm, u8 *rc4key, + size_t klen, u8 *data, size_t data_len) + { +- struct blkcipher_desc desc = { .tfm = tfm }; +- struct scatterlist sg; + __le32 icv; ++ int i; + + if (IS_ERR(tfm)) + return -1; +@@ -140,9 +137,9 @@ int ieee80211_wep_encrypt_data(struct cr + icv = cpu_to_le32(~crc32_le(~0, data, data_len)); + put_unaligned(icv, (__le32 *)(data + data_len)); + +- crypto_blkcipher_setkey(tfm, rc4key, klen); +- sg_init_one(&sg, data, data_len + WEP_ICV_LEN); +- crypto_blkcipher_encrypt(&desc, &sg, &sg, sg.length); ++ crypto_cipher_setkey(tfm, rc4key, klen); ++ for (i = 0; i < data_len + WEP_ICV_LEN; i++) ++ crypto_cipher_encrypt_one(tfm, data + i, data + i); + + return 0; + } +@@ -186,19 +183,18 @@ int ieee80211_wep_encrypt(struct ieee802 + /* 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_blkcipher *tfm, u8 *rc4key, ++int ieee80211_wep_decrypt_data(struct crypto_cipher *tfm, u8 *rc4key, + size_t klen, u8 *data, size_t data_len) + { +- struct blkcipher_desc desc = { .tfm = tfm }; +- struct scatterlist sg; + __le32 crc; ++ int i; + + if (IS_ERR(tfm)) + return -1; + +- crypto_blkcipher_setkey(tfm, rc4key, klen); +- sg_init_one(&sg, data, data_len + WEP_ICV_LEN); +- crypto_blkcipher_decrypt(&desc, &sg, &sg, sg.length); ++ crypto_cipher_setkey(tfm, rc4key, klen); ++ for (i = 0; i < data_len + WEP_ICV_LEN; i++) ++ crypto_cipher_decrypt_one(tfm, data + i, data + i); + + crc = cpu_to_le32(~crc32_le(~0, data, data_len)); + if (memcmp(&crc, data + data_len, WEP_ICV_LEN) != 0) +--- a/net/mac80211/wep.h ++++ b/net/mac80211/wep.h +@@ -18,12 +18,12 @@ + + int ieee80211_wep_init(struct ieee80211_local *local); + void ieee80211_wep_free(struct ieee80211_local *local); +-int ieee80211_wep_encrypt_data(struct crypto_blkcipher *tfm, u8 *rc4key, ++int ieee80211_wep_encrypt_data(struct crypto_cipher *tfm, u8 *rc4key, + size_t klen, u8 *data, size_t data_len); + int ieee80211_wep_encrypt(struct ieee80211_local *local, + struct sk_buff *skb, + const u8 *key, int keylen, int keyidx); +-int ieee80211_wep_decrypt_data(struct crypto_blkcipher *tfm, u8 *rc4key, ++int ieee80211_wep_decrypt_data(struct crypto_cipher *tfm, u8 *rc4key, + size_t klen, u8 *data, size_t data_len); + bool ieee80211_wep_is_weak_iv(struct sk_buff *skb, struct ieee80211_key *key); +