Blob
1 #include "os.h"2 #include <libsec.h>4 void5 setupRC4state(RC4state *key, uchar *start, int n)6 {7 int t;8 int index2;9 uchar *state;10 uchar *p, *e, *sp, *se;12 state = key->state;13 se = &state[256];14 for(sp = state; sp < se; sp++)15 *sp = sp - state;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 }33 void34 rc4(RC4state *key, uchar *p, int len)35 {36 int tx, ty;37 int x, y;38 uchar *state;39 uchar *e;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 }58 void59 rc4skip(RC4state *key, int len)60 {61 int tx, ty;62 int x, y;63 uchar *state;64 int i;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 }82 void83 rc4back(RC4state *key, int len)84 {85 int tx, ty;86 int x, y;87 uchar *state;88 int i;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 }