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