mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-11-24 00:30:16 +02:00
mac80211: add a pending patch to remove the dependency on ecb
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@26295 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
f27317a2dc
commit
2a6f8ab8cf
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user