source: rtems-libbsd/freebsd/sys/net80211/ieee80211_crypto_tkip.c @ a241ea8

55-freebsd-126-freebsd-12
Last change on this file since a241ea8 was a241ea8, checked in by Christian Mauderer <Christian.Mauderer@…>, on 11/14/16 at 12:46:13

Import IEEE 802.11 from FreeBSD.

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