GNU Linux-libre 4.19.264-gnu1
[releases.git] / drivers / staging / rtl8712 / rtl871x_security.c
1 /******************************************************************************
2  * rtl871x_security.c
3  *
4  * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5  * Linux device driver for RTL8192SU
6  *
7  * This program is free software; you can redistribute it and/or modify it
8  * under the terms of version 2 of the GNU General Public License as
9  * published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14  * more details.
15  *
16  * You should have received a copy of the GNU General Public License along with
17  * this program; if not, write to the Free Software Foundation, Inc.,
18  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19  *
20  * Modifications for inclusion into the Linux staging tree are
21  * Copyright(c) 2010 Larry Finger. All rights reserved.
22  *
23  * Contact information:
24  * WLAN FAE <wlanfae@realtek.com>
25  * Larry Finger <Larry.Finger@lwfinger.net>
26  *
27  ******************************************************************************/
28
29 #define  _RTL871X_SECURITY_C_
30
31 #include <linux/compiler.h>
32 #include <linux/kernel.h>
33 #include <linux/errno.h>
34 #include <linux/slab.h>
35 #include <linux/module.h>
36 #include <linux/kref.h>
37 #include <linux/netdevice.h>
38 #include <linux/skbuff.h>
39 #include <linux/circ_buf.h>
40 #include <linux/uaccess.h>
41 #include <asm/byteorder.h>
42 #include <linux/atomic.h>
43 #include <linux/crc32poly.h>
44 #include <linux/semaphore.h>
45
46 #include "osdep_service.h"
47 #include "drv_types.h"
48 #include "wifi.h"
49 #include "osdep_intf.h"
50
51 /* =====WEP related===== */
52
53 struct arc4context {
54         u32 x;
55         u32 y;
56         u8 state[256];
57 };
58
59 static void arcfour_init(struct arc4context *parc4ctx, u8 *key, u32 key_len)
60 {
61         u32     t, u;
62         u32     keyindex;
63         u32     stateindex;
64         u8 *state;
65         u32     counter;
66
67         state = parc4ctx->state;
68         parc4ctx->x = 0;
69         parc4ctx->y = 0;
70         for (counter = 0; counter < 256; counter++)
71                 state[counter] = (u8)counter;
72         keyindex = 0;
73         stateindex = 0;
74         for (counter = 0; counter < 256; counter++) {
75                 t = state[counter];
76                 stateindex = (stateindex + key[keyindex] + t) & 0xff;
77                 u = state[stateindex];
78                 state[stateindex] = (u8)t;
79                 state[counter] = (u8)u;
80                 if (++keyindex >= key_len)
81                         keyindex = 0;
82         }
83 }
84
85 static u32 arcfour_byte(struct arc4context *parc4ctx)
86 {
87         u32 x;
88         u32 y;
89         u32 sx, sy;
90         u8 *state;
91
92         state = parc4ctx->state;
93         x = (parc4ctx->x + 1) & 0xff;
94         sx = state[x];
95         y = (sx + parc4ctx->y) & 0xff;
96         sy = state[y];
97         parc4ctx->x = x;
98         parc4ctx->y = y;
99         state[y] = (u8)sx;
100         state[x] = (u8)sy;
101         return state[(sx + sy) & 0xff];
102 }
103
104 static void arcfour_encrypt(struct arc4context  *parc4ctx,
105                      u8 *dest, u8 *src, u32 len)
106 {
107         u32 i;
108
109         for (i = 0; i < len; i++)
110                 dest[i] = src[i] ^ (unsigned char)arcfour_byte(parc4ctx);
111 }
112
113 static sint bcrc32initialized;
114 static u32 crc32_table[256];
115
116 static u8 crc32_reverseBit(u8 data)
117 {
118         return ((u8)(data << 7) & 0x80) | ((data << 5) & 0x40) | ((data << 3)
119                  & 0x20) | ((data << 1) & 0x10) | ((data >> 1) & 0x08) |
120                  ((data >> 3) & 0x04) | ((data >> 5) & 0x02) | ((data >> 7) &
121                  0x01);
122 }
123
124 static void crc32_init(void)
125 {
126         sint i, j;
127         u32 c;
128         u8 *p = (u8 *)&c, *p1;
129         u8 k;
130
131         if (bcrc32initialized == 1)
132                 return;
133
134         for (i = 0; i < 256; ++i) {
135                 k = crc32_reverseBit((u8)i);
136                 for (c = ((u32)k) << 24, j = 8; j > 0; --j)
137                         c = c & 0x80000000 ? (c << 1) ^ CRC32_POLY_BE : (c << 1);
138                 p1 = (u8 *)&crc32_table[i];
139                 p1[0] = crc32_reverseBit(p[3]);
140                 p1[1] = crc32_reverseBit(p[2]);
141                 p1[2] = crc32_reverseBit(p[1]);
142                 p1[3] = crc32_reverseBit(p[0]);
143         }
144         bcrc32initialized = 1;
145 }
146
147 static u32 getcrc32(u8 *buf, u32 len)
148 {
149         u8 *p;
150         u32  crc;
151
152         if (!bcrc32initialized)
153                 crc32_init();
154         crc = 0xffffffff; /* preload shift register, per CRC-32 spec */
155         for (p = buf; len > 0; ++p, --len)
156                 crc = crc32_table[(crc ^ *p) & 0xff] ^ (crc >> 8);
157         return ~crc;    /* transmit complement, per CRC-32 spec */
158 }
159
160 /*
161  * Need to consider the fragment situation
162  */
163 void r8712_wep_encrypt(struct _adapter *padapter, u8 *pxmitframe)
164 {       /* exclude ICV */
165         unsigned char   crc[4];
166         struct arc4context  mycontext;
167         u32 curfragnum, length, keylength, pki;
168         u8 *pframe, *payload, *iv;    /*,*wepkey*/
169         u8 wepkey[16];
170         struct  pkt_attrib  *pattrib = &((struct xmit_frame *)
171                                        pxmitframe)->attrib;
172         struct  security_priv *psecuritypriv = &padapter->securitypriv;
173         struct  xmit_priv *pxmitpriv = &padapter->xmitpriv;
174
175         if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL)
176                 return;
177         pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + TXDESC_OFFSET;
178         /*start to encrypt each fragment*/
179         if ((pattrib->encrypt == _WEP40_) || (pattrib->encrypt == _WEP104_)) {
180                 pki = psecuritypriv->PrivacyKeyIndex;
181                 keylength = psecuritypriv->DefKeylen[pki];
182                 for (curfragnum = 0; curfragnum < pattrib->nr_frags;
183                      curfragnum++) {
184                         iv = pframe + pattrib->hdrlen;
185                         memcpy(&wepkey[0], iv, 3);
186                         memcpy(&wepkey[3], &psecuritypriv->DefKey[
187                                 psecuritypriv->PrivacyKeyIndex].skey[0],
188                                 keylength);
189                         payload = pframe + pattrib->iv_len + pattrib->hdrlen;
190                         if ((curfragnum + 1) == pattrib->nr_frags) {
191                                 length = pattrib->last_txcmdsz -
192                                         pattrib->hdrlen -
193                                         pattrib->iv_len -
194                                         pattrib->icv_len;
195                                 *((__le32 *)crc) = cpu_to_le32(getcrc32(
196                                                 payload, length));
197                                 arcfour_init(&mycontext, wepkey, 3 + keylength);
198                                 arcfour_encrypt(&mycontext, payload, payload,
199                                                 length);
200                                 arcfour_encrypt(&mycontext, payload + length,
201                                                 crc, 4);
202                         } else {
203                                 length = pxmitpriv->frag_len -
204                                          pattrib->hdrlen - pattrib->iv_len -
205                                          pattrib->icv_len;
206                                 *((__le32 *)crc) = cpu_to_le32(getcrc32(
207                                                 payload, length));
208                                 arcfour_init(&mycontext, wepkey, 3 + keylength);
209                                 arcfour_encrypt(&mycontext, payload, payload,
210                                                 length);
211                                 arcfour_encrypt(&mycontext, payload + length,
212                                                 crc, 4);
213                                 pframe += pxmitpriv->frag_len;
214                                 pframe = (u8 *)RND4((addr_t)(pframe));
215                         }
216                 }
217         }
218 }
219
220 void r8712_wep_decrypt(struct _adapter  *padapter, u8 *precvframe)
221 {
222         /* exclude ICV */
223         u8 crc[4];
224         struct arc4context  mycontext;
225         u32 length, keylength;
226         u8 *pframe, *payload, *iv, wepkey[16];
227         u8  keyindex;
228         struct rx_pkt_attrib  *prxattrib = &(((union recv_frame *)
229                                           precvframe)->u.hdr.attrib);
230         struct security_priv *psecuritypriv = &padapter->securitypriv;
231
232         pframe = (unsigned char *)((union recv_frame *)precvframe)->
233                   u.hdr.rx_data;
234         /* start to decrypt recvframe */
235         if ((prxattrib->encrypt == _WEP40_) || (prxattrib->encrypt ==
236              _WEP104_)) {
237                 iv = pframe + prxattrib->hdrlen;
238                 keyindex = (iv[3] & 0x3);
239                 keylength = psecuritypriv->DefKeylen[keyindex];
240                 memcpy(&wepkey[0], iv, 3);
241                 memcpy(&wepkey[3], &psecuritypriv->DefKey[
242                         psecuritypriv->PrivacyKeyIndex].skey[0],
243                         keylength);
244                 length = ((union recv_frame *)precvframe)->
245                            u.hdr.len - prxattrib->hdrlen - prxattrib->iv_len;
246                 payload = pframe + prxattrib->iv_len + prxattrib->hdrlen;
247                 /* decrypt payload include icv */
248                 arcfour_init(&mycontext, wepkey, 3 + keylength);
249                 arcfour_encrypt(&mycontext, payload, payload,  length);
250                 /* calculate icv and compare the icv */
251                 *((__le32 *)crc) = cpu_to_le32(getcrc32(payload, length - 4));
252         }
253 }
254
255 /* 3 =====TKIP related===== */
256
257 static u32 secmicgetuint32(u8 *p)
258 /* Convert from Byte[] to Us4Byte32 in a portable way */
259 {
260         s32 i;
261         u32 res = 0;
262
263         for (i = 0; i < 4; i++)
264                 res |= ((u32)(*p++)) << (8 * i);
265         return res;
266 }
267
268 static void secmicputuint32(u8 *p, u32 val)
269 /* Convert from Us4Byte32 to Byte[] in a portable way */
270 {
271         long i;
272
273         for (i = 0; i < 4; i++) {
274                 *p++ = (u8) (val & 0xff);
275                 val >>= 8;
276         }
277 }
278
279 static void secmicclear(struct mic_data *pmicdata)
280 {
281 /* Reset the state to the empty message. */
282         pmicdata->L = pmicdata->K0;
283         pmicdata->R = pmicdata->K1;
284         pmicdata->nBytesInM = 0;
285         pmicdata->M = 0;
286 }
287
288 void r8712_secmicsetkey(struct mic_data *pmicdata, u8 *key)
289 {
290         /* Set the key */
291         pmicdata->K0 = secmicgetuint32(key);
292         pmicdata->K1 = secmicgetuint32(key + 4);
293         /* and reset the message */
294         secmicclear(pmicdata);
295 }
296
297 static void secmicappendbyte(struct mic_data *pmicdata, u8 b)
298 {
299         /* Append the byte to our word-sized buffer */
300         pmicdata->M |= ((u32)b) << (8 * pmicdata->nBytesInM);
301         pmicdata->nBytesInM++;
302         /* Process the word if it is full. */
303         if (pmicdata->nBytesInM >= 4) {
304                 pmicdata->L ^= pmicdata->M;
305                 pmicdata->R ^= ROL32(pmicdata->L, 17);
306                 pmicdata->L += pmicdata->R;
307                 pmicdata->R ^= ((pmicdata->L & 0xff00ff00) >> 8) |
308                                ((pmicdata->L & 0x00ff00ff) << 8);
309                 pmicdata->L += pmicdata->R;
310                 pmicdata->R ^= ROL32(pmicdata->L, 3);
311                 pmicdata->L += pmicdata->R;
312                 pmicdata->R ^= ROR32(pmicdata->L, 2);
313                 pmicdata->L += pmicdata->R;
314                 /* Clear the buffer */
315                 pmicdata->M = 0;
316                 pmicdata->nBytesInM = 0;
317         }
318 }
319
320 void r8712_secmicappend(struct mic_data *pmicdata, u8 *src, u32 nbytes)
321 {
322         /* This is simple */
323         while (nbytes > 0) {
324                 secmicappendbyte(pmicdata, *src++);
325                 nbytes--;
326         }
327 }
328
329 void r8712_secgetmic(struct mic_data *pmicdata, u8 *dst)
330 {
331         /* Append the minimum padding */
332         secmicappendbyte(pmicdata, 0x5a);
333         secmicappendbyte(pmicdata, 0);
334         secmicappendbyte(pmicdata, 0);
335         secmicappendbyte(pmicdata, 0);
336         secmicappendbyte(pmicdata, 0);
337         /* and then zeroes until the length is a multiple of 4 */
338         while (pmicdata->nBytesInM != 0)
339                 secmicappendbyte(pmicdata, 0);
340         /* The appendByte function has already computed the result. */
341         secmicputuint32(dst, pmicdata->L);
342         secmicputuint32(dst + 4, pmicdata->R);
343         /* Reset to the empty message. */
344         secmicclear(pmicdata);
345 }
346
347 void seccalctkipmic(u8 *key, u8 *header, u8 *data, u32 data_len, u8 *mic_code,
348                     u8 pri)
349 {
350
351         struct mic_data micdata;
352         u8 priority[4] = {0x0, 0x0, 0x0, 0x0};
353
354         r8712_secmicsetkey(&micdata, key);
355         priority[0] = pri;
356         /* Michael MIC pseudo header: DA, SA, 3 x 0, Priority */
357         if (header[1] & 1) {   /* ToDS==1 */
358                 r8712_secmicappend(&micdata, &header[16], 6);  /* DA */
359                 if (header[1] & 2)  /* From Ds==1 */
360                         r8712_secmicappend(&micdata, &header[24], 6);
361                 else
362                         r8712_secmicappend(&micdata, &header[10], 6);
363         } else {        /* ToDS==0 */
364                 r8712_secmicappend(&micdata, &header[4], 6);   /* DA */
365                 if (header[1] & 2)  /* From Ds==1 */
366                         r8712_secmicappend(&micdata, &header[16], 6);
367                 else
368                         r8712_secmicappend(&micdata, &header[10], 6);
369         }
370         r8712_secmicappend(&micdata, &priority[0], 4);
371         r8712_secmicappend(&micdata, data, data_len);
372         r8712_secgetmic(&micdata, mic_code);
373 }
374
375 /* macros for extraction/creation of unsigned char/unsigned short values  */
376 #define RotR1(v16)   ((((v16) >> 1) & 0x7FFF) ^ (((v16) & 1) << 15))
377 #define   Lo8(v16)   ((u8)((v16) & 0x00FF))
378 #define   Hi8(v16)   ((u8)(((v16) >> 8) & 0x00FF))
379 #define  Lo16(v32)   ((u16)((v32) & 0xFFFF))
380 #define  Hi16(v32)   ((u16)(((v32) >> 16) & 0xFFFF))
381 #define  Mk16(hi, lo) ((lo) ^ (((u16)(hi)) << 8))
382
383 /* select the Nth 16-bit word of the temporal key unsigned char array TK[]   */
384 #define  TK16(N)  Mk16(tk[2 * (N) + 1], tk[2 * (N)])
385
386 /* S-box lookup: 16 bits --> 16 bits */
387 #define _S_(v16)  (Sbox1[0][Lo8(v16)] ^ Sbox1[1][Hi8(v16)])
388
389 /* fixed algorithm "parameters" */
390 #define PHASE1_LOOP_CNT   8    /* this needs to be "big enough"     */
391 #define TA_SIZE           6    /*  48-bit transmitter address       */
392 #define TK_SIZE          16    /* 128-bit temporal key              */
393 #define P1K_SIZE         10    /*  80-bit Phase1 key                */
394 #define RC4_KEY_SIZE     16    /* 128-bit RC4KEY (104 bits unknown) */
395
396
397 /* 2-unsigned char by 2-unsigned char subset of the full AES S-box table */
398 static const unsigned short Sbox1[2][256] = {/* Sbox for hash (can be in ROM) */
399         {
400         0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154,
401         0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A,
402         0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B,
403         0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B,
404         0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F,
405         0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F,
406         0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5,
407         0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F,
408         0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB,
409         0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397,
410         0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED,
411         0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A,
412         0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194,
413         0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3,
414         0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104,
415         0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D,
416         0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39,
417         0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695,
418         0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83,
419         0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76,
420         0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4,
421         0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B,
422         0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0,
423         0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018,
424         0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751,
425         0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85,
426         0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12,
427         0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9,
428         0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7,
429         0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A,
430         0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8,
431         0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A,
432         },
433         {  /* second half is unsigned char-reversed version of first! */
434         0xA5C6, 0x84F8, 0x99EE, 0x8DF6, 0x0DFF, 0xBDD6, 0xB1DE, 0x5491,
435         0x5060, 0x0302, 0xA9CE, 0x7D56, 0x19E7, 0x62B5, 0xE64D, 0x9AEC,
436         0x458F, 0x9D1F, 0x4089, 0x87FA, 0x15EF, 0xEBB2, 0xC98E, 0x0BFB,
437         0xEC41, 0x67B3, 0xFD5F, 0xEA45, 0xBF23, 0xF753, 0x96E4, 0x5B9B,
438         0xC275, 0x1CE1, 0xAE3D, 0x6A4C, 0x5A6C, 0x417E, 0x02F5, 0x4F83,
439         0x5C68, 0xF451, 0x34D1, 0x08F9, 0x93E2, 0x73AB, 0x5362, 0x3F2A,
440         0x0C08, 0x5295, 0x6546, 0x5E9D, 0x2830, 0xA137, 0x0F0A, 0xB52F,
441         0x090E, 0x3624, 0x9B1B, 0x3DDF, 0x26CD, 0x694E, 0xCD7F, 0x9FEA,
442         0x1B12, 0x9E1D, 0x7458, 0x2E34, 0x2D36, 0xB2DC, 0xEEB4, 0xFB5B,
443         0xF6A4, 0x4D76, 0x61B7, 0xCE7D, 0x7B52, 0x3EDD, 0x715E, 0x9713,
444         0xF5A6, 0x68B9, 0x0000, 0x2CC1, 0x6040, 0x1FE3, 0xC879, 0xEDB6,
445         0xBED4, 0x468D, 0xD967, 0x4B72, 0xDE94, 0xD498, 0xE8B0, 0x4A85,
446         0x6BBB, 0x2AC5, 0xE54F, 0x16ED, 0xC586, 0xD79A, 0x5566, 0x9411,
447         0xCF8A, 0x10E9, 0x0604, 0x81FE, 0xF0A0, 0x4478, 0xBA25, 0xE34B,
448         0xF3A2, 0xFE5D, 0xC080, 0x8A05, 0xAD3F, 0xBC21, 0x4870, 0x04F1,
449         0xDF63, 0xC177, 0x75AF, 0x6342, 0x3020, 0x1AE5, 0x0EFD, 0x6DBF,
450         0x4C81, 0x1418, 0x3526, 0x2FC3, 0xE1BE, 0xA235, 0xCC88, 0x392E,
451         0x5793, 0xF255, 0x82FC, 0x477A, 0xACC8, 0xE7BA, 0x2B32, 0x95E6,
452         0xA0C0, 0x9819, 0xD19E, 0x7FA3, 0x6644, 0x7E54, 0xAB3B, 0x830B,
453         0xCA8C, 0x29C7, 0xD36B, 0x3C28, 0x79A7, 0xE2BC, 0x1D16, 0x76AD,
454         0x3BDB, 0x5664, 0x4E74, 0x1E14, 0xDB92, 0x0A0C, 0x6C48, 0xE4B8,
455         0x5D9F, 0x6EBD, 0xEF43, 0xA6C4, 0xA839, 0xA431, 0x37D3, 0x8BF2,
456         0x32D5, 0x438B, 0x596E, 0xB7DA, 0x8C01, 0x64B1, 0xD29C, 0xE049,
457         0xB4D8, 0xFAAC, 0x07F3, 0x25CF, 0xAFCA, 0x8EF4, 0xE947, 0x1810,
458         0xD56F, 0x88F0, 0x6F4A, 0x725C, 0x2438, 0xF157, 0xC773, 0x5197,
459         0x23CB, 0x7CA1, 0x9CE8, 0x213E, 0xDD96, 0xDC61, 0x860D, 0x850F,
460         0x90E0, 0x427C, 0xC471, 0xAACC, 0xD890, 0x0506, 0x01F7, 0x121C,
461         0xA3C2, 0x5F6A, 0xF9AE, 0xD069, 0x9117, 0x5899, 0x273A, 0xB927,
462         0x38D9, 0x13EB, 0xB32B, 0x3322, 0xBBD2, 0x70A9, 0x8907, 0xA733,
463         0xB62D, 0x223C, 0x9215, 0x20C9, 0x4987, 0xFFAA, 0x7850, 0x7AA5,
464         0x8F03, 0xF859, 0x8009, 0x171A, 0xDA65, 0x31D7, 0xC684, 0xB8D0,
465         0xC382, 0xB029, 0x775A, 0x111E, 0xCB7B, 0xFCA8, 0xD66D, 0x3A2C,
466         }
467 };
468
469 /*
470  **********************************************************************
471  * Routine: Phase 1 -- generate P1K, given TA, TK, IV32
472  *
473  * Inputs:
474  *     tk[]      = temporal key                         [128 bits]
475  *     ta[]      = transmitter's MAC address            [ 48 bits]
476  *     iv32      = upper 32 bits of IV                  [ 32 bits]
477  * Output:
478  *     p1k[]     = Phase 1 key                          [ 80 bits]
479  *
480  * Note:
481  *     This function only needs to be called every 2**16 packets,
482  *     although in theory it could be called every packet.
483  *
484  **********************************************************************
485  */
486 static void phase1(u16 *p1k, const u8 *tk, const u8 *ta, u32 iv32)
487 {
488         sint  i;
489
490         /* Initialize the 80 bits of P1K[] from IV32 and TA[0..5]     */
491         p1k[0] = Lo16(iv32);
492         p1k[1] = Hi16(iv32);
493         p1k[2] = Mk16(ta[1], ta[0]); /* use TA[] as little-endian */
494         p1k[3] = Mk16(ta[3], ta[2]);
495         p1k[4] = Mk16(ta[5], ta[4]);
496         /* Now compute an unbalanced Feistel cipher with 80-bit block */
497         /* size on the 80-bit block P1K[], using the 128-bit key TK[] */
498         for (i = 0; i < PHASE1_LOOP_CNT; i++) {  /* Each add is mod 2**16 */
499                 p1k[0] += _S_(p1k[4] ^ TK16((i & 1) + 0));
500                 p1k[1] += _S_(p1k[0] ^ TK16((i & 1) + 2));
501                 p1k[2] += _S_(p1k[1] ^ TK16((i & 1) + 4));
502                 p1k[3] += _S_(p1k[2] ^ TK16((i & 1) + 6));
503                 p1k[4] += _S_(p1k[3] ^ TK16((i & 1) + 0));
504                 p1k[4] +=  (unsigned short)i;   /* avoid "slide attacks" */
505         }
506 }
507
508 /*
509  **********************************************************************
510  * Routine: Phase 2 -- generate RC4KEY, given TK, P1K, IV16
511  *
512  * Inputs:
513  *     tk[]      = Temporal key                         [128 bits]
514  *     p1k[]     = Phase 1 output key                   [ 80 bits]
515  *     iv16      = low 16 bits of IV counter            [ 16 bits]
516  * Output:
517  *     rc4key[]  = the key used to encrypt the packet   [128 bits]
518  *
519  * Note:
520  *     The value {TA,IV32,IV16} for Phase1/Phase2 must be unique
521  *     across all packets using the same key TK value. Then, for a
522  *     given value of TK[], this TKIP48 construction guarantees that
523  *     the final RC4KEY value is unique across all packets.
524  *
525  * Suggested implementation optimization: if PPK[] is "overlaid"
526  *     appropriately on RC4KEY[], there is no need for the final
527  *     for loop below that copies the PPK[] result into RC4KEY[].
528  *
529  **********************************************************************
530  */
531 static void phase2(u8 *rc4key, const u8 *tk, const u16 *p1k, u16 iv16)
532 {
533         sint  i;
534         u16 PPK[6];                     /* temporary key for mixing    */
535
536         /* Note: all adds in the PPK[] equations below are mod 2**16 */
537         for (i = 0; i < 5; i++)
538                 PPK[i] = p1k[i]; /* first, copy P1K to PPK */
539         PPK[5]  =  p1k[4] + iv16; /* next,  add in IV16 */
540         /* Bijective non-linear mixing of the 96 bits of PPK[0..5] */
541         PPK[0] += _S_(PPK[5] ^ TK16(0));   /* Mix key in each "round" */
542         PPK[1] += _S_(PPK[0] ^ TK16(1));
543         PPK[2] += _S_(PPK[1] ^ TK16(2));
544         PPK[3] += _S_(PPK[2] ^ TK16(3));
545         PPK[4] += _S_(PPK[3] ^ TK16(4));
546         PPK[5] += _S_(PPK[4] ^ TK16(5));   /* Total # S-box lookups == 6  */
547         /* Final sweep: bijective, "linear". Rotates kill LSB correlations   */
548         PPK[0] +=  RotR1(PPK[5] ^ TK16(6));
549         PPK[1] +=  RotR1(PPK[0] ^ TK16(7));   /* Use all of TK[] in Phase2   */
550         PPK[2] +=  RotR1(PPK[1]);
551         PPK[3] +=  RotR1(PPK[2]);
552         PPK[4] +=  RotR1(PPK[3]);
553         PPK[5] +=  RotR1(PPK[4]);
554         /* Note: At this point, for a given key TK[0..15], the 96-bit output */
555         /* value PPK[0..5] is guaranteed to be unique, as a function   */
556         /* of the 96-bit "input" value   {TA,IV32,IV16}. That is, P1K  */
557         /* is now a keyed permutation of {TA,IV32,IV16}. */
558         /* Set RC4KEY[0..3], which includes "cleartext" portion of RC4 key   */
559         rc4key[0] = Hi8(iv16); /* RC4KEY[0..2] is the WEP IV  */
560         rc4key[1] = (Hi8(iv16) | 0x20) & 0x7F; /* Help avoid weak (FMS) keys  */
561         rc4key[2] = Lo8(iv16);
562         rc4key[3] = Lo8((PPK[5] ^ TK16(0)) >> 1);
563         /* Copy 96 bits of PPK[0..5] to RC4KEY[4..15]  (little-endian) */
564         for (i = 0; i < 6; i++) {
565                 rc4key[4 + 2 * i] = Lo8(PPK[i]);
566                 rc4key[5 + 2 * i] = Hi8(PPK[i]);
567         }
568 }
569
570 /*The hlen isn't include the IV*/
571 u32 r8712_tkip_encrypt(struct _adapter *padapter, u8 *pxmitframe)
572 {       /*  exclude ICV */
573         u16 pnl;
574         u32 pnh;
575         u8 rc4key[16];
576         u8 ttkey[16];
577         u8 crc[4];
578         struct arc4context mycontext;
579         u32 curfragnum, length;
580
581         u8 *pframe, *payload, *iv, *prwskey;
582         union pn48 txpn;
583         struct sta_info *stainfo;
584         struct pkt_attrib *pattrib = &((struct xmit_frame *)pxmitframe)->attrib;
585         struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
586         u32 res = _SUCCESS;
587
588         if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL)
589                 return _FAIL;
590
591         pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + TXDESC_OFFSET;
592         /* 4 start to encrypt each fragment */
593         if (pattrib->encrypt == _TKIP_) {
594                 if (pattrib->psta)
595                         stainfo = pattrib->psta;
596                 else
597                         stainfo = r8712_get_stainfo(&padapter->stapriv,
598                                   &pattrib->ra[0]);
599                 if (stainfo != NULL) {
600                         prwskey = &stainfo->x_UncstKey.skey[0];
601                         for (curfragnum = 0; curfragnum < pattrib->nr_frags;
602                              curfragnum++) {
603                                 iv = pframe + pattrib->hdrlen;
604                                 payload = pframe + pattrib->iv_len +
605                                           pattrib->hdrlen;
606                                 GET_TKIP_PN(iv, txpn);
607                                 pnl = (u16)(txpn.val);
608                                 pnh = (u32)(txpn.val >> 16);
609                                 phase1((u16 *)&ttkey[0], prwskey,
610                                        &pattrib->ta[0], pnh);
611                                 phase2(&rc4key[0], prwskey, (u16 *)&ttkey[0],
612                                        pnl);
613                                 if ((curfragnum + 1) == pattrib->nr_frags) {
614                                         /* 4 the last fragment */
615                                         length = pattrib->last_txcmdsz -
616                                              pattrib->hdrlen -
617                                              pattrib->iv_len -
618                                              pattrib->icv_len;
619                                         *((__le32 *)crc) = cpu_to_le32(
620                                                 getcrc32(payload, length));
621                                         arcfour_init(&mycontext, rc4key, 16);
622                                         arcfour_encrypt(&mycontext, payload,
623                                                         payload, length);
624                                         arcfour_encrypt(&mycontext, payload +
625                                                         length, crc, 4);
626                                 } else {
627                                         length = pxmitpriv->frag_len -
628                                                  pattrib->hdrlen -
629                                                  pattrib->iv_len -
630                                                  pattrib->icv_len;
631                                         *((__le32 *)crc) = cpu_to_le32(getcrc32(
632                                                         payload, length));
633                                         arcfour_init(&mycontext, rc4key, 16);
634                                         arcfour_encrypt(&mycontext, payload,
635                                                          payload, length);
636                                         arcfour_encrypt(&mycontext,
637                                                         payload + length, crc,
638                                                         4);
639                                         pframe += pxmitpriv->frag_len;
640                                         pframe = (u8 *)RND4((addr_t)(pframe));
641                                 }
642                         }
643                 } else {
644                         res = _FAIL;
645                 }
646         }
647         return res;
648 }
649
650 /* The hlen doesn't include the IV */
651 u32 r8712_tkip_decrypt(struct _adapter *padapter, u8 *precvframe)
652 {       /* exclude ICV */
653         u16 pnl;
654         u32 pnh;
655         u8 rc4key[16];
656         u8 ttkey[16];
657         u8 crc[4];
658         struct arc4context mycontext;
659         u32 length;
660         u8 *pframe, *payload, *iv, *prwskey, idx = 0;
661         union pn48 txpn;
662         struct  sta_info *stainfo;
663         struct  rx_pkt_attrib *prxattrib = &((union recv_frame *)
664                                            precvframe)->u.hdr.attrib;
665         struct  security_priv   *psecuritypriv = &padapter->securitypriv;
666
667         pframe = (unsigned char *)((union recv_frame *)
668                                    precvframe)->u.hdr.rx_data;
669         /* 4 start to decrypt recvframe */
670         if (prxattrib->encrypt == _TKIP_) {
671                 stainfo = r8712_get_stainfo(&padapter->stapriv,
672                                             &prxattrib->ta[0]);
673                 if (stainfo != NULL) {
674                         iv = pframe + prxattrib->hdrlen;
675                         payload = pframe + prxattrib->iv_len +
676                                   prxattrib->hdrlen;
677                         length = ((union recv_frame *)precvframe)->
678                                  u.hdr.len - prxattrib->hdrlen -
679                                  prxattrib->iv_len;
680                         if (IS_MCAST(prxattrib->ra)) {
681                                 idx = iv[3];
682                                 prwskey = &psecuritypriv->XGrpKey[
683                                          ((idx >> 6) & 0x3) - 1].skey[0];
684                                 if (!psecuritypriv->binstallGrpkey)
685                                         return _FAIL;
686                         } else {
687                                 prwskey = &stainfo->x_UncstKey.skey[0];
688                         }
689                         GET_TKIP_PN(iv, txpn);
690                         pnl = (u16)(txpn.val);
691                         pnh = (u32)(txpn.val >> 16);
692                         phase1((u16 *)&ttkey[0], prwskey, &prxattrib->ta[0],
693                                 pnh);
694                         phase2(&rc4key[0], prwskey, (unsigned short *)
695                                &ttkey[0], pnl);
696                         /* 4 decrypt payload include icv */
697                         arcfour_init(&mycontext, rc4key, 16);
698                         arcfour_encrypt(&mycontext, payload, payload, length);
699                         *((__le32 *)crc) = cpu_to_le32(getcrc32(payload,
700                                         length - 4));
701                         if (crc[3] != payload[length - 1] ||
702                             crc[2] != payload[length - 2] ||
703                             crc[1] != payload[length - 3] ||
704                             crc[0] != payload[length - 4])
705                                 return _FAIL;
706                 } else {
707                         return _FAIL;
708                 }
709         }
710         return _SUCCESS;
711 }
712
713 /* 3 =====AES related===== */
714
715 #define MAX_MSG_SIZE    2048
716 /*****************************/
717 /******** SBOX Table *********/
718 /*****************************/
719
720 static const u8 sbox_table[256] = {
721         0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
722         0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
723         0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
724         0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
725         0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
726         0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
727         0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
728         0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
729         0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
730         0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
731         0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
732         0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
733         0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
734         0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
735         0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
736         0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
737         0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
738         0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
739         0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
740         0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
741         0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
742         0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
743         0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
744         0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
745         0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
746         0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
747         0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
748         0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
749         0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
750         0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
751         0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
752         0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
753 };
754
755 /****************************************/
756 /* aes128k128d()                        */
757 /* Performs a 128 bit AES encrypt with  */
758 /* 128 bit data.                        */
759 /****************************************/
760 static void xor_128(u8 *a, u8 *b, u8 *out)
761 {
762         sint i;
763
764         for (i = 0; i < 16; i++)
765                 out[i] = a[i] ^ b[i];
766 }
767
768 static void xor_32(u8 *a, u8 *b, u8 *out)
769 {
770         sint i;
771
772         for (i = 0; i < 4; i++)
773                 out[i] = a[i] ^ b[i];
774 }
775
776 static u8 sbox(u8 a)
777 {
778         return sbox_table[(sint)a];
779 }
780
781 static void next_key(u8 *key, sint round)
782 {
783         u8 rcon;
784         u8 sbox_key[4];
785         u8 rcon_table[12] = {
786                 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
787                 0x1b, 0x36, 0x36, 0x36
788         };
789
790         sbox_key[0] = sbox(key[13]);
791         sbox_key[1] = sbox(key[14]);
792         sbox_key[2] = sbox(key[15]);
793         sbox_key[3] = sbox(key[12]);
794         rcon = rcon_table[round];
795         xor_32(&key[0], sbox_key, &key[0]);
796         key[0] = key[0] ^ rcon;
797         xor_32(&key[4], &key[0], &key[4]);
798         xor_32(&key[8], &key[4], &key[8]);
799         xor_32(&key[12], &key[8], &key[12]);
800 }
801
802 static void byte_sub(u8 *in, u8 *out)
803 {
804         sint i;
805
806         for (i = 0; i < 16; i++)
807                 out[i] = sbox(in[i]);
808 }
809
810 static void shift_row(u8 *in, u8 *out)
811 {
812         out[0] =  in[0];
813         out[1] =  in[5];
814         out[2] =  in[10];
815         out[3] =  in[15];
816         out[4] =  in[4];
817         out[5] =  in[9];
818         out[6] =  in[14];
819         out[7] =  in[3];
820         out[8] =  in[8];
821         out[9] =  in[13];
822         out[10] = in[2];
823         out[11] = in[7];
824         out[12] = in[12];
825         out[13] = in[1];
826         out[14] = in[6];
827         out[15] = in[11];
828 }
829
830 static void mix_column(u8 *in, u8 *out)
831 {
832         sint i;
833         u8 add1b[4];
834         u8 add1bf7[4];
835         u8 rotl[4];
836         u8 swap_halves[4];
837         u8 andf7[4];
838         u8 rotr[4];
839         u8 temp[4];
840         u8 tempb[4];
841
842         for (i = 0; i < 4; i++) {
843                 if ((in[i] & 0x80) == 0x80)
844                         add1b[i] = 0x1b;
845                 else
846                         add1b[i] = 0x00;
847         }
848         swap_halves[0] = in[2];    /* Swap halves */
849         swap_halves[1] = in[3];
850         swap_halves[2] = in[0];
851         swap_halves[3] = in[1];
852         rotl[0] = in[3];        /* Rotate left 8 bits */
853         rotl[1] = in[0];
854         rotl[2] = in[1];
855         rotl[3] = in[2];
856         andf7[0] = in[0] & 0x7f;
857         andf7[1] = in[1] & 0x7f;
858         andf7[2] = in[2] & 0x7f;
859         andf7[3] = in[3] & 0x7f;
860         for (i = 3; i > 0; i--) {   /* logical shift left 1 bit */
861                 andf7[i] = andf7[i] << 1;
862                 if ((andf7[i - 1] & 0x80) == 0x80)
863                         andf7[i] = (andf7[i] | 0x01);
864         }
865         andf7[0] = andf7[0] << 1;
866         andf7[0] = andf7[0] & 0xfe;
867         xor_32(add1b, andf7, add1bf7);
868         xor_32(in, add1bf7, rotr);
869         temp[0] = rotr[0];         /* Rotate right 8 bits */
870         rotr[0] = rotr[1];
871         rotr[1] = rotr[2];
872         rotr[2] = rotr[3];
873         rotr[3] = temp[0];
874         xor_32(add1bf7, rotr, temp);
875         xor_32(swap_halves, rotl, tempb);
876         xor_32(temp, tempb, out);
877 }
878
879 static void aes128k128d(u8 *key, u8 *data, u8 *ciphertext)
880 {
881         sint round;
882         sint i;
883         u8 intermediatea[16];
884         u8 intermediateb[16];
885         u8 round_key[16];
886
887         for (i = 0; i < 16; i++)
888                 round_key[i] = key[i];
889         for (round = 0; round < 11; round++) {
890                 if (round == 0) {
891                         xor_128(round_key, data, ciphertext);
892                         next_key(round_key, round);
893                 } else if (round == 10) {
894                         byte_sub(ciphertext, intermediatea);
895                         shift_row(intermediatea, intermediateb);
896                         xor_128(intermediateb, round_key, ciphertext);
897                 } else {   /* 1 - 9 */
898                         byte_sub(ciphertext, intermediatea);
899                         shift_row(intermediatea, intermediateb);
900                         mix_column(&intermediateb[0], &intermediatea[0]);
901                         mix_column(&intermediateb[4], &intermediatea[4]);
902                         mix_column(&intermediateb[8], &intermediatea[8]);
903                         mix_column(&intermediateb[12], &intermediatea[12]);
904                         xor_128(intermediatea, round_key, ciphertext);
905                         next_key(round_key, round);
906                 }
907         }
908 }
909
910 /************************************************/
911 /* construct_mic_iv()                           */
912 /* Builds the MIC IV from header fields and PN  */
913 /************************************************/
914 static void construct_mic_iv(u8 *mic_iv, sint qc_exists, sint a4_exists,
915                              u8 *mpdu, uint payload_length, u8 *pn_vector)
916 {
917         sint i;
918
919         mic_iv[0] = 0x59;
920         if (qc_exists && a4_exists)
921                 mic_iv[1] = mpdu[30] & 0x0f;    /* QoS_TC           */
922         if (qc_exists && !a4_exists)
923                 mic_iv[1] = mpdu[24] & 0x0f;   /* mute bits 7-4    */
924         if (!qc_exists)
925                 mic_iv[1] = 0x00;
926         for (i = 2; i < 8; i++)
927                 mic_iv[i] = mpdu[i + 8];
928         for (i = 8; i < 14; i++)
929                 mic_iv[i] = pn_vector[13 - i]; /* mic_iv[8:13] = PN[5:0] */
930         mic_iv[14] = (unsigned char) (payload_length / 256);
931         mic_iv[15] = (unsigned char) (payload_length % 256);
932 }
933
934 /************************************************/
935 /* construct_mic_header1()                      */
936 /* Builds the first MIC header block from       */
937 /* header fields.                               */
938 /************************************************/
939 static void construct_mic_header1(u8 *mic_header1, sint header_length, u8 *mpdu)
940 {
941         mic_header1[0] = (u8)((header_length - 2) / 256);
942         mic_header1[1] = (u8)((header_length - 2) % 256);
943         mic_header1[2] = mpdu[0] & 0xcf;    /* Mute CF poll & CF ack bits */
944         /* Mute retry, more data and pwr mgt bits */
945         mic_header1[3] = mpdu[1] & 0xc7;
946         mic_header1[4] = mpdu[4];       /* A1 */
947         mic_header1[5] = mpdu[5];
948         mic_header1[6] = mpdu[6];
949         mic_header1[7] = mpdu[7];
950         mic_header1[8] = mpdu[8];
951         mic_header1[9] = mpdu[9];
952         mic_header1[10] = mpdu[10];     /* A2 */
953         mic_header1[11] = mpdu[11];
954         mic_header1[12] = mpdu[12];
955         mic_header1[13] = mpdu[13];
956         mic_header1[14] = mpdu[14];
957         mic_header1[15] = mpdu[15];
958 }
959
960 /************************************************/
961 /* construct_mic_header2()                      */
962 /* Builds the last MIC header block from        */
963 /* header fields.                               */
964 /************************************************/
965 static void construct_mic_header2(u8 *mic_header2, u8 *mpdu, sint a4_exists,
966                            sint qc_exists)
967 {
968         sint i;
969
970         for (i = 0; i < 16; i++)
971                 mic_header2[i] = 0x00;
972         mic_header2[0] = mpdu[16];    /* A3 */
973         mic_header2[1] = mpdu[17];
974         mic_header2[2] = mpdu[18];
975         mic_header2[3] = mpdu[19];
976         mic_header2[4] = mpdu[20];
977         mic_header2[5] = mpdu[21];
978         mic_header2[6] = 0x00;
979         mic_header2[7] = 0x00; /* mpdu[23]; */
980         if (!qc_exists && a4_exists)
981                 for (i = 0; i < 6; i++)
982                         mic_header2[8 + i] = mpdu[24 + i];   /* A4 */
983         if (qc_exists && !a4_exists) {
984                 mic_header2[8] = mpdu[24] & 0x0f; /* mute bits 15 - 4 */
985                 mic_header2[9] = mpdu[25] & 0x00;
986         }
987         if (qc_exists && a4_exists) {
988                 for (i = 0; i < 6; i++)
989                         mic_header2[8 + i] = mpdu[24 + i];   /* A4 */
990                 mic_header2[14] = mpdu[30] & 0x0f;
991                 mic_header2[15] = mpdu[31] & 0x00;
992         }
993 }
994
995 /************************************************/
996 /* construct_mic_header2()                      */
997 /* Builds the last MIC header block from        */
998 /* header fields.                               */
999 /************************************************/
1000 static void construct_ctr_preload(u8 *ctr_preload,
1001                                   sint a4_exists, sint qc_exists,
1002                                   u8 *mpdu, u8 *pn_vector, sint c)
1003 {
1004         sint i;
1005
1006         for (i = 0; i < 16; i++)
1007                 ctr_preload[i] = 0x00;
1008         i = 0;
1009         ctr_preload[0] = 0x01;    /* flag */
1010         if (qc_exists && a4_exists)
1011                 ctr_preload[1] = mpdu[30] & 0x0f;
1012         if (qc_exists && !a4_exists)
1013                 ctr_preload[1] = mpdu[24] & 0x0f;
1014         for (i = 2; i < 8; i++)
1015                 ctr_preload[i] = mpdu[i + 8];
1016         for (i = 8; i < 14; i++)
1017                 ctr_preload[i] = pn_vector[13 - i];
1018         ctr_preload[14] = (unsigned char) (c / 256); /* Ctr */
1019         ctr_preload[15] = (unsigned char) (c % 256);
1020 }
1021
1022 /************************************/
1023 /* bitwise_xor()                    */
1024 /* A 128 bit, bitwise exclusive or  */
1025 /************************************/
1026 static void bitwise_xor(u8 *ina, u8 *inb, u8 *out)
1027 {
1028         sint i;
1029
1030         for (i = 0; i < 16; i++)
1031                 out[i] = ina[i] ^ inb[i];
1032 }
1033
1034 static sint aes_cipher(u8 *key, uint    hdrlen,
1035                         u8 *pframe, uint plen)
1036 {
1037         uint qc_exists, a4_exists, i, j, payload_remainder;
1038         uint num_blocks, payload_index;
1039
1040         u8 pn_vector[6];
1041         u8 mic_iv[16];
1042         u8 mic_header1[16];
1043         u8 mic_header2[16];
1044         u8 ctr_preload[16];
1045
1046         /* Intermediate Buffers */
1047         u8 chain_buffer[16];
1048         u8 aes_out[16];
1049         u8 padded_buffer[16];
1050         u8 mic[8];
1051         u16 frtype  = GetFrameType(pframe);
1052         u16 frsubtype  = GetFrameSubType(pframe);
1053
1054         frsubtype >>= 4;
1055         memset((void *)mic_iv, 0, 16);
1056         memset((void *)mic_header1, 0, 16);
1057         memset((void *)mic_header2, 0, 16);
1058         memset((void *)ctr_preload, 0, 16);
1059         memset((void *)chain_buffer, 0, 16);
1060         memset((void *)aes_out, 0, 16);
1061         memset((void *)padded_buffer, 0, 16);
1062
1063         if ((hdrlen == WLAN_HDR_A3_LEN) || (hdrlen ==  WLAN_HDR_A3_QOS_LEN))
1064                 a4_exists = 0;
1065         else
1066                 a4_exists = 1;
1067
1068         if ((frtype == WIFI_DATA_CFACK) ||
1069              (frtype == WIFI_DATA_CFPOLL) ||
1070              (frtype == WIFI_DATA_CFACKPOLL)) {
1071                 qc_exists = 1;
1072                 if (hdrlen !=  WLAN_HDR_A3_QOS_LEN)
1073                         hdrlen += 2;
1074         } else if ((frsubtype == 0x08) ||
1075                    (frsubtype == 0x09) ||
1076                    (frsubtype == 0x0a) ||
1077                    (frsubtype == 0x0b)) {
1078                 if (hdrlen !=  WLAN_HDR_A3_QOS_LEN)
1079                         hdrlen += 2;
1080                 qc_exists = 1;
1081         } else {
1082                 qc_exists = 0;
1083         }
1084         pn_vector[0] = pframe[hdrlen];
1085         pn_vector[1] = pframe[hdrlen + 1];
1086         pn_vector[2] = pframe[hdrlen + 4];
1087         pn_vector[3] = pframe[hdrlen + 5];
1088         pn_vector[4] = pframe[hdrlen + 6];
1089         pn_vector[5] = pframe[hdrlen + 7];
1090         construct_mic_iv(mic_iv, qc_exists, a4_exists, pframe, plen, pn_vector);
1091         construct_mic_header1(mic_header1, hdrlen, pframe);
1092         construct_mic_header2(mic_header2, pframe, a4_exists, qc_exists);
1093         payload_remainder = plen % 16;
1094         num_blocks = plen / 16;
1095         /* Find start of payload */
1096         payload_index = hdrlen + 8;
1097         /* Calculate MIC */
1098         aes128k128d(key, mic_iv, aes_out);
1099         bitwise_xor(aes_out, mic_header1, chain_buffer);
1100         aes128k128d(key, chain_buffer, aes_out);
1101         bitwise_xor(aes_out, mic_header2, chain_buffer);
1102         aes128k128d(key, chain_buffer, aes_out);
1103         for (i = 0; i < num_blocks; i++) {
1104                 bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);
1105                 payload_index += 16;
1106                 aes128k128d(key, chain_buffer, aes_out);
1107         }
1108         /* Add on the final payload block if it needs padding */
1109         if (payload_remainder > 0) {
1110                 for (j = 0; j < 16; j++)
1111                         padded_buffer[j] = 0x00;
1112                 for (j = 0; j < payload_remainder; j++)
1113                         padded_buffer[j] = pframe[payload_index++];
1114                 bitwise_xor(aes_out, padded_buffer, chain_buffer);
1115                 aes128k128d(key, chain_buffer, aes_out);
1116         }
1117         for (j = 0; j < 8; j++)
1118                 mic[j] = aes_out[j];
1119         /* Insert MIC into payload */
1120         for (j = 0; j < 8; j++)
1121                 pframe[payload_index + j] = mic[j];
1122         payload_index = hdrlen + 8;
1123         for (i = 0; i < num_blocks; i++) {
1124                 construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1125                                       pframe, pn_vector, i + 1);
1126                 aes128k128d(key, ctr_preload, aes_out);
1127                 bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);
1128                 for (j = 0; j < 16; j++)
1129                         pframe[payload_index++] = chain_buffer[j];
1130         }
1131         if (payload_remainder > 0) {  /* If short final block, then pad it,*/
1132                                       /* encrypt and copy unpadded part back */
1133                 construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1134                                       pframe, pn_vector, num_blocks + 1);
1135                 for (j = 0; j < 16; j++)
1136                         padded_buffer[j] = 0x00;
1137                 for (j = 0; j < payload_remainder; j++)
1138                         padded_buffer[j] = pframe[payload_index + j];
1139                 aes128k128d(key, ctr_preload, aes_out);
1140                 bitwise_xor(aes_out, padded_buffer, chain_buffer);
1141                 for (j = 0; j < payload_remainder; j++)
1142                         pframe[payload_index++] = chain_buffer[j];
1143         }
1144         /* Encrypt the MIC */
1145         construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1146                               pframe, pn_vector, 0);
1147         for (j = 0; j < 16; j++)
1148                 padded_buffer[j] = 0x00;
1149         for (j = 0; j < 8; j++)
1150                 padded_buffer[j] = pframe[j + hdrlen + 8 + plen];
1151         aes128k128d(key, ctr_preload, aes_out);
1152         bitwise_xor(aes_out, padded_buffer, chain_buffer);
1153         for (j = 0; j < 8; j++)
1154                 pframe[payload_index++] = chain_buffer[j];
1155         return _SUCCESS;
1156 }
1157
1158 u32 r8712_aes_encrypt(struct _adapter *padapter, u8 *pxmitframe)
1159 {       /* exclude ICV */
1160         /* Intermediate Buffers */
1161         sint    curfragnum, length;
1162         u8      *pframe, *prwskey;
1163         struct  sta_info *stainfo;
1164         struct  pkt_attrib  *pattrib = &((struct xmit_frame *)
1165                                        pxmitframe)->attrib;
1166         struct  xmit_priv *pxmitpriv = &padapter->xmitpriv;
1167         u32 res = _SUCCESS;
1168
1169         if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL)
1170                 return _FAIL;
1171         pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + TXDESC_OFFSET;
1172         /* 4 start to encrypt each fragment */
1173         if (pattrib->encrypt == _AES_) {
1174                 if (pattrib->psta)
1175                         stainfo = pattrib->psta;
1176                 else
1177                         stainfo = r8712_get_stainfo(&padapter->stapriv,
1178                                   &pattrib->ra[0]);
1179                 if (stainfo != NULL) {
1180                         prwskey = &stainfo->x_UncstKey.skey[0];
1181                         for (curfragnum = 0; curfragnum < pattrib->nr_frags;
1182                              curfragnum++) {
1183                                 if ((curfragnum + 1) == pattrib->nr_frags) {
1184                                         length = pattrib->last_txcmdsz -
1185                                                  pattrib->hdrlen -
1186                                                  pattrib->iv_len -
1187                                                  pattrib->icv_len;
1188                                         aes_cipher(prwskey, pattrib->hdrlen,
1189                                                    pframe, length);
1190                                 } else {
1191                                         length = pxmitpriv->frag_len -
1192                                                  pattrib->hdrlen -
1193                                                  pattrib->iv_len -
1194                                                  pattrib->icv_len;
1195                                         aes_cipher(prwskey, pattrib->hdrlen,
1196                                                    pframe, length);
1197                                         pframe += pxmitpriv->frag_len;
1198                                         pframe = (u8 *)RND4((addr_t)(pframe));
1199                                 }
1200                         }
1201                 } else {
1202                         res = _FAIL;
1203                 }
1204         }
1205         return res;
1206 }
1207
1208 static sint aes_decipher(u8 *key, uint  hdrlen,
1209                         u8 *pframe, uint plen)
1210 {
1211         static u8 message[MAX_MSG_SIZE];
1212         uint qc_exists, a4_exists, i, j, payload_remainder;
1213         uint num_blocks, payload_index;
1214         u8 pn_vector[6];
1215         u8 mic_iv[16];
1216         u8 mic_header1[16];
1217         u8 mic_header2[16];
1218         u8 ctr_preload[16];
1219         /* Intermediate Buffers */
1220         u8 chain_buffer[16];
1221         u8 aes_out[16];
1222         u8 padded_buffer[16];
1223         u8 mic[8];
1224         uint frtype  = GetFrameType(pframe);
1225         uint frsubtype  = GetFrameSubType(pframe);
1226
1227         frsubtype >>= 4;
1228         memset((void *)mic_iv, 0, 16);
1229         memset((void *)mic_header1, 0, 16);
1230         memset((void *)mic_header2, 0, 16);
1231         memset((void *)ctr_preload, 0, 16);
1232         memset((void *)chain_buffer, 0, 16);
1233         memset((void *)aes_out, 0, 16);
1234         memset((void *)padded_buffer, 0, 16);
1235         /* start to decrypt the payload */
1236         /*(plen including llc, payload and mic) */
1237         num_blocks = (plen - 8) / 16;
1238         payload_remainder = (plen - 8) % 16;
1239         pn_vector[0] = pframe[hdrlen];
1240         pn_vector[1] = pframe[hdrlen + 1];
1241         pn_vector[2] = pframe[hdrlen + 4];
1242         pn_vector[3] = pframe[hdrlen + 5];
1243         pn_vector[4] = pframe[hdrlen + 6];
1244         pn_vector[5] = pframe[hdrlen + 7];
1245         if ((hdrlen == WLAN_HDR_A3_LEN) || (hdrlen ==  WLAN_HDR_A3_QOS_LEN))
1246                 a4_exists = 0;
1247         else
1248                 a4_exists = 1;
1249         if ((frtype == WIFI_DATA_CFACK) ||
1250             (frtype == WIFI_DATA_CFPOLL) ||
1251             (frtype == WIFI_DATA_CFACKPOLL)) {
1252                 qc_exists = 1;
1253                 if (hdrlen != WLAN_HDR_A3_QOS_LEN)
1254                         hdrlen += 2;
1255         } else if ((frsubtype == 0x08) ||
1256                    (frsubtype == 0x09) ||
1257                    (frsubtype == 0x0a) ||
1258                    (frsubtype == 0x0b)) {
1259                 if (hdrlen != WLAN_HDR_A3_QOS_LEN)
1260                         hdrlen += 2;
1261                 qc_exists = 1;
1262         } else {
1263                 qc_exists = 0;
1264         }
1265         /* now, decrypt pframe with hdrlen offset and plen long */
1266         payload_index = hdrlen + 8; /* 8 is for extiv */
1267         for (i = 0; i < num_blocks; i++) {
1268                 construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1269                                       pframe, pn_vector, i + 1);
1270                 aes128k128d(key, ctr_preload, aes_out);
1271                 bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);
1272                 for (j = 0; j < 16; j++)
1273                         pframe[payload_index++] = chain_buffer[j];
1274         }
1275         if (payload_remainder > 0) {  /* If short final block, pad it,*/
1276                 /* encrypt it and copy the unpadded part back   */
1277                 construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1278                                       pframe, pn_vector, num_blocks + 1);
1279                 for (j = 0; j < 16; j++)
1280                         padded_buffer[j] = 0x00;
1281                 for (j = 0; j < payload_remainder; j++)
1282                         padded_buffer[j] = pframe[payload_index + j];
1283                 aes128k128d(key, ctr_preload, aes_out);
1284                 bitwise_xor(aes_out, padded_buffer, chain_buffer);
1285                 for (j = 0; j < payload_remainder; j++)
1286                         pframe[payload_index++] = chain_buffer[j];
1287         }
1288         /* start to calculate the mic */
1289         memcpy((void *)message, pframe, (hdrlen + plen + 8));
1290         pn_vector[0] = pframe[hdrlen];
1291         pn_vector[1] = pframe[hdrlen + 1];
1292         pn_vector[2] = pframe[hdrlen + 4];
1293         pn_vector[3] = pframe[hdrlen + 5];
1294         pn_vector[4] = pframe[hdrlen + 6];
1295         pn_vector[5] = pframe[hdrlen + 7];
1296         construct_mic_iv(mic_iv, qc_exists, a4_exists, message, plen - 8,
1297                          pn_vector);
1298         construct_mic_header1(mic_header1, hdrlen, message);
1299         construct_mic_header2(mic_header2, message, a4_exists, qc_exists);
1300         payload_remainder = (plen - 8) % 16;
1301         num_blocks = (plen - 8) / 16;
1302         /* Find start of payload */
1303         payload_index = hdrlen + 8;
1304         /* Calculate MIC */
1305         aes128k128d(key, mic_iv, aes_out);
1306         bitwise_xor(aes_out, mic_header1, chain_buffer);
1307         aes128k128d(key, chain_buffer, aes_out);
1308         bitwise_xor(aes_out, mic_header2, chain_buffer);
1309         aes128k128d(key, chain_buffer, aes_out);
1310         for (i = 0; i < num_blocks; i++) {
1311                 bitwise_xor(aes_out, &message[payload_index], chain_buffer);
1312                 payload_index += 16;
1313                 aes128k128d(key, chain_buffer, aes_out);
1314         }
1315         /* Add on the final payload block if it needs padding */
1316         if (payload_remainder > 0) {
1317                 for (j = 0; j < 16; j++)
1318                         padded_buffer[j] = 0x00;
1319                 for (j = 0; j < payload_remainder; j++)
1320                         padded_buffer[j] = message[payload_index++];
1321                 bitwise_xor(aes_out, padded_buffer, chain_buffer);
1322                 aes128k128d(key, chain_buffer, aes_out);
1323         }
1324         for (j = 0; j < 8; j++)
1325                 mic[j] = aes_out[j];
1326         /* Insert MIC into payload */
1327         for (j = 0; j < 8; j++)
1328                 message[payload_index + j] = mic[j];
1329         payload_index = hdrlen + 8;
1330         for (i = 0; i < num_blocks; i++) {
1331                 construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1332                                       message, pn_vector, i + 1);
1333                 aes128k128d(key, ctr_preload, aes_out);
1334                 bitwise_xor(aes_out, &message[payload_index], chain_buffer);
1335                 for (j = 0; j < 16; j++)
1336                         message[payload_index++] = chain_buffer[j];
1337         }
1338         if (payload_remainder > 0) { /* If short final block, pad it,*/
1339                                      /* encrypt and copy unpadded part back */
1340                 construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1341                                       message, pn_vector, num_blocks + 1);
1342                 for (j = 0; j < 16; j++)
1343                         padded_buffer[j] = 0x00;
1344                 for (j = 0; j < payload_remainder; j++)
1345                         padded_buffer[j] = message[payload_index + j];
1346                 aes128k128d(key, ctr_preload, aes_out);
1347                 bitwise_xor(aes_out, padded_buffer, chain_buffer);
1348                 for (j = 0; j < payload_remainder; j++)
1349                         message[payload_index++] = chain_buffer[j];
1350         }
1351         /* Encrypt the MIC */
1352         construct_ctr_preload(ctr_preload, a4_exists, qc_exists, message,
1353                               pn_vector, 0);
1354         for (j = 0; j < 16; j++)
1355                 padded_buffer[j] = 0x00;
1356         for (j = 0; j < 8; j++)
1357                 padded_buffer[j] = message[j + hdrlen + plen];
1358         aes128k128d(key, ctr_preload, aes_out);
1359         bitwise_xor(aes_out, padded_buffer, chain_buffer);
1360         for (j = 0; j < 8; j++)
1361                 message[payload_index++] = chain_buffer[j];
1362         /* compare the mic */
1363         return _SUCCESS;
1364 }
1365
1366 u32 r8712_aes_decrypt(struct _adapter *padapter, u8 *precvframe)
1367 {       /* exclude ICV */
1368         /* Intermediate Buffers */
1369         sint            length;
1370         u8      *pframe, *prwskey, *iv, idx;
1371         struct  sta_info *stainfo;
1372         struct  rx_pkt_attrib *prxattrib = &((union recv_frame *)
1373                                            precvframe)->u.hdr.attrib;
1374         struct  security_priv *psecuritypriv = &padapter->securitypriv;
1375
1376         pframe = (unsigned char *)((union recv_frame *)precvframe)->
1377                  u.hdr.rx_data;
1378         /* 4 start to encrypt each fragment */
1379         if (prxattrib->encrypt == _AES_) {
1380                 stainfo = r8712_get_stainfo(&padapter->stapriv,
1381                                             &prxattrib->ta[0]);
1382                 if (stainfo != NULL) {
1383                         if (IS_MCAST(prxattrib->ra)) {
1384                                 iv = pframe + prxattrib->hdrlen;
1385                                 idx = iv[3];
1386                                 prwskey = &psecuritypriv->XGrpKey[
1387                                           ((idx >> 6) & 0x3) - 1].skey[0];
1388                                 if (!psecuritypriv->binstallGrpkey)
1389                                         return _FAIL;
1390
1391                         } else {
1392                                 prwskey = &stainfo->x_UncstKey.skey[0];
1393                         }
1394                         length = ((union recv_frame *)precvframe)->
1395                                  u.hdr.len - prxattrib->hdrlen -
1396                                  prxattrib->iv_len;
1397                         aes_decipher(prwskey, prxattrib->hdrlen, pframe,
1398                                      length);
1399                 } else {
1400                         return _FAIL;
1401                 }
1402         }
1403         return _SUCCESS;
1404 }
1405
1406 void r8712_use_tkipkey_handler(struct timer_list *t)
1407 {
1408         struct _adapter *padapter =
1409                 from_timer(padapter, t, securitypriv.tkip_timer);
1410
1411         padapter->securitypriv.busetkipkey = true;
1412 }