aboutsummaryrefslogtreecommitdiffstats
path: root/g10/gpg.c
diff options
context:
space:
mode:
Diffstat (limited to 'g10/gpg.c')
-rw-r--r--g10/gpg.c35
1 files changed, 31 insertions, 4 deletions
diff --git a/g10/gpg.c b/g10/gpg.c
index 5aeb94da8..774125117 100644
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -2196,19 +2196,46 @@ check_user_ids (strlist_t *sp,
}
pk = kb->pkt->pkt.public_key;
- fingerprint_from_pk (pk, fingerprint_bin, &fingerprint_bin_len);
- assert (fingerprint_bin_len == sizeof (fingerprint_bin));
- bin2hex (fingerprint_bin, MAX_FINGERPRINT_LEN, fingerprint);
if ((desc.mode == KEYDB_SEARCH_MODE_SHORT_KID
|| desc.mode == KEYDB_SEARCH_MODE_LONG_KID
|| desc.mode == KEYDB_SEARCH_MODE_FPR16
|| desc.mode == KEYDB_SEARCH_MODE_FPR20)
&& strchr (t->d, '!'))
+ /* Exact search. In this case we want to set FINGERPRINT not
+ to the primary key, but the key (primary or sub) that
+ matched the search criteria. Note: there will always be
+ exactly one match. */
{
- int i = strlen (fingerprint);
+ kbnode_t n = kb;
+ PKT_public_key *match = NULL;
+ int i;
+
+ do
+ {
+ if ((n->flag & 1))
+ /* The matched node. */
+ {
+ assert (! match);
+ match = n->pkt->pkt.public_key;
+ }
+ }
+ while ((n = find_next_kbnode (n, PKT_PUBLIC_SUBKEY)));
+ assert (match);
+
+ fingerprint_from_pk (match, fingerprint_bin, &fingerprint_bin_len);
+ assert (fingerprint_bin_len == sizeof (fingerprint_bin));
+ bin2hex (fingerprint_bin, MAX_FINGERPRINT_LEN, fingerprint);
+
+ i = strlen (fingerprint);
fingerprint[i] = '!';
fingerprint[i + 1] = '\0';
}
+ else
+ {
+ fingerprint_from_pk (pk, fingerprint_bin, &fingerprint_bin_len);
+ assert (fingerprint_bin_len == sizeof (fingerprint_bin));
+ bin2hex (fingerprint_bin, MAX_FINGERPRINT_LEN, fingerprint);
+ }
add_to_strlist (&s2, fingerprint);
s2->flags = s->flags;