1
0
mirror of https://https.git.savannah.gnu.org/git/gnulib.git synced 2026-05-13 15:13:36 +00:00

Add gc-arcfour and gc-arcfour-tests modules.

This commit is contained in:
Simon Josefsson
2005-10-19 15:40:26 +00:00
parent 76990ea313
commit c4f00b7d32
8 changed files with 207 additions and 0 deletions

View File

@@ -1,3 +1,9 @@
2005-10-19 Simon Josefsson <jas@extundo.com>
* tests/test-gc-arcfour.c: New file.
* modules/gc-arcfour, modules/gc-arcfour-tests: New files.
2005-10-19 Simon Josefsson <jas@extundo.com>
* tests/test-gc-rijndael.c: New file.

View File

@@ -1,3 +1,7 @@
2005-10-19 Simon Josefsson <jas@extundo.com>
* gc-gnulib.c: Support ARCFOUR.
2005-10-19 Simon Josefsson <jas@extundo.com>
* gc-gnulib.c: Implement gc_cipher_* API, currently only with AES

View File

@@ -37,6 +37,7 @@
#include <fcntl.h>
#include <errno.h>
/* 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:

View File

@@ -1,5 +1,7 @@
2005-10-19 Simon Josefsson <jas@extundo.com>
* gc-arcfour.m4: New file.
* gc-rijndael.m4: New file.
2005-10-19 Simon Josefsson <jas@extundo.com>

15
m4/gc-arcfour.m4 Normal file
View File

@@ -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
])

26
modules/gc-arcfour Normal file
View File

@@ -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

11
modules/gc-arcfour-tests Normal file
View File

@@ -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

99
tests/test-gc-arcfour.c Normal file
View File

@@ -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 <config.h>
#endif
#include <stdio.h>
#include <string.h>
#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;
}