vx32

Local 9vx git repository for patches.
git clone git://r-36.net/vx32
Log | Files | Refs

rc4.c (1415B)


      1 #include "os.h"
      2 #include "libsec.h"
      3 
      4 void
      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
     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
     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
     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 }