gpg: default to AES-256.
[gnupg.git] / g10 / pkclist.c
index 6315a6d..67d932e 100644 (file)
@@ -15,7 +15,7 @@
  * 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 "gpg.h"
 #include "options.h"
 #include "packet.h"
-#include "status.h"
+#include "../common/status.h"
 #include "keydb.h"
-#include "util.h"
+#include "../common/util.h"
 #include "main.h"
 #include "trustdb.h"
-#include "ttyio.h"
-#include "status.h"
+#include "../common/ttyio.h"
+#include "../common/status.h"
 #include "photoid.h"
-#include "i18n.h"
+#include "../common/i18n.h"
 #include "tofu.h"
 
 #define CONTROL_D ('D' - 'A' + 1)
@@ -110,7 +110,7 @@ do_show_revocation_reason( PKT_signature *sig )
    subkeys, etc.)  Mode 1: use only the revocation on the main pk */
 
 void
-show_revocation_reason( PKT_public_key *pk, int mode )
+show_revocation_reason (ctrl_t ctrl, PKT_public_key *pk, int mode)
 {
     /* Hmmm, this is not so easy because we have to duplicate the code
      * used in the trustbd to calculate the keyflags.  We need to find
@@ -127,7 +127,7 @@ show_revocation_reason( PKT_public_key *pk, int mode )
 
     /* get the keyblock */
     fingerprint_from_pk( pk, fingerprint, &fingerlen );
-    rc = get_pubkey_byfprint(NULL, &keyblock, fingerprint, fingerlen);
+    rc = get_pubkey_byfprint (ctrl, NULL, &keyblock, fingerprint, fingerlen);
     if( rc ) { /* that should never happen */
        log_debug( "failed to get the keyblock\n");
        return;
@@ -160,7 +160,7 @@ show_revocation_reason( PKT_public_key *pk, int mode )
 
     /* We didn't find it, so check if the whole key is revoked */
     if(!node && !mode)
-      show_revocation_reason(pk,1);
+      show_revocation_reason (ctrl, pk, 1);
 
     release_kbnode( keyblock );
 }
@@ -188,7 +188,7 @@ do_edit_ownertrust (ctrl_t ctrl, PKT_public_key *pk, int mode,
   int show=0;
   int min_num;
   int did_help=defer_help;
-  unsigned int minimum = tdb_get_min_ownertrust (pk);
+  unsigned int minimum = tdb_get_min_ownertrust (ctrl, pk, 0);
 
   switch(minimum)
     {
@@ -222,25 +222,25 @@ do_edit_ownertrust (ctrl_t ctrl, PKT_public_key *pk, int mode,
             KBNODE keyblock, un;
 
             tty_printf (_("No trust value assigned to:\n"));
-            print_key_line (NULL, pk, 0);
+            print_key_line (ctrl, NULL, pk, 0);
 
-           p = get_user_id_native(keyid);
+           p = get_user_id_native (ctrl, keyid);
            tty_printf (_("      \"%s\"\n"),p);
            xfree (p);
 
-            keyblock = get_pubkeyblock (keyid);
+            keyblock = get_pubkeyblock (ctrl, keyid);
             if (!keyblock)
                 BUG ();
             for (un=keyblock; un; un = un->next)
              {
                 if (un->pkt->pkttype != PKT_USER_ID )
                  continue;
-                if (un->pkt->pkt.user_id->is_revoked )
+                if (un->pkt->pkt.user_id->flags.revoked)
                  continue;
-                if (un->pkt->pkt.user_id->is_expired )
+                if (un->pkt->pkt.user_id->flags.expired)
                  continue;
                /* Only skip textual primaries */
-                if (un->pkt->pkt.user_id->is_primary
+                if (un->pkt->pkt.user_id->flags.primary
                    && !un->pkt->pkt.user_id->attrib_data )
                  continue;
 
@@ -257,7 +257,7 @@ do_edit_ownertrust (ctrl_t ctrl, PKT_public_key *pk, int mode,
                tty_printf(_("  aka \"%s\"\n"),p);
              }
 
-            print_fingerprint (NULL, pk, 2);
+            print_fingerprint (ctrl, NULL, pk, 2);
             tty_printf("\n");
            release_kbnode (keyblock);
           }
@@ -391,8 +391,8 @@ edit_ownertrust (ctrl_t ctrl, PKT_public_key *pk, int mode )
           break;
         case 1: /* trust value set */
           trust &= ~TRUST_FLAG_DISABLED;
-          trust |= get_ownertrust (pk) & TRUST_FLAG_DISABLED;
-          update_ownertrust (pk, trust );
+          trust |= get_ownertrust (ctrl, pk) & TRUST_FLAG_DISABLED;
+          update_ownertrust (ctrl, pk, trust );
           return 1;
         default:
           return 0;
@@ -428,7 +428,7 @@ do_we_trust( PKT_public_key *pk, unsigned int trustlevel )
     default:
       log_error ("invalid trustlevel %u returned from validation layer\n",
                 trustlevel);
-      /* fall thru */
+      /* fall through */
     case TRUST_UNKNOWN:
     case TRUST_UNDEFINED:
       log_info(_("%s: There is no assurance this key belongs"
@@ -449,6 +449,13 @@ do_we_trust( PKT_public_key *pk, unsigned int trustlevel )
       if( opt.verbose )
        log_info(_("This key belongs to us\n"));
       return 1; /* yes */
+
+    case TRUST_NEVER:
+      /* This can be returned by TOFU, which can return negative
+         assertions.  */
+      log_info(_("%s: This key is bad!  It has been marked as untrusted!\n"),
+               keystr_from_pk(pk));
+      return 0; /* no */
     }
 
   return 1; /*NOTREACHED*/
@@ -460,7 +467,7 @@ do_we_trust( PKT_public_key *pk, unsigned int trustlevel )
  * key anyway.
  */
 static int
-do_we_trust_pre( PKT_public_key *pk, unsigned int trustlevel )
+do_we_trust_pre (ctrl_t ctrl, PKT_public_key *pk, unsigned int trustlevel )
 {
   int rc;
 
@@ -468,14 +475,20 @@ do_we_trust_pre( PKT_public_key *pk, unsigned int trustlevel )
 
   if( !opt.batch && !rc )
     {
-      print_pubkey_info(NULL,pk);
-      print_fingerprint (NULL, pk, 2);
+      print_pubkey_info (ctrl, NULL,pk);
+      print_fingerprint (ctrl, NULL, pk, 2);
       tty_printf("\n");
 
-      tty_printf(
-              _("It is NOT certain that the key belongs to the person named\n"
-                "in the user ID.  If you *really* know what you are doing,\n"
-                "you may answer the next question with yes.\n"));
+      if ((trustlevel & TRUST_MASK) == TRUST_NEVER)
+        tty_printf(
+          _("This key is bad!  It has been marked as untrusted!  If you\n"
+            "*really* know what you are doing, you may answer the next\n"
+            "question with yes.\n"));
+      else
+        tty_printf(
+          _("It is NOT certain that the key belongs to the person named\n"
+            "in the user ID.  If you *really* know what you are doing,\n"
+            "you may answer the next question with yes.\n"));
 
       tty_printf("\n");
 
@@ -486,7 +499,7 @@ do_we_trust_pre( PKT_public_key *pk, unsigned int trustlevel )
           char *hint_str;
 
           keyid_from_pk (pk, kid);
-          hint_str = get_long_user_id_string ( kid );
+          hint_str = get_long_user_id_string (ctrl, kid);
           write_status_text ( STATUS_USERID_HINT, hint_str );
           xfree (hint_str);
         }
@@ -508,6 +521,9 @@ do_we_trust_pre( PKT_public_key *pk, unsigned int trustlevel )
 static void
 write_trust_status (int statuscode, int trustlevel)
 {
+#ifdef NO_TRUST_MODELS
+  write_status (statuscode);
+#else /* NO_TRUST_MODELS */
   int tm;
 
   /* For the combined tofu+pgp method, we return the trust model which
@@ -517,6 +533,7 @@ write_trust_status (int statuscode, int trustlevel)
   else
     tm = opt.trust_model;
   write_status_strings (statuscode, "0 ", trust_model_string (tm), NULL);
+#endif /* NO_TRUST_MODELS */
 }
 
 
@@ -531,7 +548,7 @@ check_signatures_trust (ctrl_t ctrl, PKT_signature *sig)
   unsigned int trustlevel = TRUST_UNKNOWN;
   int rc=0;
 
-  rc = get_pubkey( pk, sig->keyid );
+  rc = get_pubkey (ctrl, pk, sig->keyid );
   if (rc)
     { /* this should not happen */
       log_error("Ooops; the key vanished  - can't check the trust\n");
@@ -544,7 +561,7 @@ check_signatures_trust (ctrl_t ctrl, PKT_signature *sig)
       if( !opt.quiet )
         log_info(_("WARNING: Using untrusted key!\n"));
       if (opt.with_fingerprint)
-        print_fingerprint (NULL, pk, 1);
+        print_fingerprint (ctrl, NULL, pk, 1);
       goto leave;
     }
 
@@ -552,7 +569,7 @@ check_signatures_trust (ctrl_t ctrl, PKT_signature *sig)
     log_info(_("WARNING: this key might be revoked (revocation key"
               " not present)\n"));
 
-  trustlevel = get_validity (ctrl, pk, NULL, sig, 1);
+  trustlevel = get_validity (ctrl, NULL, pk, NULL, sig, 1);
 
   if ( (trustlevel & TRUST_FLAG_REVOKED) )
     {
@@ -563,13 +580,13 @@ check_signatures_trust (ctrl_t ctrl, PKT_signature *sig)
       else
        log_info(_("WARNING: This key has been revoked by its owner!\n"));
       log_info(_("         This could mean that the signature is forged.\n"));
-      show_revocation_reason( pk, 0 );
+      show_revocation_reason (ctrl, pk, 0);
     }
   else if ((trustlevel & TRUST_FLAG_SUB_REVOKED) )
     {
       write_status( STATUS_KEYREVOKED );
       log_info(_("WARNING: This subkey has been revoked by its owner!\n"));
-      show_revocation_reason( pk, 0 );
+      show_revocation_reason (ctrl, pk, 0);
     }
 
   if ((trustlevel & TRUST_FLAG_DISABLED))
@@ -585,7 +602,7 @@ check_signatures_trust (ctrl_t ctrl, PKT_signature *sig)
 
 
       primary_pk = xmalloc_clear (sizeof *primary_pk);
-      get_pubkey (primary_pk, pk->main_keyid);
+      get_pubkey (ctrl, primary_pk, pk->main_keyid);
       fingerprint_from_pk (primary_pk, fpr, &fprlen);
       free_public_key (primary_pk);
 
@@ -615,7 +632,7 @@ check_signatures_trust (ctrl_t ctrl, PKT_signature *sig)
               log_info (_("trustlevel adjusted to FULL"
                           " due to valid PKA info\n"));
             }
-          /* (fall through) */
+          /* fall through */
         case TRUST_FULLY:
           if (!okay)
             {
@@ -632,13 +649,13 @@ check_signatures_trust (ctrl_t ctrl, PKT_signature *sig)
     {
     case TRUST_EXPIRED:
       log_info(_("Note: This key has expired!\n"));
-      print_fingerprint (NULL, pk, 1);
+      print_fingerprint (ctrl, NULL, pk, 1);
       break;
 
     default:
       log_error ("invalid trustlevel %u returned from validation layer\n",
                  trustlevel);
-      /* fall thru */
+      /* fall through */
     case TRUST_UNKNOWN:
     case TRUST_UNDEFINED:
       write_trust_status (STATUS_TRUST_UNDEFINED, trustlevel);
@@ -646,16 +663,17 @@ check_signatures_trust (ctrl_t ctrl, PKT_signature *sig)
                  " a trusted signature!\n"));
       log_info(_("         There is no indication that the "
                  "signature belongs to the owner.\n" ));
-      print_fingerprint (NULL, pk, 1);
+      print_fingerprint (ctrl, NULL, pk, 1);
       break;
 
     case TRUST_NEVER:
-      /* currently we won't get that status */
+      /* This level can be returned by TOFU, which supports negative
+       * assertions.  */
       write_trust_status (STATUS_TRUST_NEVER, trustlevel);
       log_info(_("WARNING: We do NOT trust this key!\n"));
       log_info(_("         The signature is probably a FORGERY.\n"));
       if (opt.with_fingerprint)
-        print_fingerprint (NULL, pk, 1);
+        print_fingerprint (ctrl, NULL, pk, 1);
       rc = gpg_error (GPG_ERR_BAD_SIGNATURE);
       break;
 
@@ -665,19 +683,19 @@ check_signatures_trust (ctrl_t ctrl, PKT_signature *sig)
                  " sufficiently trusted signatures!\n"));
       log_info(_("         It is not certain that the"
                  " signature belongs to the owner.\n" ));
-      print_fingerprint (NULL, pk, 1);
+      print_fingerprint (ctrl, NULL, pk, 1);
       break;
 
     case TRUST_FULLY:
       write_trust_status (STATUS_TRUST_FULLY, trustlevel);
       if (opt.with_fingerprint)
-        print_fingerprint (NULL, pk, 1);
+        print_fingerprint (ctrl, NULL, pk, 1);
       break;
 
     case TRUST_ULTIMATE:
       write_trust_status (STATUS_TRUST_ULTIMATE, trustlevel);
       if (opt.with_fingerprint)
-        print_fingerprint (NULL, pk, 1);
+        print_fingerprint (ctrl, NULL, pk, 1);
       break;
     }
 
@@ -800,7 +818,7 @@ expand_group (strlist_t input)
  * success the new key is added to PK_LIST_ADDR.  NAME is the user id
  * of the key.  USE the requested usage and a set MARK_HIDDEN will
  * mark the key in the updated list as a hidden recipient.  If
- * FROM_FILE is true, NAME is is not a user ID but the name of a file
+ * FROM_FILE is true, NAME is not a user ID but the name of a file
  * holding a key. */
 gpg_error_t
 find_and_check_key (ctrl_t ctrl, const char *name, unsigned int use,
@@ -820,7 +838,7 @@ find_and_check_key (ctrl_t ctrl, const char *name, unsigned int use,
   if (from_file)
     rc = get_pubkey_fromfile (ctrl, pk, name);
   else
-    rc = get_pubkey_byname (ctrl, NULL, pk, name, NULL, NULL, 0, 0);
+    rc = get_best_pubkey_byname (ctrl, NULL, pk, name, NULL, 0, 0);
   if (rc)
     {
       int code;
@@ -854,7 +872,7 @@ find_and_check_key (ctrl_t ctrl, const char *name, unsigned int use,
     {
       int trustlevel;
 
-      trustlevel = get_validity (ctrl, pk, pk->user_id, NULL, 1);
+      trustlevel = get_validity (ctrl, NULL, pk, pk->user_id, NULL, 1);
       if ( (trustlevel & TRUST_FLAG_DISABLED) )
         {
           /* Key has been disabled. */
@@ -864,7 +882,7 @@ find_and_check_key (ctrl_t ctrl, const char *name, unsigned int use,
           return GPG_ERR_UNUSABLE_PUBKEY;
         }
 
-      if ( !do_we_trust_pre (pk, trustlevel) )
+      if ( !do_we_trust_pre (ctrl, pk, trustlevel) )
         {
           /* We don't trust this key.  */
           send_status_inv_recp (10, name);
@@ -1008,9 +1026,9 @@ build_pk_list (ctrl_t ctrl, strlist_t rcpts, PK_LIST *ret_pk_list)
              issue a warning and switch into GnuPG mode. */
           if ((rov->flags & PK_LIST_HIDDEN) && (PGP6 || PGP7 || PGP8))
             {
-              log_info(_("you may not use %s while in %s mode\n"),
+              log_info(_("option '%s' may not be used in %s mode\n"),
                        "--hidden-recipient",
-                       compliance_option_string());
+                       gnupg_compliance_option_string (opt.compliance));
 
               compliance_failure();
             }
@@ -1059,9 +1077,9 @@ build_pk_list (ctrl_t ctrl, strlist_t rcpts, PK_LIST *ret_pk_list)
                      GnuPG mode. */
                   if ((r->flags&PK_LIST_ENCRYPT_TO) && (PGP6 || PGP7 || PGP8))
                     {
-                      log_info(_("you may not use %s while in %s mode\n"),
+                      log_info(_("option '%s' may not be used in %s mode\n"),
                                "--hidden-encrypt-to",
-                               compliance_option_string());
+                               gnupg_compliance_option_string (opt.compliance));
 
                       compliance_failure();
                     }
@@ -1133,8 +1151,8 @@ build_pk_list (ctrl_t ctrl, strlist_t rcpts, PK_LIST *ret_pk_list)
                   else
                     {
                       size_t n;
-                      char *p = get_user_id( keyid, &n );
-                      tty_print_utf8_string( p, n );
+                      char *p = get_user_id (ctrl, keyid, &n );
+                      tty_print_utf8_string ( p, n );
                       xfree(p);
                     }
                   tty_printf("\"\n");
@@ -1194,12 +1212,13 @@ build_pk_list (ctrl_t ctrl, strlist_t rcpts, PK_LIST *ret_pk_list)
                 { /* Check validity of this key. */
                   int trustlevel;
 
-                  trustlevel = get_validity (ctrl, pk, pk->user_id, NULL, 1);
+                  trustlevel =
+                    get_validity (ctrl, NULL, pk, pk->user_id, NULL, 1);
                   if ( (trustlevel & TRUST_FLAG_DISABLED) )
                     {
                       tty_printf (_("Public key is disabled.\n") );
                     }
-                  else if ( do_we_trust_pre (pk, trustlevel) )
+                  else if ( do_we_trust_pre (ctrl, pk, trustlevel) )
                     {
                       /* Skip the actual key if the key is already
                        * present in the list */
@@ -1296,6 +1315,29 @@ build_pk_list (ctrl_t ctrl, strlist_t rcpts, PK_LIST *ret_pk_list)
       rc = GPG_ERR_NO_USER_ID;
     }
 
+#ifdef USE_TOFU
+  if (! rc && (opt.trust_model == TM_TOFU_PGP || opt.trust_model == TM_TOFU))
+    {
+      PK_LIST iter;
+      for (iter = pk_list; iter; iter = iter->next)
+        {
+          int rc2;
+
+          /* Note: we already resolved any conflict when looking up
+             the key.  Don't annoy the user again if she selected
+             accept once.  */
+          rc2 = tofu_register_encryption (ctrl, iter->pk, NULL, 0);
+          if (rc2)
+            log_info ("WARNING: Failed to register encryption to %s"
+                      " with TOFU engine\n",
+                      keystr (pk_main_keyid (iter->pk)));
+          else if (DBG_TRUST)
+            log_debug ("Registered encryption to %s with TOFU DB.\n",
+                      keystr (pk_main_keyid (iter->pk)));
+        }
+    }
+#endif /*USE_TOFU*/
+
  fail:
 
   if ( rc )