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