Paul Eggert <[EMAIL PROTECTED]> writes: > Some fairly minor comments: > > Simon Josefsson <[EMAIL PROTECTED]> writes: > >> +#define MOD256(n) ((n) & (ARCFOUR_SBOX_SIZE - 1)) > > That is a strange name to use. I expected the definiens to be ((n) & > 255). Why not use the name MOD_ARCFOUR_SBOX_SIZE, or some shorter > variant perhaps? > > If the code going to say MOD256 elsewhere we might as well just > open-code the &255 and dispense with the macro entirely.....
Actually, we'd might as well hard code '% ARCFOUR_SBOX_SIZE' and avoid this issue. If we do this, the C code look like the algorithm description in a text book, which is better than this likely remote possibility of a speed improvement. A good compiler should be able to optimize %256 into &255 if it make the code faster. >> + register size_t i = context->idx_i; >> + register size_t j = context->idx_j; > > These days there's no need for 'register'. Similarly for the > other occurrences of 'register'. It just clutters up the code. Removed. >> + register char *sbox = context->sbox; > > For consistency, shouldn't arcfour_setkey also have this internal > variable? (I doubt whether it'll affect the generated code, if > optimization is enabled; it's just a style thing.) Yup. >> + i = MOD256(i + 1); >> + j = MOD256(j + sbox[i]); > > GNU style suggests a space before the paren, even for macro calls. > Similarly for the other occurrences of "MOD256(". There is no macro now, so this doesn't apply any more. >> +#define ARCFOUR_SBOX_SIZE 256 >> + >> +typedef struct >> +{ >> + size_t idx_i, idx_j; >> + char sbox[ARCFOUR_SBOX_SIZE]; >> +} arcfour_context; > > Why must these be in arcfour.h? Shouldn't all this private to > arcfour.c? > > You can replace the above lines with 'struct arcfour_context;' and > then move them into arcfour.c (replacing 'arcfour_context' with > 'struct arcfour_context' everywhere). Like Bruno said, it should be possible to allocate the struct on the stack, but more importantly, I think being able to access the sbox values should be part of the public interface. The content of the sbox/i/j state variables is fully specified, and some application may find it useful to be able to access that data. Revised patch below. Ok to install? Thanks, Simon Index: ChangeLog =================================================================== RCS file: /cvsroot/gnulib/gnulib/ChangeLog,v retrieving revision 1.419 diff -u -p -r1.419 ChangeLog --- ChangeLog 14 Oct 2005 00:59:45 -0000 1.419 +++ ChangeLog 14 Oct 2005 23:28:05 -0000 @@ -1,3 +1,9 @@ +2005-10-14 Simon Josefsson <[EMAIL PROTECTED]> + + * tests/test-arcfour.c: New file. + + * modules/arcfour, modules/arcfour-tests: New files. + 2005-10-13 Oskar Liljeblad <[EMAIL PROTECTED]> * modules/human (Depends-on): Depend on xstrtoumax, not xstrtol. Index: modules/arcfour =================================================================== RCS file: modules/arcfour diff -N modules/arcfour --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/arcfour 14 Oct 2005 23:28:05 -0000 @@ -0,0 +1,23 @@ +Description: +ARCFOUR stream cipher implementation + +Files: +lib/arcfour.h +lib/arcfour.c +m4/arcfour.m4 + +Depends-on: + +configure.ac: +gl_ARCFOUR + +Makefile.am: + +Include: +"arcfour.h" + +License: +LGPL + +Maintainer: +Simon Josefsson Index: modules/arcfour-tests =================================================================== RCS file: modules/arcfour-tests diff -N modules/arcfour-tests --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/arcfour-tests 14 Oct 2005 23:28:05 -0000 @@ -0,0 +1,11 @@ +Files: +tests/test-arcfour.c + +Depends-on: + +configure.ac: + +Makefile.am: +TESTS += test-arcfour +noinst_PROGRAMS += test-arcfour +test_arcfour_SOURCES = test-arcfour.c Index: m4/ChangeLog =================================================================== RCS file: /cvsroot/gnulib/gnulib/m4/ChangeLog,v retrieving revision 1.741 diff -u -p -r1.741 ChangeLog --- m4/ChangeLog 13 Oct 2005 12:20:32 -0000 1.741 +++ m4/ChangeLog 14 Oct 2005 23:28:05 -0000 @@ -1,3 +1,7 @@ +2005-10-14 Simon Josefsson <[EMAIL PROTECTED]> + + * arcfour.m4: New file. + 2005-10-12 Bruno Haible <[EMAIL PROTECTED]> * stdbool.m4 (gl_STDBOOL_H): Define as an alias of AM_STDBOOL_H. Index: m4/arcfour.m4 =================================================================== RCS file: m4/arcfour.m4 diff -N m4/arcfour.m4 --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ m4/arcfour.m4 14 Oct 2005 23:28:05 -0000 @@ -0,0 +1,11 @@ +# arcfour.m4 serial 1 +dnl Copyright (C) 2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_ARCFOUR], +[ + AC_LIBSOURCES([arcfour.c, arcfour.h]) + AC_LIBOBJ([arcfour]) +]) Index: lib/ChangeLog =================================================================== RCS file: /cvsroot/gnulib/gnulib/lib/ChangeLog,v retrieving revision 1.1011 diff -u -p -r1.1011 ChangeLog --- lib/ChangeLog 13 Oct 2005 07:49:05 -0000 1.1011 +++ lib/ChangeLog 14 Oct 2005 23:28:06 -0000 @@ -1,3 +1,7 @@ +2005-10-14 Simon Josefsson <[EMAIL PROTECTED]> + + * arcfour.h, arcfour.c: New files. + 2005-10-13 Simon Josefsson <[EMAIL PROTECTED]> * gc-pbkdf2-sha1.c (gc_pbkdf2_sha1): Optimize CEIL computation. Index: lib/arcfour.c =================================================================== RCS file: lib/arcfour.c diff -N lib/arcfour.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lib/arcfour.c 14 Oct 2005 23:28:06 -0000 @@ -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; + } +} Index: lib/arcfour.h =================================================================== RCS file: lib/arcfour.h diff -N lib/arcfour.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lib/arcfour.h 14 Oct 2005 23:28:06 -0000 @@ -0,0 +1,50 @@ +/* arcfour.h --- The arcfour stream cipher + * Copyright (C) 2000, 2001, 2002, 2003, 2004, 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. */ + +#ifndef ARCFOUR_H +# define ARCFOUR_H + +# include <stddef.h> + +#define ARCFOUR_SBOX_SIZE 256 + +typedef struct +{ + size_t idx_i, idx_j; + char sbox[ARCFOUR_SBOX_SIZE]; +} arcfour_context; + +/* Apply ARCFOUR stream to INBUF placing the result in OUTBUF, both of + LENGTH size. CONTEXT must be initialized with arcfour_setkey + before this function is called. */ +extern void +arcfour_stream (arcfour_context * context, + const char *inbuf, char *outbuf, size_t length); + +/* Initialize CONTEXT using encryption KEY of KEYLEN bytes. KEY + should be 40 bits (5 bytes) or longer. The KEY cannot be zero + length. */ +extern void +arcfour_setkey (arcfour_context * context, const char *key, size_t keylen); + +#endif /* ARCFOUR_H */ Index: tests/test-arcfour.c =================================================================== RCS file: tests/test-arcfour.c diff -N tests/test-arcfour.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ tests/test-arcfour.c 14 Oct 2005 23:28:06 -0000 @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2005 Free Software Foundation + * Written by Simon Josefsson + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdio.h> +#include <string.h> +#include "arcfour.h" + +int +main (int argc, char *argv[]) +{ + arcfour_context ctx; + /* Test vector from Cryptlib via Libgcrypt labeled there: "from the + State/Commerce Department". */ + static char key_1[] = { 0x61, 0x8A, 0x63, 0xD2, 0xFB }; + static char plaintext_1[] = { 0xDC, 0xEE, 0x4C, 0xF9, 0x2C }; + static const char ciphertext_1[] = { 0xF1, 0x38, 0x29, 0xC9, 0xDE }; + char scratch[16]; + + arcfour_setkey (&ctx, key_1, sizeof (key_1)); + arcfour_stream (&ctx, plaintext_1, scratch, sizeof (plaintext_1)); + if (memcmp (scratch, ciphertext_1, sizeof (ciphertext_1))) + { + size_t i; + printf ("expected:\n"); + for (i = 0; i < 5; i++) + printf ("%02x ", scratch[i] & 0xFF); + printf ("\ncomputed:\n"); + for (i = 0; i < 5; i++) + printf ("%02x ", ciphertext_1[i] & 0xFF); + printf ("\n"); + return 1; + } + + /* decrypt */ + + arcfour_setkey (&ctx, key_1, sizeof (key_1)); + arcfour_stream (&ctx, scratch, scratch, sizeof (plaintext_1)); + if (memcmp (scratch, plaintext_1, sizeof (plaintext_1))) + { + size_t i; + printf ("expected:\n"); + for (i = 0; i < 5; i++) + printf ("%02x ", plaintext_1[i] & 0xFF); + printf ("\ncomputed:\n"); + for (i = 0; i < 5; i++) + printf ("%02x ", scratch[i] & 0xFF); + printf ("\n"); + return 1; + } + + + return 0; +} _______________________________________________ bug-gnulib mailing list bug-gnulib@gnu.org http://lists.gnu.org/mailman/listinfo/bug-gnulib