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