GNU Linux-libre 4.14.303-gnu1
[releases.git] / drivers / staging / rtl8723bs / core / rtw_security.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  ******************************************************************************/
15 #define  _RTW_SECURITY_C_
16
17 #include <drv_types.h>
18 #include <rtw_debug.h>
19
20 static const char *_security_type_str[] = {
21         "N/A",
22         "WEP40",
23         "TKIP",
24         "TKIP_WM",
25         "AES",
26         "WEP104",
27         "SMS4",
28         "WEP_WPA",
29         "BIP",
30 };
31
32 const char *security_type_str(u8 value)
33 {
34         if (value <= _BIP_)
35                 return _security_type_str[value];
36         return NULL;
37 }
38
39 #ifdef DBG_SW_SEC_CNT
40 #define WEP_SW_ENC_CNT_INC(sec, ra) \
41         if (is_broadcast_mac_addr(ra)) \
42                 sec->wep_sw_enc_cnt_bc++; \
43         else if (is_multicast_mac_addr(ra)) \
44                 sec->wep_sw_enc_cnt_mc++; \
45         else \
46                 sec->wep_sw_enc_cnt_uc++;
47
48 #define WEP_SW_DEC_CNT_INC(sec, ra) \
49         if (is_broadcast_mac_addr(ra)) \
50                 sec->wep_sw_dec_cnt_bc++; \
51         else if (is_multicast_mac_addr(ra)) \
52                 sec->wep_sw_dec_cnt_mc++; \
53         else \
54                 sec->wep_sw_dec_cnt_uc++;
55
56 #define TKIP_SW_ENC_CNT_INC(sec, ra) \
57         if (is_broadcast_mac_addr(ra)) \
58                 sec->tkip_sw_enc_cnt_bc++; \
59         else if (is_multicast_mac_addr(ra)) \
60                 sec->tkip_sw_enc_cnt_mc++; \
61         else \
62                 sec->tkip_sw_enc_cnt_uc++;
63
64 #define TKIP_SW_DEC_CNT_INC(sec, ra) \
65         if (is_broadcast_mac_addr(ra)) \
66                 sec->tkip_sw_dec_cnt_bc++; \
67         else if (is_multicast_mac_addr(ra)) \
68                 sec->tkip_sw_dec_cnt_mc++; \
69         else \
70                 sec->tkip_sw_dec_cnt_uc++;
71
72 #define AES_SW_ENC_CNT_INC(sec, ra) \
73         if (is_broadcast_mac_addr(ra)) \
74                 sec->aes_sw_enc_cnt_bc++; \
75         else if (is_multicast_mac_addr(ra)) \
76                 sec->aes_sw_enc_cnt_mc++; \
77         else \
78                 sec->aes_sw_enc_cnt_uc++;
79
80 #define AES_SW_DEC_CNT_INC(sec, ra) \
81         if (is_broadcast_mac_addr(ra)) \
82                 sec->aes_sw_dec_cnt_bc++; \
83         else if (is_multicast_mac_addr(ra)) \
84                 sec->aes_sw_dec_cnt_mc++; \
85         else \
86                 sec->aes_sw_dec_cnt_uc++;
87 #else
88 #define WEP_SW_ENC_CNT_INC(sec, ra)
89 #define WEP_SW_DEC_CNT_INC(sec, ra)
90 #define TKIP_SW_ENC_CNT_INC(sec, ra)
91 #define TKIP_SW_DEC_CNT_INC(sec, ra)
92 #define AES_SW_ENC_CNT_INC(sec, ra)
93 #define AES_SW_DEC_CNT_INC(sec, ra)
94 #endif /* DBG_SW_SEC_CNT */
95
96 /* WEP related ===== */
97
98 #define CRC32_POLY 0x04c11db7
99
100 struct arc4context {
101         u32 x;
102         u32 y;
103         u8 state[256];
104 };
105
106
107 static void arcfour_init(struct arc4context     *parc4ctx, u8 *key, u32 key_len)
108 {
109         u32 t, u;
110         u32 keyindex;
111         u32 stateindex;
112         u8 *state;
113         u32 counter;
114
115         state = parc4ctx->state;
116         parc4ctx->x = 0;
117         parc4ctx->y = 0;
118         for (counter = 0; counter < 256; counter++)
119                 state[counter] = (u8)counter;
120         keyindex = 0;
121         stateindex = 0;
122         for (counter = 0; counter < 256; counter++) {
123                 t = state[counter];
124                 stateindex = (stateindex + key[keyindex] + t) & 0xff;
125                 u = state[stateindex];
126                 state[stateindex] = (u8)t;
127                 state[counter] = (u8)u;
128                 if (++keyindex >= key_len)
129                         keyindex = 0;
130         }
131 }
132
133 static u32 arcfour_byte(struct arc4context      *parc4ctx)
134 {
135         u32 x;
136         u32 y;
137         u32 sx, sy;
138         u8 *state;
139
140         state = parc4ctx->state;
141         x = (parc4ctx->x + 1) & 0xff;
142         sx = state[x];
143         y = (sx + parc4ctx->y) & 0xff;
144         sy = state[y];
145         parc4ctx->x = x;
146         parc4ctx->y = y;
147         state[y] = (u8)sx;
148         state[x] = (u8)sy;
149         return state[(sx + sy) & 0xff];
150 }
151
152 static void arcfour_encrypt(
153         struct arc4context *parc4ctx,
154         u8 *dest,
155         u8 *src,
156         u32 len
157 )
158 {
159         u32 i;
160
161         for (i = 0; i < len; i++)
162                 dest[i] = src[i] ^ (unsigned char)arcfour_byte(parc4ctx);
163 }
164
165 static sint bcrc32initialized;
166 static u32 crc32_table[256];
167
168
169 static u8 crc32_reverseBit(u8 data)
170 {
171         return((u8)((data<<7)&0x80) | ((data<<5)&0x40) | ((data<<3)&0x20) | ((data<<1)&0x10) | ((data>>1)&0x08) | ((data>>3)&0x04) | ((data>>5)&0x02) | ((data>>7)&0x01));
172 }
173
174 static void crc32_init(void)
175 {
176         if (bcrc32initialized == 1)
177                 return;
178         else {
179                 sint i, j;
180                 u32 c;
181                 u8 *p = (u8 *)&c, *p1;
182                 u8 k;
183
184                 c = 0x12340000;
185
186                 for (i = 0; i < 256; ++i) {
187                         k = crc32_reverseBit((u8)i);
188                         for (c = ((u32)k) << 24, j = 8; j > 0; --j) {
189                                 c = c & 0x80000000 ? (c << 1) ^ CRC32_POLY : (c << 1);
190                         }
191                         p1 = (u8 *)&crc32_table[i];
192
193                         p1[0] = crc32_reverseBit(p[3]);
194                         p1[1] = crc32_reverseBit(p[2]);
195                         p1[2] = crc32_reverseBit(p[1]);
196                         p1[3] = crc32_reverseBit(p[0]);
197                 }
198                 bcrc32initialized = 1;
199         }
200 }
201
202 static __le32 getcrc32(u8 *buf, sint len)
203 {
204         u8 *p;
205         u32  crc;
206
207         if (bcrc32initialized == 0)
208                 crc32_init();
209
210         crc = 0xffffffff;       /* preload shift register, per CRC-32 spec */
211
212         for (p = buf; len > 0; ++p, --len) {
213                 crc = crc32_table[(crc ^ *p) & 0xff] ^ (crc >> 8);
214         }
215         return cpu_to_le32(~crc);    /* transmit complement, per CRC-32 spec */
216 }
217
218
219 /*
220         Need to consider the fragment  situation
221 */
222 void rtw_wep_encrypt(struct adapter *padapter, u8 *pxmitframe)
223 {                                                                                                                                       /*  exclude ICV */
224
225         unsigned char crc[4];
226         struct arc4context       mycontext;
227
228         sint    curfragnum, length;
229         u32 keylength;
230
231         u8 *pframe, *payload, *iv;    /* wepkey */
232         u8 wepkey[16];
233         u8   hw_hdr_offset = 0;
234         struct  pkt_attrib       *pattrib = &((struct xmit_frame *)pxmitframe)->attrib;
235         struct  security_priv *psecuritypriv = &padapter->securitypriv;
236         struct  xmit_priv       *pxmitpriv = &padapter->xmitpriv;
237
238         if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL)
239                 return;
240
241         hw_hdr_offset = TXDESC_OFFSET;
242         pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + hw_hdr_offset;
243
244         /* start to encrypt each fragment */
245         if ((pattrib->encrypt == _WEP40_) || (pattrib->encrypt == _WEP104_)) {
246                 keylength = psecuritypriv->dot11DefKeylen[psecuritypriv->dot11PrivacyKeyIndex];
247
248                 for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) {
249                         iv = pframe+pattrib->hdrlen;
250                         memcpy(&wepkey[0], iv, 3);
251                         memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[psecuritypriv->dot11PrivacyKeyIndex].skey[0], keylength);
252                         payload = pframe+pattrib->iv_len+pattrib->hdrlen;
253
254                         if ((curfragnum+1) == pattrib->nr_frags) {      /* the last fragment */
255
256                                 length = pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len;
257
258                                 *((__le32 *)crc) = getcrc32(payload, length);
259
260                                 arcfour_init(&mycontext, wepkey, 3+keylength);
261                                 arcfour_encrypt(&mycontext, payload, payload, length);
262                                 arcfour_encrypt(&mycontext, payload+length, crc, 4);
263
264                         } else{
265                                 length = pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len;
266                                 *((__le32 *)crc) = getcrc32(payload, length);
267                                 arcfour_init(&mycontext, wepkey, 3+keylength);
268                                 arcfour_encrypt(&mycontext, payload, payload, length);
269                                 arcfour_encrypt(&mycontext, payload+length, crc, 4);
270
271                                 pframe += pxmitpriv->frag_len;
272                                 pframe = (u8 *)RND4((SIZE_PTR)(pframe));
273                         }
274                 }
275
276                 WEP_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra);
277         }
278 }
279
280 void rtw_wep_decrypt(struct adapter  *padapter, u8 *precvframe)
281 {
282         /*  exclude ICV */
283         u8 crc[4];
284         struct arc4context       mycontext;
285         sint    length;
286         u32 keylength;
287         u8 *pframe, *payload, *iv, wepkey[16];
288         u8  keyindex;
289         struct  rx_pkt_attrib    *prxattrib = &(((union recv_frame *)precvframe)->u.hdr.attrib);
290         struct  security_priv *psecuritypriv = &padapter->securitypriv;
291
292         pframe = (unsigned char *)((union recv_frame *)precvframe)->u.hdr.rx_data;
293
294         /* start to decrypt recvframe */
295         if ((prxattrib->encrypt == _WEP40_) || (prxattrib->encrypt == _WEP104_)) {
296                 iv = pframe+prxattrib->hdrlen;
297                 /* keyindex =(iv[3]&0x3); */
298                 keyindex = prxattrib->key_index;
299                 keylength = psecuritypriv->dot11DefKeylen[keyindex];
300                 memcpy(&wepkey[0], iv, 3);
301                 /* memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[psecuritypriv->dot11PrivacyKeyIndex].skey[0], keylength); */
302                 memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[keyindex].skey[0], keylength);
303                 length = ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len;
304
305                 payload = pframe+prxattrib->iv_len+prxattrib->hdrlen;
306
307                 /* decrypt payload include icv */
308                 arcfour_init(&mycontext, wepkey, 3+keylength);
309                 arcfour_encrypt(&mycontext, payload, payload,  length);
310
311                 /* calculate icv and compare the icv */
312                 *((u32 *)crc) = le32_to_cpu(getcrc32(payload, length-4));
313
314                 if (crc[3] != payload[length-1] || crc[2] != payload[length-2] || crc[1] != payload[length-3] || crc[0] != payload[length-4]) {
315                         RT_TRACE(_module_rtl871x_security_c_, _drv_err_, ("rtw_wep_decrypt:icv error crc[3](%x)!=payload[length-1](%x) || crc[2](%x)!=payload[length-2](%x) || crc[1](%x)!=payload[length-3](%x) || crc[0](%x)!=payload[length-4](%x)\n",
316                                                 crc[3], payload[length-1], crc[2], payload[length-2], crc[1], payload[length-3], crc[0], payload[length-4]));
317                 }
318
319                 WEP_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);
320         }
321         return;
322 }
323
324 /* 3            =====TKIP related ===== */
325
326 static u32 secmicgetuint32(u8 *p)
327 /*  Convert from Byte[] to Us3232 in a portable way */
328 {
329         s32 i;
330         u32 res = 0;
331
332         for (i = 0; i < 4; i++) {
333                 res |= ((u32)(*p++)) << (8*i);
334         }
335
336         return res;
337 }
338
339 static void secmicputuint32(u8 *p, u32 val)
340 /*  Convert from Us3232 to Byte[] in a portable way */
341 {
342         long i;
343
344         for (i = 0; i < 4; i++) {
345                 *p++ = (u8) (val & 0xff);
346                 val >>= 8;
347         }
348 }
349
350 static void secmicclear(struct mic_data *pmicdata)
351 {
352 /*  Reset the state to the empty message. */
353         pmicdata->L = pmicdata->K0;
354         pmicdata->R = pmicdata->K1;
355         pmicdata->nBytesInM = 0;
356         pmicdata->M = 0;
357 }
358
359 void rtw_secmicsetkey(struct mic_data *pmicdata, u8 *key)
360 {
361         /*  Set the key */
362         pmicdata->K0 = secmicgetuint32(key);
363         pmicdata->K1 = secmicgetuint32(key + 4);
364         /*  and reset the message */
365         secmicclear(pmicdata);
366 }
367
368 void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b)
369 {
370         /*  Append the byte to our word-sized buffer */
371         pmicdata->M |= ((unsigned long)b) << (8*pmicdata->nBytesInM);
372         pmicdata->nBytesInM++;
373         /*  Process the word if it is full. */
374         if (pmicdata->nBytesInM >= 4) {
375                 pmicdata->L ^= pmicdata->M;
376                 pmicdata->R ^= ROL32(pmicdata->L, 17);
377                 pmicdata->L += pmicdata->R;
378                 pmicdata->R ^= ((pmicdata->L & 0xff00ff00) >> 8) | ((pmicdata->L & 0x00ff00ff) << 8);
379                 pmicdata->L += pmicdata->R;
380                 pmicdata->R ^= ROL32(pmicdata->L, 3);
381                 pmicdata->L += pmicdata->R;
382                 pmicdata->R ^= ROR32(pmicdata->L, 2);
383                 pmicdata->L += pmicdata->R;
384                 /*  Clear the buffer */
385                 pmicdata->M = 0;
386                 pmicdata->nBytesInM = 0;
387         }
388 }
389
390 void rtw_secmicappend(struct mic_data *pmicdata, u8 *src, u32 nbytes)
391 {
392         /*  This is simple */
393         while (nbytes > 0) {
394                 rtw_secmicappendbyte(pmicdata, *src++);
395                 nbytes--;
396         }
397 }
398
399 void rtw_secgetmic(struct mic_data *pmicdata, u8 *dst)
400 {
401         /*  Append the minimum padding */
402         rtw_secmicappendbyte(pmicdata, 0x5a);
403         rtw_secmicappendbyte(pmicdata, 0);
404         rtw_secmicappendbyte(pmicdata, 0);
405         rtw_secmicappendbyte(pmicdata, 0);
406         rtw_secmicappendbyte(pmicdata, 0);
407         /*  and then zeroes until the length is a multiple of 4 */
408         while (pmicdata->nBytesInM != 0) {
409                 rtw_secmicappendbyte(pmicdata, 0);
410         }
411         /*  The appendByte function has already computed the result. */
412         secmicputuint32(dst, pmicdata->L);
413         secmicputuint32(dst+4, pmicdata->R);
414         /*  Reset to the empty message. */
415         secmicclear(pmicdata);
416 }
417
418
419 void rtw_seccalctkipmic(u8 *key, u8 *header, u8 *data, u32 data_len, u8 *mic_code, u8 pri)
420 {
421
422         struct mic_data micdata;
423         u8 priority[4] = {0x0, 0x0, 0x0, 0x0};
424
425         rtw_secmicsetkey(&micdata, key);
426         priority[0] = pri;
427
428         /* Michael MIC pseudo header: DA, SA, 3 x 0, Priority */
429         if (header[1]&1) {   /* ToDS == 1 */
430                 rtw_secmicappend(&micdata, &header[16], 6);  /* DA */
431                 if (header[1]&2)  /* From Ds == 1 */
432                         rtw_secmicappend(&micdata, &header[24], 6);
433                 else
434                         rtw_secmicappend(&micdata, &header[10], 6);
435         } else {        /* ToDS == 0 */
436                 rtw_secmicappend(&micdata, &header[4], 6);   /* DA */
437                 if (header[1]&2)  /* From Ds == 1 */
438                         rtw_secmicappend(&micdata, &header[16], 6);
439                 else
440                         rtw_secmicappend(&micdata, &header[10], 6);
441
442         }
443         rtw_secmicappend(&micdata, &priority[0], 4);
444
445
446         rtw_secmicappend(&micdata, data, data_len);
447
448         rtw_secgetmic(&micdata, mic_code);
449 }
450
451 /* macros for extraction/creation of unsigned char/unsigned short values  */
452 #define RotR1(v16)   ((((v16) >> 1) & 0x7FFF) ^ (((v16) & 1) << 15))
453 #define   Lo8(v16)   ((u8)((v16)       & 0x00FF))
454 #define   Hi8(v16)   ((u8)(((v16) >> 8) & 0x00FF))
455 #define  Lo16(v32)   ((u16)((v32)       & 0xFFFF))
456 #define  Hi16(v32)   ((u16)(((v32) >> 16) & 0xFFFF))
457 #define  Mk16(hi, lo) ((lo) ^ (((u16)(hi)) << 8))
458
459 /* select the Nth 16-bit word of the temporal key unsigned char array TK[]   */
460 #define  TK16(N)     Mk16(tk[2*(N)+1], tk[2*(N)])
461
462 /* S-box lookup: 16 bits --> 16 bits */
463 #define _S_(v16)     (Sbox1[0][Lo8(v16)] ^ Sbox1[1][Hi8(v16)])
464
465 /* fixed algorithm "parameters" */
466 #define PHASE1_LOOP_CNT   8    /* this needs to be "big enough"     */
467 #define TA_SIZE           6    /*  48-bit transmitter address       */
468 #define TK_SIZE          16    /* 128-bit temporal key              */
469 #define P1K_SIZE         10    /*  80-bit Phase1 key                */
470 #define RC4_KEY_SIZE     16    /* 128-bit RC4KEY (104 bits unknown) */
471
472
473 /* 2-unsigned char by 2-unsigned char subset of the full AES S-box table */
474 static const unsigned short Sbox1[2][256] = {      /* Sbox for hash (can be in ROM)     */
475 {
476          0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154,
477          0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A,
478          0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B,
479          0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B,
480          0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F,
481          0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F,
482          0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5,
483          0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F,
484          0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB,
485          0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397,
486          0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED,
487          0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A,
488          0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194,
489          0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3,
490          0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104,
491          0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D,
492          0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39,
493          0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695,
494          0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83,
495          0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76,
496          0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4,
497          0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B,
498          0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0,
499          0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018,
500          0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751,
501          0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85,
502          0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12,
503          0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9,
504          0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7,
505          0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A,
506          0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8,
507          0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A,
508         },
509
510
511         {  /* second half of table is unsigned char-reversed version of first! */
512          0xA5C6, 0x84F8, 0x99EE, 0x8DF6, 0x0DFF, 0xBDD6, 0xB1DE, 0x5491,
513          0x5060, 0x0302, 0xA9CE, 0x7D56, 0x19E7, 0x62B5, 0xE64D, 0x9AEC,
514          0x458F, 0x9D1F, 0x4089, 0x87FA, 0x15EF, 0xEBB2, 0xC98E, 0x0BFB,
515          0xEC41, 0x67B3, 0xFD5F, 0xEA45, 0xBF23, 0xF753, 0x96E4, 0x5B9B,
516          0xC275, 0x1CE1, 0xAE3D, 0x6A4C, 0x5A6C, 0x417E, 0x02F5, 0x4F83,
517          0x5C68, 0xF451, 0x34D1, 0x08F9, 0x93E2, 0x73AB, 0x5362, 0x3F2A,
518          0x0C08, 0x5295, 0x6546, 0x5E9D, 0x2830, 0xA137, 0x0F0A, 0xB52F,
519          0x090E, 0x3624, 0x9B1B, 0x3DDF, 0x26CD, 0x694E, 0xCD7F, 0x9FEA,
520          0x1B12, 0x9E1D, 0x7458, 0x2E34, 0x2D36, 0xB2DC, 0xEEB4, 0xFB5B,
521          0xF6A4, 0x4D76, 0x61B7, 0xCE7D, 0x7B52, 0x3EDD, 0x715E, 0x9713,
522          0xF5A6, 0x68B9, 0x0000, 0x2CC1, 0x6040, 0x1FE3, 0xC879, 0xEDB6,
523          0xBED4, 0x468D, 0xD967, 0x4B72, 0xDE94, 0xD498, 0xE8B0, 0x4A85,
524          0x6BBB, 0x2AC5, 0xE54F, 0x16ED, 0xC586, 0xD79A, 0x5566, 0x9411,
525          0xCF8A, 0x10E9, 0x0604, 0x81FE, 0xF0A0, 0x4478, 0xBA25, 0xE34B,
526          0xF3A2, 0xFE5D, 0xC080, 0x8A05, 0xAD3F, 0xBC21, 0x4870, 0x04F1,
527          0xDF63, 0xC177, 0x75AF, 0x6342, 0x3020, 0x1AE5, 0x0EFD, 0x6DBF,
528          0x4C81, 0x1418, 0x3526, 0x2FC3, 0xE1BE, 0xA235, 0xCC88, 0x392E,
529          0x5793, 0xF255, 0x82FC, 0x477A, 0xACC8, 0xE7BA, 0x2B32, 0x95E6,
530          0xA0C0, 0x9819, 0xD19E, 0x7FA3, 0x6644, 0x7E54, 0xAB3B, 0x830B,
531          0xCA8C, 0x29C7, 0xD36B, 0x3C28, 0x79A7, 0xE2BC, 0x1D16, 0x76AD,
532          0x3BDB, 0x5664, 0x4E74, 0x1E14, 0xDB92, 0x0A0C, 0x6C48, 0xE4B8,
533          0x5D9F, 0x6EBD, 0xEF43, 0xA6C4, 0xA839, 0xA431, 0x37D3, 0x8BF2,
534          0x32D5, 0x438B, 0x596E, 0xB7DA, 0x8C01, 0x64B1, 0xD29C, 0xE049,
535          0xB4D8, 0xFAAC, 0x07F3, 0x25CF, 0xAFCA, 0x8EF4, 0xE947, 0x1810,
536          0xD56F, 0x88F0, 0x6F4A, 0x725C, 0x2438, 0xF157, 0xC773, 0x5197,
537          0x23CB, 0x7CA1, 0x9CE8, 0x213E, 0xDD96, 0xDC61, 0x860D, 0x850F,
538          0x90E0, 0x427C, 0xC471, 0xAACC, 0xD890, 0x0506, 0x01F7, 0x121C,
539          0xA3C2, 0x5F6A, 0xF9AE, 0xD069, 0x9117, 0x5899, 0x273A, 0xB927,
540          0x38D9, 0x13EB, 0xB32B, 0x3322, 0xBBD2, 0x70A9, 0x8907, 0xA733,
541          0xB62D, 0x223C, 0x9215, 0x20C9, 0x4987, 0xFFAA, 0x7850, 0x7AA5,
542          0x8F03, 0xF859, 0x8009, 0x171A, 0xDA65, 0x31D7, 0xC684, 0xB8D0,
543          0xC382, 0xB029, 0x775A, 0x111E, 0xCB7B, 0xFCA8, 0xD66D, 0x3A2C,
544         }
545 };
546
547  /*
548 **********************************************************************
549 * Routine: Phase 1 -- generate P1K, given TA, TK, IV32
550 *
551 * Inputs:
552 *     tk[]      = temporal key                         [128 bits]
553 *     ta[]      = transmitter's MAC address            [ 48 bits]
554 *     iv32      = upper 32 bits of IV                  [ 32 bits]
555 * Output:
556 *     p1k[]     = Phase 1 key                          [ 80 bits]
557 *
558 * Note:
559 *     This function only needs to be called every 2**16 packets,
560 *     although in theory it could be called every packet.
561 *
562 **********************************************************************
563 */
564 static void phase1(u16 *p1k, const u8 *tk, const u8 *ta, u32 iv32)
565 {
566         sint  i;
567
568         /* Initialize the 80 bits of P1K[] from IV32 and TA[0..5]     */
569         p1k[0]      = Lo16(iv32);
570         p1k[1]      = Hi16(iv32);
571         p1k[2]      = Mk16(ta[1], ta[0]); /* use TA[] as little-endian */
572         p1k[3]      = Mk16(ta[3], ta[2]);
573         p1k[4]      = Mk16(ta[5], ta[4]);
574
575         /* Now compute an unbalanced Feistel cipher with 80-bit block */
576         /* size on the 80-bit block P1K[], using the 128-bit key TK[] */
577         for (i = 0; i < PHASE1_LOOP_CNT; i++) {
578                 /* Each add operation here is mod 2**16 */
579                 p1k[0] += _S_(p1k[4] ^ TK16((i&1)+0));
580                 p1k[1] += _S_(p1k[0] ^ TK16((i&1)+2));
581                 p1k[2] += _S_(p1k[1] ^ TK16((i&1)+4));
582                 p1k[3] += _S_(p1k[2] ^ TK16((i&1)+6));
583                 p1k[4] += _S_(p1k[3] ^ TK16((i&1)+0));
584                 p1k[4] +=  (unsigned short)i;          /* avoid "slide attacks" */
585         }
586 }
587
588
589 /*
590 **********************************************************************
591 * Routine: Phase 2 -- generate RC4KEY, given TK, P1K, IV16
592 *
593 * Inputs:
594 *     tk[]      = Temporal key                         [128 bits]
595 *     p1k[]     = Phase 1 output key                   [ 80 bits]
596 *     iv16      = low 16 bits of IV counter            [ 16 bits]
597 * Output:
598 *     rc4key[]  = the key used to encrypt the packet   [128 bits]
599 *
600 * Note:
601 *     The value {TA, IV32, IV16} for Phase1/Phase2 must be unique
602 *     across all packets using the same key TK value. Then, for a
603 *     given value of TK[], this TKIP48 construction guarantees that
604 *     the final RC4KEY value is unique across all packets.
605 *
606 * Suggested implementation optimization: if PPK[] is "overlaid"
607 *     appropriately on RC4KEY[], there is no need for the final
608 *     for loop below that copies the PPK[] result into RC4KEY[].
609 *
610 **********************************************************************
611 */
612 static void phase2(u8 *rc4key, const u8 *tk, const u16 *p1k, u16 iv16)
613 {
614         sint  i;
615         u16 PPK[6];                          /* temporary key for mixing    */
616
617         /* Note: all adds in the PPK[] equations below are mod 2**16         */
618         for (i = 0; i < 5; i++)
619                 PPK[i] = p1k[i];      /* first, copy P1K to PPK      */
620
621         PPK[5]  =  p1k[4]+iv16;             /* next,  add in IV16          */
622
623         /* Bijective non-linear mixing of the 96 bits of PPK[0..5]           */
624         PPK[0] +=    _S_(PPK[5] ^ TK16(0));   /* Mix key in each "round"     */
625         PPK[1] +=    _S_(PPK[0] ^ TK16(1));
626         PPK[2] +=    _S_(PPK[1] ^ TK16(2));
627         PPK[3] +=    _S_(PPK[2] ^ TK16(3));
628         PPK[4] +=    _S_(PPK[3] ^ TK16(4));
629         PPK[5] +=    _S_(PPK[4] ^ TK16(5));   /* Total # S-box lookups == 6  */
630
631         /* Final sweep: bijective, "linear". Rotates kill LSB correlations   */
632         PPK[0] +=  RotR1(PPK[5] ^ TK16(6));
633         PPK[1] +=  RotR1(PPK[0] ^ TK16(7));   /* Use all of TK[] in Phase2   */
634         PPK[2] +=  RotR1(PPK[1]);
635         PPK[3] +=  RotR1(PPK[2]);
636         PPK[4] +=  RotR1(PPK[3]);
637         PPK[5] +=  RotR1(PPK[4]);
638         /* Note: At this point, for a given key TK[0..15], the 96-bit output */
639         /*       value PPK[0..5] is guaranteed to be unique, as a function   */
640         /*       of the 96-bit "input" value   {TA, IV32, IV16}. That is, P1K  */
641         /*       is now a keyed permutation of {TA, IV32, IV16}.               */
642
643         /* Set RC4KEY[0..3], which includes "cleartext" portion of RC4 key   */
644         rc4key[0] = Hi8(iv16);                /* RC4KEY[0..2] is the WEP IV  */
645         rc4key[1] = (Hi8(iv16) | 0x20) & 0x7F; /* Help avoid weak (FMS) keys  */
646         rc4key[2] = Lo8(iv16);
647         rc4key[3] = Lo8((PPK[5] ^ TK16(0)) >> 1);
648
649
650         /* Copy 96 bits of PPK[0..5] to RC4KEY[4..15]  (little-endian)       */
651         for (i = 0; i < 6; i++) {
652                 rc4key[4+2*i] = Lo8(PPK[i]);
653                 rc4key[5+2*i] = Hi8(PPK[i]);
654         }
655 }
656
657
658 /* The hlen isn't include the IV */
659 u32 rtw_tkip_encrypt(struct adapter *padapter, u8 *pxmitframe)
660 {                                                                                                                                       /*  exclude ICV */
661         u16 pnl;
662         u32 pnh;
663         u8 rc4key[16];
664         u8   ttkey[16];
665         u8 crc[4];
666         u8   hw_hdr_offset = 0;
667         struct arc4context mycontext;
668         sint                    curfragnum, length;
669         u32 prwskeylen;
670
671         u8 *pframe, *payload, *iv, *prwskey;
672         union pn48 dot11txpn;
673         /* struct       sta_info        *stainfo; */
674         struct  pkt_attrib       *pattrib = &((struct xmit_frame *)pxmitframe)->attrib;
675         struct  security_priv *psecuritypriv = &padapter->securitypriv;
676         struct  xmit_priv       *pxmitpriv = &padapter->xmitpriv;
677         u32 res = _SUCCESS;
678
679         if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL)
680                 return _FAIL;
681
682         hw_hdr_offset = TXDESC_OFFSET;
683         pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + hw_hdr_offset;
684
685         /* 4 start to encrypt each fragment */
686         if (pattrib->encrypt == _TKIP_) {
687
688 /*
689                 if (pattrib->psta)
690                 {
691                         stainfo = pattrib->psta;
692                 }
693                 else
694                 {
695                         DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
696                         stainfo =rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]);
697                 }
698 */
699                 /* if (stainfo!= NULL) */
700                 {
701 /*
702                         if (!(stainfo->state &_FW_LINKED))
703                         {
704                                 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, stainfo->state);
705                                 return _FAIL;
706                         }
707 */
708                         RT_TRACE(_module_rtl871x_security_c_, _drv_err_, ("rtw_tkip_encrypt: stainfo!= NULL!!!\n"));
709
710                         if (IS_MCAST(pattrib->ra))
711                                 prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey;
712                         else
713                                 /* prwskey =&stainfo->dot118021x_UncstKey.skey[0]; */
714                                 prwskey = pattrib->dot118021x_UncstKey.skey;
715
716                         prwskeylen = 16;
717
718                         for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) {
719                                 iv = pframe+pattrib->hdrlen;
720                                 payload = pframe+pattrib->iv_len+pattrib->hdrlen;
721
722                                 GET_TKIP_PN(iv, dot11txpn);
723
724                                 pnl = (u16)(dot11txpn.val);
725                                 pnh = (u32)(dot11txpn.val>>16);
726
727                                 phase1((u16 *)&ttkey[0], prwskey, &pattrib->ta[0], pnh);
728
729                                 phase2(&rc4key[0], prwskey, (u16 *)&ttkey[0], pnl);
730
731                                 if ((curfragnum+1) == pattrib->nr_frags) {      /* 4 the last fragment */
732                                         length = pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len;
733                                         RT_TRACE(_module_rtl871x_security_c_, _drv_info_, ("pattrib->iv_len =%x, pattrib->icv_len =%x\n", pattrib->iv_len, pattrib->icv_len));
734                                         *((__le32 *)crc) = getcrc32(payload, length);/* modified by Amy*/
735
736                                         arcfour_init(&mycontext, rc4key, 16);
737                                         arcfour_encrypt(&mycontext, payload, payload, length);
738                                         arcfour_encrypt(&mycontext, payload+length, crc, 4);
739
740                                 } else {
741                                         length = pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len;
742                                         *((__le32 *)crc) = getcrc32(payload, length);/* modified by Amy*/
743                                         arcfour_init(&mycontext, rc4key, 16);
744                                         arcfour_encrypt(&mycontext, payload, payload, length);
745                                         arcfour_encrypt(&mycontext, payload+length, crc, 4);
746
747                                         pframe += pxmitpriv->frag_len;
748                                         pframe = (u8 *)RND4((SIZE_PTR)(pframe));
749                                 }
750                         }
751
752                         TKIP_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra);
753                 }
754 /*
755                 else {
756                         RT_TRACE(_module_rtl871x_security_c_, _drv_err_, ("rtw_tkip_encrypt: stainfo == NULL!!!\n"));
757                         DBG_871X("%s, psta ==NUL\n", __func__);
758                         res = _FAIL;
759                 }
760 */
761
762         }
763         return res;
764 }
765
766
767 /* The hlen isn't include the IV */
768 u32 rtw_tkip_decrypt(struct adapter *padapter, u8 *precvframe)
769 {                                                                                                                                       /*  exclude ICV */
770         u16 pnl;
771         u32 pnh;
772         u8   rc4key[16];
773         u8   ttkey[16];
774         u8 crc[4];
775         struct arc4context mycontext;
776         sint                    length;
777         u32 prwskeylen;
778
779         u8 *pframe, *payload, *iv, *prwskey;
780         union pn48 dot11txpn;
781         struct  sta_info        *stainfo;
782         struct  rx_pkt_attrib    *prxattrib = &((union recv_frame *)precvframe)->u.hdr.attrib;
783         struct  security_priv *psecuritypriv = &padapter->securitypriv;
784 /*      struct  recv_priv       *precvpriv =&padapter->recvpriv; */
785         u32     res = _SUCCESS;
786
787         pframe = (unsigned char *)((union recv_frame *)precvframe)->u.hdr.rx_data;
788
789         /* 4 start to decrypt recvframe */
790         if (prxattrib->encrypt == _TKIP_) {
791                 stainfo = rtw_get_stainfo(&padapter->stapriv, &prxattrib->ta[0]);
792                 if (stainfo != NULL) {
793                         if (IS_MCAST(prxattrib->ra)) {
794                                 static unsigned long start;
795                                 static u32 no_gkey_bc_cnt;
796                                 static u32 no_gkey_mc_cnt;
797
798                                 if (psecuritypriv->binstallGrpkey == false) {
799                                         res = _FAIL;
800
801                                         if (start == 0)
802                                                 start = jiffies;
803
804                                         if (is_broadcast_mac_addr(prxattrib->ra))
805                                                 no_gkey_bc_cnt++;
806                                         else
807                                                 no_gkey_mc_cnt++;
808
809                                         if (jiffies_to_msecs(jiffies - start) > 1000) {
810                                                 if (no_gkey_bc_cnt || no_gkey_mc_cnt) {
811                                                         DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n",
812                                                                 FUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt);
813                                                 }
814                                                 start = jiffies;
815                                                 no_gkey_bc_cnt = 0;
816                                                 no_gkey_mc_cnt = 0;
817                                         }
818                                         goto exit;
819                                 }
820
821                                 if (no_gkey_bc_cnt || no_gkey_mc_cnt) {
822                                         DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" gkey installed. no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n",
823                                                 FUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt);
824                                 }
825                                 start = 0;
826                                 no_gkey_bc_cnt = 0;
827                                 no_gkey_mc_cnt = 0;
828
829                                 /* DBG_871X("rx bc/mc packets, to perform sw rtw_tkip_decrypt\n"); */
830                                 /* prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; */
831                                 prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey;
832                                 prwskeylen = 16;
833                         } else{
834                                 prwskey = &stainfo->dot118021x_UncstKey.skey[0];
835                                 prwskeylen = 16;
836                         }
837
838                         iv = pframe+prxattrib->hdrlen;
839                         payload = pframe+prxattrib->iv_len+prxattrib->hdrlen;
840                         length = ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len;
841
842                         GET_TKIP_PN(iv, dot11txpn);
843
844                         pnl = (u16)(dot11txpn.val);
845                         pnh = (u32)(dot11txpn.val>>16);
846
847                         phase1((u16 *)&ttkey[0], prwskey, &prxattrib->ta[0], pnh);
848                         phase2(&rc4key[0], prwskey, (unsigned short *)&ttkey[0], pnl);
849
850                         /* 4 decrypt payload include icv */
851
852                         arcfour_init(&mycontext, rc4key, 16);
853                         arcfour_encrypt(&mycontext, payload, payload, length);
854
855                         *((u32 *)crc) = le32_to_cpu(getcrc32(payload, length-4));
856
857                         if (crc[3] != payload[length-1] || crc[2] != payload[length-2] || crc[1] != payload[length-3] || crc[0] != payload[length-4]) {
858                                 RT_TRACE(_module_rtl871x_security_c_, _drv_err_,
859                                          ("rtw_wep_decrypt:icv error crc[3](%x)!=payload[length-1](%x) || crc[2](%x)!=payload[length-2](%x) || crc[1](%x)!=payload[length-3](%x) || crc[0](%x)!=payload[length-4](%x)\n",
860                                          crc[3], payload[length-1], crc[2], payload[length-2], crc[1], payload[length-3], crc[0], payload[length-4]));
861                                 res = _FAIL;
862                         }
863
864                         TKIP_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);
865                 } else {
866                         RT_TRACE(_module_rtl871x_security_c_, _drv_err_, ("rtw_tkip_decrypt: stainfo == NULL!!!\n"));
867                         res = _FAIL;
868                 }
869
870         }
871 exit:
872         return res;
873
874 }
875
876
877 /* 3                    =====AES related ===== */
878
879
880
881 #define MAX_MSG_SIZE    2048
882 /*****************************/
883 /******** SBOX Table *********/
884 /*****************************/
885
886         static  u8 sbox_table[256] = {
887                         0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
888                         0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
889                         0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
890                         0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
891                         0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
892                         0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
893                         0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
894                         0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
895                         0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
896                         0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
897                         0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
898                         0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
899                         0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
900                         0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
901                         0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
902                         0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
903                         0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
904                         0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
905                         0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
906                         0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
907                         0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
908                         0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
909                         0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
910                         0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
911                         0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
912                         0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
913                         0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
914                         0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
915                         0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
916                         0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
917                         0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
918                         0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
919                 };
920
921 /*****************************/
922 /**** Function Prototypes ****/
923 /*****************************/
924
925 static void bitwise_xor(u8 *ina, u8 *inb, u8 *out);
926 static void construct_mic_iv(
927         u8 *mic_header1,
928         sint qc_exists,
929         sint a4_exists,
930         u8 *mpdu,
931         uint payload_length,
932         u8 *pn_vector,
933         uint frtype
934 );/*  add for CONFIG_IEEE80211W, none 11w also can use */
935 static void construct_mic_header1(
936         u8 *mic_header1,
937         sint header_length,
938         u8 *mpdu,
939         uint frtype
940 );/*  add for CONFIG_IEEE80211W, none 11w also can use */
941 static void construct_mic_header2(
942         u8 *mic_header2,
943         u8 *mpdu,
944         sint a4_exists,
945         sint qc_exists
946 );
947 static void construct_ctr_preload(
948         u8 *ctr_preload,
949         sint a4_exists,
950         sint qc_exists,
951         u8 *mpdu,
952         u8 *pn_vector,
953         sint c,
954         uint frtype
955 );/*  add for CONFIG_IEEE80211W, none 11w also can use */
956 static void xor_128(u8 *a, u8 *b, u8 *out);
957 static void xor_32(u8 *a, u8 *b, u8 *out);
958 static u8 sbox(u8 a);
959 static void next_key(u8 *key, sint round);
960 static void byte_sub(u8 *in, u8 *out);
961 static void shift_row(u8 *in, u8 *out);
962 static void mix_column(u8 *in, u8 *out);
963 static void aes128k128d(u8 *key, u8 *data, u8 *ciphertext);
964
965
966 /****************************************/
967 /* aes128k128d()                        */
968 /* Performs a 128 bit AES encrypt with  */
969 /* 128 bit data.                        */
970 /****************************************/
971 static void xor_128(u8 *a, u8 *b, u8 *out)
972 {
973                 sint i;
974
975                 for (i = 0; i < 16; i++) {
976                         out[i] = a[i] ^ b[i];
977                 }
978 }
979
980
981 static void xor_32(u8 *a, u8 *b, u8 *out)
982 {
983                 sint i;
984
985                 for (i = 0; i < 4; i++) {
986                         out[i] = a[i] ^ b[i];
987                 }
988 }
989
990
991 static u8 sbox(u8 a)
992 {
993                 return sbox_table[(sint)a];
994 }
995
996
997 static void next_key(u8 *key, sint round)
998 {
999                 u8 rcon;
1000                 u8 sbox_key[4];
1001                 u8 rcon_table[12] = {
1002                         0x01, 0x02, 0x04, 0x08,
1003                         0x10, 0x20, 0x40, 0x80,
1004                         0x1b, 0x36, 0x36, 0x36
1005                 };
1006                 sbox_key[0] = sbox(key[13]);
1007                 sbox_key[1] = sbox(key[14]);
1008                 sbox_key[2] = sbox(key[15]);
1009                 sbox_key[3] = sbox(key[12]);
1010
1011                 rcon = rcon_table[round];
1012
1013                 xor_32(&key[0], sbox_key, &key[0]);
1014                 key[0] = key[0] ^ rcon;
1015
1016                 xor_32(&key[4], &key[0], &key[4]);
1017                 xor_32(&key[8], &key[4], &key[8]);
1018                 xor_32(&key[12], &key[8], &key[12]);
1019 }
1020
1021
1022 static void byte_sub(u8 *in, u8 *out)
1023 {
1024                 sint i;
1025
1026                 for (i = 0; i < 16; i++) {
1027                         out[i] = sbox(in[i]);
1028                 }
1029 }
1030
1031
1032 static void shift_row(u8 *in, u8 *out)
1033 {
1034                 out[0] =  in[0];
1035                 out[1] =  in[5];
1036                 out[2] =  in[10];
1037                 out[3] =  in[15];
1038                 out[4] =  in[4];
1039                 out[5] =  in[9];
1040                 out[6] =  in[14];
1041                 out[7] =  in[3];
1042                 out[8] =  in[8];
1043                 out[9] =  in[13];
1044                 out[10] = in[2];
1045                 out[11] = in[7];
1046                 out[12] = in[12];
1047                 out[13] = in[1];
1048                 out[14] = in[6];
1049                 out[15] = in[11];
1050 }
1051
1052
1053 static void mix_column(u8 *in, u8 *out)
1054 {
1055                 sint i;
1056                 u8 add1b[4];
1057                 u8 add1bf7[4];
1058                 u8 rotl[4];
1059                 u8 swap_halfs[4];
1060                 u8 andf7[4];
1061                 u8 rotr[4];
1062                 u8 temp[4];
1063                 u8 tempb[4];
1064
1065                 for (i = 0; i < 4; i++) {
1066                         if ((in[i] & 0x80) == 0x80)
1067                                 add1b[i] = 0x1b;
1068                         else
1069                                 add1b[i] = 0x00;
1070                 }
1071
1072                 swap_halfs[0] = in[2];    /* Swap halfs */
1073                 swap_halfs[1] = in[3];
1074                 swap_halfs[2] = in[0];
1075                 swap_halfs[3] = in[1];
1076
1077                 rotl[0] = in[3];        /* Rotate left 8 bits */
1078                 rotl[1] = in[0];
1079                 rotl[2] = in[1];
1080                 rotl[3] = in[2];
1081
1082                 andf7[0] = in[0] & 0x7f;
1083                 andf7[1] = in[1] & 0x7f;
1084                 andf7[2] = in[2] & 0x7f;
1085                 andf7[3] = in[3] & 0x7f;
1086
1087                 for (i = 3; i > 0; i--) {  /* logical shift left 1 bit */
1088                         andf7[i] = andf7[i] << 1;
1089                         if ((andf7[i-1] & 0x80) == 0x80)
1090                                 andf7[i] = (andf7[i] | 0x01);
1091                 }
1092                 andf7[0] = andf7[0] << 1;
1093                 andf7[0] = andf7[0] & 0xfe;
1094
1095                 xor_32(add1b, andf7, add1bf7);
1096
1097                 xor_32(in, add1bf7, rotr);
1098
1099                 temp[0] = rotr[0];         /* Rotate right 8 bits */
1100                 rotr[0] = rotr[1];
1101                 rotr[1] = rotr[2];
1102                 rotr[2] = rotr[3];
1103                 rotr[3] = temp[0];
1104
1105                 xor_32(add1bf7, rotr, temp);
1106                 xor_32(swap_halfs, rotl, tempb);
1107                 xor_32(temp, tempb, out);
1108 }
1109
1110 static void aes128k128d(u8 *key, u8 *data, u8 *ciphertext)
1111 {
1112                 sint round;
1113                 sint i;
1114                 u8 intermediatea[16];
1115                 u8 intermediateb[16];
1116                 u8 round_key[16];
1117
1118                 for (i = 0; i < 16; i++)
1119                         round_key[i] = key[i];
1120
1121                 for (round = 0; round < 11; round++) {
1122                         if (round == 0) {
1123                                 xor_128(round_key, data, ciphertext);
1124                                 next_key(round_key, round);
1125                         } else if (round == 10) {
1126                                 byte_sub(ciphertext, intermediatea);
1127                                 shift_row(intermediatea, intermediateb);
1128                                 xor_128(intermediateb, round_key, ciphertext);
1129                         } else{   /* 1 - 9 */
1130                                 byte_sub(ciphertext, intermediatea);
1131                                 shift_row(intermediatea, intermediateb);
1132                                 mix_column(&intermediateb[0], &intermediatea[0]);
1133                                 mix_column(&intermediateb[4], &intermediatea[4]);
1134                                 mix_column(&intermediateb[8], &intermediatea[8]);
1135                                 mix_column(&intermediateb[12], &intermediatea[12]);
1136                                 xor_128(intermediatea, round_key, ciphertext);
1137                                 next_key(round_key, round);
1138                         }
1139                 }
1140 }
1141
1142
1143 /************************************************/
1144 /* construct_mic_iv()                           */
1145 /* Builds the MIC IV from header fields and PN  */
1146 /* Baron think the function is construct CCM    */
1147 /* nonce                                        */
1148 /************************************************/
1149 static void construct_mic_iv(
1150         u8 *mic_iv,
1151         sint qc_exists,
1152         sint a4_exists,
1153         u8 *mpdu,
1154         uint payload_length,
1155         u8 *pn_vector,
1156         uint frtype/*  add for CONFIG_IEEE80211W, none 11w also can use */
1157 )
1158 {
1159                 sint i;
1160
1161                 mic_iv[0] = 0x59;
1162
1163                 if (qc_exists && a4_exists)
1164                         mic_iv[1] = mpdu[30] & 0x0f;    /* QoS_TC           */
1165
1166                 if (qc_exists && !a4_exists)
1167                         mic_iv[1] = mpdu[24] & 0x0f;   /* mute bits 7-4    */
1168
1169                 if (!qc_exists)
1170                         mic_iv[1] = 0x00;
1171
1172                 /* 802.11w management frame should set management bit(4) */
1173                 if (frtype == WIFI_MGT_TYPE)
1174                         mic_iv[1] |= BIT(4);
1175
1176                 for (i = 2; i < 8; i++)
1177                         mic_iv[i] = mpdu[i + 8];   /* mic_iv[2:7] = A2[0:5] = mpdu[10:15] */
1178                 #ifdef CONSISTENT_PN_ORDER
1179                 for (i = 8; i < 14; i++)
1180                         mic_iv[i] = pn_vector[i - 8];           /* mic_iv[8:13] = PN[0:5] */
1181                 #else
1182                 for (i = 8; i < 14; i++)
1183                         mic_iv[i] = pn_vector[13 - i];          /* mic_iv[8:13] = PN[5:0] */
1184                 #endif
1185                 mic_iv[14] = (unsigned char) (payload_length / 256);
1186                 mic_iv[15] = (unsigned char) (payload_length % 256);
1187 }
1188
1189
1190 /************************************************/
1191 /* construct_mic_header1()                      */
1192 /* Builds the first MIC header block from       */
1193 /* header fields.                               */
1194 /* Build AAD SC, A1, A2                           */
1195 /************************************************/
1196 static void construct_mic_header1(
1197         u8 *mic_header1,
1198         sint header_length,
1199         u8 *mpdu,
1200         uint frtype/*  add for CONFIG_IEEE80211W, none 11w also can use */
1201 )
1202 {
1203                 mic_header1[0] = (u8)((header_length - 2) / 256);
1204                 mic_header1[1] = (u8)((header_length - 2) % 256);
1205
1206                 /* 802.11w management frame don't AND subtype bits 4, 5, 6 of frame control field */
1207                 if (frtype == WIFI_MGT_TYPE)
1208                         mic_header1[2] = mpdu[0];
1209                 else
1210                         mic_header1[2] = mpdu[0] & 0xcf;    /* Mute CF poll & CF ack bits */
1211
1212                 mic_header1[3] = mpdu[1] & 0xc7;    /* Mute retry, more data and pwr mgt bits */
1213                 mic_header1[4] = mpdu[4];       /* A1 */
1214                 mic_header1[5] = mpdu[5];
1215                 mic_header1[6] = mpdu[6];
1216                 mic_header1[7] = mpdu[7];
1217                 mic_header1[8] = mpdu[8];
1218                 mic_header1[9] = mpdu[9];
1219                 mic_header1[10] = mpdu[10];     /* A2 */
1220                 mic_header1[11] = mpdu[11];
1221                 mic_header1[12] = mpdu[12];
1222                 mic_header1[13] = mpdu[13];
1223                 mic_header1[14] = mpdu[14];
1224                 mic_header1[15] = mpdu[15];
1225 }
1226
1227
1228 /************************************************/
1229 /* construct_mic_header2()                      */
1230 /* Builds the last MIC header block from        */
1231 /* header fields.                               */
1232 /************************************************/
1233 static void construct_mic_header2(
1234         u8 *mic_header2,
1235         u8 *mpdu,
1236         sint a4_exists,
1237         sint qc_exists
1238 )
1239 {
1240                 sint i;
1241
1242                 for (i = 0; i < 16; i++)
1243                         mic_header2[i] = 0x00;
1244
1245                 mic_header2[0] = mpdu[16];    /* A3 */
1246                 mic_header2[1] = mpdu[17];
1247                 mic_header2[2] = mpdu[18];
1248                 mic_header2[3] = mpdu[19];
1249                 mic_header2[4] = mpdu[20];
1250                 mic_header2[5] = mpdu[21];
1251
1252                 mic_header2[6] = 0x00;
1253                 mic_header2[7] = 0x00; /* mpdu[23]; */
1254
1255
1256                 if (!qc_exists && a4_exists) {
1257                         for (i = 0; i < 6; i++)
1258                                 mic_header2[8+i] = mpdu[24+i];   /* A4 */
1259
1260                 }
1261
1262                 if (qc_exists && !a4_exists) {
1263                         mic_header2[8] = mpdu[24] & 0x0f; /* mute bits 15 - 4 */
1264                         mic_header2[9] = mpdu[25] & 0x00;
1265                 }
1266
1267                 if (qc_exists && a4_exists) {
1268                         for (i = 0; i < 6; i++)
1269                                 mic_header2[8+i] = mpdu[24+i];   /* A4 */
1270
1271                         mic_header2[14] = mpdu[30] & 0x0f;
1272                         mic_header2[15] = mpdu[31] & 0x00;
1273                 }
1274
1275 }
1276
1277 /************************************************/
1278 /* construct_mic_header2()                      */
1279 /* Builds the last MIC header block from        */
1280 /* header fields.                               */
1281 /* Baron think the function is construct CCM    */
1282 /* nonce                                        */
1283 /************************************************/
1284 static void construct_ctr_preload(
1285         u8 *ctr_preload,
1286         sint a4_exists,
1287         sint qc_exists,
1288         u8 *mpdu,
1289         u8 *pn_vector,
1290         sint c,
1291         uint frtype /*  add for CONFIG_IEEE80211W, none 11w also can use */
1292 )
1293 {
1294         sint i = 0;
1295
1296         for (i = 0; i < 16; i++)
1297                 ctr_preload[i] = 0x00;
1298         i = 0;
1299
1300         ctr_preload[0] = 0x01;                                  /* flag */
1301         if (qc_exists && a4_exists)
1302                 ctr_preload[1] = mpdu[30] & 0x0f;   /* QoC_Control */
1303         if (qc_exists && !a4_exists)
1304                 ctr_preload[1] = mpdu[24] & 0x0f;
1305
1306         /* 802.11w management frame should set management bit(4) */
1307         if (frtype == WIFI_MGT_TYPE)
1308                 ctr_preload[1] |= BIT(4);
1309
1310         for (i = 2; i < 8; i++)
1311                 ctr_preload[i] = mpdu[i + 8];                       /* ctr_preload[2:7] = A2[0:5] = mpdu[10:15] */
1312 #ifdef CONSISTENT_PN_ORDER
1313         for (i = 8; i < 14; i++)
1314                 ctr_preload[i] =    pn_vector[i - 8];           /* ctr_preload[8:13] = PN[0:5] */
1315 #else
1316         for (i = 8; i < 14; i++)
1317                 ctr_preload[i] =    pn_vector[13 - i];          /* ctr_preload[8:13] = PN[5:0] */
1318 #endif
1319         ctr_preload[14] =  (unsigned char) (c / 256); /* Ctr */
1320         ctr_preload[15] =  (unsigned char) (c % 256);
1321 }
1322
1323
1324 /************************************/
1325 /* bitwise_xor()                    */
1326 /* A 128 bit, bitwise exclusive or  */
1327 /************************************/
1328 static void bitwise_xor(u8 *ina, u8 *inb, u8 *out)
1329 {
1330                 sint i;
1331
1332                 for (i = 0; i < 16; i++) {
1333                         out[i] = ina[i] ^ inb[i];
1334                 }
1335 }
1336
1337
1338 static sint aes_cipher(u8 *key, uint    hdrlen,
1339                         u8 *pframe, uint plen)
1340 {
1341         uint    qc_exists, a4_exists, i, j, payload_remainder,
1342                 num_blocks, payload_index;
1343
1344         u8 pn_vector[6];
1345         u8 mic_iv[16];
1346         u8 mic_header1[16];
1347         u8 mic_header2[16];
1348         u8 ctr_preload[16];
1349
1350         /* Intermediate Buffers */
1351         u8 chain_buffer[16];
1352         u8 aes_out[16];
1353         u8 padded_buffer[16];
1354         u8 mic[8];
1355         uint    frtype  = GetFrameType(pframe);
1356         uint    frsubtype  = GetFrameSubType(pframe);
1357
1358         frsubtype = frsubtype>>4;
1359
1360
1361         memset((void *)mic_iv, 0, 16);
1362         memset((void *)mic_header1, 0, 16);
1363         memset((void *)mic_header2, 0, 16);
1364         memset((void *)ctr_preload, 0, 16);
1365         memset((void *)chain_buffer, 0, 16);
1366         memset((void *)aes_out, 0, 16);
1367         memset((void *)padded_buffer, 0, 16);
1368
1369         if ((hdrlen == WLAN_HDR_A3_LEN) || (hdrlen ==  WLAN_HDR_A3_QOS_LEN))
1370                 a4_exists = 0;
1371         else
1372                 a4_exists = 1;
1373
1374         if (((frtype|frsubtype) == WIFI_DATA_CFACK) ||
1375             ((frtype|frsubtype) == WIFI_DATA_CFPOLL) ||
1376             ((frtype|frsubtype) == WIFI_DATA_CFACKPOLL)) {
1377                 qc_exists = 1;
1378                 if (hdrlen !=  WLAN_HDR_A3_QOS_LEN)
1379                         hdrlen += 2;
1380
1381         } else if ((frtype == WIFI_DATA) && /*  add for CONFIG_IEEE80211W, none 11w also can use */
1382                    ((frsubtype == 0x08) ||
1383                    (frsubtype == 0x09) ||
1384                    (frsubtype == 0x0a) ||
1385                    (frsubtype == 0x0b))) {
1386                 if (hdrlen !=  WLAN_HDR_A3_QOS_LEN)
1387                         hdrlen += 2;
1388
1389                 qc_exists = 1;
1390         } else
1391                 qc_exists = 0;
1392
1393         pn_vector[0] = pframe[hdrlen];
1394         pn_vector[1] = pframe[hdrlen+1];
1395         pn_vector[2] = pframe[hdrlen+4];
1396         pn_vector[3] = pframe[hdrlen+5];
1397         pn_vector[4] = pframe[hdrlen+6];
1398         pn_vector[5] = pframe[hdrlen+7];
1399
1400         construct_mic_iv(
1401                         mic_iv,
1402                         qc_exists,
1403                         a4_exists,
1404                         pframe,  /* message, */
1405                         plen,
1406                         pn_vector,
1407                         frtype /*  add for CONFIG_IEEE80211W, none 11w also can use */
1408         );
1409
1410         construct_mic_header1(
1411                 mic_header1,
1412                 hdrlen,
1413                 pframe, /* message */
1414                 frtype /*  add for CONFIG_IEEE80211W, none 11w also can use */
1415         );
1416         construct_mic_header2(
1417                 mic_header2,
1418                 pframe, /* message, */
1419                 a4_exists,
1420                 qc_exists
1421         );
1422
1423
1424         payload_remainder = plen % 16;
1425         num_blocks = plen / 16;
1426
1427         /* Find start of payload */
1428         payload_index = (hdrlen + 8);
1429
1430         /* Calculate MIC */
1431         aes128k128d(key, mic_iv, aes_out);
1432         bitwise_xor(aes_out, mic_header1, chain_buffer);
1433         aes128k128d(key, chain_buffer, aes_out);
1434         bitwise_xor(aes_out, mic_header2, chain_buffer);
1435         aes128k128d(key, chain_buffer, aes_out);
1436
1437         for (i = 0; i < num_blocks; i++) {
1438                 bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);/* bitwise_xor(aes_out, &message[payload_index], chain_buffer); */
1439
1440                 payload_index += 16;
1441                 aes128k128d(key, chain_buffer, aes_out);
1442         }
1443
1444         /* Add on the final payload block if it needs padding */
1445         if (payload_remainder > 0) {
1446                 for (j = 0; j < 16; j++)
1447                         padded_buffer[j] = 0x00;
1448                 for (j = 0; j < payload_remainder; j++) {
1449                         padded_buffer[j] = pframe[payload_index++];/* padded_buffer[j] = message[payload_index++]; */
1450                 }
1451                 bitwise_xor(aes_out, padded_buffer, chain_buffer);
1452                 aes128k128d(key, chain_buffer, aes_out);
1453
1454         }
1455
1456         for (j = 0 ; j < 8; j++)
1457                 mic[j] = aes_out[j];
1458
1459         /* Insert MIC into payload */
1460         for (j = 0; j < 8; j++)
1461                 pframe[payload_index+j] = mic[j];       /* message[payload_index+j] = mic[j]; */
1462
1463         payload_index = hdrlen + 8;
1464         for (i = 0; i < num_blocks; i++) {
1465                 construct_ctr_preload(
1466                         ctr_preload,
1467                         a4_exists,
1468                         qc_exists,
1469                         pframe, /* message, */
1470                         pn_vector,
1471                         i+1,
1472                         frtype
1473                 ); /*  add for CONFIG_IEEE80211W, none 11w also can use */
1474                 aes128k128d(key, ctr_preload, aes_out);
1475                 bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);/* bitwise_xor(aes_out, &message[payload_index], chain_buffer); */
1476                 for (j = 0; j < 16; j++)
1477                         pframe[payload_index++] = chain_buffer[j];/* for (j = 0; j<16;j++) message[payload_index++] = chain_buffer[j]; */
1478         }
1479
1480         if (payload_remainder > 0) {
1481                 /* If there is a short final block, then pad it,*/
1482                 /* encrypt it and copy the unpadded part back   */
1483                 construct_ctr_preload(
1484                         ctr_preload,
1485                         a4_exists,
1486                         qc_exists,
1487                         pframe, /* message, */
1488                         pn_vector,
1489                         num_blocks+1,
1490                         frtype
1491                 ); /*  add for CONFIG_IEEE80211W, none 11w also can use */
1492
1493                 for (j = 0; j < 16; j++)
1494                         padded_buffer[j] = 0x00;
1495                 for (j = 0; j < payload_remainder; j++)
1496                         padded_buffer[j] = pframe[payload_index+j];/* padded_buffer[j] = message[payload_index+j]; */
1497
1498                 aes128k128d(key, ctr_preload, aes_out);
1499                 bitwise_xor(aes_out, padded_buffer, chain_buffer);
1500                 for (j = 0; j < payload_remainder; j++)
1501                         pframe[payload_index++] = chain_buffer[j];/* for (j = 0; j<payload_remainder;j++) message[payload_index++] = chain_buffer[j]; */
1502         }
1503
1504         /* Encrypt the MIC */
1505         construct_ctr_preload(
1506                 ctr_preload,
1507                 a4_exists,
1508                 qc_exists,
1509                 pframe, /* message, */
1510                 pn_vector,
1511                 0,
1512                 frtype
1513         ); /*  add for CONFIG_IEEE80211W, none 11w also can use */
1514
1515         for (j = 0; j < 16; j++)
1516                 padded_buffer[j] = 0x00;
1517         for (j = 0; j < 8; j++)
1518                 padded_buffer[j] = pframe[j+hdrlen+8+plen];/* padded_buffer[j] = message[j+hdrlen+8+plen]; */
1519
1520         aes128k128d(key, ctr_preload, aes_out);
1521         bitwise_xor(aes_out, padded_buffer, chain_buffer);
1522         for (j = 0; j < 8; j++)
1523                  pframe[payload_index++] = chain_buffer[j];/* for (j = 0; j<8;j++) message[payload_index++] = chain_buffer[j]; */
1524
1525         return _SUCCESS;
1526 }
1527
1528 u32 rtw_aes_encrypt(struct adapter *padapter, u8 *pxmitframe)
1529 {       /*  exclude ICV */
1530
1531
1532         /*static*/
1533 /*      unsigned char message[MAX_MSG_SIZE]; */
1534
1535         /* Intermediate Buffers */
1536         sint    curfragnum, length;
1537         u32 prwskeylen;
1538         u8 *pframe, *prwskey;   /*  *payload,*iv */
1539         u8   hw_hdr_offset = 0;
1540         /* struct       sta_info        *stainfo = NULL; */
1541         struct  pkt_attrib       *pattrib = &((struct xmit_frame *)pxmitframe)->attrib;
1542         struct  security_priv *psecuritypriv = &padapter->securitypriv;
1543         struct  xmit_priv       *pxmitpriv = &padapter->xmitpriv;
1544
1545 /*      uint    offset = 0; */
1546         u32 res = _SUCCESS;
1547
1548         if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL)
1549                 return _FAIL;
1550
1551         hw_hdr_offset = TXDESC_OFFSET;
1552         pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + hw_hdr_offset;
1553
1554         /* 4 start to encrypt each fragment */
1555         if ((pattrib->encrypt == _AES_)) {
1556                 RT_TRACE(_module_rtl871x_security_c_, _drv_err_, ("rtw_aes_encrypt: stainfo!= NULL!!!\n"));
1557
1558                 if (IS_MCAST(pattrib->ra))
1559                         prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey;
1560                 else
1561                         /* prwskey =&stainfo->dot118021x_UncstKey.skey[0]; */
1562                         prwskey = pattrib->dot118021x_UncstKey.skey;
1563
1564                 prwskeylen = 16;
1565
1566                 for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) {
1567                         if ((curfragnum+1) == pattrib->nr_frags) {      /* 4 the last fragment */
1568                                 length = pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len;
1569
1570                                 aes_cipher(prwskey, pattrib->hdrlen, pframe, length);
1571                         } else {
1572                                 length = pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len;
1573
1574                                 aes_cipher(prwskey, pattrib->hdrlen, pframe, length);
1575                                 pframe += pxmitpriv->frag_len;
1576                                 pframe = (u8 *)RND4((SIZE_PTR)(pframe));
1577                         }
1578                 }
1579
1580                 AES_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra);
1581         }
1582         return res;
1583 }
1584
1585 static sint aes_decipher(u8 *key, uint  hdrlen,
1586                         u8 *pframe, uint plen)
1587 {
1588         static u8 message[MAX_MSG_SIZE];
1589         uint    qc_exists, a4_exists, i, j, payload_remainder,
1590                         num_blocks, payload_index;
1591         sint res = _SUCCESS;
1592         u8 pn_vector[6];
1593         u8 mic_iv[16];
1594         u8 mic_header1[16];
1595         u8 mic_header2[16];
1596         u8 ctr_preload[16];
1597
1598                 /* Intermediate Buffers */
1599         u8 chain_buffer[16];
1600         u8 aes_out[16];
1601         u8 padded_buffer[16];
1602         u8 mic[8];
1603
1604
1605 /*      uint    offset = 0; */
1606         uint    frtype  = GetFrameType(pframe);
1607         uint    frsubtype  = GetFrameSubType(pframe);
1608
1609         frsubtype = frsubtype>>4;
1610
1611
1612         memset((void *)mic_iv, 0, 16);
1613         memset((void *)mic_header1, 0, 16);
1614         memset((void *)mic_header2, 0, 16);
1615         memset((void *)ctr_preload, 0, 16);
1616         memset((void *)chain_buffer, 0, 16);
1617         memset((void *)aes_out, 0, 16);
1618         memset((void *)padded_buffer, 0, 16);
1619
1620         /* start to decrypt the payload */
1621
1622         num_blocks = (plen-8) / 16; /* plen including LLC, payload_length and mic) */
1623
1624         payload_remainder = (plen-8) % 16;
1625
1626         pn_vector[0]  = pframe[hdrlen];
1627         pn_vector[1]  = pframe[hdrlen+1];
1628         pn_vector[2]  = pframe[hdrlen+4];
1629         pn_vector[3]  = pframe[hdrlen+5];
1630         pn_vector[4]  = pframe[hdrlen+6];
1631         pn_vector[5]  = pframe[hdrlen+7];
1632
1633         if ((hdrlen == WLAN_HDR_A3_LEN) || (hdrlen ==  WLAN_HDR_A3_QOS_LEN))
1634                 a4_exists = 0;
1635         else
1636                 a4_exists = 1;
1637
1638         if (((frtype|frsubtype) == WIFI_DATA_CFACK) ||
1639             ((frtype|frsubtype) == WIFI_DATA_CFPOLL) ||
1640             ((frtype|frsubtype) == WIFI_DATA_CFACKPOLL)) {
1641                 qc_exists = 1;
1642                 if (hdrlen !=  WLAN_HDR_A3_QOS_LEN) {
1643                         hdrlen += 2;
1644                 }
1645         } else if ((frtype == WIFI_DATA) && /* only for data packet . add for CONFIG_IEEE80211W, none 11w also can use */
1646                    ((frsubtype == 0x08) ||
1647                    (frsubtype == 0x09) ||
1648                    (frsubtype == 0x0a) ||
1649                    (frsubtype == 0x0b))) {
1650                 if (hdrlen !=  WLAN_HDR_A3_QOS_LEN) {
1651                         hdrlen += 2;
1652                 }
1653                 qc_exists = 1;
1654         } else
1655                 qc_exists = 0;
1656
1657
1658         /*  now, decrypt pframe with hdrlen offset and plen long */
1659
1660         payload_index = hdrlen + 8; /*  8 is for extiv */
1661
1662         for (i = 0; i < num_blocks; i++) {
1663                         construct_ctr_preload(
1664                                 ctr_preload,
1665                                 a4_exists,
1666                                 qc_exists,
1667                                 pframe,
1668                                 pn_vector,
1669                                 i+1,
1670                                 frtype /*  add for CONFIG_IEEE80211W, none 11w also can use */
1671                         );
1672
1673                         aes128k128d(key, ctr_preload, aes_out);
1674                         bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);
1675
1676                         for (j = 0; j < 16; j++)
1677                                 pframe[payload_index++] = chain_buffer[j];
1678                 }
1679
1680         if (payload_remainder > 0) {
1681                 /* If there is a short final block, then pad it,*/
1682                 /* encrypt it and copy the unpadded part back   */
1683                 construct_ctr_preload(
1684                         ctr_preload,
1685                         a4_exists,
1686                         qc_exists,
1687                         pframe,
1688                         pn_vector,
1689                         num_blocks+1,
1690                         frtype /*  add for CONFIG_IEEE80211W, none 11w also can use */
1691                 );
1692
1693                 for (j = 0; j < 16; j++)
1694                         padded_buffer[j] = 0x00;
1695                 for (j = 0; j < payload_remainder; j++) {
1696                         padded_buffer[j] = pframe[payload_index+j];
1697                 }
1698                 aes128k128d(key, ctr_preload, aes_out);
1699                 bitwise_xor(aes_out, padded_buffer, chain_buffer);
1700                 for (j = 0; j < payload_remainder; j++)
1701                         pframe[payload_index++] = chain_buffer[j];
1702         }
1703
1704         /* start to calculate the mic */
1705         if ((hdrlen + plen+8) <= MAX_MSG_SIZE)
1706                 memcpy((void *)message, pframe, (hdrlen + plen+8)); /* 8 is for ext iv len */
1707
1708
1709         pn_vector[0] = pframe[hdrlen];
1710         pn_vector[1] = pframe[hdrlen+1];
1711         pn_vector[2] = pframe[hdrlen+4];
1712         pn_vector[3] = pframe[hdrlen+5];
1713         pn_vector[4] = pframe[hdrlen+6];
1714         pn_vector[5] = pframe[hdrlen+7];
1715
1716
1717
1718         construct_mic_iv(
1719                 mic_iv,
1720                 qc_exists,
1721                 a4_exists,
1722                 message,
1723                 plen-8,
1724                 pn_vector,
1725                 frtype /*  add for CONFIG_IEEE80211W, none 11w also can use */
1726         );
1727
1728         construct_mic_header1(
1729                 mic_header1,
1730                 hdrlen,
1731                 message,
1732                 frtype /*  add for CONFIG_IEEE80211W, none 11w also can use */
1733         );
1734         construct_mic_header2(
1735                 mic_header2,
1736                 message,
1737                 a4_exists,
1738                 qc_exists
1739         );
1740
1741
1742         payload_remainder = (plen-8) % 16;
1743         num_blocks = (plen-8) / 16;
1744
1745         /* Find start of payload */
1746         payload_index = (hdrlen + 8);
1747
1748         /* Calculate MIC */
1749         aes128k128d(key, mic_iv, aes_out);
1750         bitwise_xor(aes_out, mic_header1, chain_buffer);
1751         aes128k128d(key, chain_buffer, aes_out);
1752         bitwise_xor(aes_out, mic_header2, chain_buffer);
1753         aes128k128d(key, chain_buffer, aes_out);
1754
1755         for (i = 0; i < num_blocks; i++) {
1756                 bitwise_xor(aes_out, &message[payload_index], chain_buffer);
1757
1758                 payload_index += 16;
1759                 aes128k128d(key, chain_buffer, aes_out);
1760         }
1761
1762         /* Add on the final payload block if it needs padding */
1763         if (payload_remainder > 0) {
1764                 for (j = 0; j < 16; j++)
1765                         padded_buffer[j] = 0x00;
1766                 for (j = 0; j < payload_remainder; j++) {
1767                         padded_buffer[j] = message[payload_index++];
1768                 }
1769                 bitwise_xor(aes_out, padded_buffer, chain_buffer);
1770                 aes128k128d(key, chain_buffer, aes_out);
1771
1772         }
1773
1774         for (j = 0; j < 8; j++)
1775                 mic[j] = aes_out[j];
1776
1777         /* Insert MIC into payload */
1778         for (j = 0; j < 8; j++)
1779                 message[payload_index+j] = mic[j];
1780
1781         payload_index = hdrlen + 8;
1782         for (i = 0; i < num_blocks; i++) {
1783                 construct_ctr_preload(
1784                         ctr_preload,
1785                         a4_exists,
1786                         qc_exists,
1787                         message,
1788                         pn_vector,
1789                         i+1,
1790                         frtype
1791                 ); /*  add for CONFIG_IEEE80211W, none 11w also can use */
1792                 aes128k128d(key, ctr_preload, aes_out);
1793                 bitwise_xor(aes_out, &message[payload_index], chain_buffer);
1794                 for (j = 0; j < 16; j++)
1795                         message[payload_index++] = chain_buffer[j];
1796         }
1797
1798         if (payload_remainder > 0) {
1799                 /* If there is a short final block, then pad it,*/
1800                 /* encrypt it and copy the unpadded part back   */
1801                 construct_ctr_preload(
1802                         ctr_preload,
1803                         a4_exists,
1804                         qc_exists,
1805                         message,
1806                         pn_vector,
1807                         num_blocks+1,
1808                         frtype
1809                 ); /*  add for CONFIG_IEEE80211W, none 11w also can use */
1810
1811                 for (j = 0; j < 16; j++)
1812                         padded_buffer[j] = 0x00;
1813                 for (j = 0; j < payload_remainder; j++) {
1814                         padded_buffer[j] = message[payload_index+j];
1815                 }
1816                 aes128k128d(key, ctr_preload, aes_out);
1817                 bitwise_xor(aes_out, padded_buffer, chain_buffer);
1818                 for (j = 0; j < payload_remainder; j++)
1819                         message[payload_index++] = chain_buffer[j];
1820         }
1821
1822         /* Encrypt the MIC */
1823         construct_ctr_preload(
1824                 ctr_preload,
1825                 a4_exists,
1826                 qc_exists,
1827                 message,
1828                 pn_vector,
1829                 0,
1830                 frtype
1831         ); /*  add for CONFIG_IEEE80211W, none 11w also can use */
1832
1833         for (j = 0; j < 16; j++)
1834                 padded_buffer[j] = 0x00;
1835         for (j = 0; j < 8; j++) {
1836                 padded_buffer[j] = message[j+hdrlen+8+plen-8];
1837         }
1838
1839         aes128k128d(key, ctr_preload, aes_out);
1840         bitwise_xor(aes_out, padded_buffer, chain_buffer);
1841         for (j = 0; j < 8; j++)
1842                 message[payload_index++] = chain_buffer[j];
1843
1844         /* compare the mic */
1845         for (i = 0; i < 8; i++) {
1846                 if (pframe[hdrlen+8+plen-8+i] != message[hdrlen+8+plen-8+i]) {
1847                         RT_TRACE(_module_rtl871x_security_c_, _drv_err_, ("aes_decipher:mic check error mic[%d]: pframe(%x) != message(%x)\n",
1848                                         i, pframe[hdrlen+8+plen-8+i], message[hdrlen+8+plen-8+i]));
1849                         DBG_871X("aes_decipher:mic check error mic[%d]: pframe(%x) != message(%x)\n",
1850                                         i, pframe[hdrlen+8+plen-8+i], message[hdrlen+8+plen-8+i]);
1851                         res = _FAIL;
1852                 }
1853         }
1854         return res;
1855 }
1856
1857 u32 rtw_aes_decrypt(struct adapter *padapter, u8 *precvframe)
1858 {       /*  exclude ICV */
1859
1860
1861         /*static*/
1862 /*      unsigned char message[MAX_MSG_SIZE]; */
1863
1864
1865         /* Intermediate Buffers */
1866
1867
1868         sint            length;
1869         u8 *pframe, *prwskey;   /*  *payload,*iv */
1870         struct  sta_info        *stainfo;
1871         struct  rx_pkt_attrib    *prxattrib = &((union recv_frame *)precvframe)->u.hdr.attrib;
1872         struct  security_priv *psecuritypriv = &padapter->securitypriv;
1873 /*      struct  recv_priv       *precvpriv =&padapter->recvpriv; */
1874         u32 res = _SUCCESS;
1875
1876         pframe = (unsigned char *)((union recv_frame *)precvframe)->u.hdr.rx_data;
1877         /* 4 start to encrypt each fragment */
1878         if ((prxattrib->encrypt == _AES_)) {
1879
1880                 stainfo = rtw_get_stainfo(&padapter->stapriv, &prxattrib->ta[0]);
1881                 if (stainfo != NULL) {
1882                         RT_TRACE(_module_rtl871x_security_c_, _drv_err_, ("rtw_aes_decrypt: stainfo!= NULL!!!\n"));
1883
1884                         if (IS_MCAST(prxattrib->ra)) {
1885                                 static unsigned long start;
1886                                 static u32 no_gkey_bc_cnt;
1887                                 static u32 no_gkey_mc_cnt;
1888
1889                                 /* DBG_871X("rx bc/mc packets, to perform sw rtw_aes_decrypt\n"); */
1890                                 /* prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; */
1891                                 if (psecuritypriv->binstallGrpkey == false) {
1892                                         res = _FAIL;
1893
1894                                         if (start == 0)
1895                                                 start = jiffies;
1896
1897                                         if (is_broadcast_mac_addr(prxattrib->ra))
1898                                                 no_gkey_bc_cnt++;
1899                                         else
1900                                                 no_gkey_mc_cnt++;
1901
1902                                         if (jiffies_to_msecs(jiffies - start) > 1000) {
1903                                                 if (no_gkey_bc_cnt || no_gkey_mc_cnt) {
1904                                                         DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n",
1905                                                                 FUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt);
1906                                                 }
1907                                                 start = jiffies;
1908                                                 no_gkey_bc_cnt = 0;
1909                                                 no_gkey_mc_cnt = 0;
1910                                         }
1911
1912                                         goto exit;
1913                                 }
1914
1915                                 if (no_gkey_bc_cnt || no_gkey_mc_cnt) {
1916                                         DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" gkey installed. no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n",
1917                                                 FUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt);
1918                                 }
1919                                 start = 0;
1920                                 no_gkey_bc_cnt = 0;
1921                                 no_gkey_mc_cnt = 0;
1922
1923                                 prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey;
1924                                 if (psecuritypriv->dot118021XGrpKeyid != prxattrib->key_index) {
1925                                         DBG_871X("not match packet_index =%d, install_index =%d\n"
1926                                         , prxattrib->key_index, psecuritypriv->dot118021XGrpKeyid);
1927                                         res = _FAIL;
1928                                         goto exit;
1929                                 }
1930                         } else
1931                                 prwskey = &stainfo->dot118021x_UncstKey.skey[0];
1932
1933
1934                         length = ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len;
1935
1936                         res = aes_decipher(prwskey, prxattrib->hdrlen, pframe, length);
1937
1938                         AES_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);
1939                 } else {
1940                         RT_TRACE(_module_rtl871x_security_c_, _drv_err_, ("rtw_aes_decrypt: stainfo == NULL!!!\n"));
1941                         res = _FAIL;
1942                 }
1943         }
1944 exit:
1945         return res;
1946 }
1947
1948 u32 rtw_BIP_verify(struct adapter *padapter, u8 *precvframe)
1949 {
1950         struct rx_pkt_attrib *pattrib = &((union recv_frame *)precvframe)->u.hdr.attrib;
1951         u8 *pframe;
1952         u8 *BIP_AAD, *p;
1953         u32 res = _FAIL;
1954         uint len, ori_len;
1955         struct ieee80211_hdr *pwlanhdr;
1956         u8 mic[16];
1957         struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1958         __le16 le_tmp;
1959         __le64 le_tmp64;
1960
1961         ori_len = pattrib->pkt_len-WLAN_HDR_A3_LEN+BIP_AAD_SIZE;
1962         BIP_AAD = rtw_zmalloc(ori_len);
1963
1964         if (BIP_AAD == NULL) {
1965                 DBG_871X("BIP AAD allocate fail\n");
1966                 return _FAIL;
1967         }
1968         /* PKT start */
1969         pframe = (unsigned char *)((union recv_frame *)precvframe)->u.hdr.rx_data;
1970         /* mapping to wlan header */
1971         pwlanhdr = (struct ieee80211_hdr *)pframe;
1972         /* save the frame body + MME */
1973         memcpy(BIP_AAD+BIP_AAD_SIZE, pframe+WLAN_HDR_A3_LEN, pattrib->pkt_len-WLAN_HDR_A3_LEN);
1974         /* find MME IE pointer */
1975         p = rtw_get_ie(BIP_AAD+BIP_AAD_SIZE, _MME_IE_, &len, pattrib->pkt_len-WLAN_HDR_A3_LEN);
1976         /* Baron */
1977         if (p) {
1978                 u16 keyid = 0;
1979                 u64 temp_ipn = 0;
1980                 /* save packet number */
1981                 memcpy(&le_tmp64, p+4, 6);
1982                 temp_ipn = le64_to_cpu(le_tmp64);
1983                 /* BIP packet number should bigger than previous BIP packet */
1984                 if (temp_ipn <= pmlmeext->mgnt_80211w_IPN_rx) {
1985                         DBG_871X("replay BIP packet\n");
1986                         goto BIP_exit;
1987                 }
1988                 /* copy key index */
1989                 memcpy(&le_tmp, p+2, 2);
1990                 keyid = le16_to_cpu(le_tmp);
1991                 if (keyid != padapter->securitypriv.dot11wBIPKeyid) {
1992                         DBG_871X("BIP key index error!\n");
1993                         goto BIP_exit;
1994                 }
1995                 /* clear the MIC field of MME to zero */
1996                 memset(p+2+len-8, 0, 8);
1997
1998                 /* conscruct AAD, copy frame control field */
1999                 memcpy(BIP_AAD, &pwlanhdr->frame_control, 2);
2000                 ClearRetry(BIP_AAD);
2001                 ClearPwrMgt(BIP_AAD);
2002                 ClearMData(BIP_AAD);
2003                 /* conscruct AAD, copy address 1 to address 3 */
2004                 memcpy(BIP_AAD+2, pwlanhdr->addr1, 18);
2005
2006                 if (omac1_aes_128(padapter->securitypriv.dot11wBIPKey[padapter->securitypriv.dot11wBIPKeyid].skey
2007                         , BIP_AAD, ori_len, mic))
2008                         goto BIP_exit;
2009
2010                 /* MIC field should be last 8 bytes of packet (packet without FCS) */
2011                 if (!memcmp(mic, pframe+pattrib->pkt_len-8, 8)) {
2012                         pmlmeext->mgnt_80211w_IPN_rx = temp_ipn;
2013                         res = _SUCCESS;
2014                 } else
2015                         DBG_871X("BIP MIC error!\n");
2016
2017         } else
2018                 res = RTW_RX_HANDLED;
2019 BIP_exit:
2020
2021         kfree(BIP_AAD);
2022         return res;
2023 }
2024
2025 /* AES tables*/
2026 const u32 Te0[256] = {
2027         0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
2028         0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
2029         0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
2030         0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
2031         0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
2032         0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
2033         0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
2034         0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
2035         0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
2036         0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
2037         0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
2038         0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
2039         0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
2040         0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
2041         0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
2042         0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
2043         0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
2044         0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
2045         0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
2046         0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
2047         0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
2048         0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
2049         0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
2050         0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
2051         0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
2052         0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
2053         0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
2054         0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
2055         0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
2056         0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
2057         0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
2058         0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
2059         0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
2060         0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
2061         0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
2062         0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
2063         0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
2064         0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
2065         0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
2066         0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
2067         0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
2068         0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
2069         0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
2070         0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
2071         0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
2072         0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
2073         0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
2074         0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
2075         0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
2076         0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
2077         0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
2078         0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
2079         0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
2080         0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
2081         0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
2082         0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
2083         0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
2084         0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
2085         0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
2086         0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
2087         0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
2088         0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
2089         0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
2090         0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
2091 };
2092 const u32 Td0[256] = {
2093         0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
2094         0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
2095         0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
2096         0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
2097         0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
2098         0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
2099         0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
2100         0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
2101         0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
2102         0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
2103         0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
2104         0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
2105         0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
2106         0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
2107         0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
2108         0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
2109         0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
2110         0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
2111         0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
2112         0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
2113         0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
2114         0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
2115         0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
2116         0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
2117         0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
2118         0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
2119         0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
2120         0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
2121         0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
2122         0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
2123         0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
2124         0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
2125         0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
2126         0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
2127         0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
2128         0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
2129         0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
2130         0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
2131         0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
2132         0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
2133         0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
2134         0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
2135         0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
2136         0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
2137         0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
2138         0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
2139         0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
2140         0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
2141         0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
2142         0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
2143         0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
2144         0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
2145         0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
2146         0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
2147         0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
2148         0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
2149         0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
2150         0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
2151         0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
2152         0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
2153         0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
2154         0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
2155         0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
2156         0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
2157 };
2158 const u8 Td4s[256] = {
2159         0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U,
2160         0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU,
2161         0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U,
2162         0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU,
2163         0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU,
2164         0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU,
2165         0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U,
2166         0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U,
2167         0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U,
2168         0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U,
2169         0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU,
2170         0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U,
2171         0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU,
2172         0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U,
2173         0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U,
2174         0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU,
2175         0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU,
2176         0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U,
2177         0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U,
2178         0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU,
2179         0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U,
2180         0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU,
2181         0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U,
2182         0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U,
2183         0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U,
2184         0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU,
2185         0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU,
2186         0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU,
2187         0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U,
2188         0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U,
2189         0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U,
2190         0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU,
2191 };
2192 const u8 rcons[] = {
2193         0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36
2194         /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
2195 };
2196
2197 /**
2198  * Expand the cipher key into the encryption key schedule.
2199  *
2200  * @return      the number of rounds for the given cipher key size.
2201  */
2202 static void rijndaelKeySetupEnc(u32 rk[/*44*/], const u8 cipherKey[])
2203 {
2204         int i;
2205         u32 temp;
2206
2207         rk[0] = GETU32(cipherKey);
2208         rk[1] = GETU32(cipherKey +  4);
2209         rk[2] = GETU32(cipherKey +  8);
2210         rk[3] = GETU32(cipherKey + 12);
2211         for (i = 0; i < 10; i++) {
2212                 temp  = rk[3];
2213                 rk[4] = rk[0] ^
2214                         TE421(temp) ^ TE432(temp) ^ TE443(temp) ^ TE414(temp) ^
2215                         RCON(i);
2216                 rk[5] = rk[1] ^ rk[4];
2217                 rk[6] = rk[2] ^ rk[5];
2218                 rk[7] = rk[3] ^ rk[6];
2219                 rk += 4;
2220         }
2221 }
2222
2223 static void rijndaelEncrypt(u32 rk[/*44*/], u8 pt[16], u8 ct[16])
2224 {
2225         u32 s0, s1, s2, s3, t0, t1, t2, t3;
2226         int Nr = 10;
2227         int r;
2228
2229         /*
2230          * map byte array block to cipher state
2231          * and add initial round key:
2232          */
2233         s0 = GETU32(pt) ^ rk[0];
2234         s1 = GETU32(pt +  4) ^ rk[1];
2235         s2 = GETU32(pt +  8) ^ rk[2];
2236         s3 = GETU32(pt + 12) ^ rk[3];
2237
2238 #define ROUND(i, d, s) \
2239 d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \
2240 d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \
2241 d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \
2242 d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3]
2243
2244         /* Nr - 1 full rounds: */
2245         r = Nr >> 1;
2246         for (;;) {
2247                 ROUND(1, t, s);
2248                 rk += 8;
2249                 if (--r == 0)
2250                         break;
2251                 ROUND(0, s, t);
2252         }
2253
2254 #undef ROUND
2255
2256         /*
2257          * apply last round and
2258          * map cipher state to byte array block:
2259          */
2260         s0 = TE41(t0) ^ TE42(t1) ^ TE43(t2) ^ TE44(t3) ^ rk[0];
2261         PUTU32(ct, s0);
2262         s1 = TE41(t1) ^ TE42(t2) ^ TE43(t3) ^ TE44(t0) ^ rk[1];
2263         PUTU32(ct +  4, s1);
2264         s2 = TE41(t2) ^ TE42(t3) ^ TE43(t0) ^ TE44(t1) ^ rk[2];
2265         PUTU32(ct +  8, s2);
2266         s3 = TE41(t3) ^ TE42(t0) ^ TE43(t1) ^ TE44(t2) ^ rk[3];
2267         PUTU32(ct + 12, s3);
2268 }
2269
2270 static void *aes_encrypt_init(u8 *key, size_t len)
2271 {
2272         u32 *rk;
2273         if (len != 16)
2274                 return NULL;
2275         rk = (u32 *)rtw_malloc(AES_PRIV_SIZE);
2276         if (rk == NULL)
2277                 return NULL;
2278         rijndaelKeySetupEnc(rk, key);
2279         return rk;
2280 }
2281
2282 static void aes_128_encrypt(void *ctx, u8 *plain, u8 *crypt)
2283 {
2284         rijndaelEncrypt(ctx, plain, crypt);
2285 }
2286
2287
2288 static void gf_mulx(u8 *pad)
2289 {
2290         int i, carry;
2291
2292         carry = pad[0] & 0x80;
2293         for (i = 0; i < AES_BLOCK_SIZE - 1; i++)
2294                 pad[i] = (pad[i] << 1) | (pad[i + 1] >> 7);
2295
2296         pad[AES_BLOCK_SIZE - 1] <<= 1;
2297         if (carry)
2298                 pad[AES_BLOCK_SIZE - 1] ^= 0x87;
2299 }
2300
2301 static void aes_encrypt_deinit(void *ctx)
2302 {
2303         memset(ctx, 0, AES_PRIV_SIZE);
2304         kfree(ctx);
2305 }
2306
2307
2308 /**
2309  * omac1_aes_128_vector - One-Key CBC MAC (OMAC1) hash with AES-128
2310  * @key: 128-bit key for the hash operation
2311  * @num_elem: Number of elements in the data vector
2312  * @addr: Pointers to the data areas
2313  * @len: Lengths of the data blocks
2314  * @mac: Buffer for MAC (128 bits, i.e., 16 bytes)
2315  * Returns: 0 on success, -1 on failure
2316  *
2317  * This is a mode for using block cipher (AES in this case) for authentication.
2318  * OMAC1 was standardized with the name CMAC by NIST in a Special Publication
2319  * (SP) 800-38B.
2320  */
2321 static int omac1_aes_128_vector(u8 *key, size_t num_elem,
2322                                                          u8 *addr[], size_t *len, u8 *mac)
2323 {
2324         void *ctx;
2325         u8 cbc[AES_BLOCK_SIZE], pad[AES_BLOCK_SIZE];
2326         u8 *pos, *end;
2327         size_t i, e, left, total_len;
2328
2329         ctx = aes_encrypt_init(key, 16);
2330         if (ctx == NULL)
2331                 return -1;
2332         memset(cbc, 0, AES_BLOCK_SIZE);
2333
2334         total_len = 0;
2335         for (e = 0; e < num_elem; e++)
2336                 total_len += len[e];
2337         left = total_len;
2338
2339         e = 0;
2340         pos = addr[0];
2341         end = pos + len[0];
2342
2343         while (left >= AES_BLOCK_SIZE) {
2344                 for (i = 0; i < AES_BLOCK_SIZE; i++) {
2345                         cbc[i] ^= *pos++;
2346                         if (pos >= end) {
2347                                 e++;
2348                                 pos = addr[e];
2349                                 end = pos + len[e];
2350                         }
2351                 }
2352                 if (left > AES_BLOCK_SIZE)
2353                         aes_128_encrypt(ctx, cbc, cbc);
2354                 left -= AES_BLOCK_SIZE;
2355         }
2356
2357         memset(pad, 0, AES_BLOCK_SIZE);
2358         aes_128_encrypt(ctx, pad, pad);
2359         gf_mulx(pad);
2360
2361         if (left || total_len == 0) {
2362                 for (i = 0; i < left; i++) {
2363                         cbc[i] ^= *pos++;
2364                         if (pos >= end) {
2365                                 e++;
2366                                 pos = addr[e];
2367                                 end = pos + len[e];
2368                         }
2369                 }
2370                 cbc[left] ^= 0x80;
2371                 gf_mulx(pad);
2372         }
2373
2374         for (i = 0; i < AES_BLOCK_SIZE; i++)
2375                 pad[i] ^= cbc[i];
2376         aes_128_encrypt(ctx, pad, mac);
2377         aes_encrypt_deinit(ctx);
2378         return 0;
2379 }
2380
2381
2382 /**
2383  * omac1_aes_128 - One-Key CBC MAC (OMAC1) hash with AES-128 (aka AES-CMAC)
2384  * @key: 128-bit key for the hash operation
2385  * @data: Data buffer for which a MAC is determined
2386  * @data_len: Length of data buffer in bytes
2387  * @mac: Buffer for MAC (128 bits, i.e., 16 bytes)
2388  * Returns: 0 on success, -1 on failure
2389  *
2390  * This is a mode for using block cipher (AES in this case) for authentication.
2391  * OMAC1 was standardized with the name CMAC by NIST in a Special Publication
2392  * (SP) 800-38B.
2393  * modify for CONFIG_IEEE80211W */
2394 int omac1_aes_128(u8 *key, u8 *data, size_t data_len, u8 *mac)
2395 {
2396         return omac1_aes_128_vector(key, 1, &data, &data_len, mac);
2397 }
2398
2399 /* Restore HW wep key setting according to key_mask */
2400 void rtw_sec_restore_wep_key(struct adapter *adapter)
2401 {
2402         struct security_priv *securitypriv = &(adapter->securitypriv);
2403         sint keyid;
2404
2405         if ((_WEP40_ == securitypriv->dot11PrivacyAlgrthm) || (_WEP104_ == securitypriv->dot11PrivacyAlgrthm)) {
2406                 for (keyid = 0; keyid < 4; keyid++) {
2407                         if (securitypriv->key_mask & BIT(keyid)) {
2408                                 if (keyid == securitypriv->dot11PrivacyKeyIndex)
2409                                         rtw_set_key(adapter, securitypriv, keyid, 1, false);
2410                                 else
2411                                         rtw_set_key(adapter, securitypriv, keyid, 0, false);
2412                         }
2413                 }
2414         }
2415 }
2416
2417 u8 rtw_handle_tkip_countermeasure(struct adapter *adapter, const char *caller)
2418 {
2419         struct security_priv *securitypriv = &(adapter->securitypriv);
2420         u8 status = _SUCCESS;
2421
2422         if (securitypriv->btkip_countermeasure == true) {
2423                 unsigned long passing_ms = jiffies_to_msecs(jiffies - securitypriv->btkip_countermeasure_time);
2424                 if (passing_ms > 60*1000) {
2425                         DBG_871X_LEVEL(_drv_always_, "%s("ADPT_FMT") countermeasure time:%lus > 60s\n",
2426                                 caller, ADPT_ARG(adapter), passing_ms/1000);
2427                         securitypriv->btkip_countermeasure = false;
2428                         securitypriv->btkip_countermeasure_time = 0;
2429                 } else {
2430                         DBG_871X_LEVEL(_drv_always_, "%s("ADPT_FMT") countermeasure time:%lus < 60s\n",
2431                                 caller, ADPT_ARG(adapter), passing_ms/1000);
2432                         status = _FAIL;
2433                 }
2434         }
2435
2436         return status;
2437 }