add CHD support.
[pcsx_rearmed.git] / deps / crypto / arcfour.c
1 /*********************************************************************
2 * Filename:   arcfour.c
3 * Author:     Brad Conte (brad AT bradconte.com)
4 * Copyright:
5 * Disclaimer: This code is presented "as is" without any guarantees.
6 * Details:    Implementation of the ARCFOUR encryption algorithm.
7               Algorithm specification can be found here:
8                * http://en.wikipedia.org/wiki/RC4
9 *********************************************************************/
10
11 /*************************** HEADER FILES ***************************/
12 #include <stdlib.h>
13 #include "arcfour.h"
14
15 /*********************** FUNCTION DEFINITIONS ***********************/
16 void arcfour_key_setup(BYTE state[], const BYTE key[], int len)
17 {
18         int i, j;
19         BYTE t;
20
21         for (i = 0; i < 256; ++i)
22                 state[i] = i;
23         for (i = 0, j = 0; i < 256; ++i) {
24                 j = (j + state[i] + key[i % len]) % 256;
25                 t = state[i];
26                 state[i] = state[j];
27                 state[j] = t;
28         }
29 }
30
31 // This does not hold state between calls. It always generates the
32 // stream starting from the first  output byte.
33 void arcfour_generate_stream(BYTE state[], BYTE out[], size_t len)
34 {
35         int i, j;
36         size_t idx;
37         BYTE t;
38
39         for (idx = 0, i = 0, j = 0; idx < len; ++idx)  {
40                 i = (i + 1) % 256;
41                 j = (j + state[i]) % 256;
42                 t = state[i];
43                 state[i] = state[j];
44                 state[j] = t;
45                 out[idx] = state[(state[i] + state[j]) % 256];
46         }
47 }