PGP/MIME implementors: text mode vs. binary mode? (from: hal@finney.org)

Russ Allbery rra at stanford.edu
Fri Feb 16 01:55:03 CET 2001


Marco d'Itri <md at Linux.IT> writes:
> On Feb 14, Werner Koch <wk at gnupg.org> wrote:

>> The real question is whether to hash trailing whitespace or not.  One
>> way to help decide this is to look at how existing implementations do
>> it.

> I remember a long discussion about that in the documentation for the
> PGP::Sign perl module.

This is the information I finally ended up with, written for GnuPG 1.0.1:

    PGP, both the 2.6.2 implementation and the 5.0 implementation, behaves
    differently when generating attached signatures than when generating
    detached signatures. For attached signatures, trailing whitespace in
    lines of the data is not significant, but for detached signatures it is.
    This, combined with the fact that there's no way that I can see to get
    PGP to verify a detached signature without using files on disk, means
    that in order to maintain the intended default semantics of this module
    (manipulating detached signatures), I had to use temporary files in the
    implementation of pgp_verify(). PGP::Sign sets its umask before creating
    those temporary files and checks for race conditions, but files may be
    left behind in the event that an application using pgp_verify() crashes
    unexpectedly.

    Also, because of this incompatibility, you need to be aware of what the
    process checking the signatures you generate is expecting. If that
    process is going to turn your signature into an attached signature for
    verification (as pgpverify does for Usenet control messages), then you
    need to pre-munge your data to remove trailing whitespace at the ends of
    lines before feeding it to PGP. PGP::Sign will do that for you if you
    set $PGP::Sign::MUNGE to a true value.

    To add even more confusion to the mix, RFC 2440 specifies that text-mode
    signatures are performed against data with canonicalized line endings
    and with trailing whitespace removed (see section 5.2.1), and GnuPG
    follows RFC 2440 in this regard. There is no difference specified there
    between attached and detached signatures, and GnuPG treats them both the
    same. This means that if you're generating a signature with PGP 5.0 that
    you want to be verifiable with GnuPG, you need to set $PGP::Sign::MUNGE,
    and there is no way to generate a detached signature of text data with
    trailing whitespace using GnuPG that will verify with PGP 5.0, or to
    generate a detached signature of text data with trailing whitespace that
    will verify as such with both PGP 5.0 and GnuPG.

    (It's possible that I may have missed documentation somewhere that
    resolves some of this conflict; if so, corrections are very much
    welcome.)

and from the test suite:

# 9 (check signature of munged data against unmunged data w/o MUNGE)
# Whether this signature verifies under GnuPG depends on the version of
# GnuPG; GnuPG 1.0.2 verifies it, while GnuPG 1.0.1 doesn't.  Earlier
# versions do verify it.  This is a disagreement over how to handle
# trailing whitespace when verifying signatures.
if ($PGP::Sign::PGPSTYLE eq 'GPG') {
    print "ok 9 # skip\n";
} else {
    $signer = pgp_verify ($signature, $version, @munged);
    print 'not ' if ($signer ne '' || PGP::Sign::pgp_error);
    print "ok 9\n";
}

-- 
Russ Allbery (rra at stanford.edu)             <http://www.eyrie.org/~eagle/>



More information about the Gnupg-devel mailing list