<?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.0.3) -->


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

]>


<rfc ipr="trust200902" docName="draft-nwjw-openpgp-cert-d-00" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title>Shared OpenPGP Certificate Directory</title>

    <author initials="N." surname="Widdecke" fullname="Nora Widdecke">
      <organization>Sequoia PGP</organization>
      <address>
        <email>nora@sequoia-pgp.org</email>
      </address>
    </author>
    <author initials="J." surname="Winter" fullname="Justus Winter">
      <organization>Sequoia PGP</organization>
      <address>
        <email>justus@sequoia-pgp.org</email>
      </address>
    </author>

    <date year="2022" month="May" day="31"/>

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

    <abstract>


<t>This document defines a generic OpenPGP certificate store that can be shared between implementations.
It also defines a way to root trust, and a way to associate petnames with certificates.
Sharing certificates and trust decisions increases security by enabling more applications to take advantage of OpenPGP.
It also improves privacy by reducing the required certificate discoveries that go out to the network.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        The latest revision of this draft can be found at <eref target="https://sequoia-pgp.gitlab.io/pgp-cert-d"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-nwjw-openpgp-cert-d/"/>.
      </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/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://gitlab.com/sequoia-pgp/pgp-cert-d"/>.</t>
    </note>


  </front>

  <middle>


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

<t>Using OpenPGP for encryption requires a certificate for each communication partner.
Likewise, verification of an OpenPGP signature requires the signer's certificate.</t>

<t>An OpenPGP certificate must be discovered before it can be used.
There are a number of ways to do that, for example via <xref target="keys.openpgp.org"/> or <xref target="I-D.draft-koch-openpgp-webkey-service-12"/>.</t>

<t>Furthermore, an OpenPGP certificate evolves over time.
The certificate itself or one of its components may be revoked; a User ID may be added; certificate subkeys may be rotated, and meta-data stored on signatures updated.
Crucially, the security of OpenPGP depends on distributing each update to every involved party.
A certificate update may be passively collected (e.g. by consuming an <xref target="Autocrypt"/> header), or actively sought out using the key discovery options mentioned above.</t>

<t>However, actively reaching out to a network source leaks information about the expected communication partner or partners, so requests should be kept to a minimum.
Now, if a user has more than one application supporting OpenPGP, then every application has to discover certificates and updates, increasing the meta-data leakage.
The obvious solution here is to provide a way to share the certificates instead.
This is the purpose of this specification.</t>

<t>Looking at X.509, we can see that on most systems, there is a shared store of root certificates.
Now, this root certificate store solves a different problem:
X.509 certificates do not need to be discovered.
Instead, the shared store ensures that every application uses the same set of trust roots, which is also desirable for OpenPGP.
The important aspect we want to point out is that the store is shared across different applications and TLS implementations.
We will come back to the differences later in this text.</t>

<section anchor="requirements-language"><name>Requirements Language</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="terminology"><name>Terminology</name>

<t>This document uses the term "key" to refer exclusively to OpenPGP Transferable Secret Keys (see section 11.2 of <xref target="RFC4880"/>).</t>

<t>It uses the term "certificate", or "cert" for short, to refer to OpenPGP Transferable Public Key (see section 11.1 of <xref target="RFC4880"/>).</t>

</section>
<section anchor="related-work"><name>Related work</name>

<section anchor="openpgp-keyrings"><name>OpenPGP keyrings</name>

<t>The classic way of sharing data between OpenPGP implementations is via a keyring (see section 3.6 of <xref target="RFC4880"/>).
The only defined format is simply a sequence of certs, stored in binary (not ASCII-armored) format.
The advantage is that only OpenPGP data structures are used, and hence support for keyrings is widespread in OpenPGP implementations.</t>

<t>But, because an OpenPGP keyring does not have an index, this data structure scales badly:
Both lookups and updates take <spanx style="verb">O(N)</spanx> time, where <spanx style="verb">N</spanx> is the number of certs.
Worse, if the keyring contains a flooded certificate, it will negatively affect the performance of every operation, not just operations on the flooded cert itself.</t>

<t>Because of these limitations, an OpenPGP keyring as defined in <xref target="RFC4880"/> should really only be used as interchange format (i.e. for import and export), not for continuous sharing of certs between applications and implementations.</t>

</section>
<section anchor="X.509-cert-stores"><name>X.509 certificate stores</name>

<t>Looking at X.509, we can see that on most systems, there is a shared store of root certificates (see e.g. <xref target="FedoraSharedX.509CertStore"/>, <xref target="WindowsSharedX.509CertStore"/>, <xref target="macOSSharedX.509CertStore"/>).
Now, this root certificate store solves a slightly different problem:
It ensures that every application uses the same set of trust roots.</t>

<t>During the Transport Layer Security (<xref target="TLS"/>) handshake, the party that wants to authenticate itself (usually the server) presents the certificate, along with all intermediate certificates in the authentication chain up to a root certificate.
In this setting, we don't need to discover any certificates.
Instead, the store is used to check if the presented root certificate is in the set of trusted root certificates.
Additionally, the store may contain certificate revocations.</t>

<t>In both OpenPGP and X.509, trust must be rooted.
While the predominant trust model in X.509 uses a fixed set of vendor-specified trusted third parties, in OpenPGP the user is expected to provide this set.
See <xref target="req-trusted-introducers"/> for how this is modeled in this spec.</t>

<t>The main takeaway here is that to ensure a consistent behavior and user experience, the certificate store with all its information should be shared across all applications that use OpenPGP to authenticate communication partners.</t>

</section>
<section anchor="maildir"><name>Maildir</name>

<t>Maildir is an on-disk data structure that is designed to allow concurrent access by programs storing mails into and retrieving them (see <xref target="Maildir"/>).
It allows lock-free operations by relying on the atomicity of <spanx style="verb">rename(2)</spanx>.
It is supported by a wide range of mail servers, delivery agents, and mail user agents.</t>

<t>Maildir is mainly concerned with storing blobs and orchestrating concurrent access to the store.
It does not provide any indices.
For example, if you need efficient full text search, you will need to construct an index on top of the maildir, and keep it up to date (see <xref target="Notmuch"/>).</t>

<t>Maildir's design and success is a major inspiration for this spec.</t>

</section>
</section>
</section>
<section anchor="requirements"><name>Requirements</name>

<t>This specification is motivated by the following requirements:</t>

<t><list style="symbols">
  <t>The performance should not be affected by the number of certificates in the store, or by the size of individual certificates.</t>
  <t>We expect a read-heavy workload.  As such, readers should not have to synchronize with each other or with writers.</t>
  <t>Updates must be robust, i.e., they must not lose information in the event of concurrent updates.</t>
  <t>No extra data structures besides the file system and OpenPGP should be used to facilitate adoption by OpenPGP implementations.</t>
</list></t>

<t>Furthermore, the following requirements are required for secure and ergonomic use of OpenPGP.
Since any application using OpenPGP needs to behave consistently so as not to jeopardize security and ergonomics, this information needs to be shared well.
Hence the ideal place is the certificate store:</t>

<t><list style="symbols">
  <t>Address book-like mapping from petnames to certificates.</t>
  <t>Configuring a set of trusted introducers.</t>
</list></t>

<t>We also like to have some non-functional properties:</t>

<t><list style="symbols">
  <t>The data structure should be efficient to backup.</t>
  <t>The data structure should be efficient to synchronize between machines.</t>
</list></t>

<section anchor="addressing-of-certs"><name>Addressing of certs</name>

<t>Conceptually, the cert store is a name-value store.
We use cert fingerprints as names, as well as a set of special names.
This is accomplished by mapping names to paths, then relying on the filesystem for efficient lookups.</t>

</section>
<section anchor="req-trust-root"><name>Trust root</name>

<t>One certificate in the store is used to root trust.
It is used for mapping petnames to certs (see <xref target="req-petname-mapping"/>), and to designate trusted introducers (see <xref target="req-trusted-introducers"/>).</t>

</section>
<section anchor="req-petname-mapping"><name>Petname mapping</name>

<t>Petnames span a namespace that is secure and human-meaningful, but not distributed.
A common example of a petname scheme are address books in mobile phones that securely map human-meaningful names to numbers (which are secure and distributed, but not human-meaningful).
See <xref target="Zookos-Triangle"/> for a more in-depth discussion.</t>

<t>Using petnames, we can securely map human-meaningful names, like "Mom" or "juliett@example.org", to OpenPGP certificates.
In contrast to many other trust models, this is a concept that most users are already familiar with.
Therefore, it should be easy to train users, increasing the chance that they will use it in a secure manner.</t>

<t>The petname mapping can also be used to integrate into existing address book-like functionality provided by the platform.</t>

</section>
<section anchor="req-trusted-introducers"><name>Trusted introducers</name>

<t>To improve the ergonomics of public-key systems, users often delegate questions about the identity of a communications partner to some set of trusted third parties.</t>

<t>In X.509, these decisions are delegated to a fixed set of vendor-specified trusted third parties known as root certification authorities (see <xref target="X509-PKI"/>).
These trusted third parties then usually certify intermediate certification authorities, which in turn certify the binding between a peer's key and its identity.
The trust relation forms a polyforest (i.e., a directed graph with multiple roots).</t>

<t>Using this trust relation as a client during the <xref target="TLS"/> handshake is straightforward:
The server presents its certificate along with the chain of all intermediate certificates up to the root.
The client simply checks if all links in the chain are valid, and whether the terminal certificate is in its set of root certification authorities.
If so, the server's certificate is authenticated.</t>

<t>In contrast, the trust relation in OpenPGP forms a directed graph.
Any certificate can certify that a cert belongs to an identity.
Furthermore, the user is expected to provide not only the set of trust roots (the equivalent of X.509's root certification authorities), but also to identify acceptable intermediate authorities, which are known as "trusted introducers" in OpenPGP parlance.</t>

<t>Traditionally, OpenPGP implementations have used idiosyncratic mechanisms to configure both the trust roots and the trusted introducers.
That has the downside of being a proprietary mechanism that cannot easily be shared between implementations.
In contrast, this specification uses a single distinguished certificate as a trust root that delegates authority to the trusted introducers.</t>

</section>
</section>
<section anchor="implementation"><name>Implementation</name>

<t>This section describes in detail how to interact with a certificate store.
Note that we also provide a library that abstracts this away behind a simple-to-use API.</t>

<section anchor="default-stores-location"><name>Default store's location</name>

<t>If not explicitly requested otherwise, an application <bcp14>SHOULD</bcp14> use the default store.
The location is platform specific, see <xref target="platform-specifics"/> for details.</t>

<t>The default store may be overridden by the user by setting the environment variable <spanx style="verb">PGP_CERT_D</spanx>.</t>

<t>The application may explicitly choose to use a different location entirely.
Note, however, that this should be done only with good reasons, because it jeopardizes security, privacy, and ergonomics.</t>

<t>The location of the store <bcp14>MUST</bcp14> be a directory.
If it does not exist, it <bcp14>MAY</bcp14> be created on demand.</t>

</section>
<section anchor="mapping"><name>Mapping names to paths</name>

<t>Names are either fingerprints or special names.</t>

<section anchor="fingerprints"><name>Fingerprints</name>

<t>The store is indexed by fingerprint.
This is achieved by using the file system as a dictionary, storing each certificate using a path derived from the cert's fingerprint.</t>

<t>To compute the path to the certificate file:</t>

<t><list style="symbols">
  <t>compute the cert's fingerprint,</t>
  <t>format it using lowercase hex digits,</t>
  <t>take a two-digit prefix as sub-directory name,</t>
  <t>use the remaining digits as the filename.</t>
</list></t>

<t>For example, the certificate with the fingerprint <spanx style="verb">eb85bb5fa33a75e15e944e63f231550c4f47e38e</spanx> will be stored at <spanx style="verb">${BASEPATH}/eb/85bb5fa33a75e15e944e63f231550c4f47e38e</spanx>.</t>

</section>
<section anchor="special-names"><name>Special names</name>

<t>There is a set of special names that can be used to address certificates in the store.
The names map to fixed locations in the store.</t>

<texttable>
      <ttcol align='left'>Special name</ttcol>
      <ttcol align='left'>Location</ttcol>
      <c>trust-root</c>
      <c>trust-root</c>
</texttable>

</section>
</section>
<section anchor="locking"><name>Locking the store for writes</name>

<t>Before a cert can be inserted or updated, you <bcp14>MUST</bcp14> acquire an exclusive lock on the store.
Note that this lock only synchronizes writers:
Concurrent readers can continue to use the store, and will always see consistent certs.</t>

<t>The lock to the store is represented by a file located at <spanx style="verb">${BASEPATH}/writelock</spanx> which does not contain any data.
If that file does not exist, the store <bcp14>SHOULD</bcp14> be assumed unlocked and the file <bcp14>MUST</bcp14> be created before any locking operation.
The locking is achieved with file descriptors using platform specific means, see <xref target="platform-specifics"/> for details.</t>

</section>
<section anchor="how-to-insert-or-update-certs"><name>How to insert or update certs</name>

<t>The following procedure <bcp14>MUST</bcp14> be followed to ensure that concurrent readers are not disturbed:</t>

<t><list style="symbols">
  <t>First, acquire an exclusive lock.  See <xref target="locking"/>.</t>
  <t>Then, look up the cert you want to insert or update in the store.</t>
  <t>If the store contains a copy of the cert, merge it with your copy.</t>
  <t>Write the cert to a temporary file.
This file <bcp14>MUST</bcp14> be on the same filesystem if the platform requires this for atomic replacement in the next step (e.g. on POSIX, <spanx style="verb">rename(2)</spanx> fails if the rename crosses filesystem boundaries).</t>
  <t>Atomically replace the existing cert with the temporary file (i.e. using <spanx style="verb">rename(2)</spanx> on POSIX).</t>
  <t>Release the exclusive lock.</t>
</list></t>

<t>If a certificate is stored using a fingerprint as name, the name <bcp14>MUST</bcp14> match the certificate's fingerprint.</t>

</section>
<section anchor="rooting-trust"><name>Rooting trust</name>

<section anchor="trust-root"><name>Trust root</name>

<t>The trust root is an OpenPGP certificate that is stored under the special name <spanx style="verb">trust-root</spanx>.</t>

<t>The certificate:</t>

<t><list style="symbols">
  <t><bcp14>MUST</bcp14> be certification capable.</t>
  <t><bcp14>SHOULD</bcp14> have a User ID to increase compatibility.</t>
  <t><bcp14>SHOULD NOT</bcp14> have any subkeys.</t>
  <t><bcp14>SHOULD</bcp14> use direct key signatures or binding signatures that are marked as non-exportable.</t>
  <t><bcp14>MAY</bcp14> have a secret key, password protected or not.</t>
</list></t>

<t>If the certificate has a secret key, then any conforming OpenPGP implementation can use it to add a petname or a trusted introducer.
Otherwise, only an implementation with access to the secret key material can do so.</t>

</section>
<section anchor="petname-mapping"><name>Petname mapping</name>

<t>To add a petname to a certificate, create a User ID with the desired petname, and bind it to the target certificate using the trust root.
The binding signature <bcp14>SHOULD</bcp14> be marked as non-exportable.</t>

<t>To remove a petname from a certificate, revoke the User ID using the trust root.
The revocation signature <bcp14>SHOULD</bcp14> be marked as non-exportable.</t>

<t>To look up certificates by petname, iterate over the store returning all certificates that contain the petname as User ID bound by the trust root.</t>

<t>This lookup <bcp14>SHOULD</bcp14> be facilitated using an index data structure.
Currently, we do not define such an index structure, but we define an extension mechanism so that the index can be stored in the store (see <xref target="experimental"/>).</t>

</section>
<section anchor="trusted-introducers"><name>Trusted introducers</name>

<t>To mark a certificate as trusted introducer, create a direct key signature for the trusted introducer using the trust root, with a subpacket marking it as trust signature.
The trust signature <bcp14>MAY</bcp14> be scoped.
The signature <bcp14>SHOULD</bcp14> be marked as non-exportable.</t>

<t>To rescind a trust delegation, create a new direct key signature for the trusted introducer using the trust root, without a subpacket marking it as trust signature.
The signature <bcp14>SHOULD</bcp14> be marked as non-exportable.</t>

<t>The trust root can be used in conjunction with the default OpenPGP trust model to authenticate nicknames attached to certificates.
To look up certificates by nickname, explore the trust relation of certs in the store starting with the trust root.
Return all certificates that contain the desired nickname as User ID which are corroborated by a path from the root to the certificate.</t>

<t>This lookup should be facilitated using an index data structure.
Currently, we do not define such an index structure, but we define an extension mechanism so that the index can be stored in the store (see <xref target="experimental"/>).</t>

</section>
</section>
<section anchor="experimental"><name>Proprietary and experimental extensions</name>

<t>Files or directories in the toplevel directory starting with an underscore (<spanx style="verb">_</spanx>) may be freely used for proprietary and experimental extensions.
Please use a unique and descriptive prefix to minimize the chance of collisions, e.g. <spanx style="verb">_foopgp_subkey_map.sqlite</spanx>.</t>

<t>Unknown or unsupported extensions <bcp14>MUST</bcp14> be ignored.</t>

</section>
<section anchor="reserved-filenames"><name>Reserved filenames</name>

<t>Any files or directories in the toplevel directory other than</t>

<t><list style="symbols">
  <t>fingerprints mapped to paths (see <xref target="mapping"/>)</t>
  <t>known special names mapped to paths (see <xref target="special-names"/>)</t>
  <t>files starting with an underscore (<spanx style="verb">_</spanx>) (see <xref target="experimental"/>)</t>
</list></t>

<t>are reserved for future extensions and <bcp14>MUST</bcp14> be ignored.</t>

</section>
<section anchor="platform-specifics"><name>Platform-specific conventions</name>

<texttable>
      <ttcol align='left'>Platform</ttcol>
      <ttcol align='left'>Default store location</ttcol>
      <ttcol align='left'>Locking mechanism</ttcol>
      <c>POSIX</c>
      <c>$XDG_DATA_HOME/pgp.cert.d</c>
      <c><spanx style="verb">flock(2)</spanx> with LOCK_EX</c>
      <c>macOS</c>
      <c>$HOME/Library/Application Support/pgp.cert.d</c>
      <c><spanx style="verb">flock(2)</spanx> with LOCK_EX</c>
      <c>Windows</c>
      <c>{FOLDERID_RoamingAppData}/pgp.cert.d</c>
      <c>LockFile (fileapi.h)</c>
</texttable>

</section>
</section>
<section anchor="examples"><name>Examples</name>

<t>Importing the certificates described
<xref target="I-D.draft-bre-openpgp-samples-00"/> yields the following certificate store:</t>

<figure><artwork><![CDATA[
$ export PGP_CERT_D=$(mktemp -d)
$ pgp-cert-d import < alice.pgp
$ (cd $PGP_CERT_D ; find -type f)
./eb/85bb5fa33a75e15e944e63f231550c4f47e38e
$ pgp-cert-d import < bob.pgp
$ (cd $PGP_CERT_D ; find -type f)
./eb/85bb5fa33a75e15e944e63f231550c4f47e38e
./d1/a66e1a23b182c9980f788cfbfcc82a015e7330
]]></artwork></figure>

</section>
<section anchor="reference-implementation"><name>Reference implementation</name>

<t>We provide a reference implementation in the form of a library implemented in Rust (see <xref target="reference-implementation-api"/>).
This library also has a C API, so it is easy to use from other languages.</t>

<t>The library deals with the low-level mechanics of accessing the store, and computing the fingerprints of inserted certs.
It does not concern itself with emergent features like petname and authenticated nickname lookups.</t>

<section anchor="opening-the-store"><name>Opening the store</name>

<t>There are two ways to open a store.
The first one uses the default location, the second takes a path to the store's location.</t>

<figure><artwork><![CDATA[
function new() -> Store;
function open(Path) -> Store;
]]></artwork></figure>

</section>
<section anchor="certificate-lookup"><name>Certificate lookup</name>

<t>Looking up a certificate returns the certs data and a tag if the certificate exists in the store, or a special value indicating that the cert was not found.</t>

<t>The tag can be used in subsequent lookups to quickly check if the cert has actually changed.
This can be used to efficiently update index data structures.</t>

<t>Usually, this function returns a <xref target="impl-cert">CERT</xref>, but if <xref target="impl-name">NAME</xref> is a special name, it may return a <xref target="impl-key">KEY</xref>.</t>

<figure><artwork><![CDATA[
function Store::get(NAME) -> Maybe(TAG, CERT-or-KEY);
function Store::get_if_changed(TAG, NAME) -> Maybe(TAG, CERT-or-KEY);
]]></artwork></figure>

</section>
<section anchor="certificate-update"><name>Certificate update</name>

<t>Inserting or updating a cert requires the <xref target="impl-cert">CERT</xref> and a callback function.</t>

<t>The callback is invoked with the existing cert data (if any), and <bcp14>SHOULD</bcp14> merge the two copies of the certificate together.
The function <bcp14>MAY</bcp14> decide to omit (parts of) the existing data, but this should be done with great care as not to lose any vital information.</t>

<t>The insertion method returns the merged certificate data and the tag for the new state.</t>

<t>Locking is handled by the library.</t>

<figure><artwork><![CDATA[
function Store::insert(CERT, Merge) -> (TAG, CERT)
    where Merge is
        function(CERT, Maybe(CERT)) -> CERT;
]]></artwork></figure>

</section>
<section anchor="store-enumeration"><name>Store enumeration</name>

<t>The user can iterate over all certificates in the store.
The iterator returns tuples of fingerprints and tags, which can be used to efficiently update index data structures.</t>

<t>Note: The iterator does not return any special names like the trust root (see <xref target="special-names"/>).</t>

<figure><artwork><![CDATA[
function Store::iter() -> Iterator over (NAME, TAG, CERT);
]]></artwork></figure>

</section>
<section anchor="impl-types"><name>Input/Output Types</name>

<section anchor="impl-name"><name>NAME</name>

<t>A string representing a fingerprint or a special name (see <xref target="mapping"/>).</t>

</section>
<section anchor="impl-tag"><name>TAG</name>

<t>An opaque value corresponding to a cert in store.
If the cert is updated, its tag will change.
This can be used to quickly determine if an index data structure must be updated.</t>

</section>
<section anchor="impl-cert"><name>CERT</name>

<t>Exactly one OpenPGP certificate (section 11.1 of <xref target="RFC4880"/>), aka "Transferable Public Key".
The certificate <bcp14>MUST NOT</bcp14> be ASCII Armored.</t>

</section>
<section anchor="impl-key"><name>KEY</name>

<t>Exactly one OpenPGP Transferable Secret Key (section 11.2 of <xref target="RFC4880"/>).
The certificate <bcp14>MUST NOT</bcp14> be ASCII Armored.</t>

</section>
</section>
<section anchor="failure-modes"><name>Failure Modes</name>

<texttable>
      <ttcol align='left'>Mnemonic</ttcol>
      <ttcol align='left'>Meaning</ttcol>
      <c><spanx style="verb">OK</spanx></c>
      <c>Success</c>
      <c><spanx style="verb">BAD_NAME</spanx></c>
      <c>The name was neither a valid fingerprint, nor a known special name</c>
      <c><spanx style="verb">NOT_A_STORE</spanx></c>
      <c>The base directory cannot possibly contain a store</c>
      <c><spanx style="verb">BAD_DATA</spanx></c>
      <c>The data was not valid OpenPGP cert or key in binary format</c>
      <c><spanx style="verb">IO_ERROR</spanx></c>
      <c>Unspecified I/O error occurred</c>
</texttable>

</section>
</section>
<section anchor="guidance-for-implementers"><name>Guidance for Implementers</name>

<t>Despite the fact that this spec is designed with ease of implementation in mind, and we explicitly invite reimplementations, please consider using our reference implementation.</t>

<t>This is a list of implementation considerations that interoperating implementations need to follow:</t>

<t><list style="symbols">
  <t>The exclusive lock <bcp14>MUST</bcp14> be released in a timely manner.</t>
  <t>When exporting artifacts from the store, non-exportable signatures and certificate components <bcp14>MUST</bcp14> be omitted.</t>
</list></t>

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

<t>XXX</t>

</section>
<section anchor="document-considerations"><name>Document Considerations</name>

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

<t>This is a first draft that has not been published.</t>

</section>
<section anchor="future-work"><name>Future Work</name>

<t>OpenPGP requires efficient lookup by subkey fingerprint and keyids.
This is currently not provided by this spec, hence implementations need to build their own index on top of this store.
Future revisions may specify a way to do this natively.</t>

<t>Collecting usage information for TOFU-like trust models creates a write-heavy workload during normal usage, and requires more complex data structures that are not easily expressed using file-system operations and OpenPGP data structures.
Future revisions of this spec may define suitable mechanisms to keep a record of certificate uses.</t>

<t>This spec contains platform-specific conventions (see <xref target="platform-specifics"/>), like default store locations and locking mechanisms.
Porting to new platforms requires amending the spec.</t>

</section>
</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

</section>


  </middle>

  <back>


    <references title='Normative References'>





<reference anchor='RFC2119' target='https://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author fullname='S. Bradner' initials='S.' surname='Bradner'><organization/></author>
<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' target='https://www.rfc-editor.org/info/rfc8174'>
<front>
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
<author fullname='B. Leiba' initials='B.' surname='Leiba'><organization/></author>
<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>



<reference anchor='RFC4880' target='https://www.rfc-editor.org/info/rfc4880'>
<front>
<title>OpenPGP Message Format</title>
<author fullname='J. Callas' initials='J.' surname='Callas'><organization/></author>
<author fullname='L. Donnerhacke' initials='L.' surname='Donnerhacke'><organization/></author>
<author fullname='H. Finney' initials='H.' surname='Finney'><organization/></author>
<author fullname='D. Shaw' initials='D.' surname='Shaw'><organization/></author>
<author fullname='R. Thayer' initials='R.' surname='Thayer'><organization/></author>
<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>




    </references>

    <references title='Informative References'>




<reference anchor='I-D.draft-bre-openpgp-samples-00'>
   <front>
      <title>OpenPGP Example Keys and Certificates</title>
      <author fullname='Bjarni Rúnar Einarsson' initials='B. R.' surname='Einarsson'>
         <organization>Mailpile ehf</organization>
      </author>
      <author fullname='&quot;juga&quot;' initials='' surname='&quot;juga&quot;'>
         <organization>Independent</organization>
      </author>
      <author fullname='Daniel Kahn Gillmor' initials='D. K.' surname='Gillmor'>
         <organization>American Civil Liberties Union</organization>
      </author>
      <date day='15' month='October' year='2019'/>
      <abstract>
	 <t>   The OpenPGP development community benefits from sharing samples of
   signed or encrypted data.  This document facilitates such
   collaboration by defining a small set of OpenPGP certificates and
   keys for use when generating such samples.

	 </t>
      </abstract>
   </front>
   <seriesInfo name='Internet-Draft' value='draft-bre-openpgp-samples-00'/>
   <format target='https://www.ietf.org/archive/id/draft-bre-openpgp-samples-00.txt' type='TXT'/>
</reference>


<reference anchor="keys.openpgp.org" target="https://keys.openpgp.org/">
  <front>
    <title>A GDPR-conforming, validating keyserver</title>
    <author >
      <organization></organization>
    </author>
    <date year="2021" month="June" day="14"/>
  </front>
</reference>
<reference anchor="Autocrypt" target="https://autocrypt.org/">
  <front>
    <title>Convenient End-to-End Encryption for E-Mail</title>
    <author >
      <organization></organization>
    </author>
    <date year="2021" month="June" day="14"/>
  </front>
</reference>



<reference anchor='I-D.draft-koch-openpgp-webkey-service-12'>
   <front>
      <title>OpenPGP Web Key Directory</title>
      <author fullname='Werner Koch' initials='W.' surname='Koch'>
         <organization>GnuPG e.V.</organization>
      </author>
      <date day='17' month='May' year='2021'/>
      <abstract>
	 <t>   This specification describes a service to locate OpenPGP keys by mail
   address using a Web service and the HTTPS protocol.  It also provides
   a method for secure communication between the key owner and the mail
   provider to publish and revoke the public key.

	 </t>
      </abstract>
   </front>
   <seriesInfo name='Internet-Draft' value='draft-koch-openpgp-webkey-service-12'/>
   <format target='https://www.ietf.org/archive/id/draft-koch-openpgp-webkey-service-12.txt' type='TXT'/>
</reference>


<reference anchor="FedoraSharedX.509CertStore" target="https://fedoraproject.org/wiki/Features/SharedSystemCertificates">
  <front>
    <title>Shared System Certificates</title>
    <author >
      <organization></organization>
    </author>
    <date year="2021" month="June" day="14"/>
  </front>
</reference>
<reference anchor="WindowsSharedX.509CertStore" target="https://docs.microsoft.com/en-us/windows/win32/seccrypto/managing-certificates-with-certificate-stores">
  <front>
    <title>Managing Certificates with Certificate Stores</title>
    <author >
      <organization></organization>
    </author>
    <date year="2021" month="June" day="14"/>
  </front>
</reference>
<reference anchor="macOSSharedX.509CertStore" target="https://support.apple.com/en-us/HT202858">
  <front>
    <title>Lists of available trusted root certificates in macOS</title>
    <author >
      <organization></organization>
    </author>
    <date year="2018" month="December" day="08"/>
  </front>
</reference>
<reference anchor="Maildir" target="https://cr.yp.to/proto/maildir.html">
  <front>
    <title>Using maildir format</title>
    <author >
      <organization></organization>
    </author>
    <date year="2021" month="June" day="14"/>
  </front>
</reference>
<reference anchor="Notmuch" target="https://notmuchmail.org/">
  <front>
    <title>Notmuch -- Just an email system</title>
    <author >
      <organization></organization>
    </author>
    <date year="2021" month="June" day="14"/>
  </front>
</reference>
<reference anchor="reference-implementation-api" target="https://sequoia-pgp.gitlab.io/pgp-cert-d/pgp_cert_d/index.html">
  <front>
    <title>API documentation for the reference implementation</title>
    <author >
      <organization></organization>
    </author>
    <date year="2021" month="June" day="15"/>
  </front>
</reference>




<reference anchor='TLS' target='https://www.rfc-editor.org/info/rfc8446'>
<front>
<title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
<author fullname='E. Rescorla' initials='E.' surname='Rescorla'><organization/></author>
<date month='August' year='2018'/>
<abstract><t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol.  TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t><t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961.  This document also specifies new requirements for TLS 1.2 implementations.</t></abstract>
</front>
<seriesInfo name='RFC' value='8446'/>
<seriesInfo name='DOI' value='10.17487/RFC8446'/>
</reference>



<reference anchor='X509-PKI' target='https://www.rfc-editor.org/info/rfc5280'>
<front>
<title>Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
<author fullname='D. Cooper' initials='D.' surname='Cooper'><organization/></author>
<author fullname='S. Santesson' initials='S.' surname='Santesson'><organization/></author>
<author fullname='S. Farrell' initials='S.' surname='Farrell'><organization/></author>
<author fullname='S. Boeyen' initials='S.' surname='Boeyen'><organization/></author>
<author fullname='R. Housley' initials='R.' surname='Housley'><organization/></author>
<author fullname='W. Polk' initials='W.' surname='Polk'><organization/></author>
<date month='May' year='2008'/>
<abstract><t>This memo profiles the X.509 v3 certificate and X.509 v2 certificate revocation list (CRL) for use in the Internet.  An overview of this approach and model is provided as an introduction.  The X.509 v3 certificate format is described in detail, with additional information regarding the format and semantics of Internet name forms.  Standard certificate extensions are described and two Internet-specific extensions are defined.  A set of required certificate extensions is specified.  The X.509 v2 CRL format is described in detail along with standard and Internet-specific extensions.  An algorithm for X.509 certification path validation is described.  An ASN.1 module and examples are provided in the appendices.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='5280'/>
<seriesInfo name='DOI' value='10.17487/RFC5280'/>
</reference>


<reference anchor="Zookos-Triangle" target="https://web.archive.org/web/20011020191610/http://zooko.com/distnames.html">
  <front>
    <title>Names: Distributed, Secure, Human-Readable: Choose Two</title>
    <author >
      <organization></organization>
    </author>
    <date year="2021" month="June" day="17"/>
  </front>
</reference>


    </references>



  </back>

<!-- ##markdown-source:
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
DvZIW7HM2Cu7WpZWPje5Bnl3Ixhivlb2OTCVm/cZiyCcW/A+u3Uwku+tRI5S
8chuLZvn0lZt/QPTcbajAylRoeMoBfADWsj5MG8oaAObkuE6l92HrZ3hY8hR
BwkGmoJbDetV5ziHCxIPSlKLwSLaJL9Xda4SpZvLHUXPxd4ikMXVeWJsudKV
qyXalr6RhN7ujPuMrS9BtIrdcR9mqgqfWrE9uLOkvva6JZCNtUuhF4tDJulD
rzu7ISDeDexVT8Xrao3gBby+ThX548arLdfy0cBFi0jbLTTBu5pnwvis9jNo
+w9j8u2g1nGvCBPYo4//kHhUsQSY3HlYjqNxTbRfc27u/g/XjZTPH1z6H11X
1zyGXl3KDsSvNmkWaiyJOfnavaCKsl/Hl6fxjfh8uq4JTduirU7u8iOi7poP
OOpU2DNtvTi8r9TuMHlVazmo12KeQJbPWUd8hoJw6tnNJNQUbWg7LsqyGBel
9u4QxzV8JESCrytRjp5OaQNh/490ylkQFre19/6Ldlh43Z22H/d6QsD3ApAY
MMAFcNI28lAXZPBviS/b4E6XLwAsAPRIM2AR11fXOy6KirLNbNlWdyw+byGj
6ExgsoREmzz9rbHlB9ZzBGq2oSek6nEQFWU8QZac69OyTDKxAynfv76aFAVu
dxDYd0XoY1T9RkzCYZ23uWRX4EvlbbloQF+HSkk9FHwQkmSAM2GJj2OtczUj
zmFN/hiNbeUBLQZ4uBPPBGiyaSsOkFq+aathqIEspRtz2tCuG7ri1jLXT2/z
eo6NIqmtc6ShNU8aVqcBLbGbq/Q86zv6UCS3ciga/L0mEPAp3/535TpVv6tO
CqONZ6//x9EythWtQNs3YeisF0X71L/NnyPkxq6iDP7l+6Mfr44OLw+vXp6+
PsatJCPovVGyfq7XE7iR7HLyfr06ff7T1fF7zFWuhbG9cmevJBG0exhmXYTl
w4E+3qs964Je71+cvjo6Pj85ujovNNwQ6viItOzDumkLXV+w0wxO04t0NNsR
ukbHEgFu6305d2YPjPd0f+VTZUkU3p2w/hqphwe1TE2WVL2q0HWVkX//+9+j
L+0ZJ9Xmc77/cnt+A79fDZMd+qC9NMYdjfoT2cM0NiNcg/al2o4T9WXbXH0H
QU7UELd6qclONPr8wPOG0cbF+F8w1mg32d/VX39t9vWjx+P9Z4/ib799tjf5
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
7zNdc22DyOT/As8FfI+yYgAA

-->

</rfc>

