aboutsummaryrefslogtreecommitdiffstats
path: root/g10/keyserver.c
diff options
context:
space:
mode:
Diffstat (limited to 'g10/keyserver.c')
-rw-r--r--g10/keyserver.c75
1 files changed, 28 insertions, 47 deletions
diff --git a/g10/keyserver.c b/g10/keyserver.c
index a8c222d3f..66900f7a9 100644
--- a/g10/keyserver.c
+++ b/g10/keyserver.c
@@ -470,7 +470,6 @@ parse_preferred_keyserver(PKT_signature *sig)
static void
print_keyrec (ctrl_t ctrl, int number,struct keyrec *keyrec)
{
- int i;
iobuf_writebyte(keyrec->uidbuf,0);
iobuf_flush_temp(keyrec->uidbuf);
@@ -509,20 +508,11 @@ print_keyrec (ctrl_t ctrl, int number,struct keyrec *keyrec)
es_printf ("key %s",keystr(keyrec->desc.u.kid));
break;
- /* If it gave us a PGP 2.x fingerprint, not much we can do
- beyond displaying it. */
- case KEYDB_SEARCH_MODE_FPR16:
- es_printf ("key ");
- for(i=0;i<16;i++)
- es_printf ("%02X",keyrec->desc.u.fpr[i]);
- break;
-
- /* If we get a modern fingerprint, we have the most
- flexibility. */
- case KEYDB_SEARCH_MODE_FPR20:
+ case KEYDB_SEARCH_MODE_FPR:
{
u32 kid[2];
- keyid_from_fingerprint (ctrl, keyrec->desc.u.fpr,20,kid);
+ keyid_from_fingerprint (ctrl, keyrec->desc.u.fpr, keyrec->desc.fprlen,
+ kid);
es_printf("key %s",keystr(kid));
}
break;
@@ -613,8 +603,7 @@ parse_keyrec(char *keystring)
err = classify_user_id (tok, &work->desc, 1);
if (err || (work->desc.mode != KEYDB_SEARCH_MODE_SHORT_KID
&& work->desc.mode != KEYDB_SEARCH_MODE_LONG_KID
- && work->desc.mode != KEYDB_SEARCH_MODE_FPR16
- && work->desc.mode != KEYDB_SEARCH_MODE_FPR20))
+ && work->desc.mode != KEYDB_SEARCH_MODE_FPR))
{
work->desc.mode=KEYDB_SEARCH_MODE_NONE;
return ret;
@@ -995,8 +984,7 @@ keyserver_export (ctrl_t ctrl, strlist_t users)
err = classify_user_id (users->d, &desc, 1);
if (err || (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))
+ && desc.mode != KEYDB_SEARCH_MODE_FPR))
{
log_error(_("\"%s\" not a key ID: skipping\n"),users->d);
continue;
@@ -1065,14 +1053,9 @@ keyserver_retrieval_screener (kbnode_t keyblock, void *opaque)
/* Compare requested and returned fingerprints if available. */
for (n = 0; n < ndesc; n++)
{
- if (desc[n].mode == KEYDB_SEARCH_MODE_FPR20)
- {
- if (fpr_len == 20 && !memcmp (fpr, desc[n].u.fpr, 20))
- return 0;
- }
- else if (desc[n].mode == KEYDB_SEARCH_MODE_FPR16)
+ if (desc[n].mode == KEYDB_SEARCH_MODE_FPR)
{
- if (fpr_len == 16 && !memcmp (fpr, desc[n].u.fpr, 16))
+ if (fpr_len == desc[n].fprlen && !memcmp (fpr, desc[n].u.fpr, 32))
return 0;
}
else if (desc[n].mode == KEYDB_SEARCH_MODE_LONG_KID)
@@ -1110,8 +1093,7 @@ keyserver_import (ctrl_t ctrl, strlist_t users)
err = classify_user_id (users->d, &desc[count], 1);
if (err || (desc[count].mode != KEYDB_SEARCH_MODE_SHORT_KID
&& desc[count].mode != KEYDB_SEARCH_MODE_LONG_KID
- && desc[count].mode != KEYDB_SEARCH_MODE_FPR16
- && desc[count].mode != KEYDB_SEARCH_MODE_FPR20))
+ && desc[count].mode != KEYDB_SEARCH_MODE_FPR))
{
log_error (_("\"%s\" not a key ID: skipping\n"), users->d);
continue;
@@ -1167,14 +1149,13 @@ keyserver_import_fprint (ctrl_t ctrl, const byte *fprint,size_t fprint_len,
memset(&desc,0,sizeof(desc));
- if(fprint_len==16)
- desc.mode=KEYDB_SEARCH_MODE_FPR16;
- else if(fprint_len==20)
- desc.mode=KEYDB_SEARCH_MODE_FPR20;
+ if (fprint_len == 16 || fprint_len == 20 || fprint_len == 32)
+ desc.mode = KEYDB_SEARCH_MODE_FPR;
else
return -1;
memcpy(desc.u.fpr,fprint,fprint_len);
+ desc.fprlen = fprint_len;
/* TODO: Warn here if the fingerprint we got doesn't match the one
we asked for? */
@@ -1291,20 +1272,21 @@ keyidlist (ctrl_t ctrl, strlist_t users, KEYDB_SEARCH_DESC **klist,
This is because it's easy to calculate any sort of keyid
from a v4 fingerprint, but not a v3 fingerprint. */
- if(node->pkt->pkt.public_key->version<4)
+ if (node->pkt->pkt.public_key->version < 4)
{
(*klist)[*count].mode=KEYDB_SEARCH_MODE_LONG_KID;
keyid_from_pk(node->pkt->pkt.public_key,
(*klist)[*count].u.kid);
}
else
- {
- size_t dummy;
+ {
+ size_t fprlen;
- (*klist)[*count].mode=KEYDB_SEARCH_MODE_FPR20;
- fingerprint_from_pk(node->pkt->pkt.public_key,
- (*klist)[*count].u.fpr,&dummy);
- }
+ fingerprint_from_pk (node->pkt->pkt.public_key,
+ (*klist)[*count].u.fpr, &fprlen);
+ (*klist)[*count].mode = KEYDB_SEARCH_MODE_FPR;
+ (*klist)[*count].fprlen = fprlen;
+ }
/* This is a little hackish, using the skipfncvalue as a
void* pointer to the keyserver spec, but we don't need
@@ -1528,7 +1510,7 @@ keyserver_search (ctrl_t ctrl, strlist_t tokens)
err = gpg_dirmngr_ks_search (ctrl, searchstr, search_line_handler, &parm);
- if (parm.not_found)
+ if (parm.not_found || gpg_err_code (err) == GPG_ERR_NO_DATA)
{
if (parm.searchstr_disp)
log_info (_("key \"%s\" not found on keyserver\n"),
@@ -1539,6 +1521,8 @@ keyserver_search (ctrl_t ctrl, strlist_t tokens)
if (gpg_err_code (err) == GPG_ERR_NO_KEYSERVER)
log_error (_("no keyserver known (use option --keyserver)\n"));
+ else if (gpg_err_code (err) == GPG_ERR_NO_DATA)
+ err = gpg_error (GPG_ERR_NOT_FOUND);
else if (err)
log_error ("error searching keyserver: %s\n", gpg_strerror (err));
@@ -1618,10 +1602,9 @@ keyserver_get_chunk (ctrl_t ctrl, KEYDB_SEARCH_DESC *desc, int ndesc,
{
int quiet = 0;
- if (desc[idx].mode == KEYDB_SEARCH_MODE_FPR20
- || desc[idx].mode == KEYDB_SEARCH_MODE_FPR16)
+ if (desc[idx].mode == KEYDB_SEARCH_MODE_FPR)
{
- n = 1+2+2*20;
+ n = 1+2+2*desc[idx].fprlen;
if (idx && linelen + n > MAX_KS_GET_LINELEN)
break; /* Declare end of this chunk. */
linelen += n;
@@ -1632,11 +1615,9 @@ keyserver_get_chunk (ctrl_t ctrl, KEYDB_SEARCH_DESC *desc, int ndesc,
else
{
strcpy (pattern[npat], "0x");
- bin2hex (desc[idx].u.fpr,
- desc[idx].mode == KEYDB_SEARCH_MODE_FPR20? 20 : 16,
- pattern[npat]+2);
+ bin2hex (desc[idx].u.fpr, desc[idx].fprlen, pattern[npat]+2);
npat++;
- if (desc[idx].mode == KEYDB_SEARCH_MODE_FPR20)
+ if (desc[idx].fprlen == 20 || desc[idx].fprlen == 32)
npat_fpr++;
}
}
@@ -1715,7 +1696,7 @@ keyserver_get_chunk (ctrl_t ctrl, KEYDB_SEARCH_DESC *desc, int ndesc,
}
}
- /* Remember now many of search items were considered. Note that
+ /* Remember how many of the search items were considered. Note that
this is different from NPAT. */
*r_ndesc_used = idx;
@@ -2053,7 +2034,7 @@ keyserver_import_wkd (ctrl_t ctrl, const char *name, int quick,
/* We want to work on the mbox. That is what dirmngr will do anyway
* and we need the mbox for the import filter anyway. */
- mbox = mailbox_from_userid (name);
+ mbox = mailbox_from_userid (name, 0);
if (!mbox)
{
err = gpg_error_from_syserror ();