Exporting secret keys via gpg-agent is now basically supported.
[gnupg.git] / g10 / keyedit.c
index f9dfe7a..d1cacaf 100644 (file)
@@ -60,7 +60,7 @@ 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);
@@ -557,7 +557,7 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
    * 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;
 
@@ -1083,7 +1083,8 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
                                         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,
@@ -1091,7 +1092,8 @@ sign_uids (KBNODE keyblock, strlist_t locusr, int *ret_modified,
                                         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));
@@ -1584,7 +1586,7 @@ keyedit_completion (const char *text, int start, int end)
 \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;
@@ -1597,7 +1599,6 @@ keyedit_menu (const char *username, strlist_t locusr,
   int modified = 0;
   int toggle;
   int have_commands = !!commands;
-  ctrl_t ctrl = NULL; /* Dummy for now.  */
 
   if (opt.command_fd != -1)
     ;
@@ -1621,7 +1622,7 @@ keyedit_menu (const char *username, strlist_t locusr,
 #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)
     goto leave;
   if (fix_keyblock (keyblock))
@@ -2093,7 +2094,7 @@ keyedit_menu (const char *username, strlist_t locusr,
 
            if (ascii_strcasecmp (arg_string, "sensitive") == 0)
              sensitive = 1;
-           if (menu_addrevoker (keyblock, sensitive))
+           if (menu_addrevoker (ctrl, keyblock, sensitive))
              {
                redisplay = 1;
                modified = 1;
@@ -2686,7 +2687,7 @@ show_key_with_all_names_colon (KBNODE keyblock)
            putchar ('a');
          putchar ('\n');
 
-         print_fingerprint (pk, NULL, 0);
+         print_fingerprint (pk, 0);
          print_revokers (pk);
        }
     }
@@ -2884,9 +2885,10 @@ show_key_with_all_names (KBNODE keyblock, int only_marked, int with_revoker,
          if (pk->is_revoked)
            {
              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_printf (_("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);
            }
 
@@ -2922,7 +2924,9 @@ show_key_with_all_names (KBNODE keyblock, int only_marked, int with_revoker,
 
          keyid_from_pk (pk, NULL);
          tty_printf ("%s%c %4u%c/%s  ",
-                     node->pkt->pkttype == PKT_PUBLIC_KEY ? "pub" : "sub",
+                     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) ? '*' : ' ',
                      nbits_from_pk (pk),
                      pubkey_letter (pk->pubkey_algo), keystr (pk->keyid));
@@ -2939,7 +2943,35 @@ show_key_with_all_names (KBNODE keyblock, int only_marked, int with_revoker,
          tty_printf (_("usage: %s"), usagestr_from_pk (pk));
          tty_printf ("\n");
 
-         if (node->pkt->pkttype == PKT_PUBLIC_KEY)
+         if (pk->seckey_info
+              && pk->seckey_info->is_protected
+              && pk->seckey_info->s2k.mode == 1002)
+           {
+             tty_printf ("                     ");
+             tty_printf (_("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_printf (" ");
+                     tty_printf ("%02X", pk->seckey_info->iv[i]);
+                   }
+               }
+             else
+               { 
+                  /* Unknown card: Print all. */
+                 for (i = 0; i < pk->seckey_info->ivlen; i++)
+                   tty_printf ("%02X", pk->seckey_info->iv[i]);
+               }
+             tty_printf ("\n");
+           }
+
+         if (node->pkt->pkttype == PKT_PUBLIC_KEY
+              || node->pkt->pkttype == PKT_SECRET_KEY)
            {
              if (opt.trust_model != TM_ALWAYS)
                {
@@ -2968,44 +3000,10 @@ show_key_with_all_names (KBNODE keyblock, int only_marked, int with_revoker,
                }
            }
 
-         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]);
-               }
+             print_fingerprint (pk, 2);
              tty_printf ("\n");
            }
        }
@@ -3033,35 +3031,24 @@ show_basic_key_info (KBNODE keyblock)
   /* 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. */
          tty_printf ("%s  %4u%c/%s  ",
-                     node->pkt->pkttype == PKT_PUBLIC_KEY ? "pub" : "sub",
+                     node->pkt->pkttype == PKT_PUBLIC_KEY ? "pub" :
+                     node->pkt->pkttype == PKT_PUBLIC_SUBKEY ? "sub" :
+                     node->pkt->pkttype == PKT_SECRET_KEY ? "sec" :"ssb",
                      nbits_from_pk (pk),
                      pubkey_letter (pk->pubkey_algo), 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");
-         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 (pk, 3);
          tty_printf ("\n");
        }
     }
@@ -3110,7 +3097,7 @@ show_key_and_fingerprint (KBNODE keyblock)
     }
   tty_printf ("\n");
   if (pk)
-    print_fingerprint (pk, NULL, 2);
+    print_fingerprint (pk, 2);
 }
 
 
@@ -3221,7 +3208,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,
-                            keygen_add_std_prefs, pk);
+                            keygen_add_std_prefs, pk, NULL);
   if (err)
     {
       log_error ("signing failed: %s\n", g10_errstr (err));
@@ -3457,7 +3444,7 @@ menu_delkey (KBNODE pub_keyblock)
  * 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;
@@ -3521,7 +3508,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;
-      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,
@@ -3588,7 +3575,7 @@ menu_addrevoker (KBNODE pub_keyblock, int sensitive)
        }
 
       print_pubkey_info (NULL, revoker_pk);
-      print_fingerprint (revoker_pk, NULL, 2);
+      print_fingerprint (revoker_pk, 2);
       tty_printf ("\n");
 
       tty_printf (_("WARNING: appointing a key as a designated revoker "
@@ -3609,7 +3596,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,
-                          keygen_add_revkey, &revkey);
+                          keygen_add_revkey, &revkey, NULL);
   if (rc)
     {
       log_error ("signing failed: %s\n", g10_errstr (rc));
@@ -3809,7 +3796,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,
-                        timestamp);
+                        timestamp, NULL);
       if (!rc)
        {
          PKT_signature *newsig;
@@ -4900,7 +4887,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,
-                               sign_mk_attrib, &attrib);
+                               sign_mk_attrib, &attrib, NULL);
       free_public_key (signerkey);
       if (rc)
        {
@@ -4992,7 +4979,7 @@ menu_revuid (KBNODE pub_keyblock)
 
            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));
@@ -5054,7 +5041,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,
-                          revocation_reason_build_cb, reason);
+                          revocation_reason_build_cb, reason, NULL);
   if (rc)
     {
       log_error (_("signing failed: %s\n"), g10_errstr (rc));
@@ -5114,7 +5101,8 @@ menu_revsubkey (KBNODE pub_keyblock)
 
          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));
@@ -5201,7 +5189,7 @@ menu_showphoto (KBNODE keyblock)
                                    "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);
                    }
                }
            }