See ChangeLog: Sat Jan 9 16:02:23 CET 1999 Werner Koch
authorWerner Koch <wk@gnupg.org>
Sat, 9 Jan 1999 15:06:59 +0000 (15:06 +0000)
committerWerner Koch <wk@gnupg.org>
Sat, 9 Jan 1999 15:06:59 +0000 (15:06 +0000)
35 files changed:
ChangeLog
NEWS
THOUGHTS [new file with mode: 0644]
TODO
cipher/ChangeLog
cipher/Makefile.am
cipher/md.c
cipher/random.c
cipher/rndunix.c
configure.in
debian/README.Debian [new file with mode: 0644]
debian/changelog [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/distfiles [new file with mode: 0644]
debian/preinst [new file with mode: 0644]
debian/rules [new file with mode: 0644]
doc/DETAILS
g10/ChangeLog
g10/armor.c
g10/build-packet.c
g10/encr-data.c
g10/free-packet.c
g10/mainproc.c
g10/plaintext.c
g10/sig-check.c
g10/sign.c
g10/status.c
g10/status.h
mpi/ChangeLog
mpi/mpi-bit.c
mpi/mpi-cmp.c
util/ChangeLog
util/iobuf.c
util/secmem.c

index f7a5f88..45630ac 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Sat Jan  9 16:02:23 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in: Add a way to statically link rndunix
+
 Sun Jan  3 15:28:44 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
        * acinclude.m4 (GNUPG_CHECK_RDYNAMIC): New.
diff --git a/NEWS b/NEWS
index 3d52560..065f569 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,15 @@
       fixed an infinite loop bug in the 3DES code and in the code
       which looks for trusted signatures.
 
+    * Fixed a bug in the mpi library which caused signatures not to
+      compare okay.
+
+    * Rewrote the handling of cleartext signatures; the code is now
+      better maintainable (I hope so).
+
+    * New status output VALIDSIG only for valid signatures together
+      with the fingerprint of the signer's key.
+
 
 Noteworthy changes in version 0.9.0
 -----------------------------------
diff --git a/THOUGHTS b/THOUGHTS
new file mode 100644 (file)
index 0000000..99766ce
--- /dev/null
+++ b/THOUGHTS
@@ -0,0 +1,201 @@
+
+       /* we still have these if a signed signed more than one
+        * user ID.  I don't think that is makes sense to sign
+        * more than one user ID; an exception might be a user ID
+        * which is to be removed in near future.  Anyway it is
+        * always good to sign only those user ID which are
+        * unlikely to change.  It might be good to insert a
+        * user ID which does not contain an email address and
+        * mark this one with a special signature flag or let
+        * sign_key() suggest a user ID w/o an email address
+        */
+
+
+    * What shall we do if we have a valid subkey revocation certificate
+      but no subkey binding?  Is this a valid but revoked key?
+
+
+Date: Mon, 4 Jan 1999 19:34:29 -0800 (PST)
+From: Matthew Skala <mskala@ansuz.sooke.bc.ca>
+
+- Signing with an expired key doesn't work by default, does work with a
+  special option.
+- Verifying a signature that appears to have been made by an expired key
+  after its expiry date but is otherwise good reports the signature as BAD,
+  preferably with a message indicating that it's a key-expiry problem rather
+  than a cryptographically bad signature.
+- Verifying a signature from a key that is now expired, where the
+  signature was made before the expiry date, reports the signature as
+  GOOD, possibly with a warning that the key has since expired.
+- Encrypting to an expired key doesn't work by default, does work with a
+  special option.
+- Decrypting always works, if you have the appropriate secret key and
+  passphrase.
+
+
+
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Hi Werner..
+
+I was looking at some of the PROJECTS items in the recent gpg CVS and wanted
+to comment on one of them:
+
+  * Add a way to override the current cipher/md implementations
+    by others (using extensions)
+
+As you know I've been thinking about how to use a PalmPilot or an iButton in
+some useful way in GPG. The two things that seem reasonable are:
+ 1) keep the secret key in the device, only transferring it to the host
+    computer for the duration of the secret-key operation (sign or decrypt).
+    The key is never kept on disk, only in RAM. This removes the chance that
+    casual snooping on your office workstation will reveal your key (it
+    doesn't help against an active attack, but the attacker must leave a
+    tampered version of GPG around or otherwise get their code to run while
+    the key-storage device is attached to attack the key)
+ 2) perform the secret-key operation on the device, so the secret key never
+    leaves the confines of that device. There are still attacks possible,
+    based upon talking to the device while it is connected and trying to
+    convince the device (and possibly the user) that it is the real GPG,
+    but in general this protects the key pretty strongly. Any individual
+    message is still vulnerable, but that's a tradeoff of the convenience of
+    composing that message on a full-sized screen+keyboard (plus the added
+    speed of encryption) vs. the security of writing the message on a
+    secure device.
+
+I think there are a variety of ways of implementing these things, but a few
+extension mechanisms in GPG should be enough to try various ways later on.
+
+1) pass an argument string to loadable extension modules (maybe
+    gpg --load-extension foofish=arg1,arg2,arg3 ?)
+2) allow multiple instances of the same extension module (presumably with
+   different arguments)
+3) allow extension modules to use stdin/stdout/stderr as normal (probably
+   already in there), for giving feedback to the user, or possibly asking them
+   for a password of some sort
+4) have an extension to provide secret keys:
+
+   It looks like most of the hooks for this are already in place, it just
+   needs an extension module which can register itself as a keyblock resource.
+
+   I'm thinking of a module for this that is given an external program name as
+   an argument. When the keyblock resource is asked to enumerate its keys, it
+   runs the external program (first with a "0" argument, then a "1", and so on
+   until the program reports that no more keys are available). The external
+   program returns one (possibly armored) secret key block each time. The
+   program might have some kind of special protocol to talk to the storage
+   device.  One thing that comes to mind is to simply include a random number
+   in the message sent over the serial port: the program would display this
+   number, the Pilot at the other end would display the number it receives, if
+   the user sees that both are the same they instruct the Pilot to release the
+   key, as basic protection against someone else asking for the key while it
+   is attached. More sophisticated schemes are possible depending upon how
+   much processing power and IO is available on the device. But the same
+   extension module should be able to handle as complex a scheme as one could
+   wish.
+
+   The current keyblock-resource interface would work fine, although it
+   might be more convenient if a resource could be asked for a key by id
+   instead of enumerating all of them and then searching through the resulting
+   list for a match. A module that provided public keys would have to work this
+   way (imagine a module that could automatically do an http fetch for a
+   particular key.. easily-added automatic key fetching). Without that ability
+   to fetch by id (which would require it to fall back to the other keyblock
+   resources if it failed), the user's device might be asked to release the
+   key even though some other secret key was the one needed.
+
+
+5) have an extension to perform a secret-key operation without the actual
+   secret key material
+
+ basically something to indicate that any decrypt or sign operations that
+ occur for a specific keyid should call the extension module instead. The
+ secret key would not be extracted (it wouldn't be available anyway). The
+ module is given the keyid and the MPI of the block it is supposed to sign
+ or decrypt.
+
+ The module could then run an external program to do the operation. I'm
+ imagining a Pilot program which receives the data, asks the user if it can go
+ along with the operation (after displaying a hash of the request, which is
+ also displayed by the extension module's program to make sure the Pilot is
+ being asked to do the right operation), performs the signature or decryption,
+ then returns the data. This protocol could be made arbitrarily complex, with
+ a D-H key to encrypt the link, and both sides signing requests to
+ authenticate one to the other (although this transforms the the problem of
+ getting your secret key off your office workstation into the problem of
+ your workstation holding a key tells your Pilot that it is allowed to perform
+ the secret key operation, and if someone gets a hold of that key they may
+ be able to trick your pilot [plugged in somewhere else] to do the same thing
+ for them).
+
+ This is basically red/black separation, with the Pilot or iButton having the
+ perimeter beyond which the red data doesn't pass. Better than the secret-key
+ storage device but requires a lot more power on the device (the new iButtons
+ with the exponentiator could do it, but it would take way too much code space
+ on the old ones, although they would be fine for just carrying the keys).
+
+The signature code might need to be extended to verify the signature you just
+made, since an active intruder pretending to the the Pilot wouldn't be able to
+make a valid signature (but they might sign your message with a different key
+just to be annoying).
+
+Anyway, just wanted to share my thoughts on some possibilities. I've been
+carrying this little Java iButton on my keyring for months now, looking for
+something cool to do with it, and I think that secure storage for my GPG key
+would be just the right application.
+
+cheers,
+ -Brian
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v0.4.5 (GNU/Linux)
+Comment: For info finger gcrypt@ftp.guug.de
+
+iD8DBQE2c5oZkDmgv9E5zEwRArAwAKDWV5fpTtbGPiMPgl2Bpp0gvhbfQgCgzJuY
+AmIQTk4s62/y2zMAHDdOzK0=
+=jr7m
+-----END PGP SIGNATURE-----
+
+
+
+About a new Keyserver  (discussion with Allan Clark <allanc@sco.com>):
+=====================
+
+Some ideas:
+
+o  the KS should verify signatures and only accept those
+   which are good.
+
+o  Keep a blacklist of known bad signatures to minimize
+   the time needed to check them
+
+o  Should be fast - I currently designing a new storage
+   system called keybox which takes advantage of the fact
+   that the keyID is higly random and can be directly be
+   used as a hash value and this keyID is (for v4 keys)
+   part of the fingerprint: So it is possible to use the
+   fingerprint as key but do an lookup by the keyID.
+
+o  To be used as the "public keyring" in a LAN so that there
+   is no need to keep one on every machine.
+
+o  Allow more that one file for key storage.
+
+o  Use the HKS protocol and enhance it in a way that binary
+   keyrings can be transmitted.  (I already wrote some
+   http server and client code which can be used for this)
+
+o  Keep a checkcsum (hash) of the entire keyblock so that a
+   client can easy check whether this keyblock has changed.
+   (keyblock = the entire key with all certificates etc.)
+
+o  Allow efficient propagation of new keys and revocation
+   certificates.
+
+
+Probably more things but this keyserver is not a goal for the
+1.0 release. Someone should be able to fix some of the limitations
+of the existing key servers (I think they bail out on some rfc2440
+packet formats).
+
diff --git a/TODO b/TODO
index f125491..5d5370b 100644 (file)
--- a/TODO
+++ b/TODO
@@ -22,7 +22,7 @@ Important
 
     * print a warning when a revoked/expired secret key is used.
 
-    * Allow the use of a the faked RNG onyl for keys which are
+    * Allow the use of a the faked RNG only for keys which are
       flagged as INSECURE.
 
 
@@ -55,6 +55,5 @@ Nice to have
     * Burn the buffers used by fopen(), or use read(2). Does this
       really make sense?
     * change the fake_data stuff to mpi_set_opaque
-    * rewrite the ugly armor code.
 
 
index 347d346..ad7d6f8 100644 (file)
@@ -1,3 +1,9 @@
+Sat Jan  9 16:02:23 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * rndunix.c (gather_random): check for setuid.
+
+       * Makefile.am: Add a way to staically link random modules
+
 Thu Jan  7 18:00:58 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
        * md.c (md_stop_debug): Do a flush first.
index a27989c..4a71710 100644 (file)
@@ -1,18 +1,18 @@
 ## Process this file with automake to produce Makefile.in
 
-gnupg_extensions = tiger twofish rndunix
-
 INCLUDES =  -I$(top_srcdir)/include -I$(top_srcdir)/intl
 
 noinst_LIBRARIES = libcipher.a
+
+EXTRA_PROGRAMS  = tiger twofish rndunix rndlinux
 if ENABLE_GNUPG_EXTENSIONS
-pkglib_PROGRAMS  = $(gnupg_extensions)
+pkglib_PROGRAMS  = @DYNAMIC_CIPHER_MODS@ @DYNAMIC_RANDOM_MODS@
 else
 pkglib_PROGRAMS  =
 endif
 
-DYNLINK_MOD_CFLAGS = -DIS_MODULE @DYNLINK_MOD_CFLAGS@
 
+DYNLINK_MOD_CFLAGS = -DIS_MODULE @DYNLINK_MOD_CFLAGS@
 
 libcipher_a_SOURCES = cipher.c \
                 pubkey.c       \
@@ -33,7 +33,6 @@ libcipher_a_SOURCES = cipher.c        \
                 random.h       \
                 random.c       \
                 rand-internal.h \
-                rndlinux.c     \
                 rmd.h          \
                 rmd160.c       \
                 sha1.h         \
@@ -43,9 +42,14 @@ libcipher_a_SOURCES = cipher.c       \
                 g10c.c         \
                 smallprime.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@
+
 
 tiger: $(srcdir)/tiger.c
        `echo $(COMPILE) $(DYNLINK_MOD_CFLAGS) -o tiger $(srcdir)/tiger.c | \
index f7be5e4..6e335db 100644 (file)
@@ -1,5 +1,5 @@
 /* md.c  -  message digest dispatcher
- *     Copyright (C) 1998 Free Software Foundation, Inc.
+ *     Copyright (C) 1998,1999 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
index 6f8a20a..1812467 100644 (file)
@@ -122,13 +122,9 @@ initialize()
   #elif USE_RNDUNIX
     rndunix_constructor();
   #elif USE_RNDW32
-    rndw32_constructor();
   #elif USE_RNDOS2
-    rndos2_constructor();
   #elif USE_RNDATARI
-    rndatari_constructor();
   #elif USE_RNDMVS
-    rndmvs_constructor();
   #endif
 }
 
index c005afb..9e49ebc 100644 (file)
@@ -2,6 +2,7 @@
  *                                                                         *
  *   BeOS Randomness-Gathering Code                                        *
  *   Copyright Peter Gutmann, Paul Kendall, and Chris Wedgwood 1996-1998    *
+ *   Copyright (C) 1998, 1999  Werner Koch
  *                                                                         *
  ****************************************************************************/
 
@@ -678,6 +679,9 @@ gather_random( void (*add)(const void*, size_t, int), int requester,
     size_t n;
 
     if( !gatherer_pid ) {
+       /* make sure we are not setuid */
+       if( getuid() != geteuid() )
+           BUG();
        /* time to start the gatherer process */
        if( pipe( pipedes ) ) {
            g10_log_error("pipe() failed: %s\n", strerror(errno));
index f710486..6fcc58a 100644 (file)
@@ -259,6 +259,48 @@ else
 fi
 
 
+dnl
+dnl Figure how to link the random modules
+dnl
+if test "$ac_cv_have_dev_random" = yes; then
+    AC_DEFINE(USE_RNDLINUX)
+    STATIC_RANDOM_OBJS="rndlinux.o"
+    DYNAMIC_RANDOM_MODS=""
+else
+    case "${target}" in
+        i386--mingw32)
+            AC_DEFINE(USE_RNDW32)
+            STATIC_RANDOM_OBJS=""
+            DYNAMIC_RANDOM_MODS=""
+            ;;
+        m68k-atari-mint)
+            AC_DEFINE(USE_RNDATARI)
+            STATIC_RANDOM_OBJS=""
+            DYNAMIC_RANDOM_MODS=""
+            ;;
+        *)
+            AC_DEFINE(USE_RNDUNIX)
+            STATIC_RANDOM_OBJS="rndunix.o"
+            DYNAMIC_RANDOM_MODS=""
+           ;;
+    esac
+fi
+
+AC_SUBST(STATIC_RANDOM_OBJS)
+AC_SUBST(DYNAMIC_RANDOM_MODS)
+
+
+dnl
+dnl Figure how to link the cipher modules
+dnl
+dnl (form now these are only dynamic)
+STATIC_CIPHER_OBJS=""
+DYNAMIC_CIPHER_MODS="twofish tiger"
+AC_SUBST(STATIC_CIPHER_OBJS)
+AC_SUBST(DYNAMIC_CIPHER_MODS)
+
+
+
 dnl setup assembler stuff
 AC_MSG_CHECKING(for mpi assembler functions)
 if test -f $srcdir/mpi/config.links ; then
diff --git a/debian/README.Debian b/debian/README.Debian
new file mode 100644 (file)
index 0000000..f596437
--- /dev/null
@@ -0,0 +1,16 @@
+Due to a bug in the way secret keys were encrypted in versions prior
+to 0.3.3, later version of gnupg are not backwards compatible and you
+will have to convert your secret keys before using old secret keys
+with recent versions of gnupg.
+
+The upgrade strategy is described in /usr/doc/gnupg/NEWS.gz, please
+refer to it for more details, but it requires an old copy of the gpg
+and gpgm binaries.  They may be on your system as gpg.old and
+gpgm.old, but if they're not you can find gnupg 0.3.2 source and
+binaries for i386, m68k, alpha, powerpc and hurd-i386 at:
+
+  <URL:http://james.nocrew.org/gnupg/>
+
+-- 
+James Troup <james@nocrew.org>, Bradford, UK
+Sun,  8 Nov 1998 19:11:40 +0000
diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..f8f9eeb
--- /dev/null
@@ -0,0 +1,166 @@
+gnupg (0.9.0-1) unstable; urgency=low
+
+  * New upstream version.
+  * g10/armor.c (armor_filter): add missing new line in comment string; as
+    noticed by Stainless Steel Rat <ratinox@peorth.gweep.net>.
+
+ -- James Troup <james@nocrew.org>  Tue, 29 Dec 1998 20:22:43 +0000
+
+gnupg (0.4.5-1) unstable; urgency=low
+
+  * New upstream version.
+  * debian/rules (clean): force removal of intl/libintl.h which the
+    Makefiles fail to remove properly.
+
+ -- James Troup <james@nocrew.org>  Tue,  8 Dec 1998 22:40:23 +0000
+
+gnupg (0.4.4-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- James Troup <james@nocrew.org>  Sat, 21 Nov 1998 01:34:29 +0000
+
+gnupg (0.4.3-1) unstable; urgency=low
+
+  * New upstream version.
+  * debian/README.Debian: new file; contains same information as is in the
+    preinst.  Suggested by Wichert Akkerman <wichert@cs.leidenuniv.nl>.
+  * debian/rules (binary-arch): install `README.Debian'
+  * debian/control (Standards-Version): updated to 2.5.0.0.
+
+ -- James Troup <james@nocrew.org>  Sun,  8 Nov 1998 19:08:12 +0000
+
+gnupg (0.4.2-1) unstable; urgency=low
+
+  * New upstream version.
+  * debian/preinst: improve message about the NEWS file which isn't
+    actually installed when it's referred to, thanks to Martin Mitchell
+    <martin@debian.org>.  
+  * debian/rules (binary-arch): don't install the now non-existent `rfcs',
+    but do install `OpenPGP'.
+
+ -- James Troup <james@nocrew.org>  Sun, 18 Oct 1998 22:48:34 +0100
+
+gnupg (0.4.1-1) unstable; urgency=low
+
+  * New upstream version.
+  * debian/rules (binary-arch): fix the gpgm manpage symlink now installed
+    by `make install'.
+
+ -- James Troup <james@nocrew.org>  Sun, 11 Oct 1998 17:01:21 +0100
+
+gnupg (0.4.0-1) unstable; urgency=high
+
+  * New upstream version. [#26717]
+  * debian/copyright: tone down warning about alpha nature of gnupg.
+  * debian/copyright: new maintainer address.
+  * debian/control: update extended description.
+  * debian/rules (binary-arch): install FAQ and all ChangeLogs.
+  * debian/preinst: new; check for upgrade from (<= 0.3.2-1) and warn about
+    incompatabilites in keyring format and offer to move old copy out of
+    gpg out of the way for transistion strategy and inform the user about
+    the old copies of gnupg available on my web page.
+  * debian/rules (binary-arch) install preinst.
+  * debian/rules (binary-arch): don't depend on the test target as it is
+    now partially interactive (tries to generate a key, which requires
+    someone else to be using the computer).
+
+ -- James Troup <james@nocrew.org>  Thu,  8 Oct 1998 00:47:07 +0100
+
+gnupg (0.3.2-1) unstable; urgency=low
+
+  * New upstream version.
+  * debian/control (Maintainer): new address.
+  * debian/copyright: updated list of changes.
+
+ -- James Troup <james@nocrew.org>  Thu,  9 Jul 1998 21:06:07 +0200
+
+gnupg (0.3.1-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- James Troup <james@nocrew.org>  Tue,  7 Jul 1998 00:26:21 +0200
+
+gnupg (0.3.0-2) unstable; urgency=low
+
+  * Applied bug-fix patch from Werner.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Fri, 26 Jun 1998 12:18:29 +0200
+
+gnupg (0.3.0-1) unstable; urgency=low
+
+  * New upstream version.
+  * debian/control: rewrote short and long description.
+  * cipher/Makefile.am: link tiger with -lc.
+  * debian/rules (binary-arch): strip loadable modules.
+  * util/secmem.c (lock_pool): get rid of errant test code; fix from
+    Werner Koch <wk@isil.d.shuttle.de>.
+  * debian/rules (test): new target which runs gnupg's test suite.
+    binary-arch depends on it, to ensure it's run whenever the package is
+    built.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Thu, 25 Jun 1998 16:04:57 +0200
+
+gnupg (0.2.19-1) unstable; urgency=low
+
+  * New upstream version.
+  * debian/control: Updated long description.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Sat, 30 May 1998 12:12:35 +0200
+
+gnupg (0.2.18-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- James Troup <J.J.Troup@comp.brad.ac.uk>  Sat, 16 May 1998 11:52:47 +0200
+
+gnupg (0.2.17-1) unstable; urgency=high
+
+  * New upstream version.
+  * debian/control (Standards-Version): updated to 2.4.1.0.
+  * debian/control: tone down warning about alpha nature of gnupg, as per
+    README.
+  * debian/copyright: ditto.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Mon,  4 May 1998 22:36:51 +0200
+
+gnupg (0.2.15-1) unstable; urgency=high
+
+  * New upstream version.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Fri, 10 Apr 1998 01:12:20 +0100
+
+gnupg (0.2.13-1) unstable; urgency=high
+
+  * New upstream version.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Wed, 11 Mar 1998 01:52:51 +0000
+
+gnupg (0.2.12-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Sat,  7 Mar 1998 13:52:40 +0000
+
+gnupg (0.2.11-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Wed,  4 Mar 1998 01:32:12 +0000
+
+gnupg (0.2.10-1) unstable; urgency=low
+
+  * New upstream version.
+  * Name changed upstream.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Mon,  2 Mar 1998 07:32:05 +0000
+
+g10 (0.2.7-1) unstable; urgency=low
+
+  * Initial release.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Fri, 20 Feb 1998 02:05:34 +0000
+
+Local variables:
+mode: debian-changelog
+End:
diff --git a/debian/control b/debian/control
new file mode 100644 (file)
index 0000000..1c5f906
--- /dev/null
@@ -0,0 +1,23 @@
+Source: gnupg
+Section: utils
+Priority: optional
+Maintainer: James Troup <james@nocrew.org>
+Standards-Version: 2.5.0.0
+
+Package: gnupg
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: GNU privacy guard - a free PGP replacement.
+ GNUPG is the GNU encryption and signing tool.  As you can see from the 
+ version number, the program may have some bugs and some features may not 
+ work at all.
+ .
+ Due to the fact that GNUPG does not use use any patented algorithm,
+ it cannot be compatible to old PGP versions, because those use
+ IDEA (which is worldwide patented) and RSA (which is patented in
+ the United States until Sep 20, 2000).  
+ .
+ GNUPG is in almost all aspects compatible with other OpenPGP
+ implementations. The default algorithms are DSA and ELGamal.  
+ Symmetric algorithms are: Blowfish and CAST5, Digest algorithms are
+ MD5, RIPEMD160, SHA1 and TIGER/192.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644 (file)
index 0000000..bf10420
--- /dev/null
@@ -0,0 +1,30 @@
+This is Debian/GNU Linux's prepackaged version of GNUPG, a free PGP
+replacement. As you can see from the version number, the program may
+have some bugs and some features may not work at all.
+
+This package was put together by me, James Troup
+<james@nocrew.org>, from the sources, which I obtained from
+ftp://ftp.guug.de/pub/gcrypt/gnupg-0.9.0.tar.gz.  The changes were
+minimal, namely:
+
+- adding support for the Debian package maintenance scheme, by adding
+  various debian/* files.  
+
+Program Copyright (C) 1997, 1998 Werner Koch (dd9jn).
+Modifications for Debian Copyright (C) 1998 James Troup.
+
+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, 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 with
+your Debian GNU/Linux system, in /usr/doc/copyright/GPL, or with the
+Debian GNU/Linux gnupg source package as the file COPYING.  If not,
+write to the Free Software Foundation, Inc., 59 Temple Place, Suite
+330, Boston, MA 02111-1307, USA.
diff --git a/debian/distfiles b/debian/distfiles
new file mode 100644 (file)
index 0000000..df6fac5
--- /dev/null
@@ -0,0 +1,7 @@
+README.Debian
+changelog
+control
+copyright
+distfiles
+preinst
+rules
diff --git a/debian/preinst b/debian/preinst
new file mode 100644 (file)
index 0000000..8369e20
--- /dev/null
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+set -e
+
+case "$1" in
+    upgrade|install)
+       # Try to gracefully handle upgrades from a pre-0.3.3 version
+
+       if [ ! -z $2 ]; then
+           set +e
+           dpkg --compare-versions $2 \<= 0.3.2-1
+           result=$?
+           set -e
+           if [ $result = 0 ]; then
+               cat <<EOF
+Due to a bug in the way secret keys were encrypted in versions prior
+to 0.3.3, this version of gnupg is not backwards compatible with $2
+which you have (had) installed on your system.  
+
+There is an upgrade strategy (see /usr/doc/gnupg/NEWS.gz after this
+version is installed), but it requires an old copy of the gpg and gpgm
+EOF
+               echo -n "binaries; shall I make copies of them for you (Y/n)? "
+               read answer
+               if [ ! "$answer" = "n" -a ! "$answer" = "N" ]; then
+                   cp /usr/bin/gpg /usr/bin/gpg.old
+                   cp /usr/bin/gpgm /usr/bin/gpgm.old
+                   echo "Okay, done.  The old versions are /usr/bin/gpg*.old"
+               else
+                   echo "Okay, I haven't made backups."
+               fi;     
+               cat <<EOF
+
+If at any stage you need a pre-0.3.3 gnupg, you can find source and
+binaries for i386, m68k, alpha, powerpc and hurd-i386 at 
+
+   http://james.nocrew.org/gnupg/
+
+Press return to continue
+EOF
+               read foo
+           fi;
+       fi;
+       ;;
+    abort-upgrade)
+       ;;
+esac
diff --git a/debian/rules b/debian/rules
new file mode 100644 (file)
index 0000000..aa07475
--- /dev/null
@@ -0,0 +1,72 @@
+#!/usr/bin/make -f
+# debian/rules file - for GNUPG (0.9.0)
+# Based on sample debian/rules file - for GNU Hello (1.3).
+# Copyright 1994,1995 by Ian Jackson.
+# Copyright 1998 James Troup
+# I hereby give you perpetual unlimited permission to copy,
+# modify and relicense this file, provided that you do not remove
+# my name from the file itself.  (I assert my moral right of
+# paternity under the Copyright, Designs and Patents Act 1988.)
+# This file may have to be extensively modified
+
+build:
+       $(checkdir)
+       ./configure --prefix=/usr --with-included-gettext
+       $(MAKE) CFLAGS="-O2 -g -Wall"
+       touch build
+
+test: build
+       $(checkdir)
+       make -C checks check || exit 127
+       touch test
+
+clean:
+       $(checkdir)
+       -rm -f build
+       -$(MAKE) -i distclean || $(MAKE) -f Makefile.in distclean
+       -rm -rf debian/tmp debian/*~ debian/files* debian/substvars
+       # Cruft not removed by `make clean'
+       -rm -f intl/libintl.h
+
+binary-indep:
+
+binary-arch:   checkroot build # test
+       $(checkdir)
+       -rm -rf debian/tmp
+       install -d debian/tmp/DEBIAN/
+       install -m 755 debian/preinst debian/tmp/DEBIAN/preinst
+       $(MAKE) prefix=`pwd`/debian/tmp/usr install
+       rm debian/tmp/usr/man/man1/gpgm.1
+       gzip -9v debian/tmp/usr/man/man1/*
+       ln -s gpg.1.gz debian/tmp/usr/man/man1/gpgm.1.gz
+       strip debian/tmp/usr/bin/*
+       strip --strip-unneeded debian/tmp/usr/lib/gnupg/*
+       install -d debian/tmp/usr/doc/gnupg/
+       install -m 644 debian/changelog debian/tmp/usr/doc/gnupg/changelog.Debian
+       install -m 644 debian/README.Debian README NEWS THANKS TODO doc/DETAILS \
+               doc/FAQ doc/OpenPGP debian/tmp/usr/doc/gnupg/
+       for i in po util mpi cipher tools g10 checks include; do \
+               install -m 644 $$i/ChangeLog debian/tmp/usr/doc/gnupg/changelog.$$i; done
+       install -m 644 ChangeLog debian/tmp/usr/doc/gnupg/changelog.toplevel
+       gzip -9v debian/tmp/usr/doc/gnupg/*
+       ln -s changelog.g10.gz debian/tmp/usr/doc/gnupg/changelog.gz
+       install -m 644 debian/copyright debian/tmp/usr/doc/gnupg/
+       dpkg-shlibdeps g10/gpg
+       dpkg-gencontrol -isp
+       chown -R root.root debian/tmp
+       chmod -R go=rX debian/tmp
+       dpkg --build debian/tmp ..
+
+define checkdir
+       test -f g10/g10.c -a -f debian/rules
+endef
+
+# Below here is fairly generic really
+
+binary:                binary-indep binary-arch
+
+checkroot:
+       $(checkdir)
+       test root = "`whoami`"
+
+.PHONY: binary binary-arch binary-indep clean checkroot
index 5541396..346e809 100644 (file)
@@ -40,6 +40,62 @@ ssb::1536:20:5CE086B5B5A18FF4:1998-07-07:0:::
 More fields may be added later.
 
 
+Format of the "--status-fd" output
+==================================
+Every line is prefixed with "[GNUPG:] ", followed by a keyword with
+the type of the status line and a some arguments depending on the
+type (maybe none); an application should always be prepared to see
+more argumnents in future versions.
+
+
+    GOODSIG    <long keyid>  <username>
+       The signature with the keyid is good.
+
+    BADSIG     <long keyid>  <username>
+       The signature with the keyid has not been verified okay.
+
+    ERRSIG
+       It was not possible to check the signature.  This may be
+       caused by a missing public key or an unsupported algorithm.
+       No argumens yet.
+
+    VALIDSIG   <fingerprint in hex>
+       The signature with the keyid is good. This is the same
+       as GOODSIG but has the fingerprint as the argument. Both
+       status lines ere emmited for a good signature.
+
+    TRUST_UNDEFINED
+    TRUST_NEVER
+    TRUST_MARGINAL
+    TRUST_FULLY
+    TRUST_ULTIMATE
+       For good signatures one of these status lines are emitted
+       to indicate how trustworthy the signatur is.  No arguments yet.
+
+    SIGEXPIRED
+       The signature key has expired.  No arguments yet.
+
+    KEYREVOKED
+       The used key has been revoked by his owner.  No arguments yet.
+
+    BADARMOR
+       The ascii armor is corrupted.  No arguments yet.
+
+    RSA_OR_IDEA
+       The RSA or IDEA algorithms has been used in the data.  A
+       program might want to fallback to another program to handle
+       the data if GnuPG failed.
+
+    SHM_INFO
+    SHM_GET
+    SHM_GET_BOOL
+    SHM_GET_HIDDEN
+    NEED_PASSPHRASE
+       [Needs documentation]
+
+
+
+
 Key generation
 ==============
     Key generation shows progress by printing different characters to
index 532fa47..f42b743 100644 (file)
@@ -1,3 +1,18 @@
+Sat Jan  9 16:02:23 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * sig-check.c (do_check): Output time diff on error
+
+       * status.c (STATUS_VALIDSIG): New.
+       (is_status_enabled): New.
+       * mainproc.c (check_sig_and_print): Issue that status message.
+
+       * plaintext.c (special_md_putc): Removed
+
+       * armor.c (armor_filter): print error for truncated lines.
+
+       * free-packet.c (free_encrypted): Revomed call to set_block_mode.
+       (free_plaintext): Ditto.
+
 Thu Jan  7 18:00:58 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
        * pkclist.c (add_ownertrust): Fixed return value.
index be0e69b..1d58c41 100644 (file)
@@ -1,5 +1,5 @@
 /* armor.c - Armor flter
- *     Copyright (C) 1998,1999 Free Software Foundation, Inc.
+ *     Copyright (C) 1998, 1999 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -254,415 +254,6 @@ parse_hash_header( const char *line )
 
 
 
-#if 0 /* old code */
-/****************
- * parse an ascii armor.
- * Returns: the state,
- *         the remaining bytes in BUF are returned in RBUFLEN.
- *         r_empty return the # of empty lines before the buffer
- */
-static fhdr_state_t
-find_header( fhdr_state_t state, byte *buf, size_t *r_buflen,
-            IOBUF a, size_t n, unsigned *r_empty, int *r_hashes,
-            int only_keyblocks, int *not_dashed )
-{
-    int c=0, i;
-    const char *s;
-    byte *p;
-    size_t buflen;
-    int cont;
-    int clearsig=0;
-    int hdr_line=0;
-    unsigned empty = 0;
-
-    buflen = *r_buflen;
-    assert(buflen >= 100 );
-    buflen -= 4; /* reserved room for CR,LF, and two extra */
-    do {
-       switch( state ) {
-         case fhdrHASArmor:
-           /* read at least the first byte to check whether it is armored
-            * or not */
-           c = 0;
-           for(n=0; n < 28 && (c=iobuf_get(a)) != -1 && c != '\n'; )
-               buf[n++] = c;
-           if( !n && c == '\n' )
-               state = fhdrCHECKBegin;
-           else if( !n  || c == -1 )
-               state = fhdrNOArmor; /* too short */
-           else if( !is_armored( buf ) ) {
-               state = fhdrNOArmor;
-               if( c == '\n' )
-                   buf[n++] = c;
-           }
-           else if( c == '\n' )
-               state = fhdrCHECKBegin;
-           else
-               state = fhdrINITCont;
-           break;
-
-         case fhdrINIT: /* read some stuff into buffer */
-           n = 0;
-         case fhdrINITCont: /* read more stuff into buffer */
-           c = 0;
-           for(; n < buflen && (c=iobuf_get(a)) != -1 && c != '\n'; )
-               buf[n++] = c;
-           state = c == '\n' ? fhdrCHECKBegin :
-                    c == -1  ? fhdrEOF : fhdrINITSkip;
-           break;
-
-         case fhdrINITSkip:
-           if( c == '\n' )
-               n = 0;
-           else {
-               while( (c=iobuf_get(a)) != -1 && c != '\n' )
-                   ;
-           }
-           state =  c == -1? fhdrEOF : fhdrINIT;
-           break;
-
-         case fhdrSKIPHeader:
-           while( (c=iobuf_get(a)) != -1 && c != '\n' )
-               ;
-           state =  c == -1? fhdrEOF : fhdrWAITHeader;
-           break;
-
-         case fhdrWAITHeader: /* wait for Header lines */
-           c = 0;
-           for(n=0; n < buflen && (c=iobuf_get(a)) != -1 && c != '\n'; )
-               buf[n++] = c;
-           buf[n] = 0;
-           if( n < buflen || c == '\n' ) {
-               if( n && buf[0] != '\r') { /* maybe a header */
-                   if( strchr( buf, ':') ) { /* yes */
-                       int hashes=0;
-                       if( buf[n-1] == '\r' )
-                           buf[--n] = 0;
-                       if( opt.verbose ) {
-                           log_info(_("armor header: "));
-                           print_string( stderr, buf, n, 0 );
-                           putc('\n', stderr);
-                       }
-                       if( clearsig && !(hashes=parse_hash_header( buf )) ) {
-                           if( strlen(buf) > 15
-                               && !memcmp( buf, "NotDashEscaped:", 15 ) ) {
-                               *not_dashed = 1;
-                               state = fhdrWAITHeader;
-                           }
-                           else {
-                               log_error(_("invalid clearsig header\n"));
-                               state = fhdrERROR;
-                           }
-                       }
-                       else {
-                           state = fhdrWAITHeader;
-                           if( r_hashes )
-                               *r_hashes |= hashes;
-                       }
-                   }
-                   else if( clearsig && n > 15 && !memcmp(buf, "-----", 5 ) )
-                       state = fhdrNullClearsig;
-                   else
-                       state = fhdrCHECKDashEscaped3;
-               }
-               else if( !n || (buf[0] == '\r' && !buf[1]) ) { /* empty line */
-                   if( clearsig )
-                       state = fhdrWAITClearsig;
-                   else {
-                       /* this is not really correct: if we do not have
-                        * a clearsig and no armor lines we are not allowed
-                        * to have an empty line */
-                       n = 0;
-                       state = fhdrTEXT;
-                   }
-               }
-               else {
-                   log_error(_("invalid armor header: "));
-                   print_string( stderr, buf, n, 0 );
-                   putc('\n', stderr);
-                   state = fhdrERROR;
-               }
-           }
-           else if( c != -1 ) {
-               if( strchr( buf, ':') ) { /* buffer to short, but this is okay*/
-                   if( opt.verbose ) {
-                       log_info(_("armor header: "));
-                       print_string( stderr, buf, n, 0 );
-                       fputs("[...]\n", stderr);  /* indicate it is truncated */
-                   }
-                   state = fhdrSKIPHeader;  /* skip rest of line */
-               }
-               else /* line too long */
-                   state = fhdrERROR;
-           }
-           else
-               state = fhdrEOF;
-           break;
-
-         case fhdrWAITClearsig: /* skip the empty line (for clearsig) */
-           c = 0;
-           for(n=0; n < buflen && (c=iobuf_get(a)) != -1 && c != '\n'; )
-               buf[n++] = c;
-           if( c != -1 ) {
-               if( n > 15 && !memcmp(buf, "-----", 5 ) )
-                   state = fhdrNullClearsig;
-               else if( c != '\n' )
-                   state = fhdrREADClearsigNext;
-               else
-                   state = fhdrCHECKDashEscaped3;
-           }
-           else {
-               /* fixme: we should check whether this line continues
-                *   it is possible that we have only read ws until here
-                *   and more stuff is to come */
-               state = fhdrEOF;
-           }
-           break;
-
-         case fhdrNullClearsig: /* zero length cleartext */
-           state = fhdrENDClearsig;
-           break;
-
-         case fhdrENDClearsig:
-         case fhdrCHECKBegin:
-           state = state == fhdrCHECKBegin ? fhdrINITSkip : fhdrERRORShow;
-           if( n < 15 )
-               break;  /* too short */
-           if( memcmp( buf, "-----", 5 ) )
-               break;
-           buf[n] = 0;
-           p = strstr(buf+5, "-----");
-           if( !p )
-               break;
-           *p = 0;
-           p += 5;
-           if( *p == '\r' )
-               p++;
-           if( *p )
-               break; /* garbage after dashes */
-           p = buf+5;
-           for(i=0; (s=head_strings[i]); i++ )
-               if( !strcmp(s, p) )
-                   break;
-           if( !s )
-               break; /* unknown begin line */
-           if( only_keyblocks && i != 1 && i != 5 && i != 6 )
-               break; /* not a keyblock armor */
-
-           /* found the begin line */
-           hdr_line = i;
-           state = fhdrWAITHeader;
-           *not_dashed = 0;
-           if( hdr_line == BEGIN_SIGNED_MSG_IDX )
-               clearsig = 1;
-           if( opt.verbose > 1 )
-               log_info(_("armor: %s\n"), head_strings[hdr_line]);
-           break;
-
-         case fhdrCLEARSIGSimple:
-           /* we are at the begin of a new line */
-         case fhdrCLEARSIGSimpleNext:
-           n = 0;
-           c = 0;
-           while( n < buflen && (c=iobuf_get(a)) != -1 ) {
-               buf[n++] = c;
-               if( c == '\n' )
-                   break;
-           }
-           buf[n] = 0;
-           if( c == -1 )
-               state = fhdrEOF;
-           else if( state == fhdrCLEARSIGSimple
-                    && n > 15 && !memcmp(buf, "-----", 5 ) ) {
-               if( c == '\n' )
-                   buf[n-1] = 0;
-               state = fhdrENDClearsig;
-           }
-           else if( c == '\n' )
-               state = fhdrCLEARSIGSimple;
-           else
-               state = fhdrCLEARSIGSimpleNext;
-           break;
-
-         case fhdrCLEARSIG:
-         case fhdrEMPTYClearsig:
-         case fhdrREADClearsig:
-           /* we are at the start of a line: read a clearsig into the buffer
-            * we have to look for a header line or dashed escaped text*/
-           n = 0;
-           c = 0;
-           while( n < buflen && (c=iobuf_get(a)) != -1 && c != '\n' )
-               buf[n++] = c;
-           buf[n] = 0;
-           if( c == -1 )
-               state = fhdrEOF;
-           else if( !n || ( buf[0]=='\r' && !buf[1] ) ) {
-               state = fhdrEMPTYClearsig;
-               empty++;
-           }
-           else if( c == '\n' )
-               state = fhdrCHECKClearsig2;
-           else
-               state = fhdrCHECKClearsig;
-           break;
-
-         case fhdrCHECKDashEscaped3:
-           if( *not_dashed ) {
-               state = fhdrTEXTSimple;
-               break;
-           }
-           if( !(n > 1 && buf[0] == '-' && buf[1] == ' ' ) ) {
-               state = fhdrTEXT;
-               break;
-           }
-           /* fall through */
-         case fhdrCHECKDashEscaped2:
-         case fhdrCHECKDashEscaped:
-           /* check dash escaped line */
-           if( buf[2] == '-' || ( n > 6 && !memcmp(buf+2, "From ", 5))) {
-               for(i=2; i < n; i++ )
-                   buf[i-2] = buf[i];
-               n -= 2;
-               buf[n] = 0; /* not really needed */
-               state = state == fhdrCHECKDashEscaped3 ? fhdrTEXT :
-                       state == fhdrCHECKDashEscaped2 ?
-                                fhdrREADClearsig : fhdrTESTSpaces;
-           }
-           else {
-               log_error(_("invalid dash escaped line: "));
-               print_string( stderr, buf, n, 0 );
-               putc('\n', stderr);
-               state = fhdrERROR;
-           }
-           break;
-
-         case fhdrCHECKClearsig:
-           /* check the clearsig line */
-           if( n > 15 && !memcmp(buf, "-----", 5 ) )
-               state = fhdrENDClearsig;
-           else if( buf[0] == '-' && buf[1] == ' ' && !*not_dashed )
-               state = fhdrCHECKDashEscaped;
-           else {
-               state = fhdrTESTSpaces;
-           }
-           break;
-
-         case fhdrCHECKClearsig2:
-           /* check the clearsig line */
-           if( n > 15 && !memcmp(buf, "-----", 5 ) )
-               state = fhdrENDClearsig;
-           else if( buf[0] == '-' && buf[1] == ' ' && !*not_dashed )
-               state = fhdrCHECKDashEscaped2;
-           else {
-               state = fhdrREADClearsig;
-           }
-           break;
-
-         case fhdrREADClearsigNext:
-           /* Read to the end of the line, do not care about checking
-            * for dashed escaped text of headers */
-           c = 0;
-           n = 0;
-           while( n < buflen && (c=iobuf_get(a)) != -1 && c != '\n' )
-               buf[n++] = c;
-           buf[n] = 0;
-           if( c == -1 )
-               state = fhdrEOF;
-           else if( c == '\n' )
-               state = fhdrREADClearsig;
-           else
-               state = fhdrTESTSpaces;
-           break;
-
-         case fhdrTESTSpaces: {
-           /* but must check whether the rest of the line
-            * only contains white spaces; this is problematic
-            * since we may have to restore the stuff.  simply
-            * counting spaces is not enough, because it may be a
-            * mix of different white space characters */
-           IOBUF b = iobuf_temp();
-           while( (c=iobuf_get(a)) != -1 && c != '\n' ) {
-               iobuf_put(b,c);
-               if( c != ' ' && c != '\t' && c != '\r' )
-                   break;
-           }
-           if( c == '\n' ) {
-               /* okay we can skip the rest of the line */
-               iobuf_close(b);
-               state = fhdrREADClearsig;
-           }
-           else {
-               iobuf_unget_and_close_temp(a,b);
-               state = fhdrREADClearsigNext;
-           }
-         } break;
-
-         case fhdrERRORShow:
-           log_error(_("invalid clear text header: "));
-           print_string( stderr, buf, n, 0 );
-           putc('\n', stderr);
-           state = fhdrERROR;
-           break;
-
-         default: BUG();
-       }
-       switch( state ) {
-         case fhdrINIT:
-         case fhdrINITCont:
-         case fhdrINITSkip:
-         case fhdrCHECKBegin:
-         case fhdrWAITHeader:
-         case fhdrWAITClearsig:
-         case fhdrSKIPHeader:
-         case fhdrEMPTYClearsig:
-         case fhdrCHECKClearsig:
-         case fhdrCHECKClearsig2:
-         case fhdrCHECKDashEscaped:
-         case fhdrCHECKDashEscaped2:
-         case fhdrCHECKDashEscaped3:
-         case fhdrTESTSpaces:
-         case fhdrERRORShow:
-           cont = 1;
-           break;
-         default: cont = 0;
-       }
-    } while( cont );
-
-    if( clearsig && state == fhdrTEXT ) {
-       state = fhdrCLEARSIG;
-    }
-    else if( clearsig && state == fhdrTEXTSimple ) {
-       state = fhdrCLEARSIGSimple;
-       buf[n] = '\n';
-       n++;
-    }
-
-    if( state == fhdrCLEARSIG || state == fhdrREADClearsig ) {
-       /* append CR,LF after removing trailing wspaces */
-       for(p=buf+n-1; n; n--, p-- ) {
-           assert( *p != '\n' );
-           if( *p != ' ' && *p != '\t' && *p != '\r' ) {
-               p[1] = '\r';
-               p[2] = '\n';
-               n += 2;
-               break;
-           }
-       }
-       if( !n ) {
-           buf[0] = '\r';
-           buf[1] = '\n';
-           n = 2;
-       }
-    }
-
-  fprintf(stderr,"ARMOR READ (state=%d): %.*s", state, n, buf );
-
-    *r_buflen = n;
-    *r_empty = empty;
-    return state;
-}
-#endif
-
 
 static unsigned
 trim_trailing_spaces( byte *line, unsigned len )
@@ -909,8 +500,10 @@ fake_packet( armor_filter_context_t *afx, IOBUF a,
        else {
            while( len < size && afx->buffer_pos < afx->buffer_len )
                buf[len++] = afx->buffer[afx->buffer_pos++];
-           buf[len++] = '\r';
-           buf[len++] = '\n';
+           if( afx->buffer_pos >= afx->buffer_len ) {
+               buf[len++] = '\r';
+               buf[len++] = '\n';
+           }
            if( len >= size )
                continue;
        }
@@ -948,8 +541,8 @@ fake_packet( armor_filter_context_t *afx, IOBUF a,
                    putc('\n', stderr);
                }
                lastline = 1;
-               assert( len >= 4 );
-               len -= 2; /* remove the last CR,LF */
+               if( len >= 2 )
+                   len -= 2; /* remove the last CR,LF */
                rc = -1;
            }
        }
@@ -958,7 +551,7 @@ fake_packet( armor_filter_context_t *afx, IOBUF a,
     buf[0] = (len-2) >> 8;
     buf[1] = (len-2);
     if( lastline ) { /* write last (ending) length header */
-       if( buf[0] && buf[1] ) { /* only if we have some text */
+       if( buf[0] || buf[1] ) { /* only if we have some text */
            buf[len++] = 0;
            buf[len++] = 0;
        }
@@ -1134,7 +727,7 @@ armor_filter( void *opaque, int control,
     int  idx, idx2;
     size_t n=0;
     u32 crc;
-  #if 1
+  #if 0
     static FILE *fp ;
 
     if( !fp ) {
@@ -1232,7 +825,7 @@ armor_filter( void *opaque, int control,
        }
        else
            rc = radix64_read( afx, a, &n, buf, size );
-      #if 1
+      #if 0
        if( n )
            if( fwrite(buf, n, 1, fp ) != 1 )
                BUG();
@@ -1367,6 +960,9 @@ armor_filter( void *opaque, int control,
        }
        else if( !afx->any_data && !afx->inp_bypass )
            log_error(_("no valid OpenPGP data found.\n"));
+       if( afx->truncated )
+           log_info(_("invalid armor: line longer than %d characters\n"),
+                     MAX_LINELEN );
        m_free( afx->buffer );
        afx->buffer = NULL;
     }
index 5b952f1..a1eb126 100644 (file)
@@ -426,7 +426,7 @@ do_plaintext( IOBUF out, int ctb, PKT_plaintext *pt )
 {
     int i, rc = 0;
     u32 n;
-    byte buf[1000]; /* FIXME: this buffer has the plaintext! */
+    byte buf[1000]; /* this buffer has the plaintext! */
     int nbytes;
 
     write_header(out, ctb, calc_plaintext( pt ) );
index d44d6c2..c5967c2 100644 (file)
@@ -1,5 +1,5 @@
 /* encr-data.c -  process an encrypted data packet
- *     Copyright (C) 1998 Free Software Foundation, Inc.
+ *     Copyright (C) 1998, 1999 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -79,10 +79,12 @@ decrypt_data( PKT_encrypted *ed, DEK *dek )
     cipher_setiv( dfx.cipher_hd, NULL );
 
     if( ed->len ) {
-       /*iobuf_set_limit( ed->buf, ed->len );*/
-
-       for(i=0; i < (blocksize+2) && ed->len; i++, ed->len-- )
-           temp[i] = iobuf_get(ed->buf);
+       for(i=0; i < (blocksize+2) && ed->len; i++, ed->len-- ) {
+           if( (c=iobuf_get(ed->buf)) == -1 )
+               break;
+           else
+               temp[i] = c;
+       }
     }
     else {
        for(i=0; i < (blocksize+2); i++ )
@@ -100,13 +102,6 @@ decrypt_data( PKT_encrypted *ed, DEK *dek )
     }
     iobuf_push_filter( ed->buf, decode_filter, &dfx );
     proc_packets(ed->buf);
-  #if 0
-    iobuf_pop_filter( ed->buf, decode_filter, &dfx );
-    if( ed->len )
-       iobuf_set_limit( ed->buf, 0 ); /* disable the readlimit */
-    else
-       iobuf_clear_eof( ed->buf );
-  #endif
     ed->buf = NULL;
     cipher_close(dfx.cipher_hd);
     return 0;
index 3e3c9d0..e953b0d 100644 (file)
@@ -264,7 +264,6 @@ free_encrypted( PKT_encrypted *ed )
        if( iobuf_in_block_mode(ed->buf) ) {
            while( iobuf_get(ed->buf) != -1 )
                ;
-           iobuf_set_block_mode(ed->buf, 0);
        }
        else {
            for( ; ed->len; ed->len-- ) /* skip the packet */
@@ -282,7 +281,6 @@ free_plaintext( PKT_plaintext *pt )
        if( iobuf_in_block_mode(pt->buf) ) {
            while( iobuf_get(pt->buf) != -1 )
                ;
-           iobuf_set_block_mode(pt->buf, 0);
        }
        else {
            for( ; pt->len; pt->len-- ) /* skip the packet */
index f1df39f..6b69eef 100644 (file)
@@ -278,7 +278,7 @@ proc_plaintext( CTX c, PACKET *pkt )
        md_enable( c->mfx.md, DIGEST_ALGO_SHA1 );
        md_enable( c->mfx.md, DIGEST_ALGO_MD5 );
     }
-    md_start_debug( c->mfx.md, "verify" );
+    /*md_start_debug( c->mfx.md, "verify" );*/
     rc = handle_plaintext( pt, &c->mfx, c->sigs_only, clearsig );
     if( rc == G10ERR_CREATE_FILE && !c->sigs_only) {
        /* can't write output but we hash it anyway to
@@ -849,6 +849,24 @@ check_sig_and_print( CTX c, KBNODE node )
        print_keyid( stderr, sig->keyid );
        putc('\"', stderr);
        putc('\n', stderr);
+       if( !rc && is_status_enabled() ) {
+           /* print a status response with the fingerprint */
+           PKT_public_key *pk = m_alloc_clear( sizeof *pk );
+
+           if( !get_pubkey( pk, sig->keyid ) ) {
+               byte array[MAX_FINGERPRINT_LEN], *p;
+               char buf[MAX_FINGERPRINT_LEN*2+1];
+               size_t i, n;
+
+               fingerprint_from_pk( pk, array, &n );
+               p = array;
+               for(i=0; i < n ; i++, p++ )
+                   sprintf(buf+2*i, "%02X", *p );
+               write_status_text( STATUS_VALIDSIG, buf );
+           }
+           free_public_key( pk );
+       }
+
        if( !rc )
            rc = check_signatures_trust( sig );
        if( rc )
index c5c6685..887b583 100644 (file)
@@ -1,5 +1,5 @@
 /* plaintext.c -  process an plaintext packet
- *     Copyright (C) 1998 Free Software Foundation, Inc.
+ *     Copyright (C) 1998, 1999 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
 #include "i18n.h"
 
 
-/****************
- * Defer the last CR,LF
- */
-static void
-special_md_putc( MD_HANDLE md, int c, int *state )
-{
-    if( c == -1 ) { /* flush */
-       if( *state == 1 ) {
-           md_putc(md, '\r');
-       }
-
-       *state = 0;
-       return;
-    }
-  again:
-    switch( *state ) {
-      case 0:
-       if( c == '\r' )
-           *state = 1;
-       else
-           md_putc(md, c );
-       break;
-      case 1:
-       if( c == '\n' )
-           *state = 2;
-       else {
-           md_putc(md, '\r');
-           *state = 0;
-           goto again;
-       }
-       break;
-      case 2:
-       md_putc(md, '\r');
-       md_putc(md, '\n');
-       *state = 0;
-       goto again;
-      default: BUG();
-    }
-}
-
 
 /****************
  * Handle a plaintext packet.  If MFX is not NULL, update the MDs
@@ -91,7 +51,6 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
     int rc = 0;
     int c;
     int convert = pt->mode == 't';
-    int special_state = 0;
 
     /* create the filename as C string */
     if( nooutput )
@@ -137,12 +96,8 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
                rc = G10ERR_READ_FILE;
                goto leave;
            }
-           if( mfx->md ) {
-               if( 0 && convert && clearsig )
-                   special_md_putc(mfx->md, c, &special_state );
-               else
-                   md_putc(mfx->md, c );
-           }
+           if( mfx->md )
+               md_putc(mfx->md, c );
            if( convert && !clearsig && c == '\r' )
                continue; /* fixme: this hack might be too simple */
            if( fp ) {
@@ -157,12 +112,8 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
     }
     else {
        while( (c = iobuf_get(pt->buf)) != -1 ) {
-           if( mfx->md ) {
-               if( 0 && convert && clearsig )
-                   special_md_putc(mfx->md, c, &special_state  );
-               else
-                   md_putc(mfx->md, c );
-           }
+           if( mfx->md )
+               md_putc(mfx->md, c );
            if( convert && !clearsig && c == '\r' )
                continue; /* fixme: this hack might be too simple */
            if( fp ) {
@@ -176,8 +127,6 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
        }
        pt->buf = NULL;
     }
-    if( 0 && mfx->md && convert && clearsig )
-       special_md_putc(mfx->md, -1, &special_state  ); /* flush */
 
     if( fp && fp != stdout && fclose(fp) ) {
        log_error("Error closing `%s': %s\n", fname, strerror(errno) );
index 2e9fd47..2460cd0 100644 (file)
@@ -162,7 +162,10 @@ do_check( PKT_public_key *pk, PKT_signature *sig, MD_HANDLE digest )
 
     cur_time = make_timestamp();
     if( pk->timestamp > cur_time ) {
-       log_info(_("public key created in future (time warp or clock problem)\n"));
+       ulong d = pk->timestamp - cur_time;
+       log_info(_("public key created %lu %s "
+                  "in future (time warp or clock problem)\n"),
+                   d, d==1? _("second"):_("seconds") );
        return G10ERR_TIME_CONFLICT;
     }
 
index 0fac451..abb6e9d 100644 (file)
@@ -637,7 +637,7 @@ clearsign_file( const char *fname, STRLIST locusr, const char *outfile )
        PKT_secret_key *sk = sk_rover->sk;
        md_enable(textmd, hash_for(sk->pubkey_algo));
     }
-    md_start_debug( textmd, "create" );
+    /*md_start_debug( textmd, "create" );*/
     if( !opt.not_dash_escaped )
        iobuf_push_filter( inp, text_filter, &tfx );
     rc = write_dash_escaped( inp, out, textmd );
index 71a4e83..4ed91d2 100644 (file)
@@ -56,6 +56,11 @@ set_status_fd ( int newfd )
     fd = newfd;
 }
 
+int
+is_status_enabled()
+{
+    return fd != -1;
+}
 
 void
 write_status ( int no )
@@ -92,6 +97,7 @@ write_status_text ( int no, const char *text)
       case STATUS_SHM_GET_BOOL  : s = "SHM_GET_BOOL\n"; break;
       case STATUS_SHM_GET_HIDDEN : s = "SHM_GET_HIDDEN\n"; break;
       case STATUS_NEED_PASSPHRASE: s = "NEED_PASSPHRASE\n"; break;
+      case STATUS_VALIDSIG      : s = "VALIDSIG\n"; break;
       default: s = "?\n"; break;
     }
 
index fa15836..e0f552b 100644 (file)
 #define STATUS_SHM_GET_HIDDEN  19
 
 #define STATUS_NEED_PASSPHRASE 20
+#define STATUS_VALIDSIG        21
 
 /*-- status.c --*/
 void set_status_fd ( int fd );
+int  is_status_enabled ( void );
 void write_status ( int no );
 void write_status_text ( int no, const char *text );
 
index 9d79660..2a49d40 100644 (file)
@@ -1,3 +1,7 @@
+Sat Jan  9 16:02:23 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * mpi-cmp.c (mpi_cmp_ui): Normalized the arg.
+
 Thu Jan  7 18:00:58 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
        * mpi-bit.c (mpi_normalize): New.
index 227a929..00aa5d0 100644 (file)
@@ -1,5 +1,5 @@
 /* mpi-bit.c  -  MPI bit level fucntions
- *     Copyright (C) 1998 Free Software Foundation, Inc.
+ *     Copyright (C) 1998, 1999 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
index 3c3c76b..2a6cdbf 100644 (file)
@@ -1,5 +1,5 @@
 /* mpi-cmp.c  -  MPI functions
- *     Copyright (C) 1998 Free Software Foundation, Inc.
+ *     Copyright (C) 1998, 1999 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -28,6 +28,7 @@ mpi_cmp_ui( MPI u, unsigned long v )
 {
     mpi_limb_t limb = v;
 
+    mpi_normalize( u );
     if( !u->nlimbs && !limb )
        return 0;
     if( u->sign )
index 641d623..596dd8f 100644 (file)
@@ -1,3 +1,8 @@
+Sat Jan  9 16:02:23 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * secmem.c (lock_pool): add another check that setuid() worked.
+       (secmem_init): Ditto.
+
 Thu Jan  7 18:00:58 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
        * iobuf.c (iobuf_clear_eof): Removed.
index 755da1d..b631452 100644 (file)
@@ -1,5 +1,5 @@
 /* iobuf.c  -  file handling
- *     Copyright (C) 1998,1999 Free Software Foundation, Inc.
+ *     Copyright (C) 1998, 1999 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -401,6 +401,24 @@ block_filter(void *opaque, int control, IOBUF chain, byte *buf, size_t *ret_len)
 }
 
 
+static void
+print_chain( IOBUF a )
+{
+    if( !DBG_IOBUF )
+       return;
+    for(; a; a = a->chain ) {
+       size_t dummy_len = 0;
+       const char *desc = "[none]";
+
+       if( a->filter )
+           a->filter( a->filter_ov, IOBUFCTRL_DESC, NULL,
+                                               (byte*)&desc, &dummy_len );
+
+       log_debug("iobuf chain: %d.%d `%s' filter_eof=%d start=%d len=%d\n",
+                  a->no, a->subno, desc, a->filter_eof,
+                  a->d.start, a->d.len );
+    }
+}
 
 /****************
  * Allocate a new io buffer, with no function assigned.
@@ -709,8 +727,7 @@ iobuf_push_filter( IOBUF a,
 
     if( DBG_IOBUF ) {
        log_debug("iobuf-%d.%d: push `%s'\n", a->no, a->subno, a->desc );
-       for(b=a; b; b = b->chain )
-           log_debug("\tchain: %d.%d `%s'\n", b->no, b->subno, b->desc );
+       print_chain( a );
     }
 
     /* now we can initialize the new function if we have one */
@@ -804,14 +821,15 @@ underflow(IOBUF a)
        return -1; /* EOF because a temp buffer can't do an underflow */
 
     if( a->filter_eof ) {
-       if( a->chain ) {
+       if( a->chain && a->filter_eof == 1 ) {
            IOBUF b = a->chain;
+           if( DBG_IOBUF )
+               log_debug("iobuf-%d.%d: pop `%s' in underflow\n",
+                                       a->no, a->subno, a->desc );
            m_free(a->d.buf);
            memcpy(a, b, sizeof *a);
            m_free(b);
-           if( DBG_IOBUF )
-               log_debug("iobuf-%d.%d: popped filter in underflow\n",
-                                                        a->no, a->subno );
+           print_chain(a);
        }
        else
            a->filter_eof = 0;
@@ -844,9 +862,17 @@ underflow(IOBUF a)
        len = a->d.size;
        rc = a->filter( a->filter_ov, IOBUFCTRL_UNDERFLOW, a->chain,
                        a->d.buf, &len );
-       if( DBG_IOBUF )
+       if( DBG_IOBUF ) {
            log_debug("iobuf-%d.%d: underflow: req=%lu got=%lu rc=%d\n",
                    a->no, a->subno, (ulong)a->d.size, (ulong)len, rc );
+         #if 0
+           if( a->no == 7 ) {
+               print_string(stderr, a->d.buf, len, 0 );
+               putc('\n', stderr );
+           }
+         #endif
+
+       }
        if( a->usage == 1 && rc == -1 ) { /* EOF: we can remove the filter */
            size_t dummy_len;
 
@@ -860,12 +886,16 @@ underflow(IOBUF a)
            a->filter_eof = 1;
            if( !len && a->chain ) {
                IOBUF b = a->chain;
+               if( DBG_IOBUF )
+                   log_debug("iobuf-%d.%d: pop `%s' in underflow (!len)\n",
+                                              a->no, a->subno, a->desc );
+               print_chain(a);
                m_free(a->d.buf);
                memcpy(a,b, sizeof *a);
                m_free(b);
-               if( DBG_IOBUF )
-                   log_debug("iobuf-%d.%d: popped filter in underflow (!len)\n",
-                                                            a->no, a->subno );
+               print_chain(a);
+
+
            }
        }
        else if( rc )
@@ -1009,6 +1039,7 @@ iobuf_peek(IOBUF a, byte *buf, unsigned buflen )
 
     if( a->filter_eof )
        return -1;
+
     if( !(a->d.start < a->d.len) ) {
        if( underflow(a) == -1 )
            return -1;
@@ -1275,7 +1306,8 @@ iobuf_set_block_mode( IOBUF a, size_t n )
     assert( a->usage == 1 || a->usage == 2 );
     ctx->usage = a->usage;
     if( !n ) {
-       log_debug("pop_filter called in set_block_mode - please report\n");
+       if( a->usage == 1 )
+           log_debug("pop_filter called in set_block_mode - please report\n");
        pop_filter(a, block_filter, NULL );
     }
     else {
@@ -1296,7 +1328,9 @@ iobuf_set_partial_block_mode( IOBUF a, size_t len )
     assert( a->usage == 1 || a->usage == 2 );
     ctx->usage = a->usage;
     if( !len ) {
-       log_debug("pop_filter called in set_partial_block_mode - please report\n");
+       if( a->usage == 1 )
+           log_debug("pop_filter called in set_partial_block_mode"
+                                                   " - please report\n");
        pop_filter(a, block_filter, NULL );
     }
     else {
index 30396f3..e9bc05a 100644 (file)
@@ -1,5 +1,5 @@
 /* secmem.c  - memory allocation from a secure heap
- *     Copyright (C) 1998 Free Software Foundation, Inc.
+ *     Copyright (C) 1998,1999 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -104,7 +104,7 @@ lock_pool( void *p, size_t n )
   #endif
 
     if( uid && !geteuid() ) {
-       if( setuid( uid ) )
+       if( setuid( uid ) || getuid() != geteuid()  )
            log_fatal("failed to reset uid: %s\n", strerror(errno));
     }
 
@@ -223,7 +223,7 @@ secmem_init( size_t n )
        disable_secmem=1;
        uid = getuid();
        if( uid != geteuid() ) {
-           if( setuid( uid ) )
+           if( setuid( uid ) || getuid() != geteuid() )
                log_fatal("failed to drop setuid\n" );
        }
       #endif