summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/userids.c16
-rw-r--r--g10/gpg.c14
2 files changed, 25 insertions, 5 deletions
diff --git a/common/userids.c b/common/userids.c
index f9a003607..e094c69fa 100644
--- a/common/userids.c
+++ b/common/userids.c
@@ -282,7 +282,9 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack)
if (desc->exact)
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'))
{
/* 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 );
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'))
{
/* 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);
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'))
{
/* MD5 fingerprint. */
@@ -323,7 +329,9 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack)
}
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'))
{
/* SHA1/RMD160 fingerprint. */
diff --git a/g10/gpg.c b/g10/gpg.c
index 5c5afa690..5aeb94da8 100644
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -2109,7 +2109,8 @@ check_user_ids (strlist_t *sp,
PKT_public_key *pk;
char fingerprint_bin[MAX_FINGERPRINT_LEN];
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)
@@ -2198,6 +2199,17 @@ check_user_ids (strlist_t *sp,
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, '!'))
+ {
+ int i = strlen (fingerprint);
+ fingerprint[i] = '!';
+ fingerprint[i + 1] = '\0';
+ }
+
add_to_strlist (&s2, fingerprint);
s2->flags = s->flags;