1 /* This code illustrates a sample implementation
2 * of the Arcfour algorithm
3 * Copyright (c) April 29, 1997 Kalle Kaukonen.
6 * Redistribution and use in source and binary forms, with or
7 * without modification, are permitted provided that this copyright
8 * notice and disclaimer are retained.
10 * THIS SOFTWARE IS PROVIDED BY KALLE KAUKONEN AND CONTRIBUTORS ``AS
11 * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
12 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
13 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KALLE
14 * KAUKONEN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
15 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
16 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
17 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
18 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
19 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
20 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
21 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 #include "fitz-base.h"
25 #include "fitz-stream.h"
28 fz_arc4init(fz_arc4
*arc4
, unsigned char *key
, unsigned keylen
)
31 unsigned int keyindex
;
32 unsigned int stateindex
;
41 for (counter
= 0; counter
< 256; counter
++) {
42 state
[counter
] = counter
;
48 for (counter
= 0; counter
< 256; counter
++) {
50 stateindex
= (stateindex
+ key
[keyindex
] + t
) & 0xff;
51 u
= state
[stateindex
];
53 state
[stateindex
] = t
;
56 if (++keyindex
>= keylen
) {
63 fz_arc4next(fz_arc4
*arc4
)
72 x
= (arc4
->x
+ 1) & 0xff;
74 y
= (sx
+ arc4
->y
) & 0xff;
83 return state
[(sx
+ sy
) & 0xff];
87 fz_arc4encrypt(fz_arc4
*arc4
, unsigned char *dest
, unsigned char *src
, unsigned len
)
90 for (i
= 0; i
< len
; i
++) {
92 x
= fz_arc4next(arc4
);