aboutsummaryrefslogtreecommitdiffstats
path: root/g10/keylist.c
diff options
context:
space:
mode:
Diffstat (limited to 'g10/keylist.c')
-rw-r--r--g10/keylist.c213
1 files changed, 114 insertions, 99 deletions
diff --git a/g10/keylist.c b/g10/keylist.c
index d144afc39..e8440f77b 100644
--- a/g10/keylist.c
+++ b/g10/keylist.c
@@ -40,11 +40,12 @@
#include "main.h"
#include "i18n.h"
#include "status.h"
+#include "call-agent.h"
static void list_all (int);
static void list_one (strlist_t names, int secret);
static void locate_one (ctrl_t ctrl, strlist_t names);
-static void print_card_serialno (PKT_public_key *sk);
+static void print_card_serialno (const char *serialno);
struct sig_stats
{
@@ -175,6 +176,7 @@ print_pubkey_info (estream_t fp, PKT_public_key * pk)
/* Print basic information of a secret key including the card serial
number information. */
+#ifdef ENABLE_CARD_SUPPORT
void
print_card_key_info (estream_t fp, kbnode_t keyblock)
{
@@ -224,7 +226,7 @@ print_card_key_info (estream_t fp, kbnode_t keyblock)
/* } */
/* } */
}
-
+#endif /*ENABLE_CARD_SUPPORT*/
/* Flags = 0x01 hashed 0x02 critical. */
@@ -444,7 +446,7 @@ list_all (int secret)
log_error ("keydb_get_keyblock failed: %s\n", g10_errstr (rc));
goto leave;
}
- if (secret && !have_any_secret_key (NULL, keyblock))
+ if (secret && agent_probe_any_secret_key (NULL, keyblock))
; /* Secret key listing requested but this isn't one. */
else
{
@@ -757,13 +759,15 @@ dump_attribs (const PKT_user_id *uid, PKT_public_key *pk)
static void
list_keyblock_print (KBNODE keyblock, int secret, int fpr, void *opaque)
{
- int rc = 0;
+ int rc;
KBNODE kbctx;
KBNODE node;
PKT_public_key *pk;
struct sig_stats *stats = opaque;
int skip_sigs = 0;
int s2k_char;
+ char *hexgrip = NULL;
+ char *serialno = NULL;
/* Get the keyid from the keyblock. */
node = find_kbnode (keyblock, PKT_PUBLIC_KEY);
@@ -775,10 +779,23 @@ list_keyblock_print (KBNODE keyblock, int secret, int fpr, void *opaque)
}
pk = node->pkt->pkt.public_key;
-
- /* Fixme: Get s2k mode from the agent. */
- s2k_char = (/*(sk->protect.s2k.mode == 1001)? '#' :
- (sk->protect.s2k.mode == 1002)? '>' : */' ');
+
+ if (secret || opt.with_keygrip)
+ {
+ rc = hexkeygrip_from_pk (pk, &hexgrip);
+ if (rc)
+ log_error ("error computing a keygrip: %s\n", gpg_strerror (rc));
+ }
+
+ if (secret)
+ {
+ if (!agent_get_keyinfo (NULL, hexgrip, &serialno))
+ s2k_char = serialno? '>':' ';
+ else
+ s2k_char = '#'; /* Key not found. */
+ }
+ else
+ s2k_char = ' ';
check_trustdb_stale ();
@@ -822,19 +839,11 @@ list_keyblock_print (KBNODE keyblock, int secret, int fpr, void *opaque)
if (fpr)
print_fingerprint (pk, 0);
- if (opt.with_keygrip)
- {
- char *p;
+ if (opt.with_keygrip && hexgrip)
+ es_fprintf (es_stdout, " Keygrip = %s\n", hexgrip);
- if (!hexkeygrip_from_pk (pk, &p))
- {
- es_fprintf (es_stdout, " Keygrip = %s\n", p);
- xfree (p);
- }
- }
-
- /* FIXME: Change this function to take a PK and ask the agent: */
- /* if (secret) print_card_serialno (sk); */
+ if (serialno)
+ print_card_serialno (serialno);
if (opt.with_key_data)
print_key_data (pk);
@@ -895,10 +904,25 @@ list_keyblock_print (KBNODE keyblock, int secret, int fpr, void *opaque)
else
skip_sigs = 0;
- /* Fixme: Get s2k mode from the agent. */
- s2k_char = (/*(sk->protect.s2k.mode == 1001)? '#' :
- (sk->protect.s2k.mode == 1002)? '>' : */' ');
-
+ xfree (serialno); serialno = NULL;
+ xfree (hexgrip); hexgrip = NULL;
+ if (secret || opt.with_keygrip)
+ {
+ rc = hexkeygrip_from_pk (pk2, &hexgrip);
+ if (rc)
+ log_error ("error computing a keygrip: %s\n",
+ gpg_strerror (rc));
+ }
+ if (secret)
+ {
+ if (!agent_get_keyinfo (NULL, hexgrip, &serialno))
+ s2k_char = serialno? '>':' ';
+ else
+ s2k_char = '#'; /* Key not found. */
+ }
+ else
+ s2k_char = ' ';
+
es_fprintf (es_stdout, "%s%c %4u%c/%s %s",
secret? "ssb":"sub",
s2k_char,
@@ -926,20 +950,11 @@ list_keyblock_print (KBNODE keyblock, int secret, int fpr, void *opaque)
if (fpr > 1)
{
print_fingerprint (pk2, 0);
- /* FIXME: (see above) */
- /* if (secret) */
- /* print_card_serialno (sk2); */
- }
- if (opt.with_keygrip)
- {
- char *p;
-
- if (!hexkeygrip_from_pk (pk2, &p))
- {
- es_fprintf (es_stdout, " Keygrip = %s\n", p);
- xfree (p);
- }
+ if (serialno)
+ print_card_serialno (serialno);
}
+ if (opt.with_keygrip && hexgrip)
+ es_fprintf (es_stdout, " Keygrip = %s\n", hexgrip);
if (opt.with_key_data)
print_key_data (pk2);
}
@@ -1050,6 +1065,8 @@ list_keyblock_print (KBNODE keyblock, int secret, int fpr, void *opaque)
}
}
es_putc ('\n', es_stdout);
+ xfree (serialno);
+ xfree (hexgrip);
}
void
@@ -1079,7 +1096,7 @@ print_revokers (PKT_public_key * pk)
static void
list_keyblock_colon (KBNODE keyblock, int secret, int fpr)
{
- int rc = 0;
+ int rc;
KBNODE kbctx;
KBNODE node;
PKT_public_key *pk;
@@ -1088,6 +1105,9 @@ list_keyblock_colon (KBNODE keyblock, int secret, int fpr)
int ulti_hack = 0;
int i;
char *p;
+ char *hexgrip = NULL;
+ char *serialno = NULL;
+ int stubkey;
/* Get the keyid from the keyblock. */
node = find_kbnode (keyblock, PKT_PUBLIC_KEY);
@@ -1099,6 +1119,15 @@ list_keyblock_colon (KBNODE keyblock, int secret, int fpr)
}
pk = node->pkt->pkt.public_key;
+ if (secret || opt.with_keygrip || opt.with_key_data)
+ {
+ rc = hexkeygrip_from_pk (pk, &hexgrip);
+ if (rc)
+ log_error ("error computing a keygrip: %s\n", gpg_strerror (rc));
+ }
+ stubkey = 0;
+ if (secret && agent_get_keyinfo (NULL, hexgrip, &serialno))
+ stubkey = 1; /* Key not found. */
keyid_from_pk (pk, keyid);
es_fputs (secret? "sec:":"pub:", es_stdout);
@@ -1135,16 +1164,10 @@ list_keyblock_colon (KBNODE keyblock, int secret, int fpr)
{
es_putc (':', es_stdout); /* End of field 13. */
es_putc (':', es_stdout); /* End of field 14. */
- if (/*FIXME sk->protect.s2k.mode*/1 == 1001)
- es_putc ('#', es_stdout); /* Key is just a stub. */
- else if (/*FIXME sk->protect.s2k.mode*/1 == 1002)
- {
- /* Key is stored on an external token (card) or handled by
- the gpg-agent. Print the serial number of that token
- here. */
- /* FIXME: for (i = 0; i < sk->protect.ivlen; i++) */
- /* es_fprintf (es_stdout, "%02X", sk->protect.iv[i]); */
- }
+ if (stubkey)
+ es_putc ('#', es_stdout);
+ else if (serialno)
+ es_fputs(serialno, es_stdout);
es_putc (':', es_stdout); /* End of field 15. */
}
es_putc ('\n', es_stdout);
@@ -1154,11 +1177,8 @@ list_keyblock_colon (KBNODE keyblock, int secret, int fpr)
print_fingerprint (pk, 0);
if (opt.with_key_data || opt.with_keygrip)
{
- if (!hexkeygrip_from_pk (pk, &p))
- {
- es_fprintf (es_stdout, "grp:::::::::%s:\n", p);
- xfree (p);
- }
+ if (hexgrip)
+ es_fprintf (es_stdout, "grp:::::::::%s:\n", hexgrip);
if (opt.with_key_data)
print_key_data (pk);
}
@@ -1213,7 +1233,21 @@ list_keyblock_colon (KBNODE keyblock, int secret, int fpr)
else if (node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
{
u32 keyid2[2];
- PKT_public_key *pk2 = node->pkt->pkt.public_key;
+ PKT_public_key *pk2;
+
+ pk2 = node->pkt->pkt.public_key;
+ xfree (hexgrip); hexgrip = NULL;
+ xfree (serialno); serialno = NULL;
+ if (secret || opt.with_keygrip || opt.with_key_data)
+ {
+ rc = hexkeygrip_from_pk (pk2, &hexgrip);
+ if (rc)
+ log_error ("error computing a keygrip: %s\n",
+ gpg_strerror (rc));
+ }
+ stubkey = 0;
+ if (secret && agent_get_keyinfo (NULL, hexgrip, &serialno))
+ stubkey = 1; /* Key not found. */
keyid_from_pk (pk2, keyid2);
es_fputs (secret? "ssb:":"sub:", es_stdout);
@@ -1243,16 +1277,10 @@ list_keyblock_colon (KBNODE keyblock, int secret, int fpr)
{
es_putc (':', es_stdout); /* End of field 13. */
es_putc (':', es_stdout); /* End of field 14. */
- if (/*FIXME:sk2->protect.s2k.mode*/1 == 1001)
- es_putc ('#', es_stdout); /* Key is just a stub. */
- else if (/*FIXME: sk2->protect.s2k.mode*/1 == 1002)
- {
- /* Key is stored on an external token (card) or
- handled by the gpg-agent. Print the serial
- number of that token here. */
- /* FIXME: for (i = 0; i < sk2->protect.ivlen; i++)
- es_fprintf (es_stdout, "%02X", sk2->protect.iv[i]); */
- }
+ if (stubkey)
+ es_putc ('#', es_stdout);
+ else if (serialno)
+ es_fputs (serialno, es_stdout);
es_putc (':', es_stdout); /* End of field 15. */
}
es_putc ('\n', es_stdout);
@@ -1260,11 +1288,8 @@ list_keyblock_colon (KBNODE keyblock, int secret, int fpr)
print_fingerprint (pk2, 0);
if (opt.with_key_data || opt.with_keygrip)
{
- if (!hexkeygrip_from_pk (pk2, &p))
- {
- es_fprintf (es_stdout, "grp:::::::::%s:\n", p);
- xfree (p);
- }
+ if (hexgrip)
+ es_fprintf (es_stdout, "grp:::::::::%s:\n", hexgrip);
if (opt.with_key_data)
print_key_data (pk2);
}
@@ -1385,6 +1410,9 @@ list_keyblock_colon (KBNODE keyblock, int secret, int fpr)
/* fixme: check or list other sigs here */
}
}
+
+ xfree (hexgrip);
+ xfree (serialno);
}
/*
@@ -1550,38 +1578,25 @@ print_fingerprint (PKT_public_key *pk, int mode)
/* Print the serial number of an OpenPGP card if available. */
static void
-print_card_serialno (PKT_public_key *pk)
+print_card_serialno (const char *serialno)
{
- log_debug ("Fixme: Needs to be adjusted to gpg-agent\n");
- /* int i; */
+ if (!serialno)
+ return;
+ if (opt.with_colons)
+ return; /* Handled elsewhere. */
- /* if (!sk) */
- /* return; */
- /* if (!sk->is_protected || sk->protect.s2k.mode != 1002) */
- /* return; /\* Not a card. *\/ */
- /* if (opt.with_colons) */
- /* return; /\* Handled elsewhere. *\/ */
-
- /* es_fputs (_(" Card serial no. ="), es_stdout); */
- /* es_putc (' ', es_stdout); */
- /* if (sk->protect.ivlen == 16 */
- /* && !memcmp (sk->protect.iv, "\xD2\x76\x00\x01\x24\x01", 6)) */
- /* { */
- /* /\* This is an OpenPGP card. Just print the relevant part. *\/ */
- /* for (i = 8; i < 14; i++) */
- /* { */
- /* if (i == 10) */
- /* es_putc (' ', es_stdout); */
- /* es_fprintf (es_stdout, "%02X", sk->protect.iv[i]); */
- /* } */
- /* } */
- /* else */
- /* { */
- /* /\* Something is wrong: Print all. *\/ */
- /* for (i = 0; i < sk->protect.ivlen; i++) */
- /* es_fprintf (es_stdout, "%02X", sk->protect.iv[i]); */
- /* } */
- /* es_putc ('\n', es_stdout); */
+ es_fputs (_(" Card serial no. ="), es_stdout);
+ es_putc (' ', es_stdout);
+ if (strlen (serialno) == 32 && !strncmp (serialno, "D27600012401", 12))
+ {
+ /* This is an OpenPGP card. Print the relevant part. */
+ /* Example: D2760001240101010001000003470000 */
+ /* xxxxyyyyyyyy */
+ es_fprintf (es_stdout, "%.*s %.*s", 4, serialno+16, 8, serialno+20);
+ }
+ else
+ es_fputs (serialno, es_stdout);
+ es_putc ('\n', es_stdout);
}