blob: 0345e3247f4d4638f170e2d98392f03b5d5e7d78 [file] [log] [blame]
Forest Bond5449c682009-04-25 10:30:44 -04001/*
2 * File: rc4.c
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * Purpose:
19 *
20 * Functions:
21 *
22 * Revision History:
23 *
24 * Author: Kyle Hsu
25 *
26 * Date: Sep 4, 2002
27 *
28 */
29
30#if !defined(__RC4_H__)
31#include "rc4.h"
32#endif
33
34VOID rc4_init(PRC4Ext pRC4, PBYTE pbyKey, UINT cbKey_len)
35{
36 UINT ust1, ust2;
37 UINT keyindex;
38 UINT stateindex;
39 PBYTE pbyst;
40 UINT idx;
41
42 pbyst = pRC4->abystate;
43 pRC4->ux = 0;
44 pRC4->uy = 0;
45 for (idx = 0; idx < 256; idx++)
46 pbyst[idx] = (BYTE)idx;
47 keyindex = 0;
48 stateindex = 0;
49 for (idx = 0; idx < 256; idx++) {
50 ust1 = pbyst[idx];
51 stateindex = (stateindex + pbyKey[keyindex] + ust1) & 0xff;
52 ust2 = pbyst[stateindex];
53 pbyst[stateindex] = (BYTE)ust1;
54 pbyst[idx] = (BYTE)ust2;
55 if (++keyindex >= cbKey_len)
56 keyindex = 0;
57 }
58}
59
60UINT rc4_byte(PRC4Ext pRC4)
61{
62 UINT ux;
63 UINT uy;
64 UINT ustx, usty;
65 PBYTE pbyst;
66
67 pbyst = pRC4->abystate;
68 ux = (pRC4->ux + 1) & 0xff;
69 ustx = pbyst[ux];
70 uy = (ustx + pRC4->uy) & 0xff;
71 usty = pbyst[uy];
72 pRC4->ux = ux;
73 pRC4->uy = uy;
74 pbyst[uy] = (BYTE)ustx;
75 pbyst[ux] = (BYTE)usty;
76
77 return pbyst[(ustx + usty) & 0xff];
78}
79
80VOID rc4_encrypt(PRC4Ext pRC4, PBYTE pbyDest,
81 PBYTE pbySrc, UINT cbData_len)
82{
83 UINT ii;
84 for (ii = 0; ii < cbData_len; ii++)
85 pbyDest[ii] = (BYTE)(pbySrc[ii] ^ rc4_byte(pRC4));
86}