<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.35 (Ruby 3.3.8) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-ietf-openpgp-hkp-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="HKP">OpenPGP HTTP Keyserver Protocol</title>

    <author fullname="Daphne Shaw">
      <organization>Jabberwocky Tech</organization>
      <address>
        <email>dshaw@jabberwocky.com</email>
      </address>
    </author>
    <author fullname="Andrew Gallagher" role="editor">
      <organization>PGPKeys.EU</organization>
      <address>
        <email>andrewg@andrewg.com</email>
      </address>
    </author>
    <author fullname="Daniel Huigens">
      <organization>Proton AG</organization>
      <address>
        <email>d.huigens@protonmail.com</email>
      </address>
    </author>

    <date year="2026" month="June" day="05"/>

    <area>sec</area>
    <workgroup>openpgp</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 70?>

<t>This document specifies a series of conventions to implement an OpenPGP keyserver using the Hypertext Transfer Protocol (HTTP).
As this document is a codification and extension of a protocol that is already in wide use, strict attention is paid to backward compatibility with these existing implementations.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        The latest revision of this draft can be found at <eref target="https://andrewgdotcom.gitlab.io/openpgp-hkp"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-openpgp-hkp/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        OpenPGP Working Group mailing list (<eref target="mailto:openpgp@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/openpgp/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/openpgp/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://gitlab.com/andrewgdotcom/openpgp-hkp"/>.</t>
    </note>


  </front>

  <middle>


<?line 75?>

<section anchor="introduction"><name>Introduction</name>

<t>For ease of use, public key cryptography requires a key distribution system.
For many years, the most commonly used system has been a keyserver - a server that stores public keys and/or certificates, with a searchable interface.
The HTTP Keyserver Protocol is a OpenPGP keyserver implemented using HTTP.</t>

</section>
<section anchor="conventions-definitions"><name>Conventions and Definitions</name>

<t>The term "OpenPGP Certificate" is used in this document interchangeably with "OpenPGP Transferable Public Key", as defined in <xref section="10.1" sectionFormat="of" target="RFC9580"/>.</t>

<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

<?line -18?>

</section>
<section anchor="keyserver-use-cases"><name>Keyserver Use Cases</name>

<t>A keyserver is typically used for the following (non-exhaustive) use cases:</t>

<section anchor="certificate-discovery"><name>Certificate Discovery</name>

<t>When initiating secure communication with a new correspondent, a client will typically attempt to discover the encryption key(s) that it should use.
This is a subtle issue with many security considerations, however many discovery methods involve looking up a certificate on a server using a human-readable identifier such as an email address.</t>

</section>
<section anchor="certificate-refresh"><name>Certificate Refresh</name>

<t>Certificates in OpenPGP are dynamic objects, therefore it is important to refresh known certificates in order to pick up the latest changes.
These changes can include new subkeys and User IDs, updated self-signatures and third-party certifications, and revocations.
In some cases it may no longer be possible to search by User ID, therefore it is <bcp14>RECOMMENDED</bcp14> that clients refresh known certificates by primary key fingerprint search.</t>

</section>
<section anchor="reference-resolution"><name>Reference Resolution</name>

<t>The OpenPGP wire format includes fields that reference primary keys or subkeys by either Key ID or fingerprint.
A client may therefore wish to search for previously unknown certificates based on such a reference.</t>

</section>
</section>
<section anchor="hkp-and-http"><name>HKP and HTTP</name>

<t>As HKP is implemented over HTTP, everything in <xref target="RFC9110"></xref> applies to HKP as well, and HKP error codes are the same as the ones used in HTTP.</t>

<t>Due the very large deployment of HKP clients based on HTTP version 1.0, HKP keyservers <bcp14>MUST</bcp14> support HTTP 1.0.
HKP keyservers <bcp14>MAY</bcp14> additionally support other HTTP versions.</t>

<t>(( dshaw : I expect this to be controversial, but we've got tons of deployed code that only works with 1.0.
I'd be willing to discuss removing this <bcp14>MUST</bcp14> or make it a <bcp14>SHOULD</bcp14> and add a "implementation notes" section pointing out the problem instead.
See issue #5.
))</t>

<t>When used over HTTPS, HKP is commonly referred to as "HKPS".</t>

<t>HKP(S) are distinguished from generic use of HTTP(S) by using the URI schemes "hkp" and "hkps" <xref target="RFC7595"></xref>.
HKP is assigned port number 11371 and HKPS is assigned 11372 (although this is rarely used in practice).
For reasons of maximum compatibility with firewalls and filtering HTTP proxies, HKP(S) are often served over the standard HTTP(S) port(s) (TCP ports 80 and 443).</t>

<t>By convention and history, HKP defaults to HTTP on TCP port 11371, and HKPS defaults to HTTPS on TCP port 443.</t>

<t>(( andrewg : if we assign hkps, we appear to be required to specify a dedicated port, even though nobody uses it.
See issue #14.
))</t>

<t>A keyserver <bcp14>SHOULD</bcp14> support both HKP and HKPS.
A client <bcp14>SHOULD</bcp14> use HKPS, or a transport method with equivalent security properties, such as Tor hidden services <xref target="TOR"></xref>.</t>

<t>When making a request over HKPS, a client <bcp14>SHOULD</bcp14> use the same domain-matching rules for TLS certificate verification as in HTTPS <xref target="RFC9525"></xref>.</t>

<section anchor="request-paths"><name>Request Paths</name>

<t>HKP defines three paths, namely "/pks/v2" for the v2 API (<xref target="v2-api"/>), "/pks/lookup" for legacy lookups (<xref target="legacy-lookups"/>), and "/pks/add" for legacy submission (<xref target="legacy-submission"/>).
Paths beginning with "/pks/v&lt;?&gt;" are reserved for future versions of HKP.</t>

<t>A keyserver <bcp14>MAY</bcp14> support requests to other paths under "/pks", but these are outside the scope of this document.
These alternative paths have historically been used to provide human-readable interfaces such as HTML forms, and functionality extensions such as <xref target="SKS"></xref>.</t>

<t>It should be noted that there is no "/pks/v1" path.
The legacy paths may be considered as "HKP version 1", but contain no explicit version number as they pre-date the modern standard practice of API versioning.</t>

<section anchor="backwards-compatibility"><name>Backwards Compatibility</name>

<t>The legacy API is specified below (<xref target="legacy-api"/>) to describe the version of HKP already in long-standing deployed use.
It is expected that existing public keyservers will continue to support this protocol for some time, and so a normative reference is provided in this document.
A keyserver <bcp14>MAY</bcp14> choose to implement only the v2 API, for example if it does not expect to be used by legacy clients, or if it only serves v6 or later key material.</t>

<t>The "/pks" prefix used in all HKP API paths is maintained for backwards-compatibility with the older install base.
While the use of "/.well-known" for fixed paths is normally recommended, we have intentionally chosen to retain the "/pks" prefix in the v2 API.
This facilitates a smooth upgrade pathway from legacy to v2, without requiring the reconfiguration of firewalls or HTTP proxies.</t>

<t>The authors believe this is still compliant with modern best practice:</t>

<t><list style="symbols">
  <t>The use of fixed paths is permitted in custom URL schemes such as <spanx style="verb">hkp(s)</spanx> (<xref section="2.3" sectionFormat="of" target="RFC8820"/>)</t>
  <t>User-writable files under <spanx style="verb">./well-known</spanx> are not recommended (<xref section="4" sectionFormat="of" target="RFC8615"/>), which might prevent an HKP service being served directly from a filesystem (<xref target="discovery-lookup"/>)</t>
</list></t>

</section>
</section>
<section anchor="http-status"><name>HTTP Status Codes</name>

<t>When a status or error code needs to be returned by a keyserver, the most appropriate HTTP code from <xref target="RFC9110"></xref> should be used.
It is good practice to return the most specific error code possible: for example, returning 404 ("Not Found") rather than 400 ("Bad Request") when a certificate is not found.</t>

<t>This document gives suggested HTTP error codes for several common situations.
Note that these are only suggestions, and implementations may have good reasons (such as not revealing the reason why a request failed) for using other error codes.</t>

<t>Clients <bcp14>SHOULD</bcp14> understand the following codes:</t>

<texttable title="Status Codes" anchor="status-codes">
      <ttcol align='left'>Status Code</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>200 OK</c>
      <c>Request succeeded</c>
      <c>400 Bad request</c>
      <c>The request was malformed</c>
      <c>403 Forbidden</c>
      <c>The requested category/operation is not permitted</c>
      <c>404 Not found</c>
      <c>The search returned no results, or path not found</c>
      <c>410 Gone</c>
      <c>Requested data has been permanently deleted, e.g. due to RTBF</c>
      <c>422 Unprocessable content</c>
      <c>Submission was not well formed</c>
      <c>501 Not implemented</c>
      <c>The requested category/operation is not supported</c>
</texttable>

<t>In addition, a client <bcp14>SHOULD</bcp14> understand 3xx redirect codes.</t>

<t>A server that can distinguish a syntactically invalid HKP request path from a well-formed request that has no matching result <bcp14>MAY</bcp14> return 400 ("Bad Request") for the former case.
Clients <bcp14>SHOULD NOT</bcp14> rely on this distinction, as static deployments <bcp14>MAY</bcp14> return 404 ("Not Found") or another appropriate unsuccessful response instead.</t>

</section>
</section>
<section anchor="v2-api"><name>The v2 API</name>

<t>The v2 API is a RESTful interface that uses the GET, PUT, POST, DELETE, HEAD, and OPTIONS methods.
The URL path (<xref section="3.3" sectionFormat="of" target="RFC3986"/>) is built up of the base path "/pks/v2", followed by request-specific URL path components.</t>

<section anchor="v2-lookup-format"><name>v2 Lookup Format</name>

<t>Certificate lookups are done via an HTTP GET request.</t>

<t>v2 lookups normally include both "category" and "identifier" URL path components.
They are appended to "/pks/v2" as follows:</t>

<figure><artwork><![CDATA[
GET /pks/v2/<category>/<identifier>
]]></artwork></figure>

<t>The "category" and "identifier" components <bcp14>MUST</bcp14> be supplied.</t>

<t>When the v2 lookup format is being used, v2 output format (<xref target="v2-output-format"/>) <bcp14>MUST</bcp14> be returned.</t>

<t>The v2 lookup format is designed so that a basic HKP service can be implemented using static files.</t>

<texttable title="v2 Lookup Categories" anchor="v2-lookup-categories">
      <ttcol align='left'>Category</ttcol>
      <ttcol align='left'>Identifier format</ttcol>
      <ttcol align='left'>Output data</ttcol>
      <ttcol align='left'>See</ttcol>
      <c><spanx style="verb">certs/by-identity</spanx></c>
      <c>identity</c>
      <c>Certificate bundle</c>
      <c><xref target="identity-category"/></c>
      <c><spanx style="verb">certs/by-vfingerprint</spanx></c>
      <c>versioned fingerprint</c>
      <c>Certificate bundle</c>
      <c><xref target="vfingerprint-category"/></c>
      <c><spanx style="verb">certs/by-keyid</spanx></c>
      <c>key ID</c>
      <c>Certificate bundle</c>
      <c><xref target="keyid-category"/></c>
      <c><spanx style="verb">canonical</spanx></c>
      <c>identity</c>
      <c>Canonical bundle</c>
      <c><xref target="canonical-lookup-category"/></c>
      <c><spanx style="verb">index</spanx></c>
      <c>identity</c>
      <c>Index of certificates</c>
      <c><xref target="index-category"/></c>
      <c><spanx style="verb">prefixlog</spanx></c>
      <c>date</c>
      <c>List of prefixes</c>
      <c><xref target="prefixlog-category"/></c>
</texttable>

<section anchor="identity-category"><name>The "certs/by-identity" Lookup Category</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "certs/by-identity" lookup category.</t>

<figure><artwork><![CDATA[
GET /pks/v2/certs/by-identity/<identifier>
]]></artwork></figure>

<t>The "certs/by-identity" category identifies each certificate by matching the contents of its User ID packet(s) (<xref target="identity-lookups"/>).
The response to a successful "certs/by-identity" request is a certificate bundle as specified in <xref target="certificate-bundle-format"/>, which <bcp14>MUST NOT</bcp14> be ASCII-armored.</t>

<t>A keyserver <bcp14>SHOULD</bcp14> limit the returned certificate bundle to a reasonable length.
Results <bcp14>SHOULD</bcp14> be sorted in order of decreasing confidence in the identity link (<xref target="confidence"/>), and then by creation date (most recent first).
A keyserver <bcp14>MAY</bcp14> choose to only return results where the identity being searched for exceeds a minimum confidence value, and <bcp14>MAY</bcp14> treat "certs/by-identity" as a synonym for "canonical".
If no certificates match the request, the keyserver <bcp14>SHOULD</bcp14> return an appropriate HTTP error code such as 404 ("Not Found").</t>

</section>
<section anchor="vfingerprint-category"><name>The "certs/by-vfingerprint" Lookup Category</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "certs/by-vfingerprint" lookup category.</t>

<figure><artwork><![CDATA[
GET /pks/v2/certs/by-vfingerprint/<version>/<fingerprint>
]]></artwork></figure>

<t>The "certs/by-vfingerprint" category identifies each certificate by the versioned fingerprint of its primary key or a subkey.
The one-octet version and 20- or 32-octet fingerprint are provided in the subsequent path components in hexadecimal encoding.</t>

<t>The version and fingerprint <bcp14>MUST</bcp14> be padded to standard length with leading zeros, i.e 2 hex digits for the version, and 40 or 64 hex digits for the fingerprint.
Unlike legacy fingerprint lookups (<xref target="legacy-searches"/>), no "0x" prefix is used.
The hexadecimal digits are not case sensitive.</t>

<t>This is the same octet sequence used in the Issuer Fingerprint and Intended Recipient Fingerprint subpackets (<xref section="5.2.3" sectionFormat="of" target="RFC9580"/>), formatted for readability.</t>

<t>A keyserver:</t>

<t><list style="symbols">
  <t><bcp14>SHOULD</bcp14> include matches with both primary key and subkey fingerprints.</t>
  <t><bcp14>MAY</bcp14> omit matches with encryption-only subkeys.</t>
</list></t>

<t>If no certificates match the request, the keyserver <bcp14>SHOULD</bcp14> return an appropriate HTTP error code such as 404 ("Not Found").</t>

</section>
<section anchor="keyid-category"><name>The "certs/by-keyid" Lookup Category</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "certs/by-keyid" lookup category.</t>

<figure><artwork><![CDATA[
GET /pks/v2/certs/by-keyid/<identifier>
]]></artwork></figure>

<t>The "certs/by-keyid" category identifies each certificate by the Key ID of its primary key or a subkey (<xref section="5.5.4" sectionFormat="of" target="RFC9580"/>).
The Key ID is provided in the "identifier" path component as 16 hexadecimal digits, without a preceding "0x".
The hexadecimal digits are not case sensitive.</t>

<t>A keyserver:</t>

<t><list style="symbols">
  <t><bcp14>SHOULD</bcp14> include matches with both primary key and subkey Key IDs.</t>
  <t><bcp14>MAY</bcp14> omit matches with encryption-only subkeys.</t>
</list></t>

<t>If no certificates match the request, the keyserver <bcp14>SHOULD</bcp14> return an appropriate HTTP error code such as 404 ("Not Found").</t>

<t>"certs/by-keyid" is only required for locating a signing key that made either a V3 signature, or a V4 signature with an Issuer Key ID subpacket and no Issuer Fingerprint subpacket.
Issuer Key ID subpackets are not specified for use in later signature versions (<xref section="5.2.3.12" sectionFormat="of" target="RFC9580"/>), and so certificates with versions greater than 4 <bcp14>MUST NOT</bcp14> be returned in response to a "certs/by-keyid" request.</t>

</section>
<section anchor="canonical-lookup-category"><name>The "canonical" Lookup Category</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "canonical" lookup category.</t>

<figure><artwork><![CDATA[
GET /pks/v2/canonical/<identifier>
]]></artwork></figure>

<t>The "canonical" category is similar to the "certs/by-identity" category, but is intended specifically for certificate discovery (<xref target="certificate-discovery"/>).
A keyserver <bcp14>MUST</bcp14> return either the canonical bundle of the identity being searched for (<xref target="canonical-bundles"/>), or a 404 Not Found error.</t>

</section>
<section anchor="index-category"><name>The "index" Lookup Category</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "index" lookup category.</t>

<figure><artwork><![CDATA[
GET /pks/v2/index/<identifier>
]]></artwork></figure>

<t>This requests a list of certificates on the keyserver whose User IDs match the identity given in the "identifier" path component (<xref target="identity-lookups"/>).
This list is returned in JSON format as specified in <xref target="v2-indexes"/>.</t>

<t>A keyserver <bcp14>SHOULD</bcp14> limit the returned index to a reasonable length.
Results <bcp14>SHOULD</bcp14> be sorted in order of decreasing confidence in that identity (<xref target="confidence"/>), and then by creation date (most recent first).
A keyserver <bcp14>MAY</bcp14> choose to only return results where the identity being searched for exceeds a minimum confidence value.
If no certificates match the request, the keyserver <bcp14>SHOULD</bcp14> return an appropriate HTTP error code such as 404 ("Not Found").</t>

</section>
<section anchor="prefixlog-category"><name>The "prefixlog" Lookup Category</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "prefixlog" lookup category.</t>

<figure><artwork><![CDATA[
GET /pks/v2/prefixlog/<identifier>
]]></artwork></figure>

<t>"prefixlog" requests a list of fingerprint prefixes that indicate which certificates have been modified since 00:00:00 UTC on a specific date.
The date is provided in the "identifier" path component using the "full-date" format as per <xref section="5.6" sectionFormat="of" target="RFC3339"/>, i.e. "2025-12-31".</t>

<t>The returned data is a list of CRLF-separated, hexadecimal-encoded, primary key fingerprint prefixes, and each prefix is truncated at a hex-digit (nybble) boundary.
Fingerprint prefixes do not include the version number.
The keyserver <bcp14>SHOULD</bcp14> calibrate the prefix length so that it is long enough to provide collision resistance, but short enough to maintain a useful anonymity cohort.
For example, if the prefix length was too short, clients could be induced to make excessive numbers of network requests.
A client <bcp14>MUST NOT</bcp14> make any assumptions about the length of the prefixes returned.</t>

<t>A client that wishes to update its local keystore from a keyserver <bcp14>MAY</bcp14> first make a "prefixlog" request with the date of the last successful refresh.
It can then compare the returned list of prefixes to see if any of them are present in its local keystore, and make subsequent "certs/by-vfingerprint" requests as appropriate (<xref target="vfingerprint-category"/>).
In this way, it can avoid making unnecessary requests that will return no updates, but will still leak information to the keyserver.</t>

<t>Note that the <spanx style="verb">prefixlog</spanx> endpoint always returns fingerprint prefixes, regardless of fingerprint version.
This contrasts with v4 Key IDs, which are constructed from fingerprint suffixes.</t>

<t>A keyserver <bcp14>MUST NOT</bcp14> support indexing or downloading certificates by prefix.</t>

</section>
<section anchor="options-lookup-method"><name>OPTIONS Lookup Method</name>

<t>A client <bcp14>MAY</bcp14> attempt to detect which lookup categories a keyserver supports by making an OPTIONS request (<xref section="9.3.7" sectionFormat="of" target="RFC9110"/>) to a lookup path with the "category" path component present but the "identifier" component absent.</t>

<t>A keyserver that supports the lookup category <bcp14>MAY</bcp14> respond with:</t>

<t><list style="symbols">
  <t>a 200 "OK" code,</t>
  <t>an <spanx style="verb">Allow:</spanx> response header that includes the value "GET" (<xref section="10.2.1" sectionFormat="of" target="RFC9110"/>).</t>
</list></t>

<t>Otherwise, it <bcp14>SHOULD</bcp14> respond with an error code such as 501 "Not Implemented".
Note however that a keyserver that does not support OPTIONS (for example, if it is implemented using static files) <bcp14>MAY</bcp14> return another error code such as 404 "Not Found" or 405 "Method Not Allowed".</t>

<t>A client <bcp14>SHOULD NOT</bcp14> attempt to make a GET request to a lookup path without both the "category" and "identifier" path components present.
A keyserver <bcp14>SHOULD</bcp14> return an error code such as 403 "Forbidden" to such a request.</t>

</section>
<section anchor="head-lookup-method"><name>HEAD Lookup Method</name>

<t>A client <bcp14>MAY</bcp14> attempt to retrieve the metadata of a certificate or certificate bundle by making a HEAD request (<xref section="9.3.2" sectionFormat="of" target="RFC9110"/>) to a full lookup path, with the "category" and "identifier" components present.
A keyserver <bcp14>SHOULD</bcp14> respond with the same header fields that it would have responded with if a GET request had been made.</t>

</section>
<section anchor="identity-lookups"><name>v2 Identity Lookups</name>

<t>The format of User IDs in OpenPGP has historically been vaguely specified and loosely interpreted (see <xref target="I-D.dkg-openpgp-userid-conventions"/>).
A particular identity may therefore be represented by an arbitrary number of different User ID packets.
Implementers should bear in mind that end users will typically search for identities, and not specific representations of that identity.</t>

<t>For example, the User ID strings <spanx style="verb">Andrew Gallagher &lt;andrew@example.com&gt;</spanx> and <spanx style="verb">Andrew B. Gallagher (work email) &lt;andrew@example.com&gt;</spanx> are both representations of the underlying identity <spanx style="verb">andrew@example.com</spanx>.</t>

<t>v2 "certs/by-identity", "canonical" and "index" lookup requests <bcp14>MUST</bcp14> only return results if the "identifier" path component exactly matches one of the following:</t>

<t><list style="symbols">
  <t>The portion between angle brackets (<spanx style="verb">&lt;...&gt;</spanx>) in an email-address style User ID.</t>
  <t>The full text string in a non-email-address User ID.</t>
</list></t>

<t>A keyserver <bcp14>SHOULD</bcp14> parse an email-address style User ID defensively.
In particular, if there is more than one substring of a User ID that could reasonably be interpreted as an email address, then a keyserver <bcp14>SHOULD NOT</bcp14> return an identity match on either substring.</t>

<t>Text lookups <bcp14>SHOULD NOT</bcp14> be case sensitive.
DNS names are not case sensitive, therefore any identity that contains a DNS name (including email addresses) cannot be reliably located using case sensitive matching.
Since the interpretation of User IDs is application-specific, a client <bcp14>MUST</bcp14> check that any User IDs returned from a keyserver are correctly case matched for the intended application.</t>

</section>
<section anchor="lookup-examples"><name>Lookup Examples</name>

<t>Get all certificates containing the email address <spanx style="verb">dshaw@example.com</spanx>:</t>

<figure><artwork><![CDATA[
https://keys.example.com/pks/v2/certs/by-identity/dshaw@example.com
]]></artwork></figure>

<t>Get certificate 0xCAFEDADACAFEDADACAFEDADACAFEDADACAFEDADACAFEDADACAFEDADACAFEDADA (v6 fingerprint):</t>

<figure><artwork><![CDATA[
https://keys.example.com/pks/v2/certs/by-vfingerprint/06/cafedadacafedadacafedadacafedadacafedadacafedadacafedadacafedada
]]></artwork></figure>

<t>Get certificate 0xDEADBEEFDECAFBAD (64-bit Key ID):</t>

<figure><artwork><![CDATA[
https://keys.example.com/pks/v2/certs/by-keyid/DEADBEEFDECAFBAD
]]></artwork></figure>

</section>
</section>
<section anchor="v2-submission-format"><name>v2 Submission Format</name>

<t>A keyserver <bcp14>MAY</bcp14> accept submissions via an HTTP POST or PUT request, as specified in <xref section="9.3" sectionFormat="of" target="RFC9110"/>.</t>

<t>v2 submission requests include a "category" URL path component, and optionally an "identifier" path component.
These are appended to "/pks/v2" as follows:</t>

<figure><artwork><![CDATA[
POST /pks/v2/<category>
PUT /pks/v2/<category>/<identifier>
]]></artwork></figure>

<t>The "category" path component <bcp14>MUST</bcp14> be supplied.
In PUT submission requests, the "identifier" path component is required.
In POST submission requests, the "identifier" path component is omitted.</t>

<texttable title="v2 Submission Request Categories" anchor="v2-submission-request-categories">
      <ttcol align='left'>Category</ttcol>
      <ttcol align='left'>Method</ttcol>
      <ttcol align='left'>Input data</ttcol>
      <ttcol align='left'>Output data</ttcol>
      <ttcol align='left'>See</ttcol>
      <c><spanx style="verb">certs</spanx></c>
      <c>POST</c>
      <c>certificate bundle</c>
      <c>submission response</c>
      <c><xref target="certs-category"/></c>
      <c><spanx style="verb">sendtoken</spanx></c>
      <c>POST</c>
      <c>email address</c>
      <c>(none)</c>
      <c><xref target="sendtoken-category"/></c>
      <c><spanx style="verb">canonical</spanx></c>
      <c>PUT</c>
      <c>canonical bundle</c>
      <c>submission response</c>
      <c><xref target="canonical-submission-category"/></c>
</texttable>

<t>Unless otherwise specified, a keyserver <bcp14>SHOULD</bcp14> respond to v2 submissions with a JSON document as described in <xref target="submission-responses"/>.</t>

<t>If a keyserver does not support submission via HTTP, then requests to do so should return an appropriate HTTP error code, such as 403 ("Forbidden") if certificate submission has been disallowed, or 404 ("Not Found") if the server does not support the requested submission category.</t>

<section anchor="certs-category"><name>The v2 "certs" Submission Category</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "certs" submission category.</t>

<figure><artwork><![CDATA[
POST /pks/v2/certs
]]></artwork></figure>

<t>A keyserver that implements it <bcp14>SHOULD</bcp14> support the basic submission workflow described in <xref target="basic-submission"/>.
It <bcp14>MAY</bcp14> support other workflows; if so it <bcp14>SHOULD</bcp14> advertise them as described in <xref target="feature-detection"/>.</t>

<t>A keyserver <bcp14>MAY</bcp14> verify the request and reject any submissions that cannot be verified.
This verification <bcp14>SHOULD</bcp14> use a reliable means of authentication, such as login credentials or a Bearer token (<xref target="token-authentication"/>).</t>

</section>
<section anchor="sendtoken-category"><name>The v2 "sendtoken" Submission Category</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "sendtoken" submission category.</t>

<figure><artwork><![CDATA[
POST /pks/v2/sendtoken
]]></artwork></figure>

<t>The body of the POST request is a single email address.
It <bcp14>SHOULD</bcp14> have a content-type of <spanx style="verb">text/plain</spanx>.
The keyserver <bcp14>SHOULD</bcp14> respond with an empty document.</t>

<t>A keyserver that supports the "sendtoken" request category <bcp14>SHOULD</bcp14> attempt to verify the email address by sending a time-limited Bearer token via email.
A client that receives the verification email can then use the token in a canonical submission request (<xref target="canonical-submission-category"/>).
A keyserver <bcp14>MAY</bcp14> limit the number and frequency of verification requests.</t>

<t>The verification email <bcp14>SHOULD</bcp14> contain a <spanx style="verb">multipart/alternative</spanx> message with two parts:</t>

<t><list style="symbols">
  <t>A JSON-LD structured mail document <xref target="I-D.ietf-sml-structured-email"></xref>.</t>
  <t>A human-readable document containing instructions for manual submission.</t>
</list></t>

<t>The context for the JSON-LD document is <spanx style="verb">http://hockeypuck.io/contexts/hkp-sendtoken.jsonld</spanx> (( TBC, issue #40 )), which contains the following fields:</t>

<texttable title="Structured Mail Fields" anchor="structured-mail-fields">
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>JSON-LD Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">url</spanx></c>
      <c><spanx style="verb">http://schema.org/url</spanx></c>
      <c>yes</c>
      <c>URL to be used for submission</c>
      <c><spanx style="verb">token</spanx></c>
      <c><spanx style="verb">http://schema.org/accessCode</spanx></c>
      <c>yes</c>
      <c>verification token</c>
      <c><spanx style="verb">expires</spanx></c>
      <c><spanx style="verb">http://schema.org/expires</spanx></c>
      <c>yes</c>
      <c>expiry time of the token</c>
</texttable>

<t>The URL is the full URL to be used for submission, including the identifier component.
The token is a randomly-generated string suitable for inclusion verbatim in an <spanx style="verb">Authentication: Bearer</spanx> HTTP header (<xref target="token-authentication"/>).
Timestamps <bcp14>MUST</bcp14> be given in UTC, in <xref target="RFC3339"></xref> format without milliseconds, i.e. <spanx style="verb">yyyy-mm-dd hh:mm:ssZ</spanx>.</t>

<t>A receiving client <bcp14>MUST</bcp14> ignore any unknown JSON fields.</t>

<t>(( TBC: this follows a prove-then-submit model, which is the inverse of KOO's current submit-then-prove process.
The rationale is that submit-then-prove often silently degrades to "submit-then-forget-to-prove".
Failed advance proofs are less likely to be mis-reported as a success.
In addition, prove-then-submit more easily generalises to other forms of verification.
Is this defensible?
issue #41 ))</t>

<section anchor="sample-json-ld-document"><name>Sample JSON-LD Document</name>

<figure><artwork><![CDATA[
{
    "@context": "http://hockeypuck.io/contexts/hkp-sendtoken.jsonld",
    "url": "https://keyserver.example/pks/v2/canonical/alice@openpgp.example",
    "token": "sOmE+bAsE64/rAnd0M+Tok3n",
    "expires": "2001-01-01 01:01:01Z"
}
]]></artwork></figure>

</section>
</section>
<section anchor="canonical-submission-category"><name>The v2 "canonical" Submission Category</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "canonical" submission category.</t>

<figure><artwork><![CDATA[
PUT /pks/v2/canonical/<identifier>
]]></artwork></figure>

<t>The request path is the same as the one used for the "canonical" lookup category (<xref target="canonical-lookup-category"/>).</t>

<t>A keyserver that implements it <bcp14>SHOULD</bcp14> support the basic submission workflow described in <xref target="basic-submission"/>.
It <bcp14>MAY</bcp14> support other workflows; if so it <bcp14>SHOULD</bcp14> advertise them as described in <xref target="feature-detection"/>.</t>

<t>This instructs the server that for the identity (<xref target="identity-lookups"/>) supplied in the request path:</t>

<t><list style="symbols">
  <t>The certificates contained in the submission that have the corresponding identity are regarded by the owner as canonical for that identity,</t>
  <t>The owner wishes for these certificates to be served in the same order and format that they appear in the submission, and:</t>
  <t>Any certificates for that identity that are not contained in the submission are not (or no longer) canonical for that identity.</t>
</list></t>

<t>A keyserver <bcp14>MUST</bcp14> verify the request and reject any submissions that cannot be verified.
This verification <bcp14>SHOULD</bcp14> use a reliable means of authentication, such as login credentials or a Bearer token (<xref target="token-authentication"/>).
Once the keyserver verifies the submission, it stores the resulting canonical bundle (<xref target="canonical-bundles"/>) and updates any internal confidence values as necessary (<xref target="confidence"/>).</t>

</section>
<section anchor="basic-submission"><name>Basic Submission</name>

<t>Basic submission uses a content-type of <spanx style="verb">application/pgp</spanx> (<xref target="application-pgp-media-type"/>).
The body of the POST or PUT request contains a certificate bundle as specified in <xref target="certificate-bundle-format"/>, which <bcp14>MUST NOT</bcp14> be ASCII-armored.</t>

<section anchor="token-authentication"><name>Token Authentication</name>

<t>When using token authentication with a basic submission workflow, the client adds an Authentication request header containing a Bearer token obtained via a "sendtoken" request (<xref target="sendtoken-category"/>).</t>

<figure><artwork><![CDATA[
Authentication: Bearer <token>
]]></artwork></figure>

<t>This token <bcp14>MUST</bcp14> correspond to one of the identities present in the canonical bundle being submitted.
A client <bcp14>SHOULD</bcp14> remove any User IDs not related to the token.
A keyserver <bcp14>MAY</bcp14> reject a canonical bundle that contains User IDs not related to the token.</t>

</section>
</section>
<section anchor="advanced-submission"><name>Advanced Submission</name>

<t>Advanced submission uses a content-type of <spanx style="verb">multipart/form-data</spanx>.
The body of the POST or PUT request contains a multipart with one or more parts.
The required part has a content-type of <spanx style="verb">application/pgp</spanx> and <bcp14>MUST</bcp14> be named "keytext" (<xref target="application-pgp-media-type"/>).
This part contains a certificate bundle as specified in <xref target="certificate-bundle-format"/>, which <bcp14>MUST NOT</bcp14> be ASCII-armored.</t>

<t>Other parts <bcp14>MAY</bcp14> be included as required by an advanced submission workflow.
No advanced submission workflows are currently specified.</t>

</section>
<section anchor="feature-detection"><name>Submission Feature Detection Using OPTIONS</name>

<t>A client <bcp14>MAY</bcp14> attempt to detect which certificate submission workflows a keyserver supports by making an OPTIONS request (<xref section="9.3.7" sectionFormat="of" target="RFC9110"/>) to a submission path with the "category" path component present but the "identifier" path component absent.
A keyserver that supports v2 submission <bcp14>SHOULD</bcp14> respond with:</t>

<t><list style="symbols">
  <t>a 200 code,</t>
  <t>an <spanx style="verb">Allow:</spanx> response header that includes the value "POST" or "PUT" as appropriate (<xref section="10.2.1" sectionFormat="of" target="RFC9110"/>),</t>
  <t>one or more <spanx style="verb">Accept:</spanx> response header(s) (<xref section="12.5.1" sectionFormat="of" target="RFC9110"/>).</t>
</list></t>

<t><spanx style="verb">Accept</spanx> response media types <bcp14>MAY</bcp14> include:</t>

<t><list style="symbols">
  <t><spanx style="verb">application/pgp</spanx> - basic submission without proof</t>
  <t><spanx style="verb">application/pgp;proof=tokens</spanx> - basic submission with token proof</t>
  <t><spanx style="verb">multipart/form-data;proof=dkim</spanx> - advanced submission with DKIM proof (EXPERIMENTAL)</t>
</list></t>

<t>(( TODO: check the requirements for CORS preflight, issue #38 ))
(( TODO: can we represent acceptable proof types by some other means? issue #54 ))</t>

</section>
<section anchor="canonical-bundles"><name>Canonical Bundles</name>

<t>A certificate bundle submitted or returned via a "canonical" request is called a "canonical bundle".
A canonical bundle represents both the list of certificates that the key holder wishes to be associated with an identity, and their preferred form of those certificates.
A keyserver <bcp14>SHOULD</bcp14> serve only canonical bundles in response to a "canonical" lookup request.
A keyserver <bcp14>MAY</bcp14> serve full copies of the matching certificate(s) in response to a "certs" lookup request.
For example, a full copy may include valid certificate components obtained by non-canonical submission, but not present in the canonical bundle.</t>

<t>When submitting a canonical bundle, any new certificate components <bcp14>SHOULD</bcp14> be merged into the full copy of the corresponding certificate, if the keyserver supports it.
Any valid key or self-certification revocations known to the keyserver <bcp14>SHOULD</bcp14> be merged into the corresponding canonical bundle(s), if any.
This applies both to revocations already present in the key store, and to those submitted at any later date.
A keyserver <bcp14>SHOULD NOT</bcp14> modify a canonical bundle in any other way.</t>

<t>A keyserver that accepts submissions <bcp14>MUST</bcp14> allow a valid key revocation certificate for any key to be submitted without identity verification.
A valid key revocation signature <bcp14>SHOULD</bcp14> be applied to all copies of the key that it revokes, and <bcp14>SHOULD</bcp14> be served in response to all requests for that key.
An implementation <bcp14>MAY</bcp14> however omit some revocations for brevity - for example, if two valid revocations exist with different timestamps but otherwise identical effect, an implementation <bcp14>MAY</bcp14> serve the older revocation and omit the newer one.</t>

<t>Other methods such as <xref target="I-D.dkg-openpgp-1pa3pc"/> are more appropriate for controlling the form of certificates returned by non-canonical requests.</t>

</section>
<section anchor="submission-examples"><name>Submission Examples</name>

<t>(( TODO: issue #39 ))</t>

</section>
</section>
</section>
<section anchor="legacy-api"><name>The Legacy API</name>

<t>For backwards compatibility with the existing installed client base, a Legacy API is defined.
New implementations <bcp14>SHOULD</bcp14> use the v2 API.</t>

<t>The Legacy API is specified to document deployed HKP behavior and to preserve interoperability with existing clients and servers.
Implementations of the v2 API are not required to implement the Legacy API unless they claim Legacy API compatibility.
Normative requirements in this section apply only to implementations that explicitly support the Legacy API.</t>

<section anchor="legacy-lookups"><name>Legacy Lookup Format</name>

<t>Legacy certificate lookups are done via an HTTP GET request.
The URL path (<xref section="3.3" sectionFormat="of" target="RFC3986"/>) is always "/pks/lookup", and is followed by a request-specific query string (<xref section="3.4" sectionFormat="of" target="RFC3986"/>).
No URL path components under "/pks/lookup" are used.</t>

<t>Most Legacy lookups contain both the "op" (operation) and "search" variables.
These roughly correspond to the "category" and "identifier" components of the v2 API, but with subtly different semantics.
The "op" variable determines what operation the keyserver will execute, and the "search" variable determines which certificates are operated on.</t>

<t>The "op" and "search" variables are supplied as HTTP query strings, in the form <spanx style="verb">&lt;variable-name&gt;=&lt;value&gt;</spanx>:</t>

<figure><artwork><![CDATA[
/pks/lookup?op=<op>&search=<search>[&...]
]]></artwork></figure>

<t>The "op" variable <bcp14>MUST</bcp14> be supplied, and the "search" variable <bcp14>MUST</bcp14> be supplied unless the "stats" operation is being requested (<xref target="stats-operation"/>).</t>

<t>There may also be modifier variables, as specified in <xref target="legacy-modifier-variables"/> below.
Keyservers <bcp14>MUST</bcp14> ignore any unknown query string parameters.</t>

<section anchor="operation-lookup-variable"><name>The "op" (Operation) Lookup Variable</name>

<t>The "op" (operation) variable specifies the lookup operation to be performed on the keyserver.
The "op" variable is generally accompanied by a "search" variable to specify the certificates that should be looked up.</t>

<t>If a particular operation is not supported, the keyserver <bcp14>SHOULD</bcp14> return an appropriate HTTP error code such as 501 ("Not Implemented").
The server <bcp14>SHOULD NOT</bcp14> return an error code (such as 404 ("Not Found")) that could be interpreted by the client as an explicit statement of non-existence.</t>

<texttable title="Legacy Lookup Operations" anchor="legacy-lookup-operations">
      <ttcol align='left'>Operation</ttcol>
      <ttcol align='left'>Search format</ttcol>
      <ttcol align='left'>Output data</ttcol>
      <ttcol align='left'>See</ttcol>
      <c><spanx style="verb">get</spanx></c>
      <c>text</c>
      <c>Certificate bundle</c>
      <c><xref target="get-operation"/></c>
      <c><spanx style="verb">hget</spanx></c>
      <c>SKS hash</c>
      <c>Certificate bundle</c>
      <c><xref target="hget-operation"/></c>
      <c><spanx style="verb">index</spanx></c>
      <c>text</c>
      <c>Index of certificates</c>
      <c><xref target="index-operation"/></c>
      <c><spanx style="verb">vindex</spanx></c>
      <c>text</c>
      <c>Index of certificates</c>
      <c><xref target="vindex-operation"/></c>
      <c><spanx style="verb">stats</spanx></c>
      <c>(none)</c>
      <c>Implementation info</c>
      <c><xref target="stats-operation"/></c>
</texttable>

</section>
<section anchor="get-operation"><name>The "get" Operation</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "get" operation.</t>

<t>The "get" operation requests certificates from the keyserver by textual search.
A string that specifies which certificate(s) to return is provided in the "search" variable.</t>

<t>The response to a successful "get" operation is an ASCII-armored certificate bundle as specified in <xref target="certificate-bundle-format"/>.</t>

<t>A keyserver <bcp14>SHOULD</bcp14> limit the returned certificate bundle to a reasonable length.
Results from a User ID search <bcp14>SHOULD</bcp14> be sorted in order of decreasing confidence in that identity (<xref target="confidence"/>), and then by creation date (most recent first).
A keyserver <bcp14>MAY</bcp14> choose to only return results where the identity being searched for has a nonzero confidence value.
If no certificates match the request, the keyserver <bcp14>SHOULD</bcp14> return an appropriate HTTP error code such as 404 ("Not Found").</t>

</section>
<section anchor="hget-operation"><name>The "hget" (hash get) Operation</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "hget" operation.</t>

<t>"hget" requests a certificate from a keyserver by specifying its <xref target="SKS"></xref> digest.
The digest is provided in the "search" variable in hexadecimal encoding, without a preceding "0x".
The hexadecimal digits are not case sensitive.</t>

<t>If no certificates match the request, the keyserver <bcp14>SHOULD</bcp14> return an appropriate HTTP error code such as 404 ("Not Found").</t>

</section>
<section anchor="index-operation"><name>The "index" Operation</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "index" operation.</t>

<t>The "index" operation requests a list of certificates on the keyserver that match the text in the "search" variable.
Historically, the "index" operation returned a human-readable HTML document containing links for each found certificate, but this is not required.</t>

<t>A keyserver <bcp14>SHOULD</bcp14> limit the returned index to a reasonable length.
Results from a User ID search <bcp14>SHOULD</bcp14> be sorted in order of decreasing confidence in that identity (<xref target="confidence"/>), and then by creation date (most recent first).
If no certificates match the request, the keyserver <bcp14>SHOULD</bcp14> return an appropriate HTTP error code such as 404 ("Not Found").</t>

</section>
<section anchor="vindex-operation"><name>The "vindex" (verbose index) Operation (Deprecated)</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "vindex" operation.
The "vindex" operation is deprecated.
Historically, a "vindex" response was the same as "index" with the addition of showing the signatures on each certificate, but this is not required.
A server that supports "vindex" <bcp14>SHOULD</bcp14> treat it as a synonym for "index".</t>

</section>
<section anchor="stats-operation"><name>The "stats" (statistics/status) Operation (Deprecated)</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "stats" operation.
The "stats" operation is deprecated.
It is <bcp14>RECOMMENDED</bcp14> to use a URL outside the standard HKP paths (such as "/pks/stats") instead.</t>

<t>The output of the "stats" operation is implementation-dependent, but may include diagnostic output, configuration state, or other metadata.
The "search" variable <bcp14>SHOULD NOT</bcp14> be supplied, and <bcp14>SHOULD</bcp14> be ignored if received.</t>

</section>
<section anchor="search-lookup-variable"><name>The "search" Lookup Variable</name>

<t>The "search" variable contains arbitrary text encoded as usual for a HTTP URL.
This text may represent a Key ID, or fingerprint, or some text from a User ID on the certificate being sought, depending on the operation.</t>

<section anchor="legacy-searches"><name>Legacy Key ID and Fingerprint Searches</name>

<t>To search for a certificate by the Key ID or fingerprint of a primary key or subkey, a client <bcp14>SHOULD</bcp14> use a v2 lookup and either the "certs/by-keyid" (<xref target="keyid-category"/>) or "certs/by-vfingerprint" (<xref target="vfingerprint-category"/>) lookup category (as appropriate).</t>

<t>If making a Legacy lookup, a client <bcp14>SHOULD</bcp14> use the "get" operation and prefix the "search" string with "0x" to indicate a hexadecimal number.
Key ID strings are 16 hexadecimal digits (64 bits).
Fingerprint strings are either 32 (version 3), 40 (version 4), or 64 (version 6) hexadecimal digits and do not include the version number.
The hexadecimal digits are not case sensitive.</t>

<t>A keyserver:</t>

<t><list style="symbols">
  <t><bcp14>SHOULD</bcp14> accept fingerprints and <bcp14>MAY</bcp14> accept 64-bit Key IDs in the Legacy lookup "search" variable.</t>
  <t><bcp14>SHOULD</bcp14> include matches with both primary key and subkey fingerprints and Key IDs.</t>
  <t><bcp14>MAY</bcp14> omit matches with encryption-only subkeys.</t>
  <t><bcp14>MUST NOT</bcp14> return results for 32-bit "short Key ID" searches, as these do not provide sufficient collision resistance.</t>
  <t><bcp14>MUST NOT</bcp14> return certificates with versions later than 4 for Key ID searches.</t>
  <t><bcp14>MUST NOT</bcp14> return version 6 (or later) certificates in the results for Legacy machine-readable requests, but <bcp14>MAY</bcp14> do so for Legacy human-readable requests (<xref target="legacy-mr-output"/>).</t>
</list></t>

<t>V3 certificates are no longer considered secure, but <bcp14>MAY</bcp14> be distributed for historical reference.</t>

</section>
<section anchor="legacy-text-searches"><name>Legacy Text Searches</name>

<t>To perform a Legacy search for a certificate by the text of a User ID, a client <bcp14>SHOULD</bcp14> use the "get" or "index" operation (as appropriate) and <bcp14>MUST NOT</bcp14> prefix the "search" string with "0x".
A keyserver <bcp14>MUST NOT</bcp14> return version 6 (or later) certificates in the results for Legacy machine-readable requests, but <bcp14>MAY</bcp14> do so for Legacy human-readable requests (<xref target="legacy-mr-indexes"/>).</t>

<t>Legacy text searches <bcp14>SHOULD</bcp14> only return results if the "search" variable exactly matches one of the following:</t>

<t><list style="symbols">
  <t>The full text string of a User ID.</t>
  <t>The portion between angle brackets (<spanx style="verb">&lt;...&gt;</spanx>) in an email-address style User ID.</t>
</list></t>

<t>Text searches <bcp14>SHOULD NOT</bcp14> be case sensitive.
DNS names are not case sensitive, therefore any User ID that contains a DNS name (including email addresses) cannot be reliably located using case sensitive matching.
Since the interpretation of User IDs is application-specific, a client <bcp14>MUST</bcp14> check that any User IDs returned from a keyserver are correctly case matched for the intended application.</t>

<t>A client making a Legacy text search <bcp14>SHOULD</bcp14> set the modifier variable "exact=on" (<xref target="exact-variable"/>).</t>

<t>To ensure that relevant results are returned, it is <bcp14>RECOMMENDED</bcp14> that implementations limit themselves to a subset of UTF-8 when generating both User IDs and search strings:</t>

<t><list style="symbols">
  <t>Canonicalise to Unicode Normalization Form C <xref target="UNF"></xref>.</t>
  <t>Do not use punycode <xref target="RFC3492"></xref>.</t>
  <t>Use lowercase in the domain part of email addresses.</t>
  <t>Avoid leading or trailing whitespace.</t>
  <t>Avoid control characters, including format effectors (such as tabs or newlines).</t>
</list></t>

<t>A keyserver <bcp14>MUST NOT</bcp14> return legacy text search results for a search string that begins with "0x".
Since the "0x" prefix is generally understood as indicating a fingerprint or key ID, violating this convention could enable a key substitution attack.</t>

</section>
</section>
<section anchor="legacy-lookup-examples"><name>Legacy Lookup Examples</name>

<t>Search for all certificates containing the email address <spanx style="verb">dshaw@example.com</spanx>, using plaintext HTTP:</t>

<figure><artwork><![CDATA[
http://keys.example.com:11371/pks/lookup?search=dshaw@example.com&op=index
]]></artwork></figure>

<t>Get certificate 0xDEADBEEFDECAFBADDEADBEEFDECAFBADDEADBEEFDECAFBAD (v4 fingerprint), using HTTPS:</t>

<figure><artwork><![CDATA[
https://keys.example.com/pks/lookup?op=get&search=0xDEADBEEFDECAFBADDEADBEEFDECAFBADDEADBEEFDECAFBAD
]]></artwork></figure>

<t>Get certificate 0xDEADBEEFDECAFBAD (64-bit Key ID), using HTTPS:</t>

<figure><artwork><![CDATA[
https://keys.example.com/pks/lookup?op=get&search=0xDEADBEEFDECAFBAD
]]></artwork></figure>

</section>
</section>
<section anchor="legacy-submission"><name>Legacy Submission Format</name>

<t>Legacy certificate submissions are performed via an HTTP POST request.
The URL path (<xref section="3.3" sectionFormat="of" target="RFC3986"/>) is always "/pks/add".
No URL path components under "/pks/add" are used, and there are no mandatory query strings.</t>

<t>The body of the POST message has a content-type of <spanx style="verb">application/x-www-form-urlencoded</spanx>.
It contains a "keytext" field whose value is an ASCII-armored certificate bundle as specified in <xref target="certificate-bundle-format"/>.
The ASCII armored certificate bundle <bcp14>MUST</bcp14> be form-urlencoded as specified in <xref section="8.2.1" sectionFormat="of" target="RFC1866"/>.</t>

<t>There may also be modifier variables, as specified in <xref target="legacy-modifier-variables"/> below.
Modifiers are passed using HTTP query strings as specified in <xref section="3.4" sectionFormat="of" target="RFC3986"/>.
HTTP query strings <bcp14>MAY</bcp14> be given in any order.
Keyservers <bcp14>MUST</bcp14> ignore any unknown query strings.</t>

<t>Note that more than one certificate may be submitted in a single transaction.</t>

<t>If a keyserver does not support adding certificates via HTTP, then requests to do so should return an appropriate HTTP error code, such as 403 ("Forbidden") if certificate submission has been disallowed, or 404 ("Not Found") if the server does not support the legacy submission API.</t>

</section>
<section anchor="legacy-modifier-variables"><name>Legacy Modifier Variables</name>

<t>These variables are used to modify basic Legacy requests.</t>

<texttable title="Legacy Variable Names" anchor="legacy-variable-names">
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Context</ttcol>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>See</ttcol>
      <c>options</c>
      <c>any</c>
      <c>list of flags</c>
      <c><xref target="options-variable"/></c>
      <c>fingerprint</c>
      <c>lookup</c>
      <c>"on" or "off"</c>
      <c><xref target="fingerprint-variable"/></c>
      <c>hash</c>
      <c>lookup</c>
      <c>"on" or "off"</c>
      <c><xref target="hash-variable"/></c>
      <c>exact</c>
      <c>lookup</c>
      <c>"on" or "off"</c>
      <c><xref target="exact-variable"/></c>
</texttable>

<section anchor="options-variable"><name>The "options" Variable</name>

<t>This variable takes one or more option values, separated by commas.
These are used to modify the behavior of the keyserver on a per-request basis.
Each value indicates a boolean flag, where the presence of the value indicates "true" and the absence "false".</t>

<texttable title="Legacy Option Values" anchor="legacy-option-values">
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Context</ttcol>
      <ttcol align='left'>See</ttcol>
      <c>nm</c>
      <c>submission</c>
      <c><xref target="nm-option"/></c>
      <c>mr</c>
      <c>lookup</c>
      <c><xref target="mr-option"/></c>
</texttable>

<section anchor="nm-option"><name>The "nm" (No Modification) Option</name>

<t>As keyservers may modify submitted certificates to suit a particular policy, this option is used to inform the keyserver that the submitter would rather have the submission fail completely than have the submitted certificate(s) modified.
An example of this would be a keyserver that does not accept User IDs with an email address outside of the local domain.
If such a certificate was submitted, the keyserver <bcp14>MAY</bcp14> trim any noncompliant User IDs before accepting the certificate.
If this option was set, then such a certificate submission <bcp14>SHOULD</bcp14> fail with an appropriate error code such as 422 (Unprocessable content).</t>

<t>"nm" is meaningful for submissions only.</t>

</section>
<section anchor="mr-option"><name>The "mr" (Machine-Readable) Option</name>

<t>The machine-readable option instructs the server that a program (rather than a person) is making a Legacy request, so the output <bcp14>SHOULD</bcp14> be in Legacy machine-readable format.
If a v2 request format is being used, this option has no effect.
See <xref target="legacy-mr-output"/> for the specific details of Legacy machine-readable output.</t>

<t>An implementation that does not wish to provide a human-readable interface <bcp14>MAY</bcp14> choose to behave as if this option is always present.
Implementations <bcp14>SHOULD NOT</bcp14> provide a Legacy interface without supporting machine-readable output.</t>

<t>"mr" is meaningful for Legacy lookups only.</t>

</section>
</section>
<section anchor="fingerprint-variable"><name>The "fingerprint" Variable</name>

<t>This variable takes one argument: "on" or "off".
If present and on, it instructs the server to provide the primary key fingerprint for each certificate in a Legacy "index" or "vindex" operation.
This variable has no effect on any other operation.
The exact format of the displayed fingerprint, like the "index" and "vindex" operations themselves, is implementation defined in Legacy human-readable output.
In Legacy machine-readable indexes, a value of "on" indicates that the "keyid" field <bcp14>SHOULD</bcp14> contain the fingerprint, except for v3 certificates (<xref target="legacy-mr-indexes"/>).
An implementation <bcp14>SHOULD</bcp14> treat this variable as being "on" for all Legacy machine-readable indexes.
An implementation <bcp14>MAY</bcp14> decide to ignore this variable and/or set the default behaviour to "on" for Legacy human-readable indexes.</t>

<t>"fingerprint" is meaningful for Legacy lookups only.</t>

</section>
<section anchor="hash-variable"><name>The "hash" Variable</name>

<t>This variable takes one argument: "on" or "off".
If present and on, it instructs the server to provide the <xref target="SKS"></xref> digest of each certificate in an "index" or "vindex" operation in the Legacy human-readable output format.
This variable has no effect on any other operation, or on Legacy machine-readable output.
The exact format of the displayed digest, like the "index" and "vindex" operations themselves, is implementation defined.
An implementation <bcp14>MAY</bcp14> decide to ignore this variable and/or set the default behaviour to "on".</t>

<t>"hash" is meaningful for Legacy lookups only.</t>

</section>
<section anchor="exact-variable"><name>The "exact" Variable</name>

<t>This variable takes one argument: "on" or "off".
If set to "off", it instructs the server that it <bcp14>MAY</bcp14> use non-exact matching for the contents of the "search" variable in text searches (<xref target="legacy-text-searches"/>).
How a keyserver handles non-exact text searches is implementation defined.
For example, a keyserver <bcp14>MAY</bcp14> use case-insensitive or tokenized searching.</t>

<t>A keyserver implementation <bcp14>SHOULD</bcp14> set the default behaviour to "on" and <bcp14>MAY</bcp14> ignore this variable.</t>

<t>"exact" is meaningful for Legacy lookups only.</t>

</section>
</section>
</section>
<section anchor="output-formats"><name>Output Formats</name>

<t>HKP was originally intended for both human and programmatic use.
In general, the Legacy human-readable output is implementation specific.
The "machine-readable" option is used to tailor the output of Legacy requests for automated use.
For interoperability, the Legacy machine-readable output <bcp14>MUST</bcp14> carefully follow the guidelines given here.
A client implementation <bcp14>SHOULD NOT</bcp14> attempt to parse Legacy human-readable output.</t>

<t>The v2 API always returns either non-armored certificate bundles or JSON <xref target="RFC8259"></xref>, depending on the request.</t>

<section anchor="v2-output-format"><name>v2 Output Format</name>

<t>Clients making v2 requests:</t>

<t><list style="symbols">
  <t><bcp14>MUST</bcp14> silently ignore any primary keys with unknown versions or algorithms.</t>
  <t><bcp14>MUST</bcp14> silently ignore any subkeys with unknown algorithms.</t>
  <t><bcp14>MUST</bcp14> silently ignore any unknown fields in JSON responses.</t>
</list></t>

<t>In response to a v2 request, a keyserver:</t>

<t><list style="symbols">
  <t><bcp14>MUST</bcp14> set the HTTP header <spanx style="verb">Access-Control-Allow-Origin: *</spanx>, as specified in <xref target="CORS"></xref>.</t>
  <t><bcp14>MUST</bcp14> use the format specified in <xref target="v2-indexes"/> when responding to "index" lookups.</t>
  <t><bcp14>MUST</bcp14> use the format specified in <xref target="submission-responses"/> when responding to "certs" submissions.</t>
  <t><bcp14>MUST</bcp14> return non-armored (binary) certificate bundles in response to lookup requests.</t>
  <t><bcp14>MUST</bcp14> set <spanx style="verb">Content-Type: application/json</spanx> for JSON responses.</t>
  <t><bcp14>MUST</bcp14> set <spanx style="verb">Content-Type: application/pgp</spanx> when returning non-armored certificate bundles (<xref target="application-pgp-media-type"/>).</t>
  <t><bcp14>MAY</bcp14> set <spanx style="verb">Last-Modified:</spanx> to indicate the modification date of the requested certificate or certificate bundle (<xref section="8.8.2" sectionFormat="of" target="RFC9110"/>).</t>
</list></t>

<section anchor="v2-indexes"><name>v2 Indexes</name>

<t>A v2 "index" request <bcp14>SHOULD</bcp14> return a JSON list of certificates.
If the search was for an identity, it <bcp14>SHOULD</bcp14> be sorted in decreasing order of confidence (<xref target="confidence"/>).
Each certificate object contains some or all of the following fields:</t>

<texttable title="v2 Index Fields" anchor="v2-index-certificate-fields">
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>version</c>
      <c>integer</c>
      <c>yes</c>
      <c>version of the primary key</c>
      <c>fingerprint</c>
      <c>string</c>
      <c>yes</c>
      <c>fingerprint of the primary key</c>
      <c>creation</c>
      <c>string</c>
      <c>&#160;</c>
      <c>creation date of the key</c>
      <c>expiration</c>
      <c>string</c>
      <c>&#160;</c>
      <c>expiration date of the key</c>
      <c>isExpired</c>
      <c>boolean</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>isRevoked</c>
      <c>boolean</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>algorithm</c>
      <c>algorithm</c>
      <c>&#160;</c>
      <c>(<xref target="v2-index-algorithm-fields"/>)</c>
      <c>userIDs</c>
      <c>userID array</c>
      <c>&#160;</c>
      <c>(<xref target="v2-index-userid-fields"/>)</c>
      <c>subkeys</c>
      <c>subkey array</c>
      <c>&#160;</c>
      <c>(<xref target="v2-index-subkey-fields"/>)</c>
</texttable>

<texttable title="v2 Index Algorithm Fields" anchor="v2-index-algorithm-fields">
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>code</c>
      <c>integer</c>
      <c>yes</c>
      <c>algorithm ID</c>
      <c>name</c>
      <c>string</c>
      <c>&#160;</c>
      <c>a human-readable identifier for the algorithm</c>
      <c>bitLength</c>
      <c>integer</c>
      <c>&#160;</c>
      <c>key length in bits (DSA/RSA/ElGamal keys only)</c>
</texttable>

<texttable title="v2 Index UserID Fields" anchor="v2-index-userid-fields">
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>uidString</c>
      <c>string</c>
      <c>yes</c>
      <c>User ID string contents</c>
      <c>creation</c>
      <c>string</c>
      <c>&#160;</c>
      <c>creation date of (the first signature over) the User ID</c>
      <c>expiration</c>
      <c>string</c>
      <c>&#160;</c>
      <c>expiration date of the User ID</c>
      <c>isExpired</c>
      <c>boolean</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>isRevoked</c>
      <c>boolean</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>confidence</c>
      <c>integer</c>
      <c>&#160;</c>
      <c>(<xref target="confidence"/>)</c>
</texttable>

<texttable title="v2 Index Subkey Fields" anchor="v2-index-subkey-fields">
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>version</c>
      <c>integer</c>
      <c>yes</c>
      <c>version of the subkey</c>
      <c>fingerprint</c>
      <c>string</c>
      <c>yes</c>
      <c>fingerprint of the subkey</c>
      <c>creation</c>
      <c>string</c>
      <c>&#160;</c>
      <c>creation date of the subkey</c>
      <c>expiration</c>
      <c>string</c>
      <c>&#160;</c>
      <c>expiration date of the subkey</c>
      <c>isExpired</c>
      <c>boolean</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>isRevoked</c>
      <c>boolean</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>algorithm</c>
      <c>algorithm</c>
      <c>&#160;</c>
      <c>(<xref target="v2-index-algorithm-fields"/>)</c>
</texttable>

<t>Fingerprints are given in hexadecimal notation, without any "0x" prefix.
Timestamps <bcp14>MUST</bcp14> be given in UTC, in <xref target="RFC3339"></xref> format without milliseconds, i.e. <spanx style="verb">yyyy-mm-dd hh:mm:ssZ</spanx>.
Algorithm IDs are as specified in <xref section="9.1" sectionFormat="of" target="RFC9580"/>.</t>

<t>The only required fields are the version and fingerprint of any key material, and the uidString of any User IDs.
Implementations <bcp14>MAY</bcp14> omit algorithms, subkeys and User IDs from indexes; however if they are present they <bcp14>MUST</bcp14> contain the required fields.</t>

</section>
</section>
<section anchor="submission-responses"><name>v2 and Legacy Submission Responses</name>

<t>A v2 or Legacy submission <bcp14>MAY</bcp14> return an empty response, or it <bcp14>MAY</bcp14> return a JSON object summarising the changes.
The JSON object <bcp14>MAY</bcp14> contain any or all of the following fields, each of which is an array of certificate objects:</t>

<texttable title="Submission Response Fields" anchor="submission-response-fields">
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>inserted</c>
      <c>certificate array</c>
      <c>&#160;</c>
      <c>newly added certificates</c>
      <c>updated</c>
      <c>certificate array</c>
      <c>&#160;</c>
      <c>updated certificates</c>
      <c>deleted</c>
      <c>certificate array</c>
      <c>&#160;</c>
      <c>deleted certificates</c>
      <c>ignored</c>
      <c>certificate array</c>
      <c>&#160;</c>
      <c>certificates with no new information</c>
      <c>invalid</c>
      <c>certificate array</c>
      <c>&#160;</c>
      <c>certificates that could not be processed</c>
</texttable>

<t>Each certificate object <bcp14>MUST</bcp14> contain "version" and "fingerprint" fields, as in <xref target="v2-index-certificate-fields"/>.</t>

<t>Certificates in the "ignored" and "invalid" arrays <bcp14>MAY</bcp14> also contain a "comment" field describing the reason for their rejection.
The comment is a human-readable string, and <bcp14>MAY</bcp14> be displayed to the user.</t>

</section>
<section anchor="legacy-mr-output"><name>Legacy machine-readable Output</name>

<t>Clients requesting machine-readable output in Legacy lookup requests:</t>

<t><list style="symbols">
  <t><bcp14>SHOULD</bcp14> supply <spanx style="verb">options=mr</spanx> (<xref target="mr-option"/>).</t>
  <t><bcp14>MUST</bcp14> silently ignore any content preceding or following a returned armored key block.</t>
  <t><bcp14>MUST</bcp14> silently ignore any primary keys with unknown versions or algorithms.</t>
  <t><bcp14>MUST</bcp14> silently ignore any subkeys with unknown algorithms.</t>
</list></t>

<t>Keyservers returning Legacy machine-readable output:</t>

<t><list style="symbols">
  <t><bcp14>MUST</bcp14> set the HTTP header <spanx style="verb">Access-Control-Allow-Origin: *</spanx>, as specified in <xref target="CORS"></xref>.</t>
  <t><bcp14>MUST</bcp14> return ASCII-armored certificate bundles.</t>
  <t><bcp14>MUST NOT</bcp14> return version 6 (or later) certificates.</t>
  <t><bcp14>MUST</bcp14> set <spanx style="verb">Content-Type: application/pgp-keys</spanx> when returning ASCII-armored certificate bundles (the "get" and "hget" operations); see <xref target="application-pgp-keys-media-type"/>.</t>
  <t><bcp14>MAY</bcp14> set <spanx style="verb">Last-Modified:</spanx> to indicate the modification date of the requested certificate or certificate bundle (<xref section="8.8.2" sectionFormat="of" target="RFC9110"/>).</t>
  <t><bcp14>MUST</bcp14> use the format specified in <xref target="legacy-mr-indexes"/> when returning indexes (the "index" and "vindex" operations).</t>
  <t><bcp14>MAY</bcp14> return statistics in JSON format <xref target="RFC8259"></xref>, the schema of which is otherwise implementation-dependent.</t>
</list></t>

<t>ASCII-armored responses <bcp14>MAY</bcp14> be wrapped in any HTML or other text desired, except that the actual certificate data consisting of an initial line break, the <spanx style="verb">-----BEGIN PGP PUBLIC KEY BLOCK-----</spanx> header, the armored certificate data itself, the <spanx style="verb">-----END PGP PUBLIC KEY BLOCK-----</spanx> footer, and a final line break <bcp14>MUST NOT</bcp14> be modified from the form specified in <xref target="RFC9580"></xref>.</t>

<section anchor="legacy-mr-indexes"><name>Legacy machine-readable Indexes</name>

<t>The Legacy machine-readable index format is a list of newline-separated records, consisting of colon-separated fields.
The document is 7-bit clean, and as such is sent with no encoding and <spanx style="verb">Content-Type: text/plain</spanx>.</t>

<t>The machine-readable response <bcp14>MAY</bcp14> be prefixed by an information record:</t>

<figure><artwork><![CDATA[
info:<version>:<count>
]]></artwork></figure>

<texttable title="Legacy Information Record Fields" anchor="legacy-information-record-fields">
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>version</c>
      <c>the version of this output format</c>
      <c>count</c>
      <c>the number of certificates returned</c>
</texttable>

<t>If this line is not included, or the version information is not supplied, the version number is assumed to be 1.
Currently, only version 1 is defined.</t>

<t>Note that "count" is the number of certificates, and not the number of lines returned.
That is, it <bcp14>SHOULD</bcp14> match the number of "pub" lines returned.</t>

<t>The certificate listings themselves are made up of several records per certificate.
The first record specifies the primary key:</t>

<figure><artwork><![CDATA[
pub:<keyID>:<code>:<bitLength>:<creation>:<expiration>:<flags>
]]></artwork></figure>

<texttable title="Legacy Public Key Record Fields" anchor="legacy-public-key-record-fields">
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>keyID</c>
      <c>fingerprint or long Key ID</c>
      <c>code</c>
      <c>algorithm ID</c>
      <c>bitLength</c>
      <c>key length in bits</c>
      <c>creation</c>
      <c>creation date of the key</c>
      <c>expiration</c>
      <c>expiration date of the key</c>
      <c>flags</c>
      <c>letter codes to indicate details of the key</c>
</texttable>

<t>Since it is not possible to calculate the Key ID from a V3 fingerprint, for V3 primary keys the "keyID" field <bcp14>SHOULD</bcp14> contain the 16-digit long Key ID only.
Otherwise, a keyserver <bcp14>SHOULD</bcp14> return a fingerprint if available (<xref target="fingerprint-variable"/>).</t>

<t>Fingerprints and long Key IDs are given in hexadecimal notation, without any "0x" prefix.
Timestamps are given in seconds since midnight on 1st January 1970.
Algorithm IDs are as specified in <xref section="9.1" sectionFormat="of" target="RFC9580"/>.</t>

<t>Following the "pub" record are one or more "uid" records to indicate User IDs on the certificate:</t>

<figure><artwork><![CDATA[
uid:<uidString>:<creation>:<expiration>:<flags>
]]></artwork></figure>

<texttable title="Legacy User ID Record Fields" anchor="legacy-index-userid-fields">
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>uidString</c>
      <c>User ID string contents</c>
      <c>creation</c>
      <c>creation date of (the first self-signature over) the User ID</c>
      <c>expiration</c>
      <c>expiration date of the User ID</c>
      <c>flags</c>
      <c>letter codes to indicate details of the User ID</c>
</texttable>

<t>The User ID string <bcp14>MUST</bcp14> use percent-encoding (<xref section="2.1" sectionFormat="of" target="RFC3986"/>) for anything that isn't 7-bit safe as well as for any <spanx style="verb">:</spanx> and <spanx style="verb">%</spanx> characters that appear in a field value.
Any other characters <bcp14>MAY</bcp14> be percent-encoded, as desired.</t>

<t>The information for the "creation", "expiration", and "flags" fields is taken from the User ID self-signature, if any, and applies to the User ID in question, not to the certificate as a whole.</t>

<t>Primary key and User ID records may contain a "flags" field containing a sequence of alphabetical characters, one per flag.
Flags <bcp14>MAY</bcp14> be given in any order.
The meaning of "disabled" is implementation-specific.
Note that individual flags may be unimplemented, so the absence of a given flag does not necessarily mean the absence of the detail.</t>

<texttable title="Legacy Record Flags" anchor="legacy-record-flags">
      <ttcol align='left'>Flag</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">r</spanx></c>
      <c>revoked</c>
      <c><spanx style="verb">d</spanx></c>
      <c>disabled</c>
      <c><spanx style="verb">e</spanx></c>
      <c>expired</c>
</texttable>

<t>Note that empty fields are allowed.
For example, a primary key with no expiration date would have the "expirationdate" field empty.
Also, a keyserver that does not track a particular piece of information may leave that field empty as well.
Colons for empty fields on the end of each line <bcp14>MAY</bcp14> be left off, if desired.
All dates are given in the number of seconds since 1970-01-01 00:00:00 UTC.</t>

<t>For backwards compatibility with the installed client base, Legacy machine-readable lookup requests <bcp14>MUST</bcp14> omit version 6 (and later) certificates from the returned indexes.</t>

</section>
</section>
</section>
<section anchor="media-types"><name>Media Types</name>

<t>Existing OpenPGP media types are insufficient for the purposes of this document.
We therefore specify a new media type for binary OpenPGP data, and update the existing <spanx style="verb">application/pgp-keys</spanx> media type.</t>

<section anchor="application-pgp-media-type"><name>The <spanx style="verb">application/pgp</spanx> Media Type</name>

<t>While legacy HKP uses ASCII-armored certificates, the v2 API uses binary format, and <xref target="RFC3156"></xref> only defines media types for ASCII-armored OpenPGP data.</t>

<t>We therefore define a new media type for binary OpenPGP data.
While it is specified here for use in the v2 HKP API, it is not restricted to certificates and <bcp14>MAY</bcp14> be used in other contexts for any binary OpenPGP data.
It is the receiver's responsibility to check that the OpenPGP packet sequence is reasonable in context; the receiver <bcp14>SHOULD NOT</bcp14> rely solely on the media type.</t>

<texttable title="New OpenPGP Media Types" anchor="new-openpgp-media-types">
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Extension</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>application/pgp</c>
      <c>pgp</c>
      <c>A sequence of one or more binary OpenPGP packets</c>
</texttable>

</section>
<section anchor="application-pgp-keys-media-type"><name>The <spanx style="verb">application/pgp-keys</spanx> Media Type</name>

<t><xref section="7" sectionFormat="of" target="RFC3156"/> defines the <spanx style="verb">application/pgp-keys</spanx> media type as:</t>

<ul empty="true"><li>
  <t>A MIME body part of the content type "application/pgp-keys" contains ASCII-armored transferable Public Key Packets...</t>
</li></ul>

<t>Also, <xref section="10.1.5" sectionFormat="of" target="RFC9580"/> states:</t>

<ul empty="true"><li>
  <t>Transferable Public Key packet sequences may be concatenated to allow transferring multiple public keys in one operation</t>
</li></ul>

<t>It is however established (but currently unspecified) practice for web APIs to serve v4 detached revocation signatures (<xref section="10.1.3" sectionFormat="of" target="RFC9580"/>) in the same packet sequence as OpenPGP certificates, for example in [I-D.koch-openpgp-webkey-service] which states:</t>

<ul empty="true"><li>
  <t>To ease distribution of revoked keys, a server may return revoked keys in addition to a new key. The keys are returned by a single request as concatenated key blocks.</t>
</li></ul>

<t>In practice, the most common implementation represents revoked keys as detached revocation signatures, and places them after the new key in the returned packet sequence.
This is not interoperable however, as conforming implementations will treat such a signature as an invalid signature over the preceding key, and discard it.</t>

<t>In addition, a keyserver may not wish to store or serve the User IDs of revoked (and therefore unusable) keys, following the principle of data minimization.
<xref target="RFC9580"></xref> permits revoked certificates that contain no User IDs, but earlier specifications did not, and some legacy clients cannot process them.</t>

<t>To ensure that revocations are correctly parsed by both legacy and conforming implementations, detached revocation signatures must be placed in an unambiguous position in the packet sequence.
The specification of <spanx style="verb">application/pgp-keys</spanx> is therefore extended to permit a sequence of zero or more v4 detached revocations to <em>precede</em> any certificates in the OpenPGP packet sequence.
For convenience this can be referred to as a "mixed keyring", i.e. a keyring containing a mixture of v4 detached revocations and full certificates.</t>

<t>By analogy with <xref section="10.1" sectionFormat="of" target="RFC9580"/> the packet grammar of a "mixed keyring" is as follows, where square brackets indicate optionality and ellipsis indicates repetition:</t>

<figure><artwork><![CDATA[
[v4 Revocation Signature...]
[Transferable Public Key...]
]]></artwork></figure>

</section>
</section>
<section anchor="confidence"><name>Confidence</name>

<t>Traditionally, keyservers did not perform any checks against uploaded content other than simple parseability.
This left them open to abuse such as flooding and third-party signature spam.
Most modern keyservers are now able to perform cryptographic validity tests, and automated content moderation is generally possible.</t>

<t>It is <bcp14>RECOMMENDED</bcp14> that a keyserver assigns a "confidence" value to each User ID in its database.
The exact definition of "confidence" is implementation-dependent, but <bcp14>MAY</bcp14> include checks such as email verification or third-party certifications.</t>

<t>A keyserver <bcp14>MAY</bcp14> represent confidence as a number between 0 and 255, where values of 120 or greater indicate "complete confidence", in a v2 Index User ID object (<xref target="v2-index-userid-fields"/>).
This is numerically compatible with the "trust amount" field specified in <xref section="5.2.3.21" sectionFormat="of" target="RFC9580"/>, but it is not required to calculate it in the same way or represent it internally as an integer value.
The confidence field in a v2 Index User ID object is intended as a heuristic for sorting and filtering responses to lookup requests, and is not a replacement for cryptographic verification.
A client <bcp14>SHOULD NOT</bcp14> rely on this confidence field, and <bcp14>SHOULD</bcp14> perform its own checks.
A keyserver that wishes to publish a cryptographically-verifiable statement about its internal confidence value <bcp14>MAY</bcp14> do so using a certification signature.</t>

</section>
<section anchor="certificate-bundle-format"><name>Certificate Bundle Format</name>

<t>HKP uses a "certificate bundle" as its primary data representation for both input and output.</t>

<t>A certificate bundle is a sequence of one or more OpenPGP certificates (Transferable Public Keys), concatenated directly, as specified in Sections <xref target="RFC9580" section="10.1" sectionFormat="bare"/> and <xref target="RFC9580" section="3.6" sectionFormat="bare"/> of <xref target="RFC9580"/>.
An ASCII-armored certificate bundle is a certificate bundle that has been encoded as a single armored block, as specified in <xref section="6.2" sectionFormat="of" target="RFC9580"/>.
The Legacy API uses ASCII-armored certificate bundles exclusively, whereas the v2 API uses non-armored certificate bundles exclusively.</t>

<t>Certificate bundles are often called "keyrings", however the term "keyring" is used to refer to several related but distinct concepts:</t>

<t><list style="symbols">
  <t>A sequence of one or more Transferable Public Keys ("public keyring")</t>
  <t>A sequence of one or more Transferable Secret Keys ("private/secret keyring")</t>
  <t>A sequence of packets forming a single Transferable Public Key</t>
  <t>A sequence of packets forming a single Transferable Secret Key</t>
</list></t>

<t>It is therefore <bcp14>RECOMMENDED</bcp14> that implementations avoid using the term "keyring" without qualification.</t>

<section anchor="detached-revocations"><name>Detached Revocations</name>

<t>For OpenPGP certificates prior to version 6, revocation signatures have customarily been distributed as a detached "revocation certificate", as per <xref section="10.1.3" sectionFormat="of" target="RFC9580"/>.
An HKP server <bcp14>SHOULD</bcp14> allow submission of these detached revocations.</t>

<t>An HKP implementation <bcp14>MAY</bcp14> accept or serve an ASCII-armored "mixed certificate bundle" where one or more revoked certificates have been replaced by their detached revocation certificate(s).
Such a "mixed certificate bundle" <bcp14>MUST</bcp14> be sorted so that all detached revocation certificates appear first.
This ensures that detached revocations cannot be mistaken for signatures over another primary key.</t>

<t>Mixed certificate bundles <bcp14>MUST NOT</bcp14> be served in responses to v2 lookup requests.</t>

</section>
</section>
<section anchor="certificate-discovery-using-hkps"><name>Certificate Discovery Using HKPS</name>

<t>SRV records <xref target="RFC2782"></xref> are commonly used by clients to discover the location of internet services.
We can use the "openpgpkey" service name to locate an HKPS service for certificate discovery.
HKP clients <bcp14>SHOULD</bcp14> support SRV records.</t>

<section anchor="openpgpkey-srv-record"><name>The "openpgpkey" SRV Record</name>

<t>The service name for HKPS discovery is "openpgpkey", and the protocol name is "https".
The service and protocol labels are therefore "_openpgpkey" and "_https" respectively.
These are prepended to the domain part of the email addresses for which certificates are being published:</t>

<figure><artwork><![CDATA[
_openpgpkey._https.<domain-part>
]]></artwork></figure>

<t>A domain owner wishing to publish OpenPGP certificates for their users would create one or more SRV records at this location, each referencing the address and port number of a keyserver that is authoritative for that domain.
Each unique domain part for which email addresses are supported will have its own SRV records.</t>

</section>
<section anchor="discovery-lookup"><name>Discovery Lookup Over HKPS</name>

<t>When making an HKPS discovery request, a client <bcp14>SHOULD</bcp14> use an HTTP GET request to an authoritative keyserver using the "canonical" lookup category, with the email address in the "identifier" component.</t>

<t>Note that discovery is performed using the "canonical" lookup category, to ensure that the discovery results have been filtered.
The domain owner <bcp14>SHOULD</bcp14> take reasonable steps to ensure that any certificates returned from this lookup request are valid certificates for the identity in the "identifier" component.
Discovery <bcp14>MAY</bcp14> be implemented at low cost by serving such requests from a static filesystem.</t>

<t>It is <bcp14>RECOMMENDED</bcp14> that certificates returned from discovery are subject to further verification on the client side wherever possible, to mitigate against compromise of the discovery server.</t>

</section>
<section anchor="certificate-discovery-example"><name>Certificate Discovery Example</name>

<t>A client trying to locate a certificate for isabella@example.com makes a DNS request for the SRV record at <spanx style="verb">_openpgpkey._https.example.com.</spanx>.
This would return:</t>

<figure><artwork><![CDATA[
_openpgpkey._https.example.com. 3600 IN SRV 1 1 443 keyserver.example.com
]]></artwork></figure>

<t>On finding this record, the client makes an HTTP GET request for the following URL:</t>

<figure><artwork><![CDATA[
hkps://keyserver.example.com:443/pks/v2/canonical/isabella@example.com
]]></artwork></figure>

<t>The keyserver returns the canonical bundle for isabella@example.com, and the client proceeds to check its validity according to the local policy.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>As described here, a keyserver is a searchable database of OpenPGP Certificates accessed over the network.
While there may be security considerations arising from distributing arbitrary certificates in this manner, this does not impact the security of OpenPGP itself.</t>

<t>Without some sort of trust relationship between the client and server, information returned from a keyserver in arbitrary search results cannot be trusted by the client until the OpenPGP client actually retrieves and checks the certificate for itself.
This is important and must be stressed: without a specific reason to treat information otherwise, all search results <bcp14>SHOULD</bcp14> be regarded as untrustworthy and informational only.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This document allocates the ports 11371 and 11372, the service names "hkps" and "openpgpkey", and the URI schemes "hkp" and "hkps".</t>

<section anchor="updated-registry-entries"><name>Updated Registry Entries</name>

<t>IANA is requested to update the contact details for port 11371 in the "Service Name and Transport Protocol Port Number" registry to "Daphne Shaw".</t>

<t>IANA is also requested to update the following existing template in the "Media Types" registry, where <spanx style="verb">((THIS DOCUMENT))</spanx> should be replaced by the RFC number of this document:</t>

<t><list style="symbols">
  <t>application/pgp-keys:</t>
</list></t>

<figure><artwork><![CDATA[
MIME media type name: application
MIME subtype name: pgp-keys
Required parameters: none
Optional parameters: none
Encoding considerations: 7bit

Security considerations:

   See RFC 9580 Section 13.

Interoperability considerations:

   Legacy software is known to ship detached revocation signatures using an ambiguous syntax.
   See {{application-pgp-keys-media-type}} of ((THIS DOCUMENT)).

Published specification:

   RFC 9580, RFC 3156, and ((THIS DOCUMENT)).

Additional information:

   Magic number(s): none
   File extension(s): asc
   Macintosh File Type Code(s): none

Person & email address to contact for further information:

   Andrew Gallagher
   Email: andrewg&andrewg.com

Intended usage: common

Author/Change controller:

   Andrew Gallagher
   Email: andrewg&andrewg.com
]]></artwork></figure>

</section>
<section anchor="new-registry-entries"><name>New Registry Entries</name>

<t>IANA is requested to add the following entries to the "Service Name and Transport Protocol Port Number" registry as per <xref target="RFC6335"></xref>:</t>

<texttable title="Service Name and Transport Protocol Port Number Registry" anchor="service-name-port-registry">
      <ttcol align='left'>Service Name</ttcol>
      <ttcol align='left'>Port</ttcol>
      <ttcol align='left'>Transport Protocol</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Contact</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>hkps</c>
      <c>11372</c>
      <c>tcp and udp</c>
      <c>OpenPGP HTTP Keyserver (Secure)</c>
      <c>Daphne Shaw</c>
      <c>This document</c>
      <c>openpgpkey</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>OpenPGP Certificate Discovery</c>
      <c>Daphne Shaw</c>
      <c>This document</c>
</texttable>

<t>IANA is requested to add the following entries to the "URI Schemes" registry as per <xref target="RFC7595"></xref>:</t>

<texttable title="Uniform Resource Identifier (URI) Schemes Registry" anchor="uri-schemes-registry">
      <ttcol align='left'>URI Scheme</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Status</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>hkp</c>
      <c>OpenPGP HTTP Keyserver</c>
      <c>Permanent</c>
      <c>This document</c>
      <c>hkps</c>
      <c>OpenPGP HTTP Keyserver (Secure)</c>
      <c>Permanent</c>
      <c>This document</c>
</texttable>

<t>IANA is requested to register the following new template in the "Media Types" registry, where <spanx style="verb">((THIS DOCUMENT))</spanx> should be replaced by the RFC number of this document:</t>

<t><list style="symbols">
  <t>application/pgp:</t>
</list></t>

<figure><artwork><![CDATA[
MIME media type name: application
MIME subtype name: pgp
Required parameters: none
Optional parameters: none
Encoding considerations: binary

Security considerations:

   See RFC 9580 Section 13.

Interoperability considerations: none

Published specification:

   RFC 9580 and ((THIS DOCUMENT)).

Additional information:

   Magic number(s): none
   File extension(s): pgp
   Macintosh File Type Code(s): none

Person & email address to contact for further information:

   Andrew Gallagher
   Email: andrewg&andrewg.com

Intended usage: common

Author/Change controller:

   Andrew Gallagher
   Email: andrewg&andrewg.com
]]></artwork></figure>

</section>
</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="RFC1866">
  <front>
    <title>Hypertext Markup Language - 2.0</title>
    <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
    <author fullname="D. Connolly" initials="D." surname="Connolly"/>
    <date month="November" year="1995"/>
    <abstract>
      <t>This document defines a HTML 2.0 (to distinguish it from the previous informal specifications). [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="1866"/>
  <seriesInfo name="DOI" value="10.17487/RFC1866"/>
</reference>
<reference anchor="RFC2782">
  <front>
    <title>A DNS RR for specifying the location of services (DNS SRV)</title>
    <author fullname="A. Gulbrandsen" initials="A." surname="Gulbrandsen"/>
    <author fullname="P. Vixie" initials="P." surname="Vixie"/>
    <author fullname="L. Esibov" initials="L." surname="Esibov"/>
    <date month="February" year="2000"/>
    <abstract>
      <t>This document describes a DNS RR which specifies the location of the server(s) for a specific protocol and domain. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="2782"/>
  <seriesInfo name="DOI" value="10.17487/RFC2782"/>
</reference>
<reference anchor="RFC3156">
  <front>
    <title>MIME Security with OpenPGP</title>
    <author fullname="M. Elkins" initials="M." surname="Elkins"/>
    <author fullname="D. Del Torto" initials="D." surname="Del Torto"/>
    <author fullname="R. Levien" initials="R." surname="Levien"/>
    <author fullname="T. Roessler" initials="T." surname="Roessler"/>
    <date month="August" year="2001"/>
    <abstract>
      <t>This document describes how the OpenPGP Message Format can be used to provide privacy and authentication using the Multipurpose Internet Mail Extensions (MIME) security content types described in RFC 1847. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="3156"/>
  <seriesInfo name="DOI" value="10.17487/RFC3156"/>
</reference>
<reference anchor="RFC3339">
  <front>
    <title>Date and Time on the Internet: Timestamps</title>
    <author fullname="G. Klyne" initials="G." surname="Klyne"/>
    <author fullname="C. Newman" initials="C." surname="Newman"/>
    <date month="July" year="2002"/>
    <abstract>
      <t>This document defines a date and time format for use in Internet protocols that is a profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="3339"/>
  <seriesInfo name="DOI" value="10.17487/RFC3339"/>
</reference>
<reference anchor="RFC3986">
  <front>
    <title>Uniform Resource Identifier (URI): Generic Syntax</title>
    <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
    <author fullname="R. Fielding" initials="R." surname="Fielding"/>
    <author fullname="L. Masinter" initials="L." surname="Masinter"/>
    <date month="January" year="2005"/>
    <abstract>
      <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="66"/>
  <seriesInfo name="RFC" value="3986"/>
  <seriesInfo name="DOI" value="10.17487/RFC3986"/>
</reference>
<reference anchor="RFC8259">
  <front>
    <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
    <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
    <date month="December" year="2017"/>
    <abstract>
      <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
      <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="90"/>
  <seriesInfo name="RFC" value="8259"/>
  <seriesInfo name="DOI" value="10.17487/RFC8259"/>
</reference>
<reference anchor="RFC9110">
  <front>
    <title>HTTP Semantics</title>
    <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
    <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
    <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
    <date month="June" year="2022"/>
    <abstract>
      <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
      <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="97"/>
  <seriesInfo name="RFC" value="9110"/>
  <seriesInfo name="DOI" value="10.17487/RFC9110"/>
</reference>
<reference anchor="RFC9525">
  <front>
    <title>Service Identity in TLS</title>
    <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre"/>
    <author fullname="R. Salz" initials="R." surname="Salz"/>
    <date month="November" year="2023"/>
    <abstract>
      <t>Many application technologies enable secure communication between two entities by means of Transport Layer Security (TLS) with Internet Public Key Infrastructure using X.509 (PKIX) certificates. This document specifies procedures for representing and verifying the identity of application services in such interactions.</t>
      <t>This document obsoletes RFC 6125.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9525"/>
  <seriesInfo name="DOI" value="10.17487/RFC9525"/>
</reference>
<reference anchor="RFC9580">
  <front>
    <title>OpenPGP</title>
    <author fullname="P. Wouters" initials="P." role="editor" surname="Wouters"/>
    <author fullname="D. Huigens" initials="D." surname="Huigens"/>
    <author fullname="J. Winter" initials="J." surname="Winter"/>
    <author fullname="Y. Niibe" initials="Y." surname="Niibe"/>
    <date month="July" year="2024"/>
    <abstract>
      <t>This document specifies the message formats used in OpenPGP. OpenPGP provides encryption with public key or symmetric cryptographic algorithms, digital signatures, compression, and key management.</t>
      <t>This document is maintained in order to publish all necessary information needed to develop interoperable applications based on the OpenPGP format. It is not a step-by-step cookbook for writing an application. It describes only the format and methods needed to read, check, generate, and write conforming packets crossing any network. It does not deal with storage and implementation questions. It does, however, discuss implementation issues necessary to avoid security flaws.</t>
      <t>This document obsoletes RFCs 4880 ("OpenPGP Message Format"), 5581 ("The Camellia Cipher in OpenPGP"), and 6637 ("Elliptic Curve Cryptography (ECC) in OpenPGP").</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9580"/>
  <seriesInfo name="DOI" value="10.17487/RFC9580"/>
</reference>

<reference anchor="CORS" target="https://fetch.spec.whatwg.org/#cors-protocol">
  <front>
    <title>Cross Origin Resource Sharing</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="UNF" target="https://www.unicode.org/reports/tr15/">
  <front>
    <title>Unicode Normalization Forms</title>
    <author fullname="Ken Whistler">
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>



<reference anchor="I-D.ietf-sml-structured-email">
   <front>
      <title>Structured Email</title>
      <author fullname="Hans-Jörg Happel" initials="H." surname="Happel">
         <organization>audriga GmbH</organization>
      </author>
      <date day="1" month="June" year="2026"/>
      <abstract>
	 <t>   This document specifies how a machine-readable variant of its content
   can be added to email messages.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-sml-structured-email-06"/>
   
</reference>
<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>
<reference anchor="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>



    </references>

    <references title='Informative References' anchor="sec-informative-references">



<reference anchor="RFC3492">
  <front>
    <title>Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA)</title>
    <author fullname="A. Costello" initials="A." surname="Costello"/>
    <date month="March" year="2003"/>
    <abstract>
      <t>Punycode is a simple and efficient transfer encoding syntax designed for use with Internationalized Domain Names in Applications (IDNA). It uniquely and reversibly transforms a Unicode string into an ASCII string. ASCII characters in the Unicode string are represented literally, and non-ASCII characters are represented by ASCII characters that are allowed in host name labels (letters, digits, and hyphens). This document defines a general algorithm called Bootstring that allows a string of basic code points to uniquely represent any string of code points drawn from a larger set. Punycode is an instance of Bootstring that uses particular parameter values specified by this document, appropriate for IDNA. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="3492"/>
  <seriesInfo name="DOI" value="10.17487/RFC3492"/>
</reference>
<reference anchor="RFC6335">
  <front>
    <title>Internet Assigned Numbers Authority (IANA) Procedures for the Management of the Service Name and Transport Protocol Port Number Registry</title>
    <author fullname="M. Cotton" initials="M." surname="Cotton"/>
    <author fullname="L. Eggert" initials="L." surname="Eggert"/>
    <author fullname="J. Touch" initials="J." surname="Touch"/>
    <author fullname="M. Westerlund" initials="M." surname="Westerlund"/>
    <author fullname="S. Cheshire" initials="S." surname="Cheshire"/>
    <date month="August" year="2011"/>
    <abstract>
      <t>This document defines the procedures that the Internet Assigned Numbers Authority (IANA) uses when handling assignment and other requests related to the Service Name and Transport Protocol Port Number registry. It also discusses the rationale and principles behind these procedures and how they facilitate the long-term sustainability of the registry.</t>
      <t>This document updates IANA's procedures by obsoleting the previous UDP and TCP port assignment procedures defined in Sections 8 and 9.1 of the IANA Allocation Guidelines, and it updates the IANA service name and port assignment procedures for UDP-Lite, the Datagram Congestion Control Protocol (DCCP), and the Stream Control Transmission Protocol (SCTP). It also updates the DNS SRV specification to clarify what a service name is and how it is registered. This memo documents an Internet Best Current Practice.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="165"/>
  <seriesInfo name="RFC" value="6335"/>
  <seriesInfo name="DOI" value="10.17487/RFC6335"/>
</reference>
<reference anchor="RFC7595">
  <front>
    <title>Guidelines and Registration Procedures for URI Schemes</title>
    <author fullname="D. Thaler" initials="D." role="editor" surname="Thaler"/>
    <author fullname="T. Hansen" initials="T." surname="Hansen"/>
    <author fullname="T. Hardie" initials="T." surname="Hardie"/>
    <date month="June" year="2015"/>
    <abstract>
      <t>This document updates the guidelines and recommendations, as well as the IANA registration processes, for the definition of Uniform Resource Identifier (URI) schemes. It obsoletes RFC 4395.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="35"/>
  <seriesInfo name="RFC" value="7595"/>
  <seriesInfo name="DOI" value="10.17487/RFC7595"/>
</reference>
<reference anchor="RFC8615">
  <front>
    <title>Well-Known Uniform Resource Identifiers (URIs)</title>
    <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
    <date month="May" year="2019"/>
    <abstract>
      <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
      <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8615"/>
  <seriesInfo name="DOI" value="10.17487/RFC8615"/>
</reference>
<reference anchor="RFC8820">
  <front>
    <title>URI Design and Ownership</title>
    <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
    <date month="June" year="2020"/>
    <abstract>
      <t>Section 1.1.1 of RFC 3986 defines URI syntax as "a federated and extensible naming system wherein each scheme's specification may further restrict the syntax and semantics of identifiers using that scheme." In other words, the structure of a URI is defined by its scheme. While it is common for schemes to further delegate their substructure to the URI's owner, publishing independent standards that mandate particular forms of substructure in URIs is often problematic.</t>
      <t>This document provides guidance on the specification of URI substructure in standards.</t>
      <t>This document obsoletes RFC 7320 and updates RFC 3986.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="190"/>
  <seriesInfo name="RFC" value="8820"/>
  <seriesInfo name="DOI" value="10.17487/RFC8820"/>
</reference>

<reference anchor="SKS" target="https://github.com/sks-keyserver/sks-keyserver/wiki">
  <front>
    <title>Synchronising Key Server Wiki</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="TOR" target="https://spec.torproject.org/">
  <front>
    <title>Tor Specifications</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>



<reference anchor="I-D.dkg-openpgp-1pa3pc">
   <front>
      <title>First-Party Approved Third-Party Certifications in OpenPGP</title>
      <author fullname="Daniel Kahn Gillmor" initials="D. K." surname="Gillmor">
         <organization>ACLU</organization>
      </author>
      <date day="6" month="September" year="2024"/>
      <abstract>
	 <t>   An OpenPGP certificate can grow in size without bound when third-
   party certifications are included.  This document describes a way for
   the owner of the certificate to explicitly approve of specific third-
   party certifications, so that relying parties can safely prune the
   certificate of any unapproved certifications.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-dkg-openpgp-1pa3pc-02"/>
   
</reference>

<reference anchor="I-D.dkg-openpgp-userid-conventions">
   <front>
      <title>OpenPGP User ID Conventions</title>
      <author fullname="Daniel Kahn Gillmor" initials="D. K." surname="Gillmor">
         <organization>ACLU</organization>
      </author>
      <date day="25" month="August" year="2023"/>
      <abstract>
	 <t>   OpenPGP User IDs are UTF-8 strings.  Existing documents claim that by
   conventione, they contain &quot;an RFC 2822 name-addr object&quot;, but that&#x27;s
   not the case.  This document attempts to better describe the actual
   conventions about User IDs in the deployed OpenPGP ecosystem.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-dkg-openpgp-userid-conventions-00"/>
   
</reference>



    </references>

</references>


<?line 1300?>

<section anchor="acknowledgments"><name>Acknowledgments</name>

<t>This document is a formalization and extension of HKP, originally implemented in the PKS keyserver by Marc Horowitz, which in turn was based on earlier work by Brian LaMacchia and Michael Graff.
The "prefixlog" request category is based on an earlier proposal by Daniel Kahn Gillmor and Vincent Breitmoser.</t>

<t>The authors would like to thank Peter Gutmann for his work on the Certstore protocol, some of which was applicable here, and the members of the pgp-keyserver-folk mailing list who contributed valuable comments and suggestions.
They would also like to thank Bart Butler, Daniel Kahn Gillmor, Heiko Schäfer, Justus Winter and Vincent Breitmoser for help with the v2 request format.</t>

</section>
<section anchor="document-history"><name>Document History</name>

<t>Note to RFC Editor: this section should be removed before publication.</t>

<section anchor="changes-between-draft-ietf-openpgp-hkp-00-and-draft-ietf-openpgp-hkp-01"><name>Changes Between draft-ietf-openpgp-hkp-00 and draft-ietf-openpgp-hkp-01</name>

<t><list style="symbols">
  <t>Expanded JSON response specifications.</t>
  <t>Split vfingerprint identifiers into separate version and fingerprint components.</t>
  <t>Legacy API requirements are only normative for implementations that explicitly support it.</t>
  <t>Included media type updates directly in this document.</t>
  <t>Expanded discussion of "/pks" path prefix and "legacy" vs "v1" nomenclature.</t>
  <t>Added reference to RFC9525 for domain-matching.</t>
  <t>Clients <bcp14>MUST</bcp14> silently ignore _sub_keys with unknown algorithms.</t>
  <t>Added note about distinction between 400 and 404.</t>
</list></t>

</section>
<section anchor="changes-between-draft-gallagher-openpgp-hkp-10-and-draft-ietf-openpgp-hkp-00"><name>Changes Between draft-gallagher-openpgp-hkp-10 and draft-ietf-openpgp-hkp-00</name>

<t>None</t>

</section>
<section anchor="changes-between-draft-gallagher-openpgp-hkp-09-and-draft-gallagher-openpgp-hkp-10"><name>Changes Between draft-gallagher-openpgp-hkp-09 and draft-gallagher-openpgp-hkp-10</name>

<t><list style="symbols">
  <t>Added JSON-LD example.</t>
  <t>Fixed some obsolete references.</t>
</list></t>

</section>
<section anchor="changes-between-draft-gallagher-openpgp-hkp-08-and-draft-gallagher-openpgp-hkp-09"><name>Changes Between draft-gallagher-openpgp-hkp-08 and draft-gallagher-openpgp-hkp-09</name>

<t><list style="symbols">
  <t>Refactored to separate v2 and Legacy sections.</t>
  <t>v2 API is now RESTful.</t>
  <t>v2 uses "category" and "identifier" instead of "op" and "search".</t>
  <t>v2 keywords are less terse.</t>
  <t>Defined "canonical bundle".</t>
  <t>Defined "identity".</t>
  <t>Resurrected SRV-based discovery.</t>
  <t>Added basic vs advanced submission.</t>
  <t>Added structured email.</t>
  <t>Specified bearer token authentication.</t>
  <t>Specified use of OPTIONS and HEAD.</t>
  <t>Specified the Last-Modified response header.</t>
  <t>Clarify subkey lookups.</t>
  <t>Sideline inexact matching.</t>
  <t>Discourage badly-behaved User IDs.</t>
  <t>Removed some misused HTTP return codes.</t>
  <t>Added tabular summaries.</t>
  <t>Added Daniel Huigens as co-author.</t>
</list></t>

</section>
<section anchor="changes-between-draft-gallagher-openpgp-hkp-07-and-draft-gallagher-openpgp-hkp-08"><name>Changes Between draft-gallagher-openpgp-hkp-07 and draft-gallagher-openpgp-hkp-08</name>

<t><list style="symbols">
  <t>Verified uploads now use prove-then-submit workflow.</t>
  <t>Removed SRV and discovery discussion (temporarily?).</t>
  <t>Added definitions of "discovery", "refresh" and "reference resolution".</t>
  <t>Normalised "certificate" terminology and warned about unqualified use of "keyring".</t>
  <t>Renumbered HKPv1 to HKPv2 for avoidance of confusion, and reordered path components.</t>
  <t>HKPv2 is now explicitly a binary protocol, and uses simplified paths.</t>
  <t>Defined v2 submission requests and "cb" option.</t>
  <t>Explicitly forbade mixed certificate bundle responses to v2 lookups.</t>
  <t>"since" is now "prefixlog".</t>
  <t>"get" operation is now <bcp14>MAY</bcp14>.</t>
  <t>"x-*" parameters are no longer specified (as per RFC6648).</t>
  <t>Fixed several errata.</t>
  <t>Expanded commentary and guidance.</t>
</list></t>

</section>
<section anchor="changes-between-draft-gallagher-openpgp-hkp-06-and-draft-gallagher-openpgp-hkp-07"><name>Changes Between draft-gallagher-openpgp-hkp-06 and draft-gallagher-openpgp-hkp-07</name>

<t><list style="symbols">
  <t>Added "authget" and "since" operations.</t>
  <t>Defined confidence.</t>
  <t>Added more explicit guidance re sorting, filtering and error codes.</t>
  <t>Key version MR output field is now "keyversion" to distinguish from the output format version.</t>
</list></t>

</section>
<section anchor="changes-between-draft-gallagher-openpgp-hkp-05-and-draft-gallagher-openpgp-hkp-06"><name>Changes Between draft-gallagher-openpgp-hkp-05 and draft-gallagher-openpgp-hkp-06</name>

<t><list style="symbols">
  <t>Updated references.</t>
</list></t>

</section>
<section anchor="changes-between-draft-gallagher-openpgp-hkp-04-and-draft-gallagher-openpgp-hkp-05"><name>Changes Between draft-gallagher-openpgp-hkp-04 and draft-gallagher-openpgp-hkp-05</name>

<t><list style="symbols">
  <t>Allow detached revocations in keyrings.</t>
  <t>Redesigned v2 request format to use path components for required fields.</t>
  <t>Added openpgpkey discovery file.</t>
  <t>Added "vfpget" and "kidget" operations.</t>
  <t>Added meaningful "exact" semantics.</t>
  <t>HKPS is now <bcp14>SHOULD</bcp14>.</t>
  <t>Defined port 11372.</t>
  <t>IANA registry tables.</t>
  <t>Deprecated <spanx style="verb">op=stats</spanx>.</t>
</list></t>

</section>
<section anchor="changes-between-draft-gallagher-openpgp-hkp-03-and-draft-gallagher-openpgp-hkp-04"><name>Changes Between draft-gallagher-openpgp-hkp-03 and draft-gallagher-openpgp-hkp-04</name>

<t><list style="symbols">
  <t>Reworded certificate lookups section for clarity.</t>
  <t>Separate section for keyring format.</t>
  <t>Specify detached revocations.</t>
  <t>Updated references.</t>
</list></t>

</section>
<section anchor="changes-between-draft-gallagher-openpgp-hkp-02-and-draft-gallagher-openpgp-hkp-03"><name>Changes Between draft-gallagher-openpgp-hkp-02 and draft-gallagher-openpgp-hkp-03</name>

<t><list style="symbols">
  <t>Clients <bcp14>SHOULD</bcp14> supply the <spanx style="verb">v=1</spanx> api-versioning variable.</t>
  <t>machine-readable output includes key version field.</t>
  <t>Clients <bcp14>MUST</bcp14> silently ignore leading and trailing cruft, trailing unknown fields, and unknown flags.</t>
  <t>Clients <bcp14>MUST</bcp14> silently ignore keys with unknown versions or algorithms.</t>
  <t>All other m-r index specs (CORS, Content-Type etc.) are now <bcp14>MUST</bcp14>.</t>
  <t>Included the <spanx style="verb">hash</spanx> variable from SKS.</t>
</list></t>

</section>
<section anchor="changes-between-draft-gallagher-openpgp-hkp-01-and-draft-gallagher-openpgp-hkp-02"><name>Changes Between draft-gallagher-openpgp-hkp-01 and draft-gallagher-openpgp-hkp-02</name>

<t><list style="symbols">
  <t>Tightened up BCP-14 language.</t>
  <t>Included <spanx style="verb">op=hget</spanx> from SKS.</t>
  <t>Options now strictly boolean with default false, variables less strict.</t>
  <t>More detail about HTTP status code usage.</t>
</list></t>

</section>
<section anchor="changes-between-draft-shaw-openpgp-hkp-00-and-draft-gallagher-openpgp-hkp-01"><name>Changes Between draft-shaw-openpgp-hkp-00 and draft-gallagher-openpgp-hkp-01</name>

<t><list style="symbols">
  <t>Improved text structure.</t>
  <t>Added references to HTTPS/HKPS, and hkp:/hkps: URL schemes.</t>
  <t>Forbade short IDs and deprecated V3 keys.</t>
  <t>Included <spanx style="verb">op=stats</spanx> from SKS.</t>
  <t>Mentioned CORS.</t>
  <t>Made use of terminology more consistent.</t>
  <t>Replaced custom status codes with standard HTTP status codes.</t>
</list></t>

</section>
</section>


  </back>

<!-- ##markdown-source:
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
YXH/F5T4G/b/LAEA

-->

</rfc>

