Merge branch 'STABLE-BRANCH-2-2' into master
authorWerner Koch <wk@gnupg.org>
Tue, 10 Apr 2018 08:14:30 +0000 (10:14 +0200)
committerWerner Koch <wk@gnupg.org>
Tue, 10 Apr 2018 08:14:30 +0000 (10:14 +0200)
--
Fixed conflicts:
  NEWS            - keep master
  configure.ac    - merge
  g10/card-util.c - mostly 2.2
  g10/sig-check.c - 2.2

15 files changed:
1  2 
agent/call-scd.c
agent/command-ssh.c
configure.ac
doc/gpg.texi
g10/card-util.c
g10/getkey.c
g10/gpg.c
g10/keydb.h
g10/keyedit.c
g10/keygen.c
g10/main.h
g10/sig-check.c
scd/app-openpgp.c
sm/gpgsm.c
tests/openpgp/defs.scm

Simple merge
Simple merge
diff --cc configure.ac
@@@ -614,8 -602,9 +614,9 @@@ AC_PROG_RANLI
  AC_CHECK_TOOL(AR, ar, :)
  AC_PATH_PROG(PERL,"perl")
  AC_CHECK_TOOL(WINDRES, windres, :)
 -AC_PATH_PROG(YAT2M, "yat2m")
 +AC_PATH_PROG(YAT2M, "yat2m", "./yat2m" )
  AC_ARG_VAR(YAT2M, [tool to convert texi to man pages])
+ AM_CONDITIONAL(HAVE_YAT2M, test -n "$ac_cv_path_YAT2M")
  AC_ISC_POSIX
  AC_SYS_LARGEFILE
  GNUPG_CHECK_USTAR
diff --cc doc/gpg.texi
Simple merge
diff --cc g10/card-util.c
Simple merge
diff --cc g10/getkey.c
Simple merge
diff --cc g10/gpg.c
Simple merge
diff --cc g10/keydb.h
Simple merge
diff --cc g10/keyedit.c
Simple merge
diff --cc g10/keygen.c
Simple merge
diff --cc g10/main.h
Simple merge
diff --cc g10/sig-check.c
@@@ -115,174 -115,177 +115,176 @@@ check_signature2 (ctrl_t ctrl
                    PKT_signature *sig, gcry_md_hd_t digest, u32 *r_expiredate,
                  int *r_expired, int *r_revoked, PKT_public_key **r_pk)
  {
-     int rc=0;
-     PKT_public_key *pk;
-     if (r_expiredate)
-       *r_expiredate = 0;
-     if (r_expired)
-       *r_expired = 0;
-     if (r_revoked)
-       *r_revoked = 0;
-     if (r_pk)
-       *r_pk = NULL;
-     pk = xtrycalloc (1, sizeof *pk);
-     if (!pk)
-       return gpg_error_from_syserror ();
-     if ( (rc=openpgp_md_test_algo(sig->digest_algo)) )
-       ; /* We don't have this digest. */
-     else if (! gnupg_digest_is_allowed (opt.compliance, 0, sig->digest_algo))
-       {
-       /* Compliance failure.  */
-       log_info (_("digest algorithm '%s' may not be used in %s mode\n"),
-                 gcry_md_algo_name (sig->digest_algo),
-                 gnupg_compliance_option_string (opt.compliance));
-       rc = gpg_error (GPG_ERR_DIGEST_ALGO);
-       }
-     else if ((rc=openpgp_pk_test_algo(sig->pubkey_algo)))
-       ; /* We don't have this pubkey algo. */
-     else if (!gcry_md_is_enabled (digest,sig->digest_algo))
-       {
-       /* Sanity check that the md has a context for the hash that the
-          sig is expecting.  This can happen if a onepass sig header does
-          not match the actual sig, and also if the clearsign "Hash:"
-          header is missing or does not match the actual sig. */
+   int rc=0;
+   PKT_public_key *pk;
  
-         log_info(_("WARNING: signature digest conflict in message\n"));
-       rc = gpg_error (GPG_ERR_GENERAL);
-       }
-     else if( get_pubkey (ctrl, pk, sig->keyid ) )
-       rc = gpg_error (GPG_ERR_NO_PUBKEY);
-     else if (! gnupg_pk_is_allowed (opt.compliance, PK_USE_VERIFICATION,
-                                   pk->pubkey_algo, pk->pkey,
-                                     nbits_from_pk (pk),
-                                   NULL))
-       {
-       /* Compliance failure.  */
-       log_error (_("key %s may not be used for signing in %s mode\n"),
-                    keystr_from_pk (pk),
-                    gnupg_compliance_option_string (opt.compliance));
-       rc = gpg_error (GPG_ERR_PUBKEY_ALGO);
-       }
-     else if(!pk->flags.valid)
-       {
-         /* You cannot have a good sig from an invalid key.  */
-         rc = gpg_error (GPG_ERR_BAD_PUBKEY);
-       }
-     else
-       {
-         if(r_expiredate)
-         *r_expiredate = pk->expiredate;
-       rc = check_signature_end (pk, sig, digest, r_expired, r_revoked, NULL);
-       /* Check the backsig.  This is a 0x19 signature from the
-          subkey on the primary key.  The idea here is that it should
-          not be possible for someone to "steal" subkeys and claim
-          them as their own.  The attacker couldn't actually use the
-          subkey, but they could try and claim ownership of any
-          signatures issued by it. */
-       if (!rc && !pk->flags.primary && pk->flags.backsig < 2)
-         {
-           if (!pk->flags.backsig)
-             {
-               log_info(_("WARNING: signing subkey %s is not"
-                          " cross-certified\n"),keystr_from_pk(pk));
-               log_info(_("please see %s for more information\n"),
-                        "https://gnupg.org/faq/subkey-cross-certify.html");
-               /* --require-cross-certification makes this warning an
-                      error.  TODO: change the default to require this
-                      after more keys have backsigs. */
-               if(opt.flags.require_cross_cert)
-                 rc = gpg_error (GPG_ERR_GENERAL);
-             }
-           else if(pk->flags.backsig == 1)
-             {
-               log_info(_("WARNING: signing subkey %s has an invalid"
-                          " cross-certification\n"),keystr_from_pk(pk));
-               rc = gpg_error (GPG_ERR_GENERAL);
-             }
-         }
+   if (r_expiredate)
+     *r_expiredate = 0;
+   if (r_expired)
+     *r_expired = 0;
+   if (r_revoked)
+     *r_revoked = 0;
+   if (r_pk)
+     *r_pk = NULL;
  
-       }
+   pk = xtrycalloc (1, sizeof *pk);
+   if (!pk)
+     return gpg_error_from_syserror ();
+   if  ((rc=openpgp_md_test_algo(sig->digest_algo)))
+     {
+       /* We don't have this digest. */
+     }
+   else if (!gnupg_digest_is_allowed (opt.compliance, 0, sig->digest_algo))
+     {
+       /* Compliance failure.  */
+       log_info (_("digest algorithm '%s' may not be used in %s mode\n"),
+                 gcry_md_algo_name (sig->digest_algo),
+                 gnupg_compliance_option_string (opt.compliance));
+       rc = gpg_error (GPG_ERR_DIGEST_ALGO);
+     }
+   else if ((rc=openpgp_pk_test_algo(sig->pubkey_algo)))
+     {
+       /* We don't have this pubkey algo. */
+     }
+   else if (!gcry_md_is_enabled (digest,sig->digest_algo))
+     {
+       /* Sanity check that the md has a context for the hash that the
+        * sig is expecting.  This can happen if a onepass sig header
+        * does not match the actual sig, and also if the clearsign
+        * "Hash:" header is missing or does not match the actual sig. */
+       log_info(_("WARNING: signature digest conflict in message\n"));
+       rc = gpg_error (GPG_ERR_GENERAL);
+     }
+   else if (get_pubkey (ctrl, pk, sig->keyid))
+     rc = gpg_error (GPG_ERR_NO_PUBKEY);
+   else if (!gnupg_pk_is_allowed (opt.compliance, PK_USE_VERIFICATION,
+                                  pk->pubkey_algo, pk->pkey,
+                                  nbits_from_pk (pk),
+                                  NULL))
+     {
+       /* Compliance failure.  */
+       log_error (_("key %s may not be used for signing in %s mode\n"),
+                  keystr_from_pk (pk),
+                  gnupg_compliance_option_string (opt.compliance));
+       rc = gpg_error (GPG_ERR_PUBKEY_ALGO);
+     }
+   else if (!pk->flags.valid)
+     {
+       /* You cannot have a good sig from an invalid key.  */
+       rc = gpg_error (GPG_ERR_BAD_PUBKEY);
+     }
+   else
+     {
+       if (r_expiredate)
+         *r_expiredate = pk->expiredate;
+       rc = check_signature_end (pk, sig, digest, r_expired, r_revoked, NULL);
+       /* Check the backsig.  This is a back signature (0x19) from
+        * the subkey on the primary key.  The idea here is that it
+        * should not be possible for someone to "steal" subkeys and
+        * claim them as their own.  The attacker couldn't actually
+        * use the subkey, but they could try and claim ownership of
+        * any signatures issued by it.  */
+       if (!rc && !pk->flags.primary && pk->flags.backsig < 2)
+         {
+           if (!pk->flags.backsig)
+             {
+               log_info (_("WARNING: signing subkey %s is not"
+                           " cross-certified\n"),keystr_from_pk(pk));
+               log_info (_("please see %s for more information\n"),
+                         "https://gnupg.org/faq/subkey-cross-certify.html");
+               /* The default option --require-cross-certification
+                * makes this warning an error.  */
+               if (opt.flags.require_cross_cert)
+                 rc = gpg_error (GPG_ERR_GENERAL);
+             }
+           else if(pk->flags.backsig == 1)
+             {
+               log_info (_("WARNING: signing subkey %s has an invalid"
+                           " cross-certification\n"), keystr_from_pk(pk));
+               rc = gpg_error (GPG_ERR_GENERAL);
+             }
+         }
+     }
  
 -  if (!rc && sig->sig_class < 2 && is_status_enabled ())
 -    {
 -      /* This signature id works best with DLP algorithms because
 -       * they use a random parameter for every signature.  Instead of
 -       * this sig-id we could have also used the hash of the document
 -       * and the timestamp, but the drawback of this is, that it is
 -       * not possible to sign more than one identical document within
 -       * one second.  Some remote batch processing applications might
 -       * like this feature here.
 -       *
 -       * Note that before 2.0.10, we used RIPE-MD160 for the hash
 -       * and accidentally didn't include the timestamp and algorithm
 -       * information in the hash.  Given that this feature is not
 -       * commonly used and that a replay attacks detection should
 -       * not solely be based on this feature (because it does not
 -       * work with RSA), we take the freedom and switch to SHA-1
 -       * with 2.0.10 to take advantage of hardware supported SHA-1
 -       * implementations.  We also include the missing information
 -       * in the hash.  Note also the SIG_ID as computed by gpg 1.x
 -       * and gpg 2.x didn't matched either because 2.x used to print
 -       * MPIs not in PGP format.  */
 -      u32 a = sig->timestamp;
 -      int nsig = pubkey_get_nsig (sig->pubkey_algo);
 -      unsigned char *p, *buffer;
 -      size_t n, nbytes;
 -      int i;
 -      char hashbuf[20];
 +    if( !rc && sig->sig_class < 2 && is_status_enabled() ) {
 +      /* This signature id works best with DLP algorithms because
 +       * they use a random parameter for every signature.  Instead of
 +       * this sig-id we could have also used the hash of the document
 +       * and the timestamp, but the drawback of this is, that it is
 +       * not possible to sign more than one identical document within
 +       * one second.  Some remote batch processing applications might
 +       * like this feature here.
 +         *
 +         * Note that before 2.0.10, we used RIPE-MD160 for the hash
 +         * and accidentally didn't include the timestamp and algorithm
 +         * information in the hash.  Given that this feature is not
 +         * commonly used and that a replay attacks detection should
 +         * not solely be based on this feature (because it does not
 +         * work with RSA), we take the freedom and switch to SHA-1
 +         * with 2.0.10 to take advantage of hardware supported SHA-1
 +         * implementations.  We also include the missing information
 +         * in the hash.  Note also the SIG_ID as computed by gpg 1.x
 +         * and gpg 2.x didn't matched either because 2.x used to print
 +         * MPIs not in PGP format.  */
 +      u32 a = sig->timestamp;
 +      int nsig = pubkey_get_nsig( sig->pubkey_algo );
 +      unsigned char *p, *buffer;
 +        size_t n, nbytes;
 +        int i;
 +        char hashbuf[20];  /* We use SHA-1 here.  */
  
-         nbytes = 6;
-       for (i=0; i < nsig; i++ )
-           {
-           if (gcry_mpi_print (GCRYMPI_FMT_USG, NULL, 0, &n, sig->data[i]))
-               BUG();
-             nbytes += n;
-           }
+       nbytes = 6;
+       for (i=0; i < nsig; i++ )
+         {
+           if (gcry_mpi_print (GCRYMPI_FMT_USG, NULL, 0, &n, sig->data[i]))
+             BUG();
+           nbytes += n;
+         }
  
-         /* Make buffer large enough to be later used as output buffer.  */
-         if (nbytes < 100)
-           nbytes = 100;
-         nbytes += 10;  /* Safety margin.  */
-         /* Fill and hash buffer.  */
-         buffer = p = xmalloc (nbytes);
-       *p++ = sig->pubkey_algo;
-       *p++ = sig->digest_algo;
-       *p++ = (a >> 24) & 0xff;
-       *p++ = (a >> 16) & 0xff;
-       *p++ = (a >>  8) & 0xff;
-       *p++ =  a & 0xff;
-         nbytes -= 6;
-       for (i=0; i < nsig; i++ )
-           {
-           if (gcry_mpi_print (GCRYMPI_FMT_PGP, p, nbytes, &n, sig->data[i]))
-               BUG();
-             p += n;
-             nbytes -= n;
-           }
-         gcry_md_hash_buffer (GCRY_MD_SHA1, hashbuf, buffer, p-buffer);
-       p = make_radix64_string (hashbuf, 20);
-       sprintf (buffer, "%s %s %lu",
-                p, strtimestamp (sig->timestamp), (ulong)sig->timestamp);
-       xfree (p);
-       write_status_text (STATUS_SIG_ID, buffer);
-       xfree (buffer);
+       /* Make buffer large enough to be later used as output buffer.  */
+       if (nbytes < 100)
+         nbytes = 100;
+       nbytes += 10;  /* Safety margin.  */
+       /* Fill and hash buffer.  */
+       buffer = p = xmalloc (nbytes);
+       *p++ = sig->pubkey_algo;
+       *p++ = sig->digest_algo;
+       *p++ = (a >> 24) & 0xff;
+       *p++ = (a >> 16) & 0xff;
+       *p++ = (a >>  8) & 0xff;
+       *p++ =  a & 0xff;
+       nbytes -= 6;
+       for (i=0; i < nsig; i++ )
+         {
+           if (gcry_mpi_print (GCRYMPI_FMT_PGP, p, nbytes, &n, sig->data[i]))
+             BUG();
+           p += n;
+           nbytes -= n;
+         }
+       gcry_md_hash_buffer (GCRY_MD_SHA1, hashbuf, buffer, p-buffer);
+       p = make_radix64_string (hashbuf, 20);
+       sprintf (buffer, "%s %s %lu",
+                p, strtimestamp (sig->timestamp), (ulong)sig->timestamp);
+       xfree (p);
+       write_status_text (STATUS_SIG_ID, buffer);
+       xfree (buffer);
      }
  
-     if (r_pk)
-       *r_pk = pk;
-     else
-       {
-       release_public_key_parts (pk);
-         xfree (pk);
-       }
+   if (r_pk)
+     *r_pk = pk;
+   else
+     {
+       release_public_key_parts (pk);
+       xfree (pk);
+     }
  
-     return rc;
+   return rc;
  }
  
  
@@@ -493,38 -521,34 +520,38 @@@ check_signature_end_simple (PKT_public_
          gcry_md_putc (digest, 0);
          n = 6;
        }
 -      /* Add some magic per Section 5.2.4 of RFC 4880.  */
 -      buf[0] = sig->version;
 -      buf[1] = 0xff;
 -      buf[2] = n >> 24;
 -      buf[3] = n >> 16;
 -      buf[4] = n >>  8;
 -      buf[5] = n;
 -      gcry_md_write( digest, buf, 6 );
 +      /* add some magic per Section 5.2.4 of RFC 4880.  */
 +      buf[0] = sig->version;
 +      buf[1] = 0xff;
 +      buf[2] = n >> 24;
 +      buf[3] = n >> 16;
 +      buf[4] = n >>  8;
 +      buf[5] = n;
 +      gcry_md_write( digest, buf, 6 );
      }
 -  gcry_md_final( digest );
 -
 -  /* Convert the digest to an MPI.  */
 -  result = encode_md_value (pk, digest, sig->digest_algo );
 -  if (!result)
 -    return GPG_ERR_GENERAL;
 -
 -  /* Verify the signature.  */
 -  rc = pk_verify (pk->pubkey_algo, result, sig->data, pk->pkey);
 -  gcry_mpi_release (result);
 +    gcry_md_final( digest );
 +
 +    /* Convert the digest to an MPI.  */
 +    result = encode_md_value (pk, digest, sig->digest_algo );
 +    if (!result)
 +        return GPG_ERR_GENERAL;
 +
 +    /* Verify the signature.  */
 +    if (DBG_CLOCK && sig->sig_class <= 0x01)
 +      log_clock ("enter pk_verify");
 +    rc = pk_verify( pk->pubkey_algo, result, sig->data, pk->pkey );
 +    if (DBG_CLOCK && sig->sig_class <= 0x01)
 +      log_clock ("leave pk_verify");
 +    gcry_mpi_release (result);
  
-     if( !rc && sig->flags.unknown_critical )
-       {
-       log_info(_("assuming bad signature from key %s"
-                  " due to an unknown critical bit\n"),keystr_from_pk(pk));
-       rc = GPG_ERR_BAD_SIGNATURE;
-       }
+   if (!rc && sig->flags.unknown_critical)
+     {
+       log_info(_("assuming bad signature from key %s"
+                  " due to an unknown critical bit\n"),keystr_from_pk(pk));
+       rc = GPG_ERR_BAD_SIGNATURE;
+     }
  
-     return rc;
+   return rc;
  }
  
  
Simple merge
diff --cc sm/gpgsm.c
Simple merge
Simple merge