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