2 *************************************************************************
4 * 5F., No.36, Taiyuan St., Jhubei City,
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
15 * This program is distributed in the hope that it will be useful, *
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
18 * GNU General Public License for more details. *
20 * You should have received a copy of the GNU General Public License *
21 * along with this program; if not, write to the *
22 * Free Software Foundation, Inc., *
23 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
25 *************************************************************************
34 -------- ---------- ----------------------------------------------
35 Paul Wu 10-28-02 Initial
38 #include "../rt_config.h"
42 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
43 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
44 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
45 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
46 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
47 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
48 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
49 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
50 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
51 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
52 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
53 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
54 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
55 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
56 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
57 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
58 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
59 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
60 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
61 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
62 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
63 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
64 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
65 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
66 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
67 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
68 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
69 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
70 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
71 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
72 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
73 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
74 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
75 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
76 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
77 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
78 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
79 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
80 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
81 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
82 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
83 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
84 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
85 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
86 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
87 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
88 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
89 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
90 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
91 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
92 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
93 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
94 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
95 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
96 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
97 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
98 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
99 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
100 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
101 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
102 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
103 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
104 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
105 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
113 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC
118 ========================================================================
124 pAd Pointer to our adapter
125 pKey Pointer to the WEP KEY
127 KeyLen the length of WEP KEY
128 pDest Pointer to the destination which Encryption data will store in.
133 IRQL = DISPATCH_LEVEL
137 ========================================================================
139 VOID RTMPInitWepEngine(
140 IN PRTMP_ADAPTER pAd,
151 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC
154 pAd->PrivateInfo.FCSCRC32 = PPPINITFCS32; //Init crc32.
157 NdisMoveMemory(WEPKEY + 3, pKey, KeyLen);
159 for(i = 0; i < 3; i++)
160 WEPKEY[i] = RandomByte(pAd); //Call mlme RandomByte() function.
161 ARCFOUR_INIT(&pAd->PrivateInfo.WEPCONTEXT, WEPKEY, KeyLen + 3); //INIT SBOX, KEYLEN+3(IV)
163 NdisMoveMemory(pDest, WEPKEY, 3); //Append Init Vector
165 *(pDest+3) = (KeyId << 6); //Append KEYID
170 ========================================================================
173 Encrypt transimitted data
176 pAd Pointer to our adapter
177 pSrc Pointer to the transimitted source data that will be encrypt
178 pDest Pointer to the destination where entryption data will be store in.
179 Len Indicate the length of the source data
184 IRQL = DISPATCH_LEVEL
188 ========================================================================
190 VOID RTMPEncryptData(
191 IN PRTMP_ADAPTER pAd,
196 pAd->PrivateInfo.FCSCRC32 = RTMP_CALC_FCS32(pAd->PrivateInfo.FCSCRC32, pSrc, Len);
197 ARCFOUR_ENCRYPT(&pAd->PrivateInfo.WEPCONTEXT, pDest, pSrc, Len);
202 ========================================================================
205 Decrypt received WEP data
208 pAdapter Pointer to our adapter
209 pSrc Pointer to the received data
210 Len the length of the received data
213 TRUE Decrypt WEP data success
214 FALSE Decrypt WEP data failed
218 ========================================================================
220 BOOLEAN RTMPSoftDecryptWEP(
221 IN PRTMP_ADAPTER pAd,
223 IN ULONG DataByteCnt,
224 IN PCIPHER_KEY pGroupKey)
233 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC
235 UCHAR *pPayload = (UCHAR *)pData + LENGTH_802_11;
236 ULONG payload_len = DataByteCnt - LENGTH_802_11;
238 NdisMoveMemory(WEPKEY, pPayload, 3); //Get WEP IV
240 KeyIdx = (*(pPayload + 3) & 0xc0) >> 6;
241 if (pGroupKey[KeyIdx].KeyLen == 0)
244 NdisMoveMemory(WEPKEY + 3, pGroupKey[KeyIdx].Key, pGroupKey[KeyIdx].KeyLen);
245 ARCFOUR_INIT(&pAd->PrivateInfo.WEPCONTEXT, WEPKEY, pGroupKey[KeyIdx].KeyLen + 3);
246 ARCFOUR_DECRYPT(&pAd->PrivateInfo.WEPCONTEXT, pPayload, pPayload + 4, payload_len - 4);
247 NdisMoveMemory(&trailfcs, pPayload + payload_len - 8, 4);
248 crc32 = RTMP_CALC_FCS32(PPPINITFCS32, pPayload, payload_len - 8); //Skip last 4 bytes(FCS).
249 crc32 ^= 0xffffffff; /* complement */
251 if(crc32 != cpu2le32(trailfcs))
253 DBGPRINT(RT_DEBUG_TRACE, ("! WEP Data CRC Error !\n")); //CRC error.
260 ========================================================================
263 The Stream Cipher Encryption Algorithm "ARCFOUR" initialize
266 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
267 pKey Pointer to the WEP KEY
268 KeyLen Indicate the length fo the WEP KEY
273 IRQL = DISPATCH_LEVEL
277 ========================================================================
280 IN PARCFOURCONTEXT Ctx,
293 for (counter = 0; counter < 256; counter++)
294 state[counter] = (UCHAR)counter;
297 for (counter = 0; counter < 256; counter++)
300 stateindex = (stateindex + pKey[keyindex] + t) & 0xff;
301 u = state[stateindex];
302 state[stateindex] = t;
304 if (++keyindex >= KeyLen)
310 ========================================================================
313 Get bytes from ARCFOUR CONTEXT (S-BOX)
316 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
319 UCHAR - the value of the ARCFOUR CONTEXT (S-BOX)
323 ========================================================================
326 IN PARCFOURCONTEXT Ctx)
334 x = (Ctx->X + 1) & 0xff;
336 y = (sx + Ctx->Y) & 0xff;
343 return(state[(sx + sy) & 0xff]);
348 ========================================================================
351 The Stream Cipher Decryption Algorithm
354 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
355 pDest Pointer to the Destination
356 pSrc Pointer to the Source data
357 Len Indicate the length of the Source data
364 ========================================================================
366 VOID ARCFOUR_DECRYPT(
367 IN PARCFOURCONTEXT Ctx,
374 for (i = 0; i < Len; i++)
375 pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
379 ========================================================================
382 The Stream Cipher Encryption Algorithm
385 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
386 pDest Pointer to the Destination
387 pSrc Pointer to the Source data
388 Len Indicate the length of the Source dta
393 IRQL = DISPATCH_LEVEL
397 ========================================================================
399 VOID ARCFOUR_ENCRYPT(
400 IN PARCFOURCONTEXT Ctx,
407 for (i = 0; i < Len; i++)
408 pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
412 ========================================================================
415 The Stream Cipher Encryption Algorithm which conform to the special requirement to encrypt GTK.
418 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
419 pDest Pointer to the Destination
420 pSrc Pointer to the Source data
421 Len Indicate the length of the Source dta
424 ========================================================================
427 VOID WPAARCFOUR_ENCRYPT(
428 IN PARCFOURCONTEXT Ctx,
434 //discard first 256 bytes
435 for (i = 0; i < 256; i++)
438 for (i = 0; i < Len; i++)
439 pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
444 ========================================================================
447 Calculate a new FCS given the current FCS and the new data.
450 Fcs the original FCS value
451 Cp pointer to the data which will be calculate the FCS
452 Len the length of the data
457 IRQL = DISPATCH_LEVEL
461 ========================================================================
463 UINT RTMP_CALC_FCS32(
469 Fcs = (((Fcs) >> 8) ^ FCSTAB_32[((Fcs) ^ (*Cp++)) & 0xff]);
476 ========================================================================
479 Get last FCS and encrypt it to the destination
482 pDest Pointer to the Destination
489 ========================================================================
492 IN PRTMP_ADAPTER pAd,
495 pAd->PrivateInfo.FCSCRC32 ^= 0xffffffff; /* complement */
496 pAd->PrivateInfo.FCSCRC32 = cpu2le32(pAd->PrivateInfo.FCSCRC32);
498 ARCFOUR_ENCRYPT(&pAd->PrivateInfo.WEPCONTEXT, pDest, (PUCHAR) &pAd->PrivateInfo.FCSCRC32, 4);