forked from KolibriOS/kolibrios
99 lines
2.3 KiB
C
99 lines
2.3 KiB
C
|
/* This code illustrates a sample implementation
|
||
|
* of the Arcfour algorithm
|
||
|
* Copyright (c) April 29, 1997 Kalle Kaukonen.
|
||
|
* All Rights Reserved.
|
||
|
*
|
||
|
* Redistribution and use in source and binary forms, with or
|
||
|
* without modification, are permitted provided that this copyright
|
||
|
* notice and disclaimer are retained.
|
||
|
*
|
||
|
* THIS SOFTWARE IS PROVIDED BY KALLE KAUKONEN AND CONTRIBUTORS ``AS
|
||
|
* IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KALLE
|
||
|
* KAUKONEN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
*/
|
||
|
|
||
|
#include "fitz.h"
|
||
|
|
||
|
void
|
||
|
fz_arc4_init(fz_arc4 *arc4, const unsigned char *key, const unsigned keylen)
|
||
|
{
|
||
|
unsigned int t, u;
|
||
|
unsigned int keyindex;
|
||
|
unsigned int stateindex;
|
||
|
unsigned char *state;
|
||
|
unsigned int counter;
|
||
|
|
||
|
state = arc4->state;
|
||
|
|
||
|
arc4->x = 0;
|
||
|
arc4->y = 0;
|
||
|
|
||
|
for (counter = 0; counter < 256; counter++)
|
||
|
{
|
||
|
state[counter] = counter;
|
||
|
}
|
||
|
|
||
|
keyindex = 0;
|
||
|
stateindex = 0;
|
||
|
|
||
|
for (counter = 0; counter < 256; counter++)
|
||
|
{
|
||
|
t = state[counter];
|
||
|
stateindex = (stateindex + key[keyindex] + t) & 0xff;
|
||
|
u = state[stateindex];
|
||
|
|
||
|
state[stateindex] = t;
|
||
|
state[counter] = u;
|
||
|
|
||
|
if (++keyindex >= keylen)
|
||
|
{
|
||
|
keyindex = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static unsigned char
|
||
|
fz_arc4_next(fz_arc4 *arc4)
|
||
|
{
|
||
|
unsigned int x;
|
||
|
unsigned int y;
|
||
|
unsigned int sx, sy;
|
||
|
unsigned char *state;
|
||
|
|
||
|
state = arc4->state;
|
||
|
|
||
|
x = (arc4->x + 1) & 0xff;
|
||
|
sx = state[x];
|
||
|
y = (sx + arc4->y) & 0xff;
|
||
|
sy = state[y];
|
||
|
|
||
|
arc4->x = x;
|
||
|
arc4->y = y;
|
||
|
|
||
|
state[y] = sx;
|
||
|
state[x] = sy;
|
||
|
|
||
|
return state[(sx + sy) & 0xff];
|
||
|
}
|
||
|
|
||
|
void
|
||
|
fz_arc4_encrypt(fz_arc4 *arc4, unsigned char *dest, const unsigned char *src, const unsigned len)
|
||
|
{
|
||
|
unsigned int i;
|
||
|
for (i = 0; i < len; i++)
|
||
|
{
|
||
|
unsigned char x;
|
||
|
x = fz_arc4_next(arc4);
|
||
|
dest[i] = src[i] ^ x;
|
||
|
}
|
||
|
}
|