aboutsummaryrefslogtreecommitdiffstats
path: root/net/ieee80211/ieee80211_crypt_tkip.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ieee80211/ieee80211_crypt_tkip.c')
-rw-r--r--net/ieee80211/ieee80211_crypt_tkip.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/net/ieee80211/ieee80211_crypt_tkip.c b/net/ieee80211/ieee80211_crypt_tkip.c
index 259572dfd4f1..4200ec509866 100644
--- a/net/ieee80211/ieee80211_crypt_tkip.c
+++ b/net/ieee80211/ieee80211_crypt_tkip.c
@@ -93,7 +93,7 @@ static void *ieee80211_tkip_init(int key_idx)
93 if (IS_ERR(priv->tx_tfm_arc4)) { 93 if (IS_ERR(priv->tx_tfm_arc4)) {
94 printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " 94 printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
95 "crypto API arc4\n"); 95 "crypto API arc4\n");
96 priv->tfm_arc4 = NULL; 96 priv->tx_tfm_arc4 = NULL;
97 goto fail; 97 goto fail;
98 } 98 }
99 99
@@ -102,6 +102,7 @@ static void *ieee80211_tkip_init(int key_idx)
102 if (IS_ERR(priv->tx_tfm_michael)) { 102 if (IS_ERR(priv->tx_tfm_michael)) {
103 printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " 103 printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
104 "crypto API michael_mic\n"); 104 "crypto API michael_mic\n");
105 priv->tx_tfm_michael = NULL;
105 goto fail; 106 goto fail;
106 } 107 }
107 108
@@ -110,6 +111,7 @@ static void *ieee80211_tkip_init(int key_idx)
110 if (IS_ERR(priv->rx_tfm_arc4)) { 111 if (IS_ERR(priv->rx_tfm_arc4)) {
111 printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " 112 printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
112 "crypto API arc4\n"); 113 "crypto API arc4\n");
114 priv->rx_tfm_arc4 = NULL;
113 goto fail; 115 goto fail;
114 } 116 }
115 117
@@ -118,7 +120,7 @@ static void *ieee80211_tkip_init(int key_idx)
118 if (IS_ERR(priv->rx_tfm_michael)) { 120 if (IS_ERR(priv->rx_tfm_michael)) {
119 printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " 121 printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
120 "crypto API michael_mic\n"); 122 "crypto API michael_mic\n");
121 priv->tfm_michael = NULL; 123 priv->rx_tfm_michael = NULL;
122 goto fail; 124 goto fail;
123 } 125 }
124 126
@@ -392,6 +394,19 @@ static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
392 return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); 394 return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4);
393} 395}
394 396
397/*
398 * deal with seq counter wrapping correctly.
399 * refer to timer_after() for jiffies wrapping handling
400 */
401static inline int tkip_replay_check(u32 iv32_n, u16 iv16_n,
402 u32 iv32_o, u16 iv16_o)
403{
404 if ((s32)iv32_n - (s32)iv32_o < 0 ||
405 (iv32_n == iv32_o && iv16_n <= iv16_o))
406 return 1;
407 return 0;
408}
409
395static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) 410static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
396{ 411{
397 struct ieee80211_tkip_data *tkey = priv; 412 struct ieee80211_tkip_data *tkey = priv;