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"
40 u32 FCSTAB_32[256] = {
41 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
42 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
43 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
44 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
45 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
46 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
47 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
48 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
49 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
50 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
51 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
52 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
53 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
54 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
55 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
56 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
57 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
58 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
59 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
60 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
61 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
62 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
63 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
64 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
65 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
66 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
67 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
68 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
69 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
70 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
71 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
72 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
73 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
74 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
75 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
76 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
77 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
78 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
79 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
80 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
81 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
82 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
83 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
84 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
85 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
86 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
87 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
88 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
89 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
90 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
91 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
92 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
93 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
94 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
95 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
96 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
97 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
98 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
99 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
100 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
101 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
102 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
103 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
104 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
112 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC
117 ========================================================================
123 pAd Pointer to our adapter
124 pKey Pointer to the WEP KEY
126 KeyLen the length of WEP KEY
127 pDest Pointer to the destination which Encryption data will store in.
132 IRQL = DISPATCH_LEVEL
136 ========================================================================
138 void RTMPInitWepEngine(struct rt_rtmp_adapter *pAd,
140 u8 KeyId, u8 KeyLen, IN u8 *pDest)
147 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
151 pAd->PrivateInfo.FCSCRC32 = PPPINITFCS32; /*Init crc32. */
154 NdisMoveMemory(WEPKEY + 3, pKey, KeyLen);
156 for (i = 0; i < 3; i++)
157 WEPKEY[i] = RandomByte(pAd); /*Call mlme RandomByte() function. */
158 ARCFOUR_INIT(&pAd->PrivateInfo.WEPCONTEXT, WEPKEY, KeyLen + 3); /*INIT SBOX, KEYLEN+3(IV) */
160 NdisMoveMemory(pDest, WEPKEY, 3); /*Append Init Vector */
162 *(pDest + 3) = (KeyId << 6); /*Append KEYID */
167 ========================================================================
170 Encrypt transimitted data
173 pAd Pointer to our adapter
174 pSrc Pointer to the transimitted source data that will be encrypt
175 pDest Pointer to the destination where entryption data will be store in.
176 Len Indicate the length of the source data
181 IRQL = DISPATCH_LEVEL
185 ========================================================================
187 void RTMPEncryptData(struct rt_rtmp_adapter *pAd,
188 u8 *pSrc, u8 *pDest, u32 Len)
190 pAd->PrivateInfo.FCSCRC32 =
191 RTMP_CALC_FCS32(pAd->PrivateInfo.FCSCRC32, pSrc, Len);
192 ARCFOUR_ENCRYPT(&pAd->PrivateInfo.WEPCONTEXT, pDest, pSrc, Len);
196 ========================================================================
199 Decrypt received WEP data
202 pAdapter Pointer to our adapter
203 pSrc Pointer to the received data
204 Len the length of the received data
207 TRUE Decrypt WEP data success
208 FALSE Decrypt WEP data failed
212 ========================================================================
214 BOOLEAN RTMPSoftDecryptWEP(struct rt_rtmp_adapter *pAd,
216 unsigned long DataByteCnt, struct rt_cipher_key *pGroupKey)
225 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
228 u8 *pPayload = (u8 *) pData + LENGTH_802_11;
229 unsigned long payload_len = DataByteCnt - LENGTH_802_11;
231 NdisMoveMemory(WEPKEY, pPayload, 3); /*Get WEP IV */
233 KeyIdx = (*(pPayload + 3) & 0xc0) >> 6;
234 if (pGroupKey[KeyIdx].KeyLen == 0)
237 NdisMoveMemory(WEPKEY + 3, pGroupKey[KeyIdx].Key,
238 pGroupKey[KeyIdx].KeyLen);
239 ARCFOUR_INIT(&pAd->PrivateInfo.WEPCONTEXT, WEPKEY,
240 pGroupKey[KeyIdx].KeyLen + 3);
241 ARCFOUR_DECRYPT(&pAd->PrivateInfo.WEPCONTEXT, pPayload, pPayload + 4,
243 NdisMoveMemory(&trailfcs, pPayload + payload_len - 8, 4);
244 crc32 = RTMP_CALC_FCS32(PPPINITFCS32, pPayload, payload_len - 8); /*Skip last 4 bytes(FCS). */
245 crc32 ^= 0xffffffff; /* complement */
247 if (crc32 != cpu2le32(trailfcs)) {
248 DBGPRINT(RT_DEBUG_TRACE, ("WEP Data CRC Error!\n")); /*CRC error. */
255 ========================================================================
258 The Stream Cipher Encryption Algorithm "struct rt_arcfour" initialize
261 Ctx Pointer to struct rt_arcfour CONTEXT (SBOX)
262 pKey Pointer to the WEP KEY
263 KeyLen Indicate the length fo the WEP KEY
268 IRQL = DISPATCH_LEVEL
272 ========================================================================
274 void ARCFOUR_INIT(struct rt_arcfourcontext *Ctx, u8 *pKey, u32 KeyLen)
285 for (counter = 0; counter < 256; counter++)
286 state[counter] = (u8)counter;
289 for (counter = 0; counter < 256; counter++) {
291 stateindex = (stateindex + pKey[keyindex] + t) & 0xff;
292 u = state[stateindex];
293 state[stateindex] = t;
295 if (++keyindex >= KeyLen)
301 ========================================================================
304 Get bytes from struct rt_arcfour CONTEXT (S-BOX)
307 Ctx Pointer to struct rt_arcfour CONTEXT (SBOX)
310 u8 - the value of the struct rt_arcfour CONTEXT (S-BOX)
314 ========================================================================
316 u8 ARCFOUR_BYTE(struct rt_arcfourcontext *Ctx)
324 x = (Ctx->X + 1) & 0xff;
326 y = (sx + Ctx->Y) & 0xff;
333 return (state[(sx + sy) & 0xff]);
338 ========================================================================
341 The Stream Cipher Decryption Algorithm
344 Ctx Pointer to struct rt_arcfour CONTEXT (SBOX)
345 pDest Pointer to the Destination
346 pSrc Pointer to the Source data
347 Len Indicate the length of the Source data
354 ========================================================================
356 void ARCFOUR_DECRYPT(struct rt_arcfourcontext *Ctx,
357 u8 *pDest, u8 *pSrc, u32 Len)
361 for (i = 0; i < Len; i++)
362 pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
366 ========================================================================
369 The Stream Cipher Encryption Algorithm
372 Ctx Pointer to struct rt_arcfour CONTEXT (SBOX)
373 pDest Pointer to the Destination
374 pSrc Pointer to the Source data
375 Len Indicate the length of the Source dta
380 IRQL = DISPATCH_LEVEL
384 ========================================================================
386 void ARCFOUR_ENCRYPT(struct rt_arcfourcontext *Ctx,
387 u8 *pDest, u8 *pSrc, u32 Len)
391 for (i = 0; i < Len; i++)
392 pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
396 ========================================================================
399 The Stream Cipher Encryption Algorithm which conform to the special requirement to encrypt GTK.
402 Ctx Pointer to struct rt_arcfour CONTEXT (SBOX)
403 pDest Pointer to the Destination
404 pSrc Pointer to the Source data
405 Len Indicate the length of the Source dta
407 ========================================================================
410 void WPAARCFOUR_ENCRYPT(struct rt_arcfourcontext *Ctx,
411 u8 *pDest, u8 *pSrc, u32 Len)
414 /*discard first 256 bytes */
415 for (i = 0; i < 256; i++)
418 for (i = 0; i < Len; i++)
419 pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
423 ========================================================================
426 Calculate a new FCS given the current FCS and the new data.
429 Fcs the original FCS value
430 Cp pointer to the data which will be calculate the FCS
431 Len the length of the data
436 IRQL = DISPATCH_LEVEL
440 ========================================================================
442 u32 RTMP_CALC_FCS32(u32 Fcs, u8 *Cp, int Len)
445 Fcs = (((Fcs) >> 8) ^ FCSTAB_32[((Fcs) ^ (*Cp++)) & 0xff]);
451 ========================================================================
454 Get last FCS and encrypt it to the destination
457 pDest Pointer to the Destination
464 ========================================================================
466 void RTMPSetICV(struct rt_rtmp_adapter *pAd, u8 *pDest)
468 pAd->PrivateInfo.FCSCRC32 ^= 0xffffffff; /* complement */
469 pAd->PrivateInfo.FCSCRC32 = cpu2le32(pAd->PrivateInfo.FCSCRC32);
471 ARCFOUR_ENCRYPT(&pAd->PrivateInfo.WEPCONTEXT, pDest,
472 (u8 *)& pAd->PrivateInfo.FCSCRC32, 4);