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