1*9b943567SDavid du Colombier #include "../lib9.h" 2*9b943567SDavid du Colombier #include "../libsec/libsec.h" 3*9b943567SDavid du Colombier 4*9b943567SDavid du Colombier void 5*9b943567SDavid du Colombier setupRC4state(RC4state *key, uchar *start, int n) 6*9b943567SDavid du Colombier { 7*9b943567SDavid du Colombier int t; 8*9b943567SDavid du Colombier int index2; 9*9b943567SDavid du Colombier uchar *state; 10*9b943567SDavid du Colombier uchar *p, *e, *sp, *se; 11*9b943567SDavid du Colombier 12*9b943567SDavid du Colombier state = key->state; 13*9b943567SDavid du Colombier se = &state[256]; 14*9b943567SDavid du Colombier for(sp = state; sp < se; sp++) 15*9b943567SDavid du Colombier *sp = sp - state; 16*9b943567SDavid du Colombier 17*9b943567SDavid du Colombier key->x = 0; 18*9b943567SDavid du Colombier key->y = 0; 19*9b943567SDavid du Colombier index2 = 0; 20*9b943567SDavid du Colombier e = start + n; 21*9b943567SDavid du Colombier p = start; 22*9b943567SDavid du Colombier for(sp = state; sp < se; sp++) 23*9b943567SDavid du Colombier { 24*9b943567SDavid du Colombier t = *sp; 25*9b943567SDavid du Colombier index2 = (*p + t + index2) & 255; 26*9b943567SDavid du Colombier *sp = state[index2]; 27*9b943567SDavid du Colombier state[index2] = t; 28*9b943567SDavid du Colombier if(++p >= e) 29*9b943567SDavid du Colombier p = start; 30*9b943567SDavid du Colombier } 31*9b943567SDavid du Colombier } 32*9b943567SDavid du Colombier 33*9b943567SDavid du Colombier void 34*9b943567SDavid du Colombier rc4(RC4state *key, uchar *p, int len) 35*9b943567SDavid du Colombier { 36*9b943567SDavid du Colombier int tx, ty; 37*9b943567SDavid du Colombier int x, y; 38*9b943567SDavid du Colombier uchar *state; 39*9b943567SDavid du Colombier uchar *e; 40*9b943567SDavid du Colombier 41*9b943567SDavid du Colombier x = key->x; 42*9b943567SDavid du Colombier y = key->y; 43*9b943567SDavid du Colombier state = &key->state[0]; 44*9b943567SDavid du Colombier for(e = p + len; p < e; p++) 45*9b943567SDavid du Colombier { 46*9b943567SDavid du Colombier x = (x+1)&255; 47*9b943567SDavid du Colombier tx = state[x]; 48*9b943567SDavid du Colombier y = (y+tx)&255; 49*9b943567SDavid du Colombier ty = state[y]; 50*9b943567SDavid du Colombier state[x] = ty; 51*9b943567SDavid du Colombier state[y] = tx; 52*9b943567SDavid du Colombier *p ^= state[(tx+ty)&255]; 53*9b943567SDavid du Colombier } 54*9b943567SDavid du Colombier key->x = x; 55*9b943567SDavid du Colombier key->y = y; 56*9b943567SDavid du Colombier } 57*9b943567SDavid du Colombier 58*9b943567SDavid du Colombier void 59*9b943567SDavid du Colombier rc4skip(RC4state *key, int len) 60*9b943567SDavid du Colombier { 61*9b943567SDavid du Colombier int tx, ty; 62*9b943567SDavid du Colombier int x, y; 63*9b943567SDavid du Colombier uchar *state; 64*9b943567SDavid du Colombier int i; 65*9b943567SDavid du Colombier 66*9b943567SDavid du Colombier x = key->x; 67*9b943567SDavid du Colombier y = key->y; 68*9b943567SDavid du Colombier state = &key->state[0]; 69*9b943567SDavid du Colombier for(i=0; i<len; i++) 70*9b943567SDavid du Colombier { 71*9b943567SDavid du Colombier x = (x+1)&255; 72*9b943567SDavid du Colombier tx = state[x]; 73*9b943567SDavid du Colombier y = (y+tx)&255; 74*9b943567SDavid du Colombier ty = state[y]; 75*9b943567SDavid du Colombier state[x] = ty; 76*9b943567SDavid du Colombier state[y] = tx; 77*9b943567SDavid du Colombier } 78*9b943567SDavid du Colombier key->x = x; 79*9b943567SDavid du Colombier key->y = y; 80*9b943567SDavid du Colombier } 81*9b943567SDavid du Colombier 82*9b943567SDavid du Colombier void 83*9b943567SDavid du Colombier rc4back(RC4state *key, int len) 84*9b943567SDavid du Colombier { 85*9b943567SDavid du Colombier int tx, ty; 86*9b943567SDavid du Colombier int x, y; 87*9b943567SDavid du Colombier uchar *state; 88*9b943567SDavid du Colombier int i; 89*9b943567SDavid du Colombier 90*9b943567SDavid du Colombier x = key->x; 91*9b943567SDavid du Colombier y = key->y; 92*9b943567SDavid du Colombier state = &key->state[0]; 93*9b943567SDavid du Colombier for(i=0; i<len; i++) 94*9b943567SDavid du Colombier { 95*9b943567SDavid du Colombier ty = state[x]; 96*9b943567SDavid du Colombier tx = state[y]; 97*9b943567SDavid du Colombier state[y] = ty; 98*9b943567SDavid du Colombier state[x] = tx; 99*9b943567SDavid du Colombier y = (y-tx)&255; 100*9b943567SDavid du Colombier x = (x-1)&255; 101*9b943567SDavid du Colombier } 102*9b943567SDavid du Colombier key->x = x; 103*9b943567SDavid du Colombier key->y = y; 104*9b943567SDavid du Colombier } 105