1 /*************************************************************************
3 * 4F, No. 2 Technology 5th Rd. *
4 * Science-based Industrial Park *
5 * Hsin-chu, Taiwan, R.O.C. *
7 * (c) Copyright 2002, Ralink Technology, Inc. *
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. *
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. *
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. *
24 *************************************************************************
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
111 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC
116 ========================================================================
122 pAdapter Pointer to our adapter
123 pKey Pointer to the WEP KEY
125 KeyLen the length of WEP KEY
126 pDest Pointer to the destination which Encryption data will store in.
133 ========================================================================
135 VOID
RTMPInitWepEngine(
136 IN PRTMP_ADAPTER pAdapter
,
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 ========================================================================
160 Encrypt transimitted data
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
173 ========================================================================
175 VOID
RTMPEncryptData(
176 IN PRTMP_ADAPTER pAdapter
,
181 pAdapter
->PrivateInfo
.FCSCRC32
= RTMP_CALC_FCS32(pAdapter
->PrivateInfo
.FCSCRC32
, pSrc
, Len
);
182 ARCFOUR_ENCRYPT(&pAdapter
->PrivateInfo
.WEPCONTEXT
, pDest
, pSrc
, Len
);
186 ========================================================================
189 Decrypt received data
192 pAdapter Pointer to our adapter
193 pSrc Pointer to the received data
194 Len the length of the received data
197 TRUE Decrypt WEP data success
198 FALSE Decrypt WEP data failed
202 ========================================================================
204 BOOLEAN
RTMPDecryptData(
205 IN PRTMP_ADAPTER pAdapter
,
213 NdisMoveMemory(WEPKEY
, pSrc
, 3); //Get WEP IV
215 KeyIdx
= (*(pSrc
+ 3) & 0xc0) >> 6;
216 if (pAdapter
->PortCfg
.SharedKey
[KeyIdx
].KeyLen
== 0)
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 */
226 if(crc32
!= trailfcs
)
228 if(crc32
!= SWAP32(trailfcs
))
231 DBGPRINT(RT_DEBUG_TRACE
, "! WEP Data CRC Error !\n"); //CRC error.
238 ========================================================================
241 The Stream Cipher Encryption Algorithm "ARCFOUR" initialize
244 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
245 pKey Pointer to the WEP KEY
246 KeyLen Indicate the length fo the WEP KEY
253 ========================================================================
256 IN PARCFOURCONTEXT Ctx
,
269 for (counter
= 0; counter
< 256; counter
++)
270 state
[counter
] = (UCHAR
)counter
;
273 for (counter
= 0; counter
< 256; counter
++)
276 stateindex
= (stateindex
+ pKey
[keyindex
] + t
) & 0xff;
277 u
= state
[stateindex
];
278 state
[stateindex
] = t
;
280 if (++keyindex
>= KeyLen
)
286 ========================================================================
289 Get bytes from ARCFOUR CONTEXT (S-BOX)
292 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
295 UCHAR - the value of the ARCFOUR CONTEXT (S-BOX)
299 ========================================================================
302 IN PARCFOURCONTEXT Ctx
)
310 x
= (Ctx
->X
+ 1) & 0xff;
312 y
= (sx
+ Ctx
->Y
) & 0xff;
319 return(state
[(sx
+ sy
) & 0xff]);
324 ========================================================================
327 The Stream Cipher Decryption Algorithm
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
340 ========================================================================
342 VOID
ARCFOUR_DECRYPT(
343 IN PARCFOURCONTEXT Ctx
,
350 for (i
= 0; i
< Len
; i
++)
351 pDest
[i
] = pSrc
[i
] ^ ARCFOUR_BYTE(Ctx
);
355 ========================================================================
358 The Stream Cipher Encryption Algorithm
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
371 ========================================================================
373 VOID
ARCFOUR_ENCRYPT(
374 IN PARCFOURCONTEXT Ctx
,
381 for (i
= 0; i
< Len
; i
++)
382 pDest
[i
] = pSrc
[i
] ^ ARCFOUR_BYTE(Ctx
);
386 ========================================================================
389 Calculate a new FCS given the current FCS and the new data.
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
401 ========================================================================
403 ULONG
RTMP_CALC_FCS32(
409 Fcs
= (((Fcs
) >> 8) ^ FCSTAB_32
[((Fcs
) ^ (*Cp
++)) & 0xff]);
416 ========================================================================
419 Get last FCS and encrypt it to the destination
422 pDest Pointer to the Destination
429 ========================================================================
432 IN PRTMP_ADAPTER pAdapter
,
435 pAdapter
->PrivateInfo
.FCSCRC32
^= 0xffffffff; /* complement */
438 pAdapter
->PrivateInfo
.FCSCRC32
= SWAP32(pAdapter
->PrivateInfo
.FCSCRC32
);
441 ARCFOUR_ENCRYPT(&pAdapter
->PrivateInfo
.WEPCONTEXT
, pDest
, (PUCHAR
) &pAdapter
->PrivateInfo
.FCSCRC32
, 4);