2 ***************************************************************************
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 ***************************************************************************
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
103 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC
108 ========================================================================
114 pAdapter Pointer to our adapter
115 pKey Pointer to the WEP KEY
117 KeyLen the length of WEP KEY
118 pDest Pointer to the destination which Encryption data will store in.
125 ========================================================================
127 VOID
RTMPInitWepEngine(
128 IN PRTMP_ADAPTER pAdapter
,
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 ========================================================================
152 Encrypt transimitted data
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
165 ========================================================================
167 VOID
RTMPEncryptData(
168 IN PRTMP_ADAPTER pAdapter
,
173 pAdapter
->PrivateInfo
.FCSCRC32
= RTMP_CALC_FCS32(pAdapter
->PrivateInfo
.FCSCRC32
, pSrc
, Len
);
174 ARCFOUR_ENCRYPT(&pAdapter
->PrivateInfo
.WEPCONTEXT
, pDest
, pSrc
, Len
);
178 ========================================================================
181 Decrypt received data
184 pAdapter Pointer to our adapter
185 pSrc Pointer to the received data
186 Len the length of the received data
189 TRUE Decrypt WEP data success
190 FALSE Decrypt WEP data failed
194 ========================================================================
196 BOOLEAN
RTMPDecryptData(
197 IN PRTMP_ADAPTER pAdapter
,
205 NdisMoveMemory(WEPKEY
, pSrc
, 3); //Get WEP IV
207 KeyIdx
= (*(pSrc
+ 3) & 0xc0) >> 6;
208 if (pAdapter
->PortCfg
.SharedKey
[KeyIdx
].KeyLen
== 0)
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 */
218 if(crc32
!= trailfcs
)
220 if(crc32
!= SWAP32(trailfcs
))
223 DBGPRINT(RT_DEBUG_TRACE
, "! WEP Data CRC Error !\n"); //CRC error.
230 ========================================================================
233 The Stream Cipher Encryption Algorithm "ARCFOUR" initialize
236 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
237 pKey Pointer to the WEP KEY
238 KeyLen Indicate the length fo the WEP KEY
245 ========================================================================
248 IN PARCFOURCONTEXT Ctx
,
261 for (counter
= 0; counter
< 256; counter
++)
262 state
[counter
] = (UCHAR
)counter
;
265 for (counter
= 0; counter
< 256; counter
++)
268 stateindex
= (stateindex
+ pKey
[keyindex
] + t
) & 0xff;
269 u
= state
[stateindex
];
270 state
[stateindex
] = t
;
272 if (++keyindex
>= KeyLen
)
278 ========================================================================
281 Get bytes from ARCFOUR CONTEXT (S-BOX)
284 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
287 UCHAR - the value of the ARCFOUR CONTEXT (S-BOX)
291 ========================================================================
294 IN PARCFOURCONTEXT Ctx
)
302 x
= (Ctx
->X
+ 1) & 0xff;
304 y
= (sx
+ Ctx
->Y
) & 0xff;
311 return(state
[(sx
+ sy
) & 0xff]);
316 ========================================================================
319 The Stream Cipher Decryption Algorithm
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
332 ========================================================================
334 VOID
ARCFOUR_DECRYPT(
335 IN PARCFOURCONTEXT Ctx
,
342 for (i
= 0; i
< Len
; i
++)
343 pDest
[i
] = pSrc
[i
] ^ ARCFOUR_BYTE(Ctx
);
347 ========================================================================
350 The Stream Cipher Encryption Algorithm
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
363 ========================================================================
365 VOID
ARCFOUR_ENCRYPT(
366 IN PARCFOURCONTEXT Ctx
,
373 for (i
= 0; i
< Len
; i
++)
374 pDest
[i
] = pSrc
[i
] ^ ARCFOUR_BYTE(Ctx
);
378 ========================================================================
381 Calculate a new FCS given the current FCS and the new data.
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
393 ========================================================================
395 ULONG
RTMP_CALC_FCS32(
401 Fcs
= (((Fcs
) >> 8) ^ FCSTAB_32
[((Fcs
) ^ (*Cp
++)) & 0xff]);
408 ========================================================================
411 Get last FCS and encrypt it to the destination
414 pDest Pointer to the Destination
421 ========================================================================
424 IN PRTMP_ADAPTER pAdapter
,
427 pAdapter
->PrivateInfo
.FCSCRC32
^= 0xffffffff; /* complement */
430 pAdapter
->PrivateInfo
.FCSCRC32
= SWAP32(pAdapter
->PrivateInfo
.FCSCRC32
);
433 ARCFOUR_ENCRYPT(&pAdapter
->PrivateInfo
.WEPCONTEXT
, pDest
, (PUCHAR
) &pAdapter
->PrivateInfo
.FCSCRC32
, 4);