diff options
-rw-r--r-- | g10/card-util.c | 31 | ||||
-rw-r--r-- | g10/getkey.c | 22 | ||||
-rw-r--r-- | g10/keydb.h | 4 | ||||
-rw-r--r-- | g10/keyid.c | 2 | ||||
-rw-r--r-- | g10/keylist.c | 14 | ||||
-rw-r--r-- | g10/revoke.c | 2 |
6 files changed, 35 insertions, 40 deletions
diff --git a/g10/card-util.c b/g10/card-util.c index a291a075b..dbd530eab 100644 --- a/g10/card-util.c +++ b/g10/card-util.c @@ -366,6 +366,7 @@ card_status (estream_t fp, char *serialno, size_t serialnobuflen) { struct agent_card_info_s info; PKT_public_key *pk = xcalloc (1, sizeof *pk); + kbnode_t keyblock = NULL; int rc; unsigned int uval; const unsigned char *thefpr; @@ -587,41 +588,17 @@ card_status (estream_t fp, char *serialno, size_t serialnobuflen) /* If the fingerprint is all 0xff, the key has no asssociated OpenPGP certificate. */ if ( thefpr && !fpr_is_ff (thefpr) - && !get_pubkey_byfprint (pk, thefpr, 20)) + && !get_pubkey_byfprint (pk, &keyblock, thefpr, 20)) { - kbnode_t keyblock = NULL; - print_pubkey_info (fp, pk); - -#if GNUPG_MAJOR_VERSION == 1 - if ( !get_seckeyblock_byfprint (&keyblock, thefpr, 20) ) + if (keyblock) print_card_key_info (fp, keyblock); - else if ( !get_keyblock_byfprint (&keyblock, thefpr, 20) ) - { - release_kbnode (keyblock); - keyblock = NULL; - - if (!auto_create_card_key_stub (info.serialno, - info.fpr1valid? info.fpr1:NULL, - info.fpr2valid? info.fpr2:NULL, - info.fpr3valid? info.fpr3:NULL)) - { - if ( !get_seckeyblock_byfprint (&keyblock, thefpr, 20) ) - print_card_key_info (fp, keyblock); - } - } - -#else /* GNUPG_MAJOR_VERSION != 1 */ - if (!get_keyblock_byfprint (&keyblock, thefpr, 20)) - print_card_key_info (fp, keyblock); -#endif /* GNUPG_MAJOR_VERSION != 1 */ - - release_kbnode (keyblock); } else tty_fprintf (fp, "[none]\n"); } + release_kbnode (keyblock); free_public_key (pk); agent_release_card_info (&info); } diff --git a/g10/getkey.c b/g10/getkey.c index 20b37d80e..e450c5655 100644 --- a/g10/getkey.c +++ b/g10/getkey.c @@ -968,17 +968,26 @@ get_pubkey_byfpr (PKT_public_key *pk, const byte *fpr) } -/* Search for a key with the given fingerprint. +/* Search for a key with the given fingerprint. The caller need to + * prove an allocated public key object at PK. If R_KEYBLOCK is not + * NULL the entire keyblock is stored there and the caller needs to + * call release_kbnode() on it. Note that this function does an exact + * search and thus the public key stored at PK may be a copy of a + * subkey. + * * FIXME: * We should replace this with the _byname function. This can be done * by creating a userID conforming to the unified fingerprint style. */ int -get_pubkey_byfprint (PKT_public_key * pk, +get_pubkey_byfprint (PKT_public_key *pk, kbnode_t *r_keyblock, const byte * fprint, size_t fprint_len) { int rc; + if (r_keyblock) + *r_keyblock = NULL; + if (fprint_len == 20 || fprint_len == 16) { struct getkey_ctx_s ctx; @@ -994,7 +1003,14 @@ get_pubkey_byfprint (PKT_public_key * pk, memcpy (ctx.items[0].u.fpr, fprint, fprint_len); rc = lookup (&ctx, &kb, 0); if (!rc && pk) - pk_from_block (&ctx, pk, kb); + { + pk_from_block (&ctx, pk, kb); + if (r_keyblock) + { + *r_keyblock = kb; + kb = NULL; + } + } release_kbnode (kb); get_pubkey_end (&ctx); } diff --git a/g10/keydb.h b/g10/keydb.h index c61e0ae18..11a10e984 100644 --- a/g10/keydb.h +++ b/g10/keydb.h @@ -223,8 +223,8 @@ int get_pubkey_next( GETKEY_CTX ctx, PKT_public_key *pk, KBNODE *ret_keyblock ); void get_pubkey_end( GETKEY_CTX ctx ); gpg_error_t get_seckey (PKT_public_key *pk, u32 *keyid); gpg_error_t get_pubkey_byfpr (PKT_public_key *pk, const byte *fpr); -int get_pubkey_byfprint( PKT_public_key *pk, const byte *fprint, - size_t fprint_len ); +int get_pubkey_byfprint (PKT_public_key *pk, kbnode_t *r_keyblock, + const byte *fprint, size_t fprint_len); int get_pubkey_byfprint_fast (PKT_public_key *pk, const byte *fprint, size_t fprint_len); int get_keyblock_byfprint( KBNODE *ret_keyblock, const byte *fprint, diff --git a/g10/keyid.c b/g10/keyid.c index a0571b03b..90d982ecf 100644 --- a/g10/keyid.c +++ b/g10/keyid.c @@ -463,7 +463,7 @@ keyid_from_fingerprint( const byte *fprint, size_t fprint_len, u32 *keyid ) int rc; memset (&pk, 0, sizeof pk); - rc = get_pubkey_byfprint (&pk, fprint, fprint_len); + rc = get_pubkey_byfprint (&pk, NULL, fprint, fprint_len); if( rc ) { log_error("Oops: keyid_from_fingerprint: no pubkey\n"); diff --git a/g10/keylist.c b/g10/keylist.c index d62bc2006..2cd988d41 100644 --- a/g10/keylist.c +++ b/g10/keylist.c @@ -170,7 +170,7 @@ print_seckey_info (PKT_public_key *pk) the tty output interface is used, otherwise output is directted to the given stream. */ void -print_pubkey_info (estream_t fp, PKT_public_key * pk) +print_pubkey_info (estream_t fp, PKT_public_key *pk) { u32 keyid[2]; char *p; @@ -187,7 +187,8 @@ print_pubkey_info (estream_t fp, PKT_public_key * pk) if (fp) tty_printf ("\n"); - tty_fprintf (fp, "pub %s/%s %s %s\n", + tty_fprintf (fp, "%s %s/%s %s %s\n", + pk->flags.primary? "pub":"sub", pubkey_string (pk, pkstrbuf, sizeof pkstrbuf), keystr (keyid), datestr_from_pk (pk), p); xfree (p); @@ -205,6 +206,7 @@ print_card_key_info (estream_t fp, kbnode_t keyblock) char *serialno; int s2k_char; char pkstrbuf[PUBKEY_STRING_SIZE]; + int indent; for (node = keyblock; node; node = node->next) { @@ -226,18 +228,18 @@ print_card_key_info (estream_t fp, kbnode_t keyblock) else s2k_char = '#'; /* Key not found. */ - tty_fprintf (fp, "%s%c %s/%s ", + tty_fprintf (fp, "%s%c %s/%s %n", node->pkt->pkttype == PKT_PUBLIC_KEY ? "sec" : "ssb", s2k_char, pubkey_string (pk, pkstrbuf, sizeof pkstrbuf), - keystr_from_pk (pk)); + keystr_from_pk (pk), + &indent); tty_fprintf (fp, _("created: %s"), datestr_from_pk (pk)); tty_fprintf (fp, " "); tty_fprintf (fp, _("expires: %s"), expirestr_from_pk (pk)); if (serialno) { - tty_fprintf (fp, "\n "); - tty_fprintf (fp, _("card-no: ")); + tty_fprintf (fp, "\n%*s%s", indent, "", _("card-no: ")); if (strlen (serialno) == 32 && !strncmp (serialno, "D27600012401", 12)) { diff --git a/g10/revoke.c b/g10/revoke.c index 15d28b0bd..6680ac709 100644 --- a/g10/revoke.c +++ b/g10/revoke.c @@ -291,7 +291,7 @@ gen_desig_revoke( const char *uname, strlist_t locusr ) else { pk2 = xmalloc_clear (sizeof *pk2); - rc = get_pubkey_byfprint (pk2, + rc = get_pubkey_byfprint (pk2, NULL, pk->revkey[i].fpr, MAX_FINGERPRINT_LEN); } |