~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/wireless/lib80211_crypt_tkip.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0-only
  2 /*
  3  * lib80211 crypt: host-based TKIP encryption implementation for lib80211
  4  *
  5  * Copyright (c) 2003-2004, Jouni Malinen <j@w1.fi>
  6  * Copyright (c) 2008, John W. Linville <linville@tuxdriver.com>
  7  */
  8 
  9 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 10 
 11 #include <linux/err.h>
 12 #include <linux/fips.h>
 13 #include <linux/module.h>
 14 #include <linux/init.h>
 15 #include <linux/slab.h>
 16 #include <linux/random.h>
 17 #include <linux/scatterlist.h>
 18 #include <linux/skbuff.h>
 19 #include <linux/netdevice.h>
 20 #include <linux/mm.h>
 21 #include <linux/if_ether.h>
 22 #include <linux/if_arp.h>
 23 #include <asm/string.h>
 24 
 25 #include <linux/wireless.h>
 26 #include <linux/ieee80211.h>
 27 #include <net/iw_handler.h>
 28 
 29 #include <crypto/arc4.h>
 30 #include <crypto/hash.h>
 31 #include <linux/crypto.h>
 32 #include <linux/crc32.h>
 33 
 34 #include <net/lib80211.h>
 35 
 36 MODULE_AUTHOR("Jouni Malinen");
 37 MODULE_DESCRIPTION("lib80211 crypt: TKIP");
 38 MODULE_LICENSE("GPL");
 39 
 40 #define TKIP_HDR_LEN 8
 41 
 42 struct lib80211_tkip_data {
 43 #define TKIP_KEY_LEN 32
 44         u8 key[TKIP_KEY_LEN];
 45         int key_set;
 46 
 47         u32 tx_iv32;
 48         u16 tx_iv16;
 49         u16 tx_ttak[5];
 50         int tx_phase1_done;
 51 
 52         u32 rx_iv32;
 53         u16 rx_iv16;
 54         u16 rx_ttak[5];
 55         int rx_phase1_done;
 56         u32 rx_iv32_new;
 57         u16 rx_iv16_new;
 58 
 59         u32 dot11RSNAStatsTKIPReplays;
 60         u32 dot11RSNAStatsTKIPICVErrors;
 61         u32 dot11RSNAStatsTKIPLocalMICFailures;
 62 
 63         int key_idx;
 64 
 65         struct arc4_ctx rx_ctx_arc4;
 66         struct arc4_ctx tx_ctx_arc4;
 67         struct crypto_shash *rx_tfm_michael;
 68         struct crypto_shash *tx_tfm_michael;
 69 
 70         /* scratch buffers for virt_to_page() (crypto API) */
 71         u8 rx_hdr[16], tx_hdr[16];
 72 
 73         unsigned long flags;
 74 };
 75 
 76 static unsigned long lib80211_tkip_set_flags(unsigned long flags, void *priv)
 77 {
 78         struct lib80211_tkip_data *_priv = priv;
 79         unsigned long old_flags = _priv->flags;
 80         _priv->flags = flags;
 81         return old_flags;
 82 }
 83 
 84 static unsigned long lib80211_tkip_get_flags(void *priv)
 85 {
 86         struct lib80211_tkip_data *_priv = priv;
 87         return _priv->flags;
 88 }
 89 
 90 static void *lib80211_tkip_init(int key_idx)
 91 {
 92         struct lib80211_tkip_data *priv;
 93 
 94         if (fips_enabled)
 95                 return NULL;
 96 
 97         priv = kzalloc(sizeof(*priv), GFP_ATOMIC);
 98         if (priv == NULL)
 99                 goto fail;
100 
101         priv->key_idx = key_idx;
102 
103         priv->tx_tfm_michael = crypto_alloc_shash("michael_mic", 0, 0);
104         if (IS_ERR(priv->tx_tfm_michael)) {
105                 priv->tx_tfm_michael = NULL;
106                 goto fail;
107         }
108 
109         priv->rx_tfm_michael = crypto_alloc_shash("michael_mic", 0, 0);
110         if (IS_ERR(priv->rx_tfm_michael)) {
111                 priv->rx_tfm_michael = NULL;
112                 goto fail;
113         }
114 
115         return priv;
116 
117       fail:
118         if (priv) {
119                 crypto_free_shash(priv->tx_tfm_michael);
120                 crypto_free_shash(priv->rx_tfm_michael);
121                 kfree(priv);
122         }
123 
124         return NULL;
125 }
126 
127 static void lib80211_tkip_deinit(void *priv)
128 {
129         struct lib80211_tkip_data *_priv = priv;
130         if (_priv) {
131                 crypto_free_shash(_priv->tx_tfm_michael);
132                 crypto_free_shash(_priv->rx_tfm_michael);
133         }
134         kfree_sensitive(priv);
135 }
136 
137 static inline u16 RotR1(u16 val)
138 {
139         return (val >> 1) | (val << 15);
140 }
141 
142 static inline u8 Lo8(u16 val)
143 {
144         return val & 0xff;
145 }
146 
147 static inline u8 Hi8(u16 val)
148 {
149         return val >> 8;
150 }
151 
152 static inline u16 Lo16(u32 val)
153 {
154         return val & 0xffff;
155 }
156 
157 static inline u16 Hi16(u32 val)
158 {
159         return val >> 16;
160 }
161 
162 static inline u16 Mk16(u8 hi, u8 lo)
163 {
164         return lo | (((u16) hi) << 8);
165 }
166 
167 static inline u16 Mk16_le(__le16 * v)
168 {
169         return le16_to_cpu(*v);
170 }
171 
172 static const u16 Sbox[256] = {
173         0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154,
174         0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A,
175         0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B,
176         0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B,
177         0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F,
178         0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F,
179         0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5,
180         0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F,
181         0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB,
182         0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397,
183         0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED,
184         0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A,
185         0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194,
186         0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3,
187         0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104,
188         0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D,
189         0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39,
190         0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695,
191         0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83,
192         0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76,
193         0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4,
194         0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B,
195         0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0,
196         0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018,
197         0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751,
198         0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85,
199         0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12,
200         0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9,
201         0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7,
202         0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A,
203         0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8,
204         0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A,
205 };
206 
207 static inline u16 _S_(u16 v)
208 {
209         u16 t = Sbox[Hi8(v)];
210         return Sbox[Lo8(v)] ^ ((t << 8) | (t >> 8));
211 }
212 
213 #define PHASE1_LOOP_COUNT 8
214 
215 static void tkip_mixing_phase1(u16 * TTAK, const u8 * TK, const u8 * TA,
216                                u32 IV32)
217 {
218         int i, j;
219 
220         /* Initialize the 80-bit TTAK from TSC (IV32) and TA[0..5] */
221         TTAK[0] = Lo16(IV32);
222         TTAK[1] = Hi16(IV32);
223         TTAK[2] = Mk16(TA[1], TA[0]);
224         TTAK[3] = Mk16(TA[3], TA[2]);
225         TTAK[4] = Mk16(TA[5], TA[4]);
226 
227         for (i = 0; i < PHASE1_LOOP_COUNT; i++) {
228                 j = 2 * (i & 1);
229                 TTAK[0] += _S_(TTAK[4] ^ Mk16(TK[1 + j], TK[0 + j]));
230                 TTAK[1] += _S_(TTAK[0] ^ Mk16(TK[5 + j], TK[4 + j]));
231                 TTAK[2] += _S_(TTAK[1] ^ Mk16(TK[9 + j], TK[8 + j]));
232                 TTAK[3] += _S_(TTAK[2] ^ Mk16(TK[13 + j], TK[12 + j]));
233                 TTAK[4] += _S_(TTAK[3] ^ Mk16(TK[1 + j], TK[0 + j])) + i;
234         }
235 }
236 
237 static void tkip_mixing_phase2(u8 * WEPSeed, const u8 * TK, const u16 * TTAK,
238                                u16 IV16)
239 {
240         /* Make temporary area overlap WEP seed so that the final copy can be
241          * avoided on little endian hosts. */
242         u16 *PPK = (u16 *) & WEPSeed[4];
243 
244         /* Step 1 - make copy of TTAK and bring in TSC */
245         PPK[0] = TTAK[0];
246         PPK[1] = TTAK[1];
247         PPK[2] = TTAK[2];
248         PPK[3] = TTAK[3];
249         PPK[4] = TTAK[4];
250         PPK[5] = TTAK[4] + IV16;
251 
252         /* Step 2 - 96-bit bijective mixing using S-box */
253         PPK[0] += _S_(PPK[5] ^ Mk16_le((__le16 *) & TK[0]));
254         PPK[1] += _S_(PPK[0] ^ Mk16_le((__le16 *) & TK[2]));
255         PPK[2] += _S_(PPK[1] ^ Mk16_le((__le16 *) & TK[4]));
256         PPK[3] += _S_(PPK[2] ^ Mk16_le((__le16 *) & TK[6]));
257         PPK[4] += _S_(PPK[3] ^ Mk16_le((__le16 *) & TK[8]));
258         PPK[5] += _S_(PPK[4] ^ Mk16_le((__le16 *) & TK[10]));
259 
260         PPK[0] += RotR1(PPK[5] ^ Mk16_le((__le16 *) & TK[12]));
261         PPK[1] += RotR1(PPK[0] ^ Mk16_le((__le16 *) & TK[14]));
262         PPK[2] += RotR1(PPK[1]);
263         PPK[3] += RotR1(PPK[2]);
264         PPK[4] += RotR1(PPK[3]);
265         PPK[5] += RotR1(PPK[4]);
266 
267         /* Step 3 - bring in last of TK bits, assign 24-bit WEP IV value
268          * WEPSeed[0..2] is transmitted as WEP IV */
269         WEPSeed[0] = Hi8(IV16);
270         WEPSeed[1] = (Hi8(IV16) | 0x20) & 0x7F;
271         WEPSeed[2] = Lo8(IV16);
272         WEPSeed[3] = Lo8((PPK[5] ^ Mk16_le((__le16 *) & TK[0])) >> 1);
273 
274 #ifdef __BIG_ENDIAN
275         {
276                 int i;
277                 for (i = 0; i < 6; i++)
278                         PPK[i] = (PPK[i] << 8) | (PPK[i] >> 8);
279         }
280 #endif
281 }
282 
283 static int lib80211_tkip_hdr(struct sk_buff *skb, int hdr_len,
284                               u8 * rc4key, int keylen, void *priv)
285 {
286         struct lib80211_tkip_data *tkey = priv;
287         u8 *pos;
288         struct ieee80211_hdr *hdr;
289 
290         hdr = (struct ieee80211_hdr *)skb->data;
291 
292         if (skb_headroom(skb) < TKIP_HDR_LEN || skb->len < hdr_len)
293                 return -1;
294 
295         if (rc4key == NULL || keylen < 16)
296                 return -1;
297 
298         if (!tkey->tx_phase1_done) {
299                 tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2,
300                                    tkey->tx_iv32);
301                 tkey->tx_phase1_done = 1;
302         }
303         tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16);
304 
305         pos = skb_push(skb, TKIP_HDR_LEN);
306         memmove(pos, pos + TKIP_HDR_LEN, hdr_len);
307         pos += hdr_len;
308 
309         *pos++ = *rc4key;
310         *pos++ = *(rc4key + 1);
311         *pos++ = *(rc4key + 2);
312         *pos++ = (tkey->key_idx << 6) | (1 << 5) /* Ext IV included */ ;
313         *pos++ = tkey->tx_iv32 & 0xff;
314         *pos++ = (tkey->tx_iv32 >> 8) & 0xff;
315         *pos++ = (tkey->tx_iv32 >> 16) & 0xff;
316         *pos++ = (tkey->tx_iv32 >> 24) & 0xff;
317 
318         tkey->tx_iv16++;
319         if (tkey->tx_iv16 == 0) {
320                 tkey->tx_phase1_done = 0;
321                 tkey->tx_iv32++;
322         }
323 
324         return TKIP_HDR_LEN;
325 }
326 
327 static int lib80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
328 {
329         struct lib80211_tkip_data *tkey = priv;
330         int len;
331         u8 rc4key[16], *pos, *icv;
332         u32 crc;
333 
334         if (tkey->flags & IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) {
335                 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
336                 net_dbg_ratelimited("TKIP countermeasures: dropped TX packet to %pM\n",
337                                     hdr->addr1);
338                 return -1;
339         }
340 
341         if (skb_tailroom(skb) < 4 || skb->len < hdr_len)
342                 return -1;
343 
344         len = skb->len - hdr_len;
345         pos = skb->data + hdr_len;
346 
347         if ((lib80211_tkip_hdr(skb, hdr_len, rc4key, 16, priv)) < 0)
348                 return -1;
349 
350         crc = ~crc32_le(~0, pos, len);
351         icv = skb_put(skb, 4);
352         icv[0] = crc;
353         icv[1] = crc >> 8;
354         icv[2] = crc >> 16;
355         icv[3] = crc >> 24;
356 
357         arc4_setkey(&tkey->tx_ctx_arc4, rc4key, 16);
358         arc4_crypt(&tkey->tx_ctx_arc4, pos, pos, len + 4);
359 
360         return 0;
361 }
362 
363 /*
364  * deal with seq counter wrapping correctly.
365  * refer to timer_after() for jiffies wrapping handling
366  */
367 static inline int tkip_replay_check(u32 iv32_n, u16 iv16_n,
368                                     u32 iv32_o, u16 iv16_o)
369 {
370         if ((s32)iv32_n - (s32)iv32_o < 0 ||
371             (iv32_n == iv32_o && iv16_n <= iv16_o))
372                 return 1;
373         return 0;
374 }
375 
376 static int lib80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
377 {
378         struct lib80211_tkip_data *tkey = priv;
379         u8 rc4key[16];
380         u8 keyidx, *pos;
381         u32 iv32;
382         u16 iv16;
383         struct ieee80211_hdr *hdr;
384         u8 icv[4];
385         u32 crc;
386         int plen;
387 
388         hdr = (struct ieee80211_hdr *)skb->data;
389 
390         if (tkey->flags & IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) {
391                 net_dbg_ratelimited("TKIP countermeasures: dropped received packet from %pM\n",
392                                     hdr->addr2);
393                 return -1;
394         }
395 
396         if (skb->len < hdr_len + TKIP_HDR_LEN + 4)
397                 return -1;
398 
399         pos = skb->data + hdr_len;
400         keyidx = pos[3];
401         if (!(keyidx & (1 << 5))) {
402                 net_dbg_ratelimited("TKIP: received packet without ExtIV flag from %pM\n",
403                                     hdr->addr2);
404                 return -2;
405         }
406         keyidx >>= 6;
407         if (tkey->key_idx != keyidx) {
408                 net_dbg_ratelimited("TKIP: RX tkey->key_idx=%d frame keyidx=%d\n",
409                                     tkey->key_idx, keyidx);
410                 return -6;
411         }
412         if (!tkey->key_set) {
413                 net_dbg_ratelimited("TKIP: received packet from %pM with keyid=%d that does not have a configured key\n",
414                                     hdr->addr2, keyidx);
415                 return -3;
416         }
417         iv16 = (pos[0] << 8) | pos[2];
418         iv32 = pos[4] | (pos[5] << 8) | (pos[6] << 16) | (pos[7] << 24);
419         pos += TKIP_HDR_LEN;
420 
421         if (tkip_replay_check(iv32, iv16, tkey->rx_iv32, tkey->rx_iv16)) {
422 #ifdef CONFIG_LIB80211_DEBUG
423                 net_dbg_ratelimited("TKIP: replay detected: STA=%pM previous TSC %08x%04x received TSC %08x%04x\n",
424                                     hdr->addr2, tkey->rx_iv32, tkey->rx_iv16,
425                                     iv32, iv16);
426 #endif
427                 tkey->dot11RSNAStatsTKIPReplays++;
428                 return -4;
429         }
430 
431         if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) {
432                 tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32);
433                 tkey->rx_phase1_done = 1;
434         }
435         tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16);
436 
437         plen = skb->len - hdr_len - 12;
438 
439         arc4_setkey(&tkey->rx_ctx_arc4, rc4key, 16);
440         arc4_crypt(&tkey->rx_ctx_arc4, pos, pos, plen + 4);
441 
442         crc = ~crc32_le(~0, pos, plen);
443         icv[0] = crc;
444         icv[1] = crc >> 8;
445         icv[2] = crc >> 16;
446         icv[3] = crc >> 24;
447         if (memcmp(icv, pos + plen, 4) != 0) {
448                 if (iv32 != tkey->rx_iv32) {
449                         /* Previously cached Phase1 result was already lost, so
450                          * it needs to be recalculated for the next packet. */
451                         tkey->rx_phase1_done = 0;
452                 }
453 #ifdef CONFIG_LIB80211_DEBUG
454                 net_dbg_ratelimited("TKIP: ICV error detected: STA=%pM\n",
455                                     hdr->addr2);
456 #endif
457                 tkey->dot11RSNAStatsTKIPICVErrors++;
458                 return -5;
459         }
460 
461         /* Update real counters only after Michael MIC verification has
462          * completed */
463         tkey->rx_iv32_new = iv32;
464         tkey->rx_iv16_new = iv16;
465 
466         /* Remove IV and ICV */
467         memmove(skb->data + TKIP_HDR_LEN, skb->data, hdr_len);
468         skb_pull(skb, TKIP_HDR_LEN);
469         skb_trim(skb, skb->len - 4);
470 
471         return keyidx;
472 }
473 
474 static int michael_mic(struct crypto_shash *tfm_michael, u8 *key, u8 *hdr,
475                        u8 *data, size_t data_len, u8 *mic)
476 {
477         SHASH_DESC_ON_STACK(desc, tfm_michael);
478         int err;
479 
480         if (tfm_michael == NULL) {
481                 pr_warn("%s(): tfm_michael == NULL\n", __func__);
482                 return -1;
483         }
484 
485         desc->tfm = tfm_michael;
486 
487         if (crypto_shash_setkey(tfm_michael, key, 8))
488                 return -1;
489 
490         err = crypto_shash_init(desc);
491         if (err)
492                 goto out;
493         err = crypto_shash_update(desc, hdr, 16);
494         if (err)
495                 goto out;
496         err = crypto_shash_update(desc, data, data_len);
497         if (err)
498                 goto out;
499         err = crypto_shash_final(desc, mic);
500 
501 out:
502         shash_desc_zero(desc);
503         return err;
504 }
505 
506 static void michael_mic_hdr(struct sk_buff *skb, u8 * hdr)
507 {
508         struct ieee80211_hdr *hdr11;
509 
510         hdr11 = (struct ieee80211_hdr *)skb->data;
511 
512         switch (le16_to_cpu(hdr11->frame_control) &
513                 (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) {
514         case IEEE80211_FCTL_TODS:
515                 memcpy(hdr, hdr11->addr3, ETH_ALEN);    /* DA */
516                 memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
517                 break;
518         case IEEE80211_FCTL_FROMDS:
519                 memcpy(hdr, hdr11->addr1, ETH_ALEN);    /* DA */
520                 memcpy(hdr + ETH_ALEN, hdr11->addr3, ETH_ALEN); /* SA */
521                 break;
522         case IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS:
523                 memcpy(hdr, hdr11->addr3, ETH_ALEN);    /* DA */
524                 memcpy(hdr + ETH_ALEN, hdr11->addr4, ETH_ALEN); /* SA */
525                 break;
526         default:
527                 memcpy(hdr, hdr11->addr1, ETH_ALEN);    /* DA */
528                 memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
529                 break;
530         }
531 
532         if (ieee80211_is_data_qos(hdr11->frame_control)) {
533                 hdr[12] = le16_to_cpu(*((__le16 *)ieee80211_get_qos_ctl(hdr11)))
534                         & IEEE80211_QOS_CTL_TID_MASK;
535         } else
536                 hdr[12] = 0;            /* priority */
537 
538         hdr[13] = hdr[14] = hdr[15] = 0;        /* reserved */
539 }
540 
541 static int lib80211_michael_mic_add(struct sk_buff *skb, int hdr_len,
542                                      void *priv)
543 {
544         struct lib80211_tkip_data *tkey = priv;
545         u8 *pos;
546 
547         if (skb_tailroom(skb) < 8 || skb->len < hdr_len) {
548                 printk(KERN_DEBUG "Invalid packet for Michael MIC add "
549                        "(tailroom=%d hdr_len=%d skb->len=%d)\n",
550                        skb_tailroom(skb), hdr_len, skb->len);
551                 return -1;
552         }
553 
554         michael_mic_hdr(skb, tkey->tx_hdr);
555         pos = skb_put(skb, 8);
556         if (michael_mic(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr,
557                         skb->data + hdr_len, skb->len - 8 - hdr_len, pos))
558                 return -1;
559 
560         return 0;
561 }
562 
563 static void lib80211_michael_mic_failure(struct net_device *dev,
564                                           struct ieee80211_hdr *hdr,
565                                           int keyidx)
566 {
567         union iwreq_data wrqu;
568         struct iw_michaelmicfailure ev;
569 
570         /* TODO: needed parameters: count, keyid, key type, TSC */
571         memset(&ev, 0, sizeof(ev));
572         ev.flags = keyidx & IW_MICFAILURE_KEY_ID;
573         if (hdr->addr1[0] & 0x01)
574                 ev.flags |= IW_MICFAILURE_GROUP;
575         else
576                 ev.flags |= IW_MICFAILURE_PAIRWISE;
577         ev.src_addr.sa_family = ARPHRD_ETHER;
578         memcpy(ev.src_addr.sa_data, hdr->addr2, ETH_ALEN);
579         memset(&wrqu, 0, sizeof(wrqu));
580         wrqu.data.length = sizeof(ev);
581         wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *)&ev);
582 }
583 
584 static int lib80211_michael_mic_verify(struct sk_buff *skb, int keyidx,
585                                         int hdr_len, void *priv)
586 {
587         struct lib80211_tkip_data *tkey = priv;
588         u8 mic[8];
589 
590         if (!tkey->key_set)
591                 return -1;
592 
593         michael_mic_hdr(skb, tkey->rx_hdr);
594         if (michael_mic(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr,
595                         skb->data + hdr_len, skb->len - 8 - hdr_len, mic))
596                 return -1;
597         if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) {
598                 struct ieee80211_hdr *hdr;
599                 hdr = (struct ieee80211_hdr *)skb->data;
600                 printk(KERN_DEBUG "%s: Michael MIC verification failed for "
601                        "MSDU from %pM keyidx=%d\n",
602                        skb->dev ? skb->dev->name : "N/A", hdr->addr2,
603                        keyidx);
604                 if (skb->dev)
605                         lib80211_michael_mic_failure(skb->dev, hdr, keyidx);
606                 tkey->dot11RSNAStatsTKIPLocalMICFailures++;
607                 return -1;
608         }
609 
610         /* Update TSC counters for RX now that the packet verification has
611          * completed. */
612         tkey->rx_iv32 = tkey->rx_iv32_new;
613         tkey->rx_iv16 = tkey->rx_iv16_new;
614 
615         skb_trim(skb, skb->len - 8);
616 
617         return 0;
618 }
619 
620 static int lib80211_tkip_set_key(void *key, int len, u8 * seq, void *priv)
621 {
622         struct lib80211_tkip_data *tkey = priv;
623         int keyidx;
624         struct crypto_shash *tfm = tkey->tx_tfm_michael;
625         struct arc4_ctx *tfm2 = &tkey->tx_ctx_arc4;
626         struct crypto_shash *tfm3 = tkey->rx_tfm_michael;
627         struct arc4_ctx *tfm4 = &tkey->rx_ctx_arc4;
628 
629         keyidx = tkey->key_idx;
630         memset(tkey, 0, sizeof(*tkey));
631         tkey->key_idx = keyidx;
632         tkey->tx_tfm_michael = tfm;
633         tkey->tx_ctx_arc4 = *tfm2;
634         tkey->rx_tfm_michael = tfm3;
635         tkey->rx_ctx_arc4 = *tfm4;
636         if (len == TKIP_KEY_LEN) {
637                 memcpy(tkey->key, key, TKIP_KEY_LEN);
638                 tkey->key_set = 1;
639                 tkey->tx_iv16 = 1;      /* TSC is initialized to 1 */
640                 if (seq) {
641                         tkey->rx_iv32 = (seq[5] << 24) | (seq[4] << 16) |
642                             (seq[3] << 8) | seq[2];
643                         tkey->rx_iv16 = (seq[1] << 8) | seq[0];
644                 }
645         } else if (len == 0)
646                 tkey->key_set = 0;
647         else
648                 return -1;
649 
650         return 0;
651 }
652 
653 static int lib80211_tkip_get_key(void *key, int len, u8 * seq, void *priv)
654 {
655         struct lib80211_tkip_data *tkey = priv;
656 
657         if (len < TKIP_KEY_LEN)
658                 return -1;
659 
660         if (!tkey->key_set)
661                 return 0;
662         memcpy(key, tkey->key, TKIP_KEY_LEN);
663 
664         if (seq) {
665                 /*
666                  * Not clear if this should return the value as is
667                  * or - as the code previously seemed to partially
668                  * have been written as - subtract one from it. It
669                  * was working this way for a long time so leave it.
670                  */
671                 seq[0] = tkey->tx_iv16;
672                 seq[1] = tkey->tx_iv16 >> 8;
673                 seq[2] = tkey->tx_iv32;
674                 seq[3] = tkey->tx_iv32 >> 8;
675                 seq[4] = tkey->tx_iv32 >> 16;
676                 seq[5] = tkey->tx_iv32 >> 24;
677         }
678 
679         return TKIP_KEY_LEN;
680 }
681 
682 static void lib80211_tkip_print_stats(struct seq_file *m, void *priv)
683 {
684         struct lib80211_tkip_data *tkip = priv;
685         seq_printf(m,
686                    "key[%d] alg=TKIP key_set=%d "
687                    "tx_pn=%02x%02x%02x%02x%02x%02x "
688                    "rx_pn=%02x%02x%02x%02x%02x%02x "
689                    "replays=%d icv_errors=%d local_mic_failures=%d\n",
690                    tkip->key_idx, tkip->key_set,
691                    (tkip->tx_iv32 >> 24) & 0xff,
692                    (tkip->tx_iv32 >> 16) & 0xff,
693                    (tkip->tx_iv32 >> 8) & 0xff,
694                    tkip->tx_iv32 & 0xff,
695                    (tkip->tx_iv16 >> 8) & 0xff,
696                    tkip->tx_iv16 & 0xff,
697                    (tkip->rx_iv32 >> 24) & 0xff,
698                    (tkip->rx_iv32 >> 16) & 0xff,
699                    (tkip->rx_iv32 >> 8) & 0xff,
700                    tkip->rx_iv32 & 0xff,
701                    (tkip->rx_iv16 >> 8) & 0xff,
702                    tkip->rx_iv16 & 0xff,
703                    tkip->dot11RSNAStatsTKIPReplays,
704                    tkip->dot11RSNAStatsTKIPICVErrors,
705                    tkip->dot11RSNAStatsTKIPLocalMICFailures);
706 }
707 
708 static struct lib80211_crypto_ops lib80211_crypt_tkip = {
709         .name = "TKIP",
710         .init = lib80211_tkip_init,
711         .deinit = lib80211_tkip_deinit,
712         .encrypt_mpdu = lib80211_tkip_encrypt,
713         .decrypt_mpdu = lib80211_tkip_decrypt,
714         .encrypt_msdu = lib80211_michael_mic_add,
715         .decrypt_msdu = lib80211_michael_mic_verify,
716         .set_key = lib80211_tkip_set_key,
717         .get_key = lib80211_tkip_get_key,
718         .print_stats = lib80211_tkip_print_stats,
719         .extra_mpdu_prefix_len = 4 + 4, /* IV + ExtIV */
720         .extra_mpdu_postfix_len = 4,    /* ICV */
721         .extra_msdu_postfix_len = 8,    /* MIC */
722         .get_flags = lib80211_tkip_get_flags,
723         .set_flags = lib80211_tkip_set_flags,
724         .owner = THIS_MODULE,
725 };
726 
727 static int __init lib80211_crypto_tkip_init(void)
728 {
729         return lib80211_register_crypto_ops(&lib80211_crypt_tkip);
730 }
731 
732 static void __exit lib80211_crypto_tkip_exit(void)
733 {
734         lib80211_unregister_crypto_ops(&lib80211_crypt_tkip);
735 }
736 
737 module_init(lib80211_crypto_tkip_init);
738 module_exit(lib80211_crypto_tkip_exit);
739 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php