From d9b3dc000085007bdd198ca4c0500e80a72475d7 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Thu, 11 Jun 1998 07:16:50 +0000 Subject: [PATCH] update from tobold --- ChangeLog | 4 + Makefile.in | 2 - acconfig.h | 1 + cipher/ChangeLog | 5 ++ cipher/cipher.c | 104 ++++++++++++------------ cipher/dynload.c | 187 +++++++++++++++++++++++++++++++++++++++++++- cipher/dynload.h | 7 ++ cipher/pubkey.c | 84 ++++++++++++++++++++ cipher/rand-dummy.c | 2 +- config.h.in | 1 + configure.in | 3 + g10/ChangeLog | 4 + g10/Makefile.am | 1 + g10/Makefile.in | 2 +- g10/encode.c | 4 +- g10/g10.c | 6 +- g10/options.h | 1 + g10/packet.h | 16 +--- g10/pubkey-enc.c | 10 +-- g10/sign.c | 9 ++- include/cipher.h | 3 + include/mpi.h | 9 +-- include/util.h | 1 + mpi/Makefile.in | 2 - tools/Makefile.in | 2 - tools/mk-tdata | Bin 35307 -> 11769 bytes util/ChangeLog | 6 ++ util/Makefile.in | 2 - util/argparse.c | 7 +- util/fileutil.c | 14 ++++ zlib/Makefile | 2 - zlib/Makefile.in | 2 - 32 files changed, 402 insertions(+), 101 deletions(-) create mode 100644 cipher/pubkey.c diff --git a/ChangeLog b/ChangeLog index 01026b786..5db61423e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Wed Jun 10 07:48:59 1998 Werner Koch,mobil,,, (wk@tobold) + + * configure.in (GNUPG_LIBDIR): New. + Mon May 25 19:10:59 1998 Werner Koch (wk@isil.d.shuttle.de) * rand-unix.c (fast_random_poll): fixed syntax bug. diff --git a/Makefile.in b/Makefile.in index cd28655e3..b5bcddac5 100644 --- a/Makefile.in +++ b/Makefile.in @@ -64,8 +64,6 @@ target_triplet = @target@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ -CIPHER_EXTRA_DIST = @CIPHER_EXTRA_DIST@ -CIPHER_EXTRA_OBJS = @CIPHER_EXTRA_OBJS@ CPP = @CPP@ DATADIRNAME = @DATADIRNAME@ G10_LOCALEDIR = @G10_LOCALEDIR@ diff --git a/acconfig.h b/acconfig.h index 477ef64ef..50014cf39 100644 --- a/acconfig.h +++ b/acconfig.h @@ -33,6 +33,7 @@ #undef PACKAGE #undef G10_LOCALEDIR #undef PRINTABLE_OS_NAME +#undef GNUPG_LIBDIR /* Define if your locale.h file contains LC_MESSAGES. */ #undef HAVE_LC_MESSAGES diff --git a/cipher/ChangeLog b/cipher/ChangeLog index 79f3dc171..6e59455a9 100644 --- a/cipher/ChangeLog +++ b/cipher/ChangeLog @@ -1,3 +1,8 @@ +Wed Jun 10 07:52:08 1998 Werner Koch,mobil,,, (wk@tobold) + + * dynload.c: New + * cipher.c: Major changes to allow extensions. + Mon Jun 8 22:43:00 1998 Werner Koch (wk@isil.d.shuttle.de) * cipher.c: Major internal chnages to support extensions. diff --git a/cipher/cipher.c b/cipher/cipher.c index 5d39c3ca3..6ac468274 100644 --- a/cipher/cipher.c +++ b/cipher/cipher.c @@ -32,21 +32,23 @@ #include "blowfish.h" #include "cast5.h" #include "des.h" +#include "dynload.h" -#include #define STD_BLOCKSIZE 8 #define TABLE_SIZE 20 -static struct { +struct cipher_table_s { const char *name; int algo; - int keylen; - int contextsize; /* allocate this amount of context */ + size_t keylen; + size_t contextsize; /* allocate this amount of context */ void (*setkey)( void *c, byte *key, unsigned keylen ); void (*encrypt)( void *c, byte *outbuf, byte *inbuf ); void (*decrypt)( void *c, byte *outbuf, byte *inbuf ); -} cipher_table[TABLE_SIZE]; +}; + +static struct cipher_table_s cipher_table[TABLE_SIZE]; struct cipher_handle_s { @@ -142,56 +144,54 @@ static int load_cipher_modules() { static int done = 0; + void *context = NULL; + struct cipher_table_s *ct; + int ct_idx; + size_t blocksize; + int i; + const char *name; + int any = 0; - if( !done ) { - void *handle; - char **name; - void *sym; - void * (*enumfunc)(int, int*, int*, int*); - const char *err; + if( done ) + return 0; + done = 1; - log_debug("load_cipher_modules\n"); - handle = dlopen("/sahara/proj/psst+g10/non-free-src/rsa+idea.so", RTLD_LAZY); - if( !handle ) - log_bug("dlopen(rsa+idea) failed: %s\n", dlerror() ); - name = (char**)dlsym(handle, "gnupgext_version"); - if( (err=dlerror()) ) - log_error("dlsym: gnupgext_version not found: %s\n", err ); - else { - log_debug("dlsym: gnupgext_version='%s'\n", *name ); - sym = dlsym(handle, "gnupgext_enum_func"); - if( (err=dlerror()) ) - log_error("dlsym: gnupgext_enum_func not found: %s\n", err ); - else { - int seq = 0; - int class, vers; - - enumfunc = (void *(*)(int,int*,int*,int*))sym; - while( (sym = enumfunc(0, &seq, &class, &vers)) ) { - if( vers != 1 ) { - log_debug("ignoring extfunc with version %d\n", vers); - continue; - } - switch( class ) { - case 11: - case 21: - case 31: - log_info("provides %s algorithm %d\n", - class == 11? "md" : - class == 21? "cipher" : "pubkey", - *(int*)sym); - break; - default: - log_debug("skipping class %d\n", class); - } - } - } - } - dlclose(handle); - done = 1; + for(ct_idx=0, ct = cipher_table; ct_idx < TABLE_SIZE; ct_idx++,ct++ ) { + if( !ct->name ) + break; } - - return 0; + if( ct_idx >= TABLE_SIZE-1 ) + BUG(); /* table already full */ + /* now load all extensions */ + while( (name = enum_gnupgext_ciphers( &context, &ct->algo, + &ct->keylen, &blocksize, &ct->contextsize, + &ct->setkey, &ct->encrypt, &ct->decrypt)) ) { + if( blocksize != STD_BLOCKSIZE ) { + log_info("skipping cipher %d: unsupported blocksize\n", ct->algo); + continue; + } + for(i=0; cipher_table[i].name; i++ ) + if( cipher_table[i].algo == ct->algo ) + break; + if( cipher_table[i].name ) { + log_info("skipping cipher %d: already loaded\n", ct->algo ); + continue; + } + /* put it into the table */ + log_info("loaded cipher %d (%s)\n", ct->algo, name); + ct->name = name; + ct_idx++; + ct++; + any = 1; + /* check whether there are more available table slots */ + if( ct_idx >= TABLE_SIZE-1 ) { + log_info("cipher table full; ignoring other extensions\n"); + break; + } + } + enum_gnupgext_ciphers( &context, NULL, NULL, NULL, NULL, + NULL, NULL, NULL ); + return any; } diff --git a/cipher/dynload.c b/cipher/dynload.c index 19e035d9d..b40eb4056 100644 --- a/cipher/dynload.c +++ b/cipher/dynload.c @@ -18,13 +18,194 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ - - #include #include #include - +#include +#include +#include "util.h" +#include "cipher.h" #include "dynload.h" +typedef struct ext_list { + struct ext_list *next; + void *handle; /* handle from dlopen() */ + int failed; /* already tried but failed */ + void * (*enumfunc)(int, int*, int*, int*); + char name[1]; +} *EXTLIST; + +static EXTLIST extensions; + +typedef struct { + EXTLIST r; + int seq1; + int seq2; + void *sym; +} ENUMCONTEXT; + +/**************** + * Register an extension module. The last registered module will + * be loaded first. + */ +void +register_cipher_extension( const char *fname ) +{ + EXTLIST r, el; + + if( *fname != '/' ) { /* do tilde expansion etc */ + char *p ; + + if( strchr(fname, '/') ) + p = make_filename(fname, NULL); + else + p = make_filename(GNUPG_LIBDIR, fname, NULL); + el = m_alloc_clear( sizeof *el + strlen(p) ); + strcpy(el->name, p ); + m_free(p); + } + else { + el = m_alloc_clear( sizeof *el + strlen(fname) ); + strcpy(el->name, fname ); + } + /* check that it is not already registered */ + for(r = extensions; r; r = r->next ) + if( !compare_filenames(r->name, el->name) ) { + log_debug("extension '%s' already registered\n", el->name ); + m_free(el); + return; + } + log_debug("extension '%s' registered\n", el->name ); + /* and register */ + el->next = extensions; + extensions = el; +} +static int +load_extension( EXTLIST el ) +{ + char **name; + void *sym; + const char *err; + int seq = 0; + int class, vers; + + el->handle = dlopen(el->name, RTLD_LAZY); + if( !el->handle ) { + log_error("%s: error loading extension: %s\n", el->name, dlerror() ); + goto failure; + } + name = (char**)dlsym(el->handle, "gnupgext_version"); + if( (err=dlerror()) ) { + log_error("%s: not a gnupg extension: %s\n", el->name, err ); + goto failure; + } + + log_info("%s: version '%s'\n", el->name, *name ); + + sym = dlsym(el->handle, "gnupgext_enum_func"); + if( (err=dlerror()) ) { + log_error("%s: invalid gnupg extension: %s\n", el->name, err ); + goto failure; + } + el->enumfunc = (void *(*)(int,int*,int*,int*))sym; + + /* list the contents of the module */ + while( (sym = (*el->enumfunc)(0, &seq, &class, &vers)) ) { + if( vers != 1 ) { + log_error("%s: ignoring func with version %d\n", el->name, vers); + continue; + } + switch( class ) { + case 11: + case 21: + case 31: + log_info("%s: provides %s algorithm %d\n", el->name, + class == 11? "md" : + class == 21? "cipher" : "pubkey", + *(int*)sym); + break; + default: + log_debug("%s: skipping class %d\n", el->name, class); + } + } + return 0; + + failure: + if( el->handle ) { + dlclose(el->handle); + el->handle = NULL; + } + el->failed = 1; + return -1; +} + + + +const char * +enum_gnupgext_ciphers( void **enum_context, int *algo, + size_t *keylen, size_t *blocksize, size_t *contextsize, + void (**setkey)( void *c, byte *key, unsigned keylen ), + void (**encrypt)( void *c, byte *outbuf, byte *inbuf ), + void (**decrypt)( void *c, byte *outbuf, byte *inbuf ) + ) +{ + EXTLIST r; + ENUMCONTEXT *ctx; + const char * (*finfo)(int, size_t*, size_t*, size_t*, + void (**)( void *, byte *, unsigned), + void (**)( void *, byte *, byte *), + void (**)( void *, byte *, byte *)); + + if( !*enum_context ) { /* init context */ + ctx = m_alloc_clear( sizeof( *ctx ) ); + ctx->r = extensions; + *enum_context = ctx; + } + else if( !algo ) { /* release the context */ + m_free(*enum_context); + *enum_context = NULL; + return NULL; + } + else + ctx = *enum_context; + + for( r = ctx->r; r; r = r->next ) { + int class, vers; + + if( r->failed ) + continue; + if( !r->handle && load_extension(r) ) + continue; + /* get a cipher info function */ + if( ctx->sym ) + goto inner_loop; + while( (ctx->sym = (*r->enumfunc)(20, &ctx->seq1, &class, &vers)) ) { + void *sym; + /* must check class because enumfunc may be wrong coded */ + if( vers != 1 || class != 20 ) + continue; + inner_loop: + finfo = ctx->sym; + while( (sym = (*r->enumfunc)(21, &ctx->seq2, &class, &vers)) ) { + const char *algname; + if( vers != 1 || class != 21 ) + continue; + *algo = *(int*)sym; + algname = (*finfo)( *algo, keylen, blocksize, contextsize, + setkey, encrypt, decrypt ); + log_debug("found algo %d (%s)\n", *algo, algname ); + if( algname ) { + ctx->r = r; + return algname; + } + } + ctx->seq2 = 0; + } + ctx->seq1 = 0; + } + ctx->r = r; + return NULL; +} + diff --git a/cipher/dynload.h b/cipher/dynload.h index a839a91b3..78f41c644 100644 --- a/cipher/dynload.h +++ b/cipher/dynload.h @@ -20,5 +20,12 @@ #ifndef G10_CIPHER_DYNLOAD_H #define G10_CIPHER_DYNLOAD_H +const char * +enum_gnupgext_ciphers( void **enum_context, int *algo, + size_t *keylen, size_t *blocksize, size_t *contextsize, + void (**setkey)( void *c, byte *key, unsigned keylen ), + void (**encrypt)( void *c, byte *outbuf, byte *inbuf ), + void (**decrypt)( void *c, byte *outbuf, byte *inbuf ) + ); #endif /*G10_CIPHER_DYNLOAD_H*/ diff --git a/cipher/pubkey.c b/cipher/pubkey.c new file mode 100644 index 000000000..3ffc1ca33 --- /dev/null +++ b/cipher/pubkey.c @@ -0,0 +1,84 @@ +/* pubkey.c - pubkey dispatcher + * 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 + */ + +#include +#include +#include +#include +#include +#include +#include "util.h" +#include "errors.h" +#include "mpi.h" +#include "cipher.h" +#include "dynload.h" + + +/**************** + * This is the interface for the public key decryption. + * ALGO gives the algorithm to use and this implicitly determines + * the size of the arrays. + * result is a pointer to a mpi variable which will receive a + * newly allocated mpi or NULL in case of an error. + */ +int +pubkey_decrypt( int algo, MPI *result, int ndata, MPI *data, + int nskey, MPI *skey ) +{ + MPI plain = NULL; + + *result = NULL; /* so the caller can do always do an mpi_free */ + if( DBG_CIPHER ) { + int i; + log_debug("pubkey_decrypt: algo=%d\n", algo ); + for(i=0; i < nskey; i++ ) + log_mpidump(" skey:", skey[i] ); + for(i=0; i < ndata; i++ ) + log_mpidump(" data:", data[i] ); + } + if( is_ELGAMAL(algo) ) { + ELG_secret_key sk; + assert( ndata == 2 && nskey == 4 ); + sk.p = skey[0]; + sk.g = skey[1]; + sk.y = skey[2]; + sk.x = skey[3]; + plain = mpi_alloc_secure( mpi_get_nlimbs( sk.p ) ); + elg_decrypt( plain, data[0], data[1], &sk ); + } + else if( is_RSA(k->pubkey_algo) ) { + RSA_secret_key sk; + assert( ndata == 1 && nskey == 6 ); + sk.e = skey[0]; + sk.n = skey[1]; + sk.p = skey[2]; + sk.q = skey[3]; + sk.d = skey[4]; + sk.u = skey[5]; + plain = mpi_alloc_secure( mpi_get_nlimbs(sk.n) ); + rsa_secret( plain, data[0], &sk ); + } + else + return G10ERR_PUBKEY_ALGO; + *result = plain; + return 0; +} + + diff --git a/cipher/rand-dummy.c b/cipher/rand-dummy.c index 3e7a42573..e2c754ebb 100644 --- a/cipher/rand-dummy.c +++ b/cipher/rand-dummy.c @@ -69,7 +69,7 @@ fast_random_poll() { #if HAVE_GETHRTIME { hrtime_t tv; - tv = gethrtime(void); + tv = gethrtime(); add_randomness( &tv, sizeof(tv), 1 ); } #elif HAVE_GETTIMEOFTIME diff --git a/config.h.in b/config.h.in index 3be8f18f1..c6a178af1 100644 --- a/config.h.in +++ b/config.h.in @@ -88,6 +88,7 @@ #undef PACKAGE #undef G10_LOCALEDIR #undef PRINTABLE_OS_NAME +#undef GNUPG_LIBDIR /* Define if your locale.h file contains LC_MESSAGES. */ #undef HAVE_LC_MESSAGES diff --git a/configure.in b/configure.in index 7a3093bfd..37e0bc6b0 100644 --- a/configure.in +++ b/configure.in @@ -86,6 +86,7 @@ case "${target}" in RANLIB="i386--mingw32-ranlib" ac_cv_have_dev_random=no AC_DEFINE(USE_RAND_W32) + GNUPG_LIBDIR="c:/lib/gnupg" ;; *) AC_PROG_RANLIB @@ -93,8 +94,10 @@ AC_PROG_INSTALL AC_PROG_CC AC_PROG_CPP AC_DEFINE(USE_RAND_UNIX) + GNUPG_LIBDIR="$g10_prefix/lib/gnupg" ;; esac +AC_DEFINE_UNQUOTED(GNUPG_LIBDIR, "$GNUPG_LIBDIR") case "${target}" in i386--mingw32) diff --git a/g10/ChangeLog b/g10/ChangeLog index 9b42cb3d8..a10527cf1 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,7 @@ +Wed Jun 10 07:22:02 1998 Werner Koch,mobil,,, (wk@tobold) + + * g10.c ("load-extension"): New option. + Mon Jun 8 22:23:37 1998 Werner Koch (wk@isil.d.shuttle.de) * seckey-cert.c (do_check): Removed cipher constants diff --git a/g10/Makefile.am b/g10/Makefile.am index fdf5f28b8..3e20a48c2 100644 --- a/g10/Makefile.am +++ b/g10/Makefile.am @@ -3,6 +3,7 @@ INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/intl -I../intl EXTRA_DIST = OPTIONS pubring.asc OMIT_DEPENDENCIES = zlib.h zconf.h +LDFLAGS = -rdynamic needed_libs = ../cipher/libcipher.a ../mpi/libmpi.a ../util/libutil.a noinst_PROGRAMS = gpgd diff --git a/g10/Makefile.in b/g10/Makefile.in index bc306754b..eba874517 100644 --- a/g10/Makefile.in +++ b/g10/Makefile.in @@ -93,6 +93,7 @@ l = @l@ INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/intl -I../intl EXTRA_DIST = OPTIONS pubring.asc OMIT_DEPENDENCIES = zlib.h zconf.h +LDFLAGS = -rdynamic needed_libs = ../cipher/libcipher.a ../mpi/libmpi.a ../util/libutil.a noinst_PROGRAMS = gpgd @@ -170,7 +171,6 @@ PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) DEFS = @DEFS@ -I. -I$(srcdir) -I.. CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ gpg_OBJECTS = g10.o build-packet.o compress.o free-packet.o getkey.o \ pkclist.o skclist.o ringedit.o kbnode.o mainproc.o armor.o mdfilter.o \ diff --git a/g10/encode.c b/g10/encode.c index 142ffeac2..d3d88ca7b 100644 --- a/g10/encode.c +++ b/g10/encode.c @@ -89,7 +89,7 @@ encode_simple( const char *filename, int mode ) cfx.dek = NULL; if( mode ) { s2k = m_alloc_clear( sizeof *s2k ); - s2k->mode = 1; + s2k->mode = opt.rfc1991? 0:1; s2k->hash_algo = opt.def_digest_algo ? opt.def_digest_algo : DEFAULT_DIGEST_ALGO; cfx.dek = passphrase_to_dek( NULL, opt.def_cipher_algo, s2k, 2 ); @@ -116,7 +116,7 @@ encode_simple( const char *filename, int mode ) write_comment( out, "#created by GNUPG v" VERSION " (" PRINTABLE_OS_NAME ")"); - if( s2k ) { + if( s2k && !opt.rfc1991 ) { PKT_symkey_enc *enc = m_alloc_clear( sizeof *enc ); enc->version = 4; enc->cipher_algo = cfx.dek->algo; diff --git a/g10/g10.c b/g10/g10.c index 845586830..94fb6446b 100644 --- a/g10/g10.c +++ b/g10/g10.c @@ -111,6 +111,8 @@ static ARGPARSE_OPTS opts[] = { { 534, "no-comment", 0, N_("do not write comment packets")}, { 535, "completes-needed", 1, N_("(default is 1)")}, { 536, "marginals-needed", 1, N_("(default is 3)")}, + { 560, "load-extension" ,2, N_("|file|load extension module")}, + { 561, "rfc1991", 0, N_("emulate the mode described in RFC1991")}, #ifdef IS_G10 { 527, "cipher-algo", 2 , N_("|NAME|use cipher algorithm NAME")}, { 528, "pubkey-algo", 2 , N_("|NAME|use public key algorithm NAME")}, @@ -427,7 +429,7 @@ main( int argc, char **argv ) orig_argv = argv; pargs.argc = &argc; pargs.argv = &argv; - pargs.flags= 1; /* do not remove the args */ + pargs.flags= 1|(1<<6); /* do not remove the args, ignore version */ while( arg_parse( &pargs, opts) ) { if( pargs.r_opt == 510 || pargs.r_opt == 511 ) parse_debug++; @@ -586,6 +588,8 @@ main( int argc, char **argv ) case 557: opt.compress_keys = 1; break; case 558: set_cmd( &cmd, aListSecretKeys); break; case 559: opt.always_trust = 1; break; + case 560: register_cipher_extension(pargs.r.ret_str); break; + case 561: opt.rfc1991 = 1; break; default : errors++; pargs.err = configfp? 1:2; break; } } diff --git a/g10/options.h b/g10/options.h index 8bc30eeba..4b32b524c 100644 --- a/g10/options.h +++ b/g10/options.h @@ -47,6 +47,7 @@ struct { int skip_verify; int compress_keys; int always_trust; + int rfc1991; } opt; diff --git a/g10/packet.h b/g10/packet.h index 3fc1ea280..cb9740cc6 100644 --- a/g10/packet.h +++ b/g10/packet.h @@ -27,12 +27,6 @@ #include "cipher.h" #include "filter.h" -#ifndef HAVE_RSA_CIPHER -/* although we don't have RSA we need these structures to handle keyrings */ -typedef struct { MPI e, n; } RSA_public_key; -typedef struct { MPI e, n, p, q, d, u; } RSA_secret_key; -#endif - typedef enum { PKT_NONE =0, PKT_PUBKEY_ENC =1, /* public key encrypted packet */ @@ -74,14 +68,8 @@ typedef struct { u32 keyid[2]; /* 64 bit keyid */ byte version; byte pubkey_algo; /* algorithm used for public key scheme */ - union { - struct { - MPI a, b; /* integers with the encrypteded DEK */ - } elg; - struct { - MPI rsa_integer; /* integer containing the DEK */ - } rsa; - } d; + int mpi_count; /* 1 for rsa, 2 for ELG */ + MPI material[2]; /* (ELG needs 2) } PKT_pubkey_enc; diff --git a/g10/pubkey-enc.c b/g10/pubkey-enc.c index 8f15057ec..8b48255dc 100644 --- a/g10/pubkey-enc.c +++ b/g10/pubkey-enc.c @@ -46,10 +46,11 @@ get_session_key( PKT_pubkey_enc *k, DEK *dek ) u16 csum, csum2; PKT_secret_cert *skc = m_alloc_clear( sizeof *skc ); - #ifndef HAVE_RSA_CIPHER - if( is_RSA(k->pubkey_algo) ) + if( is_RSA(k->pubkey_algo) ) /* warn about that */ write_status(STATUS_RSA_OR_IDEA); - #endif + rc=check_pubkey_algo( k->pubkey_algo ); + if( rc ) + goto leave; skc->pubkey_algo = k->pubkey_algo; /* we want a pubkey with this algo*/ if( (rc = get_seckey( skc, k->keyid )) ) @@ -63,7 +64,6 @@ get_session_key( PKT_pubkey_enc *k, DEK *dek ) plain_dek = mpi_alloc_secure( mpi_get_nlimbs(skc->d.elg.p) ); elg_decrypt( plain_dek, k->d.elg.a, k->d.elg.b, &skc->d.elg ); } - #ifdef HAVE_RSA_CIPHER else if( is_RSA(k->pubkey_algo) ) { if( DBG_CIPHER ) log_mpidump("Encr DEK frame:", k->d.rsa.rsa_integer ); @@ -71,8 +71,8 @@ get_session_key( PKT_pubkey_enc *k, DEK *dek ) plain_dek = mpi_alloc_secure( mpi_get_nlimbs(skc->d.rsa.n) ); rsa_secret( plain_dek, k->d.rsa.rsa_integer, &skc->d.rsa ); } - #endif/*HAVE_RSA_CIPHER*/ else { + log_info("need some glue code for pubkey algo %d\n", k->pubkey_algo); rc = G10ERR_PUBKEY_ALGO; /* unsupported algorithm */ goto leave; } diff --git a/g10/sign.c b/g10/sign.c index 598f60998..bd435a7c9 100644 --- a/g10/sign.c +++ b/g10/sign.c @@ -183,7 +183,7 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr, iobuf_push_filter( out, compress_filter, &zfx ); - if( !detached ) { + if( !detached && !opt.rfc1991 ) { /* loop over the secret certificates and build headers */ for( skc_rover = skc_list; skc_rover; skc_rover = skc_rover->next ) { PKT_secret_cert *skc; @@ -254,6 +254,8 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr, * data, it is not possible to know the used length * without a double read of the file - to avoid that * we simple use partial length packets. + * FIXME: We have to do the double read when opt.rfc1991 + * is active. */ if( opt.textmode && !outfile ) filesize = 0; @@ -449,9 +451,10 @@ clearsign_file( const char *fname, STRLIST locusr, const char *outfile ) goto leave; } - /* FIXME: This stuff is not correct if mutliplehash algos are used*/ + /* FIXME: This stuff is not correct if mutliple hash algos are used*/ iobuf_writestr(out, "-----BEGIN PGP SIGNED MESSAGE-----\n" ); - if( (opt.def_digest_algo?opt.def_digest_algo:DEFAULT_DIGEST_ALGO) + if( opt.rfc1991 + || (opt.def_digest_algo?opt.def_digest_algo:DEFAULT_DIGEST_ALGO) == DIGEST_ALGO_MD5 ) iobuf_writestr(out, "\n" ); else { diff --git a/include/cipher.h b/include/cipher.h index 502825553..186851a33 100644 --- a/include/cipher.h +++ b/include/cipher.h @@ -86,6 +86,9 @@ struct cipher_handle_s { char does_not_matter[1]; }; int cipher_debug_mode; +/*-- dynload.c --*/ +void register_cipher_extension( const char *fname ); + /*-- cipher.c --*/ int string_to_cipher_algo( const char *string ); const char * cipher_algo_to_string( int algo ); diff --git a/include/mpi.h b/include/mpi.h index 9a151291c..0725b7d6b 100644 --- a/include/mpi.h +++ b/include/mpi.h @@ -1,15 +1,14 @@ /* mpi.h - Multi Precision Integers - * Copyright (c) 1997 by Werner Koch (dd9jn) - * Copyright (C) 1994, 1996 Free Software Foundation, Inc. + * Copyright (C) 1994, 1996, 1998 Free Software Foundation, Inc. * - * This file is part of G10. + * This file is part of GNUPG. * - * G10 is free software; you can redistribute it and/or modify + * 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. * - * G10 is distributed in the hope that it will be useful, + * 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. diff --git a/include/util.h b/include/util.h index 5fcce6063..3dec01cdd 100644 --- a/include/util.h +++ b/include/util.h @@ -101,6 +101,7 @@ const char *strusage( int level ); /*-- fileutil.c --*/ char *make_filename( const char *first_part, ... ); +int compare_filenames( const char *a, const char *b ); const char *print_fname_stdin( const char *s ); const char *print_fname_stdout( const char *s ); diff --git a/mpi/Makefile.in b/mpi/Makefile.in index cd14c3849..ac020c553 100644 --- a/mpi/Makefile.in +++ b/mpi/Makefile.in @@ -64,8 +64,6 @@ target_triplet = @target@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ -CIPHER_EXTRA_DIST = @CIPHER_EXTRA_DIST@ -CIPHER_EXTRA_OBJS = @CIPHER_EXTRA_OBJS@ CPP = @CPP@ DATADIRNAME = @DATADIRNAME@ G10_LOCALEDIR = @G10_LOCALEDIR@ diff --git a/tools/Makefile.in b/tools/Makefile.in index 96f53d4cb..d9e4e7ad0 100644 --- a/tools/Makefile.in +++ b/tools/Makefile.in @@ -64,8 +64,6 @@ target_triplet = @target@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ -CIPHER_EXTRA_DIST = @CIPHER_EXTRA_DIST@ -CIPHER_EXTRA_OBJS = @CIPHER_EXTRA_OBJS@ CPP = @CPP@ DATADIRNAME = @DATADIRNAME@ G10_LOCALEDIR = @G10_LOCALEDIR@ diff --git a/tools/mk-tdata b/tools/mk-tdata index 85e20d81209eb5189c9687ad9e39e66ccaf9f1ce..7fcfb389fa82c4a49e208cdeb2cab18fd4575459 100755 GIT binary patch literal 11769 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 literal 35307 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 F{SPSUprZf) diff --git a/util/ChangeLog b/util/ChangeLog index a62ba84db..b2a1d21b7 100644 --- a/util/ChangeLog +++ b/util/ChangeLog @@ -1,3 +1,9 @@ +Wed Jun 10 07:39:41 1998 Werner Koch,mobil,,, (wk@tobold) + + * fileutil.c (compare_filenames): New. + + * argparse.c (arg_parse): New flag bit 6 to ignore --version + Thu May 14 16:45:13 1998 Werner Koch (wk@isil.d.shuttle.de) * argparse.c (show_help): Add some formatting stuff diff --git a/util/Makefile.in b/util/Makefile.in index 025ea3f8e..5e50aabcf 100644 --- a/util/Makefile.in +++ b/util/Makefile.in @@ -64,8 +64,6 @@ target_triplet = @target@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ -CIPHER_EXTRA_DIST = @CIPHER_EXTRA_DIST@ -CIPHER_EXTRA_OBJS = @CIPHER_EXTRA_OBJS@ CPP = @CPP@ DATADIRNAME = @DATADIRNAME@ G10_LOCALEDIR = @G10_LOCALEDIR@ diff --git a/util/argparse.c b/util/argparse.c index ce1dbc6af..9a9909e30 100644 --- a/util/argparse.c +++ b/util/argparse.c @@ -72,6 +72,7 @@ * Bit 3 : Do not use -- to stop option processing. * Bit 4 : Do not skip the first arg. * Bit 5 : allow usage of long option with only one dash + * Bit 6 : ignore --version * all other bits must be set to zero, this value is modified by the function * so assume this is write only. * Local flags (for each option): @@ -377,8 +378,10 @@ arg_parse( ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts) if( !opts[i].short_opt && !strcmp( "help", s+2) ) show_help(opts, arg->flags); else if( !opts[i].short_opt && !strcmp( "version", s+2) ) { - show_version(); - exit(0); + if( !(arg->flags & (1<<6)) ) { + show_version(); + exit(0); + } } else if( !opts[i].short_opt && !strcmp( "warranty", s+2) ) { puts( strusage(16) ); diff --git a/util/fileutil.c b/util/fileutil.c index 88c84ecff..2cedf0f9e 100644 --- a/util/fileutil.c +++ b/util/fileutil.c @@ -65,6 +65,20 @@ make_filename( const char *first_part, ... ) } +int +compare_filenames( const char *a, const char *b ) +{ + /* ? check whether this is an absolute filename and + * resolve symlinks? + */ + #ifdef __MINGW32__ + return stricmp(a,b); + #else + return strcmp(a,b); + #endif +} + + /**************** * A simple function to decide whether the filename is stdout * or a real filename. diff --git a/zlib/Makefile b/zlib/Makefile index 6d752930c..0330f59c5 100644 --- a/zlib/Makefile +++ b/zlib/Makefile @@ -69,8 +69,6 @@ target_triplet = i586-pc-linux-gnu CATALOGS = de.gmo it.gmo CATOBJEXT = .gmo CC = gcc -CIPHER_EXTRA_DIST = @CIPHER_EXTRA_DIST@ -CIPHER_EXTRA_OBJS = @CIPHER_EXTRA_OBJS@ CPP = gcc -E DATADIRNAME = share G10_LOCALEDIR = /usr/local/share/locale diff --git a/zlib/Makefile.in b/zlib/Makefile.in index 1e489370a..07f93df52 100644 --- a/zlib/Makefile.in +++ b/zlib/Makefile.in @@ -69,8 +69,6 @@ target_triplet = @target@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ -CIPHER_EXTRA_DIST = @CIPHER_EXTRA_DIST@ -CIPHER_EXTRA_OBJS = @CIPHER_EXTRA_OBJS@ CPP = @CPP@ DATADIRNAME = @DATADIRNAME@ G10_LOCALEDIR = @G10_LOCALEDIR@