diff --git a/Makefile.am b/Makefile.am index 63c54970e..cfa9abb47 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,6 @@ ## Process this file with automake to produce Makefile.in -SUBDIRS = util mpi cipher tools g10 psst +SUBDIRS = util mpi cipher tools g10 EXTRA_DIST = diff --git a/Makefile.in b/Makefile.in index 3c61f0c19..63295c43f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -38,15 +38,15 @@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ transform = @program_transform_name@ -SUBDIRS = util mpi cipher tools g10 psst +SUBDIRS = util mpi cipher tools g10 EXTRA_DIST = ACCONFIG = acconfig.h CONFIG_HEADER_IN = config.h.in mkinstalldirs = $(top_srcdir)/scripts/mkinstalldirs CONFIG_HEADER = ./config.h DIST_COMMON = README AUTHORS COPYING ChangeLog INSTALL Makefile.am \ -Makefile.in NEWS README acconfig.h config.h.in configure configure.in \ -stamp-h.in +Makefile.in NEWS README TODO acconfig.h config.h.in configure \ +configure.in stamp-h.in PACKAGE = @PACKAGE@ diff --git a/TODO b/TODO index db532ca77..2a0365b8b 100644 --- a/TODO +++ b/TODO @@ -15,7 +15,6 @@ * add writing of signatures and checking of detached signatures. * add option file handling. * use correct ASN values for DEK encoding - * add compress handling * add checking of armor trailers * fix the memory stuff (secure memory) * add real secure memory @@ -27,4 +26,5 @@ * remove all "Fixmes" * add credits for the MPI lib. * speed up the RIPE-MD-160 + * enable a SIGSEGV handler while using zlib functions diff --git a/config.h.in b/config.h.in index e17daa8c0..8f3ed5927 100644 --- a/config.h.in +++ b/config.h.in @@ -62,4 +62,7 @@ /* Define if you have the header file. */ #undef HAVE_UNISTD_H +/* Define if you have the header file. */ +#undef HAVE_ZLIB_H + #endif /*G10_CONFIG_H*/ diff --git a/configure.in b/configure.in index 5e9eef605..6b27eb2c9 100644 --- a/configure.in +++ b/configure.in @@ -37,6 +37,7 @@ dnl Checks for libraries. dnl Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS(unistd.h) +AC_CHECK_HEADERS(zlib.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST @@ -57,7 +58,7 @@ else fi AC_OUTPUT([ Makefile util/Makefile mpi/Makefile cipher/Makefile \ - g10/Makefile tools/Makefile psst/Makefile ], + g10/Makefile tools/Makefile ], [echo timestamp > stamp-h ]) diff --git a/g10/Makefile.am b/g10/Makefile.am index 90c43ef7e..22a38898c 100644 --- a/g10/Makefile.am +++ b/g10/Makefile.am @@ -6,7 +6,7 @@ bin_PROGRAMS = g10 g10_SOURCES = g10.c \ build-packet.c \ - compressed.c \ + compress.c \ encode.c \ encr-data.c \ filter.h \ @@ -18,6 +18,7 @@ g10_SOURCES = g10.c \ mainproc.c \ armor.c \ mdfilter.c \ + cipher.c \ options.h \ overwrite.c \ packet.h \ @@ -30,7 +31,7 @@ g10_SOURCES = g10.c \ sig-check.c -LDADD = -L ../cipher -L ../mpi -L ../util -lcipher -lmpi -lutil +LDADD = -L ../cipher -L ../mpi -L ../util -lcipher -lmpi -lutil -lz $(PROGRAMS): ../cipher/libcipher.a ../mpi/libmpi.a diff --git a/g10/Makefile.in b/g10/Makefile.in index 97ff3035f..ed387218a 100644 --- a/g10/Makefile.in +++ b/g10/Makefile.in @@ -44,7 +44,7 @@ bin_PROGRAMS = g10 g10_SOURCES = g10.c \ build-packet.c \ - compressed.c \ + compress.c \ encode.c \ encr-data.c \ filter.h \ @@ -56,6 +56,7 @@ g10_SOURCES = g10.c \ mainproc.c \ armor.c \ mdfilter.c \ + cipher.c \ options.h \ overwrite.c \ packet.h \ @@ -67,7 +68,7 @@ g10_SOURCES = g10.c \ seskey.c \ sig-check.c -LDADD = -L ../cipher -L ../mpi -L ../util -lcipher -lmpi -lutil +LDADD = -L ../cipher -L ../mpi -L ../util -lcipher -lmpi -lutil -lz mkinstalldirs = $(top_srcdir)/scripts/mkinstalldirs CONFIG_HEADER = ../config.h PROGRAMS = $(bin_PROGRAMS) @@ -85,8 +86,8 @@ LIBS = @LIBS@ COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) LINK = $(CC) $(LDFLAGS) -o $@ -g10_OBJECTS = g10.o build-packet.o compressed.o encode.o encr-data.o \ -free-packet.o getkey.o keygen.o mainproc.o armor.o mdfilter.o \ +g10_OBJECTS = g10.o build-packet.o compress.o encode.o encr-data.o \ +free-packet.o getkey.o keygen.o mainproc.o armor.o mdfilter.o cipher.o \ overwrite.o parse-packet.o passphrase.o plaintext.o pubkey-enc.o \ seckey-cert.o seskey.o sig-check.o EXTRA_g10_SOURCES = @@ -104,9 +105,10 @@ DEP_DISTFILES = $(DIST_COMMON) $(SOURCES) $(BUILT_SOURCES) $(HEADERS) \ TAR = tar DEP_FILES = $(srcdir)/.deps/armor.P $(srcdir)/.deps/build-packet.P \ -$(srcdir)/.deps/compressed.P $(srcdir)/.deps/encode.P \ -$(srcdir)/.deps/encr-data.P $(srcdir)/.deps/free-packet.P \ -$(srcdir)/.deps/g10.P $(srcdir)/.deps/getkey.P $(srcdir)/.deps/keygen.P \ +$(srcdir)/.deps/cipher.P $(srcdir)/.deps/compress.P \ +$(srcdir)/.deps/encode.P $(srcdir)/.deps/encr-data.P \ +$(srcdir)/.deps/free-packet.P $(srcdir)/.deps/g10.P \ +$(srcdir)/.deps/getkey.P $(srcdir)/.deps/keygen.P \ $(srcdir)/.deps/mainproc.P $(srcdir)/.deps/mdfilter.P \ $(srcdir)/.deps/overwrite.P $(srcdir)/.deps/parse-packet.P \ $(srcdir)/.deps/passphrase.P $(srcdir)/.deps/plaintext.P \ diff --git a/g10/build-packet.c b/g10/build-packet.c index 229c5a428..945758e98 100644 --- a/g10/build-packet.c +++ b/g10/build-packet.c @@ -42,11 +42,13 @@ static int do_pubkey_enc( IOBUF out, int ctb, PKT_pubkey_enc *enc ); static u32 calc_plaintext( PKT_plaintext *pt ); static int do_plaintext( IOBUF out, int ctb, PKT_plaintext *pt ); static int do_encr_data( IOBUF out, int ctb, PKT_encr_data *ed ); +static int do_compressed( IOBUF out, int ctb, PKT_compressed *cd ); static int calc_header_length( u32 len ); static int write_16(IOBUF inp, u16 a); static int write_32(IOBUF inp, u32 a); static int write_header( IOBUF out, int ctb, u32 len ); +static int write_header2( IOBUF out, int ctb, u32 len, int blkmode ); static int write_version( IOBUF out, int ctb ); /**************** @@ -86,9 +88,11 @@ build_packet( IOBUF out, PACKET *pkt ) case PKT_ENCR_DATA: rc = do_encr_data( out, ctb, pkt->pkt.encr_data ); break; + case PKT_COMPR_DATA: + rc = do_compressed( out, ctb, pkt->pkt.compressed ); + break; case PKT_SIGNATURE: case PKT_RING_TRUST: - case PKT_COMPR_DATA: default: log_bug("invalid packet type in build_packet()"); break; @@ -304,6 +308,20 @@ do_encr_data( IOBUF out, int ctb, PKT_encr_data *ed ) return rc; } +static int +do_compressed( IOBUF out, int ctb, PKT_compressed *cd ) +{ + int rc = 0; + + /* we must use the old convention and don't use blockmode */ + write_header2(out, ctb, 0, 0 ); + iobuf_put(out, cd->algorithm ); + + /* This is all. The caller has to write the real data */ + + return rc; +} + @@ -349,6 +367,12 @@ calc_header_length( u32 len ) */ static int write_header( IOBUF out, int ctb, u32 len ) +{ + return write_header2( out, ctb, len, 1 ); +} + +static int +write_header2( IOBUF out, int ctb, u32 len, int blkmode ) { if( !len ) ctb |= 3; @@ -361,7 +385,8 @@ write_header( IOBUF out, int ctb, u32 len ) if( iobuf_put(out, ctb ) ) return -1; if( !len ) { - iobuf_set_block_mode(out, 8196 ); + if( blkmode ) + iobuf_set_block_mode(out, 8196 ); } else { if( ctb & 2 ) { diff --git a/g10/cipher.c b/g10/cipher.c new file mode 100644 index 000000000..562579a43 --- /dev/null +++ b/g10/cipher.c @@ -0,0 +1,100 @@ +/* cipher.c - En-/De-ciphering filter + * Copyright (c) 1997 by Werner Koch (dd9jn) + * + * This file is part of G10. + * + * G10 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, + * 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 "errors.h" +#include "iobuf.h" +#include "memory.h" +#include "util.h" +#include "filter.h" +#include "packet.h" +#include "options.h" + + + + +/**************** + * This filter is used to en/de-cipher data. + */ +int +cipher_filter( void *opaque, int control, + IOBUF a, byte *buf, size_t *ret_len) +{ + size_t size = *ret_len; + cipher_filter_context_t *cfx = opaque; + int rc=0; + + if( control == IOBUFCTRL_UNDERFLOW ) { /* decipher */ + rc = -1; /* FIXME:*/ + } + else if( control == IOBUFCTRL_FLUSH ) { /* encipher */ + assert(a); + if( !cfx->header ) { + PACKET pkt; + PKT_encr_data ed; + byte temp[10]; + + memset( &ed, 0, sizeof ed ); + ed.len = cfx->datalen; + init_packet( &pkt ); + pkt.pkttype = PKT_ENCR_DATA; + pkt.pkt.encr_data = &ed; + if( build_packet( a, &pkt )) + log_bug("build_packet(ENCR_DATA) failed\n"); + randomize_buffer( temp, 8, 1 ); + temp[8] = temp[6]; + temp[9] = temp[7]; + if( cfx->dek->algo == CIPHER_ALGO_BLOWFISH ) { + cfx->bf_ctx = m_alloc_secure( sizeof *cfx->bf_ctx ); + blowfish_setkey( cfx->bf_ctx, cfx->dek->key, cfx->dek->keylen ); + blowfish_setiv( cfx->bf_ctx, NULL ); + blowfish_encode_cfb( cfx->bf_ctx, temp, temp, 10); + } + else + log_bug("no cipher algo %d\n", cfx->dek->algo); + + iobuf_write(a, temp, 10); + cfx->header=1; + } + + if( cfx->dek->algo == CIPHER_ALGO_BLOWFISH ) + blowfish_encode_cfb( cfx->bf_ctx, buf, buf, size); + if( iobuf_write( a, buf, size ) ) + rc = G10ERR_WRITE_FILE; + } + else if( control == IOBUFCTRL_FREE ) { + if( cfx->dek->algo == CIPHER_ALGO_BLOWFISH ) + m_free(cfx->bf_ctx); + } + else if( control == IOBUFCTRL_DESC ) { + *(char**)buf = "cipher_filter"; + } + return rc; +} + + + + diff --git a/g10/compress.c b/g10/compress.c new file mode 100644 index 000000000..a4fc48f88 --- /dev/null +++ b/g10/compress.c @@ -0,0 +1,253 @@ +/* compress.c - compress filter + * Copyright (c) 1997 by Werner Koch (dd9jn) + * + * This file is part of G10. + * + * G10 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, + * 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 +#ifdef HAVE_ZLIB_H + #include +#else + #error You need ZLIB to compile this module +#endif + +#include "util.h" +#include "memory.h" +#include "packet.h" +#include "filter.h" +#include "options.h" + + +static void +init_compress( compress_filter_context_t *zfx, z_stream *zs ) +{ + int rc; + byte *inbuf, *outbuf; + int level; + + + if( opt.compress >= 0 && opt.compress <= 9 ) + level = opt.compress; + else if( opt.compress == -1 ) + level = Z_DEFAULT_COMPRESSION; + else if( opt.compress == 10 ) /* remove this ! */ + level = 0; + else { + log_error("invalid compression level; using default level\n"); + level = Z_DEFAULT_COMPRESSION; + } + + if( (rc = deflateInit( zs, level )) != Z_OK ) { + log_fatal("zlib problem: %s\n", zs->msg? zs->msg : + rc == Z_MEM_ERROR ? "out of core" : + rc == Z_VERSION_ERROR ? "invalid lib version" : + "unknown error" ); + } + + zfx->outbufsize = 4096; + zfx->outbuf = m_alloc( zfx->outbufsize ); +} + +static int +do_compress( compress_filter_context_t *zfx, z_stream *zs, int flush, IOBUF a ) +{ + int zrc; + unsigned n; + + do { + zs->next_out = zfx->outbuf; + zs->avail_out = zfx->outbufsize; + zrc = deflate( zs, flush ); + if( zrc == Z_STREAM_END && flush == Z_FINISH ) + ; + else if( zrc != Z_OK ) { + if( zs->msg ) + log_fatal("zlib deflate problem: %s\n", zs->msg ); + else + log_fatal("zlib deflate problem: rc=%d\n", zrc ); + } + n = zfx->outbufsize - zs->avail_out; + if( DBG_FILTER ) + log_debug("deflate returned: avail_in=%u, avail_out=%u, n=%u\n", + (unsigned)zs->avail_in, (unsigned)zs->avail_out, (unsigned)n ); + + if( iobuf_write( a, zfx->outbuf, n ) ) { + log_debug("deflate: iobuf_write failed\n"); + return G10ERR_WRITE_FILE; + } + } while( zs->avail_in || (flush == Z_FINISH && zrc != Z_STREAM_END) ); + return 0; +} + +static void +init_uncompress( compress_filter_context_t *zfx, z_stream *zs ) +{ + int rc; + byte *inbuf, *outbuf; + int level; + + + if( (rc = inflateInit( zs )) != Z_OK ) { + log_fatal("zlib problem: %s\n", zs->msg? zs->msg : + rc == Z_MEM_ERROR ? "out of core" : + rc == Z_VERSION_ERROR ? "invalid lib version" : + "unknown error" ); + } + + zfx->inbufsize = 1024; + zfx->inbuf = m_alloc( zfx->inbufsize ); + zs->avail_in = 0; +} + +static int +do_uncompress( compress_filter_context_t *zfx, z_stream *zs, + IOBUF a, size_t *ret_len ) +{ + int zrc; + size_t n; + byte *p; + int c; + + if( DBG_FILTER ) + log_debug("do_uncompress: avail_in=%u, avail_out=%u\n", + (unsigned)zs->avail_in, (unsigned)zs->avail_out); + do { + if( zs->avail_in < zfx->inbufsize ) { + n = zs->avail_in; + if( !n ) + zs->next_in = zfx->inbuf; + for( p=zfx->inbuf+n; n < zfx->inbufsize; n++, p++ ) { + if( (c=iobuf_get(a)) == -1 ) + break; + *p = c & 0xff; + } + zs->avail_in = n; + } + zrc = inflate( zs, Z_PARTIAL_FLUSH ); + if( DBG_FILTER ) + log_debug("inflate returned: avail_in=%u, avail_out=%u, zrc=%d\n", + (unsigned)zs->avail_in, (unsigned)zs->avail_out, zrc); + if( zrc != Z_OK && zrc != Z_STREAM_END ) { + if( zs->msg ) + log_fatal("zlib inflate problem: %s\n", zs->msg ); + else + log_fatal("zlib inflate problem: rc=%d\n", zrc ); + } + } while( zs->avail_out && zrc != Z_STREAM_END ); + *ret_len = zfx->outbufsize - zs->avail_out; + if( DBG_FILTER ) + log_debug("do_uncompress: returning %u bytes\n", (unsigned)*ret_len ); + return 0; +} + + +int +compress_filter( void *opaque, int control, + IOBUF a, byte *buf, size_t *ret_len) +{ + size_t size = *ret_len; + compress_filter_context_t *zfx = opaque; + z_stream *zs = zfx->opaque; + int zrc, rc=0; + + if( control == IOBUFCTRL_UNDERFLOW ) { + if( !zfx->status ) { + zs = zfx->opaque = m_alloc_clear( sizeof *zs ); + init_uncompress( zfx, zs ); + zfx->status = 1; + } + + zs->next_out = buf; + zs->avail_out = size; + zfx->outbufsize = size; /* needed only for calculation */ + rc = do_uncompress( zfx, zs, a, ret_len ); + } + else if( control == IOBUFCTRL_FLUSH ) { + if( !zfx->status ) { + PACKET pkt; + PKT_compressed cd; + + memset( &cd, 0, sizeof cd ); + cd.len = 0; + cd.algorithm = 2; /* zlib */ + init_packet( &pkt ); + pkt.pkttype = PKT_COMPR_DATA; + pkt.pkt.compressed = &cd; + if( build_packet( a, &pkt )) + log_bug("build_packet(COMPRESSED) failed\n"); + zs = zfx->opaque = m_alloc_clear( sizeof *zs ); + init_compress( zfx, zs ); + zfx->status = 2; + } + + zs->next_in = buf; + zs->avail_in = size; + rc = do_compress( zfx, zs, Z_NO_FLUSH, a ); + } + else if( control == IOBUFCTRL_FREE ) { + if( zfx->status == 1 ) { + inflateEnd(zs); + m_free(zs); + zfx->opaque = NULL; + m_free(zfx->outbuf); zfx->outbuf = NULL; + } + else if( zfx->status == 2 ) { + zs->next_in = buf; + zs->avail_in = 0; + do_compress( zfx, zs, Z_FINISH, a ); + deflateEnd(zs); + m_free(zs); + zfx->opaque = NULL; + m_free(zfx->outbuf); zfx->outbuf = NULL; + } + } + else if( control == IOBUFCTRL_DESC ) + *(char**)buf = "compress_filter"; + return rc; +} + +/**************** + * Handle a compressed packet + */ +int +handle_compressed( PKT_compressed *cd ) +{ + compress_filter_context_t cfx; + + memset( &cfx, 0, sizeof cfx ); + if( cd->algorithm != 2 ) + return G10ERR_COMPR_ALGO; + + iobuf_push_filter( cd->buf, compress_filter, &cfx ); + proc_packets(cd->buf); + iobuf_pop_filter( cd->buf, compress_filter, &cfx ); + #if 0 + if( cd->len ) + iobuf_set_limit( cd->buf, 0 ); /* disable the readlimit */ + else + iobuf_clear_eof( cd->buf ); + #endif + cd->buf = NULL; + return 0; +} + diff --git a/g10/compressed.c b/g10/compressed.c deleted file mode 100644 index cc0eafcfa..000000000 --- a/g10/compressed.c +++ /dev/null @@ -1,114 +0,0 @@ -/* compressed.c - process an compressed packet - * Copyright (c) 1997 by Werner Koch (dd9jn) - * - * This file is part of G10. - * - * G10 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, - * 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 */ -#include "util.h" -#include "memory.h" -#include "packet.h" - - -/**************** - * Handle a compressed packet - */ -int -handle_compressed( PKT_compressed *zd ) -{ - return -1; - #if 0 - int c, zrc, rc = 0; - z_stream *zs = NULL; - unsigned inbufsize = 4096; - unsigned outbufsize = 16384; - unsigned n; - byte *inbuf = NULL; - byte *outbuf = NULL; - - if( zd->algorithm != 1 ) { - rc =G10ERR_COMPR_ALGO; - goto leave; - } - - zs = m_alloc_clear( sizeof *zs ); - if( (zrc = inflateInit( zs )) != Z_OK ) { - log_fatal("zlib problem: %s\n", zs->msg? zs->msg : - zrc == Z_MEM_ERROR ? "out of core" : - zrc == Z_VERSION_ERROR ? "invalid lib version" : - "unknown error" ); - } - - inbuf = m_alloc( inbufsize ); - outbuf = m_alloc( outbufsize ); /* Fixme: put it in secure space? */ - - zs->next_in = inbuf; - zs->avail_in = inbufsize; - zs->next_out = outbuf; - zs->avail_out = outbufsize; - - n = 0; - inbuf[n++] = 0x58; - inbuf[n++] = 0x09; - for(; n < inbufsize && (c=iobuf_get(zd->buf)) != -1 ; n++ ) - inbuf[n] = c; - if( n ) { - { int i; - printf("start of compressed packet (n=%u):\n", n); - for(i=0; i < 32 && i < n; i++ ) - printf(" %02x", inbuf[i] ); - putchar('\n'); - } - zrc = inflate( zs, Z_PARTIAL_FLUSH ); - switch( zrc ) { - case Z_OK: - log_info("inflate returned okay\n"); - break; - case Z_STREAM_END: - log_info("inflate returned stream-end\n"); - break; - case Z_NEED_DICT: - case Z_DATA_ERROR: - case Z_STREAM_ERROR: - case Z_MEM_ERROR: - case Z_BUF_ERROR: - default: - if( zs->msg ) - log_error("zlib inflate problem: %s\n", zs->msg ); - else - log_error("zlib inflate problem: rc=%d\n", zrc ); - break; - } - } - - leave: - if( zs ) { - inflateEnd(zs); - m_free(zs); - } - m_free(inbuf); - m_free(outbuf); - return rc; - #endif -} - diff --git a/g10/encode.c b/g10/encode.c index efa9fd230..272462d47 100644 --- a/g10/encode.c +++ b/g10/encode.c @@ -40,21 +40,6 @@ static int encode_simple( const char *filename, int mode ); static IOBUF open_outfile( const char *iname ); -static int compress_filter( void *opaque, int control, - IOBUF chain, byte *buf, size_t *ret_len); -static int cipher_filter( void *opaque, int control, - IOBUF chain, byte *buf, size_t *ret_len); - - - -typedef struct { - DEK *dek; - PKT_encr_data ed; - BLOWFISH_context *bf_ctx; - int header; -} cipher_filter_context_t; - - /**************** @@ -104,9 +89,11 @@ encode_simple( const char *filename, int mode ) u32 filesize; cipher_filter_context_t cfx; armor_filter_context_t afx; + compress_filter_context_t zfx; memset( &cfx, 0, sizeof cfx); memset( &afx, 0, sizeof afx); + memset( &zfx, 0, sizeof zfx); /* prepare iobufs */ if( !(inp = iobuf_open(filename)) ) { @@ -139,7 +126,7 @@ encode_simple( const char *filename, int mode ) write_comment( out, "#Created by G10 pre-release " VERSION ); if( opt.compress ) - iobuf_push_filter( out, compress_filter, NULL ); + iobuf_push_filter( out, compress_filter, &zfx ); /* setup the inner packet */ @@ -161,8 +148,7 @@ encode_simple( const char *filename, int mode ) pt->buf = inp; pkt.pkttype = PKT_PLAINTEXT; pkt.pkt.plaintext = pt; - cfx.ed.len = filesize? calc_packet_length( &pkt ) : 0; - cfx.ed.buf = NULL; /* not used! */ + cfx.datalen = filesize? calc_packet_length( &pkt ) : 0; /* register the cipher filter */ if( mode ) @@ -197,12 +183,14 @@ encode_crypt( const char *filename, STRLIST remusr ) u32 filesize; cipher_filter_context_t cfx; armor_filter_context_t afx; + compress_filter_context_t zfx; int any_names = 0; STRLIST local_remusr = NULL; char *ustr; memset( &cfx, 0, sizeof cfx); memset( &afx, 0, sizeof afx); + memset( &zfx, 0, sizeof zfx); if( !remusr ) { remusr = NULL; /* fixme: ask */ @@ -231,7 +219,7 @@ encode_crypt( const char *filename, STRLIST remusr ) write_comment( out, "#Created by G10 pre-release " VERSION ); if( opt.compress ) - iobuf_push_filter( out, compress_filter, NULL ); + iobuf_push_filter( out, compress_filter, &zfx ); /* create a session key */ cfx.dek = m_alloc_secure( sizeof *cfx.dek ); @@ -327,8 +315,7 @@ encode_crypt( const char *filename, STRLIST remusr ) init_packet(&pkt); pkt.pkttype = PKT_PLAINTEXT; pkt.pkt.plaintext = pt; - cfx.ed.len = filesize? calc_packet_length( &pkt ) : 0; - cfx.ed.buf = NULL; /* not used! */ + cfx.datalen = filesize? calc_packet_length( &pkt ) : 0; /* register the cipher filter */ iobuf_push_filter( out, cipher_filter, &cfx ); @@ -389,74 +376,3 @@ open_outfile( const char *iname ) } -static int -compress_filter( void *opaque, int control, - IOBUF a, byte *buf, size_t *ret_len) -{ - size_t size = *ret_len; - int rc=0; - - if( control == IOBUFCTRL_FLUSH ) { - assert(a); - if( iobuf_write( a, buf, size ) ) - rc = G10ERR_WRITE_FILE; - } - else if( control == IOBUFCTRL_DESC ) { - *(char**)buf = "compress_filter"; - } - return rc; -} - - -/**************** - * The filter is used to encipher data. - */ -static int -cipher_filter( void *opaque, int control, - IOBUF a, byte *buf, size_t *ret_len) -{ - size_t size = *ret_len; - cipher_filter_context_t *cfx = opaque; - int rc=0; - - if( control == IOBUFCTRL_FLUSH ) { - assert(a); - if( !cfx->header ) { - PACKET pkt; - byte temp[10]; - - pkt.pkttype = PKT_ENCR_DATA; - pkt.pkt.encr_data = &cfx->ed; - if( build_packet( a, &pkt )) - log_bug("build_packet(ENCR_DATA) failed\n"); - randomize_buffer( temp, 8, 1 ); - temp[8] = temp[6]; - temp[9] = temp[7]; - if( cfx->dek->algo == CIPHER_ALGO_BLOWFISH ) { - cfx->bf_ctx = m_alloc_secure( sizeof *cfx->bf_ctx ); - blowfish_setkey( cfx->bf_ctx, cfx->dek->key, cfx->dek->keylen ); - blowfish_setiv( cfx->bf_ctx, NULL ); - blowfish_encode_cfb( cfx->bf_ctx, temp, temp, 10); - } - else - log_bug("no cipher algo %d\n", cfx->dek->algo); - - iobuf_write(a, temp, 10); - cfx->header=1; - } - - if( cfx->dek->algo == CIPHER_ALGO_BLOWFISH ) - blowfish_encode_cfb( cfx->bf_ctx, buf, buf, size); - if( iobuf_write( a, buf, size ) ) - rc = G10ERR_WRITE_FILE; - } - else if( control == IOBUFCTRL_FREE ) { - if( cfx->dek->algo == CIPHER_ALGO_BLOWFISH ) - m_free(cfx->bf_ctx); - } - else if( control == IOBUFCTRL_DESC ) { - *(char**)buf = "cipher_filter"; - } - return rc; -} - diff --git a/g10/filter.h b/g10/filter.h index cb6802ff3..3ca222186 100644 --- a/g10/filter.h +++ b/g10/filter.h @@ -40,6 +40,25 @@ typedef struct { } armor_filter_context_t; +typedef struct { + int status; + void *opaque; /* (used for z_stream) */ + byte *inbuf; + unsigned inbufsize; + byte *outbuf; + unsigned outbufsize; +} compress_filter_context_t; + + +typedef struct { + DEK *dek; + u32 datalen; + BLOWFISH_context *bf_ctx; + int header; +} cipher_filter_context_t; + + + /*-- mdfilter.c --*/ int md_filter( void *opaque, int control, IOBUF a, byte *buf, size_t *ret_len); @@ -47,4 +66,14 @@ int md_filter( void *opaque, int control, IOBUF a, byte *buf, size_t *ret_len); int armor_filter( void *opaque, int control, IOBUF chain, byte *buf, size_t *ret_len); +/*-- compress.c --*/ +int compress_filter( void *opaque, int control, + IOBUF chain, byte *buf, size_t *ret_len); + +/*-- cipher.c --*/ +int cipher_filter( void *opaque, int control, + IOBUF chain, byte *buf, size_t *ret_len); + + + #endif /*G10_FILTER_H*/ diff --git a/g10/getkey.c b/g10/getkey.c index 0bd14063b..0e3c3b2f3 100644 --- a/g10/getkey.c +++ b/g10/getkey.c @@ -319,7 +319,9 @@ scan_keyring( PKT_pubkey_cert *pkc, u32 *keyid, return G10ERR_KEYRING_OPEN; } - if( name ) + if( !DBG_CACHE ) + ; + else if( name ) log_debug("scan_keyring %s for '%s'\n", filename, name ); else if( keyid ) log_debug("scan_keyring %s for %08lx %08lx\n", filename, diff --git a/g10/packet.h b/g10/packet.h index 6ac57cab0..93336bcb4 100644 --- a/g10/packet.h +++ b/g10/packet.h @@ -201,7 +201,7 @@ int check_secret_key( PKT_seckey_cert *cert ); /*-- pubkey-enc.c --*/ int get_session_key( PKT_pubkey_enc *k, DEK *dek ); -/*-- compressed.c --*/ +/*-- compress.c --*/ int handle_compressed( PKT_compressed *zd ); /*-- encr-data.c --*/ diff --git a/g10/parse-packet.c b/g10/parse-packet.c index 68d02536d..33cfda38f 100644 --- a/g10/parse-packet.c +++ b/g10/parse-packet.c @@ -127,7 +127,8 @@ parse_packet( IOBUF inp, PACKET *pkt ) pktlen = 0; if( !lenbytes ) { pktlen = 0; /* don't know the value */ - iobuf_set_block_mode(inp, 1); + if( pkttype != PKT_COMPR_DATA ) + iobuf_set_block_mode(inp, 1); } else { for( ; lenbytes; lenbytes-- ) { @@ -626,7 +627,6 @@ parse_compressed( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *pkt ) zd->len = 0; /* not yet used */ zd->algorithm = iobuf_get_noeof(inp); zd->buf = inp; - algorithm = iobuf_get_noeof(inp); if( list_mode ) printf(":compressed packet: algo=%d\n", zd->algorithm); return 0;