1 /* $NetBSD: arc4.c,v 1.4.6.3 2004/09/21 13:26:15 skrll Exp $ */
5 * A Stream Cipher Encryption Algorithm "Arcfour"
6 * <draft-kaukonen-cipher-arcfour-03.txt>
9 /* This code illustrates a sample implementation
10 * of the Arcfour algorithm
11 * Copyright (c) April 29, 1997 Kalle Kaukonen.
12 * All Rights Reserved.
14 * Redistribution and use in source and binary forms, with or
15 * without modification, are permitted provided that this copyright
16 * notice and disclaimer are retained.
18 * THIS SOFTWARE IS PROVIDED BY KALLE KAUKONEN AND CONTRIBUTORS ``AS
19 * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KALLE
22 * KAUKONEN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 #include <sys/cdefs.h>
33 __KERNEL_RCSID(0, "$NetBSD: arc4.c,v 1.4.6.3 2004/09/21 13:26:15 skrll Exp $");
35 #include <sys/types.h>
37 #include <crypto/arc4/arc4.h>
42 unsigned int state
[256];
43 /* was unsigned char, changed to int for performance -- onoe */
49 return sizeof(struct arc4_ctx
);
53 arc4_setkey(void *ctxp
, const u_char
*key
, u_int keylen
)
55 struct arc4_ctx
*ctx
= ctxp
;
56 unsigned int i
, t
, u
, ki
, si
;
62 for (i
= 0; i
< 256; i
++)
65 for (i
= 0; i
< 256; i
++) {
67 si
= (si
+ key
[ki
] + t
) & 0xff;
77 arc4_encrypt(void *ctxp
, u_char
*dst
, const u_char
*src
, int len
)
79 struct arc4_ctx
*ctx
= ctxp
;
80 unsigned int x
, y
, sx
, sy
;
82 const unsigned char *endsrc
;
87 for (endsrc
= src
+ len
; src
!= endsrc
; src
++, dst
++) {
91 state
[x
] = sy
= state
[y
];
93 *dst
= *src
^ state
[(sx
+ sy
) & 0xff];
100 arc4_decrypt(void *ctxp
, u_char
*dst
, const u_char
*src
, int len
)
103 arc4_encrypt(ctxp
, dst
, src
, len
);