|  | #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; | 
|  | } |