agent,g10: Remove redundant SERIALNO request.
[gnupg.git] / g10 / build-packet.c
index e244bda..c81c1ab 100644 (file)
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ * along with this program; if not, see <https://www.gnu.org/licenses/>.
  */
 
 #include <config.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <assert.h>
 #include <ctype.h>
 
 #include "gpg.h"
-#include "util.h"
+#include "../common/util.h"
 #include "packet.h"
-#include "status.h"
-#include "iobuf.h"
-#include "i18n.h"
+#include "../common/status.h"
+#include "../common/iobuf.h"
+#include "../common/i18n.h"
 #include "options.h"
-#include "host2net.h"
+#include "../common/host2net.h"
 
 static int do_user_id( IOBUF out, int ctb, PKT_user_id *uid );
 static int do_key (iobuf_t out, int ctb, PKT_public_key *pk);
@@ -91,7 +90,7 @@ build_packet( IOBUF out, PACKET *pkt )
 
     if( DBG_PACKET )
        log_debug("build_packet() type=%d\n", pkt->pkttype );
-    assert( pkt->pkt.generic );
+    log_assert( pkt->pkt.generic );
 
     switch ((pkttype = pkt->pkttype))
       {
@@ -266,7 +265,7 @@ calc_packet_length( PACKET *pkt )
     u32 n=0;
     int new_ctb = 0;
 
-    assert( pkt->pkt.generic );
+    log_assert (pkt->pkt.generic);
     switch( pkt->pkttype ) {
       case PKT_PLAINTEXT:
        n = calc_plaintext( pkt->pkt.plaintext );
@@ -302,6 +301,8 @@ write_fake_data (IOBUF out, gcry_mpi_t a)
 
   if (!a)
     return 0;
+  if (!gcry_mpi_get_flag (a, GCRYMPI_FLAG_OPAQUE))
+    return 0; /* e.g. due to generating a key with wrong usage.  */
   p = gcry_mpi_get_opaque ( a, &n);
   if (!p)
     return 0; /* For example due to a read error in
@@ -330,7 +331,7 @@ do_user_id( IOBUF out, int ctb, PKT_user_id *uid )
     }
   else
     {
-      write_header2( out, ctb, uid->len, 2 );
+      write_header2( out, ctb, uid->len, 0 );
       rc = iobuf_write( out, uid->name, uid->len );
     }
   return rc;
@@ -465,7 +466,7 @@ do_key (iobuf_t out, int ctb, PKT_public_key *pk)
           byte *p;
           unsigned int ndatabits;
 
-          assert (gcry_mpi_get_flag (pk->pkey[npkey], GCRYMPI_FLAG_OPAQUE));
+          log_assert (gcry_mpi_get_flag (pk->pkey[npkey], GCRYMPI_FLAG_OPAQUE));
           p = gcry_mpi_get_opaque (pk->pkey[npkey], &ndatabits);
           if (p)
             iobuf_write (a, p, (ndatabits+7)/8 );
@@ -509,7 +510,7 @@ do_symkey_enc( IOBUF out, int ctb, PKT_symkey_enc *enc )
     log_assert (ctb_pkttype (ctb) == PKT_SYMKEY_ENC);
 
     /* The only acceptable version.  */
-    assert( enc->version == 4 );
+    log_assert( enc->version == 4 );
 
     /* RFC 4880, Section 3.7.  */
     switch( enc->s2k.mode )
@@ -620,7 +621,7 @@ calc_plaintext( PKT_plaintext *pt )
    is assumed to have been enabled on OUT.  On success, partial block
    mode is disabled.
 
-   If PT->BUF is NULL, the the caller must write out the data.  In
+   If PT->BUF is NULL, the caller must write out the data.  In
    this case, if PT->LEN was 0, then partial body length mode was
    enabled and the caller must disable it by calling
    iobuf_set_partial_body_length_mode (out, 0).  */
@@ -634,6 +635,7 @@ do_plaintext( IOBUF out, int ctb, PKT_plaintext *pt )
 
     write_header(out, ctb, calc_plaintext( pt ) );
     log_assert (pt->mode == 'b' || pt->mode == 't' || pt->mode == 'u'
+                || pt->mode == 'm'
                 || pt->mode == 'l' || pt->mode == '1');
     iobuf_put(out, pt->mode );
     iobuf_put(out, pt->namelen );
@@ -798,7 +800,7 @@ delete_sig_subpkt (subpktarea_t *area, sigsubpkttype_t reqtype )
 
     if (!okay)
         log_error ("delete_subpkt: buffer shorter than subpacket\n");
-    assert (unused <= area->len);
+    log_assert (unused <= area->len);
     area->len -= unused;
     return !!unused;
 }
@@ -971,28 +973,44 @@ build_sig_subpkt (PKT_signature *sig, sigsubpkttype_t type,
        sig->unhashed = newarea;
 }
 
-/****************
+/*
  * Put all the required stuff from SIG into subpackets of sig.
+ * PKSK is the signing key.
  * Hmmm, should we delete those subpackets which are in a wrong area?
  */
 void
-build_sig_subpkt_from_sig( PKT_signature *sig )
+build_sig_subpkt_from_sig (PKT_signature *sig, PKT_public_key *pksk)
 {
     u32  u;
-    byte buf[8];
+    byte buf[1+MAX_FINGERPRINT_LEN];
+    size_t fprlen;
 
-    u = sig->keyid[0];
-    buf[0] = (u >> 24) & 0xff;
-    buf[1] = (u >> 16) & 0xff;
-    buf[2] = (u >>  8) & 0xff;
-    buf[3] = u & 0xff;
-    u = sig->keyid[1];
-    buf[4] = (u >> 24) & 0xff;
-    buf[5] = (u >> 16) & 0xff;
-    buf[6] = (u >>  8) & 0xff;
-    buf[7] = u & 0xff;
-    build_sig_subpkt( sig, SIGSUBPKT_ISSUER, buf, 8 );
+    /* For v4 keys we need to write the ISSUER subpacket.  We do not
+     * want that for a future v5 format.  */
+    if (pksk->version < 5)
+      {
+        u = sig->keyid[0];
+        buf[0] = (u >> 24) & 0xff;
+        buf[1] = (u >> 16) & 0xff;
+        buf[2] = (u >>  8) & 0xff;
+        buf[3] = u & 0xff;
+        u = sig->keyid[1];
+        buf[4] = (u >> 24) & 0xff;
+        buf[5] = (u >> 16) & 0xff;
+        buf[6] = (u >>  8) & 0xff;
+        buf[7] = u & 0xff;
+        build_sig_subpkt (sig, SIGSUBPKT_ISSUER, buf, 8);
+      }
+
+    /* Write the new ISSUER_FPR subpacket.  */
+    fingerprint_from_pk (pksk, buf+1, &fprlen);
+    if (fprlen == 20)
+      {
+        buf[0] = pksk->version;
+        build_sig_subpkt (sig, SIGSUBPKT_ISSUER_FPR, buf, 21);
+      }
 
+    /* Write the timestamp.  */
     u = sig->timestamp;
     buf[0] = (u >> 24) & 0xff;
     buf[1] = (u >> 16) & 0xff;
@@ -1089,7 +1107,7 @@ notation_value_to_human_readable_string (struct notation *notation)
           preview[i] = '?';
       preview[i] = 0;
 
-      return xasprintf (_("[ not human readable (%zd bytes: %s%s) ]"),
+      return xasprintf (_("[ not human readable (%zu bytes: %s%s) ]"),
                         len, preview, i < len ? "..." : "");
     }
   else
@@ -1278,8 +1296,9 @@ sig_to_notation(PKT_signature *sig)
 {
   const byte *p;
   size_t len;
-  int seq=0,crit;
-  struct notation *list=NULL;
+  int seq = 0;
+  int crit;
+  notation_t list = NULL;
 
   /* See RFC 4880, 5.2.3.16 for the format of notation data.  In
      short, a notation has:
@@ -1324,6 +1343,7 @@ sig_to_notation(PKT_signature *sig)
          n->value=xmalloc(n2+1);
          memcpy(n->value,&p[8+n1],n2);
          n->value[n2]='\0';
+          n->flags.human = 1;
        }
       else
         /* Binary data.  */
@@ -1437,7 +1457,7 @@ do_signature( IOBUF out, int ctb, PKT_signature *sig )
 static int
 do_onepass_sig( IOBUF out, int ctb, PKT_onepass_sig *ops )
 {
-  log_assert (ctb_pkttype (ctb) == PKT_ONEPASS_SIG);
+    log_assert (ctb_pkttype (ctb) == PKT_ONEPASS_SIG);
 
     write_header(out, ctb, 4 + 8 + 1);