From cedbd4709eed6fead9d1b271f96860c00547c77c Mon Sep 17 00:00:00 2001 From: "Neal H. Walfield" Date: Wed, 2 Dec 2015 20:51:52 +0100 Subject: gpg: Use the matching key if the search description is exact. * g10/gpg.c (check_user_ids): If the search description is for an exact match (a keyid or fingerprint that ends in '!'), then use the matching key, not the primary key. * tests/openpgp/Makefile.am (TESTS): Add use-exact-key.test. (priv_keys): Add privkeys/00FE67F28A52A8AA08FFAED20AF832DA916D1985.asc, privkeys/1DF48228FEFF3EC2481B106E0ACA8C465C662CC5.asc, privkeys/A2832820DC9F40751BDCD375BB0945BA33EC6B4C.asc, privkeys/ADE710D74409777B7729A7653373D820F67892E0.asc and privkeys/CEFC51AF91F68A2904FBFF62C4F075A4785B803F.asc. (sample_keys): Add samplekeys/E657FB607BB4F21C90BB6651BC067AF28BC90111.asc. * tests/openpgp/privkeys/00FE67F28A52A8AA08FFAED20AF832DA916D1985.asc: New file. * tests/openpgp/privkeys/1DF48228FEFF3EC2481B106E0ACA8C465C662CC5.asc: New file. * tests/openpgp/privkeys/A2832820DC9F40751BDCD375BB0945BA33EC6B4C.asc: New file. * tests/openpgp/privkeys/ADE710D74409777B7729A7653373D820F67892E0.asc: New file. * tests/openpgp/privkeys/CEFC51AF91F68A2904FBFF62C4F075A4785B803F.asc: New file. * tests/openpgp/samplekeys/E657FB607BB4F21C90BB6651BC067AF28BC90111.asc: New file. * tests/openpgp/use-exact-key.test: New file. * tests/openpgp/version.test: Install the new private keys. -- Signed-off-by: Neal H. Walfield Reported-by: Reported-by: Kristian Fiskerstrand Fixes-commit: 10cca02 --- g10/gpg.c | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) (limited to 'g10') 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; -- cgit v1.2.3