1*80ee5cbfSDavid du Colombier #include "os.h"
2*80ee5cbfSDavid du Colombier #include <libsec.h>
3*80ee5cbfSDavid du Colombier
4*80ee5cbfSDavid du Colombier void
setupRC4state(RC4state * key,uchar * start,int n)5*80ee5cbfSDavid du Colombier setupRC4state(RC4state *key, uchar *start, int n)
6*80ee5cbfSDavid du Colombier {
7*80ee5cbfSDavid du Colombier int t;
8*80ee5cbfSDavid du Colombier int index2;
9*80ee5cbfSDavid du Colombier uchar *state;
10*80ee5cbfSDavid du Colombier uchar *p, *e, *sp, *se;
11*80ee5cbfSDavid du Colombier
12*80ee5cbfSDavid du Colombier state = key->state;
13*80ee5cbfSDavid du Colombier se = &state[256];
14*80ee5cbfSDavid du Colombier for(sp = state; sp < se; sp++)
15*80ee5cbfSDavid du Colombier *sp = sp - state;
16*80ee5cbfSDavid du Colombier
17*80ee5cbfSDavid du Colombier key->x = 0;
18*80ee5cbfSDavid du Colombier key->y = 0;
19*80ee5cbfSDavid du Colombier index2 = 0;
20*80ee5cbfSDavid du Colombier e = start + n;
21*80ee5cbfSDavid du Colombier p = start;
22*80ee5cbfSDavid du Colombier for(sp = state; sp < se; sp++)
23*80ee5cbfSDavid du Colombier {
24*80ee5cbfSDavid du Colombier t = *sp;
25*80ee5cbfSDavid du Colombier index2 = (*p + t + index2) & 255;
26*80ee5cbfSDavid du Colombier *sp = state[index2];
27*80ee5cbfSDavid du Colombier state[index2] = t;
28*80ee5cbfSDavid du Colombier if(++p >= e)
29*80ee5cbfSDavid du Colombier p = start;
30*80ee5cbfSDavid du Colombier }
31*80ee5cbfSDavid du Colombier }
32*80ee5cbfSDavid du Colombier
33*80ee5cbfSDavid du Colombier void
rc4(RC4state * key,uchar * p,int len)34*80ee5cbfSDavid du Colombier rc4(RC4state *key, uchar *p, int len)
35*80ee5cbfSDavid du Colombier {
36*80ee5cbfSDavid du Colombier int tx, ty;
37*80ee5cbfSDavid du Colombier int x, y;
38*80ee5cbfSDavid du Colombier uchar *state;
39*80ee5cbfSDavid du Colombier uchar *e;
40*80ee5cbfSDavid du Colombier
41*80ee5cbfSDavid du Colombier x = key->x;
42*80ee5cbfSDavid du Colombier y = key->y;
43*80ee5cbfSDavid du Colombier state = &key->state[0];
44*80ee5cbfSDavid du Colombier for(e = p + len; p < e; p++)
45*80ee5cbfSDavid du Colombier {
46*80ee5cbfSDavid du Colombier x = (x+1)&255;
47*80ee5cbfSDavid du Colombier tx = state[x];
48*80ee5cbfSDavid du Colombier y = (y+tx)&255;
49*80ee5cbfSDavid du Colombier ty = state[y];
50*80ee5cbfSDavid du Colombier state[x] = ty;
51*80ee5cbfSDavid du Colombier state[y] = tx;
52*80ee5cbfSDavid du Colombier *p ^= state[(tx+ty)&255];
53*80ee5cbfSDavid du Colombier }
54*80ee5cbfSDavid du Colombier key->x = x;
55*80ee5cbfSDavid du Colombier key->y = y;
56*80ee5cbfSDavid du Colombier }
57*80ee5cbfSDavid du Colombier
58*80ee5cbfSDavid du Colombier void
rc4skip(RC4state * key,int len)59*80ee5cbfSDavid du Colombier rc4skip(RC4state *key, int len)
60*80ee5cbfSDavid du Colombier {
61*80ee5cbfSDavid du Colombier int tx, ty;
62*80ee5cbfSDavid du Colombier int x, y;
63*80ee5cbfSDavid du Colombier uchar *state;
64*80ee5cbfSDavid du Colombier int i;
65*80ee5cbfSDavid du Colombier
66*80ee5cbfSDavid du Colombier x = key->x;
67*80ee5cbfSDavid du Colombier y = key->y;
68*80ee5cbfSDavid du Colombier state = &key->state[0];
69*80ee5cbfSDavid du Colombier for(i=0; i<len; i++)
70*80ee5cbfSDavid du Colombier {
71*80ee5cbfSDavid du Colombier x = (x+1)&255;
72*80ee5cbfSDavid du Colombier tx = state[x];
73*80ee5cbfSDavid du Colombier y = (y+tx)&255;
74*80ee5cbfSDavid du Colombier ty = state[y];
75*80ee5cbfSDavid du Colombier state[x] = ty;
76*80ee5cbfSDavid du Colombier state[y] = tx;
77*80ee5cbfSDavid du Colombier }
78*80ee5cbfSDavid du Colombier key->x = x;
79*80ee5cbfSDavid du Colombier key->y = y;
80*80ee5cbfSDavid du Colombier }
81*80ee5cbfSDavid du Colombier
82*80ee5cbfSDavid du Colombier void
rc4back(RC4state * key,int len)83*80ee5cbfSDavid du Colombier rc4back(RC4state *key, int len)
84*80ee5cbfSDavid du Colombier {
85*80ee5cbfSDavid du Colombier int tx, ty;
86*80ee5cbfSDavid du Colombier int x, y;
87*80ee5cbfSDavid du Colombier uchar *state;
88*80ee5cbfSDavid du Colombier int i;
89*80ee5cbfSDavid du Colombier
90*80ee5cbfSDavid du Colombier x = key->x;
91*80ee5cbfSDavid du Colombier y = key->y;
92*80ee5cbfSDavid du Colombier state = &key->state[0];
93*80ee5cbfSDavid du Colombier for(i=0; i<len; i++)
94*80ee5cbfSDavid du Colombier {
95*80ee5cbfSDavid du Colombier ty = state[x];
96*80ee5cbfSDavid du Colombier tx = state[y];
97*80ee5cbfSDavid du Colombier state[y] = ty;
98*80ee5cbfSDavid du Colombier state[x] = tx;
99*80ee5cbfSDavid du Colombier y = (y-tx)&255;
100*80ee5cbfSDavid du Colombier x = (x-1)&255;
101*80ee5cbfSDavid du Colombier }
102*80ee5cbfSDavid du Colombier key->x = x;
103*80ee5cbfSDavid du Colombier key->y = y;
104*80ee5cbfSDavid du Colombier }
105