ieee80211_crypto_tkip.c revision 1.14.4.2 1 /* $NetBSD: ieee80211_crypto_tkip.c,v 1.14.4.2 2018/07/12 16:35:34 phil Exp $ */
2
3 /*-
4 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
5 *
6 * Copyright (c) 2002-2008 Sam Leffler, Errno Consulting
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30 #include <sys/cdefs.h>
31 #if __FreeBSD__
32 __FBSDID("$FreeBSD$");
33 #endif
34
35 /*
36 * IEEE 802.11i TKIP crypto support.
37 *
38 * Part of this module is derived from similar code in the Host
39 * AP driver. The code is used with the consent of the author and
40 * it's license is included below.
41 */
42 #include "opt_wlan.h"
43
44 #include <sys/param.h>
45 #include <sys/systm.h>
46 #include <sys/mbuf.h>
47 #include <sys/malloc.h>
48 #include <sys/kernel.h>
49 #include <sys/module.h>
50 #include <sys/endian.h>
51
52 #include <sys/socket.h>
53
54 #include <net/if.h>
55 #include <net/if_media.h>
56 #if __FreeBSD__
57 #include <net/ethernet.h>
58 #endif
59 #ifdef __NetBSD__
60 #include <net/route.h>
61 #endif
62
63 #include <net80211/ieee80211_var.h>
64
65 #ifdef __NetBSD__
66 #undef KASSERT
67 #define KASSERT(__cond, __complaint) FBSDKASSERT(__cond, __complaint)
68 #endif
69
70 static void *tkip_attach(struct ieee80211vap *, struct ieee80211_key *);
71 static void tkip_detach(struct ieee80211_key *);
72 static int tkip_setkey(struct ieee80211_key *);
73 static void tkip_setiv(struct ieee80211_key *, uint8_t *);
74 static int tkip_encap(struct ieee80211_key *, struct mbuf *);
75 static int tkip_enmic(struct ieee80211_key *, struct mbuf *, int);
76 static int tkip_decap(struct ieee80211_key *, struct mbuf *, int);
77 static int tkip_demic(struct ieee80211_key *, struct mbuf *, int);
78
79 static const struct ieee80211_cipher tkip = {
80 .ic_name = "TKIP",
81 .ic_cipher = IEEE80211_CIPHER_TKIP,
82 .ic_header = IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN +
83 IEEE80211_WEP_EXTIVLEN,
84 .ic_trailer = IEEE80211_WEP_CRCLEN,
85 .ic_miclen = IEEE80211_WEP_MICLEN,
86 .ic_attach = tkip_attach,
87 .ic_detach = tkip_detach,
88 .ic_setkey = tkip_setkey,
89 .ic_setiv = tkip_setiv,
90 .ic_encap = tkip_encap,
91 .ic_decap = tkip_decap,
92 .ic_enmic = tkip_enmic,
93 .ic_demic = tkip_demic,
94 };
95
96 typedef uint8_t u8;
97 typedef uint16_t u16;
98 typedef uint32_t __u32;
99 typedef uint32_t u32;
100
101 struct tkip_ctx {
102 struct ieee80211vap *tc_vap; /* for diagnostics+statistics */
103
104 u16 tx_ttak[5];
105 u8 tx_rc4key[16]; /* XXX for test module; make locals? */
106
107 u16 rx_ttak[5];
108 int rx_phase1_done;
109 u8 rx_rc4key[16]; /* XXX for test module; make locals? */
110 uint64_t rx_rsc; /* held until MIC verified */
111 };
112
113 static void michael_mic(struct tkip_ctx *, const u8 *key,
114 struct mbuf *m, u_int off, size_t data_len,
115 u8 mic[IEEE80211_WEP_MICLEN]);
116 static int tkip_encrypt(struct tkip_ctx *, struct ieee80211_key *,
117 struct mbuf *, int hdr_len);
118 static int tkip_decrypt(struct tkip_ctx *, struct ieee80211_key *,
119 struct mbuf *, int hdr_len);
120
121 /* number of references from net80211 layer */
122 static int nrefs = 0;
123
124 static void *
125 tkip_attach(struct ieee80211vap *vap, struct ieee80211_key *k)
126 {
127 struct tkip_ctx *ctx;
128
129 ctx = (struct tkip_ctx *) IEEE80211_MALLOC(sizeof(struct tkip_ctx),
130 M_80211_CRYPTO, IEEE80211_M_NOWAIT | IEEE80211_M_ZERO);
131 if (ctx == NULL) {
132 vap->iv_stats.is_crypto_nomem++;
133 return NULL;
134 }
135
136 ctx->tc_vap = vap;
137 nrefs++; /* NB: we assume caller locking */
138 return ctx;
139 }
140
141 static void
142 tkip_detach(struct ieee80211_key *k)
143 {
144 struct tkip_ctx *ctx = k->wk_private;
145
146 IEEE80211_FREE(ctx, M_80211_CRYPTO);
147 KASSERT(nrefs > 0, ("imbalanced attach/detach"));
148 nrefs--; /* NB: we assume caller locking */
149 }
150
151 static int
152 tkip_setkey(struct ieee80211_key *k)
153 {
154 struct tkip_ctx *ctx = k->wk_private;
155
156 if (k->wk_keylen != (128/NBBY)) {
157 (void) ctx; /* XXX */
158 IEEE80211_DPRINTF(ctx->tc_vap, IEEE80211_MSG_CRYPTO,
159 "%s: Invalid key length %u, expecting %u\n",
160 __func__, k->wk_keylen, 128/NBBY);
161 return 0;
162 }
163 ctx->rx_phase1_done = 0;
164 return 1;
165 }
166
167 static void
168 tkip_setiv(struct ieee80211_key *k, uint8_t *ivp)
169 {
170 struct tkip_ctx *ctx = k->wk_private;
171 struct ieee80211vap *vap = ctx->tc_vap;
172 uint8_t keyid;
173
174 keyid = ieee80211_crypto_get_keyid(vap, k) << 6;
175
176 k->wk_keytsc++;
177 ivp[0] = k->wk_keytsc >> 8; /* TSC1 */
178 ivp[1] = (ivp[0] | 0x20) & 0x7f; /* WEP seed */
179 ivp[2] = k->wk_keytsc >> 0; /* TSC0 */
180 ivp[3] = keyid | IEEE80211_WEP_EXTIV; /* KeyID | ExtID */
181 ivp[4] = k->wk_keytsc >> 16; /* TSC2 */
182 ivp[5] = k->wk_keytsc >> 24; /* TSC3 */
183 ivp[6] = k->wk_keytsc >> 32; /* TSC4 */
184 ivp[7] = k->wk_keytsc >> 40; /* TSC5 */
185 }
186
187 /*
188 * Add privacy headers and do any s/w encryption required.
189 */
190 static int
191 tkip_encap(struct ieee80211_key *k, struct mbuf *m)
192 {
193 struct tkip_ctx *ctx = k->wk_private;
194 struct ieee80211vap *vap = ctx->tc_vap;
195 struct ieee80211com *ic = vap->iv_ic;
196 struct ieee80211_frame *wh;
197 uint8_t *ivp;
198 int hdrlen;
199 int is_mgmt;
200
201 wh = mtod(m, struct ieee80211_frame *);
202 is_mgmt = IEEE80211_IS_MGMT(wh);
203
204 /*
205 * Handle TKIP counter measures requirement.
206 */
207 if (vap->iv_flags & IEEE80211_F_COUNTERM) {
208 #ifdef IEEE80211_DEBUG
209 struct ieee80211_frame *wh = mtod(m, struct ieee80211_frame *);
210 #endif
211
212 IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_CRYPTO, wh->i_addr2,
213 "discard frame due to countermeasures (%s)", __func__);
214 vap->iv_stats.is_crypto_tkipcm++;
215 return 0;
216 }
217
218 /*
219 * Check to see whether IV needs to be included.
220 */
221 if (is_mgmt && (k->wk_flags & IEEE80211_KEY_NOIVMGT))
222 return 1;
223 if ((! is_mgmt) && (k->wk_flags & IEEE80211_KEY_NOIV))
224 return 1;
225
226
227 hdrlen = ieee80211_hdrspace(ic, mtod(m, void *));
228
229 /*
230 * Copy down 802.11 header and add the IV, KeyID, and ExtIV.
231 */
232 M_PREPEND(m, tkip.ic_header, M_NOWAIT);
233 if (m == NULL)
234 return 0;
235 ivp = mtod(m, uint8_t *);
236 memmove(ivp, ivp + tkip.ic_header, hdrlen);
237 ivp += hdrlen;
238
239 tkip_setiv(k, ivp);
240
241 /*
242 * Finally, do software encrypt if needed.
243 */
244 if ((k->wk_flags & IEEE80211_KEY_SWENCRYPT) &&
245 !tkip_encrypt(ctx, k, m, hdrlen))
246 return 0;
247
248 return 1;
249 }
250
251 /*
252 * Add MIC to the frame as needed.
253 */
254 static int
255 tkip_enmic(struct ieee80211_key *k, struct mbuf *m, int force)
256 {
257 struct tkip_ctx *ctx = k->wk_private;
258 struct ieee80211_frame *wh;
259 int is_mgmt;
260
261 wh = mtod(m, struct ieee80211_frame *);
262 is_mgmt = IEEE80211_IS_MGMT(wh);
263
264 /*
265 * Check to see whether MIC needs to be included.
266 */
267 if (is_mgmt && (k->wk_flags & IEEE80211_KEY_NOMICMGT))
268 return 1;
269 if ((! is_mgmt) && (k->wk_flags & IEEE80211_KEY_NOMIC))
270 return 1;
271
272 if (force || (k->wk_flags & IEEE80211_KEY_SWENMIC)) {
273 #if __FreeBSD__
274 struct ieee80211_frame *wh = mtod(m, struct ieee80211_frame *);
275 #elif __NetBSD__
276 wh = mtod(m, struct ieee80211_frame *);
277 #endif
278 struct ieee80211vap *vap = ctx->tc_vap;
279 struct ieee80211com *ic = vap->iv_ic;
280 int hdrlen;
281 uint8_t mic[IEEE80211_WEP_MICLEN];
282
283 vap->iv_stats.is_crypto_tkipenmic++;
284
285 hdrlen = ieee80211_hdrspace(ic, wh);
286
287 michael_mic(ctx, k->wk_txmic,
288 m, hdrlen, m->m_pkthdr.len - hdrlen, mic);
289 return m_append(m, tkip.ic_miclen, mic);
290 }
291 return 1;
292 }
293
294 static __inline uint64_t
295 READ_6(uint8_t b0, uint8_t b1, uint8_t b2, uint8_t b3, uint8_t b4, uint8_t b5)
296 {
297 uint32_t iv32 = (b0 << 0) | (b1 << 8) | (b2 << 16) | (b3 << 24);
298 uint16_t iv16 = (b4 << 0) | (b5 << 8);
299 return (((uint64_t)iv16) << 32) | iv32;
300 }
301
302 /*
303 * Validate and strip privacy headers (and trailer) for a
304 * received frame. If necessary, decrypt the frame using
305 * the specified key.
306 */
307 static int
308 tkip_decap(struct ieee80211_key *k, struct mbuf *m, int hdrlen)
309 {
310 const struct ieee80211_rx_stats *rxs;
311 struct tkip_ctx *ctx = k->wk_private;
312 struct ieee80211vap *vap = ctx->tc_vap;
313 struct ieee80211_frame *wh;
314 uint8_t *ivp, tid;
315
316 rxs = ieee80211_get_rx_params_ptr(m);
317
318 /*
319 * If IV has been stripped, we skip most of the below.
320 */
321 if ((rxs != NULL) && (rxs->c_pktflags & IEEE80211_RX_F_IV_STRIP))
322 goto finish;
323
324 /*
325 * Header should have extended IV and sequence number;
326 * verify the former and validate the latter.
327 */
328 wh = mtod(m, struct ieee80211_frame *);
329 ivp = mtod(m, uint8_t *) + hdrlen;
330 if ((ivp[IEEE80211_WEP_IVLEN] & IEEE80211_WEP_EXTIV) == 0) {
331 /*
332 * No extended IV; discard frame.
333 */
334 IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_CRYPTO, wh->i_addr2,
335 "%s", "missing ExtIV for TKIP cipher");
336 vap->iv_stats.is_rx_tkipformat++;
337 return 0;
338 }
339 /*
340 * Handle TKIP counter measures requirement.
341 */
342 if (vap->iv_flags & IEEE80211_F_COUNTERM) {
343 IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_CRYPTO, wh->i_addr2,
344 "discard frame due to countermeasures (%s)", __func__);
345 vap->iv_stats.is_crypto_tkipcm++;
346 return 0;
347 }
348
349 tid = ieee80211_gettid(wh);
350 ctx->rx_rsc = READ_6(ivp[2], ivp[0], ivp[4], ivp[5], ivp[6], ivp[7]);
351 if (ctx->rx_rsc <= k->wk_keyrsc[tid] &&
352 (k->wk_flags & IEEE80211_KEY_NOREPLAY) == 0) {
353 /*
354 * Replay violation; notify upper layer.
355 */
356 ieee80211_notify_replay_failure(vap, wh, k, ctx->rx_rsc, tid);
357 vap->iv_stats.is_rx_tkipreplay++;
358 return 0;
359 }
360 /*
361 * NB: We can't update the rsc in the key until MIC is verified.
362 *
363 * We assume we are not preempted between doing the check above
364 * and updating wk_keyrsc when stripping the MIC in tkip_demic.
365 * Otherwise we might process another packet and discard it as
366 * a replay.
367 */
368
369 /*
370 * Check if the device handled the decrypt in hardware.
371 * If so we just strip the header; otherwise we need to
372 * handle the decrypt in software.
373 */
374 if ((k->wk_flags & IEEE80211_KEY_SWDECRYPT) &&
375 !tkip_decrypt(ctx, k, m, hdrlen))
376 return 0;
377
378 finish:
379
380 /*
381 * Copy up 802.11 header and strip crypto bits - but only if we
382 * are required to.
383 */
384 if (! ((rxs != NULL) && (rxs->c_pktflags & IEEE80211_RX_F_IV_STRIP))) {
385 memmove(mtod(m, uint8_t *) + tkip.ic_header, mtod(m, void *),
386 hdrlen);
387 m_adj(m, tkip.ic_header);
388 }
389
390 /*
391 * XXX TODO: do we need an option to potentially not strip the
392 * WEP trailer? Does "MMIC_STRIP" also mean this? Or?
393 */
394 m_adj(m, -tkip.ic_trailer);
395
396 return 1;
397 }
398
399 /*
400 * Verify and strip MIC from the frame.
401 */
402 static int
403 tkip_demic(struct ieee80211_key *k, struct mbuf *m, int force)
404 {
405 const struct ieee80211_rx_stats *rxs;
406 struct tkip_ctx *ctx = k->wk_private;
407 struct ieee80211_frame *wh;
408 uint8_t tid;
409
410 wh = mtod(m, struct ieee80211_frame *);
411 rxs = ieee80211_get_rx_params_ptr(m);
412
413 /*
414 * If we are told about a MIC failure from the driver,
415 * directly notify as a michael failure to the upper
416 * layers.
417 */
418 if ((rxs != NULL) && (rxs->c_pktflags & IEEE80211_RX_F_FAIL_MIC)) {
419 struct ieee80211vap *vap = ctx->tc_vap;
420 ieee80211_notify_michael_failure(vap, wh,
421 k->wk_rxkeyix != IEEE80211_KEYIX_NONE ?
422 k->wk_rxkeyix : k->wk_keyix);
423 return 0;
424 }
425
426 /*
427 * If IV has been stripped, we skip most of the below.
428 */
429 if ((rxs != NULL) && (rxs->c_pktflags & IEEE80211_RX_F_MMIC_STRIP))
430 goto finish;
431
432 if ((k->wk_flags & IEEE80211_KEY_SWDEMIC) || force) {
433 struct ieee80211vap *vap = ctx->tc_vap;
434 int hdrlen = ieee80211_hdrspace(vap->iv_ic, wh);
435 u8 mic[IEEE80211_WEP_MICLEN];
436 u8 mic0[IEEE80211_WEP_MICLEN];
437
438 vap->iv_stats.is_crypto_tkipdemic++;
439
440 michael_mic(ctx, k->wk_rxmic,
441 m, hdrlen, m->m_pkthdr.len - (hdrlen + tkip.ic_miclen),
442 mic);
443 m_copydata(m, m->m_pkthdr.len - tkip.ic_miclen,
444 tkip.ic_miclen, mic0);
445 if (memcmp(mic, mic0, tkip.ic_miclen)) {
446 /* NB: 802.11 layer handles statistic and debug msg */
447 ieee80211_notify_michael_failure(vap, wh,
448 k->wk_rxkeyix != IEEE80211_KEYIX_NONE ?
449 k->wk_rxkeyix : k->wk_keyix);
450 return 0;
451 }
452 }
453 /*
454 * Strip MIC from the tail.
455 */
456 m_adj(m, -tkip.ic_miclen);
457
458 /*
459 * Ok to update rsc now that MIC has been verified.
460 */
461 tid = ieee80211_gettid(wh);
462 k->wk_keyrsc[tid] = ctx->rx_rsc;
463
464 finish:
465 return 1;
466 }
467
468 /*
469 * Host AP crypt: host-based TKIP encryption implementation for Host AP driver
470 *
471 * Copyright (c) 2003-2004, Jouni Malinen <jkmaline (at) cc.hut.fi>
472 *
473 * This program is free software; you can redistribute it and/or modify
474 * it under the terms of the GNU General Public License version 2 as
475 * published by the Free Software Foundation. See README and COPYING for
476 * more details.
477 *
478 * Alternatively, this software may be distributed under the terms of BSD
479 * license.
480 */
481
482 static const __u32 crc32_table[256] = {
483 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
484 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
485 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
486 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
487 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
488 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
489 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
490 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
491 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
492 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
493 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
494 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
495 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
496 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
497 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
498 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
499 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
500 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
501 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
502 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
503 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
504 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
505 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
506 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
507 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
508 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
509 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
510 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
511 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
512 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
513 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
514 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
515 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
516 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
517 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
518 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
519 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
520 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
521 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
522 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
523 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
524 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
525 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
526 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
527 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
528 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
529 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
530 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
531 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
532 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
533 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
534 0x2d02ef8dL
535 };
536
537 static __inline u16 RotR1(u16 val)
538 {
539 return (val >> 1) | (val << 15);
540 }
541
542 static __inline u8 Lo8(u16 val)
543 {
544 return val & 0xff;
545 }
546
547 static __inline u8 Hi8(u16 val)
548 {
549 return val >> 8;
550 }
551
552 static __inline u16 Lo16(u32 val)
553 {
554 return val & 0xffff;
555 }
556
557 static __inline u16 Hi16(u32 val)
558 {
559 return val >> 16;
560 }
561
562 static __inline u16 Mk16(u8 hi, u8 lo)
563 {
564 return lo | (((u16) hi) << 8);
565 }
566
567 static __inline u16 Mk16_le(const u16 *v)
568 {
569 return le16toh(*v);
570 }
571
572 static const u16 Sbox[256] = {
573 0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154,
574 0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A,
575 0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B,
576 0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B,
577 0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F,
578 0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F,
579 0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5,
580 0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F,
581 0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB,
582 0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397,
583 0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED,
584 0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A,
585 0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194,
586 0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3,
587 0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104,
588 0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D,
589 0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39,
590 0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695,
591 0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83,
592 0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76,
593 0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4,
594 0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B,
595 0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0,
596 0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018,
597 0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751,
598 0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85,
599 0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12,
600 0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9,
601 0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7,
602 0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A,
603 0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8,
604 0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A,
605 };
606
607 static __inline u16 _S_(u16 v)
608 {
609 u16 t = Sbox[Hi8(v)];
610 return Sbox[Lo8(v)] ^ ((t << 8) | (t >> 8));
611 }
612
613 #define PHASE1_LOOP_COUNT 8
614
615 static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32)
616 {
617 int i, j;
618
619 /* Initialize the 80-bit TTAK from TSC (IV32) and TA[0..5] */
620 TTAK[0] = Lo16(IV32);
621 TTAK[1] = Hi16(IV32);
622 TTAK[2] = Mk16(TA[1], TA[0]);
623 TTAK[3] = Mk16(TA[3], TA[2]);
624 TTAK[4] = Mk16(TA[5], TA[4]);
625
626 for (i = 0; i < PHASE1_LOOP_COUNT; i++) {
627 j = 2 * (i & 1);
628 TTAK[0] += _S_(TTAK[4] ^ Mk16(TK[1 + j], TK[0 + j]));
629 TTAK[1] += _S_(TTAK[0] ^ Mk16(TK[5 + j], TK[4 + j]));
630 TTAK[2] += _S_(TTAK[1] ^ Mk16(TK[9 + j], TK[8 + j]));
631 TTAK[3] += _S_(TTAK[2] ^ Mk16(TK[13 + j], TK[12 + j]));
632 TTAK[4] += _S_(TTAK[3] ^ Mk16(TK[1 + j], TK[0 + j])) + i;
633 }
634 }
635
636 #ifndef _BYTE_ORDER
637 #error "Don't know native byte order"
638 #endif
639
640 static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK,
641 u16 IV16)
642 {
643 /* Make temporary area overlap WEP seed so that the final copy can be
644 * avoided on little endian hosts. */
645 u16 *PPK = (u16 *) &WEPSeed[4];
646
647 /* Step 1 - make copy of TTAK and bring in TSC */
648 PPK[0] = TTAK[0];
649 PPK[1] = TTAK[1];
650 PPK[2] = TTAK[2];
651 PPK[3] = TTAK[3];
652 PPK[4] = TTAK[4];
653 PPK[5] = TTAK[4] + IV16;
654
655 /* Step 2 - 96-bit bijective mixing using S-box */
656 PPK[0] += _S_(PPK[5] ^ Mk16_le((const u16 *) &TK[0]));
657 PPK[1] += _S_(PPK[0] ^ Mk16_le((const u16 *) &TK[2]));
658 PPK[2] += _S_(PPK[1] ^ Mk16_le((const u16 *) &TK[4]));
659 PPK[3] += _S_(PPK[2] ^ Mk16_le((const u16 *) &TK[6]));
660 PPK[4] += _S_(PPK[3] ^ Mk16_le((const u16 *) &TK[8]));
661 PPK[5] += _S_(PPK[4] ^ Mk16_le((const u16 *) &TK[10]));
662
663 PPK[0] += RotR1(PPK[5] ^ Mk16_le((const u16 *) &TK[12]));
664 PPK[1] += RotR1(PPK[0] ^ Mk16_le((const u16 *) &TK[14]));
665 PPK[2] += RotR1(PPK[1]);
666 PPK[3] += RotR1(PPK[2]);
667 PPK[4] += RotR1(PPK[3]);
668 PPK[5] += RotR1(PPK[4]);
669
670 /* Step 3 - bring in last of TK bits, assign 24-bit WEP IV value
671 * WEPSeed[0..2] is transmitted as WEP IV */
672 WEPSeed[0] = Hi8(IV16);
673 WEPSeed[1] = (Hi8(IV16) | 0x20) & 0x7F;
674 WEPSeed[2] = Lo8(IV16);
675 WEPSeed[3] = Lo8((PPK[5] ^ Mk16_le((const u16 *) &TK[0])) >> 1);
676
677 #if _BYTE_ORDER == _BIG_ENDIAN
678 {
679 int i;
680 for (i = 0; i < 6; i++)
681 PPK[i] = (PPK[i] << 8) | (PPK[i] >> 8);
682 }
683 #endif
684 }
685
686 static void
687 wep_encrypt(u8 *key, struct mbuf *m0, u_int off, size_t data_len,
688 uint8_t icv[IEEE80211_WEP_CRCLEN])
689 {
690 u32 i, j, k, crc;
691 size_t buflen;
692 u8 S[256];
693 u8 *pos;
694 struct mbuf *m;
695 #define S_SWAP(a,b) do { u8 t = S[a]; S[a] = S[b]; S[b] = t; } while(0)
696
697 /* Setup RC4 state */
698 for (i = 0; i < 256; i++)
699 S[i] = i;
700 j = 0;
701 for (i = 0; i < 256; i++) {
702 j = (j + S[i] + key[i & 0x0f]) & 0xff;
703 S_SWAP(i, j);
704 }
705
706 /* Compute CRC32 over unencrypted data and apply RC4 to data */
707 crc = ~0;
708 i = j = 0;
709 m = m0;
710 pos = mtod(m, uint8_t *) + off;
711 buflen = m->m_len - off;
712 for (;;) {
713 if (buflen > data_len)
714 buflen = data_len;
715 data_len -= buflen;
716 for (k = 0; k < buflen; k++) {
717 crc = crc32_table[(crc ^ *pos) & 0xff] ^ (crc >> 8);
718 i = (i + 1) & 0xff;
719 j = (j + S[i]) & 0xff;
720 S_SWAP(i, j);
721 *pos++ ^= S[(S[i] + S[j]) & 0xff];
722 }
723 m = m->m_next;
724 if (m == NULL) {
725 KASSERT(data_len == 0,
726 ("out of buffers with data_len %zu\n", data_len));
727 break;
728 }
729 pos = mtod(m, uint8_t *);
730 buflen = m->m_len;
731 }
732 crc = ~crc;
733
734 /* Append little-endian CRC32 and encrypt it to produce ICV */
735 icv[0] = crc;
736 icv[1] = crc >> 8;
737 icv[2] = crc >> 16;
738 icv[3] = crc >> 24;
739 for (k = 0; k < IEEE80211_WEP_CRCLEN; k++) {
740 i = (i + 1) & 0xff;
741 j = (j + S[i]) & 0xff;
742 S_SWAP(i, j);
743 icv[k] ^= S[(S[i] + S[j]) & 0xff];
744 }
745 }
746
747 static int
748 wep_decrypt(u8 *key, struct mbuf *m, u_int off, size_t data_len)
749 {
750 u32 i, j, k, crc;
751 u8 S[256];
752 u8 *pos, icv[4];
753 size_t buflen;
754
755 /* Setup RC4 state */
756 for (i = 0; i < 256; i++)
757 S[i] = i;
758 j = 0;
759 for (i = 0; i < 256; i++) {
760 j = (j + S[i] + key[i & 0x0f]) & 0xff;
761 S_SWAP(i, j);
762 }
763
764 /* Apply RC4 to data and compute CRC32 over decrypted data */
765 crc = ~0;
766 i = j = 0;
767 pos = mtod(m, uint8_t *) + off;
768 buflen = m->m_len - off;
769 for (;;) {
770 if (buflen > data_len)
771 buflen = data_len;
772 data_len -= buflen;
773 for (k = 0; k < buflen; k++) {
774 i = (i + 1) & 0xff;
775 j = (j + S[i]) & 0xff;
776 S_SWAP(i, j);
777 *pos ^= S[(S[i] + S[j]) & 0xff];
778 crc = crc32_table[(crc ^ *pos) & 0xff] ^ (crc >> 8);
779 pos++;
780 }
781 m = m->m_next;
782 if (m == NULL) {
783 KASSERT(data_len == 0,
784 ("out of buffers with data_len %zu\n", data_len));
785 break;
786 }
787 pos = mtod(m, uint8_t *);
788 buflen = m->m_len;
789 }
790 crc = ~crc;
791
792 /* Encrypt little-endian CRC32 and verify that it matches with the
793 * received ICV */
794 icv[0] = crc;
795 icv[1] = crc >> 8;
796 icv[2] = crc >> 16;
797 icv[3] = crc >> 24;
798 for (k = 0; k < 4; k++) {
799 i = (i + 1) & 0xff;
800 j = (j + S[i]) & 0xff;
801 S_SWAP(i, j);
802 if ((icv[k] ^ S[(S[i] + S[j]) & 0xff]) != *pos++) {
803 /* ICV mismatch - drop frame */
804 return -1;
805 }
806 }
807
808 return 0;
809 }
810
811
812 static __inline u32 rotl(u32 val, int bits)
813 {
814 return (val << bits) | (val >> (32 - bits));
815 }
816
817
818 static __inline u32 rotr(u32 val, int bits)
819 {
820 return (val >> bits) | (val << (32 - bits));
821 }
822
823
824 static __inline u32 xswap(u32 val)
825 {
826 return ((val & 0x00ff00ff) << 8) | ((val & 0xff00ff00) >> 8);
827 }
828
829
830 #define michael_block(l, r) \
831 do { \
832 r ^= rotl(l, 17); \
833 l += r; \
834 r ^= xswap(l); \
835 l += r; \
836 r ^= rotl(l, 3); \
837 l += r; \
838 r ^= rotr(l, 2); \
839 l += r; \
840 } while (0)
841
842
843 static __inline u32 get_le32_split(u8 b0, u8 b1, u8 b2, u8 b3)
844 {
845 return b0 | (b1 << 8) | (b2 << 16) | (b3 << 24);
846 }
847
848 static __inline u32 get_le32(const u8 *p)
849 {
850 return get_le32_split(p[0], p[1], p[2], p[3]);
851 }
852
853
854 static __inline void put_le32(u8 *p, u32 v)
855 {
856 p[0] = v;
857 p[1] = v >> 8;
858 p[2] = v >> 16;
859 p[3] = v >> 24;
860 }
861
862 /*
863 * Craft pseudo header used to calculate the MIC.
864 */
865 static void
866 michael_mic_hdr(const struct ieee80211_frame *wh0, uint8_t hdr[16])
867 {
868 const struct ieee80211_frame_addr4 *wh =
869 (const struct ieee80211_frame_addr4 *) wh0;
870
871 switch (wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) {
872 case IEEE80211_FC1_DIR_NODS:
873 IEEE80211_ADDR_COPY(hdr, wh->i_addr1); /* DA */
874 IEEE80211_ADDR_COPY(hdr + IEEE80211_ADDR_LEN, wh->i_addr2);
875 break;
876 case IEEE80211_FC1_DIR_TODS:
877 IEEE80211_ADDR_COPY(hdr, wh->i_addr3); /* DA */
878 IEEE80211_ADDR_COPY(hdr + IEEE80211_ADDR_LEN, wh->i_addr2);
879 break;
880 case IEEE80211_FC1_DIR_FROMDS:
881 IEEE80211_ADDR_COPY(hdr, wh->i_addr1); /* DA */
882 IEEE80211_ADDR_COPY(hdr + IEEE80211_ADDR_LEN, wh->i_addr3);
883 break;
884 case IEEE80211_FC1_DIR_DSTODS:
885 IEEE80211_ADDR_COPY(hdr, wh->i_addr3); /* DA */
886 IEEE80211_ADDR_COPY(hdr + IEEE80211_ADDR_LEN, wh->i_addr4);
887 break;
888 }
889
890 if (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_QOS) {
891 const struct ieee80211_qosframe *qwh =
892 (const struct ieee80211_qosframe *) wh;
893 hdr[12] = qwh->i_qos[0] & IEEE80211_QOS_TID;
894 } else
895 hdr[12] = 0;
896 hdr[13] = hdr[14] = hdr[15] = 0; /* reserved */
897 }
898
899 static void
900 michael_mic(struct tkip_ctx *ctx, const u8 *key,
901 struct mbuf *m, u_int off, size_t data_len,
902 u8 mic[IEEE80211_WEP_MICLEN])
903 {
904 uint8_t hdr[16];
905 u32 l, r;
906 const uint8_t *data;
907 u_int space;
908
909 michael_mic_hdr(mtod(m, struct ieee80211_frame *), hdr);
910
911 l = get_le32(key);
912 r = get_le32(key + 4);
913
914 /* Michael MIC pseudo header: DA, SA, 3 x 0, Priority */
915 l ^= get_le32(hdr);
916 michael_block(l, r);
917 l ^= get_le32(&hdr[4]);
918 michael_block(l, r);
919 l ^= get_le32(&hdr[8]);
920 michael_block(l, r);
921 l ^= get_le32(&hdr[12]);
922 michael_block(l, r);
923
924 /* first buffer has special handling */
925 data = mtod(m, const uint8_t *) + off;
926 space = m->m_len - off;
927 for (;;) {
928 if (space > data_len)
929 space = data_len;
930 /* collect 32-bit blocks from current buffer */
931 while (space >= sizeof(uint32_t)) {
932 l ^= get_le32(data);
933 michael_block(l, r);
934 data += sizeof(uint32_t), space -= sizeof(uint32_t);
935 data_len -= sizeof(uint32_t);
936 }
937 /*
938 * NB: when space is zero we make one more trip around
939 * the loop to advance to the next mbuf where there is
940 * data. This handles the case where there are 4*n
941 * bytes in an mbuf followed by <4 bytes in a later mbuf.
942 * By making an extra trip we'll drop out of the loop
943 * with m pointing at the mbuf with 3 bytes and space
944 * set as required by the remainder handling below.
945 */
946 if (data_len == 0 ||
947 (data_len < sizeof(uint32_t) && space != 0))
948 break;
949 m = m->m_next;
950 if (m == NULL) {
951 KASSERT(0, ("out of data, data_len %zu\n", data_len));
952 break;
953 }
954 if (space != 0) {
955 const uint8_t *data_next;
956 /*
957 * Block straddles buffers, split references.
958 */
959 data_next = mtod(m, const uint8_t *);
960 KASSERT(m->m_len >= sizeof(uint32_t) - space,
961 ("not enough data in following buffer, "
962 "m_len %u need %zu\n", m->m_len,
963 sizeof(uint32_t) - space));
964 switch (space) {
965 case 1:
966 l ^= get_le32_split(data[0], data_next[0],
967 data_next[1], data_next[2]);
968 data = data_next + 3;
969 space = m->m_len - 3;
970 break;
971 case 2:
972 l ^= get_le32_split(data[0], data[1],
973 data_next[0], data_next[1]);
974 data = data_next + 2;
975 space = m->m_len - 2;
976 break;
977 case 3:
978 l ^= get_le32_split(data[0], data[1],
979 data[2], data_next[0]);
980 data = data_next + 1;
981 space = m->m_len - 1;
982 break;
983 }
984 michael_block(l, r);
985 data_len -= sizeof(uint32_t);
986 } else {
987 /*
988 * Setup for next buffer.
989 */
990 data = mtod(m, const uint8_t *);
991 space = m->m_len;
992 }
993 }
994 /*
995 * Catch degenerate cases like mbuf[4*n+1 bytes] followed by
996 * mbuf[2 bytes]. I don't believe these should happen; if they
997 * do then we'll need more involved logic.
998 */
999 KASSERT(data_len <= space,
1000 ("not enough data, data_len %zu space %u\n", data_len, space));
1001
1002 /* Last block and padding (0x5a, 4..7 x 0) */
1003 switch (data_len) {
1004 case 0:
1005 l ^= get_le32_split(0x5a, 0, 0, 0);
1006 break;
1007 case 1:
1008 l ^= get_le32_split(data[0], 0x5a, 0, 0);
1009 break;
1010 case 2:
1011 l ^= get_le32_split(data[0], data[1], 0x5a, 0);
1012 break;
1013 case 3:
1014 l ^= get_le32_split(data[0], data[1], data[2], 0x5a);
1015 break;
1016 }
1017 michael_block(l, r);
1018 /* l ^= 0; */
1019 michael_block(l, r);
1020
1021 put_le32(mic, l);
1022 put_le32(mic + 4, r);
1023 }
1024
1025 static int
1026 tkip_encrypt(struct tkip_ctx *ctx, struct ieee80211_key *key,
1027 struct mbuf *m, int hdrlen)
1028 {
1029 struct ieee80211_frame *wh;
1030 uint8_t icv[IEEE80211_WEP_CRCLEN];
1031
1032 ctx->tc_vap->iv_stats.is_crypto_tkip++;
1033
1034 wh = mtod(m, struct ieee80211_frame *);
1035 if ((u16)(key->wk_keytsc) == 0 || key->wk_keytsc == 1) {
1036 tkip_mixing_phase1(ctx->tx_ttak, key->wk_key, wh->i_addr2,
1037 (u32)(key->wk_keytsc >> 16));
1038 }
1039 tkip_mixing_phase2(ctx->tx_rc4key, key->wk_key, ctx->tx_ttak,
1040 (u16) key->wk_keytsc);
1041
1042 wep_encrypt(ctx->tx_rc4key,
1043 m, hdrlen + tkip.ic_header,
1044 m->m_pkthdr.len - (hdrlen + tkip.ic_header),
1045 icv);
1046 (void) m_append(m, IEEE80211_WEP_CRCLEN, icv); /* XXX check return */
1047
1048 return 1;
1049 }
1050
1051 static int
1052 tkip_decrypt(struct tkip_ctx *ctx, struct ieee80211_key *key,
1053 struct mbuf *m, int hdrlen)
1054 {
1055 struct ieee80211_frame *wh;
1056 struct ieee80211vap *vap = ctx->tc_vap;
1057 u32 iv32;
1058 u16 iv16;
1059 u8 tid;
1060
1061 vap->iv_stats.is_crypto_tkip++;
1062
1063 wh = mtod(m, struct ieee80211_frame *);
1064 /* NB: tkip_decap already verified header and left seq in rx_rsc */
1065 iv16 = (u16) ctx->rx_rsc;
1066 iv32 = (u32) (ctx->rx_rsc >> 16);
1067
1068 tid = ieee80211_gettid(wh);
1069 if (iv32 != (u32)(key->wk_keyrsc[tid] >> 16) || !ctx->rx_phase1_done) {
1070 tkip_mixing_phase1(ctx->rx_ttak, key->wk_key,
1071 wh->i_addr2, iv32);
1072 ctx->rx_phase1_done = 1;
1073 }
1074 tkip_mixing_phase2(ctx->rx_rc4key, key->wk_key, ctx->rx_ttak, iv16);
1075
1076 /* NB: m is unstripped; deduct headers + ICV to get payload */
1077 if (wep_decrypt(ctx->rx_rc4key,
1078 m, hdrlen + tkip.ic_header,
1079 m->m_pkthdr.len - (hdrlen + tkip.ic_header + tkip.ic_trailer))) {
1080 if (iv32 != (u32)(key->wk_keyrsc[tid] >> 16)) {
1081 /* Previously cached Phase1 result was already lost, so
1082 * it needs to be recalculated for the next packet. */
1083 ctx->rx_phase1_done = 0;
1084 }
1085 IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_CRYPTO, wh->i_addr2,
1086 "%s", "TKIP ICV mismatch on decrypt");
1087 vap->iv_stats.is_rx_tkipicv++;
1088 return 0;
1089 }
1090 return 1;
1091 }
1092
1093 /*
1094 * Module glue.
1095 */
1096 IEEE80211_CRYPTO_MODULE(tkip, 1);
1097