14 #include <linux/module.h>
16 #include <linux/slab.h>
17 #include <linux/random.h>
21 #include <asm/string.h>
34 #define WEP_KEY_LEN 13
42 static void *lib80211_wep_init(
int keyidx)
52 if (IS_ERR(priv->
tx_tfm)) {
58 if (IS_ERR(priv->
rx_tfm)) {
70 crypto_free_blkcipher(priv->
tx_tfm);
72 crypto_free_blkcipher(priv->
rx_tfm);
78 static void lib80211_wep_deinit(
void *priv)
83 crypto_free_blkcipher(_priv->
tx_tfm);
85 crypto_free_blkcipher(_priv->
rx_tfm);
92 u8 *
key,
int keylen,
void *priv)
98 if (skb_headroom(skb) < 4 || skb->
len < hdr_len)
102 memmove(pos, pos + 4, hdr_len);
112 if ((wep->
iv & 0xff00) == 0xff00) {
113 u8 B = (wep->
iv >> 16) & 0xff;
114 if (B >= 3 && B < klen)
119 *pos++ = (wep->
iv >> 16) & 0xff;
120 *pos++ = (wep->
iv >> 8) & 0xff;
121 *pos++ = wep->
iv & 0xff;
133 static int lib80211_wep_encrypt(
struct sk_buff *skb,
int hdr_len,
void *priv)
143 if (skb_tailroom(skb) < 4)
147 if (lib80211_wep_build_iv(skb, hdr_len,
NULL, 0, priv))
151 skb_copy_from_linear_data_offset(skb, hdr_len, key, 3);
156 len = skb->
len - hdr_len - 4;
157 pos = skb->
data + hdr_len + 4;
168 crypto_blkcipher_setkey(wep->
tx_tfm, key, klen);
170 return crypto_blkcipher_encrypt(&desc, &
sg, &
sg, len + 4);
180 static int lib80211_wep_decrypt(
struct sk_buff *skb,
int hdr_len,
void *priv)
186 u8 keyidx, *
pos, icv[4];
189 if (skb->
len < hdr_len + 8)
196 keyidx = *pos++ >> 6;
206 plen = skb->
len - hdr_len - 8;
208 crypto_blkcipher_setkey(wep->
rx_tfm, key, klen);
210 if (crypto_blkcipher_decrypt(&desc, &
sg, &
sg, plen + 4))
218 if (
memcmp(icv, pos + plen, 4) != 0) {
231 static int lib80211_wep_set_key(
void *key,
int len,
u8 * seq,
void *priv)
244 static int lib80211_wep_get_key(
void *key,
int len,
u8 * seq,
void *priv)
256 static char *lib80211_wep_print_stats(
char *
p,
void *priv)
265 .init = lib80211_wep_init,
266 .deinit = lib80211_wep_deinit,
267 .encrypt_mpdu = lib80211_wep_encrypt,
268 .decrypt_mpdu = lib80211_wep_decrypt,
269 .encrypt_msdu =
NULL,
270 .decrypt_msdu =
NULL,
271 .set_key = lib80211_wep_set_key,
272 .get_key = lib80211_wep_get_key,
273 .print_stats = lib80211_wep_print_stats,
274 .extra_mpdu_prefix_len = 4,
275 .extra_mpdu_postfix_len = 4,
279 static int __init lib80211_crypto_wep_init(
void)
284 static void __exit lib80211_crypto_wep_exit(
void)