From c4f00b7d32160f83e4fb811c6584e8f4e48dfa2e Mon Sep 17 00:00:00 2001 From: Simon Josefsson Date: Wed, 19 Oct 2005 15:40:26 +0000 Subject: [PATCH] Add gc-arcfour and gc-arcfour-tests modules. --- ChangeLog | 6 +++ lib/ChangeLog | 4 ++ lib/gc-gnulib.c | 44 ++++++++++++++++++ m4/ChangeLog | 2 + m4/gc-arcfour.m4 | 15 ++++++ modules/gc-arcfour | 26 +++++++++++ modules/gc-arcfour-tests | 11 +++++ tests/test-gc-arcfour.c | 99 ++++++++++++++++++++++++++++++++++++++++ 8 files changed, 207 insertions(+) create mode 100644 m4/gc-arcfour.m4 create mode 100644 modules/gc-arcfour create mode 100644 modules/gc-arcfour-tests create mode 100644 tests/test-gc-arcfour.c diff --git a/ChangeLog b/ChangeLog index e4cc19053c..5db0ee58d9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2005-10-19 Simon Josefsson + + * tests/test-gc-arcfour.c: New file. + + * modules/gc-arcfour, modules/gc-arcfour-tests: New files. + 2005-10-19 Simon Josefsson * tests/test-gc-rijndael.c: New file. diff --git a/lib/ChangeLog b/lib/ChangeLog index 5202477b53..5589f4873c 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,7 @@ +2005-10-19 Simon Josefsson + + * gc-gnulib.c: Support ARCFOUR. + 2005-10-19 Simon Josefsson * gc-gnulib.c: Implement gc_cipher_* API, currently only with AES diff --git a/lib/gc-gnulib.c b/lib/gc-gnulib.c index 3e75529e03..61bf12435b 100644 --- a/lib/gc-gnulib.c +++ b/lib/gc-gnulib.c @@ -37,6 +37,7 @@ #include #include +/* Hashes. */ #ifdef GC_USE_MD4 # include "md4.h" #endif @@ -49,6 +50,11 @@ #ifdef GC_USE_HMAC_MD5 # include "hmac.h" #endif + +/* Ciphers. */ +#ifdef GC_USE_ARCFOUR +# include "arcfour.h" +#endif #ifdef GC_USE_RIJNDAEL # include "rijndael-api-fst.h" #endif @@ -152,6 +158,9 @@ gc_set_allocators (gc_malloc_t func_malloc, typedef struct _gc_cipher_ctx { Gc_cipher alg; Gc_cipher_mode mode; +#ifdef GC_USE_ARCFOUR + arcfour_context arcfourContext; +#endif #ifdef GC_USE_RIJNDAEL rijndaelKeyInstance aesEncKey; rijndaelKeyInstance aesDecKey; @@ -173,6 +182,20 @@ gc_cipher_open (Gc_cipher alg, Gc_cipher_mode mode, switch (alg) { +#ifdef GC_USE_ARCFOUR + case GC_ARCFOUR128: + case GC_ARCFOUR40: + switch (mode) + { + case GC_STREAM: + break; + + default: + rc = GC_INVALID_CIPHER; + } + break; +#endif + #ifdef GC_USE_RIJNDAEL case GC_AES128: case GC_AES192: @@ -208,6 +231,13 @@ gc_cipher_setkey (gc_cipher_handle handle, size_t keylen, const char *key) switch (ctx->alg) { +#ifdef GC_USE_ARCFOUR + case GC_ARCFOUR128: + case GC_ARCFOUR40: + arcfour_setkey (&ctx->arcfourContext, key, keylen); + break; +#endif + #ifdef GC_USE_RIJNDAEL case GC_AES128: case GC_AES192: @@ -297,6 +327,13 @@ gc_cipher_encrypt_inline (gc_cipher_handle handle, size_t len, char *data) switch (ctx->alg) { +#ifdef GC_USE_ARCFOUR + case GC_ARCFOUR128: + case GC_ARCFOUR40: + arcfour_stream (&ctx->arcfourContext, data, data, len); + break; +#endif + #ifdef GC_USE_RIJNDAEL case GC_AES128: case GC_AES192: @@ -326,6 +363,13 @@ gc_cipher_decrypt_inline (gc_cipher_handle handle, size_t len, char *data) switch (ctx->alg) { +#ifdef GC_USE_ARCFOUR + case GC_ARCFOUR128: + case GC_ARCFOUR40: + arcfour_stream (&ctx->arcfourContext, data, data, len); + break; +#endif + #ifdef GC_USE_RIJNDAEL case GC_AES128: case GC_AES192: diff --git a/m4/ChangeLog b/m4/ChangeLog index 0337ab9fb5..704d9d79bb 100644 --- a/m4/ChangeLog +++ b/m4/ChangeLog @@ -1,5 +1,7 @@ 2005-10-19 Simon Josefsson + * gc-arcfour.m4: New file. + * gc-rijndael.m4: New file. 2005-10-19 Simon Josefsson diff --git a/m4/gc-arcfour.m4 b/m4/gc-arcfour.m4 new file mode 100644 index 0000000000..c5adf583af --- /dev/null +++ b/m4/gc-arcfour.m4 @@ -0,0 +1,15 @@ +# gc-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_GC_ARCFOUR], +[ + AC_REQUIRE([gl_GC]) + AC_DEFINE(GC_USE_ARCFOUR, 1, + [Define if you want to support ARCFOUR through GC.]) + if test "$ac_cv_libgcrypt" != yes; then + gl_ARCFOUR + fi +]) diff --git a/modules/gc-arcfour b/modules/gc-arcfour new file mode 100644 index 0000000000..99d9e1419b --- /dev/null +++ b/modules/gc-arcfour @@ -0,0 +1,26 @@ +Description: +Generic crypto wrappers for ARCFOUR stream cipher. + +Files: +m4/gc-arcfour.m4 +lib/arcfour.h +lib/arcfour.c +m4/arcfour.m4 + +Depends-on: +stdint +gc + +configure.ac: +gl_GC_ARCFOUR + +Makefile.am: + +Include: +"gc.h" + +License: +LGPL + +Maintainer: +Simon Josefsson diff --git a/modules/gc-arcfour-tests b/modules/gc-arcfour-tests new file mode 100644 index 0000000000..e6249aad82 --- /dev/null +++ b/modules/gc-arcfour-tests @@ -0,0 +1,11 @@ +Files: +tests/test-gc-arcfour.c + +Depends-on: + +configure.ac: + +Makefile.am: +TESTS += test-gc-arcfour +noinst_PROGRAMS += test-gc-arcfour +test_gc_arcfour_SOURCES = test-gc-arcfour.c diff --git a/tests/test-gc-arcfour.c b/tests/test-gc-arcfour.c new file mode 100644 index 0000000000..9a92da40dc --- /dev/null +++ b/tests/test-gc-arcfour.c @@ -0,0 +1,99 @@ +/* + * 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 +#endif + +#include +#include +#include "gc.h" + +int +main (int argc, char *argv[]) +{ + gc_cipher_handle 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]; + Gc_rc rc; + + rc = gc_init (); + if (rc != GC_OK) + { + printf ("gc_init() failed\n"); + return 1; + } + + rc = gc_cipher_open (GC_ARCFOUR40, GC_STREAM, &ctx); + if (rc != GC_OK) + return 1; + + rc = gc_cipher_setkey (ctx, sizeof (key_1), key_1); + if (rc != GC_OK) + return 1; + + memcpy (scratch, plaintext_1, sizeof (plaintext_1)); + rc = gc_cipher_encrypt_inline (ctx, sizeof (plaintext_1), scratch); + if (rc != GC_OK) + return 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 */ + + rc = gc_cipher_setkey (ctx, sizeof (key_1), key_1); + if (rc != GC_OK) + return 1; + + rc = gc_cipher_decrypt_inline (ctx, sizeof (plaintext_1), scratch); + if (rc != GC_OK) + return 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; + } + + gc_done (); + + return 0; +} -- 2.30.2