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