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