Merge tag 'v4.4-rc5'
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723bs / core / rtw_wapi_sms4.c
1 #ifdef CONFIG_WAPI_SUPPORT\r
2 \r
3 #include <linux/unistd.h>\r
4 #include <linux/etherdevice.h>\r
5 #include <drv_types.h>\r
6 #include <rtw_wapi.h>\r
7 \r
8 \r
9 #ifdef CONFIG_WAPI_SW_SMS4\r
10 \r
11 #define WAPI_LITTLE_ENDIAN\r
12 //#define BIG_ENDIAN\r
13 #define ENCRYPT  0\r
14 #define DECRYPT  1\r
15 \r
16 \r
17 /**********************************************************\r
18  **********************************************************/\r
19 const u8 Sbox[256] = {\r
20 0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05,\r
21 0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99,\r
22 0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62,\r
23 0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6,\r
24 0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8,\r
25 0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35,\r
26 0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87,\r
27 0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e,\r
28 0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1,\r
29 0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3,\r
30 0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f,\r
31 0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51,\r
32 0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8,\r
33 0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0,\r
34 0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84,\r
35 0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48\r
36 };\r
37 \r
38 const u32 CK[32] = {\r
39         0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,\r
40         0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,\r
41         0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,\r
42         0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,\r
43         0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229,\r
44         0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299,\r
45         0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209,\r
46         0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 };\r
47 \r
48 #define Rotl(_x, _y) (((_x) << (_y)) | ((_x) >> (32 - (_y))))\r
49 \r
50 #define ByteSub(_A) (Sbox[(_A) >> 24 & 0xFF] << 24 | \\r
51                      Sbox[(_A) >> 16 & 0xFF] << 16 | \\r
52                      Sbox[(_A) >>  8 & 0xFF] <<  8 | \\r
53                      Sbox[(_A) & 0xFF])\r
54 \r
55 #define L1(_B) ((_B) ^ Rotl(_B, 2) ^ Rotl(_B, 10) ^ Rotl(_B, 18) ^ Rotl(_B, 24))\r
56 #define L2(_B) ((_B) ^ Rotl(_B, 13) ^ Rotl(_B, 23))\r
57 \r
58 static void\r
59 xor_block(void *dst, void *src1, void *src2)\r
60 /* 128-bit xor: *dst = *src1 xor *src2. Pointers must be 32-bit aligned  */\r
61 {\r
62     ((u32 *)dst)[0] = ((u32 *)src1)[0] ^ ((u32 *)src2)[0];\r
63     ((u32 *)dst)[1] = ((u32 *)src1)[1] ^ ((u32 *)src2)[1];\r
64     ((u32 *)dst)[2] = ((u32 *)src1)[2] ^ ((u32 *)src2)[2];\r
65     ((u32 *)dst)[3] = ((u32 *)src1)[3] ^ ((u32 *)src2)[3];\r
66 }\r
67 \r
68 \r
69 void SMS4Crypt(u8 *Input, u8 *Output, u32 *rk)\r
70 {\r
71          u32 r, mid, x0, x1, x2, x3, *p;\r
72          p = (u32 *)Input;\r
73          x0 = p[0];\r
74          x1 = p[1];\r
75          x2 = p[2];\r
76          x3 = p[3];\r
77 #ifdef WAPI_LITTLE_ENDIAN\r
78          x0 = Rotl(x0, 16); x0 = ((x0 & 0x00FF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8);\r
79          x1 = Rotl(x1, 16); x1 = ((x1 & 0x00FF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8);\r
80          x2 = Rotl(x2, 16); x2 = ((x2 & 0x00FF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8);\r
81          x3 = Rotl(x3, 16); x3 = ((x3 & 0x00FF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8);\r
82 #endif\r
83          for (r = 0; r < 32; r += 4)\r
84          {\r
85                   mid = x1 ^ x2 ^ x3 ^ rk[r + 0];\r
86                   mid = ByteSub(mid);\r
87                   x0 ^= L1(mid);\r
88                   mid = x2 ^ x3 ^ x0 ^ rk[r + 1];\r
89                   mid = ByteSub(mid);\r
90                   x1 ^= L1(mid);\r
91                   mid = x3 ^ x0 ^ x1 ^ rk[r + 2];\r
92                   mid = ByteSub(mid);\r
93                   x2 ^= L1(mid);\r
94                   mid = x0 ^ x1 ^ x2 ^ rk[r + 3];\r
95                   mid = ByteSub(mid);\r
96                   x3 ^= L1(mid);\r
97          }\r
98 #ifdef WAPI_LITTLE_ENDIAN\r
99          x0 = Rotl(x0, 16); x0 = ((x0 & 0x00FF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8);\r
100          x1 = Rotl(x1, 16); x1 = ((x1 & 0x00FF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8);\r
101          x2 = Rotl(x2, 16); x2 = ((x2 & 0x00FF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8);\r
102          x3 = Rotl(x3, 16); x3 = ((x3 & 0x00FF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8);\r
103 #endif\r
104          p = (u32 *)Output;\r
105          p[0] = x3;\r
106          p[1] = x2;\r
107          p[2] = x1;\r
108          p[3] = x0;\r
109 }\r
110 \r
111 \r
112 \r
113 void SMS4KeyExt(u8 *Key, u32 *rk, u32 CryptFlag)\r
114 {\r
115          u32 r, mid, x0, x1, x2, x3, *p;\r
116 \r
117          p = (u32 *)Key;\r
118          x0 = p[0];\r
119          x1 = p[1];\r
120          x2 = p[2];\r
121          x3 = p[3];\r
122 #ifdef WAPI_LITTLE_ENDIAN\r
123          x0 = Rotl(x0, 16); x0 = ((x0 & 0xFF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8);\r
124          x1 = Rotl(x1, 16); x1 = ((x1 & 0xFF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8);\r
125          x2 = Rotl(x2, 16); x2 = ((x2 & 0xFF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8);\r
126          x3 = Rotl(x3, 16); x3 = ((x3 & 0xFF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8);\r
127 #endif\r
128 \r
129          x0 ^= 0xa3b1bac6;\r
130          x1 ^= 0x56aa3350;\r
131          x2 ^= 0x677d9197;\r
132          x3 ^= 0xb27022dc;\r
133          for (r = 0; r < 32; r += 4)\r
134          {\r
135                   mid = x1 ^ x2 ^ x3 ^ CK[r + 0];\r
136                   mid = ByteSub(mid);\r
137                   rk[r + 0] = x0 ^= L2(mid);\r
138                   mid = x2 ^ x3 ^ x0 ^ CK[r + 1];\r
139                   mid = ByteSub(mid);\r
140                   rk[r + 1] = x1 ^= L2(mid);\r
141                   mid = x3 ^ x0 ^ x1 ^ CK[r + 2];\r
142                   mid = ByteSub(mid);\r
143                   rk[r + 2] = x2 ^= L2(mid);\r
144                   mid = x0 ^ x1 ^ x2 ^ CK[r + 3];\r
145                   mid = ByteSub(mid);\r
146                   rk[r + 3] = x3 ^= L2(mid);\r
147          }\r
148          if (CryptFlag == DECRYPT)\r
149          {\r
150                   for (r = 0; r < 16; r++)\r
151                          mid = rk[r], rk[r] = rk[31 - r], rk[31 - r] = mid;\r
152          }\r
153 }\r
154 \r
155 \r
156 void WapiSMS4Cryption(u8 *Key, u8 *IV, u8 *Input, u16 InputLength,\r
157                                                 u8 *Output, u16 *OutputLength, u32 CryptFlag)\r
158 {\r
159         u32 blockNum,i,j, rk[32];\r
160         u16 remainder;\r
161         u8 blockIn[16],blockOut[16], tempIV[16], k;\r
162 \r
163         *OutputLength = 0;\r
164         remainder = InputLength & 0x0F;\r
165         blockNum = InputLength >> 4;\r
166         if(remainder !=0)\r
167                 blockNum++;\r
168         else\r
169                 remainder = 16;\r
170 \r
171         for(k=0;k<16;k++)\r
172                 tempIV[k] = IV[15-k];\r
173 \r
174         memcpy(blockIn, tempIV, 16);\r
175 \r
176       SMS4KeyExt((u8 *)Key, rk,CryptFlag);\r
177 \r
178         for(i=0; i<blockNum-1; i++)\r
179         {\r
180                 SMS4Crypt((u8 *)blockIn, blockOut, rk);\r
181              xor_block(&Output[i*16], &Input[i*16], blockOut);\r
182                 memcpy(blockIn,blockOut,16);\r
183         }\r
184 \r
185         *OutputLength = i*16;\r
186 \r
187         SMS4Crypt((u8 *)blockIn, blockOut, rk);\r
188 \r
189         for(j=0; j<remainder; j++)\r
190         {\r
191                 Output[i*16+j] = Input[i*16+j] ^ blockOut[j];\r
192         }\r
193       *OutputLength += remainder;\r
194 \r
195 }\r
196 \r
197 void WapiSMS4Encryption(u8 *Key, u8 *IV, u8 *Input, u16 InputLength,\r
198                                                     u8 *Output, u16 *OutputLength)\r
199 {\r
200 \r
201         WapiSMS4Cryption(Key, IV, Input, InputLength, Output, OutputLength, ENCRYPT);\r
202 }\r
203 \r
204 void WapiSMS4Decryption(u8 *Key, u8 *IV, u8 *Input, u16 InputLength,\r
205                                                     u8 *Output, u16 *OutputLength)\r
206 {\r
207         // OFB mode: is also ENCRYPT flag\r
208         WapiSMS4Cryption(Key, IV, Input, InputLength, Output, OutputLength, ENCRYPT);\r
209 }\r
210 \r
211 void WapiSMS4CalculateMic(u8 *Key, u8 *IV, u8 *Input1, u8 Input1Length,\r
212                                                  u8 *Input2, u16 Input2Length, u8 *Output, u8 *OutputLength)\r
213 {\r
214         u32 blockNum, i, remainder, rk[32];\r
215         u8 BlockIn[16], BlockOut[16], TempBlock[16], tempIV[16], k;\r
216 \r
217         *OutputLength = 0;\r
218         remainder = Input1Length & 0x0F;\r
219         blockNum = Input1Length >> 4;\r
220 \r
221         for(k=0;k<16;k++)\r
222                 tempIV[k] = IV[15-k];\r
223 \r
224         memcpy(BlockIn, tempIV, 16);\r
225 \r
226         SMS4KeyExt((u8 *)Key, rk, ENCRYPT);\r
227 \r
228         SMS4Crypt((u8 *)BlockIn, BlockOut, rk);\r
229 \r
230         for(i=0; i<blockNum; i++){\r
231                 xor_block(BlockIn, (Input1+i*16), BlockOut);\r
232                 SMS4Crypt((u8 *)BlockIn, BlockOut, rk);\r
233         }\r
234 \r
235         if(remainder !=0){\r
236                 memset(TempBlock, 0, 16);\r
237                 memcpy(TempBlock, (Input1+blockNum*16), remainder);\r
238 \r
239                 xor_block(BlockIn, TempBlock, BlockOut);\r
240                 SMS4Crypt((u8 *)BlockIn, BlockOut, rk);\r
241       }\r
242 \r
243         remainder = Input2Length & 0x0F;\r
244         blockNum = Input2Length >> 4;\r
245 \r
246         for(i=0; i<blockNum; i++){\r
247                 xor_block(BlockIn, (Input2+i*16), BlockOut);\r
248                 SMS4Crypt((u8 *)BlockIn, BlockOut, rk);\r
249         }\r
250 \r
251         if(remainder !=0){\r
252                 memset(TempBlock, 0, 16);\r
253                 memcpy(TempBlock, (Input2+blockNum*16), remainder);\r
254 \r
255                 xor_block(BlockIn, TempBlock, BlockOut);\r
256                 SMS4Crypt((u8 *)BlockIn, BlockOut, rk);\r
257         }\r
258 \r
259         memcpy(Output, BlockOut, 16);\r
260         *OutputLength = 16;\r
261 }\r
262 \r
263 void SecCalculateMicSMS4(\r
264         u8              KeyIdx,\r
265         u8        *MicKey,\r
266         u8        *pHeader,\r
267         u8        *pData,\r
268         u16       DataLen,\r
269         u8        *MicBuffer\r
270         )\r
271 {\r
272 #if 0\r
273         struct ieee80211_hdr_3addr_qos *header;\r
274         u8 TempBuf[34], TempLen = 32, MicLen, QosOffset, *IV;\r
275         u16 *pTemp, fc;\r
276 \r
277         WAPI_TRACE(WAPI_TX|WAPI_RX, "=========>%s\n", __FUNCTION__);\r
278 \r
279         header = (struct ieee80211_hdr_3addr_qos *)pHeader;\r
280         memset(TempBuf, 0, 34);\r
281         memcpy(TempBuf, pHeader, 2); //FrameCtrl\r
282         pTemp = (u16*)TempBuf;\r
283         *pTemp &= 0xc78f;       //bit4,5,6,11,12,13\r
284 \r
285         memcpy((TempBuf+2), (pHeader+4), 12); //Addr1, Addr2\r
286         memcpy((TempBuf+14), (pHeader+22), 2); // SeqCtrl\r
287         pTemp = (u16*)(TempBuf + 14);\r
288         *pTemp &= 0x000f;\r
289 \r
290         memcpy((TempBuf+16), (pHeader+16), 6); //Addr3\r
291 \r
292         fc = le16_to_cpu(header->frame_ctl);\r
293 \r
294 \r
295 \r
296         if (GetFrDs((u16*)&fc) && GetToDs((u16 *)&fc))\r
297         {\r
298                 memcpy((TempBuf+22), (pHeader+24), 6);\r
299                 QosOffset = 30;\r
300         }else{\r
301                 memset((TempBuf+22), 0, 6);\r
302                 QosOffset = 24;\r
303         }\r
304 \r
305         if((fc & 0x0088) == 0x0088){\r
306                 memcpy((TempBuf+28), (pHeader+QosOffset), 2);\r
307                 TempLen += 2;\r
308                 //IV = pHeader + QosOffset + 2 + SNAP_SIZE + sizeof(u16) + 2;\r
309                 IV = pHeader + QosOffset + 2 + 2;\r
310         }else{\r
311                 IV = pHeader + QosOffset + 2;\r
312                 //IV = pHeader + QosOffset + SNAP_SIZE + sizeof(u16) + 2;\r
313         }\r
314 \r
315         TempBuf[TempLen-1] = (u8)(DataLen & 0xff);\r
316         TempBuf[TempLen-2] = (u8)((DataLen & 0xff00)>>8);\r
317         TempBuf[TempLen-4] = KeyIdx;\r
318 \r
319         WAPI_DATA(WAPI_TX, "CalculateMic - KEY", MicKey, 16);\r
320         WAPI_DATA(WAPI_TX, "CalculateMic - IV", IV, 16);\r
321         WAPI_DATA(WAPI_TX, "CalculateMic - TempBuf", TempBuf, TempLen);\r
322         WAPI_DATA(WAPI_TX, "CalculateMic - pData", pData, DataLen);\r
323 \r
324         WapiSMS4CalculateMic(MicKey, IV, TempBuf, TempLen,\r
325                                                      pData, DataLen, MicBuffer, &MicLen);\r
326 \r
327         if (MicLen != 16)\r
328                 WAPI_TRACE(WAPI_ERR,"%s: MIC Length Error!!\n",__FUNCTION__);\r
329 \r
330         WAPI_TRACE(WAPI_TX|WAPI_RX, "<=========%s\n", __FUNCTION__);\r
331 #endif\r
332 }\r
333 \r
334 /* AddCount: 1 or 2.\r
335  *  If overflow, return 1,\r
336  *  else return 0.\r
337  */\r
338 u8 WapiIncreasePN(u8 *PN, u8 AddCount)\r
339 {\r
340         u8  i;\r
341 \r
342         if (NULL == PN)\r
343                 return 1;\r
344         //YJ,test,091102\r
345         /*\r
346         if(AddCount == 2){\r
347                 DBG_8192C("############################%s(): PN[0]=0x%x\n", __FUNCTION__, PN[0]);\r
348                 if(PN[0] == 0x48){\r
349                         PN[0] += AddCount;\r
350                         return 1;\r
351                 }else{\r
352                         PN[0] += AddCount;\r
353                         return 0;\r
354                 }\r
355         }\r
356         */\r
357         //YJ,test,091102,end\r
358 \r
359         for (i=0; i<16; i++)\r
360         {\r
361                 if (PN[i] + AddCount <= 0xff)\r
362                 {\r
363                         PN[i] += AddCount;\r
364                         return 0;\r
365                 }\r
366                 else\r
367                 {\r
368                         PN[i] += AddCount;\r
369                         AddCount = 1;\r
370                 }\r
371         }\r
372         return 1;\r
373 }\r
374 \r
375 \r
376 void WapiGetLastRxUnicastPNForQoSData(\r
377         u8                      UserPriority,\r
378         PRT_WAPI_STA_INFO    pWapiStaInfo,\r
379         u8 *PNOut\r
380 )\r
381 {\r
382         WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__);\r
383         switch(UserPriority)\r
384         {\r
385                 case 0:\r
386                 case 3:\r
387                               memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNBEQueue,16);\r
388                               break;\r
389                 case 1:\r
390                 case 2:\r
391                               memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNBKQueue,16);\r
392                               break;\r
393                 case 4:\r
394                 case 5:\r
395                               memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNVIQueue,16);\r
396                               break;\r
397                 case 6:\r
398                 case 7:\r
399                               memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNVOQueue,16);\r
400                               break;\r
401                 default:\r
402                                 WAPI_TRACE(WAPI_ERR, "%s: Unknown TID \n", __FUNCTION__);\r
403                                 break;\r
404         }\r
405         WAPI_TRACE(WAPI_RX, "<=========== %s\n", __FUNCTION__);\r
406 }\r
407 \r
408 \r
409 void WapiSetLastRxUnicastPNForQoSData(\r
410         u8              UserPriority,\r
411         u8           *PNIn,\r
412         PRT_WAPI_STA_INFO    pWapiStaInfo\r
413 )\r
414 {\r
415         WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__);\r
416         switch(UserPriority)\r
417         {\r
418                 case 0:\r
419                 case 3:\r
420                               memcpy(pWapiStaInfo->lastRxUnicastPNBEQueue,PNIn,16);\r
421                               break;\r
422                 case 1:\r
423                 case 2:\r
424                               memcpy(pWapiStaInfo->lastRxUnicastPNBKQueue,PNIn,16);\r
425                               break;\r
426                 case 4:\r
427                 case 5:\r
428                               memcpy(pWapiStaInfo->lastRxUnicastPNVIQueue,PNIn,16);\r
429                               break;\r
430                 case 6:\r
431                 case 7:\r
432                               memcpy(pWapiStaInfo->lastRxUnicastPNVOQueue,PNIn,16);\r
433                               break;\r
434                 default:\r
435                                 WAPI_TRACE(WAPI_ERR, "%s: Unknown TID \n", __FUNCTION__);\r
436                                 break;\r
437         }\r
438         WAPI_TRACE(WAPI_RX, "<=========== %s\n", __FUNCTION__);\r
439 }\r
440 \r
441 \r
442 /****************************************************************************\r
443  FALSE not RX-Reorder\r
444  TRUE do RX Reorder\r
445 add to support WAPI to N-mode\r
446 *****************************************************************************/\r
447 u8 WapiCheckPnInSwDecrypt(\r
448         _adapter *padapter,\r
449         struct sk_buff *pskb\r
450 )\r
451 {\r
452         u8                              ret = false;\r
453 \r
454 #if 0\r
455         struct ieee80211_hdr_3addr_qos *header;\r
456         u16                             fc;\r
457         u8                              *pDaddr, *pTaddr, *pRaddr;\r
458 \r
459         header = (struct ieee80211_hdr_3addr_qos *)pskb->data;\r
460         pTaddr = header->addr2;\r
461         pRaddr = header->addr1;\r
462         fc = le16_to_cpu(header->frame_ctl);\r
463 \r
464         if(GetToDs(&fc))\r
465                 pDaddr = header->addr3;\r
466         else\r
467                 pDaddr = header->addr1;\r
468 \r
469         if ((_rtw_memcmp(pRaddr, padapter->pnetdev->dev_addr, ETH_ALEN) == 0)\r
470                 &&      ! (pDaddr)\r
471                 && (GetFrameType(&fc) == WIFI_QOS_DATA_TYPE))\r
472                 //&& ieee->pHTInfo->bCurrentHTSupport &&\r
473                 //ieee->pHTInfo->bCurRxReorderEnable)\r
474                 ret = false;\r
475         else\r
476                 ret = true;\r
477 #endif\r
478         WAPI_TRACE(WAPI_RX, "%s: return %d\n", __FUNCTION__, ret);\r
479         return ret;\r
480 }\r
481 \r
482 int SecSMS4HeaderFillIV(_adapter *padapter, u8 *pxmitframe)\r
483 {\r
484         struct pkt_attrib *pattrib = &((struct xmit_frame*)pxmitframe)->attrib;\r
485         u8 * frame = ((struct xmit_frame *)pxmitframe)->buf_addr + TXDESC_OFFSET;\r
486         u8 *pSecHeader = NULL, *pos = NULL, *pRA = NULL;\r
487         u8 bPNOverflow = false, bFindMatchPeer = false, hdr_len = 0;\r
488         PWLAN_HEADER_WAPI_EXTENSION pWapiExt = NULL;\r
489         PRT_WAPI_T         pWapiInfo = &padapter->wapiInfo;\r
490         PRT_WAPI_STA_INFO  pWapiSta = NULL;\r
491         int ret = 0;\r
492 \r
493         WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__);\r
494 \r
495         return ret;\r
496 #if 0\r
497         hdr_len = sMacHdrLng;\r
498         if (GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE)\r
499         {\r
500                 hdr_len += 2;\r
501         }\r
502         //hdr_len += SNAP_SIZE + sizeof(u16);\r
503 \r
504         pos = skb_push(pskb, padapter->wapiInfo.extra_prefix_len);\r
505         memmove(pos, pos+padapter->wapiInfo.extra_prefix_len, hdr_len);\r
506 \r
507         pSecHeader = pskb->data + hdr_len;\r
508         pWapiExt = (PWLAN_HEADER_WAPI_EXTENSION)pSecHeader;\r
509         pRA = pskb->data + 4;\r
510 \r
511         WAPI_DATA(WAPI_TX, "FillIV - Before Fill IV", pskb->data, pskb->len);\r
512 \r
513         //Address 1 is always receiver's address\r
514         if( IS_MCAST(pRA) ){\r
515                 if(!pWapiInfo->wapiTxMsk.bTxEnable){\r
516                         WAPI_TRACE(WAPI_ERR,"%s: bTxEnable = 0!!\n",__FUNCTION__);\r
517                         return -2;\r
518                 }\r
519                 if(pWapiInfo->wapiTxMsk.keyId <= 1){\r
520                         pWapiExt->KeyIdx = pWapiInfo->wapiTxMsk.keyId;\r
521                         pWapiExt->Reserved = 0;\r
522                         bPNOverflow = WapiIncreasePN(pWapiInfo->lastTxMulticastPN, 1);\r
523                         memcpy(pWapiExt->PN, pWapiInfo->lastTxMulticastPN, 16);\r
524                         if (bPNOverflow){\r
525                                 // Update MSK Notification.\r
526                                 WAPI_TRACE(WAPI_ERR,"===============>%s():multicast PN overflow\n",__FUNCTION__);\r
527                                 rtw_wapi_app_event_handler(padapter,NULL,0,pRA, false, false, true, 0, false);\r
528                         }\r
529                 }else{\r
530                         WAPI_TRACE(WAPI_ERR,"%s: Invalid Wapi Multicast KeyIdx!!\n",__FUNCTION__);\r
531                         ret = -3;\r
532                 }\r
533         }\r
534         else{\r
535                 list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {\r
536                         if(!memcmp(pWapiSta->PeerMacAddr,pRA,6)){\r
537                                 bFindMatchPeer = true;\r
538                                 break;\r
539                         }\r
540                 }\r
541                 if (bFindMatchPeer){\r
542                         if((!pWapiSta->wapiUskUpdate.bTxEnable) && (!pWapiSta->wapiUsk.bTxEnable)){\r
543                                 WAPI_TRACE(WAPI_ERR,"%s: bTxEnable = 0!!\n",__FUNCTION__);\r
544                                 return -4;\r
545                         }\r
546                         if (pWapiSta->wapiUsk.keyId <= 1){\r
547                                 if(pWapiSta->wapiUskUpdate.bTxEnable)\r
548                                         pWapiExt->KeyIdx = pWapiSta->wapiUskUpdate.keyId;\r
549                                 else\r
550                                         pWapiExt->KeyIdx = pWapiSta->wapiUsk.keyId;\r
551 \r
552                                 pWapiExt->Reserved = 0;\r
553                                 bPNOverflow = WapiIncreasePN(pWapiSta->lastTxUnicastPN, 2);\r
554                                 memcpy(pWapiExt->PN, pWapiSta->lastTxUnicastPN, 16);\r
555                                 if (bPNOverflow){\r
556                                         // Update USK Notification.\r
557                                         WAPI_TRACE(WAPI_ERR,"===============>%s():unicast PN overflow\n",__FUNCTION__);\r
558                                         rtw_wapi_app_event_handler(padapter,NULL,0,pWapiSta->PeerMacAddr, false, true, false, 0, false);\r
559                                 }\r
560                         }else{\r
561                                 WAPI_TRACE(WAPI_ERR,"%s: Invalid Wapi Unicast KeyIdx!!\n",__FUNCTION__);\r
562                                 ret = -5;\r
563                         }\r
564                 }\r
565                 else{\r
566                         WAPI_TRACE(WAPI_ERR,"%s: Can not find Peer Sta "MAC_FMT"!!\n",__FUNCTION__, MAC_ARG(pRA));\r
567                         ret = -6;\r
568                 }\r
569         }\r
570 \r
571         WAPI_DATA(WAPI_TX, "FillIV - After Fill IV", pskb->data, pskb->len);\r
572         WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__);\r
573         return ret;\r
574 #endif\r
575 }\r
576 \r
577 // WAPI SW Enc: must have done Coalesce!\r
578 void SecSWSMS4Encryption(\r
579         _adapter *padapter,\r
580         u8 * pxmitframe\r
581         )\r
582 {\r
583         PRT_WAPI_T              pWapiInfo = &padapter->wapiInfo;\r
584         PRT_WAPI_STA_INFO   pWapiSta = NULL;\r
585         u8 *pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_SIZE;\r
586         struct pkt_attrib *pattrib = &((struct xmit_frame*)pxmitframe)->attrib;\r
587 \r
588         u8 *SecPtr = NULL, *pRA, *pMicKey = NULL, *pDataKey = NULL, *pIV = NULL;\r
589         u8 IVOffset, DataOffset, bFindMatchPeer = false, KeyIdx = 0, MicBuffer[16];\r
590         u16 OutputLength;\r
591 \r
592         WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__);\r
593 \r
594         WAPI_TRACE(WAPI_TX,"hdrlen: %d \n",pattrib->hdrlen);\r
595 \r
596         return;\r
597 \r
598         DataOffset = pattrib->hdrlen + pattrib->iv_len;\r
599 \r
600         pRA = pframe + 4;\r
601 \r
602 \r
603         if( IS_MCAST(pRA) ){\r
604                 KeyIdx = pWapiInfo->wapiTxMsk.keyId;\r
605                 pIV = pWapiInfo->lastTxMulticastPN;\r
606                 pMicKey = pWapiInfo->wapiTxMsk.micKey;\r
607                 pDataKey = pWapiInfo->wapiTxMsk.dataKey;\r
608         }else{\r
609                 if (!list_empty(&(pWapiInfo->wapiSTAUsedList))){\r
610                         list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {\r
611                                 if (0 == memcmp(pWapiSta->PeerMacAddr, pRA, 6)){\r
612                                         bFindMatchPeer = true;\r
613                                         break;\r
614                                 }\r
615                         }\r
616 \r
617                         if (bFindMatchPeer){\r
618                                 if (pWapiSta->wapiUskUpdate.bTxEnable){\r
619                                         KeyIdx = pWapiSta->wapiUskUpdate.keyId;\r
620                                         WAPI_TRACE(WAPI_TX, "%s(): Use update USK!! KeyIdx=%d\n", __FUNCTION__, KeyIdx);\r
621                                         pIV = pWapiSta->lastTxUnicastPN;\r
622                                         pMicKey = pWapiSta->wapiUskUpdate.micKey;\r
623                                         pDataKey = pWapiSta->wapiUskUpdate.dataKey;\r
624                                 }else{\r
625                                         KeyIdx = pWapiSta->wapiUsk.keyId;\r
626                                         WAPI_TRACE(WAPI_TX, "%s(): Use USK!! KeyIdx=%d\n", __FUNCTION__, KeyIdx);\r
627                                         pIV = pWapiSta->lastTxUnicastPN;\r
628                                         pMicKey = pWapiSta->wapiUsk.micKey;\r
629                                         pDataKey = pWapiSta->wapiUsk.dataKey;\r
630                                 }\r
631                         }else{\r
632                                 WAPI_TRACE(WAPI_ERR,"%s: Can not find Peer Sta!!\n",__FUNCTION__);\r
633                                 return;\r
634                         }\r
635                 }else{\r
636                         WAPI_TRACE(WAPI_ERR,"%s: wapiSTAUsedList is empty!!\n",__FUNCTION__);\r
637                         return;\r
638                 }\r
639         }\r
640 \r
641         SecPtr = pframe;\r
642         SecCalculateMicSMS4(KeyIdx, pMicKey, SecPtr, (SecPtr+DataOffset), pattrib->pktlen, MicBuffer);\r
643 \r
644         WAPI_DATA(WAPI_TX, "Encryption - MIC", MicBuffer, padapter->wapiInfo.extra_postfix_len);\r
645 \r
646         memcpy(pframe+pattrib->hdrlen+pattrib->iv_len+pattrib->pktlen-pattrib->icv_len,\r
647                         (u8 *)MicBuffer,\r
648                         padapter->wapiInfo.extra_postfix_len\r
649                         );\r
650 \r
651 \r
652         WapiSMS4Encryption(pDataKey, pIV, (SecPtr+DataOffset),pattrib->pktlen+pattrib->icv_len, (SecPtr+DataOffset), &OutputLength);\r
653 \r
654         WAPI_DATA(WAPI_TX, "Encryption - After SMS4 encryption",pframe,pattrib->hdrlen+pattrib->iv_len+pattrib->pktlen);\r
655 \r
656         WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__);\r
657 }\r
658 \r
659 u8 SecSWSMS4Decryption(\r
660         _adapter *padapter,\r
661         u8              *precv_frame,\r
662         struct recv_priv *precv_priv\r
663         )\r
664 {\r
665         PRT_WAPI_T pWapiInfo = &padapter->wapiInfo;\r
666         struct recv_frame_hdr *precv_hdr;\r
667         PRT_WAPI_STA_INFO   pWapiSta = NULL;\r
668         u8 IVOffset, DataOffset, bFindMatchPeer = false, bUseUpdatedKey = false;\r
669         u8 KeyIdx, MicBuffer[16], lastRxPNforQoS[16];\r
670         u8 *pRA, *pTA, *pMicKey, *pDataKey, *pLastRxPN, *pRecvPN, *pSecData, *pRecvMic, *pos;\r
671         u8 TID = 0;\r
672         u16 OutputLength, DataLen;\r
673         u8   bQosData;\r
674         struct sk_buff *        pskb;\r
675 \r
676         WAPI_TRACE(WAPI_RX, "=========>%s\n", __FUNCTION__);\r
677 \r
678         return 0;\r
679 \r
680         precv_hdr = &((union recv_frame*)precv_frame)->u.hdr;\r
681         pskb = (struct sk_buff *)(precv_hdr->rx_data);\r
682         precv_hdr->bWapiCheckPNInDecrypt = WapiCheckPnInSwDecrypt(padapter, pskb);\r
683         WAPI_TRACE(WAPI_RX, "=========>%s: check PN  %d\n", __FUNCTION__,precv_hdr->bWapiCheckPNInDecrypt);\r
684         WAPI_DATA(WAPI_RX, "Decryption - Before decryption", pskb->data, pskb->len);\r
685 \r
686         IVOffset = sMacHdrLng;\r
687         bQosData = GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE;\r
688         if (bQosData){\r
689                 IVOffset += 2;\r
690         }\r
691 \r
692         //if(GetHTC())\r
693         //      IVOffset += 4;\r
694 \r
695         //IVOffset += SNAP_SIZE + sizeof(u16);\r
696 \r
697         DataOffset = IVOffset + padapter->wapiInfo.extra_prefix_len;\r
698 \r
699         pRA = pskb->data + 4;\r
700         pTA = pskb->data + 10;\r
701         KeyIdx = *(pskb->data + IVOffset);\r
702         pRecvPN = pskb->data + IVOffset + 2;\r
703         pSecData = pskb->data + DataOffset;\r
704         DataLen = pskb->len - DataOffset;\r
705         pRecvMic = pskb->data + pskb->len - padapter->wapiInfo.extra_postfix_len;\r
706         TID = GetTid(pskb->data);\r
707 \r
708         if (!list_empty(&(pWapiInfo->wapiSTAUsedList))){\r
709                 list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {\r
710                         if (0 == memcmp(pWapiSta->PeerMacAddr, pTA, 6)){\r
711                                 bFindMatchPeer = true;\r
712                                 break;\r
713                         }\r
714                 }\r
715         }\r
716 \r
717         if (!bFindMatchPeer){\r
718                 WAPI_TRACE(WAPI_ERR, "%s: Can not find Peer Sta "MAC_FMT" for Key Info!!!\n", __FUNCTION__, MAC_ARG(pTA));\r
719                 return false;\r
720         }\r
721 \r
722         if( IS_MCAST(pRA) ){\r
723                 WAPI_TRACE(WAPI_RX, "%s: Multicast decryption !!!\n", __FUNCTION__);\r
724                 if (pWapiSta->wapiMsk.keyId == KeyIdx && pWapiSta->wapiMsk.bSet){\r
725                         pLastRxPN = pWapiSta->lastRxMulticastPN;\r
726                         if (!WapiComparePN(pRecvPN, pLastRxPN)){\r
727                                 WAPI_TRACE(WAPI_ERR, "%s: MSK PN is not larger than last, Dropped!!!\n", __FUNCTION__);\r
728                                 WAPI_DATA(WAPI_ERR, "pRecvPN:", pRecvPN, 16);\r
729                                 WAPI_DATA(WAPI_ERR, "pLastRxPN:", pLastRxPN, 16);\r
730                                 return false;\r
731                         }\r
732 \r
733                         memcpy(pLastRxPN, pRecvPN, 16);\r
734                         pMicKey = pWapiSta->wapiMsk.micKey;\r
735                         pDataKey = pWapiSta->wapiMsk.dataKey;\r
736                 }else if (pWapiSta->wapiMskUpdate.keyId == KeyIdx && pWapiSta->wapiMskUpdate.bSet){\r
737                         WAPI_TRACE(WAPI_RX, "%s: Use Updated MSK for Decryption !!!\n", __FUNCTION__);\r
738                         bUseUpdatedKey = true;\r
739                         memcpy(pWapiSta->lastRxMulticastPN, pRecvPN, 16);\r
740                         pMicKey = pWapiSta->wapiMskUpdate.micKey;\r
741                         pDataKey = pWapiSta->wapiMskUpdate.dataKey;\r
742                 }else{\r
743                         WAPI_TRACE(WAPI_ERR, "%s: Can not find MSK with matched KeyIdx(%d), Dropped !!!\n", __FUNCTION__,KeyIdx);\r
744                         return false;\r
745                 }\r
746         }\r
747         else{\r
748                 WAPI_TRACE(WAPI_RX, "%s: Unicast decryption !!!\n", __FUNCTION__);\r
749                 if (pWapiSta->wapiUsk.keyId == KeyIdx && pWapiSta->wapiUsk.bSet){\r
750                         WAPI_TRACE(WAPI_RX, "%s: Use USK for Decryption!!!\n", __FUNCTION__);\r
751                         if(precv_hdr->bWapiCheckPNInDecrypt){\r
752                                 if(GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE){\r
753                                         WapiGetLastRxUnicastPNForQoSData(TID, pWapiSta, lastRxPNforQoS);\r
754                                         pLastRxPN = lastRxPNforQoS;\r
755                                 }else{\r
756                                         pLastRxPN = pWapiSta->lastRxUnicastPN;\r
757                                 }\r
758                                 if (!WapiComparePN(pRecvPN, pLastRxPN)){\r
759                                         return false;\r
760                                 }\r
761                                 if(bQosData){\r
762                                         WapiSetLastRxUnicastPNForQoSData(TID, pRecvPN, pWapiSta);\r
763                                 }else{\r
764                                         memcpy(pWapiSta->lastRxUnicastPN, pRecvPN, 16);\r
765                                 }\r
766                         }else{\r
767                                 memcpy(precv_hdr->WapiTempPN,pRecvPN,16);\r
768                         }\r
769 \r
770                         if (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE))\r
771                         {\r
772                                 if ((pRecvPN[0] & 0x1) == 0){\r
773                                         WAPI_TRACE(WAPI_ERR, "%s: Rx USK PN is not odd when Infra STA mode, Dropped !!!\n", __FUNCTION__);\r
774                                         return false;\r
775                                 }\r
776                         }\r
777 \r
778                         pMicKey = pWapiSta->wapiUsk.micKey;\r
779                         pDataKey = pWapiSta->wapiUsk.dataKey;\r
780                 }\r
781                 else if (pWapiSta->wapiUskUpdate.keyId == KeyIdx && pWapiSta->wapiUskUpdate.bSet ){\r
782                         WAPI_TRACE(WAPI_RX, "%s: Use Updated USK for Decryption!!!\n", __FUNCTION__);\r
783                         if(pWapiSta->bAuthenticatorInUpdata)\r
784                                 bUseUpdatedKey = true;\r
785                         else\r
786                                 bUseUpdatedKey = false;\r
787 \r
788                         if(bQosData){\r
789                                 WapiSetLastRxUnicastPNForQoSData(TID, pRecvPN, pWapiSta);\r
790                         }else{\r
791                                 memcpy(pWapiSta->lastRxUnicastPN, pRecvPN, 16);\r
792                         }\r
793                         pMicKey = pWapiSta->wapiUskUpdate.micKey;\r
794                         pDataKey = pWapiSta->wapiUskUpdate.dataKey;\r
795                 }else{\r
796                         WAPI_TRACE(WAPI_ERR, "%s: No valid USK!!!KeyIdx=%d pWapiSta->wapiUsk.keyId=%d pWapiSta->wapiUskUpdate.keyId=%d\n", __FUNCTION__, KeyIdx, pWapiSta->wapiUsk.keyId, pWapiSta->wapiUskUpdate.keyId);\r
797                         //dump_buf(pskb->data,pskb->len);\r
798                         return false;\r
799                 }\r
800         }\r
801 \r
802         WAPI_DATA(WAPI_RX, "Decryption - DataKey", pDataKey, 16);\r
803         WAPI_DATA(WAPI_RX, "Decryption - IV", pRecvPN, 16);\r
804         WapiSMS4Decryption(pDataKey, pRecvPN, pSecData, DataLen, pSecData, &OutputLength);\r
805 \r
806         if (OutputLength != DataLen)\r
807                 WAPI_TRACE(WAPI_ERR, "%s:  Output Length Error!!!!\n", __FUNCTION__);\r
808 \r
809         WAPI_DATA(WAPI_RX, "Decryption - After decryption", pskb->data, pskb->len);\r
810 \r
811         DataLen -= padapter->wapiInfo.extra_postfix_len;\r
812 \r
813         SecCalculateMicSMS4(KeyIdx, pMicKey, pskb->data, pSecData, DataLen, MicBuffer);\r
814 \r
815         WAPI_DATA(WAPI_RX, "Decryption - MIC received", pRecvMic, SMS4_MIC_LEN);\r
816         WAPI_DATA(WAPI_RX, "Decryption - MIC calculated", MicBuffer, SMS4_MIC_LEN);\r
817 \r
818         if (0 == memcmp(MicBuffer, pRecvMic, padapter->wapiInfo.extra_postfix_len)){\r
819                 WAPI_TRACE(WAPI_RX, "%s: Check MIC OK!!\n", __FUNCTION__);\r
820                 if (bUseUpdatedKey){\r
821                         // delete the old key\r
822                         if ( IS_MCAST(pRA) ){\r
823                                 WAPI_TRACE(WAPI_API, "%s(): AE use new update MSK!!\n", __FUNCTION__);\r
824                                 pWapiSta->wapiMsk.keyId = pWapiSta->wapiMskUpdate.keyId;\r
825                                 memcpy(pWapiSta->wapiMsk.dataKey, pWapiSta->wapiMskUpdate.dataKey, 16);\r
826                                 memcpy(pWapiSta->wapiMsk.micKey, pWapiSta->wapiMskUpdate.micKey, 16);\r
827                                 pWapiSta->wapiMskUpdate.bTxEnable = pWapiSta->wapiMskUpdate.bSet = false;\r
828                         }else{\r
829                                 WAPI_TRACE(WAPI_API, "%s(): AE use new update USK!!\n", __FUNCTION__);\r
830                                 pWapiSta->wapiUsk.keyId = pWapiSta->wapiUskUpdate.keyId;\r
831                                 memcpy(pWapiSta->wapiUsk.dataKey, pWapiSta->wapiUskUpdate.dataKey, 16);\r
832                                 memcpy(pWapiSta->wapiUsk.micKey, pWapiSta->wapiUskUpdate.micKey, 16);\r
833                                 pWapiSta->wapiUskUpdate.bTxEnable = pWapiSta->wapiUskUpdate.bSet = false;\r
834                         }\r
835                 }\r
836         }else{\r
837                 WAPI_TRACE(WAPI_ERR, "%s:  Check MIC Error, Dropped !!!!\n", __FUNCTION__);\r
838                 return false;\r
839         }\r
840 \r
841         pos = pskb->data;\r
842         memmove(pos+padapter->wapiInfo.extra_prefix_len, pos, IVOffset);\r
843         skb_pull(pskb, padapter->wapiInfo.extra_prefix_len);\r
844 \r
845         WAPI_TRACE(WAPI_RX, "<=========%s\n", __FUNCTION__);\r
846 \r
847         return true;\r
848 }\r
849 \r
850 u32     rtw_sms4_encrypt(_adapter *padapter, u8 *pxmitframe)\r
851 {\r
852 \r
853         u8      *pframe;\r
854         u32 res = _SUCCESS;\r
855 \r
856         WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__);\r
857 \r
858         if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable))\r
859         {\r
860                 WAPI_TRACE(WAPI_TX, "<========== %s, WAPI not supported or enabled!\n", __FUNCTION__);\r
861                 return _FAIL;\r
862         }\r
863 \r
864         if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL)\r
865                 return _FAIL;\r
866 \r
867         pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_OFFSET;\r
868 \r
869         SecSWSMS4Encryption(padapter, pxmitframe);\r
870 \r
871         WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__);\r
872         return res;\r
873 }\r
874 \r
875 u32     rtw_sms4_decrypt(_adapter *padapter, u8 *precvframe)\r
876 {\r
877         u8      *pframe;\r
878         u32 res = _SUCCESS;\r
879 \r
880         WAPI_TRACE(WAPI_RX, "=========>%s\n", __FUNCTION__);\r
881 \r
882         if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable))\r
883         {\r
884                 WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or enabled!\n", __FUNCTION__);\r
885                 return _FAIL;\r
886         }\r
887 \r
888 \r
889         //drop packet when hw decrypt fail\r
890        //return tempraily\r
891         return _FAIL;\r
892 \r
893         //pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data;\r
894 \r
895         if (false == SecSWSMS4Decryption(padapter, precvframe, &padapter->recvpriv))\r
896         {\r
897                 WAPI_TRACE(WAPI_ERR, "%s():SMS4 decrypt frame error\n",__FUNCTION__);\r
898                 return _FAIL;\r
899         }\r
900 \r
901         WAPI_TRACE(WAPI_RX, "<=========%s\n", __FUNCTION__);\r
902         return res;\r
903 }\r
904 \r
905 #else\r
906 \r
907 u32     rtw_sms4_encrypt(_adapter *padapter, u8 *pxmitframe)\r
908 {\r
909         WAPI_TRACE(WAPI_TX, "=========>Dummy %s\n", __FUNCTION__);\r
910         WAPI_TRACE(WAPI_TX, "<=========Dummy %s\n", __FUNCTION__);\r
911         return _SUCCESS;\r
912 }\r
913 \r
914 u32     rtw_sms4_decrypt(_adapter *padapter, u8 *precvframe)\r
915 {\r
916         WAPI_TRACE(WAPI_RX, "=========>Dummy %s\n", __FUNCTION__);\r
917         WAPI_TRACE(WAPI_RX, "<=========Dummy %s\n", __FUNCTION__);\r
918         return _SUCCESS;\r
919 }\r
920 \r
921 #endif\r
922 \r
923 #endif\r