MOXA linux-2.6.x / linux-2.6.9-uc0 from sdlinux-moxaart.tgz
[linux-2.6.9-moxart.git] / drivers / net / wireless / rtlink.org / rtmp_wep.c
blob9e73232457f7dacc3b2d6bb522134124a653a058
1 /*
2 ***************************************************************************
3 * Ralink Tech Inc.
4 * 4F, No. 2 Technology 5th Rd.
5 * Science-based Industrial Park
6 * Hsin-chu, Taiwan, R.O.C.
8 * (c) Copyright 2002, Ralink Technology, Inc.
10 * All rights reserved. Ralink's source code is an unpublished work and the
11 * use of a copyright notice does not imply otherwise. This source code
12 * contains confidential trade secret material of Ralink Tech. Any attemp
13 * or participation in deciphering, decoding, reverse engineering or in any
14 * way altering the source code is stricitly prohibited, unless the prior
15 * written consent of Ralink Technology, Inc. is obtained.
16 ***************************************************************************
18 Module Name:
19 rtmp_wep.c
21 Abstract:
23 Revision History:
24 Who When What
25 -------- ---------- ----------------------------------------------
26 Paul Wu 10-28-02 Initial
29 #include "rt_config.h"
31 ULONG FCSTAB_32[256] =
33 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
34 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
35 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
36 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
37 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
38 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
39 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
40 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
41 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
42 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
43 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
44 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
45 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
46 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
47 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
48 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
49 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
50 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
51 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
52 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
53 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
54 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
55 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
56 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
57 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
58 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
59 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
60 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
61 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
62 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
63 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
64 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
65 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
66 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
67 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
68 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
69 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
70 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
71 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
72 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
73 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
74 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
75 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
76 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
77 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
78 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
79 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
80 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
81 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
82 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
83 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
84 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
85 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
86 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
87 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
88 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
89 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
90 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
91 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
92 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
93 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
94 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
95 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
96 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
99 UCHAR WEPKEY[] = {
100 //IV
101 0x00, 0x11, 0x22,
102 //WEP KEY
103 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC
108 ========================================================================
110 Routine Description:
111 Init WEP function.
113 Arguments:
114 pAdapter Pointer to our adapter
115 pKey Pointer to the WEP KEY
116 KeyId WEP Key ID
117 KeyLen the length of WEP KEY
118 pDest Pointer to the destination which Encryption data will store in.
120 Return Value:
121 None
123 Note:
125 ========================================================================
127 VOID RTMPInitWepEngine(
128 IN PRTMP_ADAPTER pAdapter,
129 IN PUCHAR pKey,
130 IN UCHAR KeyId,
131 IN UCHAR KeyLen,
132 IN OUT PUCHAR pDest)
134 UINT i;
136 pAdapter->PrivateInfo.FCSCRC32 = PPPINITFCS32; //Init crc32.
137 NdisMoveMemory(WEPKEY + 3, pKey, KeyLen);
139 for(i = 0; i < 3; i++)
140 WEPKEY[i] = RandomByte(pAdapter); //Call mlme RandomByte() function.
141 ARCFOUR_INIT(&pAdapter->PrivateInfo.WEPCONTEXT, WEPKEY, KeyLen + 3); //INIT SBOX, KEYLEN+3(IV)
143 NdisMoveMemory(pDest, WEPKEY, 3); //Append Init Vector
144 *(pDest+3) = (KeyId << 6); //Append KEYID
149 ========================================================================
151 Routine Description:
152 Encrypt transimitted data
154 Arguments:
155 pAdapter Pointer to our adapter
156 pSrc Pointer to the transimitted source data that will be encrypt
157 pDest Pointer to the destination where entryption data will be store in.
158 Len Indicate the length of the source data
160 Return Value:
161 None
163 Note:
165 ========================================================================
167 VOID RTMPEncryptData(
168 IN PRTMP_ADAPTER pAdapter,
169 IN PUCHAR pSrc,
170 IN PUCHAR pDest,
171 IN UINT Len)
173 pAdapter->PrivateInfo.FCSCRC32 = RTMP_CALC_FCS32(pAdapter->PrivateInfo.FCSCRC32, pSrc, Len);
174 ARCFOUR_ENCRYPT(&pAdapter->PrivateInfo.WEPCONTEXT, pDest, pSrc, Len);
178 ========================================================================
180 Routine Description:
181 Decrypt received data
183 Arguments:
184 pAdapter Pointer to our adapter
185 pSrc Pointer to the received data
186 Len the length of the received data
188 Return Value:
189 TRUE Decrypt WEP data success
190 FALSE Decrypt WEP data failed
192 Note:
194 ========================================================================
196 BOOLEAN RTMPDecryptData(
197 IN PRTMP_ADAPTER pAdapter,
198 IN PUCHAR pSrc,
199 IN UINT Len)
201 ULONG trailfcs;
202 ULONG crc32;
203 UCHAR KeyIdx;
205 NdisMoveMemory(WEPKEY, pSrc, 3); //Get WEP IV
207 KeyIdx = (*(pSrc + 3) & 0xc0) >> 6;
208 if (pAdapter->PortCfg.SharedKey[KeyIdx].KeyLen == 0)
209 return (FALSE);
211 NdisMoveMemory(WEPKEY + 3, pAdapter->PortCfg.SharedKey[KeyIdx].Key, pAdapter->PortCfg.SharedKey[KeyIdx].KeyLen);
212 ARCFOUR_INIT(&pAdapter->PrivateInfo.WEPCONTEXT, WEPKEY, pAdapter->PortCfg.SharedKey[KeyIdx].KeyLen + 3);
213 ARCFOUR_DECRYPT(&pAdapter->PrivateInfo.WEPCONTEXT, pSrc, pSrc + 4, Len - 4);
214 NdisMoveMemory(&trailfcs, pSrc + Len - 8, 4);
215 crc32 = RTMP_CALC_FCS32(PPPINITFCS32, pSrc, Len - 8); //Skip last 4 bytes(FCS).
216 crc32 ^= 0xffffffff; /* complement */
217 #ifndef BIG_ENDIAN
218 if(crc32 != trailfcs)
219 #else
220 if(crc32 != SWAP32(trailfcs))
221 #endif
223 DBGPRINT(RT_DEBUG_TRACE, "! WEP Data CRC Error !\n"); //CRC error.
224 return (FALSE);
226 return (TRUE);
230 ========================================================================
232 Routine Description:
233 The Stream Cipher Encryption Algorithm "ARCFOUR" initialize
235 Arguments:
236 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
237 pKey Pointer to the WEP KEY
238 KeyLen Indicate the length fo the WEP KEY
240 Return Value:
241 None
243 Note:
245 ========================================================================
247 VOID ARCFOUR_INIT(
248 IN PARCFOURCONTEXT Ctx,
249 IN PUCHAR pKey,
250 IN UINT KeyLen)
252 UCHAR t, u;
253 UINT keyindex;
254 UINT stateindex;
255 PUCHAR state;
256 UINT counter;
258 state = Ctx->STATE;
259 Ctx->X = 0;
260 Ctx->Y = 0;
261 for (counter = 0; counter < 256; counter++)
262 state[counter] = (UCHAR)counter;
263 keyindex = 0;
264 stateindex = 0;
265 for (counter = 0; counter < 256; counter++)
267 t = state[counter];
268 stateindex = (stateindex + pKey[keyindex] + t) & 0xff;
269 u = state[stateindex];
270 state[stateindex] = t;
271 state[counter] = u;
272 if (++keyindex >= KeyLen)
273 keyindex = 0;
278 ========================================================================
280 Routine Description:
281 Get bytes from ARCFOUR CONTEXT (S-BOX)
283 Arguments:
284 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
286 Return Value:
287 UCHAR - the value of the ARCFOUR CONTEXT (S-BOX)
289 Note:
291 ========================================================================
293 UCHAR ARCFOUR_BYTE(
294 IN PARCFOURCONTEXT Ctx)
296 UINT x;
297 UINT y;
298 UCHAR sx, sy;
299 PUCHAR state;
301 state = Ctx->STATE;
302 x = (Ctx->X + 1) & 0xff;
303 sx = state[x];
304 y = (sx + Ctx->Y) & 0xff;
305 sy = state[y];
306 Ctx->X = x;
307 Ctx->Y = y;
308 state[y] = sx;
309 state[x] = sy;
311 return(state[(sx + sy) & 0xff]);
316 ========================================================================
318 Routine Description:
319 The Stream Cipher Decryption Algorithm
321 Arguments:
322 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
323 pDest Pointer to the Destination
324 pSrc Pointer to the Source data
325 Len Indicate the length of the Source data
327 Return Value:
328 None
330 Note:
332 ========================================================================
334 VOID ARCFOUR_DECRYPT(
335 IN PARCFOURCONTEXT Ctx,
336 IN PUCHAR pDest,
337 IN PUCHAR pSrc,
338 IN UINT Len)
340 UINT i;
342 for (i = 0; i < Len; i++)
343 pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
347 ========================================================================
349 Routine Description:
350 The Stream Cipher Encryption Algorithm
352 Arguments:
353 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
354 pDest Pointer to the Destination
355 pSrc Pointer to the Source data
356 Len Indicate the length of the Source dta
358 Return Value:
359 None
361 Note:
363 ========================================================================
365 VOID ARCFOUR_ENCRYPT(
366 IN PARCFOURCONTEXT Ctx,
367 IN PUCHAR pDest,
368 IN PUCHAR pSrc,
369 IN UINT Len)
371 UINT i;
373 for (i = 0; i < Len; i++)
374 pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
378 ========================================================================
380 Routine Description:
381 Calculate a new FCS given the current FCS and the new data.
383 Arguments:
384 Fcs the original FCS value
385 Cp pointer to the data which will be calculate the FCS
386 Len the length of the data
388 Return Value:
389 ULONG - FCS 32 bits
391 Note:
393 ========================================================================
395 ULONG RTMP_CALC_FCS32(
396 IN ULONG Fcs,
397 IN PUCHAR Cp,
398 IN INT Len)
400 while (Len--)
401 Fcs = (((Fcs) >> 8) ^ FCSTAB_32[((Fcs) ^ (*Cp++)) & 0xff]);
403 return (Fcs);
408 ========================================================================
410 Routine Description:
411 Get last FCS and encrypt it to the destination
413 Arguments:
414 pDest Pointer to the Destination
416 Return Value:
417 None
419 Note:
421 ========================================================================
423 VOID RTMPSetICV(
424 IN PRTMP_ADAPTER pAdapter,
425 IN PUCHAR pDest)
427 pAdapter->PrivateInfo.FCSCRC32 ^= 0xffffffff; /* complement */
429 #ifdef BIG_ENDIAN
430 pAdapter->PrivateInfo.FCSCRC32 = SWAP32(pAdapter->PrivateInfo.FCSCRC32);
431 #endif
433 ARCFOUR_ENCRYPT(&pAdapter->PrivateInfo.WEPCONTEXT, pDest, (PUCHAR) &pAdapter->PrivateInfo.FCSCRC32, 4);