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.
156 if (pAd->StaCfg.bCkipOn && (pAd->StaCfg.CkipFlag & 0x10) && (pAd->OpMode == OPMODE_STA))
158 ARCFOUR_INIT(&pAd->PrivateInfo.WEPCONTEXT, pKey, KeyLen); //INIT SBOX, KEYLEN+3(IV)
159 NdisMoveMemory(pDest, pKey, 3); //Append Init Vector
163 NdisMoveMemory(WEPKEY + 3, pKey, KeyLen);
165 for(i = 0; i < 3; i++)
166 WEPKEY[i] = RandomByte(pAd); //Call mlme RandomByte() function.
167 ARCFOUR_INIT(&pAd->PrivateInfo.WEPCONTEXT, WEPKEY, KeyLen + 3); //INIT SBOX, KEYLEN+3(IV)
169 NdisMoveMemory(pDest, WEPKEY, 3); //Append Init Vector
171 *(pDest+3) = (KeyId << 6); //Append KEYID
176 ========================================================================
179 Encrypt transimitted data
182 pAd Pointer to our adapter
183 pSrc Pointer to the transimitted source data that will be encrypt
184 pDest Pointer to the destination where entryption data will be store in.
185 Len Indicate the length of the source data
190 IRQL = DISPATCH_LEVEL
194 ========================================================================
196 VOID RTMPEncryptData(
197 IN PRTMP_ADAPTER pAd,
202 pAd->PrivateInfo.FCSCRC32 = RTMP_CALC_FCS32(pAd->PrivateInfo.FCSCRC32, pSrc, Len);
203 ARCFOUR_ENCRYPT(&pAd->PrivateInfo.WEPCONTEXT, pDest, pSrc, Len);
208 ========================================================================
211 Decrypt received WEP data
214 pAdapter Pointer to our adapter
215 pSrc Pointer to the received data
216 Len the length of the received data
219 TRUE Decrypt WEP data success
220 FALSE Decrypt WEP data failed
224 ========================================================================
226 BOOLEAN RTMPSoftDecryptWEP(
227 IN PRTMP_ADAPTER pAd,
229 IN ULONG DataByteCnt,
230 IN PCIPHER_KEY pGroupKey)
239 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC
241 UCHAR *pPayload = (UCHAR *)pData + LENGTH_802_11;
242 ULONG payload_len = DataByteCnt - LENGTH_802_11;
244 NdisMoveMemory(WEPKEY, pPayload, 3); //Get WEP IV
246 KeyIdx = (*(pPayload + 3) & 0xc0) >> 6;
247 if (pGroupKey[KeyIdx].KeyLen == 0)
250 NdisMoveMemory(WEPKEY + 3, pGroupKey[KeyIdx].Key, pGroupKey[KeyIdx].KeyLen);
251 ARCFOUR_INIT(&pAd->PrivateInfo.WEPCONTEXT, WEPKEY, pGroupKey[KeyIdx].KeyLen + 3);
252 ARCFOUR_DECRYPT(&pAd->PrivateInfo.WEPCONTEXT, pPayload, pPayload + 4, payload_len - 4);
253 NdisMoveMemory(&trailfcs, pPayload + payload_len - 8, 4);
254 crc32 = RTMP_CALC_FCS32(PPPINITFCS32, pPayload, payload_len - 8); //Skip last 4 bytes(FCS).
255 crc32 ^= 0xffffffff; /* complement */
257 if(crc32 != cpu2le32(trailfcs))
259 DBGPRINT(RT_DEBUG_TRACE, ("! WEP Data CRC Error !\n")); //CRC error.
266 ========================================================================
269 The Stream Cipher Encryption Algorithm "ARCFOUR" initialize
272 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
273 pKey Pointer to the WEP KEY
274 KeyLen Indicate the length fo the WEP KEY
279 IRQL = DISPATCH_LEVEL
283 ========================================================================
286 IN PARCFOURCONTEXT Ctx,
299 for (counter = 0; counter < 256; counter++)
300 state[counter] = (UCHAR)counter;
303 for (counter = 0; counter < 256; counter++)
306 stateindex = (stateindex + pKey[keyindex] + t) & 0xff;
307 u = state[stateindex];
308 state[stateindex] = t;
310 if (++keyindex >= KeyLen)
316 ========================================================================
319 Get bytes from ARCFOUR CONTEXT (S-BOX)
322 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
325 UCHAR - the value of the ARCFOUR CONTEXT (S-BOX)
329 ========================================================================
332 IN PARCFOURCONTEXT Ctx)
340 x = (Ctx->X + 1) & 0xff;
342 y = (sx + Ctx->Y) & 0xff;
349 return(state[(sx + sy) & 0xff]);
354 ========================================================================
357 The Stream Cipher Decryption Algorithm
360 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
361 pDest Pointer to the Destination
362 pSrc Pointer to the Source data
363 Len Indicate the length of the Source data
370 ========================================================================
372 VOID ARCFOUR_DECRYPT(
373 IN PARCFOURCONTEXT Ctx,
380 for (i = 0; i < Len; i++)
381 pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
385 ========================================================================
388 The Stream Cipher Encryption Algorithm
391 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
392 pDest Pointer to the Destination
393 pSrc Pointer to the Source data
394 Len Indicate the length of the Source dta
399 IRQL = DISPATCH_LEVEL
403 ========================================================================
405 VOID ARCFOUR_ENCRYPT(
406 IN PARCFOURCONTEXT Ctx,
413 for (i = 0; i < Len; i++)
414 pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
418 ========================================================================
421 The Stream Cipher Encryption Algorithm which conform to the special requirement to encrypt GTK.
424 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
425 pDest Pointer to the Destination
426 pSrc Pointer to the Source data
427 Len Indicate the length of the Source dta
430 ========================================================================
433 VOID WPAARCFOUR_ENCRYPT(
434 IN PARCFOURCONTEXT Ctx,
440 //discard first 256 bytes
441 for (i = 0; i < 256; i++)
444 for (i = 0; i < Len; i++)
445 pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
450 ========================================================================
453 Calculate a new FCS given the current FCS and the new data.
456 Fcs the original FCS value
457 Cp pointer to the data which will be calculate the FCS
458 Len the length of the data
463 IRQL = DISPATCH_LEVEL
467 ========================================================================
469 UINT RTMP_CALC_FCS32(
475 Fcs = (((Fcs) >> 8) ^ FCSTAB_32[((Fcs) ^ (*Cp++)) & 0xff]);
482 ========================================================================
485 Get last FCS and encrypt it to the destination
488 pDest Pointer to the Destination
495 ========================================================================
498 IN PRTMP_ADAPTER pAd,
501 pAd->PrivateInfo.FCSCRC32 ^= 0xffffffff; /* complement */
502 pAd->PrivateInfo.FCSCRC32 = cpu2le32(pAd->PrivateInfo.FCSCRC32);
504 ARCFOUR_ENCRYPT(&pAd->PrivateInfo.WEPCONTEXT, pDest, (PUCHAR) &pAd->PrivateInfo.FCSCRC32, 4);