2 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
3 * Use is subject to license terms.
7 * Copyright (c) 2001 Atsushi Onoe
8 * Copyright (c) 2002-2008 Sam Leffler, Errno Consulting
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. The name of the author may not be used to endorse or promote products
20 * derived from this software without specific prior written permission.
22 * Alternatively, this software may be distributed under the terms of the
23 * GNU General Public License ("GPL") version 2 as published by the Free
24 * Software Foundation.
26 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
27 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
29 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
30 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
31 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
35 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 * IEEE 802.11i TKIP crypto support.
41 * Part of this module is derived from similar code in the Host
42 * AP driver. The code is used with the consent of the author and
43 * it's license is included below.
46 #include <sys/byteorder.h>
47 #include <sys/crypto/common.h>
48 #include <sys/crypto/api.h>
49 #include <sys/crc32.h>
50 #include <sys/random.h>
51 #include <sys/strsun.h>
52 #include "net80211_impl.h"
54 static void *tkip_attach(struct ieee80211com
*, struct ieee80211_key
*);
55 static void tkip_detach(struct ieee80211_key
*);
56 static int tkip_setkey(struct ieee80211_key
*);
57 static int tkip_encap(struct ieee80211_key
*, mblk_t
*, uint8_t);
58 static int tkip_decap(struct ieee80211_key
*, mblk_t
*, int);
59 static int tkip_enmic(struct ieee80211_key
*, mblk_t
*, int);
60 static int tkip_demic(struct ieee80211_key
*, mblk_t
*, int);
62 const struct ieee80211_cipher tkip
= {
64 IEEE80211_CIPHER_TKIP
,
65 IEEE80211_WEP_IVLEN
+ IEEE80211_WEP_KIDLEN
+
66 IEEE80211_WEP_EXTIVLEN
,
79 struct ieee80211com
*tc_ic
; /* for diagnostics */
82 uint8_t tx_rc4key
[16];
85 uint8_t rx_rc4key
[16];
86 uint64_t rx_rsc
; /* held until MIC verified */
89 static void michael_mic(struct tkip_ctx
*, const uint8_t *,
90 mblk_t
*, uint_t
, size_t, uint8_t[]);
91 static int tkip_encrypt(struct tkip_ctx
*, struct ieee80211_key
*,
93 static int tkip_decrypt(struct tkip_ctx
*, struct ieee80211_key
*,
96 extern int rc4_init(crypto_context_t
*, const uint8_t *, int);
97 extern int rc4_crypt(crypto_context_t
, const uint8_t *, uint8_t *, int);
98 extern int rc4_final(crypto_context_t
, uint8_t *, int);
102 tkip_attach(struct ieee80211com
*ic
, struct ieee80211_key
*k
)
104 struct tkip_ctx
*ctx
;
106 ctx
= kmem_zalloc(sizeof (struct tkip_ctx
), KM_SLEEP
);
115 tkip_detach(struct ieee80211_key
*k
)
117 struct tkip_ctx
*ctx
= k
->wk_private
;
120 kmem_free(ctx
, sizeof (struct tkip_ctx
));
124 tkip_setkey(struct ieee80211_key
*k
)
126 if (k
->wk_keylen
!= (128/NBBY
))
129 k
->wk_keytsc
= 1; /* TSC starts at 1 */
134 * Add privacy headers appropriate for the specified key.
137 tkip_encap(struct ieee80211_key
*k
, mblk_t
*mp
, uint8_t keyid
)
139 struct tkip_ctx
*ctx
= k
->wk_private
;
140 struct ieee80211com
*ic
= ctx
->tc_ic
;
145 * Handle TKIP counter measures requirement.
147 if (ic
->ic_flags
& IEEE80211_F_COUNTERM
)
150 hdrlen
= ieee80211_hdrspace(ic
, mp
->b_rptr
);
152 * Copy down 802.11 header and add the IV, KeyID, and ExtIV.
157 ivp
[0] = k
->wk_keytsc
>> 8; /* TSC1 */
158 ivp
[1] = (ivp
[0] | 0x20) & 0x7f; /* WEP seed */
159 ivp
[2] = k
->wk_keytsc
>> 0; /* TSC0 */
160 ivp
[3] = keyid
| IEEE80211_WEP_EXTIV
; /* KeyID | ExtID */
161 ivp
[4] = k
->wk_keytsc
>> 16; /* TSC2 */
162 ivp
[5] = k
->wk_keytsc
>> 24; /* TSC3 */
163 ivp
[6] = k
->wk_keytsc
>> 32; /* TSC4 */
164 ivp
[7] = k
->wk_keytsc
>> 40; /* TSC5 */
167 * Finally, do software encrypt if neeed.
169 if (k
->wk_flags
& IEEE80211_KEY_SWCRYPT
) {
170 if (!tkip_encrypt(ctx
, k
, mp
, hdrlen
))
173 k
->wk_keytsc
++; /* wrap at 48 bits */
179 ieee80211_read_6(uint8_t b0
, uint8_t b1
, uint8_t b2
,
180 uint8_t b3
, uint8_t b4
, uint8_t b5
)
182 uint32_t iv32
= (b0
<< 0) | (b1
<< 8) | (b2
<< 16) | (b3
<< 24);
183 uint16_t iv16
= (b4
<< 0) | (b5
<< 8);
184 return ((((uint64_t)iv16
) << 32) | iv32
);
188 * Validate and strip privacy headers (and trailer) for a
189 * received frame. If necessary, decrypt the frame using
193 tkip_decap(struct ieee80211_key
*k
, mblk_t
*mp
, int hdrlen
)
195 struct tkip_ctx
*ctx
= k
->wk_private
;
196 struct ieee80211com
*ic
= ctx
->tc_ic
;
201 * Header should have extended IV and sequence number;
202 * verify the former and validate the latter.
204 ivp
= mp
->b_rptr
+ hdrlen
;
205 if ((ivp
[IEEE80211_WEP_IVLEN
] & IEEE80211_WEP_EXTIV
) == 0) {
207 * No extended IV; discard frame.
212 * Handle TKIP counter measures requirement.
214 if (ic
->ic_flags
& IEEE80211_F_COUNTERM
)
217 /* NB: assume IEEEE80211_WEP_MINLEN covers the extended IV */
218 pn
= ieee80211_read_6(ivp
[2], ivp
[0], ivp
[4], ivp
[5], ivp
[6], ivp
[7]);
220 if (ctx
->rx_rsc
<= k
->wk_keyrsc
)
223 * NB: We can't update the rsc in the key until MIC is verified.
225 * We assume we are not preempted between doing the check above
226 * and updating wk_keyrsc when stripping the MIC in tkip_demic.
227 * Otherwise we might process another packet and discard it as
232 * Check if the device handled the decrypt in hardware.
233 * If so we just strip the header; otherwise we need to
234 * handle the decrypt in software.
236 if (k
->wk_flags
& IEEE80211_KEY_SWCRYPT
) {
237 if (!tkip_decrypt(ctx
, k
, mp
, hdrlen
))
242 * Copy up 802.11 header and strip crypto bits.
244 (void) memmove(mp
->b_rptr
+ tkip
.ic_header
, mp
->b_rptr
, hdrlen
);
245 mp
->b_rptr
+= tkip
.ic_header
;
246 mp
->b_wptr
-= tkip
.ic_trailer
;
252 * Add MIC to the frame as needed.
255 tkip_enmic(struct ieee80211_key
*k
, mblk_t
*mp
, int force
)
257 struct tkip_ctx
*ctx
= k
->wk_private
;
259 if (force
|| (k
->wk_flags
& IEEE80211_KEY_SWMIC
)) {
263 hdrlen
= ieee80211_hdrspace(ctx
->tc_ic
, mp
->b_rptr
);
265 mp
->b_wptr
+= tkip
.ic_miclen
;
267 if ((int)(MBLKL(mp
) -
268 (hdrlen
+ tkip
.ic_header
+ tkip
.ic_miclen
)) < 0)
269 return (0); /* dead packet */
271 michael_mic(ctx
, k
->wk_txmic
, mp
, (hdrlen
+ tkip
.ic_header
),
273 (hdrlen
+ tkip
.ic_header
+ tkip
.ic_miclen
), mic
);
279 * Verify and strip MIC from the frame.
283 tkip_demic(struct ieee80211_key
*k
, mblk_t
*mp
, int force
)
285 struct tkip_ctx
*ctx
= k
->wk_private
;
287 if (force
|| (k
->wk_flags
& IEEE80211_KEY_SWMIC
)) {
288 int hdrlen
= ieee80211_hdrspace(ctx
->tc_ic
, mp
->b_rptr
);
289 uint8_t mic
[IEEE80211_WEP_MICLEN
];
290 uint8_t mic0
[IEEE80211_WEP_MICLEN
];
292 michael_mic(ctx
, k
->wk_rxmic
,
294 MBLKL(mp
) - (hdrlen
+ tkip
.ic_miclen
),
296 bcopy(mp
->b_wptr
- tkip
.ic_miclen
, mic0
, tkip
.ic_miclen
);
297 if (bcmp(mic
, mic0
, tkip
.ic_miclen
)) {
298 ieee80211_dbg(IEEE80211_MSG_CRYPTO
,
299 "tkip_demic() mic mismatch\n");
304 * Strip MIC from the tail.
306 mp
->b_wptr
-= tkip
.ic_miclen
;
308 * Ok to update rsc now that MIC has been verified.
310 k
->wk_keyrsc
= ctx
->rx_rsc
;
315 * For the avoidance of doubt, except that if any license choice other
316 * than GPL or LGPL is available it will apply instead, Sun elects to
317 * use only the General Public License version 2 (GPLv2) at this time
318 * for any software where a choice of GPL license versions is made
319 * available with the language indicating that GPLv2 or any later
320 * version may be used, or where a choice of which version of the GPL
321 * is applied is otherwise unspecified.
325 * Host AP crypt: host-based TKIP encryption implementation for Host AP driver
327 * Copyright (c) 2003-2004, Jouni Malinen <jkmaline@cc.hut.fi>
329 * This program is free software; you can redistribute it and/or modify
330 * it under the terms of the GNU General Public License version 2 as
331 * published by the Free Software Foundation. See README and COPYING for
334 * Alternatively, this software may be distributed under the terms of BSD
338 /* Table of CRCs of all 8-bit messages */
339 static uint32_t crc_table
[] = { CRC32_TABLE
};
344 return ((val
>> 1) | (val
<< 15));
362 return (val
& 0xffff);
372 Mk16(uint8_t hi
, uint8_t lo
)
374 return (lo
| (((uint16_t)hi
) << 8));
378 Mk16_le(const uint16_t *v
)
383 static const uint16_t Sbox
[256] = {
384 0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154,
385 0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A,
386 0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B,
387 0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B,
388 0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F,
389 0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F,
390 0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5,
391 0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F,
392 0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB,
393 0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397,
394 0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED,
395 0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A,
396 0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194,
397 0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3,
398 0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104,
399 0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D,
400 0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39,
401 0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695,
402 0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83,
403 0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76,
404 0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4,
405 0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B,
406 0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0,
407 0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018,
408 0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751,
409 0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85,
410 0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12,
411 0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9,
412 0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7,
413 0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A,
414 0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8,
415 0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A,
421 uint16_t t
= Sbox
[Hi8(v
)];
422 return (Sbox
[Lo8(v
)] ^ ((t
<< 8) | (t
>> 8)));
425 #define PHASE1_LOOP_COUNT 8
428 tkip_mixing_phase1(uint16_t *TTAK
, const uint8_t *TK
,
429 const uint8_t *TA
, uint32_t IV32
)
433 /* Initialize the 80-bit TTAK from TSC (IV32) and TA[0..5] */
434 TTAK
[0] = Lo16(IV32
);
435 TTAK
[1] = Hi16(IV32
);
436 TTAK
[2] = Mk16(TA
[1], TA
[0]);
437 TTAK
[3] = Mk16(TA
[3], TA
[2]);
438 TTAK
[4] = Mk16(TA
[5], TA
[4]);
440 for (i
= 0; i
< PHASE1_LOOP_COUNT
; i
++) {
442 TTAK
[0] += _S_(TTAK
[4] ^ Mk16(TK
[1 + j
], TK
[0 + j
]));
443 TTAK
[1] += _S_(TTAK
[0] ^ Mk16(TK
[5 + j
], TK
[4 + j
]));
444 TTAK
[2] += _S_(TTAK
[1] ^ Mk16(TK
[9 + j
], TK
[8 + j
]));
445 TTAK
[3] += _S_(TTAK
[2] ^ Mk16(TK
[13 + j
], TK
[12 + j
]));
446 TTAK
[4] += _S_(TTAK
[3] ^ Mk16(TK
[1 + j
], TK
[0 + j
])) + i
;
451 tkip_mixing_phase2(uint8_t *WEPSeed
, const uint8_t *TK
,
452 const uint16_t *TTAK
, uint16_t IV16
)
455 * Make temporary area overlap WEP seed so that the final copy can be
456 * avoided on little endian hosts.
458 uint16_t *PPK
= (uint16_t *)&WEPSeed
[4];
460 /* Step 1 - make copy of TTAK and bring in TSC */
466 PPK
[5] = TTAK
[4] + IV16
;
468 /* Step 2 - 96-bit bijective mixing using S-box */
469 PPK
[0] += _S_(PPK
[5] ^ Mk16_le((const uint16_t *) &TK
[0]));
470 PPK
[1] += _S_(PPK
[0] ^ Mk16_le((const uint16_t *) &TK
[2]));
471 PPK
[2] += _S_(PPK
[1] ^ Mk16_le((const uint16_t *) &TK
[4]));
472 PPK
[3] += _S_(PPK
[2] ^ Mk16_le((const uint16_t *) &TK
[6]));
473 PPK
[4] += _S_(PPK
[3] ^ Mk16_le((const uint16_t *) &TK
[8]));
474 PPK
[5] += _S_(PPK
[4] ^ Mk16_le((const uint16_t *) &TK
[10]));
476 PPK
[0] += RotR1(PPK
[5] ^ Mk16_le((const uint16_t *) &TK
[12]));
477 PPK
[1] += RotR1(PPK
[0] ^ Mk16_le((const uint16_t *) &TK
[14]));
478 PPK
[2] += RotR1(PPK
[1]);
479 PPK
[3] += RotR1(PPK
[2]);
480 PPK
[4] += RotR1(PPK
[3]);
481 PPK
[5] += RotR1(PPK
[4]);
484 * Step 3 - bring in last of TK bits, assign 24-bit WEP IV value
485 * WEPSeed[0..2] is transmitted as WEP IV
487 WEPSeed
[0] = Hi8(IV16
);
488 WEPSeed
[1] = (Hi8(IV16
) | 0x20) & 0x7F;
489 WEPSeed
[2] = Lo8(IV16
);
490 WEPSeed
[3] = Lo8((PPK
[5] ^ Mk16_le((const uint16_t *) &TK
[0])) >> 1);
494 for (i
= 0; i
< 6; i
++)
495 PPK
[i
] = (PPK
[i
] << 8) | (PPK
[i
] >> 8);
500 wep_encrypt(uint8_t *key
, mblk_t
*mp
, uint_t off
, size_t data_len
,
501 uint8_t icv
[IEEE80211_WEP_CRCLEN
])
503 uint8_t crcbuf
[IEEE80211_WEP_CRCLEN
];
505 crypto_context_t ctx
;
509 rv
= rc4_init(&ctx
, (const uint8_t *)key
, 16);
510 if (rv
!= CRYPTO_SUCCESS
)
513 /* calculate CRC over unencrypted data */
514 CRC32(crc
, mp
->b_rptr
+ off
, data_len
, -1U, crc_table
);
517 (void) rc4_crypt(ctx
, mp
->b_rptr
+ off
, mp
->b_rptr
+ off
, data_len
);
520 *(uint32_t *)crcbuf
= LE_32(~crc
);
521 (void) rc4_crypt(ctx
, crcbuf
, icv
, IEEE80211_WEP_CRCLEN
);
523 (void) rc4_final(ctx
, icv
, IEEE80211_WEP_CRCLEN
);
529 wep_decrypt(uint8_t *key
, mblk_t
*mp
, uint_t off
, size_t data_len
)
531 uint8_t crcbuf
[IEEE80211_WEP_CRCLEN
];
534 crypto_context_t ctx
;
538 rv
= rc4_init(&ctx
, (const uint8_t *)key
, 16);
539 if (rv
!= CRYPTO_SUCCESS
)
543 (void) rc4_crypt(ctx
, mp
->b_rptr
+ off
, mp
->b_rptr
+ off
, data_len
);
545 /* calculate CRC over unencrypted data */
546 CRC32(crc
, mp
->b_rptr
+ off
, data_len
, -1U, crc_table
);
548 /* decrypt ICV and compare to CRC */
549 icv
= mp
->b_wptr
- IEEE80211_WEP_CRCLEN
;
550 (void) rc4_crypt(ctx
, icv
, crcbuf
, IEEE80211_WEP_CRCLEN
);
551 (void) rc4_final(ctx
, crcbuf
, IEEE80211_WEP_CRCLEN
);
553 return (crc
== ~LE_32(*(uint32_t *)crcbuf
));
557 rotl(uint32_t val
, int bits
)
559 return ((val
<< bits
) | (val
>> (32 - bits
)));
564 rotr(uint32_t val
, int bits
)
566 return ((val
>> bits
) | (val
<< (32 - bits
)));
573 return (((val
& 0x00ff00ff) << 8) | ((val
& 0xff00ff00) >> 8));
577 #define michael_block(l, r) \
587 _NOTE(CONSTANTCONDITION)\
592 get_le32_split(uint8_t b0
, uint8_t b1
, uint8_t b2
, uint8_t b3
)
594 return (b0
| (b1
<< 8) | (b2
<< 16) | (b3
<< 24));
598 get_le32(const uint8_t *p
)
600 return (get_le32_split(p
[0], p
[1], p
[2], p
[3]));
605 put_le32(uint8_t *p
, uint32_t v
)
614 * Craft pseudo header used to calculate the MIC.
617 michael_mic_hdr(const struct ieee80211_frame
*wh0
, uint8_t hdr
[16])
619 const struct ieee80211_frame_addr4
*wh
=
620 (const struct ieee80211_frame_addr4
*)wh0
;
622 switch (wh
->i_fc
[1] & IEEE80211_FC1_DIR_MASK
) {
623 case IEEE80211_FC1_DIR_NODS
:
624 IEEE80211_ADDR_COPY(hdr
, wh
->i_addr1
); /* DA */
625 IEEE80211_ADDR_COPY(hdr
+ IEEE80211_ADDR_LEN
, wh
->i_addr2
);
627 case IEEE80211_FC1_DIR_TODS
:
628 IEEE80211_ADDR_COPY(hdr
, wh
->i_addr3
); /* DA */
629 IEEE80211_ADDR_COPY(hdr
+ IEEE80211_ADDR_LEN
, wh
->i_addr2
);
631 case IEEE80211_FC1_DIR_FROMDS
:
632 IEEE80211_ADDR_COPY(hdr
, wh
->i_addr1
); /* DA */
633 IEEE80211_ADDR_COPY(hdr
+ IEEE80211_ADDR_LEN
, wh
->i_addr3
);
635 case IEEE80211_FC1_DIR_DSTODS
:
636 IEEE80211_ADDR_COPY(hdr
, wh
->i_addr3
); /* DA */
637 IEEE80211_ADDR_COPY(hdr
+ IEEE80211_ADDR_LEN
, wh
->i_addr4
);
641 if (wh
->i_fc
[0] & IEEE80211_FC0_SUBTYPE_QOS
) {
642 const struct ieee80211_qosframe
*qwh
=
643 (const struct ieee80211_qosframe
*)wh
;
644 hdr
[12] = qwh
->i_qos
[0] & IEEE80211_QOS_TID
;
647 hdr
[13] = hdr
[14] = hdr
[15] = 0; /* reserved */
652 michael_mic(struct tkip_ctx
*ctx
, const uint8_t *key
,
653 mblk_t
*mp
, uint_t off
, size_t data_len
,
654 uint8_t mic
[IEEE80211_WEP_MICLEN
])
661 michael_mic_hdr((struct ieee80211_frame
*)mp
->b_rptr
, hdr
);
664 r
= get_le32(key
+ 4);
666 /* Michael MIC pseudo header: DA, SA, 3 x 0, Priority */
669 l
^= get_le32(&hdr
[4]);
671 l
^= get_le32(&hdr
[8]);
673 l
^= get_le32(&hdr
[12]);
676 /* first buffer has special handling */
677 data
= mp
->b_rptr
+ off
;
679 blocks
= data_len
/ 4;
682 for (i
= 0; i
< blocks
; i
++) {
683 l
^= get_le32(&data
[4 * i
]);
687 /* Last block and padding (0x5a, 4..7 x 0) */
693 l
^= data
[4 * i
] | 0x5a00;
696 l
^= data
[4 * i
] | (data
[4 * i
+ 1] << 8) | 0x5a0000;
699 l
^= data
[4 * i
] | (data
[4 * i
+ 1] << 8) |
700 (data
[4 * i
+ 2] << 16) | 0x5a000000;
708 put_le32(mic
+ 4, r
);
712 tkip_encrypt(struct tkip_ctx
*ctx
, struct ieee80211_key
*key
,
713 mblk_t
*mp
, int hdrlen
)
715 struct ieee80211_frame
*wh
;
718 wh
= (struct ieee80211_frame
*)mp
->b_rptr
;
719 if (!ctx
->tx_phase1_done
) {
720 tkip_mixing_phase1(ctx
->tx_ttak
, key
->wk_key
, wh
->i_addr2
,
721 (uint32_t)(key
->wk_keytsc
>> 16));
722 ctx
->tx_phase1_done
= 1;
724 tkip_mixing_phase2(ctx
->tx_rc4key
, key
->wk_key
, ctx
->tx_ttak
,
725 (uint16_t)key
->wk_keytsc
);
728 mp
->b_wptr
+= tkip
.ic_trailer
;
730 (void) wep_encrypt(ctx
->tx_rc4key
,
731 mp
, hdrlen
+ tkip
.ic_header
,
733 (hdrlen
+ tkip
.ic_header
+ tkip
.ic_trailer
),
737 if ((uint16_t)(key
->wk_keytsc
) == 0)
738 ctx
->tx_phase1_done
= 0;
743 tkip_decrypt(struct tkip_ctx
*ctx
, struct ieee80211_key
*key
,
744 mblk_t
*mp
, int hdrlen
)
746 struct ieee80211_frame
*wh
;
750 wh
= (struct ieee80211_frame
*)mp
->b_rptr
;
751 /* tkip_decap already verified header and left seq in rx_rsc */
752 iv16
= (uint16_t)ctx
->rx_rsc
;
753 iv32
= (uint32_t)(ctx
->rx_rsc
>> 16);
755 if (iv32
!= (uint32_t)(key
->wk_keyrsc
>> 16) || !ctx
->rx_phase1_done
) {
756 tkip_mixing_phase1(ctx
->rx_ttak
, key
->wk_key
,
758 ctx
->rx_phase1_done
= 0; /* DHCP */
760 tkip_mixing_phase2(ctx
->rx_rc4key
, key
->wk_key
, ctx
->rx_ttak
, iv16
);
762 /* m is unstripped; deduct headers + ICV to get payload */
763 if (!wep_decrypt(ctx
->rx_rc4key
,
764 mp
, hdrlen
+ tkip
.ic_header
,
766 (hdrlen
+ tkip
.ic_header
+ tkip
.ic_trailer
))) {
767 if (iv32
!= (uint32_t)(key
->wk_keyrsc
>> 16)) {
769 * Previously cached Phase1 result was already lost, so
770 * it needs to be recalculated for the next packet.
772 ctx
->rx_phase1_done
= 0;
774 ieee80211_dbg(IEEE80211_MSG_CRYPTO
, "tkip_decrypt() error\n");