00001 #include <stdint.h>
00002
00003 #include "tests/arc4.h"
00004
00005
00006 static inline void
00007 swap_byte (uint8_t *a, uint8_t *b)
00008 {
00009 uint8_t t = *a;
00010 *a = *b;
00011 *b = t;
00012 }
00013
00014 void
00015 arc4_init (struct arc4 *arc4, const void *key_, size_t size)
00016 {
00017 const uint8_t *key = key_;
00018 size_t key_idx;
00019 uint8_t *s;
00020 int i, j;
00021
00022 s = arc4->s;
00023 arc4->i = arc4->j = 0;
00024 for (i = 0; i < 256; i++)
00025 s[i] = i;
00026 for (key_idx = 0, i = j = 0; i < 256; i++)
00027 {
00028 j = (j + s[i] + key[key_idx]) & 255;
00029 swap_byte (s + i, s + j);
00030 if (++key_idx >= size)
00031 key_idx = 0;
00032 }
00033 }
00034
00035 void
00036 arc4_crypt (struct arc4 *arc4, void *buf_, size_t size)
00037 {
00038 uint8_t *buf = buf_;
00039 uint8_t *s;
00040 uint8_t i, j;
00041
00042 s = arc4->s;
00043 i = arc4->i;
00044 j = arc4->j;
00045 while (size-- > 0)
00046 {
00047 i += 1;
00048 j += s[i];
00049 swap_byte (s + i, s + j);
00050 *buf++ ^= s[(s[i] + s[j]) & 255];
00051 }
00052 arc4->i = i;
00053 arc4->j = j;
00054 }