<?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-03" category="info" 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="2023" month="December" day="30"/>

    <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.</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>By convention and history, HKP uses HTTP on TCP port 11371, and HTTPS on TCP port 443.
These are often distinguished from generic use of HTTP(S) by using the URI schemes "hkp" and "hkps".
For reasons of maximum compatibility with firewalls and filtering HTTP proxies, HKP is also often served over the standard HTTP port (TCP port 80).</t>

<t>(( andrewg : We may wish to officially recommend HKPS.
See issue #7.
))</t>

<t>See <xref target="locating-keyserver"/> for an automated way for clients to discover the correct port.</t>

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

<t>HKP defines two paths, namely "/pks/lookup" for lookups (see <xref target="key-lookups"/>) and "/pks/add" for submission (see <xref target="submitting-keys"/>).
A keyserver <bcp14>MAY</bcp14> support requests to other paths, but these are implementation dependent.
These alternative paths have historically been used to provide human-readable interfaces such as HTML forms, and functionality extensions such as <xref target="SKS"></xref>.</t>

<t>(( andrewg : SKS uses "/pks/hashquery" for bulk updates, and hockeypuck also implements "/pks/delete" and "/pks/replace".
See issue #15.
))</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 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>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 key 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>Key has been permanently deleted, e.g. due to blacklisting</c>
      <c>413 Content too large</c>
      <c>The search returned too many responses</c>
      <c>422 Unprocessable content</c>
      <c>Submitted key 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.
See issue #5.
))</t>

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

<t>Key lookups are done via an HTTP GET request.
Specifically, the abs_path (see <xref target="RFC1945"></xref>, section 3.2) is built up of the base path "/pks/lookup", followed by any variables.
Variables are passed using HTTP query strings as specified in <xref target="RFC1866"></xref>, section 8.2.2.</t>

<t>Most HKP lookups contain both the "op" (operation) and "search" variables.
The "op" variable determines what operation the keyserver will take, and the "search" variable determines which keys are operated on.
There may also be modifier variables, as specified in <xref target="modifier-variables"/> below.
The variables may be given in any order.
Keyservers <bcp14>MUST</bcp14> ignore any unknown variables.</t>

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

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

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

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

<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 <bcp14>MAY</bcp14> 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 <bcp14>SHOULD</bcp14> return an appropriate HTTP error code such as 404 ("Not Found").</t>

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

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

<t>The "index" operation requests a list of 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>

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

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

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

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

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

<t>The output of the "stats" operation is implementation-dependent, but may include diagnostic output, configuration state, or other metadata.
The "search" variable is ignored when supplied with "stats".</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" is used to search for a key by its digest rather than its key ID or fingerprint.</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 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 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 key ID <bcp14>MUST</bcp14> accept the 160-bit version 4 fingerprint and <bcp14>MAY</bcp14> accept 64-bit key IDs in the "search" variable.
A keyserver <bcp14>MUST NOT</bcp14> return results for 32-bit "short key ID" searches, as these do not provide sufficient collision resistance.</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 key ID or v4 fingerprint searches as it is not possible to calculate a key ID from a v3 fingerprint.</t>

<t>V3 keys 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>How a keyserver handles a 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 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 0xDEADBEEFDECAFBAD (64-bit key ID):</t>

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

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

<t>A keyserver <bcp14>MAY</bcp14> accept submissions via an HTTP POST request.
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 modifier variables, as specified in <xref target="modifier-variables"/> below.</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="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</name>

<t>The machine readable option instructs the server that a program (rather than a person) is making the request, so the output <bcp14>SHOULD</bcp14> be in machine-readable format.
See <xref target="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 <bcp14>MAY</bcp14> trim any noncompliant user IDs before accepting the key.
If this option was set, then such a key 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="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-".
Non-standard options <bcp14>MUST</bcp14> represent boolean values with a default value of "false".</t>

</section>
</section>
<section anchor="v-variable"><name>The "v" (Version) Variable</name>

<t>This variable identifies the version of machine readable output that the client supports.
Currently, only "v=1" is defined.</t>

<t>"v" is meaningful for machine readable output only.</t>

</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.
An implementation <bcp14>MAY</bcp14> decide to ignore this variable or set the default behaviour to "on".</t>

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

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

<t>This variable takes one argument: "on" or "off".
If present and on, it instructs the server to provide the <xref target="SKS"></xref> digest of each key in an "index" or "vindex" operation in the default human-readable form.
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.
An implementation <bcp14>MAY</bcp14> decide to ignore this variable or set the default behaviour to "on".</t>

<t>"hash" is meaningful for lookups only.</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.
An implementation <bcp14>MAY</bcp14> decide to ignore this variable or set the default behaviour to "on".</t>

<t>"exact" is meaningful for lookups only.</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="output-formats"><name>Output Formats</name>

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

<t>A client implementation <bcp14>SHOULD</bcp14> request machine readable output and <bcp14>SHOULD NOT</bcp14> attempt to parse human-readable output.</t>

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

<t>Clients requesting machine readable output:</t>

<t><list style="symbols">
  <t><bcp14>SHOULD</bcp14> supply "v=1" <xref target="v-variable"/> and "option=mr" <xref target="mr-option"/> in the request.</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 keys with unknown versions or algorithms.</t>
</list></t>

<t>Keyservers returning 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> set "Content-Type: application/pgp-keys" when returning keys ("op=get"), as specified in <xref target="RFC3156"></xref>, section 7.</t>
  <t><bcp14>MUST</bcp14> use the format specified in <xref target="mr-indexes"/> when returning indexes ("op=index").</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>

</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>:<algorithm>:<keylen>:<creationdate>:<expirationdate>:<flags>:<version>
]]></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>algorithm</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>
      <c>version</c>
      <c>the version of the key</c>
</texttable>

<t>A keyserver <bcp14>MAY</bcp14> return a 16-digit key ID, but <bcp14>SHOULD</bcp14> return a fingerprint if available.
Since it is not possible to calculate the key ID from a V3 key fingerprint, for V3 keys this <bcp14>SHOULD</bcp14> be the 16-digit key ID only.</t>

<t>The algorithm ID is as specified in <xref target="RFC4880"></xref>, section 9.1 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:<uidstring>:<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>uidstring</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 <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.
Client implementations <bcp14>MUST</bcp14> ignore unknown flags.</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 <bcp14>MAY</bcp14> be left off, if desired.
Client implementations <bcp14>MUST</bcp14> ignore unknown trailing fields.
All dates are given in the number of seconds since midnight 1/1/1970 UTC.</t>

</section>
</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 implementations 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" when used over plaintext HTTP, or "hkps" when using HTTPS.
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.
HKP clients <bcp14>SHOULD</bcp14> support SRV records.</t>

<section anchor="key-discovery"><name>Key discovery</name>

<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>(( andrewg : key discovery is the subject of ongoing debate, and may need to be left for another document.
See issue #1.
))</t>

</section>
</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 names "hkp" and "hkps", the URI schemes "hkp" and "hkps", and the HKP port 11371.</t>

<t>(( andrewg : if we assign hkps, we may be required to specify a dedicated port, even though nobody uses it.
See issue #14.
))</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='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="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='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'>



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


    </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:
H4sIAAAAAAAAA+086XLbOJr/+RRYpnbGnpLks3O4Or3t2E7iyWFv7HRXVyrV
DYmQxDFFaghSssaTd9ln2Sfb7wIIUrI7mZrd+bNJVSJRIPDhuy+g3+9HVVpl
5kjFF3OTX766VK+vry/VG7OyplyYUl2WRVWMiiyO9HBYmgWMfP3mMo5GujKT
olwdqTQfF1FSjHI9g3mSUo+r/kRnmZ5MTdkvYNr5ZN6f3sz7uwdROi+PVFXW
ttrf3X22ux/p0mico4qWRXkzKYt6fqTkpejGrOBpcqTO88qUuan6pzh9ZOvh
LLU2LfLr1RwWPT+7fhktTF6bo0gpmcTtKIZHFQ2Lf4Yl0nyiXuEIfD7TaQbP
Zb0fU1ONB0U5wZ90OZrCT9OqmtujnR0ciY/ShRm4YTv4YGdYFktrdmSOHXy3
NPMieHcCKNbDwaiY7eg8Kc1ykhQVfnsAWThNBji2VTBR6+2BTJsWD89jK3jt
V50VOaBgZWw0T4/UJyBqT9mirEoztvBpNcMPnyNdV9OiBDT2AQClxnWWMWFP
9XyaG3U11Uv6Bfav8/RvugIqHKk/A3eYclmMblbq2oymNMQwehML7/z4l2YE
YmJ9gWPanHrldrFhFaAmcubg7GM4v2DlR/mfZ4c/ZYGMbZK0KsooL8oZzLIg
Dvnw8mTv2eF37uPTx4/l4+HTp7vycf/J0335eLD3nRvwbG+PBpxcfLg6olUq
XU4MEMnRaGyq0XRg52Y0WE51BfAgpzwaFaXtz0WY+EUWvJOysFZdlOkkzdUH
Y4u6HBGaS+DUCIWrDfjT/e+e4cerN/cAAGwxrZnb7I3t3zhR7nxbpjdpCMfV
Kh9NyyJPLUoIoFldsQb4GQdG/X5f6aGtSj2qouh6mloFMl/PTF4p3Gw6To1V
WsHs+KEYq1GRg0gi4ayqCpXO5pmh4TpXTtl4cFRNy1ZTo16DrJaVua3Udalz
Ow6UkNpC7bQ9iI5hyhYIKa49KhIAY0TMglyhYBKTo5pAeLRy6Id3Nb+SgfZJ
VqB+1DJNDABhQBSqMh0BlFXF0OPAuU4T3MRQj26Wukxgqdkc1hmmWVqt4OVq
irBbA0umtsKt+P0SOHbAKJylSZKZKHqEKq0sknpES9w9SoOvX6LoZVEqo2E+
AJygmtfDLB0hwtSoXM2rYlKCQK5A1fy1TktCPf6WpAj+sKZZ7cpWZjagyWY6
X4H06xKEHbE8K2yFu5gVebbCJRIZrqbaqqExucwo9OkzbfEjYc+CUMGqDViW
MD4C4g4NjETVCHMC98KLE2DfHAcNgHPMfSaGibjOGh6TMB+zCU4wQCSeBDyG
y5+acZqn/P3uUcCB/aT55UtEUODm0LpYFb/7eHUd9/h/9f6CPn84+8+P5x/O
TvHz1evjt2/9h0hGXL2++Pj2tPnUvHly8e7d2ftTfhmeqtajKH53/Av8ggDH
F5fX5xfvj9/GyIRtngbTSDxn0Dyacl4axIC2UWLsCIgMX+CdFyeX//1fe4fq
7u7fUGvt7T378kW+PN17cghfllOT82pEa/4KPLCK9HwOhMJZQOkC7eZppTNg
EOAAOy2WuQI1bADRf/qEmPl8pL4fjuZ7hz/IA9xw66HDWesh4Wz9ydrLjMQN
jzYs47HZet7BdBve419a3x3eg4fIUODbEKaIRe8eodcCX/uoW4FtQO3gACBS
yJMFMim+0FMGPq6Aiij/ufokduazAkRnqBaBnLSCVUuTZUwUfGDKEgQF9BcK
MpId+NOCVcSR+Blst2UhhWmF+09rHodLgqsARkAlZp4VK2Ie0Bs48QiWzSsQ
aI0vF/wyvkJacW+w26NhXtisIsLaej4H34BHw6hB1B11/IvSSUICBbyz8m8U
AFLZWgVV39YWewEKfDVQkWAvKmZ25m8QVNB+NF4DVkB9AX7+uDBqUsA4FGbY
Dm/OJIQmVkLMz+DUWVbBBOn5HxOcc5lmGZmUApXiqAYjW5pZsWAzk8pGSTPe
gISBuClhNyQK7A0exG0lrvICHLIYtBtr7XkBgonzFXVFpAADM4TxQCTQpDoZ
RFcGprYWKPXou0G0vR1FP4P0MSU921z1HFd5fQy+GLCEIZsDLIAu91UMeHyx
CswqAQo7AU284ilgXsu4h1+vTy4VkWRv7+DJXs+z9VXrx8PDA1LKYGqQ8Yox
WD2yIrCvOrWkw8tipiYmB8s+wiWIt2CirattNVwFlvvjh3NlQe3PAIoYfU9W
cfDJxmyFwNxaIedM36azerbJko7BoC2Bq1inj9MMtJ9T+4jjWxAljzNQWIWA
TcwpiCUJQs8XrTW/iNvd8ht/urvNjCluI7Dmz2AWNcJgp4j4YgzORErcXRok
jWFpvWrR9QnTFZ/c3WUFeh/5pPGzQP+SDQRq1VUBnhwAuIRF8KETTmFRDzf4
iiVKCMKJZu4R+IV/rSEUUJe6mqJlK/l7f47fQTEhLsjCoY5ZFoqe9xQ61gB9
vDO/sTtZUdxA1EMr82ertiyBDdD25dGXL9tMNXoHxIBfaCIu9w49qfxm4T1w
ywKrjRrCKQUBl3bKCkIAHLLgCPN1pA0EHjAOXz2DIiPk5AzzBOCrwEcWAfD7
kFLkuZB8wVrAKwv066Y1uD999PU0yCeb07EeAbJsPZqihL2+fvcWNzqzLCjj
Oh+xbkOu9H5k88In8L8/dxkInrEMMvbAk5rCxssV43BYZzeqnicY1fEqU4iG
zGpej26YjT0C3AyJycDoxwFFILTMAPK4xYN7olyAU4jVrwCDtQXvCO0JWDGw
Xn1Lz76IBtKKv6MCbIyPyo1JnFIGd6OGmDtBGdcNYQP3EaxaWczLFDbE69Ic
pC4+Saz0GR2JOiONjFQB9Uye96QoEiAPBBPpiLwcXq2ZW2KKUQjdHCKldIjB
CqLT3GpEV09eRQVxuHuotuL3YDReFnWexNuq1MRuYC1y+HUXfn2hEydO8Pty
6h1dgAr0O0wNbw66IQ56sEj8yQTeM6JRQqtNQoLmX2eixpVNq9o5/wCT2KyG
3UnTy5Q4inmiEzeQRiI2J5Q5Bbrl+BBBLmFdnTktzENgZ0g2kTw1hkjZJNsE
JitslsNgC7DnE1FIYggBEWCSUYnSxOMiy4olvkvjj6Lo7oijx+dxyHGxesTM
1adxX6LgR9X+83fw2NGXneNeMUC658/f7//p/j/RPhD84o3a8OfvXqMCHkfA
9CaB0fvqGL7Mkb6d0Ves7OAHihq0ZV3EWgaUOtCi0XzzAkKiVXS4ewBsWA4h
4gMea893TXQiCNBgQcCrXaiJBIXvvFyEHP3eceWGSTjQamQ1R0mydVYBNxWs
Zhuujg73dtUr8CU3IQQjfh/6IQA6B14ADmUdlIBzO5gMVFJzUAJK6CZjNwGm
PcBIDONl+K0QZ/R+IHEMxaMA6hy42djocH9ffcxBnYBStqSkRzLhJuSX5i9g
HykYQlDXcf/d7h6hLXTTvxL3YrMA99F57n3cHqYXSDo2CMfB7S3MmKRktJ0s
tQwDzMQ5OnSC+8CW4G/iRhqFQrpBAwQLk0HYpWFypzNZt5AMoXnHgSPSqQgu
KWoIDS1vEnR15SJsh13RUOBz4U9VOjMD1m4IASmhuS4rdnRcKicRZUTKGmxh
RnHiWCHVuhqKJoZhAjVlQEjTizo3OsdFmeS5WW6EjlQc8R77MQlmJyFY0LPG
wfSOtepjpJUjQPA4Rc07w0VGqLEN0xHMwwjZl6WTw4VxY5dAJb/Al8HTLkrj
sIqQgB7oKZAU/OcA/gHORB2MczZAhowF21riRGplqk0u/yP1Fnwr3EM9V6e6
0mwidZACuXsUumBRhMLofDQ0FQkK7SLV6EcS9l6dXTsmhiXFViIF2Tzrof2V
ZJ+cNR+H9nzocjDY30bSDmvwrhEu4Q6ME1lrtJzGnih/8QaAjgsNdh/kFFj9
J/eRQJ1ra1uJGkUuEKXV8oml3IJjMh8kP338OADu6WAf/kbRO3QE0LV1qECd
oOGdYcH5Nszcx2rLy7C4rqxv4hDGazfYPQM2q1DLose8JObwiqDi5JCQBuNI
VUGMyBJBq3YXaE+WijVgI0/TUuxNUJQcY5C7N0RfB1OWsIyHtbeGobs7N6rv
R0FYMTRAEN6Zf0xzw7SccMO8DpCqKEEsB9GbToyfTnLkfBxR5zc5pnsChKEv
eb0Jw47awLPF3AMkObVi3uCkyQpTBqNBL20cvqK7zUmJFsYHazOhv4jhJ2ko
0ogu4bqBFDA9r7zy00rG0juiLZpE55QaRg04qsFyPWAReh3WkBnFdcUQr+sQ
B86rc9jQNLGPet7okHibMC4on5gqDsC4ewQP+v475qECIMQcuVCrWp9gwLTp
TuuDMkIRqaQOHY5FaAV/np6exbfsduC7Y56cA66Ek5kbyCOweOWP+Q32wawd
15kA6bxWSggTIr0jLioAoSK3neDrSozLIX+Skk6gW/b2BpILOb46OQf7Us6K
kj2J1hRu/GPSRC2YMbLFBFOJ6dPESRlFkEBs9qupfgHWBHwC9Jxu0a30/r8C
y1RDnEAJe7QHsCkrZQMsVKDkpmiQFTj1oJPBo79h3ovJsX1x9ur8PRbD1OXH
F2/PT9Sbs1/Ui7cXJ2/o51gssZgC2aBfLK2sycbhfGfvT79mNsqLKTDOLcCU
ywQH6ixp2AmFfF3hE1FY9sBjJQZ0dto7Z11pE0b/NmlbiwhDOUvBhbttSxo9
ulfWwpxGtWkGJ2prM3th0wq9ZiQz7XrN3BCPNLggPirIw1Xnpw+I1esgCdLb
DFzjgGvOiCifESHm3SRjQOcbDm6NBpA4DAFgXOoGU+EuCKVCVBIieCEgbMHO
hoXFzAt8325hfPGNKF/ch/O1HxAym86wbo96xuGDcIj1v8qpq3+QKuNvpYpu
gPTKZCkZfpftd1B6C+ciEFwPizIuzLdgvyEkwCIc/EjU+Wq6YDABYfoW/o96
Z2R3OL5ok4aGfT1lZNYuYYq6mteVczDXRrWqKfSk7xN/vBv0aVIIQWqQ6yTV
4LYgyDJvD7l1nE5qmQ2nN71GEc9MpVHtiQu45i7g6uQIJZwLwh1lqXMxBNoQ
d1OyUFuY2wOvpGpjbPqQpV5D2HTNTsuj1PoUpsTOXEdFfgP/GzQ4IAIDx1Z+
K2VbjhwJo0FPT7BomOaVgH9BQ/1ymBkkHDUAY+jBo2xamb7PwcF0Ofzq0unB
FFLvBabFujuHBxCNjtNbx6cNejAb3fC1uBbxbT8OvM01+gAX0qOupyl48eNE
Z6HTPUyrUkPEQVJqcrQHZN9ri0aXMUn24uOHtxIJ01DkMx9LOwVA2Bz7b0OD
QNuinkxJL9tiJupAYjqgW0nv5BvfEX8zX4UeJ3YnkXjTnqh4+H/qeTI+mUed
MW+mDmbautesbod5CXQEQK1AzJS7hITkThj5C52liVeBwp1vGNfoZPx0qF42
3KuuuJnAel7AnCK77ZK3bVFFBIRp1wvpKCxHfiqyqJNy2GS8CzoXu1SEkdFE
mlvwe0bpDJgmr2dDiaGaiXy0tfcYxREX3Xp82Af2kwW3e+pg3//kiq4HoWhu
k6o63F0bddgaxTQKIZLxGGIip4wwbrdYpMDqyKCteDi3hPG7DXgM8CR4IaLr
kfiouJ9d2sVGWIhCVP7lF1o7tg/YwpYq7LCZ5CyJPw72acIYeLx088auo4TD
Y86hJwUnS6XIY2uq17EDk4E9Z5cHHWudjxyb/XRwH28tDsbzfsBgiPG9/act
TLRoh4zUyb2BHwEuFek1YKh21gRYAanUByXl6LSBomGpYNFaTjoDwGfDxcDP
HpuSM7RIEcQENT46pm4swaJNP7dFRCTn9wiLUltBIQB3BRUTSYFMI9qtDRGg
FNDpUx3gyWcF/sjxTEL5cYijwEdhQy6Bk+9RktRmU7/jurdpqHWNmjWgEWra
kEavi2VYm1JgBhNKRJFORnUvdmLNyXBpRk7YUToG+bZpE/IOCyUSA4u0dXdH
jxqL9GVbFBs4G9OCzDYmYIIGCUpcltzdRfW1qlG5sBS4dfLEActJEnML2KvE
d6MsYj1XZ1z3QnRwXqwvlTBEyFXgLmQZ0yZw50PDSw0Z8VFETYBYIjza2cHx
A5kOOwiPqHcgyAT+B4P4nF7+QzF/Tu5qFL0yLKq7t6dnx6cvzs5enp6dHL98
cXza1YnfuiCsAT7RH2Td9fkxv3rla9GUU1XXhTpuZVe7xep1x0y0WVPntq18
6+XF1T8n4WpNRcGIL683acUmQg8SKQhEA8HG5Gl7oaeDA57ynsTqgbjlwyJZ
OR6nuWdYeZmEnpSKASQUpID7OffTbAQQ1E6k3JeTWc/FWEyuEKiYlGETt3ku
cXdc0rQus8Ct+5ps8l6oVmeS8M+xrYqwLnbc+kJTShVyWBoVInah6lET0fzT
U7jelxF+9DUMFy2gIgE0kDQ7hiC+CxIL2ERSYM3kW3zDXpAoOQCPztcr420s
rlD/Z9P54cuDoME1GzZyX+5xLKU8o+7bFcHSXmLgOjP/te6oeudo2tQ27h5t
IGEknSmLVgnExW70wgprKhBDOUK1UuskBnE7p879qq1wB8StyW/DPixxLvau
FVRiID6HbdTIe9ZAaOFiMWxF0Dbs8OoAR0UfM9WLFEPmcSfOwCYzTNX3XUYW
9wLTnWmKvWBB7zGjvhgWBfg/uRpnetJTXBTjvjj0kUbGLdB9MwbbKF0uokxp
dDwGGTOt6HtWQuz9TqMHa9QHSV9tq4u5BOAzjGYl9sYXZjLUZ7oEWc4e25BD
pQYL0jIp9UxthcE1ocFiASRFv/+m6baQZKU4EJLtkGQlhcYOiKYBiXv6B9I0
xq/0+aGVhjECy8XfiQGNnEnbXHdD9HaIo3wGOHpfCBOPpG7jUZTPGhQd27Cp
E7WasIUNa+6kXGxNPZJB2Mq19h5nmxxem8wFH13YlEijvckCpVqyumJcU4XV
/85qB3tXqE0Q+xCyFeu99kAHKRYkXA4aIo7cNQn5GvXSaQTdBcqrJ/EEJJC3
PkSk0yaoioGZLaIdXVzH0dj4By58AWNAiYE+Z9XkOxY8lN1IHn0PcMhmlBPI
i5z2meo8AGDIJWqGy/EdNdOfj1vIp4VMJZYhgCBApjAm4dTtLDQQm3Lo+/tq
a2NzBmbTid1QJkDwATgs4rQbBrnHoJWDYl4ME1DflH36+tTT7+Wd3hd5f21i
MjpNIsgpNdavgjQMFDSErKLKgAtCZSXZbxDDnzhwbJVNF/cr9xSznk3R1IWd
98t9I1Bi0sS4go4+qUuOD3vc5BEvnu8RpXzkEyGI66S7bylPRt5eEAi2LFjw
/GusmC4nVHXAY3h5jMSOi/E4JuZ2JOCzCz0KVzcq7qbV0znSYcTryxeULiIv
whdHyo0VhTawU+qzUwYi7lFFNhGr6u1sKnsuFBiKeneqAZyleaaxcT2Aqaey
9Ma06jTUurAGC+1zZk22QNv+QBh7nHd/QtWCyYWEgnop91etnVHTYuUiX2Jo
cQZqrpkASZBPWrRe5xjXn9HhEMyRt1gDH/yLeIL6dV3WHCjzLfzgkloORZ12
YiT3/7NMl2WY+F/NK5JlCZilk2T5X+eWsNKSC1m45Of8MbF6tqllrSU5G4rK
tsk0BJPF/zKCCIa/hiJshcPYh+10GPh8haVuoqLft9V+Ow9WidQFm6KX7Csj
YG3nmY9CIIqRVIlkGKlfjEveyAji4OOxWjrQQq2K0mHUayEybtfJY2cK12no
cCB1xq4NjTc4yOjTC2fJtMR7/pgIQYanZui8Aok3n5KR+v6GNXgacmBGEOzh
4eqVJKHpnUkNnJRRnxq3iMkBv2PnPnR25XsuOPq7zzNApDZn9ejo7GxO6SEI
F+za+YsgZFHdWM5RmEM5+vylaUwXQJAl7oHlKIr6YU+Ud3zu7gK/6wurTqbJ
cwwq7+6a0PGLU/g+4Qdz8rm4NOOUe9A85xqVgZ9HhvI0WH31vfI6aLsIWnGG
EDHcPDwxRV4kCb4/T07UKUrvTooSfpxhRiHo7WtOQzyEIV5U1AYlYqR7Nz6m
Xqz+CR3Jy/rHuI8+H08/Un+K13Nbn/As/OdBa9ZY2sH7fD8DHX/kQHQH7yXA
ncVcb2/Ape1uxZzvjbc3LCRH8YPc3pNmWTyYVk1dbL2Wfiv7ZCYp7dZZWH7g
tdmYbvO8oHwl8dR0SuB8f766eO8W+iRn8j+zVNL5N41a32dKSXcuU9s94NQP
DjhtFIVzAYxkwYF/T16DfnYwpWFHS26WKPH9Ji+Ep9nKRLpiwyP0TyhRj83e
cmBYy4EnyvfCGOJG9Gsw/UrcDYPatMZ88Q54L6nr/1gDtdtI54ux1Fqs/JUH
VL5DSKVkgD8cfS8y8MPR96OizqsfwlMo58GrH+hV9TI1WYJHUoJp+zxtf0y/
fYlozIPnUe4/fxK5GA1f7sRsHJt71Q6LRwSzLIWjubDsG4+cqoh8aE+NdlKj
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

-->

</rfc>

