Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

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