No empty .Rs/.Re
[netbsd-mini2440.git] / sys / crypto / arc4 / arc4.c
blobdb52b176494efe3b1e035a0130c178f566cc5a05
1 /* $NetBSD: arc4.c,v 1.4.6.3 2004/09/21 13:26:15 skrll Exp $ */
3 /*
4 * ARC4 implementation
5 * A Stream Cipher Encryption Algorithm "Arcfour"
6 * <draft-kaukonen-cipher-arcfour-03.txt>
7 */
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>
39 struct arc4_ctx {
40 unsigned int x;
41 unsigned int y;
42 unsigned int state[256];
43 /* was unsigned char, changed to int for performance -- onoe */
46 int
47 arc4_ctxlen(void)
49 return sizeof(struct arc4_ctx);
52 void
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;
57 unsigned int *state;
59 state = ctx->state;
60 ctx->x = 0;
61 ctx->y = 0;
62 for (i = 0; i < 256; i++)
63 state[i] = i;
64 ki = si = 0;
65 for (i = 0; i < 256; i++) {
66 t = state[i];
67 si = (si + key[ki] + t) & 0xff;
68 u = state[si];
69 state[si] = t;
70 state[i] = u;
71 if (++ki >= keylen)
72 ki = 0;
76 void
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;
81 unsigned int *state;
82 const unsigned char *endsrc;
84 state = ctx->state;
85 x = ctx->x;
86 y = ctx->y;
87 for (endsrc = src + len; src != endsrc; src++, dst++) {
88 x = (x + 1) & 0xff;
89 sx = state[x];
90 y = (sx + y) & 0xff;
91 state[x] = sy = state[y];
92 state[y] = sx;
93 *dst = *src ^ state[(sx + sy) & 0xff];
95 ctx->x = x;
96 ctx->y = y;
99 void
100 arc4_decrypt(void *ctxp, u_char *dst, const u_char *src, int len)
103 arc4_encrypt(ctxp, dst, src, len);