rtl871x_security.c 44 KB

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