xref: /plan9/sys/src/libsec/port/rc4.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
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