#include "os.h" | |
#include <libsec.h> | |
void | |
setupRC4state(RC4state *key, uchar *start, int n) | |
{ | |
int t; | |
int index2; | |
uchar *state; | |
uchar *p, *e, *sp, *se; | |
state = key->state; | |
se = &state[256]; | |
for(sp = state; sp < se; sp++) | |
*sp = sp - state; | |
key->x = 0; | |
key->y = 0; | |
index2 = 0; | |
e = start + n; | |
p = start; | |
for(sp = state; sp < se; sp++) | |
{ | |
t = *sp; | |
index2 = (*p + t + index2) & 255; | |
*sp = state[index2]; | |
state[index2] = t; | |
if(++p >= e) | |
p = start; | |
} | |
} | |
void | |
rc4(RC4state *key, uchar *p, int len) | |
{ | |
int tx, ty; | |
int x, y; | |
uchar *state; | |
uchar *e; | |
x = key->x; | |
y = key->y; | |
state = &key->state[0]; | |
for(e = p + len; p < e; p++) | |
{ | |
x = (x+1)&255; | |
tx = state[x]; | |
y = (y+tx)&255; | |
ty = state[y]; | |
state[x] = ty; | |
state[y] = tx; | |
*p ^= state[(tx+ty)&255]; | |
} | |
key->x = x; | |
key->y = y; | |
} | |
void | |
rc4skip(RC4state *key, int len) | |
{ | |
int tx, ty; | |
int x, y; | |
uchar *state; | |
int i; | |
x = key->x; | |
y = key->y; | |
state = &key->state[0]; | |
for(i=0; i<len; i++) | |
{ | |
x = (x+1)&255; | |
tx = state[x]; | |
y = (y+tx)&255; | |
ty = state[y]; | |
state[x] = ty; | |
state[y] = tx; | |
} | |
key->x = x; | |
key->y = y; | |
} | |
void | |
rc4back(RC4state *key, int len) | |
{ | |
int tx, ty; | |
int x, y; | |
uchar *state; | |
int i; | |
x = key->x; | |
y = key->y; | |
state = &key->state[0]; | |
for(i=0; i<len; i++) | |
{ | |
ty = state[x]; | |
tx = state[y]; | |
state[y] = ty; | |
state[x] = tx; | |
y = (y-tx)&255; | |
x = (x-1)&255; | |
} | |
key->x = x; | |
key->y = y; | |
} |