<?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.14 (Ruby 3.3.8) -->


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

]>


<rfc ipr="trust200902" docName="draft-gallagher-openpgp-hkp-08" 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>

    <date year="2025" month="August" day="08"/>

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

    <abstract>


<?line 52?>

<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/draft-gallagher-openpgp-hkp"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-gallagher-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/draft-gallagher-openpgp-hkp"/>.</t>
    </note>


  </front>

  <middle>


<?line 57?>

<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 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="RFC1945"></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>

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

<t>HKP defines three paths, namely "/pks/lookup" for legacy lookups (see <xref target="certificate-lookups"/>), "/pks/add" for legacy submission (see <xref target="submitting-certificates"/>), and "/pks/v2" for lookups and submission in the v2 API.
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>

</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>202 Accepted</c>
      <c>Submitted certificate was altered to match keyserver policy</c>
      <c>403 Forbidden</c>
      <c>The requested 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>Certificate has been permanently deleted, e.g. due to RTBF</c>
      <c>413 Content too large</c>
      <c>The search returned too many responses</c>
      <c>422 Unprocessable content</c>
      <c>Submitted certificate was rejected as per keyserver policy</c>
      <c>501 Not implemented</c>
      <c>The requested operation is not supported</c>
</texttable>

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

<t>(( andrewg : In draft-shaw-00 it was suggested that a novel header be used for statuses that could not be represented by the HTTP response codes of the time.
This was only partially specified, and it is unclear if any implementations of this header existed.
In the meantime many new HTTP response codes have been defined, so I am using them instead - even if their semantics does not exactly match that of <xref target="RFC9110"></xref>.
NB therefore that codes 202, 410, 413, 422 may not have been implemented anywhere yet.
))</t>

<t>(( andrewg : note also that 413 and 202 may be incorrect usage, see issues #25 and #26 respectively.
))</t>

</section>
</section>
<section anchor="certificate-lookups"><name>Looking up Data from a Keyserver</name>

<t>Certificate lookups are done via an HTTP GET request.
Specifically, the abs_path (<xref section="3.2" sectionFormat="of" target="RFC1945"/>) is built up of the base path "/pks/lookup" or "/pks/v2", followed by request-specific URL components.
These components differ slightly between the Legacy and v2 lookup formats (see below).</t>

<t>Most HKP lookups contain both the "op" (operation) and "search" fields.
The "op" field determines what operation the keyserver will execute, and the "search" field determines which certificates are operated on.</t>

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

<section anchor="lookup-formats"><name>Legacy and v2 Lookup Formats</name>

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

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

<t>In the Legacy lookup format, the "op" and "search" fields are supplied as HTTP query strings, in the form "&lt;field-name&gt;=&lt;value&gt;":</t>

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

<t>They are treated in the same way as modifier variables, including arbitrary ordering, however the "op" field <bcp14>MUST</bcp14> be supplied, and the "search" field <bcp14>MUST</bcp14> be supplied unless the "stats" operation is being requested (see <xref target="stats-operation"/>).
No URL path components under "/pks/lookup" are used.</t>

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

<t>In the v2 lookup format, the values of the "op" and "search" fields are supplied as URL path components.
They are appended to "/pks/v2" as follows:</t>

<figure><artwork><![CDATA[
/pks/v2/<op>/<search>[?...]
]]></artwork></figure>

<t>The "op" and "search" fields <bcp14>MUST</bcp14> be supplied.
Modifier variables are supplied as HTTP query strings, in the form "&lt;field-name&gt;=&lt;value&gt;".</t>

<t>If the v2 lookup format is being used, v2 output format (<xref target="output-formats"/>) <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>

</section>
</section>
<section anchor="operation-lookup-field"><name>The Operation Lookup Field</name>

<t>The operation ("op") field specifies the lookup operation to be performed on the keyserver.
The "op" field is generally accompanied by a "search" field 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>

<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" field.</t>

<t>The response to a successful "get" operation is a HTTP document containing a 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 User ID (<xref target="confidence"/>), and then by creation date (most recent first).
A keyserver <bcp14>MAY</bcp14> choose to only return results where the User ID 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="authget-operation"><name>The "authget" (authoritative get) Operation</name>

<t>A keyserver <bcp14>SHOULD</bcp14> support the "authget" operation.</t>

<t>The "authget" operation is similar to the "get" operation, but is used for authoritative lookups by User ID only, in particular during certificate discovery.
The keyserver <bcp14>SHOULD</bcp14> only return results where the User ID being searched for has a nonzero confidence value (<xref target="confidence"/>).
If a keyserver is being used for certificate discovery, it <bcp14>MUST</bcp14> return only results for which it is has complete confidence.
In addition, exact textual matching <bcp14>MUST</bcp14> be used even if the "exact" variable is set to "off" (<xref target="exact-variable"/>).</t>

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

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

<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 "search" field in ISO format with no time component, i.e. "2025-12-01".</t>

<t>The returned data is a list of CRLF-separated, hexadecimal-encoded fingerprint prefixes, and each prefix is truncated at a hex-digit boundary.
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.
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 "vfpget" requests as appropriate (<xref target="vfpget-operation"/>).
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 prefixes are always used, regardless of fingerprint version.
This contrasts with Key IDs, which are version-dependent.</t>

<t>A keyserver <bcp14>MUST NOT</bcp14> support indexing or downloading certificates by prefix.</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" field.
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 User ID (<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 for Legacy lookups.
The "vindex" operation is deprecated and <bcp14>MUST NOT</bcp14> be used in a v2 lookup.</t>

<t>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 in Legacy lookup format.
The "stats" operation is deprecated, and <bcp14>MUST NOT</bcp14> be used in a v2 lookup.
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" field <bcp14>SHOULD NOT</bcp14> be supplied, and <bcp14>SHOULD</bcp14> be ignored if received.</t>

</section>
<section anchor="vfpget-operation"><name>The "vfpget" (versioned fingerprint get) Operation</name>

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

<t>"vfpget" requests a certificate from a keyserver by specifying its versioned fingerprint.
The versioned fingerprint is provided in the "search" field in hexadecimal encoding, without a preceding "0x".
The hexadecimal digits are not case sensitive.</t>

<t>A versioned fingerprint consists of one octet of fingerprint version number and N octets of fingerprint.
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"/>).</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="kidget-operation"><name>The "kidget" (key id get) Operation</name>

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

<t>"kidget" requests a certificate from a keyserver by specifying its Key ID (<xref section="5.5.4" sectionFormat="of" target="RFC9580"/>).
The Key ID is provided in the "search" field as 16 hexadecimal digits, 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>

<t>"kidget" 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 "kidget" operation.</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" field 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>
<section anchor="search-lookup-field"><name>The "search" Lookup Field</name>

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

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

<t>To search for a certificate by its Key ID or fingerprint, a client <bcp14>SHOULD</bcp14> use a v2 lookup and either the "kidget" (<xref target="kidget-operation"/>) or "vfpget" (<xref target="vfpget-operation"/>) operation (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.
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" field.</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 (see <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="text-searches"><name>Text Searches</name>

<t>To search for a certificate by the text of a User ID, a client <bcp14>SHOULD</bcp14> use the "get", "authget", or "index" operation (as appropriate) and <bcp14>SHOULD NOT</bcp14> prefix the "search" string with "0x".</t>

<t>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 (see also <xref target="legacy-mr-indexes"/>).
Otherwise, how a keyserver handles textual search is implementation defined.
See also the definition of the "exact" variable (<xref target="exact-variable"/>) for a method to give additional instructions to the server on how the search is to be executed.</t>

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

<t>Search for all certificates containing the string "dshaw", using plaintext HTTP:</t>

<t><list style="symbols">
  <t>Legacy lookup format:  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
  http://keys.example.com:11371/pks/lookup?search=dshaw&op=index
]]></artwork></figure>
  </t>
  <t>v2 lookup format:  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
  http://keys.example.com:11371/pks/v2/index/dshaw
]]></artwork></figure>
  </t>
</list></t>

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

<t><list style="symbols">
  <t>Legacy lookup format:  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
  https://keys.example.com/pks/lookup?op=get&search=0xDEADBEEFDECAFBAD
]]></artwork></figure>
  </t>
  <t>v2 lookup format:  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
  https://keys.example.com/pks/v2/kidget/DEADBEEFDECAFBAD
]]></artwork></figure>
  </t>
</list></t>

</section>
</section>
<section anchor="submitting-certificates"><name>Submitting Certificates To A Keyserver</name>

<t>A keyserver <bcp14>MAY</bcp14> accept submissions via an HTTP POST request, as specified in <xref section="8.3" sectionFormat="of" target="RFC1945"/>, and <xref section="8.2.3" sectionFormat="of" target="RFC1866"/>.
Specifically, the abs_path (<xref section="3.2" sectionFormat="of" target="RFC1945"/>) is built up of the base path "/pks/add" or "/pks/v2", followed by request-specific URL components.
These components, and the form of the POST body, differ between the Legacy and v2 submission formats (see below).</t>

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

<section anchor="submission-formats"><name>Legacy and v2 Submission Formats</name>

<t>For backwards compatibility with the existing installed client base, a Legacy submission format is defined.
New implementations <bcp14>SHOULD</bcp14> use the v2 submission format.
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 requested submission format.</t>

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

<t>In the Legacy submission format, the abs_path (<xref section="3.2" sectionFormat="of" target="RFC1945"/>) is always "/pks/add":</t>

<figure><artwork><![CDATA[
/pks/add[?...]
]]></artwork></figure>

<t>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 "application/x-www-form-urlencoded".
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 should also be urlencoded as specified in <xref section="8.2.1" sectionFormat="of" target="RFC1866"/>.</t>

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

<t>In the v2 submission format, the value of the operation field is supplied as a URL path component, and is appended to "/pks/v2" as follows:</t>

<figure><artwork><![CDATA[
/pks/v2/<op>[?...]
]]></artwork></figure>

<t>The "op" field <bcp14>MUST</bcp14> be supplied.
Unlike lookup requests, there is no "search" field defined.</t>

</section>
</section>
<section anchor="operation-submission-field"><name>The Operation Submission Field</name>

<t>The operation field specifies the submission operation to be performed on the keyserver.
If a particular submission operation is not supported, the keyserver <bcp14>SHOULD</bcp14> return an appropriate HTTP error code such as 501 ("Not Implemented").</t>

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

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

<t>The body of the POST message contains a certificate bundle as specified in <xref target="certificate-bundle-format"/>.
It <bcp14>MUST</bcp14> have a content-type of "application/pgp-keys; encoding=binary" and <bcp14>MUST NOT</bcp14> be ASCII-armored.</t>

<t>((TBC: this aligns with the current thinking of the KOO board, but it is a weak preference.
We may support additional submission methods; these would be detected by <spanx style="verb">Accept</spanx> responses to OPTIONS requests (see issue #30).
))</t>

<t>The URL <bcp14>MAY</bcp14> additionally contain a "tokens" query parameter (<xref target="tokens-variable"/>).
The "add" operation <bcp14>MAY</bcp14> have limited effect or fail entirely if a token corresponding to the email address in any of the submitted User IDs is not provided.</t>

<t>(Note that a keyserver <bcp14>MAY</bcp14> accept other forms of User ID verification, and the lack of a "tokens" query parameter will not necessarily result in submission failure.)</t>

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

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

<t>The body of the POST message is a CRLF-separated list of email addresses.
It <bcp14>SHOULD</bcp14> have a content-type of "text/plain".
A keyserver that supports the "tokensend" operation <bcp14>SHOULD</bcp14> attempt to verify each address by sending a time-limited auth token via email.
A keyserver <bcp14>MAY</bcp14> limit the number and frequency of verification requests.</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.
))</t>

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

<t>(( to be completed ))</t>

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

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

<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>

<section anchor="mr-option"><name>The "mr" (Machine-Readable) Option (Legacy)</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 requests only.</t>

</section>
<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="cb-option"><name>The "cb" (Canonical Bundle) Option</name>

<t>The canonical bundle option instructs the server that for each proof of User ID (such as a verification token, see <xref target="tokensend-operation"/>) contained in the submission:</t>

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

<t>When a keyserver verifies the proof of each User ID, it updates its internal confidence value accordingly (see <xref target="confidence"/>).</t>

<t>Canonicality only affects the identity and order of certificate(s) returned by User ID lookups, and not to the particular form of the certificate(s) returned.
Other methods such as <xref target="I-D.dkg-openpgp-1pa3pc"/> are more appropriate for controlling the form of certificates.
In particular, a keyserver <bcp14>MUST</bcp14> allow a valid revocation certificate for any key to be uploaded without identity verification.</t>

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

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

<t>The "tokens" variable contains a comma-separated list of one or more tokens obtained via the "tokensend" operation (<xref target="tokensend-operation"/>).
These tokens <bcp14>SHOULD</bcp14> correspond to one or more User IDs present in the certificate bundle being submitted.
A keyserver <bcp14>MAY</bcp14> refuse to serve the certificate(s) when queried by User ID if a valid token was not supplied.</t>

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

</section>
<section anchor="fingerprint-variable"><name>The "fingerprint" Variable (Legacy)</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 (see <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 (Legacy)</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 (Legacy)</name>

<t>This variable takes one argument: "on" or "off".
If set to "on", it instructs the server to search for an exact match for the contents of the "search" field.
A keyserver implementation <bcp14>SHOULD</bcp14> set the default behaviour to "on" and <bcp14>MAY</bcp14> ignore this variable for Legacy lookups.
A keyserver implementation <bcp14>MUST</bcp14> ignore this variable and treat all searches as exact in v2 lookups.</t>

<t>When "exact" is set to "on", a keyserver <bcp14>SHOULD</bcp14> only return results if the "search" field 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 ("&lt;...&gt;") in an email-address style User ID.</t>
</list></t>

<t>In either case, the string matching <bcp14>SHOULD NOT</bcp14> be case sensitive.</t>

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

</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 unknown JSON fields in "index" and "add" 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 "Access-Control-Allow-Origin: *", 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" operations.</t>
  <t><bcp14>MUST</bcp14> use the format specified in <xref target="submission-responses"/> when responding to "add" operations.</t>
  <t><bcp14>MUST</bcp14> return non-armored (binary) certificate bundles in response to lookup requests.</t>
  <t><bcp14>MUST</bcp14> set "Content-Type: application/json" for "index" and "add" responses.</t>
  <t><bcp14>MUST</bcp14> set "Content-Type: application/pgp-keys; encoding=binary" when returning non-armored certificate bundles (see <xref section="5" sectionFormat="of" target="I-D.gallagher-openpgp-media-types"/>)</t>
</list></t>

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

<t>A v2 "index" operation <bcp14>SHOULD</bcp14> return a JSON list of certificates.
If the search was for a User ID, 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'>Description</ttcol>
      <c>version</c>
      <c>integer</c>
      <c>version of the primary key (<bcp14>REQUIRED</bcp14>)</c>
      <c>fingerprint</c>
      <c>string</c>
      <c>fingerprint of the primary key (<bcp14>REQUIRED</bcp14>)</c>
      <c>creation</c>
      <c>string</c>
      <c>creation date of the key</c>
      <c>expiration</c>
      <c>string</c>
      <c>expiration date of the key</c>
      <c>isExpired</c>
      <c>boolean</c>
      <c>&#160;</c>
      <c>isRevoked</c>
      <c>boolean</c>
      <c>&#160;</c>
      <c>algorithm</c>
      <c>algorithm</c>
      <c>(<xref target="v2-index-algorithm-fields"/>)</c>
      <c>userIDs</c>
      <c>userID array</c>
      <c>(<xref target="v2-index-userid-fields"/>)</c>
      <c>subkeys</c>
      <c>subkey array</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'>Description</ttcol>
      <c>code</c>
      <c>integer</c>
      <c>algorithm ID (<bcp14>REQUIRED</bcp14>)</c>
      <c>name</c>
      <c>string</c>
      <c>a human-readable identifier for the algorithm</c>
      <c>bitLength</c>
      <c>integer</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'>Description</ttcol>
      <c>uidString</c>
      <c>string</c>
      <c>User ID string contents (<bcp14>REQUIRED</bcp14>)</c>
      <c>creation</c>
      <c>string</c>
      <c>creation date of (the first signature over) the User ID</c>
      <c>expiration</c>
      <c>string</c>
      <c>expiration date of the User ID</c>
      <c>isExpired</c>
      <c>boolean</c>
      <c>&#160;</c>
      <c>isRevoked</c>
      <c>boolean</c>
      <c>&#160;</c>
      <c>confidence</c>
      <c>integer</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'>Description</ttcol>
      <c>version</c>
      <c>integer</c>
      <c>version of the subkey (<bcp14>REQUIRED</bcp14>)</c>
      <c>fingerprint</c>
      <c>string</c>
      <c>fingerprint of the subkey (<bcp14>REQUIRED</bcp14>)</c>
      <c>creation</c>
      <c>string</c>
      <c>creation date of the subkey</c>
      <c>expiration</c>
      <c>string</c>
      <c>expiration date of the subkey</c>
      <c>isExpired</c>
      <c>boolean</c>
      <c>&#160;</c>
      <c>isRevoked</c>
      <c>boolean</c>
      <c>&#160;</c>
      <c>algorithm</c>
      <c>algorithm</c>
      <c>(<xref target="v2-index-algorithm-fields"/>)</c>
</texttable>

<t>Fingerprints and long Key IDs are given in hexadecimal notation, without any "0x" prefix.
Dates are given in ISO 8601 format.
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>Submission Responses</name>

<t>An "add" operation <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'>Description</ttcol>
      <c>inserted</c>
      <c>certificate array</c>
      <c>newly added certificates</c>
      <c>updated</c>
      <c>certificate array</c>
      <c>updated certificates</c>
      <c>deleted</c>
      <c>certificate array</c>
      <c>deleted certificates</c>
      <c>ignored</c>
      <c>certificate array</c>
      <c>certificates that were discarded</c>
</texttable>

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

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

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

<t><list style="symbols">
  <t><bcp14>SHOULD</bcp14> supply "options=mr" (<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>
</list></t>

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

<t><list style="symbols">
  <t><bcp14>MUST</bcp14> set the HTTP header "Access-Control-Allow-Origin: *", 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 "Content-Type: application/pgp-keys" when returning ASCII-armored certificate bundles (the "get", "vfpget", "kidget", and "hget" operations), as specified in <xref section="7" sectionFormat="of" target="RFC3156"/>.</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 "-----BEGIN PGP PUBLIC KEY BLOCK-----" header, the armored certificate data itself, the "-----END PGP PUBLIC KEY BLOCK-----" 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 Content-Type: text/plain.</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 (see <xref target="fingerprint-variable"/>).</t>

<t>Algorithm IDs are as specified in <xref section="9.1" sectionFormat="of" target="RFC9580"/>, i.e. 1==RSA, 17==DSA, etc.</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 urlencoding for anything that isn't 7-bit safe as well as for the ":" and "%" characters.
Any other characters <bcp14>MAY</bcp14> be urlencoded, 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-01T00: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="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 (see <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"/>.</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="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, 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>

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

<t>IANA is requested to add the following entry 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>
      <c>hkps</c>
      <c>11372</c>
      <c>tcp and udp</c>
      <c>OpenPGP HTTP Keyserver (Secure)</c>
      <c>Daphne Shaw</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>

</section>
</section>


  </middle>

  <back>


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



<reference anchor="RFC1945">
  <front>
    <title>Hypertext Transfer Protocol -- HTTP/1.0</title>
    <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
    <author fullname="R. Fielding" initials="R." surname="Fielding"/>
    <author fullname="H. Frystyk" initials="H." surname="Frystyk"/>
    <date month="May" year="1996"/>
    <abstract>
      <t>The Hypertext Transfer Protocol (HTTP) is an application-level protocol with the lightness and speed necessary for distributed, collaborative, hypermedia information systems. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="1945"/>
  <seriesInfo name="DOI" value="10.17487/RFC1945"/>
</reference>
<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="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="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="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="I-D.gallagher-openpgp-media-types">
   <front>
      <title>Media Types for OpenPGP</title>
      <author fullname="Andrew Gallagher" initials="A." surname="Gallagher">
         <organization>PGPKeys.EU</organization>
      </author>
      <date day="8" month="August" year="2025"/>
      <abstract>
	 <t>   This document updates the specification of existing media types, and
   specifies additional media types, for the identification of OpenPGP
   data in non-MIME contexts.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-gallagher-openpgp-media-types-00"/>
   
</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="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="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>



    </references>


<?line 839?>

<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" operation 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 Huigens, 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-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 <xref target="certificate-lookups"/> 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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
AskprMKIbA/8IOffiqygf2rulE2bdVN21ESNGksI9HW2seC4Yg4QvJNoqbpa
AMpDpmm1yuJNWLowYOtb0FQ/z81/WnPh1S+rJLvizk/bcls8Q6WhxhtF+XS7
JaP5NgNBJIk28BY5i8+qoojgpNNGKY1xODL/8heZfJDUPALzVSOjq5X+5Wf9
tI2XoHqrDrYnNpYWz9nkw9yy2K5vcOoSmVpTpkQNSTe+JUcacTsBySFCB3Jj
ka9LaTKg0+jeEDuBXkhhW20Y002iQZ7ID++mS9z5FxGknx1uFYQmEeY3k18j
PbMTn72iuM+lVCkT204NhmBup2dZ5j+blH9jzOQaAEadz0U4zY7rwrhGltyX
oZzt0ZH3b8Q3PyMz1y2SJH/jMFGLyvV6a6T2BgchdfKZ2wncZBh3bkZX/e0N
H/VTYFq7qjwPPM1kpoLlybqJVGxqWWX0drNTft8TwDRuRyW7+smkXUAL29Ma
j+ZMVVbtu20NN5wtKZmxmnroJ8iO9CH27RS5TZKKOYtlXJryOG5SNxqNuB/d
rnIOdigMjUOhqjdZ4pktJOQ0Q33COTu1S360fWPC8s9WkrkHvLtRR/RGOJLL
QWp0v5NTE7h3MZ81yTG61JQJYmTuysp8TvP+2Y+55EZ2fHoVrUtd64PbWWOb
sxgHogb4miyv3+GQgqNRqcmV8jadatr5qFjG0n8vkSNI2PBjtic5VsGct/Bb
oYFJDE0Y8BGc4hfna+J7GTeKlVQyOdrNtjLppmDsrxdrIgOiuhluriPh8dtT
48kU0qgMVqFl3PY8Ej604D/O37zmrs04xvTnjhIZ25q4J20tA/SRRJEAgT65
tvfqvnbOZiRtDPWYIRMg8lLpgiOi2INgkuvcYRXQluZoXbVY8pGU20cz7/IK
tTtlmodCj2PHNpYtFBnWvrnJBwzJW4iyXk6N0Bbd/WOORQ2firE8PAZyDOXo
1qPoq347EfInnBP7s1uQyb1TWd7IVyCYW/VTLK0wfN1K0q/uOrIXyLJg2fKN
MO7ufcG2iXHItyNZELudWNioN2xk5YwCSPe1H/5QznP2cy/+VhlF9uYtvtto
N2RyKDDMYRm3EZlaDrZ2E5zp1rN6yaywjWRPZauF1sy+c5X5QUc5RiN/R9C/
q0nMyHRMVQXlOlYOGXjIuvqieO1QnDPLOc3azdmeNdVqOd/PeU64pE8toaaU
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

-->

</rfc>

