diff options
author | Werner Koch <[email protected]> | 2016-04-27 06:34:29 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2016-04-27 06:34:29 +0000 |
commit | 87de9e19edf0311ca0342e15ef44ebe40e32861e (patch) | |
tree | 20f8f2c384040344ece6e00c64036c666dd4a843 /g10/call-dirmngr.c | |
parent | dirmngr: Add experimental command WKD_GET. (diff) | |
download | gnupg-87de9e19edf0311ca0342e15ef44ebe40e32861e.tar.gz gnupg-87de9e19edf0311ca0342e15ef44ebe40e32861e.zip |
gpg: Add experimental AKL method "wkd" and option --with-wkd-hash.
* g10/getkey.c (parse_auto_key_locate): Add method "wkd".
(get_pubkey_byname): Implement that method. Also rename a variable.
* g10/call-dirmngr.c (gpg_dirmngr_wkd_get): New.
* g10/keyserver.c (keyserver_import_wkd): New.
* g10/test-stubs.c (keyserver_import_wkd): Add stub.
* g10/gpgv.c (keyserver_import_wkd): Ditto.
* g10/options.h (opt): Add field 'with_wkd_hash'.
(AKL_WKD): New.
* g10/gpg.c (oWithWKDHash): New.
(opts): Add option --with-wkd-hash.
(main): Set that option.
* g10/keylist.c (list_keyblock_print): Implement that option.
--
The Web Key Directory is an experimental feature to retrieve a key via
https. It is similar to OpenPGP DANE but also uses an encryption to
reveal less information about a key lookup.
For example the URI to lookup the key for [email protected] is:
https://example.org/.well-known/openpgpkey/
hu/example.org/iy9q119eutrkn8s1mk4r39qejnbu3n5q
(line has been wrapped for rendering purposes). The hash is a
z-Base-32 encoded SHA-1 hash of the mail address' local-part. The
address [email protected] can be used for testing.
Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to '')
-rw-r--r-- | g10/call-dirmngr.c | 61 |
1 files changed, 60 insertions, 1 deletions
diff --git a/g10/call-dirmngr.c b/g10/call-dirmngr.c index e59653362..b0f249e8c 100644 --- a/g10/call-dirmngr.c +++ b/g10/call-dirmngr.c @@ -1064,7 +1064,7 @@ gpg_dirmngr_ks_put (ctrl_t ctrl, void *data, size_t datalen, kbnode_t keyblock) -/* Data callback for the DNS_CERT command. */ +/* Data callback for the DNS_CERT and WKD_GET commands. */ static gpg_error_t dns_cert_data_cb (void *opaque, const void *data, size_t datalen) { @@ -1287,3 +1287,62 @@ gpg_dirmngr_get_pka (ctrl_t ctrl, const char *userid, close_context (ctrl, ctx); return err; } + + + +/* Ask the dirmngr to retrieve a key via the Web Key Directory + * protocol. On success a new estream with the key is stored at + * R_KEY. + */ +gpg_error_t +gpg_dirmngr_wkd_get (ctrl_t ctrl, const char *name, estream_t *r_key) +{ + gpg_error_t err; + assuan_context_t ctx; + struct dns_cert_parm_s parm; + char *line = NULL; + + memset (&parm, 0, sizeof parm); + + err = open_context (ctrl, &ctx); + if (err) + return err; + + line = es_bsprintf ("WKD_GET -- %s", name); + if (!line) + { + err = gpg_error_from_syserror (); + goto leave; + } + if (strlen (line) + 2 >= ASSUAN_LINELENGTH) + { + err = gpg_error (GPG_ERR_TOO_LARGE); + goto leave; + } + + parm.memfp = es_fopenmem (0, "rwb"); + if (!parm.memfp) + { + err = gpg_error_from_syserror (); + goto leave; + } + err = assuan_transact (ctx, line, dns_cert_data_cb, &parm, + NULL, NULL, NULL, &parm); + if (err) + goto leave; + + if (r_key) + { + es_rewind (parm.memfp); + *r_key = parm.memfp; + parm.memfp = NULL; + } + + leave: + xfree (parm.fpr); + xfree (parm.url); + es_fclose (parm.memfp); + xfree (line); + close_context (ctrl, ctx); + return err; +} |