GUI: Fix Tomato RAF theme for all builds. Compilation typo.
[tomato.git] / release / src-rt-6.x.4708 / linux / linux-2.6.36 / drivers / staging / rt2860 / common / cmm_wep.c
blob76f880cb39b025ac5712355272bbddb3cbb72abd
1 /*
2 *************************************************************************
3 * Ralink Tech Inc.
4 * 5F., No.36, Taiyuan St., Jhubei City,
5 * Hsinchu County 302,
6 * Taiwan, R.O.C.
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. *
14 * *
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. *
19 * *
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. *
24 * *
25 *************************************************************************
27 Module Name:
28 rtmp_wep.c
30 Abstract:
32 Revision History:
33 Who When What
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
108 u8 WEPKEY[] = {
109 //IV
110 0x00, 0x11, 0x22,
111 //WEP KEY
112 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC
117 ========================================================================
119 Routine Description:
120 Init WEP function.
122 Arguments:
123 pAd Pointer to our adapter
124 pKey Pointer to the WEP KEY
125 KeyId WEP Key ID
126 KeyLen the length of WEP KEY
127 pDest Pointer to the destination which Encryption data will store in.
129 Return Value:
130 None
132 IRQL = DISPATCH_LEVEL
134 Note:
136 ========================================================================
138 void RTMPInitWepEngine(struct rt_rtmp_adapter *pAd,
139 u8 *pKey,
140 u8 KeyId, u8 KeyLen, IN u8 *pDest)
142 u32 i;
143 u8 WEPKEY[] = {
144 /*IV */
145 0x00, 0x11, 0x22,
146 /*WEP KEY */
147 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
148 0xAA, 0xBB, 0xCC
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 ========================================================================
169 Routine Description:
170 Encrypt transimitted data
172 Arguments:
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
178 Return Value:
179 None
181 IRQL = DISPATCH_LEVEL
183 Note:
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 ========================================================================
198 Routine Description:
199 Decrypt received WEP data
201 Arguments:
202 pAdapter Pointer to our adapter
203 pSrc Pointer to the received data
204 Len the length of the received data
206 Return Value:
207 TRUE Decrypt WEP data success
208 FALSE Decrypt WEP data failed
210 Note:
212 ========================================================================
214 BOOLEAN RTMPSoftDecryptWEP(struct rt_rtmp_adapter *pAd,
215 u8 *pData,
216 unsigned long DataByteCnt, struct rt_cipher_key *pGroupKey)
218 u32 trailfcs;
219 u32 crc32;
220 u8 KeyIdx;
221 u8 WEPKEY[] = {
222 /*IV */
223 0x00, 0x11, 0x22,
224 /*WEP KEY */
225 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
226 0xAA, 0xBB, 0xCC
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)
235 return (FALSE);
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,
242 payload_len - 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. */
249 return (FALSE);
251 return (TRUE);
255 ========================================================================
257 Routine Description:
258 The Stream Cipher Encryption Algorithm "struct rt_arcfour" initialize
260 Arguments:
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
265 Return Value:
266 None
268 IRQL = DISPATCH_LEVEL
270 Note:
272 ========================================================================
274 void ARCFOUR_INIT(struct rt_arcfourcontext *Ctx, u8 *pKey, u32 KeyLen)
276 u8 t, u;
277 u32 keyindex;
278 u32 stateindex;
279 u8 *state;
280 u32 counter;
282 state = Ctx->STATE;
283 Ctx->X = 0;
284 Ctx->Y = 0;
285 for (counter = 0; counter < 256; counter++)
286 state[counter] = (u8)counter;
287 keyindex = 0;
288 stateindex = 0;
289 for (counter = 0; counter < 256; counter++) {
290 t = state[counter];
291 stateindex = (stateindex + pKey[keyindex] + t) & 0xff;
292 u = state[stateindex];
293 state[stateindex] = t;
294 state[counter] = u;
295 if (++keyindex >= KeyLen)
296 keyindex = 0;
301 ========================================================================
303 Routine Description:
304 Get bytes from struct rt_arcfour CONTEXT (S-BOX)
306 Arguments:
307 Ctx Pointer to struct rt_arcfour CONTEXT (SBOX)
309 Return Value:
310 u8 - the value of the struct rt_arcfour CONTEXT (S-BOX)
312 Note:
314 ========================================================================
316 u8 ARCFOUR_BYTE(struct rt_arcfourcontext *Ctx)
318 u32 x;
319 u32 y;
320 u8 sx, sy;
321 u8 *state;
323 state = Ctx->STATE;
324 x = (Ctx->X + 1) & 0xff;
325 sx = state[x];
326 y = (sx + Ctx->Y) & 0xff;
327 sy = state[y];
328 Ctx->X = x;
329 Ctx->Y = y;
330 state[y] = sx;
331 state[x] = sy;
333 return (state[(sx + sy) & 0xff]);
338 ========================================================================
340 Routine Description:
341 The Stream Cipher Decryption Algorithm
343 Arguments:
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
349 Return Value:
350 None
352 Note:
354 ========================================================================
356 void ARCFOUR_DECRYPT(struct rt_arcfourcontext *Ctx,
357 u8 *pDest, u8 *pSrc, u32 Len)
359 u32 i;
361 for (i = 0; i < Len; i++)
362 pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
366 ========================================================================
368 Routine Description:
369 The Stream Cipher Encryption Algorithm
371 Arguments:
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
377 Return Value:
378 None
380 IRQL = DISPATCH_LEVEL
382 Note:
384 ========================================================================
386 void ARCFOUR_ENCRYPT(struct rt_arcfourcontext *Ctx,
387 u8 *pDest, u8 *pSrc, u32 Len)
389 u32 i;
391 for (i = 0; i < Len; i++)
392 pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
396 ========================================================================
398 Routine Description:
399 The Stream Cipher Encryption Algorithm which conform to the special requirement to encrypt GTK.
401 Arguments:
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)
413 u32 i;
414 /*discard first 256 bytes */
415 for (i = 0; i < 256; i++)
416 ARCFOUR_BYTE(Ctx);
418 for (i = 0; i < Len; i++)
419 pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
423 ========================================================================
425 Routine Description:
426 Calculate a new FCS given the current FCS and the new data.
428 Arguments:
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
433 Return Value:
434 u32 - FCS 32 bits
436 IRQL = DISPATCH_LEVEL
438 Note:
440 ========================================================================
442 u32 RTMP_CALC_FCS32(u32 Fcs, u8 *Cp, int Len)
444 while (Len--)
445 Fcs = (((Fcs) >> 8) ^ FCSTAB_32[((Fcs) ^ (*Cp++)) & 0xff]);
447 return (Fcs);
451 ========================================================================
453 Routine Description:
454 Get last FCS and encrypt it to the destination
456 Arguments:
457 pDest Pointer to the Destination
459 Return Value:
460 None
462 Note:
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);