chiark / gitweb /
Typo fixes to man page.
[vbig.git] / Arcfour.cc
1 /* arcfour.c --- The arcfour stream cipher
2  * Copyright (C) 2000, 2001, 2002, 2003, 2005, 2006 Free Software
3  * Foundation, Inc.
4  *
5  * This file is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published
7  * by the Free Software Foundation; either version 2, or (at your
8  * option) any later version.
9  *
10  * This file is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this file; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18  * 02110-1301, USA.
19  *
20  */
21 #include <config.h>
22 #include "Arcfour.h"
23
24 void Arcfour::stream(char *outbuf, size_t length) {
25   uint8_t i = idx_i;
26   uint8_t j = idx_j;
27   
28   for (; length > 0; length--) {
29     char t;
30
31     i++;
32     j += sbox[i];
33     t = sbox[i];
34     sbox[i] = sbox[j];
35     sbox[j] = t;
36     *outbuf++ = (sbox[(0U + sbox[i] + sbox[j]) % ARCFOUR_SBOX_SIZE]);
37   }
38
39   idx_i = i;
40   idx_j = j;
41 }
42
43 Arcfour::Arcfour(const char *key, size_t keylen) {
44   size_t i, j, k;
45   idx_i = idx_j = 0;
46   for (i = 0; i < ARCFOUR_SBOX_SIZE; i++)
47     sbox[i] = i;
48   for (i = j = k = 0; i < ARCFOUR_SBOX_SIZE; i++) {
49     char t;
50     j = (j + sbox[i] + key[k]) % ARCFOUR_SBOX_SIZE;
51     t = sbox[i];
52     sbox[i] = sbox[j];
53     sbox[j] = t;
54     if (++k == keylen)
55       k = 0;
56   }
57 }