gpg: Add list-option "show-usage".
[gnupg.git] / g10 / keyedit.c
index f9dfe7a..77bd37f 100644 (file)
@@ -1,6 +1,7 @@
 /* keyedit.c - keyedit stuff
  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
  *               2008, 2009, 2010 Free Software Foundation, Inc.
 /* keyedit.c - keyedit stuff
  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
  *               2008, 2009, 2010 Free Software Foundation, Inc.
+ * Copyright (C) 2013, 2014 Werner Koch
  *
  * This file is part of GnuPG.
  *
  *
  * This file is part of GnuPG.
  *
@@ -30,6 +31,7 @@
 # include <readline/readline.h>
 #endif
 
 # include <readline/readline.h>
 #endif
 
+#define JNLIB_NEED_LOG_LOGV
 #include "gpg.h"
 #include "options.h"
 #include "packet.h"
 #include "gpg.h"
 #include "options.h"
 #include "packet.h"
 
 static void show_prefs (PKT_user_id * uid, PKT_signature * selfsig,
                        int verbose);
 
 static void show_prefs (PKT_user_id * uid, PKT_signature * selfsig,
                        int verbose);
-static void show_names (KBNODE keyblock, PKT_public_key * pk,
+static void show_names (estream_t fp, KBNODE keyblock, PKT_public_key * pk,
                        unsigned int flag, int with_prefs);
                        unsigned int flag, int with_prefs);
-static void show_key_with_all_names (KBNODE keyblock, int only_marked,
+static void show_key_with_all_names (estream_t fp,
+                                     KBNODE keyblock, int only_marked,
                                     int with_revoker, int with_fpr,
                                     int with_revoker, int with_fpr,
-                                    int with_subkeys, int with_prefs);
+                                    int with_subkeys, int with_prefs,
+                                     int nowarn);
 static void show_key_and_fingerprint (KBNODE keyblock);
 static int menu_adduid (KBNODE keyblock, int photo, const char *photo_name);
 static void menu_deluid (KBNODE pub_keyblock);
 static int menu_delsig (KBNODE pub_keyblock);
 static int menu_clean (KBNODE keyblock, int self_only);
 static void menu_delkey (KBNODE pub_keyblock);
 static void show_key_and_fingerprint (KBNODE keyblock);
 static int menu_adduid (KBNODE keyblock, int photo, const char *photo_name);
 static void menu_deluid (KBNODE pub_keyblock);
 static int menu_delsig (KBNODE pub_keyblock);
 static int menu_clean (KBNODE keyblock, int self_only);
 static void menu_delkey (KBNODE pub_keyblock);
-static int menu_addrevoker (KBNODE pub_keyblock, int sensitive);
+static int menu_addrevoker (ctrl_t ctrl, kbnode_t pub_keyblock, int sensitive);
 static int menu_expire (KBNODE pub_keyblock);
 static int menu_backsign (KBNODE pub_keyblock);
 static int menu_set_primary_uid (KBNODE pub_keyblock);
 static int menu_expire (KBNODE pub_keyblock);
 static int menu_backsign (KBNODE pub_keyblock);
 static int menu_set_primary_uid (KBNODE pub_keyblock);
@@ -80,7 +84,9 @@ static int menu_revsig (KBNODE keyblock);
 static int menu_revuid (KBNODE keyblock);
 static int menu_revkey (KBNODE pub_keyblock);
 static int menu_revsubkey (KBNODE pub_keyblock);
 static int menu_revuid (KBNODE keyblock);
 static int menu_revkey (KBNODE pub_keyblock);
 static int menu_revsubkey (KBNODE pub_keyblock);
+#ifndef NO_TRUST_MODELS
 static int enable_disable_key (KBNODE keyblock, int disable);
 static int enable_disable_key (KBNODE keyblock, int disable);
+#endif /*!NO_TRUST_MODELS*/
 static void menu_showphoto (KBNODE keyblock);
 
 static int update_trust = 0;
 static void menu_showphoto (KBNODE keyblock);
 
 static int update_trust = 0;
@@ -107,35 +113,6 @@ struct sign_attrib
 };
 
 
 };
 
 
-#ifdef ENABLE_CARD_SUPPORT
-/* Given a node SEC_NODE with a secret key or subkey, locate the
-   corresponding public key from pub_keyblock. */
-static PKT_public_key *
-find_pk_from_sknode (KBNODE pub_keyblock, KBNODE sec_node)
-{
-  KBNODE node = pub_keyblock;
-  PKT_secret_key *sk;
-  PKT_public_key *pk;
-
-#warning:  This is not anymore needed.
-  if (sec_node->pkt->pkttype == PKT_SECRET_KEY
-      && node->pkt->pkttype == PKT_PUBLIC_KEY)
-    return node->pkt->pkt.public_key;
-  if (sec_node->pkt->pkttype != PKT_SECRET_SUBKEY)
-    return NULL;
-  sk = sec_node->pkt->pkt.secret_key;
-  for (; node; node = node->next)
-    if (node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
-      {
-       pk = node->pkt->pkt.public_key;
-       if (pk->keyid[0] == sk->keyid[0] && pk->keyid[1] == sk->keyid[1])
-         return pk;
-      }
-
-  return NULL;
-}
-#endif /* ENABLE_CARD_SUPPORT */
-
 
 /* TODO: Fix duplicated code between here and the check-sigs/list-sigs
    code in keylist.c. */
 
 /* TODO: Fix duplicated code between here and the check-sigs/list-sigs
    code in keylist.c. */
@@ -278,7 +255,7 @@ print_and_check_one_sig (KBNODE keyblock, KBNODE node,
        {
          size_t n;
          char *p = get_user_id (sig->keyid, &n);
        {
          size_t n;
          char *p = get_user_id (sig->keyid, &n);
-         tty_print_utf8_string2 (p, n,
+         tty_print_utf8_string2 (NULL, p, n,
                                  opt.screen_columns - keystrlen () - 26 -
                                  ((opt.
                                    list_options & LIST_SHOW_SIG_EXPIRE) ? 11
                                  opt.screen_columns - keystrlen () - 26 -
                                  ((opt.
                                    list_options & LIST_SHOW_SIG_EXPIRE) ? 11
@@ -523,13 +500,16 @@ trustsig_prompt (byte * trust_value, byte * trust_depth, char **regexp)
 
 
 /*
 
 
 /*
- * Loop over all LOCUSR and and sign the uids after asking.
- * If no user id is marked, all user ids will be signed;
- * if some user_ids are marked those will be signed.
+ * Loop over all LOCUSR and and sign the uids after asking.  If no
+ * user id is marked, all user ids will be signed; if some user_ids
+ * are marked only those will be signed.  If QUICK is true the
+ * function won't ask the user and use sensible defaults.
  */
 static int
  */
 static int
-sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
-          int local, int nonrevocable, int trust, int interactive)
+sign_uids (estream_t fp,
+           kbnode_t keyblock, strlist_t locusr, int *ret_modified,
+          int local, int nonrevocable, int trust, int interactive,
+           int quick)
 {
   int rc = 0;
   SK_LIST sk_list = NULL;
 {
   int rc = 0;
   SK_LIST sk_list = NULL;
@@ -542,22 +522,24 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
 
   /* Are there any non-v3 sigs on this key already? */
   if (PGP2)
 
   /* Are there any non-v3 sigs on this key already? */
   if (PGP2)
-    for (node = keyblock; node; node = node->next)
-      if (node->pkt->pkttype == PKT_SIGNATURE &&
-         node->pkt->pkt.signature->version > 3)
-       {
-         all_v3 = 0;
-         break;
-       }
+    {
+      for (node = keyblock; node; node = node->next)
+        if (node->pkt->pkttype == PKT_SIGNATURE &&
+            node->pkt->pkt.signature->version > 3)
+          {
+            all_v3 = 0;
+            break;
+          }
+    }
 
   /* Build a list of all signators.
 
   /* Build a list of all signators.
-   *    
+   *
    * We use the CERT flag to request the primary which must always
    * be one which is capable of signing keys.  I can't see a reason
    * why to sign keys using a subkey.  Implementation of USAGE_CERT
    * is just a hack in getkey.c and does not mean that a subkey
    * marked as certification capable will be used. */
    * We use the CERT flag to request the primary which must always
    * be one which is capable of signing keys.  I can't see a reason
    * why to sign keys using a subkey.  Implementation of USAGE_CERT
    * is just a hack in getkey.c and does not mean that a subkey
    * marked as certification capable will be used. */
-  rc = build_sk_list (locusr, &sk_list, 0, PUBKEY_USAGE_CERT);
+  rc = build_sk_list (locusr, &sk_list, PUBKEY_USAGE_CERT);
   if (rc)
     goto leave;
 
   if (rc)
     goto leave;
 
@@ -570,7 +552,7 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
       u32 duration = 0, timestamp = 0;
       byte trust_depth = 0, trust_value = 0;
 
       u32 duration = 0, timestamp = 0;
       byte trust_depth = 0, trust_value = 0;
 
-      if (local || nonrevocable || trust 
+      if (local || nonrevocable || trust
           || opt.cert_policy_url || opt.cert_notations)
        force_v4 = 1;
 
           || opt.cert_policy_url || opt.cert_notations)
        force_v4 = 1;
 
@@ -619,13 +601,13 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
 
                  if (uidnode->pkt->pkt.user_id->is_revoked)
                    {
 
                  if (uidnode->pkt->pkt.user_id->is_revoked)
                    {
-                     tty_printf (_("User ID \"%s\" is revoked."), user);
+                     tty_fprintf (fp, _("User ID \"%s\" is revoked."), user);
 
                      if (selfsig)
 
                      if (selfsig)
-                       tty_printf ("\n");
-                     else if (opt.expert)
+                       tty_fprintf (fp, "\n");
+                     else if (opt.expert && !quick)
                        {
                        {
-                         tty_printf ("\n");
+                         tty_fprintf (fp, "\n");
                          /* No, so remove the mark and continue */
                          if (!cpr_get_answer_is_yes ("sign_uid.revoke_okay",
                                                      _("Are you sure you "
                          /* No, so remove the mark and continue */
                          if (!cpr_get_answer_is_yes ("sign_uid.revoke_okay",
                                                      _("Are you sure you "
@@ -642,18 +624,18 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
                        {
                          uidnode->flag &= ~NODFLG_MARK_A;
                          uidnode = NULL;
                        {
                          uidnode->flag &= ~NODFLG_MARK_A;
                          uidnode = NULL;
-                         tty_printf (_("  Unable to sign.\n"));
+                         tty_fprintf (fp, _("  Unable to sign.\n"));
                        }
                    }
                  else if (uidnode->pkt->pkt.user_id->is_expired)
                    {
                        }
                    }
                  else if (uidnode->pkt->pkt.user_id->is_expired)
                    {
-                     tty_printf (_("User ID \"%s\" is expired."), user);
+                     tty_fprintf (fp, _("User ID \"%s\" is expired."), user);
 
                      if (selfsig)
 
                      if (selfsig)
-                       tty_printf ("\n");
-                     else if (opt.expert)
+                       tty_fprintf (fp, "\n");
+                     else if (opt.expert && !quick)
                        {
                        {
-                         tty_printf ("\n");
+                         tty_fprintf (fp, "\n");
                          /* No, so remove the mark and continue */
                          if (!cpr_get_answer_is_yes ("sign_uid.expire_okay",
                                                      _("Are you sure you "
                          /* No, so remove the mark and continue */
                          if (!cpr_get_answer_is_yes ("sign_uid.expire_okay",
                                                      _("Are you sure you "
@@ -670,17 +652,17 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
                        {
                          uidnode->flag &= ~NODFLG_MARK_A;
                          uidnode = NULL;
                        {
                          uidnode->flag &= ~NODFLG_MARK_A;
                          uidnode = NULL;
-                         tty_printf (_("  Unable to sign.\n"));
+                         tty_fprintf (fp, _("  Unable to sign.\n"));
                        }
                    }
                  else if (!uidnode->pkt->pkt.user_id->created && !selfsig)
                    {
                        }
                    }
                  else if (!uidnode->pkt->pkt.user_id->created && !selfsig)
                    {
-                     tty_printf (_("User ID \"%s\" is not self-signed."),
-                                 user);
+                     tty_fprintf (fp, _("User ID \"%s\" is not self-signed."),
+                                   user);
 
 
-                     if (opt.expert)
+                     if (opt.expert && !quick)
                        {
                        {
-                         tty_printf ("\n");
+                         tty_fprintf (fp, "\n");
                          /* No, so remove the mark and continue */
                          if (!cpr_get_answer_is_yes ("sign_uid.nosig_okay",
                                                      _("Are you sure you "
                          /* No, so remove the mark and continue */
                          if (!cpr_get_answer_is_yes ("sign_uid.nosig_okay",
                                                      _("Are you sure you "
@@ -697,13 +679,14 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
                        {
                          uidnode->flag &= ~NODFLG_MARK_A;
                          uidnode = NULL;
                        {
                          uidnode->flag &= ~NODFLG_MARK_A;
                          uidnode = NULL;
-                         tty_printf (_("  Unable to sign.\n"));
+                         tty_fprintf (fp, _("  Unable to sign.\n"));
                        }
                    }
 
                        }
                    }
 
-                 if (uidnode && interactive && !yesreally)
+                 if (uidnode && interactive && !yesreally && !quick)
                    {
                    {
-                     tty_printf (_("User ID \"%s\" is signable.  "), user);
+                     tty_fprintf (fp,
+                                   _("User ID \"%s\" is signable.  "), user);
                      if (!cpr_get_answer_is_yes ("sign_uid.sign_okay",
                                                  _("Sign it? (y/N) ")))
                        {
                      if (!cpr_get_answer_is_yes ("sign_uid.sign_okay",
                                                  _("Sign it? (y/N) ")))
                        {
@@ -728,10 +711,12 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
                                          uidnode->pkt->pkt.user_id->len, 0);
 
                  /* It's a v3 self-sig.  Make it into a v4 self-sig? */
                                          uidnode->pkt->pkt.user_id->len, 0);
 
                  /* It's a v3 self-sig.  Make it into a v4 self-sig? */
-                 if (node->pkt->pkt.signature->version < 4 && selfsig)
+                 if (node->pkt->pkt.signature->version < 4
+                      && selfsig && !quick)
                    {
                    {
-                     tty_printf (_("The self-signature on \"%s\"\n"
-                                   "is a PGP 2.x-style signature.\n"), user);
+                     tty_fprintf (fp,
+                                   _("The self-signature on \"%s\"\n"
+                                     "is a PGP 2.x-style signature.\n"), user);
 
                      /* Note that the regular PGP2 warning below
                         still applies if there are no v4 sigs on
 
                      /* Note that the regular PGP2 warning below
                         still applies if there are no v4 sigs on
@@ -753,10 +738,10 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
                  /* Is the current signature expired? */
                  if (node->pkt->pkt.signature->flags.expired)
                    {
                  /* Is the current signature expired? */
                  if (node->pkt->pkt.signature->flags.expired)
                    {
-                     tty_printf (_("Your current signature on \"%s\"\n"
-                                   "has expired.\n"), user);
+                     tty_fprintf (fp, _("Your current signature on \"%s\"\n"
+                                         "has expired.\n"), user);
 
 
-                     if (cpr_get_answer_is_yes
+                     if (quick || cpr_get_answer_is_yes
                          ("sign_uid.replace_expired_okay",
                           _("Do you want to issue a "
                             "new signature to replace "
                          ("sign_uid.replace_expired_okay",
                           _("Do you want to issue a "
                             "new signature to replace "
@@ -779,10 +764,10 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
                    {
                      /* It's a local sig, and we want to make a
                         exportable sig. */
                    {
                      /* It's a local sig, and we want to make a
                         exportable sig. */
-                     tty_printf (_("Your current signature on \"%s\"\n"
-                                   "is a local signature.\n"), user);
+                     tty_fprintf (fp, _("Your current signature on \"%s\"\n"
+                                         "is a local signature.\n"), user);
 
 
-                     if (cpr_get_answer_is_yes
+                     if (quick || cpr_get_answer_is_yes
                          ("sign_uid.local_promote_okay",
                           _("Do you want to promote "
                             "it to a full exportable " "signature? (y/N) ")))
                          ("sign_uid.local_promote_okay",
                           _("Do you want to promote "
                             "it to a full exportable " "signature? (y/N) ")))
@@ -803,14 +788,15 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
                  /* Fixme: see whether there is a revocation in which
                   * case we should allow to sign it again. */
                  if (!node->pkt->pkt.signature->flags.exportable && local)
                  /* Fixme: see whether there is a revocation in which
                   * case we should allow to sign it again. */
                  if (!node->pkt->pkt.signature->flags.exportable && local)
-                   tty_printf
-                      (_("\"%s\" was already locally signed by key %s\n"),
+                   tty_fprintf ( fp,
+                       _("\"%s\" was already locally signed by key %s\n"),
                        user, keystr_from_pk (pk));
                  else
                        user, keystr_from_pk (pk));
                  else
-                   tty_printf (_("\"%s\" was already signed by key %s\n"),
+                   tty_fprintf (fp,
+                                _("\"%s\" was already signed by key %s\n"),
                                user, keystr_from_pk (pk));
 
                                user, keystr_from_pk (pk));
 
-                 if (opt.expert
+                 if (opt.expert && !quick
                      && cpr_get_answer_is_yes ("sign_uid.dupe_okay",
                                                _("Do you want to sign it "
                                                  "again anyway? (y/N) ")))
                      && cpr_get_answer_is_yes ("sign_uid.dupe_okay",
                                                _("Do you want to sign it "
                                                  "again anyway? (y/N) ")))
@@ -834,15 +820,15 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
       /* Check whether any uids are left for signing.  */
       if (!count_uids_with_flag (keyblock, NODFLG_MARK_A))
        {
       /* Check whether any uids are left for signing.  */
       if (!count_uids_with_flag (keyblock, NODFLG_MARK_A))
        {
-         tty_printf (_("Nothing to sign with key %s\n"),
+         tty_fprintf (fp, _("Nothing to sign with key %s\n"),
                      keystr_from_pk (pk));
          continue;
        }
 
       /* Ask whether we really should sign these user id(s). */
                      keystr_from_pk (pk));
          continue;
        }
 
       /* Ask whether we really should sign these user id(s). */
-      tty_printf ("\n");
-      show_key_with_all_names (keyblock, 1, 0, 1, 0, 0);
-      tty_printf ("\n");
+      tty_fprintf (fp, "\n");
+      show_key_with_all_names (fp, keyblock, 1, 0, 1, 0, 0, 0);
+      tty_fprintf (fp, "\n");
 
       if (primary_pk->expiredate && !selfsig)
        {
 
       if (primary_pk->expiredate && !selfsig)
        {
@@ -850,11 +836,11 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
 
          if (primary_pk->expiredate <= now)
            {
 
          if (primary_pk->expiredate <= now)
            {
-             tty_printf (_("This key has expired!"));
+             tty_fprintf (fp, _("This key has expired!"));
 
 
-             if (opt.expert)
+             if (opt.expert && !quick)
                {
                {
-                 tty_printf ("  ");
+                 tty_fprintf (fp, "  ");
                  if (!cpr_get_answer_is_yes ("sign_uid.expired_okay",
                                              _("Are you sure you still "
                                                "want to sign it? (y/N) ")))
                  if (!cpr_get_answer_is_yes ("sign_uid.expired_okay",
                                              _("Are you sure you still "
                                                "want to sign it? (y/N) ")))
@@ -862,16 +848,16 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
                }
              else
                {
                }
              else
                {
-                 tty_printf (_("  Unable to sign.\n"));
+                 tty_fprintf (fp, _("  Unable to sign.\n"));
                  continue;
                }
            }
          else
            {
                  continue;
                }
            }
          else
            {
-             tty_printf (_("This key is due to expire on %s.\n"),
-                         expirestr_from_pk (primary_pk));
+             tty_fprintf (fp, _("This key is due to expire on %s.\n"),
+                           expirestr_from_pk (primary_pk));
 
 
-             if (opt.ask_cert_expire)
+             if (opt.ask_cert_expire && !quick)
                {
                  char *answer = cpr_get ("sign_uid.expire",
                                          _("Do you want your signature to "
                {
                  char *answer = cpr_get ("sign_uid.expire",
                                          _("Do you want your signature to "
@@ -899,7 +885,7 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
          the expiration of the pk */
       if (!duration && !selfsig)
        {
          the expiration of the pk */
       if (!duration && !selfsig)
        {
-         if (opt.ask_cert_expire)
+         if (opt.ask_cert_expire && !quick)
            duration = ask_expire_interval (1, opt.def_cert_expire);
          else
            duration = parse_expire_string (opt.def_cert_expire);
            duration = ask_expire_interval (1, opt.def_cert_expire);
          else
            duration = parse_expire_string (opt.def_cert_expire);
@@ -914,11 +900,11 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
       if (PGP2 && all_v3 &&
          (pk->version > 3 || force_v4) && primary_pk->version <= 3)
        {
       if (PGP2 && all_v3 &&
          (pk->version > 3 || force_v4) && primary_pk->version <= 3)
        {
-         tty_printf (_("You may not make an OpenPGP signature on a "
-                       "PGP 2.x key while in --pgp2 mode.\n"));
-         tty_printf (_("This would make the key unusable in PGP 2.x.\n"));
+         tty_fprintf (fp, _("You may not make an OpenPGP signature on a "
+                             "PGP 2.x key while in --pgp2 mode.\n"));
+         tty_fprintf (fp, _("This would make the key unusable in PGP 2.x.\n"));
 
 
-         if (opt.expert)
+         if (opt.expert && !quick)
            {
              if (!cpr_get_answer_is_yes ("sign_uid.v4_on_v3_okay",
                                          _("Are you sure you still "
            {
              if (!cpr_get_answer_is_yes ("sign_uid.v4_on_v3_okay",
                                          _("Are you sure you still "
@@ -935,32 +921,34 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
        ;
       else
        {
        ;
       else
        {
-         if (opt.batch || !opt.ask_cert_level)
+         if (opt.batch || !opt.ask_cert_level || quick)
            class = 0x10 + opt.def_cert_level;
          else
            {
              char *answer;
 
            class = 0x10 + opt.def_cert_level;
          else
            {
              char *answer;
 
-             tty_printf (_("How carefully have you verified the key you are "
+             tty_fprintf (fp,
+                           _("How carefully have you verified the key you are "
                            "about to sign actually belongs\nto the person "
                            "named above?  If you don't know what to "
                            "answer, enter \"0\".\n"));
                            "about to sign actually belongs\nto the person "
                            "named above?  If you don't know what to "
                            "answer, enter \"0\".\n"));
-             tty_printf ("\n");
-             tty_printf (_("   (0) I will not answer.%s\n"),
+             tty_fprintf (fp, "\n");
+             tty_fprintf (fp, _("   (0) I will not answer.%s\n"),
                          opt.def_cert_level == 0 ? " (default)" : "");
                          opt.def_cert_level == 0 ? " (default)" : "");
-             tty_printf (_("   (1) I have not checked at all.%s\n"),
+             tty_fprintf (fp, _("   (1) I have not checked at all.%s\n"),
                          opt.def_cert_level == 1 ? " (default)" : "");
                          opt.def_cert_level == 1 ? " (default)" : "");
-             tty_printf (_("   (2) I have done casual checking.%s\n"),
+             tty_fprintf (fp, _("   (2) I have done casual checking.%s\n"),
                          opt.def_cert_level == 2 ? " (default)" : "");
                          opt.def_cert_level == 2 ? " (default)" : "");
-             tty_printf (_("   (3) I have done very careful checking.%s\n"),
+             tty_fprintf (fp,
+                           _("   (3) I have done very careful checking.%s\n"),
                          opt.def_cert_level == 3 ? " (default)" : "");
                          opt.def_cert_level == 3 ? " (default)" : "");
-             tty_printf ("\n");
+             tty_fprintf (fp, "\n");
 
              while (class == 0)
                {
                  answer = cpr_get ("sign_uid.class",
                                     _("Your selection? "
 
              while (class == 0)
                {
                  answer = cpr_get ("sign_uid.class",
                                     _("Your selection? "
-                                      "(enter `?' for more information): "));
+                                      "(enter '?' for more information): "));
                  if (answer[0] == '\0')
                    class = 0x10 + opt.def_cert_level;  /* Default */
                  else if (ascii_strcasecmp (answer, "0") == 0)
                  if (answer[0] == '\0')
                    class = 0x10 + opt.def_cert_level;  /* Default */
                  else if (ascii_strcasecmp (answer, "0") == 0)
@@ -972,79 +960,85 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
                  else if (ascii_strcasecmp (answer, "3") == 0)
                    class = 0x13;       /* Positive */
                  else
                  else if (ascii_strcasecmp (answer, "3") == 0)
                    class = 0x13;       /* Positive */
                  else
-                   tty_printf (_("Invalid selection.\n"));
+                   tty_fprintf (fp, _("Invalid selection.\n"));
 
                  xfree (answer);
                }
            }
 
 
                  xfree (answer);
                }
            }
 
-         if (trust)
+         if (trust && !quick)
            trustsig_prompt (&trust_value, &trust_depth, &trust_regexp);
        }
 
            trustsig_prompt (&trust_value, &trust_depth, &trust_regexp);
        }
 
-      p = get_user_id_native (sk_keyid);
-      tty_printf (_("Are you sure that you want to sign this key with your\n"
-                   "key \"%s\" (%s)\n"), p, keystr_from_pk (pk));
-      xfree (p);
+      if (!quick)
+        {
+          p = get_user_id_native (sk_keyid);
+          tty_fprintf (fp,
+                   _("Are you sure that you want to sign this key with your\n"
+                     "key \"%s\" (%s)\n"), p, keystr_from_pk (pk));
+          xfree (p);
+        }
 
       if (selfsig)
        {
 
       if (selfsig)
        {
-         tty_printf ("\n");
-         tty_printf (_("This will be a self-signature.\n"));
+         tty_fprintf (fp, "\n");
+         tty_fprintf (fp, _("This will be a self-signature.\n"));
 
          if (local)
            {
 
          if (local)
            {
-             tty_printf ("\n");
-             tty_printf (_("WARNING: the signature will not be marked "
-                           "as non-exportable.\n"));
+             tty_fprintf (fp, "\n");
+             tty_fprintf (fp, _("WARNING: the signature will not be marked "
+                                 "as non-exportable.\n"));
            }
 
          if (nonrevocable)
            {
            }
 
          if (nonrevocable)
            {
-             tty_printf ("\n");
-             tty_printf (_("WARNING: the signature will not be marked "
-                           "as non-revocable.\n"));
+             tty_fprintf (fp, "\n");
+             tty_fprintf (fp, _("WARNING: the signature will not be marked "
+                                 "as non-revocable.\n"));
            }
        }
       else
        {
          if (local)
            {
            }
        }
       else
        {
          if (local)
            {
-             tty_printf ("\n");
-             tty_printf 
-                (_("The signature will be marked as non-exportable.\n"));
+             tty_fprintf (fp, "\n");
+             tty_fprintf (fp,
+                 _("The signature will be marked as non-exportable.\n"));
            }
 
          if (nonrevocable)
            {
            }
 
          if (nonrevocable)
            {
-             tty_printf ("\n");
-             tty_printf 
-                (_("The signature will be marked as non-revocable.\n"));
+             tty_fprintf (fp, "\n");
+             tty_fprintf (fp,
+                 _("The signature will be marked as non-revocable.\n"));
            }
 
          switch (class)
            {
            case 0x11:
            }
 
          switch (class)
            {
            case 0x11:
-             tty_printf ("\n");
-             tty_printf (_("I have not checked this key at all.\n"));
+             tty_fprintf (fp, "\n");
+             tty_fprintf (fp, _("I have not checked this key at all.\n"));
              break;
 
            case 0x12:
              break;
 
            case 0x12:
-             tty_printf ("\n");
-             tty_printf (_("I have checked this key casually.\n"));
+             tty_fprintf (fp, "\n");
+             tty_fprintf (fp, _("I have checked this key casually.\n"));
              break;
 
            case 0x13:
              break;
 
            case 0x13:
-             tty_printf ("\n");
-             tty_printf (_("I have checked this key very carefully.\n"));
+             tty_fprintf (fp, "\n");
+             tty_fprintf (fp, _("I have checked this key very carefully.\n"));
              break;
            }
        }
 
              break;
            }
        }
 
-      tty_printf ("\n");
+      tty_fprintf (fp, "\n");
 
       if (opt.batch && opt.answer_yes)
        ;
 
       if (opt.batch && opt.answer_yes)
        ;
+      else if (quick)
+        ;
       else if (!cpr_get_answer_is_yes ("sign_uid.okay",
                                       _("Really sign? (y/N) ")))
        continue;
       else if (!cpr_get_answer_is_yes ("sign_uid.okay",
                                       _("Really sign? (y/N) ")))
        continue;
@@ -1083,7 +1077,8 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
                                         NULL,
                                         pk,
                                         0x13, 0, force_v4 ? 4 : 0, 0, 0,
                                         NULL,
                                         pk,
                                         0x13, 0, force_v4 ? 4 : 0, 0, 0,
-                                        keygen_add_std_prefs, primary_pk);
+                                        keygen_add_std_prefs, primary_pk,
+                                         NULL);
              else
                rc = make_keysig_packet (&sig, primary_pk,
                                         node->pkt->pkt.user_id,
              else
                rc = make_keysig_packet (&sig, primary_pk,
                                         node->pkt->pkt.user_id,
@@ -1091,7 +1086,8 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
                                         pk,
                                         class, 0, force_v4 ? 4 : 0,
                                         timestamp, duration,
                                         pk,
                                         class, 0, force_v4 ? 4 : 0,
                                         timestamp, duration,
-                                        sign_mk_attrib, &attrib);
+                                        sign_mk_attrib, &attrib,
+                                         NULL);
              if (rc)
                {
                  log_error (_("signing failed: %s\n"), g10_errstr (rc));
              if (rc)
                {
                  log_error (_("signing failed: %s\n"), g10_errstr (rc));
@@ -1115,51 +1111,70 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
          delete_kbnode (node);
     } /* End loop over signators.  */
 
          delete_kbnode (node);
     } /* End loop over signators.  */
 
-leave:
+ leave:
   release_sk_list (sk_list);
   return rc;
 }
 
 
 /*
   release_sk_list (sk_list);
   return rc;
 }
 
 
 /*
- * Change the passphrase of the primary and all secondary keys.
- * We use only one passphrase for all keys.
+ * Change the passphrase of the primary and all secondary keys.  Note
+ * that it is common to use only one passphrase for the primary and
+ * all subkeys.  However, this is now (since GnuPG 2.1) all up to the
+ * gpg-agent.  Returns 0 on success or an error code.
  */
  */
-static int
-change_passphrase (KBNODE keyblock, int *r_err)
+static gpg_error_t
+change_passphrase (ctrl_t ctrl, kbnode_t keyblock)
 {
 {
-  int rc = 0;
-  int changed = 0;
-  KBNODE node;
-  PKT_public_key *pksk;
-  char *passphrase = NULL;
-  int no_primary_secrets = 0;
+  gpg_error_t err;
+  kbnode_t node;
+  PKT_public_key *pk;
   int any;
   int any;
+  u32 keyid[2], subid[2];
+  char *hexgrip = NULL;
+  char *cache_nonce = NULL;
+  char *passwd_nonce = NULL;
 
   node = find_kbnode (keyblock, PKT_PUBLIC_KEY);
   if (!node)
     {
       log_error ("Oops; public key missing!\n");
 
   node = find_kbnode (keyblock, PKT_PUBLIC_KEY);
   if (!node)
     {
       log_error ("Oops; public key missing!\n");
+      err = gpg_error (GPG_ERR_INTERNAL);
       goto leave;
     }
       goto leave;
     }
-  pksk = node->pkt->pkt.public_key;
+  pk = node->pkt->pkt.public_key;
+  keyid_from_pk (pk, keyid);
 
 
+  /* Check whether it is likely that we will be able to change the
+     passphrase for any subkey.  */
   for (any = 0, node = keyblock; node; node = node->next)
     {
       if (node->pkt->pkttype == PKT_PUBLIC_KEY
          || node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
        {
   for (any = 0, node = keyblock; node; node = node->next)
     {
       if (node->pkt->pkttype == PKT_PUBLIC_KEY
          || node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
        {
-          log_debug ("FIXME\n");
-         /* PKT_public_key *tmpsk = node->pkt->pkt.public_key; */
-         /* if (!(tmpsk->is_protected */
-         /*       && (tmpsk->protect.s2k.mode == 1001 */
-         /*           || tmpsk->protect.s2k.mode == 1002))) */
-         /*   { */
-         /*     any = 1; */
-         /*     break; */
-         /*   } */
+          char *serialno;
+
+          pk = node->pkt->pkt.public_key;
+          keyid_from_pk (pk, subid);
+
+          xfree (hexgrip);
+          err = hexkeygrip_from_pk (pk, &hexgrip);
+          if (err)
+            goto leave;
+          err = agent_get_keyinfo (ctrl, hexgrip, &serialno);
+          if (!err && serialno)
+            ; /* Key on card.  */
+          else if (gpg_err_code (err) == GPG_ERR_NOT_FOUND)
+            ; /* Maybe stub key. */
+          else if (!err)
+            any = 1; /* Key is known.  */
+          else
+            log_error ("key %s: error getting keyinfo from agent: %s\n",
+                       keystr_with_sub (keyid, subid), gpg_strerror (err));
+          xfree (serialno);
        }
     }
        }
     }
+  err = 0;
   if (!any)
     {
       tty_printf (_("Key has only stub or on-card key items - "
   if (!any)
     {
       tty_printf (_("Key has only stub or on-card key items - "
@@ -1167,162 +1182,43 @@ change_passphrase (KBNODE keyblock, int *r_err)
       goto leave;
     }
 
       goto leave;
     }
 
-          log_debug ("FIXME\n");
-  /* See how to handle this key.  */
-  /* switch (is_secret_key_protected (pksk)) */
-  /*   { */
-  /*   case -1: */
-  /*     rc = G10ERR_PUBKEY_ALGO; */
-  /*     break; */
-  /*   case 0: */
-  /*     tty_printf (_("This key is not protected.\n")); */
-  /*     break; */
-  /*   default: */
-  /*     if (sk->protect.s2k.mode == 1001) */
-  /*       { */
-  /*         tty_printf (_("Secret parts of key are not available.\n")); */
-  /*         no_primary_secrets = 1; */
-  /*       } */
-  /*     else if (sk->protect.s2k.mode == 1002) */
-  /*       { */
-  /*         tty_printf (_("Secret parts of key are stored on-card.\n")); */
-  /*         no_primary_secrets = 1; */
-  /*       } */
-  /*     else */
-  /*       { */
-  /*         u32 keyid[2]; */
-
-  /*         tty_printf (_("Key is protected.\n")); */
-
-  /*         /\* Clear the passphrase cache so that the user is required */
-  /*            to enter the old passphrase.  *\/ */
-  /*         keyid_from_pk (pksk, keyid); */
-  /*         passphrase_clear_cache (keyid, NULL, 0); */
-
-  /*         /\* rc = check_secret_key( sk, 0 ); *\/ */
-  /*         /\* if( !rc ) *\/ */
-  /*         /\*     passphrase = get_last_passphrase(); *\/ */
-  /*       } */
-  /*     break; */
-  /*   } */
-
-  /* Unprotect all subkeys (use the supplied passphrase or ask) */
-  for (node = keyblock; !rc && node; node = node->next)
-    {
-      if (node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
-       {
-          log_debug ("FIXME\n");
-         /* PKT_pubic_key *subsk = node->pkt->pkt.public_key; */
-         /* if (!(subsk->is_protected */
-         /*       && (subsk->protect.s2k.mode == 1001 */
-         /*           || subsk->protect.s2k.mode == 1002))) */
-         /*   { */
-         /*     set_next_passphrase (passphrase); */
-         /*     /\* rc = check_secret_key( subsk, 0 ); *\/ */
-         /*     /\* if( !rc && !passphrase ) *\/ */
-         /*     /\*     passphrase = get_last_passphrase(); *\/ */
-         /*   } */
-       }
-    }
-
-  if (rc)
-    tty_printf (_("Can't edit this key: %s\n"), g10_errstr (rc));
-  else
+  /* Change the passphrase for all keys.  */
+  for (any = 0, node = keyblock; node; node = node->next)
     {
     {
-      DEK *dek = NULL;
-      STRING2KEY *s2k = xmalloc_secure (sizeof *s2k);
-      const char *errtext = NULL;
-
-      tty_printf (_("Enter the new passphrase for this secret key.\n\n"));
-
-      set_next_passphrase (NULL);
-      for (;;)
-       {
-         int canceled;
-
-         s2k->mode = opt.s2k_mode;
-         s2k->hash_algo = S2K_DIGEST_ALGO;
-         dek = passphrase_to_dek (NULL, 0, opt.s2k_cipher_algo,
-                                  s2k, 2, errtext, &canceled);
-         if (!dek && canceled)
-           {
-             rc = GPG_ERR_CANCELED;
-             break;
-           }
-         else if (!dek)
-           {
-             errtext = N_("passphrase not correctly repeated; try again");
-             tty_printf ("%s.\n", _(errtext));
-           }
-         else if (!dek->keylen)
-           {
-             rc = 0;
-             tty_printf (_("You don't want a passphrase -"
-                           " this is probably a *bad* idea!\n\n"));
-             if (cpr_get_answer_is_yes 
-                  ("change_passwd.empty.okay",
-                   _("Do you really want to do this? (y/N) ")))
-               {
-                 changed++;
-                 break;
-               }
-           }
-         else
-           {                   /* okay */
-             rc = 0;
-             if (!no_primary_secrets)
-               {
-                 /* sk->protect.algo = dek->algo; */
-                 /* sk->protect.s2k = *s2k; */
-                 rc = 0;
-                 /* rc = protect_secret_key( sk, dek ); */
-               }
-             for (node = keyblock; !rc && node; node = node->next)
-               {
-                 if (node->pkt->pkttype == PKT_SECRET_SUBKEY)
-                   {
-                      log_debug ("FIXME\n");
-/*                   PKT_secret_key *subsk = node->pkt->pkt.secret_key; */
-/*                   if (!(subsk->is_protected */
-/*                         && (subsk->protect.s2k.mode == 1001 */
-/*                             || subsk->protect.s2k.mode == 1002))) */
-/*                     { */
-/*                       subsk->protect.algo = dek->algo; */
-/*                       subsk->protect.s2k = *s2k; */
-/* #warning fixme */
-/*                       rc = 0; */
-/*                       /\* rc = protect_secret_key( subsk, dek ); *\/ */
-/*                     } */
-                   }
-               }
-             if (rc)
-               log_error ("protect_secret_key failed: %s\n",
-                          g10_errstr (rc));
-             else
-               {
-                 u32 keyid[2];
-
-                 /* Clear the cahce again so that the user is
-                    required to enter the new passphrase at the
-                    next operation.  */
-                 /* FIXME keyid_from_sk (sk, keyid); */
-                 passphrase_clear_cache (keyid, NULL, 0);
-
-                 changed++;
-               }
-             break;
-           }
-       }
-      xfree (s2k);
-      xfree (dek);
+      if (node->pkt->pkttype == PKT_PUBLIC_KEY
+         || node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
+        {
+          char *desc;
+
+          pk = node->pkt->pkt.public_key;
+          keyid_from_pk (pk, subid);
+
+          xfree (hexgrip);
+          err = hexkeygrip_from_pk (pk, &hexgrip);
+          if (err)
+            goto leave;
+
+          desc = gpg_format_keydesc (pk, FORMAT_KEYDESC_NORMAL, 1);
+          err = agent_passwd (ctrl, hexgrip, desc, &cache_nonce, &passwd_nonce);
+          xfree (desc);
+
+          if (err)
+            log_log ((gpg_err_code (err) == GPG_ERR_CANCELED
+                      || gpg_err_code (err) == GPG_ERR_FULLY_CANCELED)
+                     ? JNLIB_LOG_INFO : JNLIB_LOG_ERROR,
+                     _("key %s: error changing passphrase: %s\n"),
+                       keystr_with_sub (keyid, subid),
+                       gpg_strerror (err));
+          if (gpg_err_code (err) == GPG_ERR_FULLY_CANCELED)
+            break;
+        }
     }
 
     }
 
-leave:
-  xfree (passphrase);
-  set_next_passphrase (NULL);
-  if (r_err)
-    *r_err = rc;
-  return changed && !rc;
+ leave:
+  xfree (hexgrip);
+  xfree (cache_nonce);
+  xfree (passwd_nonce);
+  return err;
 }
 
 
 }
 
 
@@ -1431,7 +1327,11 @@ enum cmdids
   cmdREVSIG, cmdREVKEY, cmdREVUID, cmdDELSIG, cmdPRIMARY, cmdDEBUG,
   cmdSAVE, cmdADDUID, cmdADDPHOTO, cmdDELUID, cmdADDKEY, cmdDELKEY,
   cmdADDREVOKER, cmdTOGGLE, cmdSELKEY, cmdPASSWD, cmdTRUST, cmdPREF,
   cmdREVSIG, cmdREVKEY, cmdREVUID, cmdDELSIG, cmdPRIMARY, cmdDEBUG,
   cmdSAVE, cmdADDUID, cmdADDPHOTO, cmdDELUID, cmdADDKEY, cmdDELKEY,
   cmdADDREVOKER, cmdTOGGLE, cmdSELKEY, cmdPASSWD, cmdTRUST, cmdPREF,
-  cmdEXPIRE, cmdBACKSIGN, cmdENABLEKEY, cmdDISABLEKEY, cmdSHOWPREF,
+  cmdEXPIRE, cmdBACKSIGN,
+#ifndef NO_TRUST_MODELS
+  cmdENABLEKEY, cmdDISABLEKEY,
+#endif /*!NO_TRUST_MODELS*/
+  cmdSHOWPREF,
   cmdSETPREF, cmdPREFKS, cmdNOTATION, cmdINVCMD, cmdSHOWPHOTO, cmdUPDTRUST,
   cmdCHKTRUST, cmdADDCARDKEY, cmdKEYTOCARD, cmdBKUPTOCARD, cmdCHECKBKUPKEY,
   cmdCLEAN, cmdMINIMIZE, cmdNOP
   cmdSETPREF, cmdPREFKS, cmdNOTATION, cmdINVCMD, cmdSHOWPHOTO, cmdUPDTRUST,
   cmdCHKTRUST, cmdADDCARDKEY, cmdKEYTOCARD, cmdBKUPTOCARD, cmdCHECKBKUPKEY,
   cmdCLEAN, cmdMINIMIZE, cmdNOP
@@ -1510,7 +1410,9 @@ static struct
   { "passwd", cmdPASSWD, KEYEDIT_NOT_SK | KEYEDIT_NEED_SK,
     N_("change the passphrase")},
   { "password", cmdPASSWD, KEYEDIT_NOT_SK | KEYEDIT_NEED_SK, NULL},
   { "passwd", cmdPASSWD, KEYEDIT_NOT_SK | KEYEDIT_NEED_SK,
     N_("change the passphrase")},
   { "password", cmdPASSWD, KEYEDIT_NOT_SK | KEYEDIT_NEED_SK, NULL},
+#ifndef NO_TRUST_MODELS
   { "trust", cmdTRUST, KEYEDIT_NOT_SK, N_("change the ownertrust")},
   { "trust", cmdTRUST, KEYEDIT_NOT_SK, N_("change the ownertrust")},
+#endif /*!NO_TRUST_MODELS*/
   { "revsig", cmdREVSIG, KEYEDIT_NOT_SK,
     N_("revoke signatures on the selected user IDs")},
   { "revuid", cmdREVUID, KEYEDIT_NOT_SK | KEYEDIT_NEED_SK,
   { "revsig", cmdREVSIG, KEYEDIT_NOT_SK,
     N_("revoke signatures on the selected user IDs")},
   { "revuid", cmdREVUID, KEYEDIT_NOT_SK | KEYEDIT_NEED_SK,
@@ -1518,8 +1420,10 @@ static struct
   { "revphoto", cmdREVUID, KEYEDIT_NOT_SK | KEYEDIT_NEED_SK, NULL},
   { "revkey", cmdREVKEY, KEYEDIT_NOT_SK | KEYEDIT_NEED_SK,
     N_("revoke key or selected subkeys")},
   { "revphoto", cmdREVUID, KEYEDIT_NOT_SK | KEYEDIT_NEED_SK, NULL},
   { "revkey", cmdREVKEY, KEYEDIT_NOT_SK | KEYEDIT_NEED_SK,
     N_("revoke key or selected subkeys")},
+#ifndef NO_TRUST_MODELS
   { "enable", cmdENABLEKEY, KEYEDIT_NOT_SK, N_("enable key")},
   { "disable", cmdDISABLEKEY, KEYEDIT_NOT_SK, N_("disable key")},
   { "enable", cmdENABLEKEY, KEYEDIT_NOT_SK, N_("enable key")},
   { "disable", cmdDISABLEKEY, KEYEDIT_NOT_SK, N_("disable key")},
+#endif /*!NO_TRUST_MODELS*/
   { "showphoto", cmdSHOWPHOTO, 0, N_("show selected photo IDs")},
   { "clean", cmdCLEAN, KEYEDIT_NOT_SK,
     N_("compact unusable user IDs and remove unusable signatures from key")},
   { "showphoto", cmdSHOWPHOTO, 0, N_("show selected photo IDs")},
   { "clean", cmdCLEAN, KEYEDIT_NOT_SK,
     N_("compact unusable user IDs and remove unusable signatures from key")},
@@ -1584,7 +1488,7 @@ keyedit_completion (const char *text, int start, int end)
 \f
 /* Main function of the menu driven key editor.  */
 void
 \f
 /* Main function of the menu driven key editor.  */
 void
-keyedit_menu (const char *username, strlist_t locusr,
+keyedit_menu (ctrl_t ctrl, const char *username, strlist_t locusr,
              strlist_t commands, int quiet, int seckey_check)
 {
   enum cmdids cmd = 0;
              strlist_t commands, int quiet, int seckey_check)
 {
   enum cmdids cmd = 0;
@@ -1597,7 +1501,6 @@ keyedit_menu (const char *username, strlist_t locusr,
   int modified = 0;
   int toggle;
   int have_commands = !!commands;
   int modified = 0;
   int toggle;
   int have_commands = !!commands;
-  ctrl_t ctrl = NULL; /* Dummy for now.  */
 
   if (opt.command_fd != -1)
     ;
 
   if (opt.command_fd != -1)
     ;
@@ -1621,9 +1524,12 @@ keyedit_menu (const char *username, strlist_t locusr,
 #endif
 
   /* Get the public key */
 #endif
 
   /* Get the public key */
-  err = get_pubkey_byname (NULL, NULL, username, &keyblock, &kdbhd, 1, 1);
+  err = get_pubkey_byname (ctrl, NULL, NULL, username, &keyblock, &kdbhd, 1, 1);
   if (err)
   if (err)
-    goto leave;
+    {
+      log_error (_("key \"%s\" not found: %s\n"), username, gpg_strerror (err));
+      goto leave;
+    }
   if (fix_keyblock (keyblock))
     modified++;
   if (collapse_uids (&keyblock))
   if (fix_keyblock (keyblock))
     modified++;
   if (collapse_uids (&keyblock))
@@ -1636,8 +1542,8 @@ keyedit_menu (const char *username, strlist_t locusr,
 
   /* See whether we have a matching secret key.  */
   if (seckey_check)
 
   /* See whether we have a matching secret key.  */
   if (seckey_check)
-    { 
-      have_seckey = have_any_secret_key (ctrl, keyblock);
+    {
+      have_seckey = !agent_probe_any_secret_key (ctrl, keyblock);
       if (have_seckey && !quiet)
        tty_printf (_("Secret key is available.\n"));
     }
       if (have_seckey && !quiet)
        tty_printf (_("Secret key is available.\n"));
     }
@@ -1656,7 +1562,7 @@ keyedit_menu (const char *username, strlist_t locusr,
 
       if (redisplay && !quiet)
        {
 
       if (redisplay && !quiet)
        {
-         show_key_with_all_names (keyblock, 0, 1, 0, 1, 0);
+         show_key_with_all_names (NULL, keyblock, 0, 1, 0, 1, 0, 0);
          tty_printf ("\n");
          redisplay = 0;
        }
          tty_printf ("\n");
          redisplay = 0;
        }
@@ -1682,7 +1588,7 @@ keyedit_menu (const char *username, strlist_t locusr,
 #ifdef HAVE_LIBREADLINE
              tty_enable_completion (keyedit_completion);
 #endif
 #ifdef HAVE_LIBREADLINE
              tty_enable_completion (keyedit_completion);
 #endif
-             answer = cpr_get_no_help ("keyedit.prompt", "gpg> ");
+             answer = cpr_get_no_help ("keyedit.prompt", GPG_NAME "> ");
              cpr_kill_prompt ();
              tty_disable_completion ();
            }
              cpr_kill_prompt ();
              tty_disable_completion ();
            }
@@ -1760,9 +1666,9 @@ keyedit_menu (const char *username, strlist_t locusr,
 
          tty_printf ("\n");
          tty_printf
 
          tty_printf ("\n");
          tty_printf
-            (_("* The `sign' command may be prefixed with an `l' for local "
+            (_("* The 'sign' command may be prefixed with an 'l' for local "
                "signatures (lsign),\n"
                "signatures (lsign),\n"
-               "  a `t' for trust signatures (tsign), an `nr' for "
+               "  a 't' for trust signatures (tsign), an 'nr' for "
                "non-revocable signatures\n"
                "  (nrsign), or any combination thereof (ltsign, "
                "tnrsign, etc.).\n"));
                "non-revocable signatures\n"
                "  (nrsign), or any combination thereof (ltsign, "
                "tnrsign, etc.).\n"));
@@ -1806,7 +1712,7 @@ keyedit_menu (const char *username, strlist_t locusr,
          {
            int localsig = 0, nonrevokesig = 0, trustsig = 0, interactive = 0;
 
          {
            int localsig = 0, nonrevokesig = 0, trustsig = 0, interactive = 0;
 
-           if (pk->is_revoked)
+           if (pk->flags.revoked)
              {
                tty_printf (_("Key is revoked."));
 
              {
                tty_printf (_("Key is revoked."));
 
@@ -1844,12 +1750,12 @@ keyedit_menu (const char *username, strlist_t locusr,
            if (!parse_sign_type
                (answer, &localsig, &nonrevokesig, &trustsig))
              {
            if (!parse_sign_type
                (answer, &localsig, &nonrevokesig, &trustsig))
              {
-               tty_printf (_("Unknown signature type `%s'\n"), answer);
+               tty_printf (_("Unknown signature type '%s'\n"), answer);
                break;
              }
 
                break;
              }
 
-           sign_uids (keyblock, locusr, &modified,
-                      localsig, nonrevokesig, trustsig, interactive);
+           sign_uids (NULL, keyblock, locusr, &modified,
+                      localsig, nonrevokesig, trustsig, interactive, 0);
          }
          break;
 
          }
          break;
 
@@ -1921,7 +1827,7 @@ keyedit_menu (const char *username, strlist_t locusr,
          break;
 
        case cmdADDKEY:
          break;
 
        case cmdADDKEY:
-         if (!generate_subkeypair (keyblock))
+         if (!generate_subkeypair (ctrl, keyblock))
            {
              redisplay = 1;
              modified = 1;
            {
              redisplay = 1;
              modified = 1;
@@ -1931,7 +1837,7 @@ keyedit_menu (const char *username, strlist_t locusr,
 
 #ifdef ENABLE_CARD_SUPPORT
        case cmdADDCARDKEY:
 
 #ifdef ENABLE_CARD_SUPPORT
        case cmdADDCARDKEY:
-         if (card_generate_subkey (keyblock))
+         if (!card_generate_subkey (keyblock))
            {
              redisplay = 1;
              modified = 1;
            {
              redisplay = 1;
              modified = 1;
@@ -1945,7 +1851,7 @@ keyedit_menu (const char *username, strlist_t locusr,
            switch (count_selected_keys (keyblock))
              {
              case 0:
            switch (count_selected_keys (keyblock))
              {
              case 0:
-               if (cpr_get_answer_is_yes 
+               if (cpr_get_answer_is_yes
                     ("keyedit.keytocard.use_primary",
                      /* TRANSLATORS: Please take care: This is about
                         moving the key and not about removing it.  */
                     ("keyedit.keytocard.use_primary",
                      /* TRANSLATORS: Please take care: This is about
                         moving the key and not about removing it.  */
@@ -1966,7 +1872,7 @@ keyedit_menu (const char *username, strlist_t locusr,
              }
            if (node)
              {
              }
            if (node)
              {
-               PKT_public_key *xxpk = find_pk_from_sknode (keyblock, node);
+               PKT_public_key *xxpk = node->pkt->pkt.public_key;
                if (card_store_subkey (node, xxpk ? xxpk->pubkey_usage : 0))
                  {
                    redisplay = 1;
                if (card_store_subkey (node, xxpk ? xxpk->pubkey_usage : 0))
                  {
                    redisplay = 1;
@@ -2006,7 +1912,7 @@ keyedit_menu (const char *username, strlist_t locusr,
              }
            if (!a)
              {
              }
            if (!a)
              {
-               tty_printf (_("Can't open `%s': %s\n"),
+               tty_printf (_("Can't open '%s': %s\n"),
                            fname, strerror (errno));
                break;
              }
                            fname, strerror (errno));
                break;
              }
@@ -2022,7 +1928,7 @@ keyedit_menu (const char *username, strlist_t locusr,
              err = G10ERR_NO_SECKEY;
            if (err)
              {
              err = G10ERR_NO_SECKEY;
            if (err)
              {
-               tty_printf (_("Error reading backup key from `%s': %s\n"),
+               tty_printf (_("Error reading backup key from '%s': %s\n"),
                            fname, g10_errstr (err));
                free_packet (pkt);
                xfree (pkt);
                            fname, g10_errstr (err));
                free_packet (pkt);
                xfree (pkt);
@@ -2032,25 +1938,25 @@ keyedit_menu (const char *username, strlist_t locusr,
 
            if (cmd == cmdCHECKBKUPKEY)
              {
 
            if (cmd == cmdCHECKBKUPKEY)
              {
-               PKT_secret_key *sk = node->pkt->pkt.secret_key;
-               switch (is_secret_key_protected (sk))
-                 {
-                 case 0:       /* Not protected. */
-                   tty_printf (_("This key is not protected.\n"));
-                   break;
-                 case -1:
-                   log_error (_("unknown key protection algorithm\n"));
-                   break;
-                 default:
-                   if (sk->protect.s2k.mode == 1001)
-                     tty_printf (_("Secret parts of key"
-                                   " are not available.\n"));
-                   if (sk->protect.s2k.mode == 1002)
-                     tty_printf (_("Secret parts of key"
-                                   " are stored on-card.\n"));
+               /* PKT_public_key *sk = node->pkt->pkt.secret_key; */
+               /* switch (is_secret_key_protected (sk)) */
+               /*   { */
+               /*   case 0:    /\* Not protected. *\/ */
+               /*     tty_printf (_("This key is not protected.\n")); */
+               /*     break; */
+               /*   case -1: */
+               /*     log_error (_("unknown key protection algorithm\n")); */
+               /*     break; */
+               /*   default: */
+               /*     if (sk->protect.s2k.mode == 1001) */
+               /*       tty_printf (_("Secret parts of key" */
+               /*                  " are not available.\n")); */
+               /*     if (sk->protect.s2k.mode == 1002) */
+               /*       tty_printf (_("Secret parts of key" */
+               /*                  " are stored on-card.\n")); */
                    /* else */
                    /*   check_secret_key (sk, 0); */
                    /* else */
                    /*   check_secret_key (sk, 0); */
-                 }
+                 /* } */
              }
            else                /* Store it.  */
              {
              }
            else                /* Store it.  */
              {
@@ -2093,7 +1999,7 @@ keyedit_menu (const char *username, strlist_t locusr,
 
            if (ascii_strcasecmp (arg_string, "sensitive") == 0)
              sensitive = 1;
 
            if (ascii_strcasecmp (arg_string, "sensitive") == 0)
              sensitive = 1;
-           if (menu_addrevoker (keyblock, sensitive))
+           if (menu_addrevoker (ctrl, keyblock, sensitive))
              {
                redisplay = 1;
                modified = 1;
              {
                redisplay = 1;
                modified = 1;
@@ -2108,7 +2014,7 @@ keyedit_menu (const char *username, strlist_t locusr,
 
            if (!(n1 = count_selected_uids (keyblock)))
              tty_printf (_("You must select at least one user ID.\n"));
 
            if (!(n1 = count_selected_uids (keyblock)))
              tty_printf (_("You must select at least one user ID.\n"));
-           else if (cpr_get_answer_is_yes 
+           else if (cpr_get_answer_is_yes
                      ("keyedit.revoke.uid.okay",
                       n1 > 1 ? _("Really revoke all selected user IDs? (y/N) ")
                      :        _("Really revoke this user ID? (y/N) ")))
                      ("keyedit.revoke.uid.okay",
                       n1 > 1 ? _("Really revoke all selected user IDs? (y/N) ")
                      :        _("Really revoke this user ID? (y/N) ")))
@@ -2183,9 +2089,10 @@ keyedit_menu (const char *username, strlist_t locusr,
          break;
 
        case cmdPASSWD:
          break;
 
        case cmdPASSWD:
-         change_passphrase (keyblock, NULL);
+         change_passphrase (ctrl, keyblock);
          break;
 
          break;
 
+#ifndef NO_TRUST_MODELS
        case cmdTRUST:
          if (opt.trust_model == TM_EXTERNAL)
            {
        case cmdTRUST:
          if (opt.trust_model == TM_EXTERNAL)
            {
@@ -2194,7 +2101,7 @@ keyedit_menu (const char *username, strlist_t locusr,
              break;
            }
 
              break;
            }
 
-         show_key_with_all_names (keyblock, 0, 0, 0, 1, 0);
+         show_key_with_all_names (NULL, keyblock, 0, 0, 0, 1, 0, 0);
          tty_printf ("\n");
          if (edit_ownertrust (find_kbnode (keyblock,
                                            PKT_PUBLIC_KEY)->pkt->pkt.
          tty_printf ("\n");
          if (edit_ownertrust (find_kbnode (keyblock,
                                            PKT_PUBLIC_KEY)->pkt->pkt.
@@ -2207,12 +2114,13 @@ keyedit_menu (const char *username, strlist_t locusr,
              update_trust = 1;
            }
          break;
              update_trust = 1;
            }
          break;
+#endif /*!NO_TRUST_MODELS*/
 
        case cmdPREF:
          {
            int count = count_selected_uids (keyblock);
            assert (keyblock->pkt->pkttype == PKT_PUBLIC_KEY);
 
        case cmdPREF:
          {
            int count = count_selected_uids (keyblock);
            assert (keyblock->pkt->pkttype == PKT_PUBLIC_KEY);
-           show_names (keyblock, keyblock->pkt->pkt.public_key,
+           show_names (NULL, keyblock, keyblock->pkt->pkt.public_key,
                        count ? NODFLG_SELUID : 0, 1);
          }
          break;
                        count ? NODFLG_SELUID : 0, 1);
          }
          break;
@@ -2221,7 +2129,7 @@ keyedit_menu (const char *username, strlist_t locusr,
          {
            int count = count_selected_uids (keyblock);
            assert (keyblock->pkt->pkttype == PKT_PUBLIC_KEY);
          {
            int count = count_selected_uids (keyblock);
            assert (keyblock->pkt->pkttype == PKT_PUBLIC_KEY);
-           show_names (keyblock, keyblock->pkt->pkt.public_key,
+           show_names (NULL, keyblock, keyblock->pkt->pkt.public_key,
                        count ? NODFLG_SELUID : 0, 2);
          }
          break;
                        count ? NODFLG_SELUID : 0, 2);
          }
          break;
@@ -2285,6 +2193,7 @@ keyedit_menu (const char *username, strlist_t locusr,
            }
          break;
 
            }
          break;
 
+#ifndef NO_TRUST_MODELS
        case cmdENABLEKEY:
        case cmdDISABLEKEY:
          if (enable_disable_key (keyblock, cmd == cmdDISABLEKEY))
        case cmdENABLEKEY:
        case cmdDISABLEKEY:
          if (enable_disable_key (keyblock, cmd == cmdDISABLEKEY))
@@ -2293,6 +2202,7 @@ keyedit_menu (const char *username, strlist_t locusr,
              modified = 1;
            }
          break;
              modified = 1;
            }
          break;
+#endif /*!NO_TRUST_MODELS*/
 
        case cmdSHOWPHOTO:
          menu_showphoto (keyblock);
 
        case cmdSHOWPHOTO:
          menu_showphoto (keyblock);
@@ -2360,13 +2270,10 @@ keyedit_menu (const char *username, strlist_t locusr,
 
 /* Change the passphrase of the secret key identified by USERNAME.  */
 void
 
 /* Change the passphrase of the secret key identified by USERNAME.  */
 void
-keyedit_passwd (const char *username)
+keyedit_passwd (ctrl_t ctrl, const char *username)
 {
   gpg_error_t err;
   PKT_public_key *pk;
 {
   gpg_error_t err;
   PKT_public_key *pk;
-  unsigned char fpr[MAX_FINGERPRINT_LEN];
-  size_t fprlen;
-  KEYDB_HANDLE kdh = NULL;
   kbnode_t keyblock = NULL;
 
   pk = xtrycalloc (1, sizeof *pk);
   kbnode_t keyblock = NULL;
 
   pk = xtrycalloc (1, sizeof *pk);
@@ -2375,55 +2282,183 @@ keyedit_passwd (const char *username)
       err = gpg_error_from_syserror ();
       goto leave;
     }
       err = gpg_error_from_syserror ();
       goto leave;
     }
-  err = getkey_byname (NULL, pk, username, 1, NULL);
+  err = getkey_byname (NULL, pk, username, 1, &keyblock);
   if (err)
     goto leave;
   if (err)
     goto leave;
-  fingerprint_from_pk (pk, fpr, &fprlen);
-  while (fprlen < MAX_FINGERPRINT_LEN)
-    fpr[fprlen++] = 0;
 
 
-  /* FIXME: Call an agent function instead.  */
+  err = change_passphrase (ctrl, keyblock);
 
 
-  kdh = NULL /*keydb_new (1)*/;
-   if (!kdh)
+leave:
+  release_kbnode (keyblock);
+  free_public_key (pk);
+  if (err)
     {
     {
-      err = gpg_error (GPG_ERR_GENERAL);
-      goto leave;
+      log_info ("error changing the passphrase for '%s': %s\n",
+               username, gpg_strerror (err));
+      write_status_error ("keyedit.passwd", err);
     }
     }
+  else
+    write_status_text (STATUS_SUCCESS, "keyedit.passwd");
+}
 
 
-  err = keydb_search_fpr (kdh, fpr);
-  if (err == -1 || gpg_err_code (err) == GPG_ERR_EOF)
-    err = gpg_error (GPG_ERR_NO_SECKEY);
-  if (err)
-    goto leave;
 
 
-  err = keydb_get_keyblock (kdh, &keyblock);
-  if (err)
-    goto leave;
+/* Unattended key signing function.  If the key specifified by FPR is
+   availabale and FPR is the primary fingerprint all user ids of the
+   user ids of the key are signed using the default signing key.  If
+   UIDS is an empty list all usable UIDs are signed, if it is not
+   empty, only those user ids matching one of the entries of the loist
+   are signed.  With LOCAL being true kthe signatures are marked as
+   non-exportable.  */
+void
+keyedit_quick_sign (ctrl_t ctrl, const char *fpr, strlist_t uids,
+                    strlist_t locusr, int local)
+{
+  gpg_error_t err;
+  kbnode_t keyblock = NULL;
+  KEYDB_HANDLE kdbhd = NULL;
+  int modified = 0;
+  KEYDB_SEARCH_DESC desc;
+  PKT_public_key *pk;
+  kbnode_t node;
+  strlist_t sl;
+  int any;
 
 
-  if (!change_passphrase (keyblock, &err))
-    goto leave;
+#ifdef HAVE_W32_SYSTEM
+  /* See keyedit_menu for why we need this.  */
+  check_trustdb_stale ();
+#endif
 
 
-  err = keydb_update_keyblock (kdh, keyblock);
+  /* We require a fingerprint because only this uniquely identifies a
+     key and may thus be used to select a key for unattended key
+     signing.  */
+  if (classify_user_id (fpr, &desc, 1)
+      || !(desc.mode == KEYDB_SEARCH_MODE_FPR
+           || desc.mode == KEYDB_SEARCH_MODE_FPR16
+           || desc.mode == KEYDB_SEARCH_MODE_FPR20))
+    {
+      log_error (_("\"%s\" is not a fingerprint\n"), fpr);
+      goto leave;
+    }
+  err = get_pubkey_byname (ctrl, NULL, NULL, fpr, &keyblock, &kdbhd, 1, 1);
   if (err)
   if (err)
-    log_error (_("update secret failed: %s\n"), gpg_strerror (err));
+    {
+      log_error (_("key \"%s\" not found: %s\n"), fpr, gpg_strerror (err));
+      goto leave;
+    }
+  if (fix_keyblock (keyblock))
+    modified++;
+  if (collapse_uids (&keyblock))
+    modified++;
+  reorder_keyblock (keyblock);
 
 
-leave:
-  release_kbnode (keyblock);
-  if (pk)
-    free_public_key (pk);
-  keydb_release (kdh);
-  if (err)
+  /* Check that the primary fingerprint has been given. */
+  {
+    byte fprbin[MAX_FINGERPRINT_LEN];
+    size_t fprlen;
+
+    fingerprint_from_pk (keyblock->pkt->pkt.public_key, fprbin, &fprlen);
+    if (fprlen == 16 && desc.mode == KEYDB_SEARCH_MODE_FPR16
+        && !memcmp (fprbin, desc.u.fpr, 16))
+      ;
+    else if (fprlen == 16 && desc.mode == KEYDB_SEARCH_MODE_FPR
+             && !memcmp (fprbin, desc.u.fpr, 16)
+             && !desc.u.fpr[16]
+             && !desc.u.fpr[17]
+             && !desc.u.fpr[18]
+             && !desc.u.fpr[19])
+      ;
+    else if (fprlen == 20 && (desc.mode == KEYDB_SEARCH_MODE_FPR20
+                              || desc.mode == KEYDB_SEARCH_MODE_FPR)
+             && !memcmp (fprbin, desc.u.fpr, 20))
+      ;
+    else
+      {
+        log_error (_("\"%s\" is not the primary fingerprint\n"), fpr);
+        goto leave;
+      }
+  }
+
+  /* If we modified the keyblock, make sure the flags are right. */
+  if (modified)
+    merge_keys_and_selfsig (keyblock);
+
+  /* Give some info in verbose.  */
+  if (opt.verbose)
     {
     {
-      log_info ("error changing the passphrase for `%s': %s\n",
-               username, gpg_strerror (err));
-      write_status_error ("keyedit.passwd", err);
+      show_key_with_all_names (es_stdout, keyblock, 0,
+                               1/*with_revoker*/, 1/*with_fingerprint*/,
+                               0, 0, 1);
+      es_fflush (es_stdout);
+    }
+
+  pk = keyblock->pkt->pkt.public_key;
+  if (pk->flags.revoked)
+    {
+      if (!opt.verbose)
+        show_key_with_all_names (es_stdout, keyblock, 0, 0, 0, 0, 0, 1);
+      log_error ("%s%s", _("Key is revoked."), _("  Unable to sign.\n"));
+      goto leave;
+    }
+
+  /* Set the flags according to the UIDS list.  Fixme: We may want to
+     use classify_user_id along with dedicated compare functions so
+     that we match the same way as in the key lookup. */
+  any = 0;
+  menu_select_uid (keyblock, 0);   /* Better clear the flags first. */
+  for (sl=uids; sl; sl = sl->next)
+    {
+      for (node = keyblock; node; node = node->next)
+        {
+          if (node->pkt->pkttype == PKT_USER_ID)
+            {
+              PKT_user_id *uid = node->pkt->pkt.user_id;
+
+              if (!uid->attrib_data
+                  && ascii_memistr (uid->name, uid->len, sl->d))
+                {
+                  node->flag |= NODFLG_SELUID;
+                  any = 1;
+                }
+            }
+        }
+    }
+
+  if (uids && !any)
+    {
+      if (!opt.verbose)
+        show_key_with_all_names (es_stdout, keyblock, 0, 0, 0, 0, 0, 1);
+      es_fflush (es_stdout);
+      log_error ("%s  %s", _("No matching user IDs."), _("Nothing to sign.\n"));
+      goto leave;
+    }
+
+  /* Sign. */
+  sign_uids (es_stdout, keyblock, locusr, &modified, local, 0, 0, 0, 1);
+  es_fflush (es_stdout);
+
+  if (modified)
+    {
+      err = keydb_update_keyblock (kdbhd, keyblock);
+      if (err)
+        {
+          log_error (_("update failed: %s\n"), gpg_strerror (err));
+          goto leave;
+        }
     }
   else
     }
   else
-    write_status_text (STATUS_SUCCESS, "keyedit.passwd");
+    log_info (_("Key not changed so no update needed.\n"));
+
+  if (update_trust)
+    revalidation_mark ();
+
+
+ leave:
+  release_kbnode (keyblock);
+  keydb_release (kdbhd);
 }
 
 
 }
 
 
+\f
 static void
 tty_print_notations (int indent, PKT_signature * sig)
 {
 static void
 tty_print_notations (int indent, PKT_signature * sig)
 {
@@ -2624,13 +2659,16 @@ show_prefs (PKT_user_id * uid, PKT_signature * selfsig, int verbose)
    opt.with_colons is used.  It prints all available data in a easy to
    parse format and does not translate utf8 */
 static void
    opt.with_colons is used.  It prints all available data in a easy to
    parse format and does not translate utf8 */
 static void
-show_key_with_all_names_colon (KBNODE keyblock)
+show_key_with_all_names_colon (estream_t fp, kbnode_t keyblock)
 {
   KBNODE node;
   int i, j, ulti_hack = 0;
   byte pk_version = 0;
   PKT_public_key *primary = NULL;
 
 {
   KBNODE node;
   int i, j, ulti_hack = 0;
   byte pk_version = 0;
   PKT_public_key *primary = NULL;
 
+  if (!fp)
+    fp = es_stdout;
+
   /* the keys */
   for (node = keyblock; node; node = node->next)
     {
   /* the keys */
   for (node = keyblock; node; node = node->next)
     {
@@ -2648,46 +2686,46 @@ show_key_with_all_names_colon (KBNODE keyblock)
 
          keyid_from_pk (pk, keyid);
 
 
          keyid_from_pk (pk, keyid);
 
-         fputs (node->pkt->pkttype == PKT_PUBLIC_KEY ? "pub:" : "sub:",
-                stdout);
-         if (!pk->is_valid)
-           putchar ('i');
-         else if (pk->is_revoked)
-           putchar ('r');
+         es_fputs (node->pkt->pkttype == PKT_PUBLIC_KEY ? "pub:" : "sub:",
+                    fp);
+         if (!pk->flags.valid)
+           es_putc ('i', fp);
+         else if (pk->flags.revoked)
+           es_putc ('r', fp);
          else if (pk->has_expired)
          else if (pk->has_expired)
-           putchar ('e');
+           es_putc ('e', fp);
          else if (!(opt.fast_list_mode || opt.no_expensive_trust_checks))
            {
              int trust = get_validity_info (pk, NULL);
              if (trust == 'u')
                ulti_hack = 1;
          else if (!(opt.fast_list_mode || opt.no_expensive_trust_checks))
            {
              int trust = get_validity_info (pk, NULL);
              if (trust == 'u')
                ulti_hack = 1;
-             putchar (trust);
+             es_putc (trust, fp);
            }
 
            }
 
-         printf (":%u:%d:%08lX%08lX:%lu:%lu::",
-                 nbits_from_pk (pk),
-                 pk->pubkey_algo,
-                 (ulong) keyid[0], (ulong) keyid[1],
-                 (ulong) pk->timestamp, (ulong) pk->expiredate);
+         es_fprintf (fp, ":%u:%d:%08lX%08lX:%lu:%lu::",
+                      nbits_from_pk (pk),
+                      pk->pubkey_algo,
+                      (ulong) keyid[0], (ulong) keyid[1],
+                      (ulong) pk->timestamp, (ulong) pk->expiredate);
          if (node->pkt->pkttype == PKT_PUBLIC_KEY
              && !(opt.fast_list_mode || opt.no_expensive_trust_checks))
          if (node->pkt->pkttype == PKT_PUBLIC_KEY
              && !(opt.fast_list_mode || opt.no_expensive_trust_checks))
-           putchar (get_ownertrust_info (pk));
-         putchar (':');
-         putchar (':');
-         putchar (':');
+           es_putc (get_ownertrust_info (pk), fp);
+         es_putc (':', fp);
+         es_putc (':', fp);
+         es_putc (':', fp);
          /* Print capabilities.  */
          if ((pk->pubkey_usage & PUBKEY_USAGE_ENC))
          /* Print capabilities.  */
          if ((pk->pubkey_usage & PUBKEY_USAGE_ENC))
-           putchar ('e');
+           es_putc ('e', fp);
          if ((pk->pubkey_usage & PUBKEY_USAGE_SIG))
          if ((pk->pubkey_usage & PUBKEY_USAGE_SIG))
-           putchar ('s');
+           es_putc ('s', fp);
          if ((pk->pubkey_usage & PUBKEY_USAGE_CERT))
          if ((pk->pubkey_usage & PUBKEY_USAGE_CERT))
-           putchar ('c');
+           es_putc ('c', fp);
          if ((pk->pubkey_usage & PUBKEY_USAGE_AUTH))
          if ((pk->pubkey_usage & PUBKEY_USAGE_AUTH))
-           putchar ('a');
-         putchar ('\n');
+           es_putc ('a', fp);
+         es_putc ('\n', fp);
 
 
-         print_fingerprint (pk, NULL, 0);
-         print_revokers (pk);
+         print_fingerprint (fp, pk, 0);
+         print_revokers (fp, pk);
        }
     }
 
        }
     }
 
@@ -2702,16 +2740,16 @@ show_key_with_all_names_colon (KBNODE keyblock)
          ++i;
 
          if (uid->attrib_data)
          ++i;
 
          if (uid->attrib_data)
-           printf ("uat:");
+           es_fputs ("uat:", fp);
          else
          else
-           printf ("uid:");
+           es_fputs ("uid:", fp);
 
          if (uid->is_revoked)
 
          if (uid->is_revoked)
-           printf ("r::::::::");
+           es_fputs ("r::::::::", fp);
          else if (uid->is_expired)
          else if (uid->is_expired)
-           printf ("e::::::::");
+           es_fputs ("e::::::::", fp);
          else if (opt.fast_list_mode || opt.no_expensive_trust_checks)
          else if (opt.fast_list_mode || opt.no_expensive_trust_checks)
-           printf ("::::::::");
+           es_fputs ("::::::::", fp);
          else
            {
              int uid_validity;
          else
            {
              int uid_validity;
@@ -2720,19 +2758,19 @@ show_key_with_all_names_colon (KBNODE keyblock)
                uid_validity = get_validity_info (primary, uid);
              else
                uid_validity = 'u';
                uid_validity = get_validity_info (primary, uid);
              else
                uid_validity = 'u';
-             printf ("%c::::::::", uid_validity);
+             es_fprintf (fp, "%c::::::::", uid_validity);
            }
 
          if (uid->attrib_data)
            }
 
          if (uid->attrib_data)
-           printf ("%u %lu", uid->numattribs, uid->attrib_len);
+           es_fprintf (fp, "%u %lu", uid->numattribs, uid->attrib_len);
          else
          else
-           es_write_sanitized (es_stdout, uid->name, uid->len, ":", NULL);
+           es_write_sanitized (fp, uid->name, uid->len, ":", NULL);
 
 
-         putchar (':');
+         es_putc (':', fp);
          /* signature class */
          /* signature class */
-         putchar (':');
+         es_putc (':', fp);
          /* capabilities */
          /* capabilities */
-         putchar (':');
+         es_putc (':', fp);
          /* preferences */
          if (pk_version > 3 || uid->selfsigversion > 3)
            {
          /* preferences */
          if (pk_version > 3 || uid->selfsigversion > 3)
            {
@@ -2741,38 +2779,41 @@ show_key_with_all_names_colon (KBNODE keyblock)
              for (j = 0; prefs && prefs[j].type; j++)
                {
                  if (j)
              for (j = 0; prefs && prefs[j].type; j++)
                {
                  if (j)
-                   putchar (' ');
-                 printf ("%c%d", prefs[j].type == PREFTYPE_SYM ? 'S' :
-                         prefs[j].type == PREFTYPE_HASH ? 'H' :
-                         prefs[j].type == PREFTYPE_ZIP ? 'Z' : '?',
-                         prefs[j].value);
+                   es_putc (' ', fp);
+                 es_fprintf (fp,
+                              "%c%d", prefs[j].type == PREFTYPE_SYM ? 'S' :
+                              prefs[j].type == PREFTYPE_HASH ? 'H' :
+                              prefs[j].type == PREFTYPE_ZIP ? 'Z' : '?',
+                              prefs[j].value);
                }
              if (uid->flags.mdc)
                }
              if (uid->flags.mdc)
-               printf (",mdc");
+               es_fputs (",mdc", fp);
              if (!uid->flags.ks_modify)
              if (!uid->flags.ks_modify)
-               printf (",no-ks-modify");
+               es_fputs (",no-ks-modify", fp);
            }
            }
-         putchar (':');
+         es_putc (':', fp);
          /* flags */
          /* flags */
-         printf ("%d,", i);
+         es_fprintf (fp, "%d,", i);
          if (uid->is_primary)
          if (uid->is_primary)
-           putchar ('p');
+           es_putc ('p', fp);
          if (uid->is_revoked)
          if (uid->is_revoked)
-           putchar ('r');
+           es_putc ('r', fp);
          if (uid->is_expired)
          if (uid->is_expired)
-           putchar ('e');
+           es_putc ('e', fp);
          if ((node->flag & NODFLG_SELUID))
          if ((node->flag & NODFLG_SELUID))
-           putchar ('s');
+           es_putc ('s', fp);
          if ((node->flag & NODFLG_MARK_A))
          if ((node->flag & NODFLG_MARK_A))
-           putchar ('m');
-         putchar (':');
-         putchar ('\n');
+           es_putc ('m', fp);
+         es_putc (':', fp);
+         es_putc ('\n', fp);
        }
     }
 }
 
        }
     }
 }
 
+
 static void
 static void
-show_names (KBNODE keyblock, PKT_public_key * pk, unsigned int flag,
+show_names (estream_t fp,
+            KBNODE keyblock, PKT_public_key * pk, unsigned int flag,
            int with_prefs)
 {
   KBNODE node;
            int with_prefs)
 {
   KBNODE node;
@@ -2787,18 +2828,18 @@ show_names (KBNODE keyblock, PKT_public_key * pk, unsigned int flag,
          if (!flag || (flag && (node->flag & flag)))
            {
              if (!(flag & NODFLG_MARK_A) && pk)
          if (!flag || (flag && (node->flag & flag)))
            {
              if (!(flag & NODFLG_MARK_A) && pk)
-               tty_printf ("%s ", uid_trust_string_fixed (pk, uid));
+               tty_fprintf (fp, "%s ", uid_trust_string_fixed (pk, uid));
 
              if (flag & NODFLG_MARK_A)
 
              if (flag & NODFLG_MARK_A)
-               tty_printf ("     ");
+               tty_fprintf (fp, "     ");
              else if (node->flag & NODFLG_SELUID)
              else if (node->flag & NODFLG_SELUID)
-               tty_printf ("(%d)* ", i);
+               tty_fprintf (fp, "(%d)* ", i);
              else if (uid->is_primary)
              else if (uid->is_primary)
-               tty_printf ("(%d). ", i);
+               tty_fprintf (fp, "(%d). ", i);
              else
              else
-               tty_printf ("(%d)  ", i);
-             tty_print_utf8_string (uid->name, uid->len);
-             tty_printf ("\n");
+               tty_fprintf (fp, "(%d)  ", i);
+             tty_print_utf8_string2 (fp, uid->name, uid->len, 0);
+             tty_fprintf (fp, "\n");
              if (with_prefs && pk)
                {
                  if (pk->version > 3 || uid->selfsigversion > 3)
              if (with_prefs && pk)
                {
                  if (pk->version > 3 || uid->selfsigversion > 3)
@@ -2821,8 +2862,8 @@ show_names (KBNODE keyblock, PKT_public_key * pk, unsigned int flag,
                      show_prefs (uid, selfsig, with_prefs == 2);
                    }
                  else
                      show_prefs (uid, selfsig, with_prefs == 2);
                    }
                  else
-                   tty_printf (_("There are no preferences on a"
-                                 " PGP 2.x-style user ID.\n"));
+                   tty_fprintf (fp, _("There are no preferences on a"
+                                       " PGP 2.x-style user ID.\n"));
                }
            }
        }
                }
            }
        }
@@ -2831,22 +2872,26 @@ show_names (KBNODE keyblock, PKT_public_key * pk, unsigned int flag,
 
 
 /*
 
 
 /*
- * Display the key a the user ids, if only_marked is true, do only
- * so for user ids with mark A flag set and dont display the index number
+ * Display the key a the user ids, if only_marked is true, do only so
+ * for user ids with mark A flag set and do not display the index
+ * number.  If FP is not NULL print to the given stream and not to the
+ * tty (ignored in with-colons mode).
  */
 static void
  */
 static void
-show_key_with_all_names (KBNODE keyblock, int only_marked, int with_revoker,
-                        int with_fpr, int with_subkeys, int with_prefs)
+show_key_with_all_names (estream_t fp,
+                         KBNODE keyblock, int only_marked, int with_revoker,
+                        int with_fpr, int with_subkeys, int with_prefs,
+                         int nowarn)
 {
   KBNODE node;
   int i;
   int do_warn = 0;
 {
   KBNODE node;
   int i;
   int do_warn = 0;
-  byte pk_version = 0;
   PKT_public_key *primary = NULL;
   PKT_public_key *primary = NULL;
+  char pkstrbuf[PUBKEY_STRING_SIZE];
 
   if (opt.with_colons)
     {
 
   if (opt.with_colons)
     {
-      show_key_with_all_names_colon (keyblock);
+      show_key_with_all_names_colon (fp, keyblock);
       return;
     }
 
       return;
     }
 
@@ -2858,7 +2903,8 @@ show_key_with_all_names (KBNODE keyblock, int only_marked, int with_revoker,
              && !is_deleted_kbnode (node)))
        {
          PKT_public_key *pk = node->pkt->pkt.public_key;
              && !is_deleted_kbnode (node)))
        {
          PKT_public_key *pk = node->pkt->pkt.public_key;
-         const char *otrust = "err", *trust = "err";
+         const char *otrust = "err";
+         const char *trust = "err";
 
          if (node->pkt->pkttype == PKT_PUBLIC_KEY)
            {
 
          if (node->pkt->pkttype == PKT_PUBLIC_KEY)
            {
@@ -2877,16 +2923,17 @@ show_key_with_all_names (KBNODE keyblock, int only_marked, int with_revoker,
                  do_warn = 1;
                }
 
                  do_warn = 1;
                }
 
-             pk_version = pk->version;
              primary = pk;
            }
 
              primary = pk;
            }
 
-         if (pk->is_revoked)
+         if (pk->flags.revoked)
            {
              char *user = get_user_id_string_native (pk->revoked.keyid);
            {
              char *user = get_user_id_string_native (pk->revoked.keyid);
-             const char *algo = gcry_pk_algo_name (pk->revoked.algo);
-             tty_printf (_("This key was revoked on %s by %s key %s\n"),
-                         revokestr_from_pk (pk), algo ? algo : "?", user);
+              tty_fprintf (fp,
+                           _("The following key was revoked on"
+                            " %s by %s key %s\n"),
+                         revokestr_from_pk (pk),
+                          gcry_pk_algo_name (pk->revoked.algo), user);
              xfree (user);
            }
 
              xfree (user);
            }
 
@@ -2906,44 +2953,82 @@ show_key_with_all_names (KBNODE keyblock, int only_marked, int with_revoker,
                                            MAX_FINGERPRINT_LEN, r_keyid);
 
                    user = get_user_id_string_native (r_keyid);
                                            MAX_FINGERPRINT_LEN, r_keyid);
 
                    user = get_user_id_string_native (r_keyid);
-                   tty_printf (_("This key may be revoked by %s key %s"),
-                               algo ? algo : "?", user);
+                   tty_fprintf (fp,
+                                 _("This key may be revoked by %s key %s"),
+                                 algo ? algo : "?", user);
 
                    if (pk->revkey[i].class & 0x40)
                      {
 
                    if (pk->revkey[i].class & 0x40)
                      {
-                       tty_printf (" ");
-                       tty_printf (_("(sensitive)"));
+                       tty_fprintf (fp, " ");
+                       tty_fprintf (fp, _("(sensitive)"));
                      }
 
                      }
 
-                   tty_printf ("\n");
+                   tty_fprintf (fp, "\n");
                    xfree (user);
                  }
            }
 
          keyid_from_pk (pk, NULL);
                    xfree (user);
                  }
            }
 
          keyid_from_pk (pk, NULL);
-         tty_printf ("%s%c %4u%c/%s  ",
-                     node->pkt->pkttype == PKT_PUBLIC_KEY ? "pub" : "sub",
+         tty_fprintf (fp, "%s%c %s/%s",
+                     node->pkt->pkttype == PKT_PUBLIC_KEY ? "pub" :
+                     node->pkt->pkttype == PKT_PUBLIC_SUBKEY ? "sub" :
+                     node->pkt->pkttype == PKT_SECRET_KEY ? "sec" : "ssb",
                      (node->flag & NODFLG_SELKEY) ? '*' : ' ',
                      (node->flag & NODFLG_SELKEY) ? '*' : ' ',
-                     nbits_from_pk (pk),
-                     pubkey_letter (pk->pubkey_algo), keystr (pk->keyid));
-
-         tty_printf (_("created: %s"), datestr_from_pk (pk));
-         tty_printf ("  ");
-         if (pk->is_revoked)
-           tty_printf (_("revoked: %s"), revokestr_from_pk (pk));
+                      pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
+                     keystr (pk->keyid));
+
+          if (opt.legacy_list_mode)
+            tty_fprintf (fp, "  ");
+          else
+            tty_fprintf (fp, "\n     ");
+
+          tty_fprintf (fp, _("created: %s"), datestr_from_pk (pk));
+         tty_fprintf (fp, "  ");
+         if (pk->flags.revoked)
+           tty_fprintf (fp, _("revoked: %s"), revokestr_from_pk (pk));
          else if (pk->has_expired)
          else if (pk->has_expired)
-           tty_printf (_("expired: %s"), expirestr_from_pk (pk));
+           tty_fprintf (fp, _("expired: %s"), expirestr_from_pk (pk));
          else
          else
-           tty_printf (_("expires: %s"), expirestr_from_pk (pk));
-         tty_printf ("  ");
-         tty_printf (_("usage: %s"), usagestr_from_pk (pk));
-         tty_printf ("\n");
+           tty_fprintf (fp, _("expires: %s"), expirestr_from_pk (pk));
+         tty_fprintf (fp, "  ");
+         tty_fprintf (fp, _("usage: %s"), usagestr_from_pk (pk, 1));
+         tty_fprintf (fp, "\n");
+
+         if (pk->seckey_info
+              && pk->seckey_info->is_protected
+              && pk->seckey_info->s2k.mode == 1002)
+           {
+             tty_fprintf (fp, "%*s%s", opt.legacy_list_mode? 21:5, "",
+                           _("card-no: "));
+             if (pk->seckey_info->ivlen == 16
+                 && !memcmp (pk->seckey_info->iv,
+                              "\xD2\x76\x00\x01\x24\x01", 6))
+               {
+                  /* This is an OpenPGP card. */
+                 for (i = 8; i < 14; i++)
+                   {
+                     if (i == 10)
+                       tty_fprintf (fp, " ");
+                     tty_fprintf (fp, "%02X", pk->seckey_info->iv[i]);
+                   }
+               }
+             else
+               {
+                  /* Unknown card: Print all. */
+                 for (i = 0; i < pk->seckey_info->ivlen; i++)
+                   tty_fprintf (fp, "%02X", pk->seckey_info->iv[i]);
+               }
+             tty_fprintf (fp, "\n");
+           }
 
 
-         if (node->pkt->pkttype == PKT_PUBLIC_KEY)
+         if (node->pkt->pkttype == PKT_PUBLIC_KEY
+              || node->pkt->pkttype == PKT_SECRET_KEY)
            {
              if (opt.trust_model != TM_ALWAYS)
                {
            {
              if (opt.trust_model != TM_ALWAYS)
                {
-                 tty_printf ("%*s", (int) keystrlen () + 13, "");
+                 tty_fprintf (fp, "%*s",
+                               opt.legacy_list_mode?
+                               ((int) keystrlen () + 13):5, "");
                  /* Ownertrust is only meaningful for the PGP or
                     classic trust models */
                  if (opt.trust_model == TM_PGP
                  /* Ownertrust is only meaningful for the PGP or
                     classic trust models */
                  if (opt.trust_model == TM_PGP
@@ -2952,71 +3037,38 @@ show_key_with_all_names (KBNODE keyblock, int only_marked, int with_revoker,
                      int width = 14 - strlen (otrust);
                      if (width <= 0)
                        width = 1;
                      int width = 14 - strlen (otrust);
                      if (width <= 0)
                        width = 1;
-                     tty_printf (_("trust: %s"), otrust);
-                     tty_printf ("%*s", width, "");
+                     tty_fprintf (fp, _("trust: %s"), otrust);
+                     tty_fprintf (fp, "%*s", width, "");
                    }
 
                    }
 
-                 tty_printf (_("validity: %s"), trust);
-                 tty_printf ("\n");
+                 tty_fprintf (fp, _("validity: %s"), trust);
+                 tty_fprintf (fp, "\n");
                }
              if (node->pkt->pkttype == PKT_PUBLIC_KEY
                  && (get_ownertrust (pk) & TRUST_FLAG_DISABLED))
                {
                }
              if (node->pkt->pkttype == PKT_PUBLIC_KEY
                  && (get_ownertrust (pk) & TRUST_FLAG_DISABLED))
                {
-                 tty_printf ("*** ");
-                 tty_printf (_("This key has been disabled"));
-                 tty_printf ("\n");
+                 tty_fprintf (fp, "*** ");
+                 tty_fprintf (fp, _("This key has been disabled"));
+                 tty_fprintf (fp, "\n");
                }
            }
 
                }
            }
 
-         if (node->pkt->pkttype == PKT_PUBLIC_KEY && with_fpr)
+         if ((node->pkt->pkttype == PKT_PUBLIC_KEY
+               || node->pkt->pkttype == PKT_SECRET_KEY) && with_fpr)
            {
            {
-             print_fingerprint (pk, NULL, 2);
-             tty_printf ("\n");
-           }
-       }
-      else if (node->pkt->pkttype == PKT_SECRET_KEY
-              || (with_subkeys && node->pkt->pkttype == PKT_SECRET_SUBKEY))
-       {
-         PKT_secret_key *sk = node->pkt->pkt.secret_key;
-         tty_printf ("%s%c %4u%c/%s  ",
-                     node->pkt->pkttype == PKT_SECRET_KEY ? "sec" : "ssb",
-                     (node->flag & NODFLG_SELKEY) ? '*' : ' ',
-                     nbits_from_sk (sk),
-                     pubkey_letter (sk->pubkey_algo), keystr_from_sk (sk));
-         tty_printf (_("created: %s"), datestr_from_sk (sk));
-         tty_printf ("  ");
-         tty_printf (_("expires: %s"), expirestr_from_sk (sk));
-         tty_printf ("\n");
-         if (sk->is_protected && sk->protect.s2k.mode == 1002)
-           {
-             tty_printf ("                     ");
-             tty_printf (_("card-no: "));
-             if (sk->protect.ivlen == 16
-                 && !memcmp (sk->protect.iv, "\xD2\x76\x00\x01\x24\x01", 6))
-               {               /* This is an OpenPGP card. */
-                 for (i = 8; i < 14; i++)
-                   {
-                     if (i == 10)
-                       tty_printf (" ");
-                     tty_printf ("%02X", sk->protect.iv[i]);
-                   }
-               }
-             else
-               {               /* Something is wrong: Print all. */
-                 for (i = 0; i < sk->protect.ivlen; i++)
-                   tty_printf ("%02X", sk->protect.iv[i]);
-               }
-             tty_printf ("\n");
+              print_fingerprint (fp, pk, 2);
+             tty_fprintf (fp, "\n");
            }
        }
     }
 
            }
        }
     }
 
-  show_names (keyblock, primary, only_marked ? NODFLG_MARK_A : 0, with_prefs);
+  show_names (fp,
+              keyblock, primary, only_marked ? NODFLG_MARK_A : 0, with_prefs);
 
 
-  if (do_warn)
-    tty_printf (_("Please note that the shown key validity"
-                 " is not necessarily correct\n"
-                 "unless you restart the program.\n"));
+  if (do_warn && !nowarn)
+    tty_fprintf (fp, _("Please note that the shown key validity"
+                       " is not necessarily correct\n"
+                       "unless you restart the program.\n"));
 }
 
 
 }
 
 
@@ -3029,39 +3081,29 @@ show_basic_key_info (KBNODE keyblock)
 {
   KBNODE node;
   int i;
 {
   KBNODE node;
   int i;
+  char pkstrbuf[PUBKEY_STRING_SIZE];
 
   /* The primary key */
   for (node = keyblock; node; node = node->next)
     {
 
   /* The primary key */
   for (node = keyblock; node; node = node->next)
     {
-      if (node->pkt->pkttype == PKT_PUBLIC_KEY)
+      if (node->pkt->pkttype == PKT_PUBLIC_KEY
+          || node->pkt->pkttype == PKT_SECRET_KEY)
        {
          PKT_public_key *pk = node->pkt->pkt.public_key;
 
          /* Note, we use the same format string as in other show
             functions to make the translation job easier. */
        {
          PKT_public_key *pk = node->pkt->pkt.public_key;
 
          /* Note, we use the same format string as in other show
             functions to make the translation job easier. */
-         tty_printf ("%s  %4u%c/%s  ",
-                     node->pkt->pkttype == PKT_PUBLIC_KEY ? "pub" : "sub",
-                     nbits_from_pk (pk),
-                     pubkey_letter (pk->pubkey_algo), keystr_from_pk (pk));
+         tty_printf ("%s  %s/%s  ",
+                     node->pkt->pkttype == PKT_PUBLIC_KEY ? "pub" :
+                     node->pkt->pkttype == PKT_PUBLIC_SUBKEY ? "sub" :
+                     node->pkt->pkttype == PKT_SECRET_KEY ? "sec" :"ssb",
+                      pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
+                     keystr_from_pk (pk));
          tty_printf (_("created: %s"), datestr_from_pk (pk));
          tty_printf ("  ");
          tty_printf (_("expires: %s"), expirestr_from_pk (pk));
          tty_printf ("\n");
          tty_printf (_("created: %s"), datestr_from_pk (pk));
          tty_printf ("  ");
          tty_printf (_("expires: %s"), expirestr_from_pk (pk));
          tty_printf ("\n");
-         print_fingerprint (pk, NULL, 3);
-         tty_printf ("\n");
-       }
-      else if (node->pkt->pkttype == PKT_SECRET_KEY)
-       {
-         PKT_secret_key *sk = node->pkt->pkt.secret_key;
-         tty_printf ("%s  %4u%c/%s",
-                     node->pkt->pkttype == PKT_SECRET_KEY ? "sec" : "ssb",
-                     nbits_from_sk (sk),
-                     pubkey_letter (sk->pubkey_algo), keystr_from_sk (sk));
-         tty_printf (_("created: %s"), datestr_from_sk (sk));
-         tty_printf ("  ");
-         tty_printf (_("expires: %s"), expirestr_from_sk (sk));
-         tty_printf ("\n");
-         print_fingerprint (NULL, sk, 3);
+         print_fingerprint (NULL, pk, 3);
          tty_printf ("\n");
        }
     }
          tty_printf ("\n");
        }
     }
@@ -3090,16 +3132,17 @@ show_key_and_fingerprint (KBNODE keyblock)
 {
   KBNODE node;
   PKT_public_key *pk = NULL;
 {
   KBNODE node;
   PKT_public_key *pk = NULL;
+  char pkstrbuf[PUBKEY_STRING_SIZE];
 
   for (node = keyblock; node; node = node->next)
     {
       if (node->pkt->pkttype == PKT_PUBLIC_KEY)
        {
          pk = node->pkt->pkt.public_key;
 
   for (node = keyblock; node; node = node->next)
     {
       if (node->pkt->pkttype == PKT_PUBLIC_KEY)
        {
          pk = node->pkt->pkt.public_key;
-         tty_printf ("pub   %4u%c/%s %s ",
-                     nbits_from_pk (pk),
-                     pubkey_letter (pk->pubkey_algo),
-                     keystr_from_pk (pk), datestr_from_pk (pk));
+         tty_printf ("pub   %s/%s %s ",
+                      pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
+                      keystr_from_pk(pk),
+                      datestr_from_pk (pk));
        }
       else if (node->pkt->pkttype == PKT_USER_ID)
        {
        }
       else if (node->pkt->pkttype == PKT_USER_ID)
        {
@@ -3110,7 +3153,7 @@ show_key_and_fingerprint (KBNODE keyblock)
     }
   tty_printf ("\n");
   if (pk)
     }
   tty_printf ("\n");
   if (pk)
-    print_fingerprint (pk, NULL, 2);
+    print_fingerprint (NULL, pk, 2);
 }
 
 
 }
 
 
@@ -3221,7 +3264,7 @@ menu_adduid (KBNODE pub_keyblock, int photo, const char *photo_name)
     return 0;
 
   err = make_keysig_packet (&sig, pk, uid, NULL, pk, 0x13, 0, 0, 0, 0,
     return 0;
 
   err = make_keysig_packet (&sig, pk, uid, NULL, pk, 0x13, 0, 0, 0, 0,
-                            keygen_add_std_prefs, pk);
+                            keygen_add_std_prefs, pk, NULL);
   if (err)
     {
       log_error ("signing failed: %s\n", g10_errstr (err));
   if (err)
     {
       log_error ("signing failed: %s\n", g10_errstr (err));
@@ -3314,21 +3357,21 @@ menu_delsig (KBNODE pub_keyblock)
 
          if (valid)
            {
 
          if (valid)
            {
-             okay = cpr_get_answer_yes_no_quit 
+             okay = cpr_get_answer_yes_no_quit
                 ("keyedit.delsig.valid",
                  _("Delete this good signature? (y/N/q)"));
                 ("keyedit.delsig.valid",
                  _("Delete this good signature? (y/N/q)"));
-              
+
              /* Only update trust if we delete a good signature.
                 The other two cases do not affect trust. */
              if (okay)
                update_trust = 1;
            }
          else if (inv_sig || other_err)
              /* Only update trust if we delete a good signature.
                 The other two cases do not affect trust. */
              if (okay)
                update_trust = 1;
            }
          else if (inv_sig || other_err)
-           okay = cpr_get_answer_yes_no_quit 
+           okay = cpr_get_answer_yes_no_quit
               ("keyedit.delsig.invalid",
                _("Delete this invalid signature? (y/N/q)"));
          else if (no_key)
               ("keyedit.delsig.invalid",
                _("Delete this invalid signature? (y/N/q)"));
          else if (no_key)
-           okay = cpr_get_answer_yes_no_quit 
+           okay = cpr_get_answer_yes_no_quit
               ("keyedit.delsig.unknown",
                _("Delete this unknown signature? (y/N/q)"));
 
               ("keyedit.delsig.unknown",
                _("Delete this unknown signature? (y/N/q)"));
 
@@ -3457,7 +3500,7 @@ menu_delkey (KBNODE pub_keyblock)
  * the keyblock.  Returns true if there is a new revoker.
  */
 static int
  * the keyblock.  Returns true if there is a new revoker.
  */
 static int
-menu_addrevoker (KBNODE pub_keyblock, int sensitive)
+menu_addrevoker (ctrl_t ctrl, kbnode_t pub_keyblock, int sensitive)
 {
   PKT_public_key *pk = NULL;
   PKT_public_key *revoker_pk = NULL;
 {
   PKT_public_key *pk = NULL;
   PKT_public_key *revoker_pk = NULL;
@@ -3501,14 +3544,12 @@ menu_addrevoker (KBNODE pub_keyblock, int sensitive)
     {
       char *answer;
 
     {
       char *answer;
 
-      if (revoker_pk)
-       free_public_key (revoker_pk);
-
+      free_public_key (revoker_pk);
       revoker_pk = xmalloc_clear (sizeof (*revoker_pk));
 
       tty_printf ("\n");
 
       revoker_pk = xmalloc_clear (sizeof (*revoker_pk));
 
       tty_printf ("\n");
 
-      answer = cpr_get_utf8 
+      answer = cpr_get_utf8
         ("keyedit.add_revoker",
          _("Enter the user ID of the designated revoker: "));
       if (answer[0] == '\0' || answer[0] == CONTROL_D)
         ("keyedit.add_revoker",
          _("Enter the user ID of the designated revoker: "));
       if (answer[0] == '\0' || answer[0] == CONTROL_D)
@@ -3521,7 +3562,7 @@ menu_addrevoker (KBNODE pub_keyblock, int sensitive)
          primary keys only, but some casual testing shows that PGP and
          GnuPG both can handle a designated revocation from a subkey. */
       revoker_pk->req_usage = PUBKEY_USAGE_CERT;
          primary keys only, but some casual testing shows that PGP and
          GnuPG both can handle a designated revocation from a subkey. */
       revoker_pk->req_usage = PUBKEY_USAGE_CERT;
-      rc = get_pubkey_byname (NULL, revoker_pk, answer, NULL, NULL, 1, 1);
+      rc = get_pubkey_byname (ctrl, NULL, revoker_pk, answer, NULL, NULL, 1, 1);
       if (rc)
        {
          log_error (_("key \"%s\" not found: %s\n"), answer,
       if (rc)
        {
          log_error (_("key \"%s\" not found: %s\n"), answer,
@@ -3588,7 +3629,7 @@ menu_addrevoker (KBNODE pub_keyblock, int sensitive)
        }
 
       print_pubkey_info (NULL, revoker_pk);
        }
 
       print_pubkey_info (NULL, revoker_pk);
-      print_fingerprint (revoker_pk, NULL, 2);
+      print_fingerprint (NULL, revoker_pk, 2);
       tty_printf ("\n");
 
       tty_printf (_("WARNING: appointing a key as a designated revoker "
       tty_printf ("\n");
 
       tty_printf (_("WARNING: appointing a key as a designated revoker "
@@ -3609,7 +3650,7 @@ menu_addrevoker (KBNODE pub_keyblock, int sensitive)
   /* The 1F signature must be at least v4 to carry the revocation key
      subpacket. */
   rc = make_keysig_packet (&sig, pk, NULL, NULL, pk, 0x1F, 0, 4, 0, 0,
   /* The 1F signature must be at least v4 to carry the revocation key
      subpacket. */
   rc = make_keysig_packet (&sig, pk, NULL, NULL, pk, 0x1F, 0, 4, 0, 0,
-                          keygen_add_revkey, &revkey);
+                          keygen_add_revkey, &revkey, NULL);
   if (rc)
     {
       log_error ("signing failed: %s\n", g10_errstr (rc));
   if (rc)
     {
       log_error ("signing failed: %s\n", g10_errstr (rc));
@@ -3627,8 +3668,7 @@ menu_addrevoker (KBNODE pub_keyblock, int sensitive)
 fail:
   if (sig)
     free_seckey_enc (sig);
 fail:
   if (sig)
     free_seckey_enc (sig);
-  if (revoker_pk)
-    free_public_key (revoker_pk);
+  free_public_key (revoker_pk);
 
   return 0;
 }
 
   return 0;
 }
@@ -3701,7 +3741,7 @@ menu_expire (KBNODE pub_keyblock)
              if ((mainkey && main_pk->version < 4)
                  || (!mainkey && sub_pk->version < 4))
                {
              if ((mainkey && main_pk->version < 4)
                  || (!mainkey && sub_pk->version < 4))
                {
-                 log_info 
+                 log_info
                     (_("You can't change the expiration date of a v3 key\n"));
                  return 0;
                }
                     (_("You can't change the expiration date of a v3 key\n"));
                  return 0;
                }
@@ -3767,7 +3807,7 @@ menu_backsign (KBNODE pub_keyblock)
        {
          if (node->pkt->pkt.public_key->pubkey_usage & PUBKEY_USAGE_SIG)
            {
        {
          if (node->pkt->pkt.public_key->pubkey_usage & PUBKEY_USAGE_SIG)
            {
-             if (node->pkt->pkt.public_key->backsig)
+             if (node->pkt->pkt.public_key->flags.backsig)
                tty_printf (_
                            ("signing subkey %s is already cross-certified\n"),
                            keystr_from_pk (node->pkt->pkt.public_key));
                tty_printf (_
                            ("signing subkey %s is already cross-certified\n"),
                            keystr_from_pk (node->pkt->pkt.public_key));
@@ -3809,7 +3849,7 @@ menu_backsign (KBNODE pub_keyblock)
       /* Now we can get to work.  */
 
       rc = make_backsig (sig_pk->pkt->pkt.signature, main_pk, sub_pk, sub_pk,
       /* Now we can get to work.  */
 
       rc = make_backsig (sig_pk->pkt->pkt.signature, main_pk, sub_pk, sub_pk,
-                        timestamp);
+                        timestamp, NULL);
       if (!rc)
        {
          PKT_signature *newsig;
       if (!rc)
        {
          PKT_signature *newsig;
@@ -3996,7 +4036,7 @@ menu_set_primary_uid (KBNODE pub_keyblock)
 }
 
 
 }
 
 
-/* 
+/*
  * Set preferences to new values for the selected user IDs
  */
 static int
  * Set preferences to new values for the selected user IDs
  */
 static int
@@ -4051,7 +4091,7 @@ menu_set_preferences (KBNODE pub_keyblock)
                }
              else
                {
                }
              else
                {
-                 /* This is a selfsignature which is to be replaced 
+                 /* This is a selfsignature which is to be replaced
                   * We have to ignore v3 signatures because they are
                   * not able to carry the preferences.  */
                  PKT_signature *newsig;
                   * We have to ignore v3 signatures because they are
                   * not able to carry the preferences.  */
                  PKT_signature *newsig;
@@ -4178,7 +4218,7 @@ menu_set_keyserver_url (const char *url, KBNODE pub_keyblock)
                                  " ID \"%s\": ", user);
                      tty_print_utf8_string (p, plen);
                      tty_printf ("\n");
                                  " ID \"%s\": ", user);
                      tty_print_utf8_string (p, plen);
                      tty_printf ("\n");
-                     if (!cpr_get_answer_is_yes 
+                     if (!cpr_get_answer_is_yes
                           ("keyedit.confirm_keyserver",
                            uri
                            ? _("Are you sure you want to replace it? (y/N) ")
                           ("keyedit.confirm_keyserver",
                            uri
                            ? _("Are you sure you want to replace it? (y/N) ")
@@ -4709,12 +4749,12 @@ ask_revoke_sig (KBNODE keyblock, KBNODE node)
       tty_printf (_("This signature expired on %s.\n"),
                  expirestr_from_sig (sig));
       /* Use a different question so we can have different help text */
       tty_printf (_("This signature expired on %s.\n"),
                  expirestr_from_sig (sig));
       /* Use a different question so we can have different help text */
-      doit = cpr_get_answer_is_yes 
+      doit = cpr_get_answer_is_yes
         ("ask_revoke_sig.expired",
          _("Are you sure you still want to revoke it? (y/N) "));
     }
   else
         ("ask_revoke_sig.expired",
          _("Are you sure you still want to revoke it? (y/N) "));
     }
   else
-    doit = cpr_get_answer_is_yes 
+    doit = cpr_get_answer_is_yes
       ("ask_revoke_sig.one",
        _("Create a revocation certificate for this signature? (y/N) "));
 
       ("ask_revoke_sig.one",
        _("Create a revocation certificate for this signature? (y/N) "));
 
@@ -4858,7 +4898,7 @@ menu_revsig (KBNODE keyblock)
   if (!any)
     return 0;                  /* none selected */
 
   if (!any)
     return 0;                  /* none selected */
 
-  if (!cpr_get_answer_is_yes 
+  if (!cpr_get_answer_is_yes
       ("ask_revoke_sig.okay",
        _("Really create the revocation certificates? (y/N) ")))
     return 0;                  /* forget it */
       ("ask_revoke_sig.okay",
        _("Really create the revocation certificates? (y/N) ")))
     return 0;                  /* forget it */
@@ -4900,7 +4940,7 @@ reloop:                   /* (must use this, because we are modifing the list) */
       rc = make_keysig_packet (&sig, primary_pk,
                               unode->pkt->pkt.user_id,
                               NULL, signerkey, 0x30, 0, 0, 0, 0,
       rc = make_keysig_packet (&sig, primary_pk,
                               unode->pkt->pkt.user_id,
                               NULL, signerkey, 0x30, 0, 0, 0, 0,
-                               sign_mk_attrib, &attrib);
+                               sign_mk_attrib, &attrib, NULL);
       free_public_key (signerkey);
       if (rc)
        {
       free_public_key (signerkey);
       if (rc)
        {
@@ -4992,7 +5032,7 @@ menu_revuid (KBNODE pub_keyblock)
 
            rc = make_keysig_packet (&sig, pk, uid, NULL, pk, 0x30, 0,
                                     (reason == NULL) ? 3 : 0, timestamp, 0,
 
            rc = make_keysig_packet (&sig, pk, uid, NULL, pk, 0x30, 0,
                                     (reason == NULL) ? 3 : 0, timestamp, 0,
-                                    sign_mk_attrib, &attrib);
+                                    sign_mk_attrib, &attrib, NULL);
            if (rc)
              {
                log_error (_("signing failed: %s\n"), g10_errstr (rc));
            if (rc)
              {
                log_error (_("signing failed: %s\n"), g10_errstr (rc));
@@ -5005,12 +5045,14 @@ menu_revuid (KBNODE pub_keyblock)
                pkt->pkt.signature = sig;
                insert_kbnode (node, new_kbnode (pkt), 0);
 
                pkt->pkt.signature = sig;
                insert_kbnode (node, new_kbnode (pkt), 0);
 
+#ifndef NO_TRUST_MODELS
                /* If the trustdb has an entry for this key+uid then the
                   trustdb needs an update. */
                if (!update_trust
                    && (get_validity (pk, uid) & TRUST_MASK) >=
                    TRUST_UNDEFINED)
                  update_trust = 1;
                /* If the trustdb has an entry for this key+uid then the
                   trustdb needs an update. */
                if (!update_trust
                    && (get_validity (pk, uid) & TRUST_MASK) >=
                    TRUST_UNDEFINED)
                  update_trust = 1;
+#endif /*!NO_TRUST_MODELS*/
 
                changed = 1;
                node->pkt->pkt.user_id->is_revoked = 1;
 
                changed = 1;
                node->pkt->pkt.user_id->is_revoked = 1;
@@ -5041,7 +5083,7 @@ menu_revkey (KBNODE pub_keyblock)
   PACKET *pkt;
   PKT_signature *sig;
 
   PACKET *pkt;
   PKT_signature *sig;
 
-  if (pk->is_revoked)
+  if (pk->flags.revoked)
     {
       tty_printf (_("Key %s is already revoked.\n"), keystr_from_pk (pk));
       return 0;
     {
       tty_printf (_("Key %s is already revoked.\n"), keystr_from_pk (pk));
       return 0;
@@ -5054,7 +5096,7 @@ menu_revkey (KBNODE pub_keyblock)
 
   rc = make_keysig_packet (&sig, pk, NULL, NULL, pk,
                           0x20, 0, opt.force_v4_certs ? 4 : 0, 0, 0,
 
   rc = make_keysig_packet (&sig, pk, NULL, NULL, pk,
                           0x20, 0, opt.force_v4_certs ? 4 : 0, 0, 0,
-                          revocation_reason_build_cb, reason);
+                          revocation_reason_build_cb, reason, NULL);
   if (rc)
     {
       log_error (_("signing failed: %s\n"), g10_errstr (rc));
   if (rc)
     {
       log_error (_("signing failed: %s\n"), g10_errstr (rc));
@@ -5102,7 +5144,7 @@ menu_revsubkey (KBNODE pub_keyblock)
          PKT_public_key *subpk = node->pkt->pkt.public_key;
          struct sign_attrib attrib;
 
          PKT_public_key *subpk = node->pkt->pkt.public_key;
          struct sign_attrib attrib;
 
-         if (subpk->is_revoked)
+         if (subpk->flags.revoked)
            {
              tty_printf (_("Subkey %s is already revoked.\n"),
                          keystr_from_pk (subpk));
            {
              tty_printf (_("Subkey %s is already revoked.\n"),
                          keystr_from_pk (subpk));
@@ -5114,7 +5156,8 @@ menu_revsubkey (KBNODE pub_keyblock)
 
          node->flag &= ~NODFLG_SELKEY;
          rc = make_keysig_packet (&sig, mainpk, NULL, subpk, mainpk,
 
          node->flag &= ~NODFLG_SELKEY;
          rc = make_keysig_packet (&sig, mainpk, NULL, subpk, mainpk,
-                                  0x28, 0, 0, 0, 0, sign_mk_attrib, &attrib);
+                                  0x28, 0, 0, 0, 0, sign_mk_attrib, &attrib,
+                                   NULL);
          if (rc)
            {
              log_error (_("signing failed: %s\n"), g10_errstr (rc));
          if (rc)
            {
              log_error (_("signing failed: %s\n"), g10_errstr (rc));
@@ -5122,7 +5165,7 @@ menu_revsubkey (KBNODE pub_keyblock)
              return changed;
            }
          changed = 1;          /* we changed the keyblock */
              return changed;
            }
          changed = 1;          /* we changed the keyblock */
-          
+
          pkt = xmalloc_clear (sizeof *pkt);
          pkt->pkttype = PKT_SIGNATURE;
          pkt->pkt.signature = sig;
          pkt = xmalloc_clear (sizeof *pkt);
          pkt->pkttype = PKT_SIGNATURE;
          pkt->pkt.signature = sig;
@@ -5145,6 +5188,7 @@ menu_revsubkey (KBNODE pub_keyblock)
    enabling or disabling a key.  This is arguably sub-optimal as
    disabled keys are still counted in the web of trust, but perhaps
    not worth adding extra complexity to change. -ds */
    enabling or disabling a key.  This is arguably sub-optimal as
    disabled keys are still counted in the web of trust, but perhaps
    not worth adding extra complexity to change. -ds */
+#ifndef NO_TRUST_MODELS
 static int
 enable_disable_key (KBNODE keyblock, int disable)
 {
 static int
 enable_disable_key (KBNODE keyblock, int disable)
 {
@@ -5161,6 +5205,7 @@ enable_disable_key (KBNODE keyblock, int disable)
   update_ownertrust (pk, newtrust);
   return 0;
 }
   update_ownertrust (pk, newtrust);
   return 0;
 }
+#endif /*!NO_TRUST_MODELS*/
 
 
 static void
 
 
 static void
@@ -5201,7 +5246,7 @@ menu_showphoto (KBNODE keyblock)
                                    "key %s (uid %d)\n"),
                                  image_type_to_string (type, 1),
                                  (ulong) size, keystr_from_pk (pk), count);
                                    "key %s (uid %d)\n"),
                                  image_type_to_string (type, 1),
                                  (ulong) size, keystr_from_pk (pk), count);
-                     show_photos (&uid->attribs[i], 1, pk, NULL, uid);
+                     show_photos (&uid->attribs[i], 1, pk, uid);
                    }
                }
            }
                    }
                }
            }