From 9668ee097a1474299b8debecb1ee38620a327082 Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Thu, 3 Jun 2021 13:29:29 +0900 Subject: [PATCH] gpg: Support KEYGRIP search with traditional keyring. * g10/keyring.c (keyring_search): Handle KEYDB_SEARCH_MODE_KEYGRIP. -- GnuPG-bug-id: 5469 Signed-off-by: NIIBE Yutaka --- g10/keyring.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/g10/keyring.c b/g10/keyring.c index e044cab1a..baddf5d54 100644 --- a/g10/keyring.c +++ b/g10/keyring.c @@ -968,7 +968,7 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc, int save_mode; off_t offset, main_offset; size_t n; - int need_uid, need_words, need_keyid, need_fpr, any_skip; + int need_uid, need_words, need_keyid, need_fpr, any_skip, need_grip; int pk_no, uid_no; int initial_skip; int scanned_from_start; @@ -976,9 +976,10 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc, PKT_user_id *uid = NULL; PKT_public_key *pk = NULL; u32 aki[2]; + unsigned char grip[KEYGRIP_LEN]; /* figure out what information we need */ - need_uid = need_words = need_keyid = need_fpr = any_skip = 0; + need_uid = need_words = need_keyid = need_fpr = any_skip = need_grip = 0; for (n=0; n < ndesc; n++) { switch (desc[n].mode) @@ -1005,8 +1006,11 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc, /* always restart the search in this mode */ keyring_search_reset (hd); break; + case KEYDB_SEARCH_MODE_KEYGRIP: + need_grip = 1; + break; default: break; - } + } if (desc[n].skipfnc) { any_skip = 1; @@ -1143,6 +1147,8 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc, } if (need_keyid) keyid_from_pk (pk, aki); + if (need_grip) + keygrip_from_pk (pk, grip); if (use_key_present_hash && !key_present_hash_ready @@ -1197,6 +1203,10 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc, if (pk) goto found; break; + case KEYDB_SEARCH_MODE_KEYGRIP: + if (pk && !memcmp (desc[n].u.grip, grip, KEYGRIP_LEN)) + goto found; + break; default: rc = GPG_ERR_INV_ARG; goto found;