write_header2 in build-packet.c

NIIBE Yutaka gniibe at fsij.org
Fri Jun 3 04:40:26 CEST 2016


I write some information to this list for the issue 2374.


I committed this change.

     commit db1ecc8212defdd183abbb6b1407fcc8d2dc9552
     Author: NIIBE Yutaka <gniibe at fsij.org>
     Date:   Wed Jun 1 20:59:09 2016 +0900

         g10: Allow User ID length >= 256.

         * build-packet.c (do_user_id): Call write_header2 with HDRLEN 
not set.

Once, I thought this should be backported to 1.4 and 2.0.  Examining
code in detail, I concluded it's not needed and not worth to apply
this to 1.4 and 2.0.

Actually, we had similar change in master for do_key as well.

     commit 02cf1357dd5ee34a57371f55b9d312b8b9e3a7e8
     Author: Justus Winter <justus at g10code.com>
     Date:   Thu Apr 7 13:55:42 2016 +0200

         g10: Fix exporting secret keys of certain sizes.

         * g10/build-packet.c (do_key): Do not use the header length 
         by the public key packet from the keyring, but let 'write_header2'
         compute the required length.
         Specifically exporting RSA keys of length 1024 failed, as the 
         public key packet requires 141 bytes a length that fits into 
one byte,
         but the secret key is significantly larger, making the export fail.

         GnuPG-bug-id: 2307
         Signed-off-by: Justus Winter <justus at g10code.com>

Those two changes are needed for master but not for 1.4 and 2.0.
That's because we have this in master.

     commit 960f5e26f2cda3ac6e6b30548fa808a690c39ffc
     Author: Neal H. Walfield <neal at g10code.com>
     Date:   Thu Feb 25 21:20:32 2016 +0100

         gpg: More carefully encode a packet's length.

         * g10/build-packet.c (write_header2): Make sure the length bits are
         cleared.  Fail if HDRLEN is set and the specified length can't be
         encoded in the available space.

         Signed-off-by: Neal H. Walfield <neal at g10code.com>

I think that the intention of this modification is good.  At first, I
failed to recognize the change of the semantics introduced by this

In 1.4 and 2.0, HDRLEN is used as just a hint for the length of
packet.  For example, when HDRLEN=2 and LENGTH=294, CTB will be |= 2,
and then, the packet with 5-byte header will be built with no failure.
It can be represented with 3-byte header actually, but it still works.

Modification by 960f5e2 changes the HDRLEN as a packet length
specification, thus, we needed to change the callers side by 02cf135
and db1ecc8.

Now, all calls of write_header2 are with HDRLEN=0, so, we could clean
up things more.

More information about the Gnupg-devel mailing list