See ChangeLog: Thu May 6 14:18:17 CEST 1999 Werner Koch
[gnupg.git] / g10 / build-packet.c
index 285f115..7a2c106 100644 (file)
@@ -258,38 +258,42 @@ hash_public_key( MD_HANDLE md, PKT_public_key *pk )
     pkt.pkt.public_key = pk;
     if( (rc = build_packet( a, &pkt )) )
        log_fatal("build public_key for hashing failed: %s\n", g10_errstr(rc));
-    /* skip the constructed header */
-    ctb = iobuf_get_noeof(a);
-    pktlen = 0;
-    if( (ctb & 0x40) ) {
-       c = iobuf_get_noeof(a);
-       if( c < 192 )
-           pktlen = c;
-       else if( c < 224 ) {
-           pktlen = (c - 192) * 256;
+
+    if( !(pk->version == 3 && pk->pubkey_algo == 16) ) {
+       /* skip the constructed header but don't do this for our very old
+        * v3 ElG keys */
+       ctb = iobuf_get_noeof(a);
+       pktlen = 0;
+       if( (ctb & 0x40) ) {
            c = iobuf_get_noeof(a);
-           pktlen += c + 192;
-       }
-       else if( c == 255 ) {
-           pktlen  = iobuf_get_noeof(a) << 24;
-           pktlen |= iobuf_get_noeof(a) << 16;
-           pktlen |= iobuf_get_noeof(a) << 8;
-           pktlen |= iobuf_get_noeof(a);
+           if( c < 192 )
+               pktlen = c;
+           else if( c < 224 ) {
+               pktlen = (c - 192) * 256;
+               c = iobuf_get_noeof(a);
+               pktlen += c + 192;
+           }
+           else if( c == 255 ) {
+               pktlen  = iobuf_get_noeof(a) << 24;
+               pktlen |= iobuf_get_noeof(a) << 16;
+               pktlen |= iobuf_get_noeof(a) << 8;
+               pktlen |= iobuf_get_noeof(a);
+           }
        }
-    }
-    else {
-       int lenbytes = ((ctb&3)==3)? 0 : (1<<(ctb & 3));
-       for( ; lenbytes; lenbytes-- ) {
-           pktlen <<= 8;
-           pktlen |= iobuf_get_noeof(a);
+       else {
+           int lenbytes = ((ctb&3)==3)? 0 : (1<<(ctb & 3));
+           for( ; lenbytes; lenbytes-- ) {
+               pktlen <<= 8;
+               pktlen |= iobuf_get_noeof(a);
+           }
        }
+       /* hash a header */
+       md_putc( md, 0x99 );
+       pktlen &= 0xffff; /* can't handle longer packets */
+       md_putc( md, pktlen >> 8 );
+       md_putc( md, pktlen & 0xff );
     }
-    /* hash a header */
-    md_putc( md, 0x99 );
-    pktlen &= 0xffff; /* can't handle longer packets */
-    md_putc( md, pktlen >> 8 );
-    md_putc( md, pktlen & 0xff );
-    /* hash the packet body (don't use pktlen here!) */
+    /* hash the packet body */
     while( (c=iobuf_get(a)) != -1 ) {
       #if 0
        fprintf( fp," %02x", c );