1 /******************************************************************************
2  * rtl871x_security.c
3  *
4  * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5  * Linux device driver for RTL8192SU
6  *
7  * This program is free software; you can redistribute it and/or modify it
8  * under the terms of version 2 of the GNU General Public License as
9  * published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14  * more details.
15  *
16  * You should have received a copy of the GNU General Public License along with
17  * this program; if not, write to the Free Software Foundation, Inc.,
18  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19  *
20  * Modifications for inclusion into the Linux staging tree are
21  * Copyright(c) 2010 Larry Finger. All rights reserved.
22  *
23  * Contact information:
24  * WLAN FAE <wlanfae@realtek.com>
25  * Larry Finger <Larry.Finger@lwfinger.net>
26  *
27  ******************************************************************************/
28 
29 #define  _RTL871X_SECURITY_C_
30 
31 #include <linux/compiler.h>
32 #include <linux/kernel.h>
33 #include <linux/errno.h>
34 #include <linux/slab.h>
35 #include <linux/module.h>
36 #include <linux/kref.h>
37 #include <linux/netdevice.h>
38 #include <linux/skbuff.h>
39 #include <linux/circ_buf.h>
40 #include <linux/uaccess.h>
41 #include <asm/byteorder.h>
42 #include <linux/atomic.h>
43 #include <linux/crc32poly.h>
44 #include <linux/semaphore.h>
45 
46 #include "osdep_service.h"
47 #include "drv_types.h"
48 #include "wifi.h"
49 #include "osdep_intf.h"
50 
51 /* =====WEP related===== */
52 
53 struct arc4context {
54 	u32 x;
55 	u32 y;
56 	u8 state[256];
57 };
58 
arcfour_init(struct arc4context * parc4ctx,u8 * key,u32 key_len)59 static void arcfour_init(struct arc4context *parc4ctx, u8 *key, u32 key_len)
60 {
61 	u32	t, u;
62 	u32	keyindex;
63 	u32	stateindex;
64 	u8 *state;
65 	u32	counter;
66 
67 	state = parc4ctx->state;
68 	parc4ctx->x = 0;
69 	parc4ctx->y = 0;
70 	for (counter = 0; counter < 256; counter++)
71 		state[counter] = (u8)counter;
72 	keyindex = 0;
73 	stateindex = 0;
74 	for (counter = 0; counter < 256; counter++) {
75 		t = state[counter];
76 		stateindex = (stateindex + key[keyindex] + t) & 0xff;
77 		u = state[stateindex];
78 		state[stateindex] = (u8)t;
79 		state[counter] = (u8)u;
80 		if (++keyindex >= key_len)
81 			keyindex = 0;
82 	}
83 }
84 
arcfour_byte(struct arc4context * parc4ctx)85 static u32 arcfour_byte(struct arc4context *parc4ctx)
86 {
87 	u32 x;
88 	u32 y;
89 	u32 sx, sy;
90 	u8 *state;
91 
92 	state = parc4ctx->state;
93 	x = (parc4ctx->x + 1) & 0xff;
94 	sx = state[x];
95 	y = (sx + parc4ctx->y) & 0xff;
96 	sy = state[y];
97 	parc4ctx->x = x;
98 	parc4ctx->y = y;
99 	state[y] = (u8)sx;
100 	state[x] = (u8)sy;
101 	return state[(sx + sy) & 0xff];
102 }
103 
arcfour_encrypt(struct arc4context * parc4ctx,u8 * dest,u8 * src,u32 len)104 static void arcfour_encrypt(struct arc4context	*parc4ctx,
105 		     u8 *dest, u8 *src, u32 len)
106 {
107 	u32 i;
108 
109 	for (i = 0; i < len; i++)
110 		dest[i] = src[i] ^ (unsigned char)arcfour_byte(parc4ctx);
111 }
112 
113 static sint bcrc32initialized;
114 static u32 crc32_table[256];
115 
crc32_reverseBit(u8 data)116 static u8 crc32_reverseBit(u8 data)
117 {
118 	return ((u8)(data << 7) & 0x80) | ((data << 5) & 0x40) | ((data << 3)
119 		 & 0x20) | ((data << 1) & 0x10) | ((data >> 1) & 0x08) |
120 		 ((data >> 3) & 0x04) | ((data >> 5) & 0x02) | ((data >> 7) &
121 		 0x01);
122 }
123 
crc32_init(void)124 static void crc32_init(void)
125 {
126 	sint i, j;
127 	u32 c;
128 	u8 *p = (u8 *)&c, *p1;
129 	u8 k;
130 
131 	if (bcrc32initialized == 1)
132 		return;
133 
134 	for (i = 0; i < 256; ++i) {
135 		k = crc32_reverseBit((u8)i);
136 		for (c = ((u32)k) << 24, j = 8; j > 0; --j)
137 			c = c & 0x80000000 ? (c << 1) ^ CRC32_POLY_BE : (c << 1);
138 		p1 = (u8 *)&crc32_table[i];
139 		p1[0] = crc32_reverseBit(p[3]);
140 		p1[1] = crc32_reverseBit(p[2]);
141 		p1[2] = crc32_reverseBit(p[1]);
142 		p1[3] = crc32_reverseBit(p[0]);
143 	}
144 	bcrc32initialized = 1;
145 }
146 
getcrc32(u8 * buf,u32 len)147 static u32 getcrc32(u8 *buf, u32 len)
148 {
149 	u8 *p;
150 	u32  crc;
151 
152 	if (!bcrc32initialized)
153 		crc32_init();
154 	crc = 0xffffffff; /* preload shift register, per CRC-32 spec */
155 	for (p = buf; len > 0; ++p, --len)
156 		crc = crc32_table[(crc ^ *p) & 0xff] ^ (crc >> 8);
157 	return ~crc;    /* transmit complement, per CRC-32 spec */
158 }
159 
160 /*
161  * Need to consider the fragment situation
162  */
r8712_wep_encrypt(struct _adapter * padapter,u8 * pxmitframe)163 void r8712_wep_encrypt(struct _adapter *padapter, u8 *pxmitframe)
164 {	/* exclude ICV */
165 	unsigned char	crc[4];
166 	struct arc4context  mycontext;
167 	u32 curfragnum, length, keylength, pki;
168 	u8 *pframe, *payload, *iv;    /*,*wepkey*/
169 	u8 wepkey[16];
170 	struct	pkt_attrib  *pattrib = &((struct xmit_frame *)
171 				       pxmitframe)->attrib;
172 	struct	security_priv *psecuritypriv = &padapter->securitypriv;
173 	struct	xmit_priv *pxmitpriv = &padapter->xmitpriv;
174 
175 	if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL)
176 		return;
177 	pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + TXDESC_OFFSET;
178 	/*start to encrypt each fragment*/
179 	if ((pattrib->encrypt == _WEP40_) || (pattrib->encrypt == _WEP104_)) {
180 		pki = psecuritypriv->PrivacyKeyIndex;
181 		keylength = psecuritypriv->DefKeylen[pki];
182 		for (curfragnum = 0; curfragnum < pattrib->nr_frags;
183 		     curfragnum++) {
184 			iv = pframe + pattrib->hdrlen;
185 			memcpy(&wepkey[0], iv, 3);
186 			memcpy(&wepkey[3], &psecuritypriv->DefKey[
187 				psecuritypriv->PrivacyKeyIndex].skey[0],
188 				keylength);
189 			payload = pframe + pattrib->iv_len + pattrib->hdrlen;
190 			if ((curfragnum + 1) == pattrib->nr_frags) {
191 				length = pattrib->last_txcmdsz -
192 					pattrib->hdrlen -
193 					pattrib->iv_len -
194 					pattrib->icv_len;
195 				*((__le32 *)crc) = cpu_to_le32(getcrc32(
196 						payload, length));
197 				arcfour_init(&mycontext, wepkey, 3 + keylength);
198 				arcfour_encrypt(&mycontext, payload, payload,
199 						length);
200 				arcfour_encrypt(&mycontext, payload + length,
201 						crc, 4);
202 			} else {
203 				length = pxmitpriv->frag_len -
204 					 pattrib->hdrlen - pattrib->iv_len -
205 					 pattrib->icv_len;
206 				*((__le32 *)crc) = cpu_to_le32(getcrc32(
207 						payload, length));
208 				arcfour_init(&mycontext, wepkey, 3 + keylength);
209 				arcfour_encrypt(&mycontext, payload, payload,
210 						length);
211 				arcfour_encrypt(&mycontext, payload + length,
212 						crc, 4);
213 				pframe += pxmitpriv->frag_len;
214 				pframe = (u8 *)RND4((addr_t)(pframe));
215 			}
216 		}
217 	}
218 }
219 
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 		*((__le32 *)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,
610 				       &pattrib->ta[0], pnh);
611 				phase2(&rc4key[0], prwskey, (u16 *)&ttkey[0],
612 				       pnl);
613 				if ((curfragnum + 1) == pattrib->nr_frags) {
614 					/* 4 the last fragment */
615 					length = pattrib->last_txcmdsz -
616 					     pattrib->hdrlen -
617 					     pattrib->iv_len -
618 					     pattrib->icv_len;
619 					*((__le32 *)crc) = cpu_to_le32(
620 						getcrc32(payload, length));
621 					arcfour_init(&mycontext, rc4key, 16);
622 					arcfour_encrypt(&mycontext, payload,
623 							payload, length);
624 					arcfour_encrypt(&mycontext, payload +
625 							length, crc, 4);
626 				} else {
627 					length = pxmitpriv->frag_len -
628 						 pattrib->hdrlen -
629 						 pattrib->iv_len -
630 						 pattrib->icv_len;
631 					*((__le32 *)crc) = cpu_to_le32(getcrc32(
632 							payload, length));
633 					arcfour_init(&mycontext, rc4key, 16);
634 					arcfour_encrypt(&mycontext, payload,
635 							 payload, length);
636 					arcfour_encrypt(&mycontext,
637 							payload + length, crc,
638 							4);
639 					pframe += pxmitpriv->frag_len;
640 					pframe = (u8 *)RND4((addr_t)(pframe));
641 				}
642 			}
643 		} else {
644 			res = _FAIL;
645 		}
646 	}
647 	return res;
648 }
649 
650 /* The hlen doesn't include the IV */
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 			*((__le32 *)crc) = cpu_to_le32(getcrc32(payload,
700 					length - 4));
701 			if (crc[3] != payload[length - 1] ||
702 			    crc[2] != payload[length - 2] ||
703 			    crc[1] != payload[length - 3] ||
704 			    crc[0] != payload[length - 4])
705 				return _FAIL;
706 		} else {
707 			return _FAIL;
708 		}
709 	}
710 	return _SUCCESS;
711 }
712 
713 /* 3 =====AES related===== */
714 
715 #define MAX_MSG_SIZE	2048
716 /*****************************/
717 /******** SBOX Table *********/
718 /*****************************/
719 
720 static const u8 sbox_table[256] = {
721 	0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
722 	0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
723 	0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
724 	0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
725 	0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
726 	0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
727 	0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
728 	0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
729 	0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
730 	0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
731 	0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
732 	0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
733 	0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
734 	0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
735 	0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
736 	0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
737 	0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
738 	0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
739 	0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
740 	0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
741 	0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
742 	0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
743 	0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
744 	0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
745 	0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
746 	0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
747 	0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
748 	0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
749 	0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
750 	0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
751 	0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
752 	0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
753 };
754 
755 /****************************************/
756 /* aes128k128d()                        */
757 /* Performs a 128 bit AES encrypt with  */
758 /* 128 bit data.                        */
759 /****************************************/
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_halves[4];
837 	u8 andf7[4];
838 	u8 rotr[4];
839 	u8 temp[4];
840 	u8 tempb[4];
841 
842 	for (i = 0; i < 4; i++) {
843 		if ((in[i] & 0x80) == 0x80)
844 			add1b[i] = 0x1b;
845 		else
846 			add1b[i] = 0x00;
847 	}
848 	swap_halves[0] = in[2];    /* Swap halves */
849 	swap_halves[1] = in[3];
850 	swap_halves[2] = in[0];
851 	swap_halves[3] = in[1];
852 	rotl[0] = in[3];        /* Rotate left 8 bits */
853 	rotl[1] = in[0];
854 	rotl[2] = in[1];
855 	rotl[3] = in[2];
856 	andf7[0] = in[0] & 0x7f;
857 	andf7[1] = in[1] & 0x7f;
858 	andf7[2] = in[2] & 0x7f;
859 	andf7[3] = in[3] & 0x7f;
860 	for (i = 3; i > 0; i--) {   /* logical shift left 1 bit */
861 		andf7[i] = andf7[i] << 1;
862 		if ((andf7[i - 1] & 0x80) == 0x80)
863 			andf7[i] = (andf7[i] | 0x01);
864 	}
865 	andf7[0] = andf7[0] << 1;
866 	andf7[0] = andf7[0] & 0xfe;
867 	xor_32(add1b, andf7, add1bf7);
868 	xor_32(in, add1bf7, rotr);
869 	temp[0] = rotr[0];         /* Rotate right 8 bits */
870 	rotr[0] = rotr[1];
871 	rotr[1] = rotr[2];
872 	rotr[2] = rotr[3];
873 	rotr[3] = temp[0];
874 	xor_32(add1bf7, rotr, temp);
875 	xor_32(swap_halves, rotl, tempb);
876 	xor_32(temp, tempb, out);
877 }
878 
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,
1001 				  sint a4_exists, sint qc_exists,
1002 				  u8 *mpdu, u8 *pn_vector, sint c)
1003 {
1004 	sint i;
1005 
1006 	for (i = 0; i < 16; i++)
1007 		ctr_preload[i] = 0x00;
1008 	i = 0;
1009 	ctr_preload[0] = 0x01;    /* flag */
1010 	if (qc_exists && a4_exists)
1011 		ctr_preload[1] = mpdu[30] & 0x0f;
1012 	if (qc_exists && !a4_exists)
1013 		ctr_preload[1] = mpdu[24] & 0x0f;
1014 	for (i = 2; i < 8; i++)
1015 		ctr_preload[i] = mpdu[i + 8];
1016 	for (i = 8; i < 14; i++)
1017 		ctr_preload[i] = pn_vector[13 - i];
1018 	ctr_preload[14] = (unsigned char) (c / 256); /* Ctr */
1019 	ctr_preload[15] = (unsigned char) (c % 256);
1020 }
1021 
1022 /************************************/
1023 /* bitwise_xor()                    */
1024 /* A 128 bit, bitwise exclusive or  */
1025 /************************************/
bitwise_xor(u8 * ina,u8 * inb,u8 * out)1026 static void bitwise_xor(u8 *ina, u8 *inb, u8 *out)
1027 {
1028 	sint i;
1029 
1030 	for (i = 0; i < 16; i++)
1031 		out[i] = ina[i] ^ inb[i];
1032 }
1033 
aes_cipher(u8 * key,uint hdrlen,u8 * pframe,uint plen)1034 static sint aes_cipher(u8 *key, uint	hdrlen,
1035 			u8 *pframe, uint plen)
1036 {
1037 	uint qc_exists, a4_exists, i, j, payload_remainder;
1038 	uint num_blocks, payload_index;
1039 
1040 	u8 pn_vector[6];
1041 	u8 mic_iv[16];
1042 	u8 mic_header1[16];
1043 	u8 mic_header2[16];
1044 	u8 ctr_preload[16];
1045 
1046 	/* Intermediate Buffers */
1047 	u8 chain_buffer[16];
1048 	u8 aes_out[16];
1049 	u8 padded_buffer[16];
1050 	u8 mic[8];
1051 	u16 frtype  = GetFrameType(pframe);
1052 	u16 frsubtype  = GetFrameSubType(pframe);
1053 
1054 	frsubtype >>= 4;
1055 	memset((void *)mic_iv, 0, 16);
1056 	memset((void *)mic_header1, 0, 16);
1057 	memset((void *)mic_header2, 0, 16);
1058 	memset((void *)ctr_preload, 0, 16);
1059 	memset((void *)chain_buffer, 0, 16);
1060 	memset((void *)aes_out, 0, 16);
1061 	memset((void *)padded_buffer, 0, 16);
1062 
1063 	if ((hdrlen == WLAN_HDR_A3_LEN) || (hdrlen ==  WLAN_HDR_A3_QOS_LEN))
1064 		a4_exists = 0;
1065 	else
1066 		a4_exists = 1;
1067 
1068 	if ((frtype == WIFI_DATA_CFACK) ||
1069 	     (frtype == WIFI_DATA_CFPOLL) ||
1070 	     (frtype == WIFI_DATA_CFACKPOLL)) {
1071 		qc_exists = 1;
1072 		if (hdrlen !=  WLAN_HDR_A3_QOS_LEN)
1073 			hdrlen += 2;
1074 	} else if ((frsubtype == 0x08) ||
1075 		   (frsubtype == 0x09) ||
1076 		   (frsubtype == 0x0a) ||
1077 		   (frsubtype == 0x0b)) {
1078 		if (hdrlen !=  WLAN_HDR_A3_QOS_LEN)
1079 			hdrlen += 2;
1080 		qc_exists = 1;
1081 	} else {
1082 		qc_exists = 0;
1083 	}
1084 	pn_vector[0] = pframe[hdrlen];
1085 	pn_vector[1] = pframe[hdrlen + 1];
1086 	pn_vector[2] = pframe[hdrlen + 4];
1087 	pn_vector[3] = pframe[hdrlen + 5];
1088 	pn_vector[4] = pframe[hdrlen + 6];
1089 	pn_vector[5] = pframe[hdrlen + 7];
1090 	construct_mic_iv(mic_iv, qc_exists, a4_exists, pframe, plen, pn_vector);
1091 	construct_mic_header1(mic_header1, hdrlen, pframe);
1092 	construct_mic_header2(mic_header2, pframe, a4_exists, qc_exists);
1093 	payload_remainder = plen % 16;
1094 	num_blocks = plen / 16;
1095 	/* Find start of payload */
1096 	payload_index = hdrlen + 8;
1097 	/* Calculate MIC */
1098 	aes128k128d(key, mic_iv, aes_out);
1099 	bitwise_xor(aes_out, mic_header1, chain_buffer);
1100 	aes128k128d(key, chain_buffer, aes_out);
1101 	bitwise_xor(aes_out, mic_header2, chain_buffer);
1102 	aes128k128d(key, chain_buffer, aes_out);
1103 	for (i = 0; i < num_blocks; i++) {
1104 		bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);
1105 		payload_index += 16;
1106 		aes128k128d(key, chain_buffer, aes_out);
1107 	}
1108 	/* Add on the final payload block if it needs padding */
1109 	if (payload_remainder > 0) {
1110 		for (j = 0; j < 16; j++)
1111 			padded_buffer[j] = 0x00;
1112 		for (j = 0; j < payload_remainder; j++)
1113 			padded_buffer[j] = pframe[payload_index++];
1114 		bitwise_xor(aes_out, padded_buffer, chain_buffer);
1115 		aes128k128d(key, chain_buffer, aes_out);
1116 	}
1117 	for (j = 0; j < 8; j++)
1118 		mic[j] = aes_out[j];
1119 	/* Insert MIC into payload */
1120 	for (j = 0; j < 8; j++)
1121 		pframe[payload_index + j] = mic[j];
1122 	payload_index = hdrlen + 8;
1123 	for (i = 0; i < num_blocks; i++) {
1124 		construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1125 				      pframe, pn_vector, i + 1);
1126 		aes128k128d(key, ctr_preload, aes_out);
1127 		bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);
1128 		for (j = 0; j < 16; j++)
1129 			pframe[payload_index++] = chain_buffer[j];
1130 	}
1131 	if (payload_remainder > 0) {  /* If short final block, then pad it,*/
1132 				      /* encrypt and copy unpadded part back */
1133 		construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1134 				      pframe, pn_vector, num_blocks + 1);
1135 		for (j = 0; j < 16; j++)
1136 			padded_buffer[j] = 0x00;
1137 		for (j = 0; j < payload_remainder; j++)
1138 			padded_buffer[j] = pframe[payload_index + j];
1139 		aes128k128d(key, ctr_preload, aes_out);
1140 		bitwise_xor(aes_out, padded_buffer, chain_buffer);
1141 		for (j = 0; j < payload_remainder; j++)
1142 			pframe[payload_index++] = chain_buffer[j];
1143 	}
1144 	/* Encrypt the MIC */
1145 	construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1146 			      pframe, pn_vector, 0);
1147 	for (j = 0; j < 16; j++)
1148 		padded_buffer[j] = 0x00;
1149 	for (j = 0; j < 8; j++)
1150 		padded_buffer[j] = pframe[j + hdrlen + 8 + plen];
1151 	aes128k128d(key, ctr_preload, aes_out);
1152 	bitwise_xor(aes_out, padded_buffer, chain_buffer);
1153 	for (j = 0; j < 8; j++)
1154 		pframe[payload_index++] = chain_buffer[j];
1155 	return _SUCCESS;
1156 }
1157 
r8712_aes_encrypt(struct _adapter * padapter,u8 * pxmitframe)1158 u32 r8712_aes_encrypt(struct _adapter *padapter, u8 *pxmitframe)
1159 {	/* exclude ICV */
1160 	/* Intermediate Buffers */
1161 	sint	curfragnum, length;
1162 	u8	*pframe, *prwskey;
1163 	struct	sta_info *stainfo;
1164 	struct	pkt_attrib  *pattrib = &((struct xmit_frame *)
1165 				       pxmitframe)->attrib;
1166 	struct	xmit_priv *pxmitpriv = &padapter->xmitpriv;
1167 	u32 res = _SUCCESS;
1168 
1169 	if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL)
1170 		return _FAIL;
1171 	pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + TXDESC_OFFSET;
1172 	/* 4 start to encrypt each fragment */
1173 	if (pattrib->encrypt == _AES_) {
1174 		if (pattrib->psta)
1175 			stainfo = pattrib->psta;
1176 		else
1177 			stainfo = r8712_get_stainfo(&padapter->stapriv,
1178 				  &pattrib->ra[0]);
1179 		if (stainfo != NULL) {
1180 			prwskey = &stainfo->x_UncstKey.skey[0];
1181 			for (curfragnum = 0; curfragnum < pattrib->nr_frags;
1182 			     curfragnum++) {
1183 				if ((curfragnum + 1) == pattrib->nr_frags) {
1184 					length = pattrib->last_txcmdsz -
1185 						 pattrib->hdrlen -
1186 						 pattrib->iv_len -
1187 						 pattrib->icv_len;
1188 					aes_cipher(prwskey, pattrib->hdrlen,
1189 						   pframe, length);
1190 				} else {
1191 					length = pxmitpriv->frag_len -
1192 						 pattrib->hdrlen -
1193 						 pattrib->iv_len -
1194 						 pattrib->icv_len;
1195 					aes_cipher(prwskey, pattrib->hdrlen,
1196 						   pframe, length);
1197 					pframe += pxmitpriv->frag_len;
1198 					pframe = (u8 *)RND4((addr_t)(pframe));
1199 				}
1200 			}
1201 		} else {
1202 			res = _FAIL;
1203 		}
1204 	}
1205 	return res;
1206 }
1207 
aes_decipher(u8 * key,uint hdrlen,u8 * pframe,uint plen)1208 static sint aes_decipher(u8 *key, uint	hdrlen,
1209 			u8 *pframe, uint plen)
1210 {
1211 	static u8 message[MAX_MSG_SIZE];
1212 	uint qc_exists, a4_exists, i, j, payload_remainder;
1213 	uint num_blocks, payload_index;
1214 	u8 pn_vector[6];
1215 	u8 mic_iv[16];
1216 	u8 mic_header1[16];
1217 	u8 mic_header2[16];
1218 	u8 ctr_preload[16];
1219 	/* Intermediate Buffers */
1220 	u8 chain_buffer[16];
1221 	u8 aes_out[16];
1222 	u8 padded_buffer[16];
1223 	u8 mic[8];
1224 	uint frtype  = GetFrameType(pframe);
1225 	uint frsubtype  = GetFrameSubType(pframe);
1226 
1227 	frsubtype >>= 4;
1228 	memset((void *)mic_iv, 0, 16);
1229 	memset((void *)mic_header1, 0, 16);
1230 	memset((void *)mic_header2, 0, 16);
1231 	memset((void *)ctr_preload, 0, 16);
1232 	memset((void *)chain_buffer, 0, 16);
1233 	memset((void *)aes_out, 0, 16);
1234 	memset((void *)padded_buffer, 0, 16);
1235 	/* start to decrypt the payload */
1236 	/*(plen including llc, payload and mic) */
1237 	num_blocks = (plen - 8) / 16;
1238 	payload_remainder = (plen - 8) % 16;
1239 	pn_vector[0] = pframe[hdrlen];
1240 	pn_vector[1] = pframe[hdrlen + 1];
1241 	pn_vector[2] = pframe[hdrlen + 4];
1242 	pn_vector[3] = pframe[hdrlen + 5];
1243 	pn_vector[4] = pframe[hdrlen + 6];
1244 	pn_vector[5] = pframe[hdrlen + 7];
1245 	if ((hdrlen == WLAN_HDR_A3_LEN) || (hdrlen ==  WLAN_HDR_A3_QOS_LEN))
1246 		a4_exists = 0;
1247 	else
1248 		a4_exists = 1;
1249 	if ((frtype == WIFI_DATA_CFACK) ||
1250 	    (frtype == WIFI_DATA_CFPOLL) ||
1251 	    (frtype == WIFI_DATA_CFACKPOLL)) {
1252 		qc_exists = 1;
1253 		if (hdrlen != WLAN_HDR_A3_QOS_LEN)
1254 			hdrlen += 2;
1255 	} else if ((frsubtype == 0x08) ||
1256 		   (frsubtype == 0x09) ||
1257 		   (frsubtype == 0x0a) ||
1258 		   (frsubtype == 0x0b)) {
1259 		if (hdrlen != WLAN_HDR_A3_QOS_LEN)
1260 			hdrlen += 2;
1261 		qc_exists = 1;
1262 	} else {
1263 		qc_exists = 0;
1264 	}
1265 	/* now, decrypt pframe with hdrlen offset and plen long */
1266 	payload_index = hdrlen + 8; /* 8 is for extiv */
1267 	for (i = 0; i < num_blocks; i++) {
1268 		construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1269 				      pframe, pn_vector, i + 1);
1270 		aes128k128d(key, ctr_preload, aes_out);
1271 		bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);
1272 		for (j = 0; j < 16; j++)
1273 			pframe[payload_index++] = chain_buffer[j];
1274 	}
1275 	if (payload_remainder > 0) {  /* If short final block, pad it,*/
1276 		/* encrypt it and copy the unpadded part back   */
1277 		construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1278 				      pframe, pn_vector, num_blocks + 1);
1279 		for (j = 0; j < 16; j++)
1280 			padded_buffer[j] = 0x00;
1281 		for (j = 0; j < payload_remainder; j++)
1282 			padded_buffer[j] = pframe[payload_index + j];
1283 		aes128k128d(key, ctr_preload, aes_out);
1284 		bitwise_xor(aes_out, padded_buffer, chain_buffer);
1285 		for (j = 0; j < payload_remainder; j++)
1286 			pframe[payload_index++] = chain_buffer[j];
1287 	}
1288 	/* start to calculate the mic */
1289 	memcpy((void *)message, pframe, (hdrlen + plen + 8));
1290 	pn_vector[0] = pframe[hdrlen];
1291 	pn_vector[1] = pframe[hdrlen + 1];
1292 	pn_vector[2] = pframe[hdrlen + 4];
1293 	pn_vector[3] = pframe[hdrlen + 5];
1294 	pn_vector[4] = pframe[hdrlen + 6];
1295 	pn_vector[5] = pframe[hdrlen + 7];
1296 	construct_mic_iv(mic_iv, qc_exists, a4_exists, message, plen - 8,
1297 			 pn_vector);
1298 	construct_mic_header1(mic_header1, hdrlen, message);
1299 	construct_mic_header2(mic_header2, message, a4_exists, qc_exists);
1300 	payload_remainder = (plen - 8) % 16;
1301 	num_blocks = (plen - 8) / 16;
1302 	/* Find start of payload */
1303 	payload_index = hdrlen + 8;
1304 	/* Calculate MIC */
1305 	aes128k128d(key, mic_iv, aes_out);
1306 	bitwise_xor(aes_out, mic_header1, chain_buffer);
1307 	aes128k128d(key, chain_buffer, aes_out);
1308 	bitwise_xor(aes_out, mic_header2, chain_buffer);
1309 	aes128k128d(key, chain_buffer, aes_out);
1310 	for (i = 0; i < num_blocks; i++) {
1311 		bitwise_xor(aes_out, &message[payload_index], chain_buffer);
1312 		payload_index += 16;
1313 		aes128k128d(key, chain_buffer, aes_out);
1314 	}
1315 	/* Add on the final payload block if it needs padding */
1316 	if (payload_remainder > 0) {
1317 		for (j = 0; j < 16; j++)
1318 			padded_buffer[j] = 0x00;
1319 		for (j = 0; j < payload_remainder; j++)
1320 			padded_buffer[j] = message[payload_index++];
1321 		bitwise_xor(aes_out, padded_buffer, chain_buffer);
1322 		aes128k128d(key, chain_buffer, aes_out);
1323 	}
1324 	for (j = 0; j < 8; j++)
1325 		mic[j] = aes_out[j];
1326 	/* Insert MIC into payload */
1327 	for (j = 0; j < 8; j++)
1328 		message[payload_index + j] = mic[j];
1329 	payload_index = hdrlen + 8;
1330 	for (i = 0; i < num_blocks; i++) {
1331 		construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1332 				      message, pn_vector, i + 1);
1333 		aes128k128d(key, ctr_preload, aes_out);
1334 		bitwise_xor(aes_out, &message[payload_index], chain_buffer);
1335 		for (j = 0; j < 16; j++)
1336 			message[payload_index++] = chain_buffer[j];
1337 	}
1338 	if (payload_remainder > 0) { /* If short final block, pad it,*/
1339 				     /* encrypt and copy unpadded part back */
1340 		construct_ctr_preload(ctr_preload, a4_exists, qc_exists,
1341 				      message, pn_vector, num_blocks + 1);
1342 		for (j = 0; j < 16; j++)
1343 			padded_buffer[j] = 0x00;
1344 		for (j = 0; j < payload_remainder; j++)
1345 			padded_buffer[j] = message[payload_index + j];
1346 		aes128k128d(key, ctr_preload, aes_out);
1347 		bitwise_xor(aes_out, padded_buffer, chain_buffer);
1348 		for (j = 0; j < payload_remainder; j++)
1349 			message[payload_index++] = chain_buffer[j];
1350 	}
1351 	/* Encrypt the MIC */
1352 	construct_ctr_preload(ctr_preload, a4_exists, qc_exists, message,
1353 			      pn_vector, 0);
1354 	for (j = 0; j < 16; j++)
1355 		padded_buffer[j] = 0x00;
1356 	for (j = 0; j < 8; j++)
1357 		padded_buffer[j] = message[j + hdrlen + plen];
1358 	aes128k128d(key, ctr_preload, aes_out);
1359 	bitwise_xor(aes_out, padded_buffer, chain_buffer);
1360 	for (j = 0; j < 8; j++)
1361 		message[payload_index++] = chain_buffer[j];
1362 	/* compare the mic */
1363 	return _SUCCESS;
1364 }
1365 
r8712_aes_decrypt(struct _adapter * padapter,u8 * precvframe)1366 u32 r8712_aes_decrypt(struct _adapter *padapter, u8 *precvframe)
1367 {	/* exclude ICV */
1368 	/* Intermediate Buffers */
1369 	sint		length;
1370 	u8	*pframe, *prwskey, *iv, idx;
1371 	struct	sta_info *stainfo;
1372 	struct	rx_pkt_attrib *prxattrib = &((union recv_frame *)
1373 					   precvframe)->u.hdr.attrib;
1374 	struct	security_priv *psecuritypriv = &padapter->securitypriv;
1375 
1376 	pframe = (unsigned char *)((union recv_frame *)precvframe)->
1377 		 u.hdr.rx_data;
1378 	/* 4 start to encrypt each fragment */
1379 	if (prxattrib->encrypt == _AES_) {
1380 		stainfo = r8712_get_stainfo(&padapter->stapriv,
1381 					    &prxattrib->ta[0]);
1382 		if (stainfo != NULL) {
1383 			if (IS_MCAST(prxattrib->ra)) {
1384 				iv = pframe + prxattrib->hdrlen;
1385 				idx = iv[3];
1386 				prwskey = &psecuritypriv->XGrpKey[
1387 					  ((idx >> 6) & 0x3) - 1].skey[0];
1388 				if (!psecuritypriv->binstallGrpkey)
1389 					return _FAIL;
1390 
1391 			} else {
1392 				prwskey = &stainfo->x_UncstKey.skey[0];
1393 			}
1394 			length = ((union recv_frame *)precvframe)->
1395 				 u.hdr.len - prxattrib->hdrlen -
1396 				 prxattrib->iv_len;
1397 			aes_decipher(prwskey, prxattrib->hdrlen, pframe,
1398 				     length);
1399 		} else {
1400 			return _FAIL;
1401 		}
1402 	}
1403 	return _SUCCESS;
1404 }
1405 
r8712_use_tkipkey_handler(struct timer_list * t)1406 void r8712_use_tkipkey_handler(struct timer_list *t)
1407 {
1408 	struct _adapter *padapter =
1409 		from_timer(padapter, t, securitypriv.tkip_timer);
1410 
1411 	padapter->securitypriv.busetkipkey = true;
1412 }
1413