diff options
author | Simon Josefsson <simon@josefsson.org> | 2005-10-15 18:19:44 +0000 |
---|---|---|
committer | Simon Josefsson <simon@josefsson.org> | 2005-10-15 18:19:44 +0000 |
commit | 13083d5caa5989dab4238adce19a2fa55efc4201 (patch) | |
tree | 6c78c0c5f3e9801edd268255195fc9ebee0c6200 /lib/arcfour.c | |
parent | 0e56d268c07233446ac6171d32bf1a5a41fdbea0 (diff) | |
download | gnulib-13083d5caa5989dab4238adce19a2fa55efc4201.tar.gz |
Add arcfour module.
Diffstat (limited to 'lib/arcfour.c')
-rw-r--r-- | lib/arcfour.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/lib/arcfour.c b/lib/arcfour.c new file mode 100644 index 0000000000..61b851127c --- /dev/null +++ b/lib/arcfour.c @@ -0,0 +1,79 @@ +/* arcfour.c --- The arcfour stream cipher + * Copyright (C) 2000, 2001, 2002, 2003, 2005 Free Software Foundation, Inc. + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * This file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this file; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ + +/* Code from Libgcrypt adapted for gnulib by Simon Josefsson. */ + +/* + * For a description of the algorithm, see: + * Bruce Schneier: Applied Cryptography. John Wiley & Sons, 1996. + * ISBN 0-471-11709-9. Pages 397 ff. + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "arcfour.h" + +void +arcfour_stream (arcfour_context * context, const char *inbuf, char *outbuf, + size_t length) +{ + size_t i = context->idx_i; + size_t j = context->idx_j; + char *sbox = context->sbox; + + for (; length > 0; length--) + { + char t; + + i = (i + 1) % ARCFOUR_SBOX_SIZE; + j = (j + sbox[i]) % ARCFOUR_SBOX_SIZE; + t = sbox[i]; + sbox[i] = sbox[j]; + sbox[j] = t; + *outbuf++ = (*inbuf++ + ^ sbox[(0U + sbox[i] + sbox[j]) % ARCFOUR_SBOX_SIZE]); + } + + context->idx_i = i; + context->idx_j = j; +} + +void +arcfour_setkey (arcfour_context * context, const char *key, size_t keylen) +{ + size_t i, j, k; + char *sbox = context->sbox; + + context->idx_i = context->idx_j = 0; + for (i = 0; i < ARCFOUR_SBOX_SIZE; i++) + sbox[i] = i; + for (i = j = k = 0; i < ARCFOUR_SBOX_SIZE; i++) + { + char t; + j = (j + sbox[i] + key[k]) % ARCFOUR_SBOX_SIZE; + t = sbox[i]; + sbox[i] = sbox[j]; + sbox[j] = t; + if (++k == keylen) + k = 0; + } +} |