diff options
author | Werner Koch <[email protected]> | 1999-02-10 16:22:40 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 1999-02-10 16:22:40 +0000 |
commit | 9a4f506a18ed04f5dbd69d74ec0c35ade79e357a (patch) | |
tree | 07178f77cb23862b045b0edf8a2bc5ce188432cd /cipher | |
parent | See ChangeLog: Sun Jan 24 18:16:26 CET 1999 Werner Koch (diff) | |
download | gnupg-9a4f506a18ed04f5dbd69d74ec0c35ade79e357a.tar.gz gnupg-9a4f506a18ed04f5dbd69d74ec0c35ade79e357a.zip |
See ChangeLog: Wed Feb 10 17:15:39 CET 1999 Werner Koch
Diffstat (limited to 'cipher')
-rw-r--r-- | cipher/ChangeLog | 12 | ||||
-rw-r--r-- | cipher/Makefile.am | 55 | ||||
-rw-r--r-- | cipher/blowfish.c | 1 | ||||
-rw-r--r-- | cipher/cipher.c | 3 | ||||
-rw-r--r-- | cipher/dynload.c | 3 | ||||
-rw-r--r-- | cipher/dynload.h | 5 | ||||
-rw-r--r-- | cipher/md.c | 65 | ||||
-rw-r--r-- | cipher/md5.c | 57 | ||||
-rw-r--r-- | cipher/md5.h | 34 | ||||
-rw-r--r-- | cipher/pubkey.c | 1 | ||||
-rw-r--r-- | cipher/random.c | 11 | ||||
-rw-r--r-- | cipher/rmd.h | 12 | ||||
-rw-r--r-- | cipher/rmd160.c | 63 | ||||
-rw-r--r-- | cipher/rndunix.c | 3 | ||||
-rw-r--r-- | cipher/sha1.c | 65 | ||||
-rw-r--r-- | cipher/sha1.h | 33 | ||||
-rw-r--r-- | cipher/tiger.c | 18 | ||||
-rw-r--r-- | cipher/twofish.c | 10 |
18 files changed, 300 insertions, 151 deletions
diff --git a/cipher/ChangeLog b/cipher/ChangeLog index 273b6fdee..1858f6a50 100644 --- a/cipher/ChangeLog +++ b/cipher/ChangeLog @@ -1,3 +1,15 @@ +Wed Feb 10 17:15:39 CET 1999 Werner Koch <[email protected]> + + * Makefile.am: Modules are now figured out by configure + * construct.c: New. Generated by configure. Changed all modules + to work with that. + * sha1.h: Removed. + * md5.h: Removed. + + * twofish.c: Changed interface to allow Twofish/256 + + * rndunix.c (start_gatherer): Die on SIGPIPE. + Wed Jan 20 18:59:49 CET 1999 Werner Koch <[email protected]> * rndunix.c (gather_random): Fix to avoid infinite loop. diff --git a/cipher/Makefile.am b/cipher/Makefile.am index 4a7171071..b21dc18f5 100644 --- a/cipher/Makefile.am +++ b/cipher/Makefile.am @@ -1,12 +1,33 @@ ## Process this file with automake to produce Makefile.in + INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/intl noinst_LIBRARIES = libcipher.a -EXTRA_PROGRAMS = tiger twofish rndunix rndlinux +# The configure script greps the module names from the following lines. +# You must also add all these names to EXTRA_PROGRAMS some lines below +# and EXTRA_foo_SOURCES entries. +# Hmmm is there a more easy way to do this? (EXTRA_PROGRAMS +# might also list programs which are not modules) +# MODULES: rndunix rndlinux +# MODULES: sha1 rmd160 md5 tiger +# MODULES: twofish +EXTRA_PROGRAMS = rndunix rndlinux \ + sha1 rmd160 md5 tiger \ + twofish + +EXTRA_rndlinux_SOURCES = rndlinux.c +EXTRA_rndunix_SOURCES = rndunix.c +EXTRA_md5_SOURCES = md5.c +EXTRA_rmd160_SOURCES = rmd160.c +EXTRA_sha1_SOURCES = sha1.c +EXTRA_tiger_SOURCES = tiger.c +EXTRA_twofish_SOURCES = twofish.c + + if ENABLE_GNUPG_EXTENSIONS -pkglib_PROGRAMS = @DYNAMIC_CIPHER_MODS@ @DYNAMIC_RANDOM_MODS@ +pkglib_PROGRAMS = @DYNAMIC_CIPHER_MODS@ else pkglib_PROGRAMS = endif @@ -27,37 +48,41 @@ libcipher_a_SOURCES = cipher.c \ cast5.h \ elgamal.c \ elgamal.h \ - md5.c \ - md5.h \ primegen.c \ random.h \ random.c \ rand-internal.h \ rmd.h \ - rmd160.c \ - sha1.h \ - sha1.c \ dsa.h \ dsa.c \ g10c.c \ - smallprime.c + smallprime.c \ + construct.c +# configure creates the constructor file +BUILT_SOURCES = construct.c -EXTRA_libcipher_a_SOURCES = rndlinux.c rndunix.c -EXTRA_tiger_SOURCES = tiger.c -EXTRA_twofish_SOURCES = twofish.c -libcipher_a_DEPENDENCIES = @STATIC_RANDOM_OBJS@ @STATIC_CIPHER_OBJS@ -libcipher_a_LIBADD = @STATIC_RANDOM_OBJS@ @STATIC_CIPHER_OBJS@ +libcipher_a_DEPENDENCIES = @STATIC_CIPHER_OBJS@ +libcipher_a_LIBADD = @STATIC_CIPHER_OBJS@ + +# If I remember it correct, automake 1.4 has a feature to set +# fooFLAGS depending on the program. So we should check it out. tiger: $(srcdir)/tiger.c `echo $(COMPILE) $(DYNLINK_MOD_CFLAGS) -o tiger $(srcdir)/tiger.c | \ - sed -e 's/-O[2-9]*/-O1/' ` + sed -e 's/-O[2-9]*/-O1/g' ` + +tiger.o: $(srcdir)/tiger.c + `echo $(COMPILE) $(srcdir)/tiger.c | sed -e 's/-O[2-9]*/-O1/g' ` twofish: $(srcdir)/twofish.c `echo $(COMPILE) $(DYNLINK_MOD_CFLAGS) -o twofish $(srcdir)/twofish.c | \ - sed -e 's/-O[0-9]*/ /' ` + sed -e 's/-O[0-9]*/ /g' ` + +twofish.o: $(srcdir)/twofish.c + `echo $(COMPILE) $(srcdir)/twofish.c | sed -e 's/-O[0-9]*/ /g' ` rndunix: $(srcdir)/rndunix.c diff --git a/cipher/blowfish.c b/cipher/blowfish.c index 3bbc03835..8cffa8b3e 100644 --- a/cipher/blowfish.c +++ b/cipher/blowfish.c @@ -37,6 +37,7 @@ #include "types.h" #include "errors.h" #include "blowfish.h" +#include "dynload.h" diff --git a/cipher/cipher.c b/cipher/cipher.c index f27eec397..37d60251b 100644 --- a/cipher/cipher.c +++ b/cipher/cipher.c @@ -18,8 +18,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ -#define DEFINES_CIPHER_HANDLE 1 - #include <config.h> #include <stdio.h> #include <stdlib.h> @@ -160,6 +158,7 @@ load_cipher_modules() int any = 0; if( !initialized ) { + cipher_modules_constructor(); setup_cipher_table(); /* load static modules on the first call */ initialized = 1; return 1; diff --git a/cipher/dynload.c b/cipher/dynload.c index 6b9263e18..b8c7c67d8 100644 --- a/cipher/dynload.c +++ b/cipher/dynload.c @@ -66,6 +66,7 @@ typedef struct { int seq1; int seq2; void *sym; + int reqalgo; } ENUMCONTEXT; @@ -323,6 +324,7 @@ enum_gnupgext_digests( void **enum_context, if( !*enum_context ) { /* init context */ ctx = m_alloc_clear( sizeof( *ctx ) ); ctx->r = extensions; + ctx->reqalgo = *algo; *enum_context = ctx; } else if( !algo ) { /* release the context */ @@ -333,6 +335,7 @@ enum_gnupgext_digests( void **enum_context, else ctx = *enum_context; + /* fixme: have a look at the hint string */ for( r = ctx->r; r; r = r->next ) { int class, vers; diff --git a/cipher/dynload.h b/cipher/dynload.h index f22f5f3ee..792531cf0 100644 --- a/cipher/dynload.h +++ b/cipher/dynload.h @@ -20,6 +20,8 @@ #ifndef G10_CIPHER_DYNLOAD_H #define G10_CIPHER_DYNLOAD_H +#include "mpi.h" + void register_internal_cipher_extension( const char *module_id, void * (*enumfunc)(int, int*, int*, int*) ); @@ -60,4 +62,7 @@ void (*dynload_getfnc_fast_random_poll(void) )( void (*)(const void*, size_t, int), int ); +/** This function is in construct.c **/ +void cipher_modules_constructor(void); + #endif /*G10_CIPHER_DYNLOAD_H*/ diff --git a/cipher/md.c b/cipher/md.c index 6e335db80..6c4d1124b 100644 --- a/cipher/md.c +++ b/cipher/md.c @@ -18,8 +18,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ -#define DEFINES_MD_HANDLE 1 - #include <config.h> #include <stdio.h> #include <stdlib.h> @@ -30,8 +28,6 @@ #include "cipher.h" #include "errors.h" #include "dynload.h" -#include "md5.h" -#include "sha1.h" #include "rmd.h" @@ -57,7 +53,6 @@ struct md_digest_list_s { static struct md_digest_list_s *digest_list; - static struct md_digest_list_s * new_list_item( int algo, const char *(*get_info)( int, size_t*,byte**, int*, int*, @@ -79,33 +74,19 @@ new_list_item( int algo, return r; } -/**************** - * Put the static entries into the table. - */ -static void -setup_digest_list() -{ - struct md_digest_list_s *r; - - r = new_list_item( DIGEST_ALGO_MD5, md5_get_info ); - if( r ) { r->next = digest_list; digest_list = r; } - - r = new_list_item( DIGEST_ALGO_RMD160, rmd160_get_info ); - if( r ) { r->next = digest_list; digest_list = r; } - - r = new_list_item( DIGEST_ALGO_SHA1, sha1_get_info ); - if( r ) { r->next = digest_list; digest_list = r; } -} /**************** - * Try to load all modules and return true if new modules are available + * Try to load the modules with the requeste algorithm + * and return true if new modules are available + * If req_alog is -1 try to load all digest algorithms. */ static int -load_digest_modules() +load_digest_module( int req_algo ) { - static int done = 0; static int initialized = 0; + static u32 checked_algos[256/32]; + static int checked_all = 0; struct md_digest_list_s *r; void *context = NULL; int algo; @@ -116,16 +97,24 @@ load_digest_modules() void (**)(void*),byte *(**)(void*)); if( !initialized ) { - setup_digest_list(); /* load static modules on the first call */ + cipher_modules_constructor(); initialized = 1; - return 1; } - - if( done ) - return 0; - done = 1; + algo = req_algo; + if( algo > 255 || !algo ) + return 0; /* algorithm number too high (does not fit into out bitmap)*/ + if( checked_all ) + return 0; /* already called with -1 */ + if( algo < 0 ) + checked_all = 1; + else if( (checked_algos[algo/32] & (1 << (algo%32))) ) + return 0; /* already checked and not found */ + else + checked_algos[algo/32] |= (1 << (algo%32)); while( enum_gnupgext_digests( &context, &algo, &get_info ) ) { + if( req_algo != -1 && algo != req_algo ) + continue; for(r=digest_list; r; r = r->next ) if( r->algo == algo ) break; @@ -144,6 +133,8 @@ load_digest_modules() r->next = digest_list; digest_list = r; any = 1; + if( req_algo != -1 ) + break; } enum_gnupgext_digests( &context, NULL, NULL ); return any; @@ -163,7 +154,7 @@ string_to_digest_algo( const char *string ) for(r = digest_list; r; r = r->next ) if( !stricmp( r->name, string ) ) return r->algo; - } while( !r && load_digest_modules() ); + } while( !r && load_digest_module(-1) ); return 0; } @@ -180,7 +171,7 @@ digest_algo_to_string( int algo ) for(r = digest_list; r; r = r->next ) if( r->algo == algo ) return r->name; - } while( !r && load_digest_modules() ); + } while( !r && load_digest_module( algo ) ); return NULL; } @@ -194,7 +185,7 @@ check_digest_algo( int algo ) for(r = digest_list; r; r = r->next ) if( r->algo == algo ) return 0; - } while( !r && load_digest_modules() ); + } while( !r && load_digest_module(algo) ); return G10ERR_DIGEST_ALGO; } @@ -241,7 +232,7 @@ md_enable( MD_HANDLE h, int algo ) for(r = digest_list; r; r = r->next ) if( r->algo == algo ) break; - } while( !r && load_digest_modules() ); + } while( !r && load_digest_module( algo ) ); if( !r ) { log_error("md_enable: algorithm %d not available\n", algo ); return; @@ -456,7 +447,7 @@ md_digest_length( int algo ) if( r->algo == algo ) return r->mdlen; } - } while( !r && load_digest_modules() ); + } while( !r && load_digest_module( algo ) ); log_error("WARNING: no length for md algo %d\n", algo); return 0; } @@ -479,7 +470,7 @@ md_asn_oid( int algo, size_t *asnlen, size_t *mdlen ) return r->asnoid; } } - } while( !r && load_digest_modules() ); + } while( !r && load_digest_module( algo ) ); log_bug("no asn for md algo %d\n", algo); return NULL; } diff --git a/cipher/md5.c b/cipher/md5.c index 214e13727..6a53deda8 100644 --- a/cipher/md5.c +++ b/cipher/md5.c @@ -34,8 +34,8 @@ #include <string.h> #include <assert.h> #include "util.h" -#include "md5.h" #include "memory.h" +#include "dynload.h" typedef struct { @@ -338,7 +338,7 @@ md5_read( MD5_CONTEXT *hd ) * Returns: A pointer to string describing the algorithm or NULL if * the ALGO is invalid. */ -const char * +static const char * md5_get_info( int algo, size_t *contextsize, byte **r_asnoid, int *r_asnlen, int *r_mdlen, void (**r_init)( void *c ), @@ -367,5 +367,58 @@ md5_get_info( int algo, size_t *contextsize, } +#ifndef IS_MODULE +static +#endif +const char * const gnupgext_version = "MD5 ($Revision$)"; + +static struct { + int class; + int version; + int value; + void (*func)(void); +} func_table[] = { + { 10, 1, 0, (void(*)(void))md5_get_info }, + { 11, 1, 1 }, +}; + + +#ifndef IS_MODULE +static +#endif +void * +gnupgext_enum_func( int what, int *sequence, int *class, int *vers ) +{ + void *ret; + int i = *sequence; + + do { + if( i >= DIM(func_table) || i < 0 ) + return NULL; + *class = func_table[i].class; + *vers = func_table[i].version; + switch( *class ) { + case 11: case 21: case 31: ret = &func_table[i].value; break; + default: ret = func_table[i].func; break; + } + i++; + } while( what && what != *class ); + + *sequence = i; + return ret; +} + + + + +#ifndef IS_MODULE +void +md5_constructor(void) +{ + register_internal_cipher_extension( gnupgext_version, gnupgext_enum_func ); +} +#endif + + /* end of file */ diff --git a/cipher/md5.h b/cipher/md5.h deleted file mode 100644 index 89fc843cc..000000000 --- a/cipher/md5.h +++ /dev/null @@ -1,34 +0,0 @@ -/* md5.h - message digest 5 - * Copyright (C) 1998 Free Software Foundation, Inc. - * - * This file is part of GnuPG. - * - * GnuPG 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 of the License, or - * (at your option) any later version. - * - * GnuPG 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ -#ifndef G10_MD5_H -#define G10_MD5_H - - -const char * -md5_get_info( int algo, size_t *contextsize, - byte **r_asnoid, int *r_asn_len, int *r_mdlen, - void (**r_init)( void *c ), - void (**r_write)( void *c, byte *buf, size_t nbytes ), - void (**r_final)( void *c ), - byte *(**r_read)( void *c ) - ); - - -#endif /*G10_MD5_H*/ diff --git a/cipher/pubkey.c b/cipher/pubkey.c index 2ca8dd854..58ba00007 100644 --- a/cipher/pubkey.c +++ b/cipher/pubkey.c @@ -170,6 +170,7 @@ load_pubkey_modules() if( !initialized ) { + cipher_modules_constructor(); setup_pubkey_table(); initialized = 1; return 1; diff --git a/cipher/random.c b/cipher/random.c index b0bc832e6..bcd017d4c 100644 --- a/cipher/random.c +++ b/cipher/random.c @@ -116,16 +116,7 @@ initialize() keypool = secure_alloc ? m_alloc_secure_clear(POOLSIZE+BLOCKLEN) : m_alloc_clear(POOLSIZE+BLOCKLEN); is_initialized = 1; - - #if USE_RNDLINUX - rndlinux_constructor(); - #elif USE_RNDUNIX - rndunix_constructor(); - #elif USE_RNDW32 - #elif USE_RNDOS2 - #elif USE_RNDATARI - #elif USE_RNDMVS - #endif + cipher_modules_constructor(); } void diff --git a/cipher/rmd.h b/cipher/rmd.h index 0c1fbad99..cd5c453a3 100644 --- a/cipher/rmd.h +++ b/cipher/rmd.h @@ -32,16 +32,4 @@ typedef struct { void rmd160_init( RMD160_CONTEXT *hd ); void rmd160_mixblock( RMD160_CONTEXT *hd, char *buffer ); - - -const char * -rmd160_get_info( int algo, size_t *contextsize, - byte **r_asnoid, int *r_asn_len, int *r_mdlen, - void (**r_init)( void *c ), - void (**r_write)( void *c, byte *buf, size_t nbytes ), - void (**r_final)( void *c ), - byte *(**r_read)( void *c ) - ); - - #endif /*G10_RMD_H*/ diff --git a/cipher/rmd160.c b/cipher/rmd160.c index 4d644756f..70904a144 100644 --- a/cipher/rmd160.c +++ b/cipher/rmd160.c @@ -27,6 +27,7 @@ #include "memory.h" #include "rmd.h" #include "cipher.h" /* only used for the rmd160_hash_buffer() prototype */ +#include "dynload.h" /********************************* * RIPEMD-160 is not patented, see (as of 25.10.97) @@ -554,7 +555,7 @@ rmd160_hash_buffer( char *outbuf, const char *buffer, size_t length ) * Returns: A pointer to string describing the algorithm or NULL if * the ALGO is invalid. */ -const char * +static const char * rmd160_get_info( int algo, size_t *contextsize, byte **r_asnoid, int *r_asnlen, int *r_mdlen, void (**r_init)( void *c ), @@ -582,3 +583,63 @@ rmd160_get_info( int algo, size_t *contextsize, return "RIPEMD160"; } + +#ifndef IS_MODULE +static +#endif +const char * const gnupgext_version = "RMD160 ($Revision$)"; + +static struct { + int class; + int version; + int value; + void (*func)(void); +} func_table[] = { + { 10, 1, 0, (void(*)(void))rmd160_get_info }, + { 11, 1, 3 }, +}; + + +#ifndef IS_MODULE +static +#endif +void * +gnupgext_enum_func( int what, int *sequence, int *class, int *vers ) +{ + void *ret; + int i = *sequence; + + do { + if( i >= DIM(func_table) || i < 0 ) { + return NULL; + } + *class = func_table[i].class; + *vers = func_table[i].version; + switch( *class ) { + case 11: + case 21: + case 31: + ret = &func_table[i].value; + break; + default: + ret = func_table[i].func; + break; + } + i++; + } while( what && what != *class ); + + *sequence = i; + return ret; +} + + + + +#ifndef IS_MODULE +void +rmd160_constructor(void) +{ + register_internal_cipher_extension( gnupgext_version, gnupgext_enum_func ); +} +#endif + diff --git a/cipher/rndunix.c b/cipher/rndunix.c index 716b02672..0132cd901 100644 --- a/cipher/rndunix.c +++ b/cipher/rndunix.c @@ -642,6 +642,9 @@ start_gatherer( int pipefd ) select(0, NULL, NULL, NULL, &tv); continue; } + if( errno == EPIPE ) /* parent has exited, so give up */ + exit(0); + /* we can't do very much here because stderr is closed */ if( dbgfp ) fprintf(dbgfp, "gatherer can't write to pipe: %s\n", diff --git a/cipher/sha1.c b/cipher/sha1.c index b3da296f8..04bdbac98 100644 --- a/cipher/sha1.c +++ b/cipher/sha1.c @@ -38,7 +38,7 @@ #include <assert.h> #include "util.h" #include "memory.h" -#include "sha1.h" +#include "dynload.h" typedef struct { @@ -331,7 +331,7 @@ sha1_read( SHA1_CONTEXT *hd ) * Returns: A pointer to string describing the algorithm or NULL if * the ALGO is invalid. */ -const char * +static const char * sha1_get_info( int algo, size_t *contextsize, byte **r_asnoid, int *r_asnlen, int *r_mdlen, void (**r_init)( void *c ), @@ -358,3 +358,64 @@ sha1_get_info( int algo, size_t *contextsize, return "SHA1"; } + + +#ifndef IS_MODULE +static +#endif +const char * const gnupgext_version = "SHA1 ($Revision$)"; + +static struct { + int class; + int version; + int value; + void (*func)(void); +} func_table[] = { + { 10, 1, 0, (void(*)(void))sha1_get_info }, + { 11, 1, 2 }, +}; + + +#ifndef IS_MODULE +static +#endif +void * +gnupgext_enum_func( int what, int *sequence, int *class, int *vers ) +{ + void *ret; + int i = *sequence; + + do { + if( i >= DIM(func_table) || i < 0 ) { + return NULL; + } + *class = func_table[i].class; + *vers = func_table[i].version; + switch( *class ) { + case 11: + case 21: + case 31: + ret = &func_table[i].value; + break; + default: + ret = func_table[i].func; + break; + } + i++; + } while( what && what != *class ); + + *sequence = i; + return ret; +} + + + + +#ifndef IS_MODULE +void +sha1_constructor(void) +{ + register_internal_cipher_extension( gnupgext_version, gnupgext_enum_func ); +} +#endif + diff --git a/cipher/sha1.h b/cipher/sha1.h deleted file mode 100644 index 3d9302671..000000000 --- a/cipher/sha1.h +++ /dev/null @@ -1,33 +0,0 @@ -/* sha1.h - SHA1 hash function - * Copyright (C) 1998 Free Software Foundation, Inc. - * - * This file is part of GnuPG. - * - * GnuPG 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 of the License, or - * (at your option) any later version. - * - * GnuPG 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ -#ifndef G10_SHA1_H -#define G10_SHA1_H - - -const char * -sha1_get_info( int algo, size_t *contextsize, - byte **r_asnoid, int *r_asn_len, int *r_mdlen, - void (**r_init)( void *c ), - void (**r_write)( void *c, byte *buf, size_t nbytes ), - void (**r_final)( void *c ), - byte *(**r_read)( void *c ) - ); - -#endif /*G10_SHA1_H*/ diff --git a/cipher/tiger.c b/cipher/tiger.c index 20d17cae0..0765f0bbd 100644 --- a/cipher/tiger.c +++ b/cipher/tiger.c @@ -909,6 +909,9 @@ tiger_get_info( int algo, size_t *contextsize, +#ifndef IS_MODULE +static +#endif const char * const gnupgext_version = "TIGER ($Revision$)"; static struct { @@ -938,6 +941,9 @@ static struct { * version = interface version of the function/pointer * (currently this is 1 for all functions) */ +#ifndef IS_MODULE +static +#endif void * gnupgext_enum_func( int what, int *sequence, int *class, int *vers ) { @@ -969,5 +975,17 @@ gnupgext_enum_func( int what, int *sequence, int *class, int *vers ) return ret; } + + +#ifndef IS_MODULE +void +tiger_constructor(void) +{ + register_internal_cipher_extension( gnupgext_version, + gnupgext_enum_func ); +} +#endif + + #endif /* HAVE_U64_TYPEDEF */ diff --git a/cipher/twofish.c b/cipher/twofish.c index 6ff7dee9f..d1e171bad 100644 --- a/cipher/twofish.c +++ b/cipher/twofish.c @@ -24,6 +24,7 @@ #include "types.h" /* for byte and u32 typedefs */ #include "util.h" #include "errors.h" +#include "dynload.h" /* Prototype for the self-test function. */ @@ -462,7 +463,7 @@ twofish_setkey (TWOFISH_context *ctx, const byte *key, const unsigned keylen) static const char *selftest_failed=0; /* Check key length. */ - if( keylen != 16 ) + if( keylen != 16 ) /* enhance this code for 256 bit keys */ return G10ERR_WRONG_KEYLEN; /* Do self-test if necessary. */ @@ -840,16 +841,18 @@ twofish_get_info (int algo, size_t *keylen, void (**r_decrypt) (void *c, byte *outbuf, byte *inbuf) ) { - *keylen = 128; + *keylen = algo==10? 256 : 128; *blocksize = 16; *contextsize = sizeof (TWOFISH_context); *r_setkey = FNCCAST_SETKEY (twofish_setkey); *r_encrypt= FNCCAST_CRYPT (twofish_encrypt); *r_decrypt= FNCCAST_CRYPT (twofish_decrypt); + if( algo == 10 ) + return "TWOFISH"; if (algo == 102) /* This algorithm number is assigned for * experiments, so we can use it */ - return "TWOFISH"; + return "TWOFISH128"; return NULL; } @@ -863,6 +866,7 @@ static struct { void (*func)(void); } func_table[] = { { 20, 1, 0, (void(*)(void))twofish_get_info }, + { 21, 1, 10 }, { 21, 1, 102 }, }; |