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


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

]>


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

    <author fullname="D Shaw">
      <organization>Jabberwocky Tech</organization>
      <address>
        <email>dshaw@jabberwocky.com</email>
      </address>
    </author>
    <author fullname="A Gallagher" role="editor">
      <organization>PGPKeys.EU</organization>
      <address>
        <email>andrewg@andrewg.com</email>
      </address>
    </author>

    <date year="2023" month="October" day="10"/>

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

    <abstract>


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


<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 key server - a server that stores public keys and can be searched for a given key.
The HTTP Keyserver Protocol is a OpenPGP keyserver implemented using HTTP.</t>

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

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

</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.
In order to give as much information to the client about error conditions, is good practice to return the most specific error code possible: for example, returning 404 ("Not Found") rather than 400 ("Bad Request") when a key 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>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.
))</t>

<t>By convention and history, HKP uses HTTP on TCP port 11371.
It has been suggested by some that for reasons of maximum compatibility with firewalls and filtering HTTP proxies, it is better to use the standard HTTP port (TCP port 80).
See {#locating-a-keyserver}, Locating a HKP Keyserver for an automated way for clients to discover the correct port.</t>

</section>
<section anchor="requesting-data"><name>Requesting Data from a Keyserver</name>

<t>Keyserver requests are done via a HTTP GET URL that encodes the request within it.
Specifically, the abs_path (see <xref target="RFC1945"></xref>, section 3.2) is built up of the base request "/pks/lookup", followed by any variables.
Arguments are passed through the usual means as specified in <xref target="RFC1866"></xref>, section 8.2.2.
The variables may be given in any order.
Keyservers <bcp14>MUST</bcp14> ignore any unknown variables.</t>

<section anchor="basic-variables"><name>Basic Variables</name>

<t>All HKP requests contain the "op" (operation) and "search" variables.
The "op" variable determines what operation the keyserver will take, and the "search" variable determines that keys are operated on.</t>

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

<t>The search variable contains arbitrary text encoded as usual for a HTTP URL.
This text may represent the key ID of the key being sought or some text from a user ID on the key being sought.</t>

<t>If any particular type of searching is not supported, the keyserver should return an appropriate HTTP error code such as 501 ("Not Implemented").
The server <bcp14>MUST NOT</bcp14> return an error code (such as 404 ("Not Found")) that could be mistaken by the client for a valid response.</t>

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

<t>If a key is being sought by its key ID, the key ID string is prefixed with an "0x" to indicate a hexadecimal number.
Key ID strings may be 8 digits (32-bit key ID), 16 digits (64-bit key ID), 32 digits (version 3 fingerprint), or 40 digits (version 4 fingerprint).
The hexadecimal digits are not case sensitive.</t>

<t>A keyserver that allows searching by keyid <bcp14>MUST</bcp14> accept the 160-bit version 4 fingerprint, 64-bit key IDs, and 32-bit key IDs in the "search" variable.
Note this does not mean that the keyserver will actually use the full length of the request in the search, as it may internally create a 32-bit or 64-bit key ID from a version 4 fingerprint (by taking the low-order 32 or 64 bits respectively), or a 32-bit key ID from a 64-bit key ID (by taking low-order 32 bits).
That said, a keyserver <bcp14>SHOULD</bcp14> use at least 64 bits of the key ID if available.</t>

</section>
<section anchor="v3fp-searches"><name>V3 Fingerprint Searches</name>

<t>The 128-bit version 3 fingerprint is represented by a leading "0x", followed by 32 case-insensitive hexadecimal digits.
Note that v3 fingerprints are treated differently and not grouped with keyid or v4 fingerprint searches as it is not possible to calculate a 64-bit or 32-bit keyid from a v3 fingerprint.</t>

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

<t>How a keyserver handles a textual search is implementation defined.
See also the definition of the "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="op-variable"><name>The "op" (operation) Variable</name>

<t>The op variable specifies the operation to be performed on the keyserver.
The op variable is generally used with the "search" variable to specify the keys that should be operated on.</t>

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

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

<t>The response to a successful "get" request is a HTTP document containing a keyring as specified in OpenPGP <xref target="RFC4880"></xref>, section 11.1, and ASCII armored as specified in section 6.2.</t>

<t>The response may be wrapped in any HTML or other text desired, except that the actual key data consisting of an initial line break, the "-----BEGIN PGP PUBLIC KEY BLOCK-----" header, the armored key data itself, the "-----END PGP PUBLIC KEY BLOCK-----" header, and a final line break <bcp14>MUST NOT</bcp14> be modified from the form specified in <xref target="RFC4880"></xref>.</t>

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

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

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

<t>If the "index" operation is not supported, the keyserver should return an appropriate HTTP error code such as 501 ("Not Implemented").</t>

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

<t>The "vindex" operation is similar to "index" in that it provides a list of keys on the keyserver that match the text of key ID in the "search" variable.
Historically, a "vindex" response was the same as "index" with the addition of showing the signatures on each key, but this is not required.</t>

<t>If the "vindex" operation is not supported, the keyserver should return an appropriate HTTP error code such as 501 ("Not Implemented").</t>

</section>
<section anchor="other-operations"><name>Other operations</name>

<t>Other site-specific or nonstandard operations can be indicated by prefixing the operation name with the string "x-".</t>

</section>
</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 arguments, separated by commas.
These are used to modify the behavior of the keyserver on a per-request basis.</t>

<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 the request, so the output may be customized for that use.
See Section 5, Output Formats for the specific details of machine readable output.</t>

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

<t>As keyservers may modify submitted keys to suit a particular policy, this option is used to inform the keyserver that the submitter would rather have the submission fail completely then have the submitted key(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 key was submitted, the keyserver could trim any noncompliant user IDs before accepting the key.
If this option was set, then the key submission would fail.</t>

</section>
<section anchor="other-options"><name>Other Options</name>

<t>Other site-specific or nonstandard options can be indicated by prefixing the option name with the string "x-".</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 key fingerprint for each key in an "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.</t>

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

<t>This variable takes one argument: "on" or "off".
If present and on, it instructs the server to search for an exact match for the contents of the "search" variable.
The exact meaning of "exact match" is implementation defined.</t>

</section>
<section anchor="other-variables"><name>Other variables</name>

<t>Other site-specific or nonstandard variables can be indicated by prefixing the variable name with the string "x-".</t>

</section>
</section>
<section anchor="request-examples"><name>Request Examples</name>

<t>Search for all keys containing the string "dshaw":</t>

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

<t>Get key 0x99242560 (32-bit key ID):</t>

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

</section>
</section>
<section anchor="submitting-keys"><name>Submitting Keys To A Keyserver</name>

<t>Keyserver submissions are done via a HTTP POST URL.
Specifically, the abs_path (see <xref target="RFC1945"></xref>, section 3.2) is set to "/pks/add", and the key data is provided via HTTP POST as specified in <xref target="RFC1945"></xref>, section 8.3, and <xref target="RFC1866"></xref>, section 8.2.3.</t>

<t>The body of the POST message contains a "keytext" variable which is set to an ASCII armored keyring as specified in <xref target="RFC4880"></xref>, sections 6.2 and 11.1.
The ASCII armored keyring should also be urlencoded as specified in <xref target="RFC1866"></xref>, section 8.2.1.
Note that more than one key may be submitted in a single transaction.</t>

<t>There may also be an "options" variable, as specified in {#options-variable} above.</t>

<t>If a keyserver does not support adding keys via HTTP, then requests to do so should return an appropriate HTTP error code, such as 403 ("Forbidden") if key submission has been disallowed, or 501 ("Not Implemented") if the server does not support HTTP key submission.
The keyserver <bcp14>MUST NOT</bcp14> return an error code (such as 404 ("Not Found")) that could be mistaken by the client for a valid response.</t>

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

<t>HKP is intended for both human and programmatic use.
The "machine readable" option is used to tailor the output for a given use.
In general, the "human readable" output is implementation specific.
For interoperability, the "machine readable" output <bcp14>MUST</bcp14> carefully follow the guidelines given here.</t>

<t>Note that there is an installed base of programs that do in fact attempt to parse the human readable "index" format used in the pksd keyserver.
Care should be taken with the choice of an "index" format if compatibility with these programs is desired.</t>

<section anchor="mr-output"><name>Machine Readable Output</name>

<t>When machine readable output is requested, several changes are made to output:</t>

<t><list style="symbols">
  <t>Key retrievals (op=get) do not contain any text aside from the ASCII armored keyring.
The document is also sent to the user using Content-Type: application/pgp-keys as specified in <xref target="RFC3156"></xref>.</t>
  <t>Key indexes (op=index) use the format specified in {#mr-indexes}.</t>
</list></t>

</section>
<section anchor="mr-indexes"><name>Machine Readable Indexes</name>

<t>The machine readable index format is a list of newline-separated records.
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="Information Record Fields" anchor="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 keys 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 keys, and not the number of lines returned.
That is, it <bcp14>SHOULD</bcp14> match the number of "pub:" lines returned.</t>

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

<figure><artwork><![CDATA[
`pub`:keyid:algo:keylen:creationdate:expirationdate:flags
]]></artwork></figure>

<texttable title="Public Key Record Fields" anchor="public-key-record-fields">
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>keyid</c>
      <c>the fingerprint or the key ID</c>
      <c>algo</c>
      <c>the algorithm ID</c>
      <c>keylen</c>
      <c>the key length in bits</c>
      <c>creationdate</c>
      <c>creation date of the key</c>
      <c>expirationdate</c>
      <c>expiration date of the key</c>
      <c>flags</c>
      <c>letter codes to indicate details of the key</c>
</texttable>

<t>Either the 16-digit or 8-digit key IDs are acceptable, but obviously the fingerprint is best.
A keyserver should use the most specific of the key IDs that it has available.
Since it is not possible to calculate the key ID from a V3 key fingerprint, for V3 keys this should be either the 16-digit or 8-digit key ID only.</t>

<t>The algorithm ID is as specified in <xref target="RFC4880"></xref>, 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 key:</t>

<figure><artwork><![CDATA[
`uid`:uid string:creationdate:expirationdate:flags
]]></artwork></figure>

<texttable title="User ID Record Fields" anchor="user-id-record-fields">
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>uid string</c>
      <c>the user ID string</c>
      <c>creationdate</c>
      <c>creation date of the User ID</c>
      <c>expirationdate</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 HTTP % encoding for anything that isn't 7-bit safe as well as for the ":" character.
Any other characters <bcp14>MAY</bcp14> be HTTP encoded, as desired.</t>

<t>The information for the "creationdate", "expirationdate", and "flags" fields is taken from the User ID self-signature, if any, and applies to the user ID in question, not to the key 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 may 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="Record Flags" anchor="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 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 may be left off, if desired.
All dates are given in the number of seconds since midnight 1/1/1970 UTC.</t>

</section>
</section>
<section anchor="extended-status"><name>Extended Status Codes</name>

<t>As HKP is implemented over HTTP, when a status or error code needs to be returned, the most appropriate HTTP code should be used.</t>

<t>Occasionally there is a need to express a condition that cannot be expressed via the HTTP 1.0 status code list.
In these cases, an additional HTTP header may be added to the response.
This additional header is of the form "X-HKP-Status:" and is followed by one of the following status codes:</t>

<texttable title="Status Codes" anchor="status-codes">
      <ttcol align='left'>Status Code</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>xxx</c>
      <c>Submitted key was altered to match keyserver policy</c>
      <c>xxx</c>
      <c>Submitted key was rejected as per keyserver policy</c>
      <c>xxx</c>
      <c>The search returned too many responses</c>
</texttable>

</section>
<section anchor="locating-keyserver"><name>Locating a HKP Keyserver</name>

<t>Clients are usually manually configured with the address of a HKP keyserver.
Client implementors should be aware that it is reasonably common practice to use a single name in DNS that resolves to multiple address records.
When receiving a DNS response with multiple addresses, clients <bcp14>SHOULD</bcp14> try each address until a server is reached.
The order to try these addresses in is implementation defined.</t>

<t>A far more flexible scheme for listing multiple HKP keyservers in DNS is the use of DNS SRV records as specified in <xref target="RFC2782"></xref>.
DNS SRV allows for different priorities and weights to be applied to each HKP keyserver in the list, which allows an administrator much more control over how clients will contact the servers.
The SRV symbolic service name for HKP keyservers is "hkp".
For example, the SRV record for HKP keyservers in domain "example.com" would be "_hkp._tcp.example.com".</t>

<t>SRV records contain the port that the target server runs on, so SRV can also be used to automatically discover the proper port for contacting a HKP keyserver.</t>

<t>An additional use of SRV records is when a client needs to locate a specified key by email address.
For example, a client trying to locate a key for isabella@silvie.example.com could consult "_hkp._tcp.silvie.example.com".</t>

<t>HKP clients <bcp14>SHOULD</bcp14> support SRV records.</t>

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

<t>As described here, a keyserver is a searchable database of public keys accessed over the network.
While there may be security considerations arising from distributing keys 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 search results cannot be trusted by the client until the OpenPGP client actually retrieves and checks the key for itself.
This is important and must be stressed: without a specific reason to treat information otherwise, all search results must be regarded as untrustworthy and informational only.</t>

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

<t>This document assigns the DNS SRV symbolic name "hkp".</t>

</section>


  </middle>

  <back>


    <references title='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='RFC4880'>
  <front>
    <title>OpenPGP Message Format</title>
    <author fullname='J. Callas' initials='J.' surname='Callas'/>
    <author fullname='L. Donnerhacke' initials='L.' surname='Donnerhacke'/>
    <author fullname='H. Finney' initials='H.' surname='Finney'/>
    <author fullname='D. Shaw' initials='D.' surname='Shaw'/>
    <author fullname='R. Thayer' initials='R.' surname='Thayer'/>
    <date month='November' year='2007'/>
    <abstract>
      <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>OpenPGP software uses a combination of strong public-key and symmetric cryptography to provide security services for electronic communications and data storage. These services include confidentiality, key management, authentication, and digital signatures. This document specifies the message formats used in OpenPGP. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='4880'/>
  <seriesInfo name='DOI' value='10.17487/RFC4880'/>
</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='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>



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

<t>This document is a formalization and extension of the HKP originally implemented in the PKS keyserver by Marc Horowitz, which in turn was based on earlier work by Brian LaMacchia and Michael Graff.
Without their grounding, this document would not exist.</t>

<t>The authors would also 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.</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA8Vce3Pbxnb/H59iS01vrA5JSbbjOJq6jSz5ocYP1ZKTZjKZ
eAksSVyBAIsFKPH6+rv0s/ST9fzO2V0sSMqxbzu3ykxMAvs4e96v5Wg0Spq8
KcyxGrxdmvLixYV6eXV1oX40a2vqlanVRV01VVoVg0RPJrVZ0ciXP14MklQ3
ZlbV62OVl9Mqyaq01AtaJ6v1tBnNdFHo2dzUo4qWXc6Wo/n1cnR4mOTL+lg1
dWub+4eH3x/eT3RtNNZokpuqvp7VVbs8Vm5Scm3W9DQ7VudlY+rSNKMzLJ/Y
drLIrc2r8mq9pE3Pn109T1ambM1xopRbxJ9oQI8aHjb4mbbIy5l6gRF4vtB5
Qc/dfj/kppmOq3qGV7pO5/Rq3jRLe3xwgJF4lK/M2A87wIODSV3dWHPg1jjA
3Nosq2jujFCsJ+O0WhzoMqvNzSyrGnz7DLKwTEE4tk20UG/22C2bV59fxzY0
7XddVCWhYG1sssyP1a9E1KGyVd3UZmrp03qBD78lum3mVU1oHBEASk3bohDC
nqnLub7hh3R0XeZ/0Q0R4Fj9GzGGqW+q9Hqtrkw65yFGMJtZmvPDn7sRQML2
2ifqhYd9xwZEQ/Dj+Nn7eGmHix/cv7Iw/dUV2NlkeVPVSVnVC1plxXzx7vnp
0fcPv/UfHz965D4+fPz40H28/93j++7jg6NvaQC4O6yRjEYjpSe2qXXaJMnV
PLeKOL9dmLJRdmnSfJobq7Qi4cGHaqrSqiTGxEGsaiqVL5aF4eG6VF7kroO0
tRbs2cyNekkcWzfmtlFXtS7tNBJFdQ8yuj9OTmjJHgg59k6rjMBIGXnAkqJF
TAlhATxaLf0yzVzLlIJkMFuTEKqbPDMEhCGGaOo8JSibRqDHwKXOMxxiotPr
G11ntNViSftM8iJv1jS5mQN2a2jL3DY4Sjgvg2PHgsJFnmWFSZI9CHZdZW3K
W3zcy6Ovn5LkeVUro2k9ApyhWraTIk+BMJXW62VTzWq9nK9J4P6zzWtGPd5l
OcCftLyqXdvGLMa82EKXa5IBXRPLA8uLyjY4xaIqizW2yNxwNddWTYwp3YqO
PiOhLT4y9iwxGe3agWUZ4ykRd2JoJBQErUksRBNnxEMlBo2Jc8xdilaIuM0a
AZO0nrAJFhgDiacRj2H7MzPNy1y+f9yLOHCUdW8+JQwFDgcda9Xg9fvLq8FQ
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
yG33cxnj5H8Acqmf2lVNAAA=

-->

</rfc>

