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 <gniibe@fsij.org>
This commit is contained in:
NIIBE Yutaka 2021-06-03 13:29:29 +09:00
parent c17dac5ac3
commit 9668ee097a
1 changed files with 13 additions and 3 deletions

View File

@ -968,7 +968,7 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
int save_mode; int save_mode;
off_t offset, main_offset; off_t offset, main_offset;
size_t n; 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 pk_no, uid_no;
int initial_skip; int initial_skip;
int scanned_from_start; int scanned_from_start;
@ -976,9 +976,10 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
PKT_user_id *uid = NULL; PKT_user_id *uid = NULL;
PKT_public_key *pk = NULL; PKT_public_key *pk = NULL;
u32 aki[2]; u32 aki[2];
unsigned char grip[KEYGRIP_LEN];
/* figure out what information we need */ /* 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++) for (n=0; n < ndesc; n++)
{ {
switch (desc[n].mode) switch (desc[n].mode)
@ -1005,8 +1006,11 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
/* always restart the search in this mode */ /* always restart the search in this mode */
keyring_search_reset (hd); keyring_search_reset (hd);
break; break;
case KEYDB_SEARCH_MODE_KEYGRIP:
need_grip = 1;
break;
default: break; default: break;
} }
if (desc[n].skipfnc) if (desc[n].skipfnc)
{ {
any_skip = 1; any_skip = 1;
@ -1143,6 +1147,8 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
} }
if (need_keyid) if (need_keyid)
keyid_from_pk (pk, aki); keyid_from_pk (pk, aki);
if (need_grip)
keygrip_from_pk (pk, grip);
if (use_key_present_hash if (use_key_present_hash
&& !key_present_hash_ready && !key_present_hash_ready
@ -1197,6 +1203,10 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
if (pk) if (pk)
goto found; goto found;
break; break;
case KEYDB_SEARCH_MODE_KEYGRIP:
if (pk && !memcmp (desc[n].u.grip, grip, KEYGRIP_LEN))
goto found;
break;
default: default:
rc = GPG_ERR_INV_ARG; rc = GPG_ERR_INV_ARG;
goto found; goto found;