xref: /plan9/sys/src/cmd/unix/drawterm/libsec/rc4.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include "os.h"
2*8ccd4a63SDavid du Colombier #include <libsec.h>
39b943567SDavid du Colombier 
49b943567SDavid du Colombier void
setupRC4state(RC4state * key,uchar * start,int n)59b943567SDavid du Colombier setupRC4state(RC4state *key, uchar *start, int n)
69b943567SDavid du Colombier {
79b943567SDavid du Colombier 	int t;
89b943567SDavid du Colombier 	int index2;
99b943567SDavid du Colombier 	uchar *state;
109b943567SDavid du Colombier 	uchar *p, *e, *sp, *se;
119b943567SDavid du Colombier 
129b943567SDavid du Colombier 	state = key->state;
139b943567SDavid du Colombier 	se = &state[256];
149b943567SDavid du Colombier 	for(sp = state; sp < se; sp++)
159b943567SDavid du Colombier 		*sp = sp - state;
169b943567SDavid du Colombier 
179b943567SDavid du Colombier 	key->x = 0;
189b943567SDavid du Colombier 	key->y = 0;
199b943567SDavid du Colombier 	index2 = 0;
209b943567SDavid du Colombier 	e = start + n;
219b943567SDavid du Colombier 	p = start;
229b943567SDavid du Colombier 	for(sp = state; sp < se; sp++)
239b943567SDavid du Colombier 	{
249b943567SDavid du Colombier 		t = *sp;
259b943567SDavid du Colombier 		index2 = (*p + t + index2) & 255;
269b943567SDavid du Colombier 		*sp = state[index2];
279b943567SDavid du Colombier 		state[index2] = t;
289b943567SDavid du Colombier 		if(++p >= e)
299b943567SDavid du Colombier 			p = start;
309b943567SDavid du Colombier 	}
319b943567SDavid du Colombier }
329b943567SDavid du Colombier 
339b943567SDavid du Colombier void
rc4(RC4state * key,uchar * p,int len)349b943567SDavid du Colombier rc4(RC4state *key, uchar *p, int len)
359b943567SDavid du Colombier {
369b943567SDavid du Colombier 	int tx, ty;
379b943567SDavid du Colombier 	int x, y;
389b943567SDavid du Colombier 	uchar *state;
399b943567SDavid du Colombier 	uchar *e;
409b943567SDavid du Colombier 
419b943567SDavid du Colombier 	x = key->x;
429b943567SDavid du Colombier 	y = key->y;
439b943567SDavid du Colombier 	state = &key->state[0];
449b943567SDavid du Colombier 	for(e = p + len; p < e; p++)
459b943567SDavid du Colombier 	{
469b943567SDavid du Colombier 		x = (x+1)&255;
479b943567SDavid du Colombier 		tx = state[x];
489b943567SDavid du Colombier 		y = (y+tx)&255;
499b943567SDavid du Colombier 		ty = state[y];
509b943567SDavid du Colombier 		state[x] = ty;
519b943567SDavid du Colombier 		state[y] = tx;
529b943567SDavid du Colombier 		*p ^= state[(tx+ty)&255];
539b943567SDavid du Colombier 	}
549b943567SDavid du Colombier 	key->x = x;
559b943567SDavid du Colombier 	key->y = y;
569b943567SDavid du Colombier }
579b943567SDavid du Colombier 
589b943567SDavid du Colombier void
rc4skip(RC4state * key,int len)599b943567SDavid du Colombier rc4skip(RC4state *key, int len)
609b943567SDavid du Colombier {
619b943567SDavid du Colombier 	int tx, ty;
629b943567SDavid du Colombier 	int x, y;
639b943567SDavid du Colombier 	uchar *state;
649b943567SDavid du Colombier 	int i;
659b943567SDavid du Colombier 
669b943567SDavid du Colombier 	x = key->x;
679b943567SDavid du Colombier 	y = key->y;
689b943567SDavid du Colombier 	state = &key->state[0];
699b943567SDavid du Colombier 	for(i=0; i<len; i++)
709b943567SDavid du Colombier 	{
719b943567SDavid du Colombier 		x = (x+1)&255;
729b943567SDavid du Colombier 		tx = state[x];
739b943567SDavid du Colombier 		y = (y+tx)&255;
749b943567SDavid du Colombier 		ty = state[y];
759b943567SDavid du Colombier 		state[x] = ty;
769b943567SDavid du Colombier 		state[y] = tx;
779b943567SDavid du Colombier 	}
789b943567SDavid du Colombier 	key->x = x;
799b943567SDavid du Colombier 	key->y = y;
809b943567SDavid du Colombier }
819b943567SDavid du Colombier 
829b943567SDavid du Colombier void
rc4back(RC4state * key,int len)839b943567SDavid du Colombier rc4back(RC4state *key, int len)
849b943567SDavid du Colombier {
859b943567SDavid du Colombier 	int tx, ty;
869b943567SDavid du Colombier 	int x, y;
879b943567SDavid du Colombier 	uchar *state;
889b943567SDavid du Colombier 	int i;
899b943567SDavid du Colombier 
909b943567SDavid du Colombier 	x = key->x;
919b943567SDavid du Colombier 	y = key->y;
929b943567SDavid du Colombier 	state = &key->state[0];
939b943567SDavid du Colombier 	for(i=0; i<len; i++)
949b943567SDavid du Colombier 	{
959b943567SDavid du Colombier 		ty = state[x];
969b943567SDavid du Colombier 		tx = state[y];
979b943567SDavid du Colombier 		state[y] = ty;
989b943567SDavid du Colombier 		state[x] = tx;
999b943567SDavid du Colombier 		y = (y-tx)&255;
1009b943567SDavid du Colombier 		x = (x-1)&255;
1019b943567SDavid du Colombier 	}
1029b943567SDavid du Colombier 	key->x = x;
1039b943567SDavid du Colombier 	key->y = y;
1049b943567SDavid du Colombier }
105