Home | History | Annotate | Download | only in 80211
      1 /*
      2  * Copyright (c) 2009 Joshua Oreman <oremanj (at) rwcr.net>.
      3  *
      4  * This program is free software; you can redistribute it and/or
      5  * modify it under the terms of the GNU General Public License as
      6  * published by the Free Software Foundation; either version 2 of the
      7  * License, or any later version.
      8  *
      9  * This program is distributed in the hope that it will be useful, but
     10  * WITHOUT ANY WARRANTY; without even the implied warranty of
     11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12  * General Public License for more details.
     13  *
     14  * You should have received a copy of the GNU General Public License
     15  * along with this program; if not, write to the Free Software
     16  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
     17  */
     18 
     19 FILE_LICENCE ( GPL2_OR_LATER );
     20 
     21 #include <gpxe/net80211.h>
     22 #include <gpxe/crypto.h>
     23 #include <gpxe/hmac.h>
     24 #include <gpxe/sha1.h>
     25 #include <gpxe/md5.h>
     26 #include <gpxe/crc32.h>
     27 #include <gpxe/arc4.h>
     28 #include <gpxe/wpa.h>
     29 #include <byteswap.h>
     30 #include <errno.h>
     31 
     32 /** @file
     33  *
     34  * Backend for WPA using the TKIP encryption standard.
     35  */
     36 
     37 /** Context for one direction of TKIP, either encryption or decryption */
     38 struct tkip_dir_ctx
     39 {
     40 	/** High 32 bits of last sequence counter value used */
     41 	u32 tsc_hi;
     42 
     43 	/** Low 32 bits of last sequence counter value used */
     44 	u16 tsc_lo;
     45 
     46 	/** MAC address used to derive TTAK */
     47 	u8 mac[ETH_ALEN];
     48 
     49 	/** If TRUE, TTAK is valid */
     50 	u16 ttak_ok;
     51 
     52 	/** TKIP-mixed transmit address and key, depends on tsc_hi and MAC */
     53 	u16 ttak[5];
     54 };
     55 
     56 /** Context for TKIP encryption and decryption */
     57 struct tkip_ctx
     58 {
     59 	/** Temporal key to use */
     60 	struct tkip_tk tk;
     61 
     62 	/** State for encryption */
     63 	struct tkip_dir_ctx enc;
     64 
     65 	/** State for decryption */
     66 	struct tkip_dir_ctx dec;
     67 };
     68 
     69 /** Header structure at the beginning of TKIP frame data */
     70 struct tkip_head
     71 {
     72 	u8 tsc1;		/**< High byte of low 16 bits of TSC */
     73 	u8 seed1;		/**< Second byte of WEP seed */
     74 	u8 tsc0;		/**< Low byte of TSC */
     75 	u8 kid;			/**< Key ID and ExtIV byte */
     76 	u32 tsc_hi;		/**< High 32 bits of TSC, as an ExtIV */
     77 } __attribute__ (( packed ));
     78 
     79 
     80 /** TKIP header overhead (IV + KID + ExtIV) */
     81 #define TKIP_HEAD_LEN	8
     82 
     83 /** TKIP trailer overhead (MIC + ICV) [assumes unfragmented] */
     84 #define TKIP_FOOT_LEN	12
     85 
     86 /** TKIP MIC length */
     87 #define TKIP_MIC_LEN	8
     88 
     89 /** TKIP ICV length */
     90 #define TKIP_ICV_LEN	4
     91 
     92 
     93 /** TKIP S-box */
     94 static const u16 Sbox[256] = {
     95 	0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154,
     96 	0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A,
     97 	0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B,
     98 	0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B,
     99 	0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F,
    100 	0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F,
    101 	0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5,
    102 	0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F,
    103 	0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB,
    104 	0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397,
    105 	0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED,
    106 	0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A,
    107 	0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194,
    108 	0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3,
    109 	0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104,
    110 	0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D,
    111 	0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39,
    112 	0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695,
    113 	0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83,
    114 	0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76,
    115 	0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4,
    116 	0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B,
    117 	0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0,
    118 	0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018,
    119 	0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751,
    120 	0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85,
    121 	0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12,
    122 	0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9,
    123 	0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7,
    124 	0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A,
    125 	0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8,
    126 	0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A,
    127 };
    128 
    129 /**
    130  * Perform S-box mapping on a 16-bit value
    131  *
    132  * @v v		Value to perform S-box mapping on
    133  * @ret Sv	S-box mapped value
    134  */
    135 static inline u16 S ( u16 v )
    136 {
    137 	return Sbox[v & 0xFF] ^ swap16 ( Sbox[v >> 8] );
    138 }
    139 
    140 /**
    141  * Rotate 16-bit value right
    142  *
    143  * @v v		Value to rotate
    144  * @v bits	Number of bits to rotate by
    145  * @ret rotv	Rotated value
    146  */
    147 static inline u16 ror16 ( u16 v, int bits )
    148 {
    149 	return ( v >> bits ) | ( v << ( 16 - bits ) );
    150 }
    151 
    152 /**
    153  * Rotate 32-bit value right
    154  *
    155  * @v v		Value to rotate
    156  * @v bits	Number of bits to rotate by
    157  * @ret rotv	Rotated value
    158  */
    159 static inline u32 ror32 ( u32 v, int bits )
    160 {
    161 	return ( v >> bits ) | ( v << ( 32 - bits ) );
    162 }
    163 
    164 /**
    165  * Rotate 32-bit value left
    166  *
    167  * @v v		Value to rotate
    168  * @v bits	Number of bits to rotate by
    169  * @ret rotv	Rotated value
    170  */
    171 static inline u32 rol32 ( u32 v, int bits )
    172 {
    173 	return ( v << bits ) | ( v >> ( 32 - bits ) );
    174 }
    175 
    176 
    177 /**
    178  * Initialise TKIP state and install key
    179  *
    180  * @v crypto	TKIP cryptosystem structure
    181  * @v key	Pointer to tkip_tk to install
    182  * @v keylen	Length of key (32 bytes)
    183  * @v rsc	Initial receive sequence counter
    184  */
    185 static int tkip_init ( struct net80211_crypto *crypto, const void *key,
    186 		       int keylen, const void *rsc )
    187 {
    188 	struct tkip_ctx *ctx = crypto->priv;
    189 	const u8 *rscb = rsc;
    190 
    191 	if ( keylen != sizeof ( ctx->tk ) )
    192 		return -EINVAL;
    193 
    194 	if ( rscb ) {
    195 		ctx->dec.tsc_lo =   ( rscb[1] <<  8 ) |   rscb[0];
    196 		ctx->dec.tsc_hi = ( ( rscb[5] << 24 ) | ( rscb[4] << 16 ) |
    197 				    ( rscb[3] <<  8 ) |   rscb[2] );
    198 	}
    199 
    200 	memcpy ( &ctx->tk, key, sizeof ( ctx->tk ) );
    201 
    202 	return 0;
    203 }
    204 
    205 /**
    206  * Perform TKIP key mixing, phase 1
    207  *
    208  * @v dctx	TKIP directional context
    209  * @v tk	TKIP temporal key
    210  * @v mac	MAC address of transmitter
    211  *
    212  * This recomputes the TTAK in @a dctx if necessary, and sets
    213  * @c dctx->ttak_ok.
    214  */
    215 static void tkip_mix_1 ( struct tkip_dir_ctx *dctx, struct tkip_tk *tk, u8 *mac )
    216 {
    217 	int i, j;
    218 
    219 	if ( dctx->ttak_ok && ! memcmp ( mac, dctx->mac, ETH_ALEN ) )
    220 		return;
    221 
    222 	memcpy ( dctx->mac, mac, ETH_ALEN );
    223 
    224 	dctx->ttak[0] = dctx->tsc_hi & 0xFFFF;
    225 	dctx->ttak[1] = dctx->tsc_hi >> 16;
    226 	dctx->ttak[2] = ( mac[1] << 8 ) | mac[0];
    227 	dctx->ttak[3] = ( mac[3] << 8 ) | mac[2];
    228 	dctx->ttak[4] = ( mac[5] << 8 ) | mac[4];
    229 
    230 	for ( i = 0; i < 8; i++ ) {
    231 		j = 2 * ( i & 1 );
    232 
    233 		dctx->ttak[0] += S ( dctx->ttak[4] ^ ( ( tk->key[1 + j] << 8 ) |
    234 						         tk->key[0 + j] ) );
    235 		dctx->ttak[1] += S ( dctx->ttak[0] ^ ( ( tk->key[5 + j] << 8 ) |
    236 						         tk->key[4 + j] ) );
    237 		dctx->ttak[2] += S ( dctx->ttak[1] ^ ( ( tk->key[9 + j] << 8 ) |
    238 						         tk->key[8 + j] ) );
    239 		dctx->ttak[3] += S ( dctx->ttak[2] ^ ( ( tk->key[13+ j] << 8 ) |
    240 						         tk->key[12+ j] ) );
    241 		dctx->ttak[4] += S ( dctx->ttak[3] ^ ( ( tk->key[1 + j] << 8 ) |
    242 						         tk->key[0 + j] ) ) + i;
    243 	}
    244 
    245 	dctx->ttak_ok = 1;
    246 }
    247 
    248 /**
    249  * Perform TKIP key mixing, phase 2
    250  *
    251  * @v dctx	TKIP directional context
    252  * @v tk	TKIP temporal key
    253  * @ret key	ARC4 key, 16 bytes long
    254  */
    255 static void tkip_mix_2 ( struct tkip_dir_ctx *dctx, struct tkip_tk *tk,
    256 			 void *key )
    257 {
    258 	u8 *kb = key;
    259 	u16 ppk[6];
    260 	int i;
    261 
    262 	memcpy ( ppk, dctx->ttak, sizeof ( dctx->ttak ) );
    263 	ppk[5] = dctx->ttak[4] + dctx->tsc_lo;
    264 
    265 	ppk[0] += S ( ppk[5] ^ ( ( tk->key[1] << 8 ) | tk->key[0] ) );
    266 	ppk[1] += S ( ppk[0] ^ ( ( tk->key[3] << 8 ) | tk->key[2] ) );
    267 	ppk[2] += S ( ppk[1] ^ ( ( tk->key[5] << 8 ) | tk->key[4] ) );
    268 	ppk[3] += S ( ppk[2] ^ ( ( tk->key[7] << 8 ) | tk->key[6] ) );
    269 	ppk[4] += S ( ppk[3] ^ ( ( tk->key[9] << 8 ) | tk->key[8] ) );
    270 	ppk[5] += S ( ppk[4] ^ ( ( tk->key[11] << 8 ) | tk->key[10] ) );
    271 
    272 	ppk[0] += ror16 ( ppk[5] ^ ( ( tk->key[13] << 8 ) | tk->key[12] ), 1 );
    273 	ppk[1] += ror16 ( ppk[0] ^ ( ( tk->key[15] << 8 ) | tk->key[14] ), 1 );
    274 	ppk[2] += ror16 ( ppk[1], 1 );
    275 	ppk[3] += ror16 ( ppk[2], 1 );
    276 	ppk[4] += ror16 ( ppk[3], 1 );
    277 	ppk[5] += ror16 ( ppk[4], 1 );
    278 
    279 	kb[0] = dctx->tsc_lo >> 8;
    280 	kb[1] = ( ( dctx->tsc_lo >> 8 ) | 0x20 ) & 0x7F;
    281 	kb[2] = dctx->tsc_lo & 0xFF;
    282 	kb[3] = ( ( ppk[5] ^ ( ( tk->key[1] << 8 ) | tk->key[0] ) ) >> 1 )
    283 		& 0xFF;
    284 
    285 	for ( i = 0; i < 6; i++ ) {
    286 		kb[4 + 2*i] = ppk[i] & 0xFF;
    287 		kb[5 + 2*i] = ppk[i] >> 8;
    288 	}
    289 }
    290 
    291 /**
    292  * Update Michael message integrity code based on next 32-bit word of data
    293  *
    294  * @v V		Michael code state (two 32-bit words)
    295  * @v word	Next 32-bit word of data
    296  */
    297 static void tkip_feed_michael ( u32 *V, u32 word )
    298 {
    299 	V[0] ^= word;
    300 	V[1] ^= rol32 ( V[0], 17 );
    301 	V[0] += V[1];
    302 	V[1] ^= ( ( V[0] & 0xFF00FF00 ) >> 8 ) | ( ( V[0] & 0x00FF00FF ) << 8 );
    303 	V[0] += V[1];
    304 	V[1] ^= rol32 ( V[0], 3 );
    305 	V[0] += V[1];
    306 	V[1] ^= ror32 ( V[0], 2 );
    307 	V[0] += V[1];
    308 }
    309 
    310 /**
    311  * Calculate Michael message integrity code
    312  *
    313  * @v key	MIC key to use (8 bytes)
    314  * @v da	Destination link-layer address
    315  * @v sa	Source link-layer address
    316  * @v data	Start of data to calculate over
    317  * @v len	Length of header + data
    318  * @ret mic	Calculated Michael MIC (8 bytes)
    319  */
    320 static void tkip_michael ( const void *key, const void *da, const void *sa,
    321 			   const void *data, size_t len, void *mic )
    322 {
    323 	u32 V[2];		/* V[0] = "l", V[1] = "r" in 802.11 */
    324 	union {
    325 		u8 byte[12];
    326 		u32 word[3];
    327 	} cap;
    328 	const u8 *ptr = data;
    329 	const u8 *end = ptr + len;
    330 	int i;
    331 
    332 	memcpy ( V, key, sizeof ( V ) );
    333 	V[0] = le32_to_cpu ( V[0] );
    334 	V[1] = le32_to_cpu ( V[1] );
    335 
    336 	/* Feed in header (we assume non-QoS, so Priority = 0) */
    337 	memcpy ( &cap.byte[0], da, ETH_ALEN );
    338 	memcpy ( &cap.byte[6], sa, ETH_ALEN );
    339 	tkip_feed_michael ( V, le32_to_cpu ( cap.word[0] ) );
    340 	tkip_feed_michael ( V, le32_to_cpu ( cap.word[1] ) );
    341 	tkip_feed_michael ( V, le32_to_cpu ( cap.word[2] ) );
    342 	tkip_feed_michael ( V, 0 );
    343 
    344 	/* Feed in data */
    345 	while ( ptr + 4 <= end ) {
    346 		tkip_feed_michael ( V, le32_to_cpu ( *( u32 * ) ptr ) );
    347 		ptr += 4;
    348 	}
    349 
    350 	/* Add unaligned part and padding */
    351 	for ( i = 0; ptr < end; i++ )
    352 		cap.byte[i] = *ptr++;
    353 	cap.byte[i++] = 0x5a;
    354 	for ( ; i < 8; i++ )
    355 		cap.byte[i] = 0;
    356 
    357 	/* Feed in padding */
    358 	tkip_feed_michael ( V, le32_to_cpu ( cap.word[0] ) );
    359 	tkip_feed_michael ( V, le32_to_cpu ( cap.word[1] ) );
    360 
    361 	/* Output MIC */
    362 	V[0] = cpu_to_le32 ( V[0] );
    363 	V[1] = cpu_to_le32 ( V[1] );
    364 	memcpy ( mic, V, sizeof ( V ) );
    365 }
    366 
    367 /**
    368  * Encrypt a packet using TKIP
    369  *
    370  * @v crypto	TKIP cryptosystem
    371  * @v iob	I/O buffer containing cleartext packet
    372  * @ret eiob	I/O buffer containing encrypted packet
    373  */
    374 static struct io_buffer * tkip_encrypt ( struct net80211_crypto *crypto,
    375 					 struct io_buffer *iob )
    376 {
    377 	struct tkip_ctx *ctx = crypto->priv;
    378 	struct ieee80211_frame *hdr = iob->data;
    379 	struct io_buffer *eiob;
    380 	struct arc4_ctx arc4;
    381 	u8 key[16];
    382 	struct tkip_head head;
    383 	u8 mic[8];
    384 	u32 icv;
    385 	const int hdrlen = IEEE80211_TYP_FRAME_HEADER_LEN;
    386 	int datalen = iob_len ( iob ) - hdrlen;
    387 
    388 	ctx->enc.tsc_lo++;
    389 	if ( ctx->enc.tsc_lo == 0 ) {
    390 		ctx->enc.tsc_hi++;
    391 		ctx->enc.ttak_ok = 0;
    392 	}
    393 
    394 	tkip_mix_1 ( &ctx->enc, &ctx->tk, hdr->addr2 );
    395 	tkip_mix_2 ( &ctx->enc, &ctx->tk, key );
    396 
    397 	eiob = alloc_iob ( iob_len ( iob ) + TKIP_HEAD_LEN + TKIP_FOOT_LEN );
    398 	if ( ! eiob )
    399 		return NULL;
    400 
    401 	/* Copy frame header */
    402 	memcpy ( iob_put ( eiob, hdrlen ), iob->data, hdrlen );
    403 	hdr = eiob->data;
    404 	hdr->fc |= IEEE80211_FC_PROTECTED;
    405 
    406 	/* Fill in IV and key ID byte, and extended IV */
    407 	memcpy ( &head, key, 3 );
    408 	head.kid = 0x20;		/* have Extended IV, key ID 0 */
    409 	head.tsc_hi = cpu_to_le32 ( ctx->enc.tsc_hi );
    410 	memcpy ( iob_put ( eiob, sizeof ( head ) ), &head, sizeof ( head ) );
    411 
    412 	/* Copy and encrypt the data */
    413 	cipher_setkey ( &arc4_algorithm, &arc4, key, 16 );
    414 	cipher_encrypt ( &arc4_algorithm, &arc4, iob->data + hdrlen,
    415 			 iob_put ( eiob, datalen ), datalen );
    416 
    417 	/* Add MIC */
    418 	hdr = iob->data;
    419 	tkip_michael ( &ctx->tk.mic.tx, hdr->addr3, hdr->addr2,
    420 		       iob->data + hdrlen, datalen, mic );
    421 	cipher_encrypt ( &arc4_algorithm, &arc4, mic,
    422 			 iob_put ( eiob, sizeof ( mic ) ), sizeof ( mic ) );
    423 
    424 	/* Add ICV */
    425 	icv = crc32_le ( ~0, iob->data + hdrlen, datalen );
    426 	icv = crc32_le ( icv, mic, sizeof ( mic ) );
    427 	icv = cpu_to_le32 ( ~icv );
    428 	cipher_encrypt ( &arc4_algorithm, &arc4, &icv,
    429 			 iob_put ( eiob, TKIP_ICV_LEN ), TKIP_ICV_LEN );
    430 
    431 	DBGC2 ( ctx, "WPA-TKIP %p: encrypted packet %p -> %p\n", ctx,
    432 		iob, eiob );
    433 
    434 	return eiob;
    435 }
    436 
    437 /**
    438  * Decrypt a packet using TKIP
    439  *
    440  * @v crypto	TKIP cryptosystem
    441  * @v eiob	I/O buffer containing encrypted packet
    442  * @ret iob	I/O buffer containing cleartext packet
    443  */
    444 static struct io_buffer * tkip_decrypt ( struct net80211_crypto *crypto,
    445 					 struct io_buffer *eiob )
    446 {
    447 	struct tkip_ctx *ctx = crypto->priv;
    448 	struct ieee80211_frame *hdr;
    449 	struct io_buffer *iob;
    450 	const int hdrlen = IEEE80211_TYP_FRAME_HEADER_LEN;
    451 	int datalen = iob_len ( eiob ) - hdrlen - TKIP_HEAD_LEN - TKIP_FOOT_LEN;
    452 	struct tkip_head *head;
    453 	struct arc4_ctx arc4;
    454 	u16 rx_tsc_lo;
    455 	u8 key[16];
    456 	u8 mic[8];
    457 	u32 icv, crc;
    458 
    459 	iob = alloc_iob ( hdrlen + datalen + TKIP_FOOT_LEN );
    460 	if ( ! iob )
    461 		return NULL;
    462 
    463 	/* Copy frame header */
    464 	memcpy ( iob_put ( iob, hdrlen ), eiob->data, hdrlen );
    465 	hdr = iob->data;
    466 	hdr->fc &= ~IEEE80211_FC_PROTECTED;
    467 
    468 	/* Check and update TSC */
    469 	head = eiob->data + hdrlen;
    470 	rx_tsc_lo = ( head->tsc1 << 8 ) | head->tsc0;
    471 
    472 	if ( head->tsc_hi < ctx->dec.tsc_hi ||
    473 	     ( head->tsc_hi == ctx->dec.tsc_hi &&
    474 	       rx_tsc_lo <= ctx->dec.tsc_lo ) ) {
    475 		DBGC ( ctx, "WPA-TKIP %p: packet received out of order "
    476 		       "(%08x:%04x <= %08x:%04x)\n", ctx, head->tsc_hi,
    477 		       rx_tsc_lo, ctx->dec.tsc_hi, ctx->dec.tsc_lo );
    478 		free_iob ( iob );
    479 		return NULL;
    480 	}
    481 	ctx->dec.tsc_lo = rx_tsc_lo;
    482 	if ( ctx->dec.tsc_hi != head->tsc_hi ) {
    483 		ctx->dec.ttak_ok = 0;
    484 		ctx->dec.tsc_hi = head->tsc_hi;
    485 	}
    486 
    487 	/* Calculate key */
    488 	tkip_mix_1 ( &ctx->dec, &ctx->tk, hdr->addr2 );
    489 	tkip_mix_2 ( &ctx->dec, &ctx->tk, key );
    490 
    491 	/* Copy-decrypt data, MIC, ICV */
    492 	cipher_setkey ( &arc4_algorithm, &arc4, key, 16 );
    493 	cipher_decrypt ( &arc4_algorithm, &arc4,
    494 			 eiob->data + hdrlen + TKIP_HEAD_LEN,
    495 			 iob_put ( iob, datalen ), datalen + TKIP_FOOT_LEN );
    496 
    497 	/* Check ICV */
    498 	icv = le32_to_cpu ( *( u32 * ) ( iob->tail + TKIP_MIC_LEN ) );
    499 	crc = ~crc32_le ( ~0, iob->data + hdrlen, datalen + TKIP_MIC_LEN );
    500 	if ( crc != icv ) {
    501 		DBGC ( ctx, "WPA-TKIP %p CRC mismatch: expect %08x, get %08x\n",
    502 		       ctx, icv, crc );
    503 		free_iob ( iob );
    504 		return NULL;
    505 	}
    506 
    507 	/* Check MIC */
    508 	tkip_michael ( &ctx->tk.mic.rx, hdr->addr1, hdr->addr3,
    509 		       iob->data + hdrlen, datalen, mic );
    510 	if ( memcmp ( mic, iob->tail, TKIP_MIC_LEN ) != 0 ) {
    511 		DBGC ( ctx, "WPA-TKIP %p ALERT! MIC failure\n", ctx );
    512 		/* XXX we should do the countermeasures here */
    513 		free_iob ( iob );
    514 		return NULL;
    515 	}
    516 
    517 	DBGC2 ( ctx, "WPA-TKIP %p: decrypted packet %p -> %p\n", ctx,
    518 		eiob, iob );
    519 
    520 	return iob;
    521 }
    522 
    523 /** TKIP cryptosystem */
    524 struct net80211_crypto tkip_crypto __net80211_crypto = {
    525 	.algorithm = NET80211_CRYPT_TKIP,
    526 	.init = tkip_init,
    527 	.encrypt = tkip_encrypt,
    528 	.decrypt = tkip_decrypt,
    529 	.priv_len = sizeof ( struct tkip_ctx ),
    530 };
    531 
    532 
    533 
    534 
    535 /**
    536  * Calculate HMAC-MD5 MIC for EAPOL-Key frame
    537  *
    538  * @v kck	Key Confirmation Key, 16 bytes
    539  * @v msg	Message to calculate MIC over
    540  * @v len	Number of bytes to calculate MIC over
    541  * @ret mic	Calculated MIC, 16 bytes long
    542  */
    543 static void tkip_kie_mic ( const void *kck, const void *msg, size_t len,
    544 			   void *mic )
    545 {
    546 	struct md5_ctx md5;
    547 	u8 kckb[16];
    548 	size_t kck_len = 16;
    549 
    550 	memcpy ( kckb, kck, kck_len );
    551 
    552 	hmac_init ( &md5_algorithm, &md5, kckb, &kck_len );
    553 	hmac_update ( &md5_algorithm, &md5, msg, len );
    554 	hmac_final ( &md5_algorithm, &md5, kckb, &kck_len, mic );
    555 }
    556 
    557 /**
    558  * Decrypt key data in EAPOL-Key frame
    559  *
    560  * @v kek	Key Encryption Key, 16 bytes
    561  * @v iv	Initialisation vector, 16 bytes
    562  * @v msg	Message to decrypt
    563  * @v len	Length of message
    564  * @ret msg	Decrypted message in place of original
    565  * @ret len	Unchanged
    566  * @ret rc	Always 0 for success
    567  */
    568 static int tkip_kie_decrypt ( const void *kek, const void *iv,
    569 			      void *msg, u16 *len )
    570 {
    571 	u8 key[32];
    572 	memcpy ( key, iv, 16 );
    573 	memcpy ( key + 16, kek, 16 );
    574 
    575 	arc4_skip ( key, 32, 256, msg, msg, *len );
    576 
    577 	return 0;
    578 }
    579 
    580 
    581 /** TKIP-style key integrity and encryption handler */
    582 struct wpa_kie tkip_kie __wpa_kie = {
    583 	.version = EAPOL_KEY_VERSION_WPA,
    584 	.mic = tkip_kie_mic,
    585 	.decrypt = tkip_kie_decrypt,
    586 };
    587