gpg: Use only OpenPGP public key algo ids and add the EdDSA algo id.
[gnupg.git] / g10 / revoke.c
index 173c4ad..6e47691 100644 (file)
@@ -36,7 +36,7 @@
 #include "ttyio.h"
 #include "status.h"
 #include "i18n.h"
-
+#include "call-agent.h"
 
 struct revocation_reason_info {
     int code;
@@ -220,9 +220,9 @@ gen_desig_revoke( const char *uname, strlist_t locusr )
     afx = new_armor_context ();
 
     kdbhd = keydb_new ();
-    rc = classify_user_id (uname, &desc);
+    rc = classify_user_id (uname, &desc, 1);
     if (!rc)
-      rc = keydb_search (kdbhd, &desc, 1);
+      rc = keydb_search (kdbhd, &desc, 1, NULL);
     if (rc) {
        log_error (_("key \"%s\" not found: %s\n"),uname, g10_errstr (rc));
        goto leave;
@@ -239,7 +239,7 @@ gen_desig_revoke( const char *uname, strlist_t locusr )
 
     /* get the key from the keyblock */
     node = find_kbnode( keyblock, PKT_PUBLIC_KEY );
-    if( !node ) 
+    if( !node )
       BUG ();
 
     pk=node->pkt->pkt.public_key;
@@ -262,8 +262,8 @@ gen_desig_revoke( const char *uname, strlist_t locusr )
       {
        SK_LIST list;
 
-       if (pk2)
-         free_public_key (pk2);
+        free_public_key (pk2);
+        pk2 = NULL;
 
        if(sk_list)
          {
@@ -339,7 +339,8 @@ gen_desig_revoke( const char *uname, strlist_t locusr )
            /* create it */
            rc = make_keysig_packet( &sig, pk, NULL, NULL, pk2, 0x20, 0,
                                     0, 0, 0,
-                                    revocation_reason_build_cb, reason );
+                                    revocation_reason_build_cb, reason,
+                                     NULL);
            if( rc ) {
              log_error(_("make_keysig_packet failed: %s\n"), g10_errstr(rc));
              goto leave;
@@ -413,10 +414,8 @@ gen_desig_revoke( const char *uname, strlist_t locusr )
       log_error(_("no revocation keys found for \"%s\"\n"),uname);
 
   leave:
-    if( pk )
-       free_public_key( pk );
-    if (pk2)
-       free_public_key (pk2);
+    free_public_key (pk);
+    free_public_key (pk2);
     if( sig )
        free_seckey_enc( sig );
 
@@ -461,11 +460,10 @@ gen_revoke (const char *uname)
   init_packet( &pkt );
 
   /* Search the userid; we don't want the whole getkey stuff here.  */
-  log_debug ("FIXME:  This needs to be adjusted for public key based lookups\n");
   kdbhd = keydb_new ();
-  rc = classify_user_id (uname, &desc);
+  rc = classify_user_id (uname, &desc, 1);
   if (!rc)
-    rc = keydb_search (kdbhd, &desc, 1);
+    rc = keydb_search (kdbhd, &desc, 1, NULL);
   if (rc)
     {
       log_error (_("secret key \"%s\" not found: %s\n"),
@@ -474,24 +472,29 @@ gen_revoke (const char *uname)
     }
 
   rc = keydb_get_keyblock (kdbhd, &keyblock );
-  if( rc ) {
-    log_error (_("error reading keyblock: %s\n"), g10_errstr(rc) );
-    goto leave;
-  }
+  if (rc)
+    {
+      log_error (_("error reading keyblock: %s\n"), g10_errstr(rc) );
+      goto leave;
+    }
 
   /* Get the keyid from the keyblock.  */
   node = find_kbnode (keyblock, PKT_PUBLIC_KEY);
-  if (!node) 
+  if (!node)
     BUG ();
 
-  /* fixme: should make a function out of this stuff,
-   * it's used all over the source */
   psk = node->pkt->pkt.public_key;
+  rc = agent_probe_secret_key (NULL, psk);
+  if (rc)
+    {
+      log_error (_("secret key \"%s\" not found: %s\n"),
+                 uname, gpg_strerror (rc));
+      goto leave;
+    }
+
   keyid_from_pk (psk, keyid );
   print_seckey_info (psk);
 
-#warning add code to check that the secret key is available
-
   tty_printf("\n");
   if (!cpr_get_answer_is_yes ("gen_revoke.okay",
                 _("Create a revocation certificate for this key? (y/N) ")))
@@ -499,19 +502,19 @@ gen_revoke (const char *uname)
       rc = 0;
       goto leave;
     }
-  
+
   if (psk->version >= 4 || opt.force_v4_certs)
     {
       /* Get the reason for the revocation.  */
       reason = ask_revocation_reason (1, 0, 1);
       if (!reason)
-        { 
+        {
           /* user decided to cancel */
           rc = 0;
           goto leave;
         }
     }
-  
+
   if (!opt.armor)
     tty_printf (_("ASCII armored output forced.\n"));
 
@@ -525,13 +528,13 @@ gen_revoke (const char *uname)
   /* create it */
   rc = make_keysig_packet (&sig, psk, NULL, NULL, psk, 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 (_("make_keysig_packet failed: %s\n"), g10_errstr (rc));
       goto leave;
     }
-    
+
   if (PGP2 || PGP6 || PGP7 || PGP8)
     {
       /* Use a minimal pk for PGPx mode, since PGP can't import bare
@@ -545,15 +548,15 @@ gen_revoke (const char *uname)
       init_packet( &pkt );
       pkt.pkttype = PKT_SIGNATURE;
       pkt.pkt.signature = sig;
-        
+
       rc = build_packet (out, &pkt);
-      if (rc) 
+      if (rc)
         {
           log_error(_("build_packet failed: %s\n"), g10_errstr(rc) );
           goto leave;
         }
     }
-    
+
   /* and issue a usage notice */
   tty_printf (_(
 "Revocation certificate created.\n\n"