blob: 05a921410caa13c8aac8a41ec62ed5d1428d323b [file] [log] [blame]
Greg Kroah-Hartman91980992008-10-28 14:48:09 -07001/*
2 *************************************************************************
3 * Ralink Tech Inc.
4 * 5F., No.36, Taiyuan St., Jhubei City,
5 * Hsinchu County 302,
6 * Taiwan, R.O.C.
7 *
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
9 *
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 *************************************************************************
26
27 Module Name:
28 rtmp_wep.c
29
30 Abstract:
31
32 Revision History:
33 Who When What
34 -------- ---------- ----------------------------------------------
35 Paul Wu 10-28-02 Initial
36*/
37
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +020038#include "../rt_config.h"
Greg Kroah-Hartman91980992008-10-28 14:48:09 -070039
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -080040u32 FCSTAB_32[256] = {
Greg Kroah-Hartman91980992008-10-28 14:48:09 -070041 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
105};
106
107/*
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800108u8 WEPKEY[] = {
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200109 //IV
110 0x00, 0x11, 0x22,
111 //WEP KEY
112 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC
113 };
114 */
115
116/*
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700117 ========================================================================
118
119 Routine Description:
120 Init WEP function.
121
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.
128
129 Return Value:
130 None
131
132 IRQL = DISPATCH_LEVEL
133
134 Note:
135
136 ========================================================================
137*/
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800138void RTMPInitWepEngine(IN PRTMP_ADAPTER pAd,
139 u8 *pKey,
140 u8 KeyId, u8 KeyLen, IN u8 *pDest)
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700141{
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800142 u32 i;
143 u8 WEPKEY[] = {
Bartlomiej Zolnierkiewiczec278fa2009-12-11 12:23:15 -0800144 /*IV */
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700145 0x00, 0x11, 0x22,
Bartlomiej Zolnierkiewiczec278fa2009-12-11 12:23:15 -0800146 /*WEP KEY */
Bartlomiej Zolnierkiewicz96b3c83d2009-12-11 12:23:13 -0800147 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
148 0xAA, 0xBB, 0xCC
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700149 };
150
Bartlomiej Zolnierkiewiczec278fa2009-12-11 12:23:15 -0800151 pAd->PrivateInfo.FCSCRC32 = PPPINITFCS32; /*Init crc32. */
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700152
Bartlomiej Zolnierkiewicz96b3c83d2009-12-11 12:23:13 -0800153 {
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700154 NdisMoveMemory(WEPKEY + 3, pKey, KeyLen);
155
Bartlomiej Zolnierkiewicz96b3c83d2009-12-11 12:23:13 -0800156 for (i = 0; i < 3; i++)
Bartlomiej Zolnierkiewiczec278fa2009-12-11 12:23:15 -0800157 WEPKEY[i] = RandomByte(pAd); /*Call mlme RandomByte() function. */
158 ARCFOUR_INIT(&pAd->PrivateInfo.WEPCONTEXT, WEPKEY, KeyLen + 3); /*INIT SBOX, KEYLEN+3(IV) */
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700159
Bartlomiej Zolnierkiewiczec278fa2009-12-11 12:23:15 -0800160 NdisMoveMemory(pDest, WEPKEY, 3); /*Append Init Vector */
Bartlomiej Zolnierkiewicz96b3c83d2009-12-11 12:23:13 -0800161 }
Bartlomiej Zolnierkiewiczec278fa2009-12-11 12:23:15 -0800162 *(pDest + 3) = (KeyId << 6); /*Append KEYID */
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700163
164}
165
166/*
167 ========================================================================
168
169 Routine Description:
170 Encrypt transimitted data
171
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
177
178 Return Value:
179 None
180
181 IRQL = DISPATCH_LEVEL
182
183 Note:
184
185 ========================================================================
186*/
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800187void RTMPEncryptData(IN PRTMP_ADAPTER pAd,
188 u8 *pSrc, u8 *pDest, u32 Len)
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700189{
Bartlomiej Zolnierkiewicz96b3c83d2009-12-11 12:23:13 -0800190 pAd->PrivateInfo.FCSCRC32 =
191 RTMP_CALC_FCS32(pAd->PrivateInfo.FCSCRC32, pSrc, Len);
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700192 ARCFOUR_ENCRYPT(&pAd->PrivateInfo.WEPCONTEXT, pDest, pSrc, Len);
193}
194
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700195/*
196 ========================================================================
197
198 Routine Description:
199 Decrypt received WEP data
200
201 Arguments:
202 pAdapter Pointer to our adapter
203 pSrc Pointer to the received data
204 Len the length of the received data
205
206 Return Value:
207 TRUE Decrypt WEP data success
208 FALSE Decrypt WEP data failed
209
210 Note:
211
212 ========================================================================
213*/
Bartlomiej Zolnierkiewicz96b3c83d2009-12-11 12:23:13 -0800214BOOLEAN RTMPSoftDecryptWEP(IN PRTMP_ADAPTER pAd,
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800215 u8 *pData,
216 unsigned long DataByteCnt, IN PCIPHER_KEY pGroupKey)
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700217{
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800218 u32 trailfcs;
219 u32 crc32;
220 u8 KeyIdx;
221 u8 WEPKEY[] = {
Bartlomiej Zolnierkiewiczec278fa2009-12-11 12:23:15 -0800222 /*IV */
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700223 0x00, 0x11, 0x22,
Bartlomiej Zolnierkiewiczec278fa2009-12-11 12:23:15 -0800224 /*WEP KEY */
Bartlomiej Zolnierkiewicz96b3c83d2009-12-11 12:23:13 -0800225 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
226 0xAA, 0xBB, 0xCC
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700227 };
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800228 u8 *pPayload = (u8 *) pData + LENGTH_802_11;
229 unsigned long payload_len = DataByteCnt - LENGTH_802_11;
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700230
Bartlomiej Zolnierkiewiczec278fa2009-12-11 12:23:15 -0800231 NdisMoveMemory(WEPKEY, pPayload, 3); /*Get WEP IV */
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700232
233 KeyIdx = (*(pPayload + 3) & 0xc0) >> 6;
234 if (pGroupKey[KeyIdx].KeyLen == 0)
235 return (FALSE);
236
Bartlomiej Zolnierkiewicz96b3c83d2009-12-11 12:23:13 -0800237 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);
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700243 NdisMoveMemory(&trailfcs, pPayload + payload_len - 8, 4);
Bartlomiej Zolnierkiewiczec278fa2009-12-11 12:23:15 -0800244 crc32 = RTMP_CALC_FCS32(PPPINITFCS32, pPayload, payload_len - 8); /*Skip last 4 bytes(FCS). */
Bartlomiej Zolnierkiewicz96b3c83d2009-12-11 12:23:13 -0800245 crc32 ^= 0xffffffff; /* complement */
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700246
Bartlomiej Zolnierkiewicz96b3c83d2009-12-11 12:23:13 -0800247 if (crc32 != cpu2le32(trailfcs)) {
Bartlomiej Zolnierkiewiczec278fa2009-12-11 12:23:15 -0800248 DBGPRINT(RT_DEBUG_TRACE, ("! WEP Data CRC Error !\n")); /*CRC error. */
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700249 return (FALSE);
250 }
251 return (TRUE);
252}
253
254/*
255 ========================================================================
256
257 Routine Description:
258 The Stream Cipher Encryption Algorithm "ARCFOUR" initialize
259
260 Arguments:
261 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
262 pKey Pointer to the WEP KEY
263 KeyLen Indicate the length fo the WEP KEY
264
265 Return Value:
266 None
267
268 IRQL = DISPATCH_LEVEL
269
270 Note:
271
272 ========================================================================
273*/
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800274void ARCFOUR_INIT(IN PARCFOURCONTEXT Ctx, u8 *pKey, u32 KeyLen)
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700275{
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800276 u8 t, u;
277 u32 keyindex;
278 u32 stateindex;
279 u8 *state;
280 u32 counter;
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700281
282 state = Ctx->STATE;
283 Ctx->X = 0;
284 Ctx->Y = 0;
285 for (counter = 0; counter < 256; counter++)
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800286 state[counter] = (u8)counter;
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700287 keyindex = 0;
288 stateindex = 0;
Bartlomiej Zolnierkiewicz96b3c83d2009-12-11 12:23:13 -0800289 for (counter = 0; counter < 256; counter++) {
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700290 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;
297 }
298}
299
300/*
301 ========================================================================
302
303 Routine Description:
304 Get bytes from ARCFOUR CONTEXT (S-BOX)
305
306 Arguments:
307 Ctx Pointer to ARCFOUR CONTEXT (SBOX)
308
309 Return Value:
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800310 u8 - the value of the ARCFOUR CONTEXT (S-BOX)
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700311
312 Note:
313
314 ========================================================================
315*/
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800316u8 ARCFOUR_BYTE(IN PARCFOURCONTEXT Ctx)
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700317{
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800318 u32 x;
319 u32 y;
320 u8 sx, sy;
321 u8 *state;
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700322
Bartlomiej Zolnierkiewicz96b3c83d2009-12-11 12:23:13 -0800323 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;
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700332
Bartlomiej Zolnierkiewicz96b3c83d2009-12-11 12:23:13 -0800333 return (state[(sx + sy) & 0xff]);
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700334
335}
336
337/*
338 ========================================================================
339
340 Routine Description:
341 The Stream Cipher Decryption Algorithm
342
343 Arguments:
344 Ctx Pointer to 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
348
349 Return Value:
350 None
351
352 Note:
353
354 ========================================================================
355*/
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800356void ARCFOUR_DECRYPT(IN PARCFOURCONTEXT Ctx,
357 u8 *pDest, u8 *pSrc, u32 Len)
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700358{
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800359 u32 i;
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700360
361 for (i = 0; i < Len; i++)
362 pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
363}
364
365/*
366 ========================================================================
367
368 Routine Description:
369 The Stream Cipher Encryption Algorithm
370
371 Arguments:
372 Ctx Pointer to 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
376
377 Return Value:
378 None
379
380 IRQL = DISPATCH_LEVEL
381
382 Note:
383
384 ========================================================================
385*/
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800386void ARCFOUR_ENCRYPT(IN PARCFOURCONTEXT Ctx,
387 u8 *pDest, u8 *pSrc, u32 Len)
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700388{
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800389 u32 i;
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700390
391 for (i = 0; i < Len; i++)
392 pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
393}
394
395/*
396 ========================================================================
397
398 Routine Description:
399 The Stream Cipher Encryption Algorithm which conform to the special requirement to encrypt GTK.
400
401 Arguments:
402 Ctx Pointer to 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
406
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700407 ========================================================================
408*/
409
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800410void WPAARCFOUR_ENCRYPT(IN PARCFOURCONTEXT Ctx,
411 u8 *pDest, u8 *pSrc, u32 Len)
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700412{
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800413 u32 i;
Bartlomiej Zolnierkiewiczec278fa2009-12-11 12:23:15 -0800414 /*discard first 256 bytes */
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700415 for (i = 0; i < 256; i++)
Bartlomiej Zolnierkiewicz96b3c83d2009-12-11 12:23:13 -0800416 ARCFOUR_BYTE(Ctx);
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700417
418 for (i = 0; i < Len; i++)
419 pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
420}
421
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700422/*
423 ========================================================================
424
425 Routine Description:
426 Calculate a new FCS given the current FCS and the new data.
427
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
432
433 Return Value:
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800434 u32 - FCS 32 bits
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700435
436 IRQL = DISPATCH_LEVEL
437
438 Note:
439
440 ========================================================================
441*/
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800442u32 RTMP_CALC_FCS32(u32 Fcs, u8 *Cp, int Len)
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700443{
444 while (Len--)
Bartlomiej Zolnierkiewicz96b3c83d2009-12-11 12:23:13 -0800445 Fcs = (((Fcs) >> 8) ^ FCSTAB_32[((Fcs) ^ (*Cp++)) & 0xff]);
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700446
447 return (Fcs);
448}
449
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700450/*
451 ========================================================================
452
453 Routine Description:
454 Get last FCS and encrypt it to the destination
455
456 Arguments:
457 pDest Pointer to the Destination
458
459 Return Value:
460 None
461
462 Note:
463
464 ========================================================================
465*/
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800466void RTMPSetICV(IN PRTMP_ADAPTER pAd, u8 *pDest)
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700467{
Bartlomiej Zolnierkiewicz96b3c83d2009-12-11 12:23:13 -0800468 pAd->PrivateInfo.FCSCRC32 ^= 0xffffffff; /* complement */
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700469 pAd->PrivateInfo.FCSCRC32 = cpu2le32(pAd->PrivateInfo.FCSCRC32);
470
Bartlomiej Zolnierkiewicz96b3c83d2009-12-11 12:23:13 -0800471 ARCFOUR_ENCRYPT(&pAd->PrivateInfo.WEPCONTEXT, pDest,
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800472 (u8 *)& pAd->PrivateInfo.FCSCRC32, 4);
Greg Kroah-Hartman91980992008-10-28 14:48:09 -0700473}