diff options
Diffstat (limited to 'g10/keyserver.c')
-rw-r--r-- | g10/keyserver.c | 75 |
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 (); |