mirror of
git://git.gnupg.org/gnupg.git
synced 2025-01-03 12:11:33 +01:00
See ChangeLog: Sat Jan 9 16:02:23 CET 1999 Werner Koch
This commit is contained in:
parent
7d0efec7cf
commit
002b1a8632
@ -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>
|
Sun Jan 3 15:28:44 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
* acinclude.m4 (GNUPG_CHECK_RDYNAMIC): New.
|
* acinclude.m4 (GNUPG_CHECK_RDYNAMIC): New.
|
||||||
|
9
NEWS
9
NEWS
@ -8,6 +8,15 @@
|
|||||||
fixed an infinite loop bug in the 3DES code and in the code
|
fixed an infinite loop bug in the 3DES code and in the code
|
||||||
which looks for trusted signatures.
|
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
|
Noteworthy changes in version 0.9.0
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
201
THOUGHTS
Normal file
201
THOUGHTS
Normal file
@ -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).
|
||||||
|
|
3
TODO
3
TODO
@ -22,7 +22,7 @@ Important
|
|||||||
|
|
||||||
* print a warning when a revoked/expired secret key is used.
|
* 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.
|
flagged as INSECURE.
|
||||||
|
|
||||||
|
|
||||||
@ -55,6 +55,5 @@ Nice to have
|
|||||||
* Burn the buffers used by fopen(), or use read(2). Does this
|
* Burn the buffers used by fopen(), or use read(2). Does this
|
||||||
really make sense?
|
really make sense?
|
||||||
* change the fake_data stuff to mpi_set_opaque
|
* change the fake_data stuff to mpi_set_opaque
|
||||||
* rewrite the ugly armor code.
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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>
|
Thu Jan 7 18:00:58 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
* md.c (md_stop_debug): Do a flush first.
|
* md.c (md_stop_debug): Do a flush first.
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
## Process this file with automake to produce Makefile.in
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
gnupg_extensions = tiger twofish rndunix
|
|
||||||
|
|
||||||
INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/intl
|
INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/intl
|
||||||
|
|
||||||
noinst_LIBRARIES = libcipher.a
|
noinst_LIBRARIES = libcipher.a
|
||||||
|
|
||||||
|
EXTRA_PROGRAMS = tiger twofish rndunix rndlinux
|
||||||
if ENABLE_GNUPG_EXTENSIONS
|
if ENABLE_GNUPG_EXTENSIONS
|
||||||
pkglib_PROGRAMS = $(gnupg_extensions)
|
pkglib_PROGRAMS = @DYNAMIC_CIPHER_MODS@ @DYNAMIC_RANDOM_MODS@
|
||||||
else
|
else
|
||||||
pkglib_PROGRAMS =
|
pkglib_PROGRAMS =
|
||||||
endif
|
endif
|
||||||
|
|
||||||
DYNLINK_MOD_CFLAGS = -DIS_MODULE @DYNLINK_MOD_CFLAGS@
|
|
||||||
|
|
||||||
|
DYNLINK_MOD_CFLAGS = -DIS_MODULE @DYNLINK_MOD_CFLAGS@
|
||||||
|
|
||||||
libcipher_a_SOURCES = cipher.c \
|
libcipher_a_SOURCES = cipher.c \
|
||||||
pubkey.c \
|
pubkey.c \
|
||||||
@ -33,7 +33,6 @@ libcipher_a_SOURCES = cipher.c \
|
|||||||
random.h \
|
random.h \
|
||||||
random.c \
|
random.c \
|
||||||
rand-internal.h \
|
rand-internal.h \
|
||||||
rndlinux.c \
|
|
||||||
rmd.h \
|
rmd.h \
|
||||||
rmd160.c \
|
rmd160.c \
|
||||||
sha1.h \
|
sha1.h \
|
||||||
@ -43,9 +42,14 @@ libcipher_a_SOURCES = cipher.c \
|
|||||||
g10c.c \
|
g10c.c \
|
||||||
smallprime.c
|
smallprime.c
|
||||||
|
|
||||||
|
|
||||||
|
EXTRA_libcipher_a_SOURCES = rndlinux.c rndunix.c
|
||||||
EXTRA_tiger_SOURCES = tiger.c
|
EXTRA_tiger_SOURCES = tiger.c
|
||||||
EXTRA_twofish_SOURCES = twofish.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
|
tiger: $(srcdir)/tiger.c
|
||||||
`echo $(COMPILE) $(DYNLINK_MOD_CFLAGS) -o tiger $(srcdir)/tiger.c | \
|
`echo $(COMPILE) $(DYNLINK_MOD_CFLAGS) -o tiger $(srcdir)/tiger.c | \
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* md.c - message digest dispatcher
|
/* 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.
|
* This file is part of GnuPG.
|
||||||
*
|
*
|
||||||
|
@ -122,13 +122,9 @@ initialize()
|
|||||||
#elif USE_RNDUNIX
|
#elif USE_RNDUNIX
|
||||||
rndunix_constructor();
|
rndunix_constructor();
|
||||||
#elif USE_RNDW32
|
#elif USE_RNDW32
|
||||||
rndw32_constructor();
|
|
||||||
#elif USE_RNDOS2
|
#elif USE_RNDOS2
|
||||||
rndos2_constructor();
|
|
||||||
#elif USE_RNDATARI
|
#elif USE_RNDATARI
|
||||||
rndatari_constructor();
|
|
||||||
#elif USE_RNDMVS
|
#elif USE_RNDMVS
|
||||||
rndmvs_constructor();
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
* *
|
* *
|
||||||
* BeOS Randomness-Gathering Code *
|
* BeOS Randomness-Gathering Code *
|
||||||
* Copyright Peter Gutmann, Paul Kendall, and Chris Wedgwood 1996-1998 *
|
* 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;
|
size_t n;
|
||||||
|
|
||||||
if( !gatherer_pid ) {
|
if( !gatherer_pid ) {
|
||||||
|
/* make sure we are not setuid */
|
||||||
|
if( getuid() != geteuid() )
|
||||||
|
BUG();
|
||||||
/* time to start the gatherer process */
|
/* time to start the gatherer process */
|
||||||
if( pipe( pipedes ) ) {
|
if( pipe( pipedes ) ) {
|
||||||
g10_log_error("pipe() failed: %s\n", strerror(errno));
|
g10_log_error("pipe() failed: %s\n", strerror(errno));
|
||||||
|
42
configure.in
42
configure.in
@ -259,6 +259,48 @@ else
|
|||||||
fi
|
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
|
dnl setup assembler stuff
|
||||||
AC_MSG_CHECKING(for mpi assembler functions)
|
AC_MSG_CHECKING(for mpi assembler functions)
|
||||||
if test -f $srcdir/mpi/config.links ; then
|
if test -f $srcdir/mpi/config.links ; then
|
||||||
|
16
debian/README.Debian
vendored
Normal file
16
debian/README.Debian
vendored
Normal file
@ -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
|
166
debian/changelog
vendored
Normal file
166
debian/changelog
vendored
Normal file
@ -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:
|
23
debian/control
vendored
Normal file
23
debian/control
vendored
Normal file
@ -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.
|
30
debian/copyright
vendored
Normal file
30
debian/copyright
vendored
Normal file
@ -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.
|
7
debian/distfiles
vendored
Normal file
7
debian/distfiles
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
README.Debian
|
||||||
|
changelog
|
||||||
|
control
|
||||||
|
copyright
|
||||||
|
distfiles
|
||||||
|
preinst
|
||||||
|
rules
|
47
debian/preinst
vendored
Normal file
47
debian/preinst
vendored
Normal file
@ -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
|
72
debian/rules
vendored
Normal file
72
debian/rules
vendored
Normal file
@ -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
|
56
doc/DETAILS
56
doc/DETAILS
@ -40,6 +40,62 @@ ssb::1536:20:5CE086B5B5A18FF4:1998-07-07:0:::
|
|||||||
More fields may be added later.
|
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
|
||||||
==============
|
==============
|
||||||
Key generation shows progress by printing different characters to
|
Key generation shows progress by printing different characters to
|
||||||
|
@ -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>
|
Thu Jan 7 18:00:58 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
* pkclist.c (add_ownertrust): Fixed return value.
|
* pkclist.c (add_ownertrust): Fixed return value.
|
||||||
|
422
g10/armor.c
422
g10/armor.c
@ -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
|
static unsigned
|
||||||
trim_trailing_spaces( byte *line, unsigned len )
|
trim_trailing_spaces( byte *line, unsigned len )
|
||||||
@ -909,8 +500,10 @@ fake_packet( armor_filter_context_t *afx, IOBUF a,
|
|||||||
else {
|
else {
|
||||||
while( len < size && afx->buffer_pos < afx->buffer_len )
|
while( len < size && afx->buffer_pos < afx->buffer_len )
|
||||||
buf[len++] = afx->buffer[afx->buffer_pos++];
|
buf[len++] = afx->buffer[afx->buffer_pos++];
|
||||||
|
if( afx->buffer_pos >= afx->buffer_len ) {
|
||||||
buf[len++] = '\r';
|
buf[len++] = '\r';
|
||||||
buf[len++] = '\n';
|
buf[len++] = '\n';
|
||||||
|
}
|
||||||
if( len >= size )
|
if( len >= size )
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -948,7 +541,7 @@ fake_packet( armor_filter_context_t *afx, IOBUF a,
|
|||||||
putc('\n', stderr);
|
putc('\n', stderr);
|
||||||
}
|
}
|
||||||
lastline = 1;
|
lastline = 1;
|
||||||
assert( len >= 4 );
|
if( len >= 2 )
|
||||||
len -= 2; /* remove the last CR,LF */
|
len -= 2; /* remove the last CR,LF */
|
||||||
rc = -1;
|
rc = -1;
|
||||||
}
|
}
|
||||||
@ -958,7 +551,7 @@ fake_packet( armor_filter_context_t *afx, IOBUF a,
|
|||||||
buf[0] = (len-2) >> 8;
|
buf[0] = (len-2) >> 8;
|
||||||
buf[1] = (len-2);
|
buf[1] = (len-2);
|
||||||
if( lastline ) { /* write last (ending) length header */
|
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;
|
||||||
buf[len++] = 0;
|
buf[len++] = 0;
|
||||||
}
|
}
|
||||||
@ -1134,7 +727,7 @@ armor_filter( void *opaque, int control,
|
|||||||
int idx, idx2;
|
int idx, idx2;
|
||||||
size_t n=0;
|
size_t n=0;
|
||||||
u32 crc;
|
u32 crc;
|
||||||
#if 1
|
#if 0
|
||||||
static FILE *fp ;
|
static FILE *fp ;
|
||||||
|
|
||||||
if( !fp ) {
|
if( !fp ) {
|
||||||
@ -1232,7 +825,7 @@ armor_filter( void *opaque, int control,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
rc = radix64_read( afx, a, &n, buf, size );
|
rc = radix64_read( afx, a, &n, buf, size );
|
||||||
#if 1
|
#if 0
|
||||||
if( n )
|
if( n )
|
||||||
if( fwrite(buf, n, 1, fp ) != 1 )
|
if( fwrite(buf, n, 1, fp ) != 1 )
|
||||||
BUG();
|
BUG();
|
||||||
@ -1367,6 +960,9 @@ armor_filter( void *opaque, int control,
|
|||||||
}
|
}
|
||||||
else if( !afx->any_data && !afx->inp_bypass )
|
else if( !afx->any_data && !afx->inp_bypass )
|
||||||
log_error(_("no valid OpenPGP data found.\n"));
|
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 );
|
m_free( afx->buffer );
|
||||||
afx->buffer = NULL;
|
afx->buffer = NULL;
|
||||||
}
|
}
|
||||||
|
@ -426,7 +426,7 @@ do_plaintext( IOBUF out, int ctb, PKT_plaintext *pt )
|
|||||||
{
|
{
|
||||||
int i, rc = 0;
|
int i, rc = 0;
|
||||||
u32 n;
|
u32 n;
|
||||||
byte buf[1000]; /* FIXME: this buffer has the plaintext! */
|
byte buf[1000]; /* this buffer has the plaintext! */
|
||||||
int nbytes;
|
int nbytes;
|
||||||
|
|
||||||
write_header(out, ctb, calc_plaintext( pt ) );
|
write_header(out, ctb, calc_plaintext( pt ) );
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* encr-data.c - process an encrypted data packet
|
/* 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.
|
* This file is part of GnuPG.
|
||||||
*
|
*
|
||||||
@ -79,10 +79,12 @@ decrypt_data( PKT_encrypted *ed, DEK *dek )
|
|||||||
cipher_setiv( dfx.cipher_hd, NULL );
|
cipher_setiv( dfx.cipher_hd, NULL );
|
||||||
|
|
||||||
if( ed->len ) {
|
if( ed->len ) {
|
||||||
/*iobuf_set_limit( ed->buf, ed->len );*/
|
for(i=0; i < (blocksize+2) && ed->len; i++, ed->len-- ) {
|
||||||
|
if( (c=iobuf_get(ed->buf)) == -1 )
|
||||||
for(i=0; i < (blocksize+2) && ed->len; i++, ed->len-- )
|
break;
|
||||||
temp[i] = iobuf_get(ed->buf);
|
else
|
||||||
|
temp[i] = c;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for(i=0; i < (blocksize+2); i++ )
|
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 );
|
iobuf_push_filter( ed->buf, decode_filter, &dfx );
|
||||||
proc_packets(ed->buf);
|
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;
|
ed->buf = NULL;
|
||||||
cipher_close(dfx.cipher_hd);
|
cipher_close(dfx.cipher_hd);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -264,7 +264,6 @@ free_encrypted( PKT_encrypted *ed )
|
|||||||
if( iobuf_in_block_mode(ed->buf) ) {
|
if( iobuf_in_block_mode(ed->buf) ) {
|
||||||
while( iobuf_get(ed->buf) != -1 )
|
while( iobuf_get(ed->buf) != -1 )
|
||||||
;
|
;
|
||||||
iobuf_set_block_mode(ed->buf, 0);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for( ; ed->len; ed->len-- ) /* skip the packet */
|
for( ; ed->len; ed->len-- ) /* skip the packet */
|
||||||
@ -282,7 +281,6 @@ free_plaintext( PKT_plaintext *pt )
|
|||||||
if( iobuf_in_block_mode(pt->buf) ) {
|
if( iobuf_in_block_mode(pt->buf) ) {
|
||||||
while( iobuf_get(pt->buf) != -1 )
|
while( iobuf_get(pt->buf) != -1 )
|
||||||
;
|
;
|
||||||
iobuf_set_block_mode(pt->buf, 0);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for( ; pt->len; pt->len-- ) /* skip the packet */
|
for( ; pt->len; pt->len-- ) /* skip the packet */
|
||||||
|
@ -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_SHA1 );
|
||||||
md_enable( c->mfx.md, DIGEST_ALGO_MD5 );
|
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 );
|
rc = handle_plaintext( pt, &c->mfx, c->sigs_only, clearsig );
|
||||||
if( rc == G10ERR_CREATE_FILE && !c->sigs_only) {
|
if( rc == G10ERR_CREATE_FILE && !c->sigs_only) {
|
||||||
/* can't write output but we hash it anyway to
|
/* 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 );
|
print_keyid( stderr, sig->keyid );
|
||||||
putc('\"', stderr);
|
putc('\"', stderr);
|
||||||
putc('\n', 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 )
|
if( !rc )
|
||||||
rc = check_signatures_trust( sig );
|
rc = check_signatures_trust( sig );
|
||||||
if( rc )
|
if( rc )
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* plaintext.c - process an plaintext packet
|
/* 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.
|
* This file is part of GnuPG.
|
||||||
*
|
*
|
||||||
@ -35,46 +35,6 @@
|
|||||||
#include "i18n.h"
|
#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
|
* 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 rc = 0;
|
||||||
int c;
|
int c;
|
||||||
int convert = pt->mode == 't';
|
int convert = pt->mode == 't';
|
||||||
int special_state = 0;
|
|
||||||
|
|
||||||
/* create the filename as C string */
|
/* create the filename as C string */
|
||||||
if( nooutput )
|
if( nooutput )
|
||||||
@ -137,12 +96,8 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
|
|||||||
rc = G10ERR_READ_FILE;
|
rc = G10ERR_READ_FILE;
|
||||||
goto leave;
|
goto leave;
|
||||||
}
|
}
|
||||||
if( mfx->md ) {
|
if( mfx->md )
|
||||||
if( 0 && convert && clearsig )
|
|
||||||
special_md_putc(mfx->md, c, &special_state );
|
|
||||||
else
|
|
||||||
md_putc(mfx->md, c );
|
md_putc(mfx->md, c );
|
||||||
}
|
|
||||||
if( convert && !clearsig && c == '\r' )
|
if( convert && !clearsig && c == '\r' )
|
||||||
continue; /* fixme: this hack might be too simple */
|
continue; /* fixme: this hack might be too simple */
|
||||||
if( fp ) {
|
if( fp ) {
|
||||||
@ -157,12 +112,8 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
while( (c = iobuf_get(pt->buf)) != -1 ) {
|
while( (c = iobuf_get(pt->buf)) != -1 ) {
|
||||||
if( mfx->md ) {
|
if( mfx->md )
|
||||||
if( 0 && convert && clearsig )
|
|
||||||
special_md_putc(mfx->md, c, &special_state );
|
|
||||||
else
|
|
||||||
md_putc(mfx->md, c );
|
md_putc(mfx->md, c );
|
||||||
}
|
|
||||||
if( convert && !clearsig && c == '\r' )
|
if( convert && !clearsig && c == '\r' )
|
||||||
continue; /* fixme: this hack might be too simple */
|
continue; /* fixme: this hack might be too simple */
|
||||||
if( fp ) {
|
if( fp ) {
|
||||||
@ -176,8 +127,6 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
|
|||||||
}
|
}
|
||||||
pt->buf = NULL;
|
pt->buf = NULL;
|
||||||
}
|
}
|
||||||
if( 0 && mfx->md && convert && clearsig )
|
|
||||||
special_md_putc(mfx->md, -1, &special_state ); /* flush */
|
|
||||||
|
|
||||||
if( fp && fp != stdout && fclose(fp) ) {
|
if( fp && fp != stdout && fclose(fp) ) {
|
||||||
log_error("Error closing `%s': %s\n", fname, strerror(errno) );
|
log_error("Error closing `%s': %s\n", fname, strerror(errno) );
|
||||||
|
@ -162,7 +162,10 @@ do_check( PKT_public_key *pk, PKT_signature *sig, MD_HANDLE digest )
|
|||||||
|
|
||||||
cur_time = make_timestamp();
|
cur_time = make_timestamp();
|
||||||
if( pk->timestamp > cur_time ) {
|
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;
|
return G10ERR_TIME_CONFLICT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -637,7 +637,7 @@ clearsign_file( const char *fname, STRLIST locusr, const char *outfile )
|
|||||||
PKT_secret_key *sk = sk_rover->sk;
|
PKT_secret_key *sk = sk_rover->sk;
|
||||||
md_enable(textmd, hash_for(sk->pubkey_algo));
|
md_enable(textmd, hash_for(sk->pubkey_algo));
|
||||||
}
|
}
|
||||||
md_start_debug( textmd, "create" );
|
/*md_start_debug( textmd, "create" );*/
|
||||||
if( !opt.not_dash_escaped )
|
if( !opt.not_dash_escaped )
|
||||||
iobuf_push_filter( inp, text_filter, &tfx );
|
iobuf_push_filter( inp, text_filter, &tfx );
|
||||||
rc = write_dash_escaped( inp, out, textmd );
|
rc = write_dash_escaped( inp, out, textmd );
|
||||||
|
@ -56,6 +56,11 @@ set_status_fd ( int newfd )
|
|||||||
fd = newfd;
|
fd = newfd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
is_status_enabled()
|
||||||
|
{
|
||||||
|
return fd != -1;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
write_status ( int no )
|
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_BOOL : s = "SHM_GET_BOOL\n"; break;
|
||||||
case STATUS_SHM_GET_HIDDEN : s = "SHM_GET_HIDDEN\n"; break;
|
case STATUS_SHM_GET_HIDDEN : s = "SHM_GET_HIDDEN\n"; break;
|
||||||
case STATUS_NEED_PASSPHRASE: s = "NEED_PASSPHRASE\n"; break;
|
case STATUS_NEED_PASSPHRASE: s = "NEED_PASSPHRASE\n"; break;
|
||||||
|
case STATUS_VALIDSIG : s = "VALIDSIG\n"; break;
|
||||||
default: s = "?\n"; break;
|
default: s = "?\n"; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,9 +48,11 @@
|
|||||||
#define STATUS_SHM_GET_HIDDEN 19
|
#define STATUS_SHM_GET_HIDDEN 19
|
||||||
|
|
||||||
#define STATUS_NEED_PASSPHRASE 20
|
#define STATUS_NEED_PASSPHRASE 20
|
||||||
|
#define STATUS_VALIDSIG 21
|
||||||
|
|
||||||
/*-- status.c --*/
|
/*-- status.c --*/
|
||||||
void set_status_fd ( int fd );
|
void set_status_fd ( int fd );
|
||||||
|
int is_status_enabled ( void );
|
||||||
void write_status ( int no );
|
void write_status ( int no );
|
||||||
void write_status_text ( int no, const char *text );
|
void write_status_text ( int no, const char *text );
|
||||||
|
|
||||||
|
@ -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>
|
Thu Jan 7 18:00:58 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
* mpi-bit.c (mpi_normalize): New.
|
* mpi-bit.c (mpi_normalize): New.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* mpi-bit.c - MPI bit level fucntions
|
/* 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.
|
* This file is part of GnuPG.
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* mpi-cmp.c - MPI functions
|
/* 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.
|
* This file is part of GnuPG.
|
||||||
*
|
*
|
||||||
@ -28,6 +28,7 @@ mpi_cmp_ui( MPI u, unsigned long v )
|
|||||||
{
|
{
|
||||||
mpi_limb_t limb = v;
|
mpi_limb_t limb = v;
|
||||||
|
|
||||||
|
mpi_normalize( u );
|
||||||
if( !u->nlimbs && !limb )
|
if( !u->nlimbs && !limb )
|
||||||
return 0;
|
return 0;
|
||||||
if( u->sign )
|
if( u->sign )
|
||||||
|
@ -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>
|
Thu Jan 7 18:00:58 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
* iobuf.c (iobuf_clear_eof): Removed.
|
* iobuf.c (iobuf_clear_eof): Removed.
|
||||||
|
56
util/iobuf.c
56
util/iobuf.c
@ -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.
|
* Allocate a new io buffer, with no function assigned.
|
||||||
@ -709,8 +727,7 @@ iobuf_push_filter( IOBUF a,
|
|||||||
|
|
||||||
if( DBG_IOBUF ) {
|
if( DBG_IOBUF ) {
|
||||||
log_debug("iobuf-%d.%d: push `%s'\n", a->no, a->subno, a->desc );
|
log_debug("iobuf-%d.%d: push `%s'\n", a->no, a->subno, a->desc );
|
||||||
for(b=a; b; b = b->chain )
|
print_chain( a );
|
||||||
log_debug("\tchain: %d.%d `%s'\n", b->no, b->subno, b->desc );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now we can initialize the new function if we have one */
|
/* 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 */
|
return -1; /* EOF because a temp buffer can't do an underflow */
|
||||||
|
|
||||||
if( a->filter_eof ) {
|
if( a->filter_eof ) {
|
||||||
if( a->chain ) {
|
if( a->chain && a->filter_eof == 1 ) {
|
||||||
IOBUF b = a->chain;
|
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);
|
m_free(a->d.buf);
|
||||||
memcpy(a, b, sizeof *a);
|
memcpy(a, b, sizeof *a);
|
||||||
m_free(b);
|
m_free(b);
|
||||||
if( DBG_IOBUF )
|
print_chain(a);
|
||||||
log_debug("iobuf-%d.%d: popped filter in underflow\n",
|
|
||||||
a->no, a->subno );
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
a->filter_eof = 0;
|
a->filter_eof = 0;
|
||||||
@ -844,9 +862,17 @@ underflow(IOBUF a)
|
|||||||
len = a->d.size;
|
len = a->d.size;
|
||||||
rc = a->filter( a->filter_ov, IOBUFCTRL_UNDERFLOW, a->chain,
|
rc = a->filter( a->filter_ov, IOBUFCTRL_UNDERFLOW, a->chain,
|
||||||
a->d.buf, &len );
|
a->d.buf, &len );
|
||||||
if( DBG_IOBUF )
|
if( DBG_IOBUF ) {
|
||||||
log_debug("iobuf-%d.%d: underflow: req=%lu got=%lu rc=%d\n",
|
log_debug("iobuf-%d.%d: underflow: req=%lu got=%lu rc=%d\n",
|
||||||
a->no, a->subno, (ulong)a->d.size, (ulong)len, rc );
|
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 */
|
if( a->usage == 1 && rc == -1 ) { /* EOF: we can remove the filter */
|
||||||
size_t dummy_len;
|
size_t dummy_len;
|
||||||
|
|
||||||
@ -860,12 +886,16 @@ underflow(IOBUF a)
|
|||||||
a->filter_eof = 1;
|
a->filter_eof = 1;
|
||||||
if( !len && a->chain ) {
|
if( !len && a->chain ) {
|
||||||
IOBUF b = 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);
|
m_free(a->d.buf);
|
||||||
memcpy(a,b, sizeof *a);
|
memcpy(a,b, sizeof *a);
|
||||||
m_free(b);
|
m_free(b);
|
||||||
if( DBG_IOBUF )
|
print_chain(a);
|
||||||
log_debug("iobuf-%d.%d: popped filter in underflow (!len)\n",
|
|
||||||
a->no, a->subno );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( rc )
|
else if( rc )
|
||||||
@ -1009,6 +1039,7 @@ iobuf_peek(IOBUF a, byte *buf, unsigned buflen )
|
|||||||
|
|
||||||
if( a->filter_eof )
|
if( a->filter_eof )
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if( !(a->d.start < a->d.len) ) {
|
if( !(a->d.start < a->d.len) ) {
|
||||||
if( underflow(a) == -1 )
|
if( underflow(a) == -1 )
|
||||||
return -1;
|
return -1;
|
||||||
@ -1275,6 +1306,7 @@ iobuf_set_block_mode( IOBUF a, size_t n )
|
|||||||
assert( a->usage == 1 || a->usage == 2 );
|
assert( a->usage == 1 || a->usage == 2 );
|
||||||
ctx->usage = a->usage;
|
ctx->usage = a->usage;
|
||||||
if( !n ) {
|
if( !n ) {
|
||||||
|
if( a->usage == 1 )
|
||||||
log_debug("pop_filter called in set_block_mode - please report\n");
|
log_debug("pop_filter called in set_block_mode - please report\n");
|
||||||
pop_filter(a, block_filter, NULL );
|
pop_filter(a, block_filter, NULL );
|
||||||
}
|
}
|
||||||
@ -1296,7 +1328,9 @@ iobuf_set_partial_block_mode( IOBUF a, size_t len )
|
|||||||
assert( a->usage == 1 || a->usage == 2 );
|
assert( a->usage == 1 || a->usage == 2 );
|
||||||
ctx->usage = a->usage;
|
ctx->usage = a->usage;
|
||||||
if( !len ) {
|
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 );
|
pop_filter(a, block_filter, NULL );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* secmem.c - memory allocation from a secure heap
|
/* 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.
|
* This file is part of GnuPG.
|
||||||
*
|
*
|
||||||
@ -104,7 +104,7 @@ lock_pool( void *p, size_t n )
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if( uid && !geteuid() ) {
|
if( uid && !geteuid() ) {
|
||||||
if( setuid( uid ) )
|
if( setuid( uid ) || getuid() != geteuid() )
|
||||||
log_fatal("failed to reset uid: %s\n", strerror(errno));
|
log_fatal("failed to reset uid: %s\n", strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,7 +223,7 @@ secmem_init( size_t n )
|
|||||||
disable_secmem=1;
|
disable_secmem=1;
|
||||||
uid = getuid();
|
uid = getuid();
|
||||||
if( uid != geteuid() ) {
|
if( uid != geteuid() ) {
|
||||||
if( setuid( uid ) )
|
if( setuid( uid ) || getuid() != geteuid() )
|
||||||
log_fatal("failed to drop setuid\n" );
|
log_fatal("failed to drop setuid\n" );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user