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