Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
rtl871x_security.c
Go to the documentation of this file.
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 <[email protected]>
25  * Larry Finger <[email protected]>
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 */
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 
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 }