MOXA linux-2.6.x / linux-2.6.9-uc0 from sdlinux-moxaart.tgz
[linux-2.6.9-moxart.git] / drivers / net / wireless / rtlink / rtmp_wep.c
blobc147ac34eec7448ecd1229cf58e1880180c854cd
1 /*************************************************************************
2 * Ralink Tech Inc. *
3 * 4F, No. 2 Technology 5th Rd. *
4 * Science-based Industrial Park *
5 * Hsin-chu, Taiwan, R.O.C. *
6 * *
7 * (c) Copyright 2002, Ralink Technology, Inc. *
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 * This program is distributed in the hope that it will be useful, *
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
17 * GNU General Public License for more details. *
18 * *
19 * You should have received a copy of the GNU General Public License *
20 * along with this program; if not, write to the *
21 * Free Software Foundation, Inc., *
22 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
23 * *
24 *************************************************************************
26 Module Name:
27 rtmp_wep.c
29 Abstract:
31 Revision History:
32 Who When What
33 -------- ---------- ----------------------------------------------
34 Paul Wu 10-28-02 Initial
37 #include "rt_config.h"
39 ULONG 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
107 UCHAR WEPKEY[] = {
108 //IV
109 0x00, 0x11, 0x22,
110 //WEP KEY
111 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC
116 ========================================================================
118 Routine Description:
119 Init WEP function.
121 Arguments:
122 pAdapter Pointer to our adapter
123 pKey Pointer to the WEP KEY
124 KeyId WEP Key ID
125 KeyLen the length of WEP KEY
126 pDest Pointer to the destination which Encryption data will store in.
128 Return Value:
129 None
131 Note:
133 ========================================================================
135 VOID RTMPInitWepEngine(
136 IN PRTMP_ADAPTER pAdapter,
137 IN PUCHAR pKey,
138 IN UCHAR KeyId,
139 IN UCHAR KeyLen,
140 IN OUT PUCHAR pDest)
142 UINT i;
144 pAdapter->PrivateInfo.FCSCRC32 = PPPINITFCS32; //Init crc32.
145 NdisMoveMemory(WEPKEY + 3, pKey, KeyLen);
147 for(i = 0; i < 3; i++)
148 WEPKEY[i] = RandomByte(pAdapter); //Call mlme RandomByte() function.
149 ARCFOUR_INIT(&pAdapter->PrivateInfo.WEPCONTEXT, WEPKEY, KeyLen + 3); //INIT SBOX, KEYLEN+3(IV)
151 NdisMoveMemory(pDest, WEPKEY, 3); //Append Init Vector
152 *(pDest+3) = (KeyId << 6); //Append KEYID
157 ========================================================================
159 Routine Description:
160 Encrypt transimitted data
162 Arguments:
163 pAdapter Pointer to our adapter
164 pSrc Pointer to the transimitted source data that will be encrypt
165 pDest Pointer to the destination where entryption data will be store in.
166 Len Indicate the length of the source data
168 Return Value:
169 None
171 Note:
173 ========================================================================
175 VOID RTMPEncryptData(
176 IN PRTMP_ADAPTER pAdapter,
177 IN PUCHAR pSrc,
178 IN PUCHAR pDest,
179 IN UINT Len)
181 pAdapter->PrivateInfo.FCSCRC32 = RTMP_CALC_FCS32(pAdapter->PrivateInfo.FCSCRC32, pSrc, Len);
182 ARCFOUR_ENCRYPT(&pAdapter->PrivateInfo.WEPCONTEXT, pDest, pSrc, Len);
186 ========================================================================
188 Routine Description:
189 Decrypt received data
191 Arguments:
192 pAdapter Pointer to our adapter
193 pSrc Pointer to the received data
194 Len the length of the received data
196 Return Value:
197 TRUE Decrypt WEP data success
198 FALSE Decrypt WEP data failed
200 Note:
202 ========================================================================
204 BOOLEAN RTMPDecryptData(
205 IN PRTMP_ADAPTER pAdapter,
206 IN PUCHAR pSrc,
207 IN UINT Len)
209 ULONG trailfcs;
210 ULONG crc32;
211 UCHAR KeyIdx;
213 NdisMoveMemory(WEPKEY, pSrc, 3); //Get WEP IV
215 KeyIdx = (*(pSrc + 3) & 0xc0) >> 6;
216 if (pAdapter->PortCfg.SharedKey[KeyIdx].KeyLen == 0)
217 return (FALSE);
219 NdisMoveMemory(WEPKEY + 3, pAdapter->PortCfg.SharedKey[KeyIdx].Key, pAdapter->PortCfg.SharedKey[KeyIdx].KeyLen);
220 ARCFOUR_INIT(&pAdapter->PrivateInfo.WEPCONTEXT, WEPKEY, pAdapter->PortCfg.SharedKey[KeyIdx].KeyLen + 3);
221 ARCFOUR_DECRYPT(&pAdapter->PrivateInfo.WEPCONTEXT, pSrc, pSrc + 4, Len - 4);
222 NdisMoveMemory(&trailfcs, pSrc + Len - 8, 4);
223 crc32 = RTMP_CALC_FCS32(PPPINITFCS32, pSrc, Len - 8); //Skip last 4 bytes(FCS).
224 crc32 ^= 0xffffffff; /* complement */
225 #ifndef BIG_ENDIAN
226 if(crc32 != trailfcs)
227 #else
228 if(crc32 != SWAP32(trailfcs))
229 #endif
231 DBGPRINT(RT_DEBUG_TRACE, "! WEP Data CRC Error !\n"); //CRC error.
232 return (FALSE);
234 return (TRUE);
238 ========================================================================
240 Routine Description:
241 The Stream Cipher Encryption Algorithm "ARCFOUR" initialize
243 Arguments:
244 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
245 pKey Pointer to the WEP KEY
246 KeyLen Indicate the length fo the WEP KEY
248 Return Value:
249 None
251 Note:
253 ========================================================================
255 VOID ARCFOUR_INIT(
256 IN PARCFOURCONTEXT Ctx,
257 IN PUCHAR pKey,
258 IN UINT KeyLen)
260 UCHAR t, u;
261 UINT keyindex;
262 UINT stateindex;
263 PUCHAR state;
264 UINT counter;
266 state = Ctx->STATE;
267 Ctx->X = 0;
268 Ctx->Y = 0;
269 for (counter = 0; counter < 256; counter++)
270 state[counter] = (UCHAR)counter;
271 keyindex = 0;
272 stateindex = 0;
273 for (counter = 0; counter < 256; counter++)
275 t = state[counter];
276 stateindex = (stateindex + pKey[keyindex] + t) & 0xff;
277 u = state[stateindex];
278 state[stateindex] = t;
279 state[counter] = u;
280 if (++keyindex >= KeyLen)
281 keyindex = 0;
286 ========================================================================
288 Routine Description:
289 Get bytes from ARCFOUR CONTEXT (S-BOX)
291 Arguments:
292 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
294 Return Value:
295 UCHAR - the value of the ARCFOUR CONTEXT (S-BOX)
297 Note:
299 ========================================================================
301 UCHAR ARCFOUR_BYTE(
302 IN PARCFOURCONTEXT Ctx)
304 UINT x;
305 UINT y;
306 UCHAR sx, sy;
307 PUCHAR state;
309 state = Ctx->STATE;
310 x = (Ctx->X + 1) & 0xff;
311 sx = state[x];
312 y = (sx + Ctx->Y) & 0xff;
313 sy = state[y];
314 Ctx->X = x;
315 Ctx->Y = y;
316 state[y] = sx;
317 state[x] = sy;
319 return(state[(sx + sy) & 0xff]);
324 ========================================================================
326 Routine Description:
327 The Stream Cipher Decryption Algorithm
329 Arguments:
330 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
331 pDest Pointer to the Destination
332 pSrc Pointer to the Source data
333 Len Indicate the length of the Source data
335 Return Value:
336 None
338 Note:
340 ========================================================================
342 VOID ARCFOUR_DECRYPT(
343 IN PARCFOURCONTEXT Ctx,
344 IN PUCHAR pDest,
345 IN PUCHAR pSrc,
346 IN UINT Len)
348 UINT i;
350 for (i = 0; i < Len; i++)
351 pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
355 ========================================================================
357 Routine Description:
358 The Stream Cipher Encryption Algorithm
360 Arguments:
361 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
362 pDest Pointer to the Destination
363 pSrc Pointer to the Source data
364 Len Indicate the length of the Source dta
366 Return Value:
367 None
369 Note:
371 ========================================================================
373 VOID ARCFOUR_ENCRYPT(
374 IN PARCFOURCONTEXT Ctx,
375 IN PUCHAR pDest,
376 IN PUCHAR pSrc,
377 IN UINT Len)
379 UINT i;
381 for (i = 0; i < Len; i++)
382 pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
386 ========================================================================
388 Routine Description:
389 Calculate a new FCS given the current FCS and the new data.
391 Arguments:
392 Fcs the original FCS value
393 Cp pointer to the data which will be calculate the FCS
394 Len the length of the data
396 Return Value:
397 ULONG - FCS 32 bits
399 Note:
401 ========================================================================
403 ULONG RTMP_CALC_FCS32(
404 IN ULONG Fcs,
405 IN PUCHAR Cp,
406 IN INT Len)
408 while (Len--)
409 Fcs = (((Fcs) >> 8) ^ FCSTAB_32[((Fcs) ^ (*Cp++)) & 0xff]);
411 return (Fcs);
416 ========================================================================
418 Routine Description:
419 Get last FCS and encrypt it to the destination
421 Arguments:
422 pDest Pointer to the Destination
424 Return Value:
425 None
427 Note:
429 ========================================================================
431 VOID RTMPSetICV(
432 IN PRTMP_ADAPTER pAdapter,
433 IN PUCHAR pDest)
435 pAdapter->PrivateInfo.FCSCRC32 ^= 0xffffffff; /* complement */
437 #ifdef BIG_ENDIAN
438 pAdapter->PrivateInfo.FCSCRC32 = SWAP32(pAdapter->PrivateInfo.FCSCRC32);
439 #endif
441 ARCFOUR_ENCRYPT(&pAdapter->PrivateInfo.WEPCONTEXT, pDest, (PUCHAR) &pAdapter->PrivateInfo.FCSCRC32, 4);