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