summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>1997-11-23 16:38:27 +0100
committerWerner Koch <wk@gnupg.org>1997-11-23 16:38:27 +0100
commitdb19a275188b4b3226ac4bbfc121f85ff373d331 (patch)
tree936dfd3ee12828d5392c19f50024ff70c7171371
parentArmor works now (diff)
downloadgnupg2-db19a275188b4b3226ac4bbfc121f85ff373d331.tar.xz
gnupg2-db19a275188b4b3226ac4bbfc121f85ff373d331.zip
compress stuff implemented
-rw-r--r--Makefile.am2
-rw-r--r--Makefile.in6
-rw-r--r--TODO2
-rw-r--r--config.h.in3
-rw-r--r--configure.in3
-rw-r--r--g10/Makefile.am5
-rw-r--r--g10/Makefile.in16
-rw-r--r--g10/build-packet.c29
-rw-r--r--g10/cipher.c100
-rw-r--r--g10/compress.c253
-rw-r--r--g10/compressed.c114
-rw-r--r--g10/encode.c100
-rw-r--r--g10/filter.h29
-rw-r--r--g10/getkey.c4
-rw-r--r--g10/packet.h2
-rw-r--r--g10/parse-packet.c4
16 files changed, 445 insertions, 227 deletions
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 <unistd.h> header file. */
#undef HAVE_UNISTD_H
+/* Define if you have the <zlib.h> 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;
+}
+
@@ -350,6 +368,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;
else if( len < 256 )
@@ -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 <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#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 <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <assert.h>
+#include <errno.h>
+#ifdef HAVE_ZLIB_H
+ #include <zlib.h>
+#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 <config.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-/*#include <zlib.h>*/
-#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;