common,gpg: Fix processing of search descriptions ending in '!'.

* g10/gpg.c (check_user_ids): If the search description describes a
keyid or fingerprint and ends in a '!', include the '!' in the
rewritten description.
* common/userids.c (classify_user_id): Accept keyids and fingerprints
ending in '!'.

--
Signed-off-by: Neal H. Walfield <neal@g10code.com>
Reported-by: Kristian Fiskerstrand
  <kristian.fiskerstrand@sumptuouscapital.com>
Fixes-commit: f99830b7
Fixes-commit: e8c53fca
This commit is contained in:
Neal H. Walfield 2015-12-02 11:07:05 +01:00
parent 9c34711539
commit 10cca02c4c
2 changed files with 25 additions and 5 deletions

View File

@ -282,7 +282,9 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack)
if (desc->exact) if (desc->exact)
hexlength--; /* Remove the bang. */ hexlength--; /* Remove the bang. */
if ((hexlength == 8 && s[hexlength] == 0) if ((hexlength == 8
&& (s[hexlength] == 0
|| (s[hexlength] == '!' && s[hexlength + 1] == 0)))
|| (!hexprefix && hexlength == 9 && *s == '0')) || (!hexprefix && hexlength == 9 && *s == '0'))
{ {
/* Short keyid. */ /* Short keyid. */
@ -291,7 +293,9 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack)
desc->u.kid[1] = strtoul( s, NULL, 16 ); desc->u.kid[1] = strtoul( s, NULL, 16 );
mode = KEYDB_SEARCH_MODE_SHORT_KID; mode = KEYDB_SEARCH_MODE_SHORT_KID;
} }
else if ((hexlength == 16 && s[hexlength] == 0) else if ((hexlength == 16
&& (s[hexlength] == 0
|| (s[hexlength] == '!' && s[hexlength + 1] == 0)))
|| (!hexprefix && hexlength == 17 && *s == '0')) || (!hexprefix && hexlength == 17 && *s == '0'))
{ {
/* Long keyid. */ /* Long keyid. */
@ -303,7 +307,9 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack)
desc->u.kid[1] = strtoul (s+8, NULL, 16); desc->u.kid[1] = strtoul (s+8, NULL, 16);
mode = KEYDB_SEARCH_MODE_LONG_KID; mode = KEYDB_SEARCH_MODE_LONG_KID;
} }
else if ((hexlength == 32 && s[hexlength] == 0) else if ((hexlength == 32
&& (s[hexlength] == 0
|| (s[hexlength] == '!' && s[hexlength + 1] == 0)))
|| (!hexprefix && hexlength == 33 && *s == '0')) || (!hexprefix && hexlength == 33 && *s == '0'))
{ {
/* MD5 fingerprint. */ /* MD5 fingerprint. */
@ -323,7 +329,9 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack)
} }
mode = KEYDB_SEARCH_MODE_FPR16; mode = KEYDB_SEARCH_MODE_FPR16;
} }
else if ((hexlength == 40 && s[hexlength] == 0) else if ((hexlength == 40
&& (s[hexlength] == 0
|| (s[hexlength] == '!' && s[hexlength + 1] == 0)))
|| (!hexprefix && hexlength == 41 && *s == '0')) || (!hexprefix && hexlength == 41 && *s == '0'))
{ {
/* SHA1/RMD160 fingerprint. */ /* SHA1/RMD160 fingerprint. */

View File

@ -2109,7 +2109,8 @@ check_user_ids (strlist_t *sp,
PKT_public_key *pk; PKT_public_key *pk;
char fingerprint_bin[MAX_FINGERPRINT_LEN]; char fingerprint_bin[MAX_FINGERPRINT_LEN];
size_t fingerprint_bin_len = sizeof (fingerprint_bin); size_t fingerprint_bin_len = sizeof (fingerprint_bin);
char fingerprint[2 * MAX_FINGERPRINT_LEN + 1]; /* We also potentially need a ! at the end. */
char fingerprint[2 * MAX_FINGERPRINT_LEN + 1 + 1];
switch (t->flags >> 2) switch (t->flags >> 2)
@ -2198,6 +2199,17 @@ check_user_ids (strlist_t *sp,
fingerprint_from_pk (pk, fingerprint_bin, &fingerprint_bin_len); fingerprint_from_pk (pk, fingerprint_bin, &fingerprint_bin_len);
assert (fingerprint_bin_len == sizeof (fingerprint_bin)); assert (fingerprint_bin_len == sizeof (fingerprint_bin));
bin2hex (fingerprint_bin, MAX_FINGERPRINT_LEN, fingerprint); 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, '!'))
{
int i = strlen (fingerprint);
fingerprint[i] = '!';
fingerprint[i + 1] = '\0';
}
add_to_strlist (&s2, fingerprint); add_to_strlist (&s2, fingerprint);
s2->flags = s->flags; s2->flags = s->flags;