<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent">
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="std" docName="draft-spaghetti-sidrops-rpki-erik-protocol-01" ipr="trust200902" xml:lang="en" sortRefs="true" submissionType="IETF" consensus="true" symRefs="true" tocInclude="true" version="3">
  <front>
    <title abbrev="Erik Synchronization Protocol for RPKI">
      The Erik Synchronization Protocol for use with the Resource Public Key Infrastructure (RPKI)
    </title>
    <author fullname="Job Snijders" initials="J." surname="Snijders">
      <organization/>
      <address>
        <postal>
          <postalLine>The Netherlands</postalLine>
        </postal>
        <email>job@sobornost.net</email>
      </address>
    </author>
    <author fullname="Tim Bruijnzeels" initials="T." surname="Bruijnzeels">
      <organization>RIPE NCC</organization>
      <address>
        <postal>
          <postalLine>The Netherlands</postalLine>
        </postal>
        <email>tim@ripe.net</email>
      </address>
    </author>
    <author fullname="Tom Harrison" initials="T." surname="Harrison">
      <organization>APNIC</organization>
      <address>
        <postal>
          <country>AU</country>
        </postal>
        <email>tomh@apnic.net</email>
      </address>
    </author>
    <author fullname="Wataru Ohgai" initials="W." surname="Ohgai">
      <organization>JPNIC</organization>
      <address>
        <postal>
          <country>JP</country>
        </postal>
        <email>alt@nic.ad.jp</email>
      </address>
    </author>
    <date/>
    <area>Operations and Management Area (OPS)</area>
    <workgroup>SIDROPS</workgroup>
    <keyword>Data synchronization</keyword>
    <abstract>
      <t>
        This document specifies the Erik Synchronization Protocol for use with the Resource Public Key Infrastructure (RPKI).
        Erik Synchronization can be characterized as a data replication system using Merkle trees, a content-addressable naming scheme, concurrency control using monotonically increasing sequence numbers, and HTTP transport.
        Relying Parties can combine information retrieved via Erik Synchronization with other RPKI transport protocols.
        The protocol's design is intended to be efficient, fast, and easy to implement.
      </t>
    </abstract>
  </front>
  <middle>
    <section anchor="intro">
      <name>Introduction</name>
      <t>
        This document specifies the Erik Synchronization Protocol for use with the Resource Public Key Infrastructure (RPKI) <xref target="RFC6480"/>.
        Erik Synchronization can be characterized as a data replication system using Merkle Trees <xref target="M1987"/>, a content-addressable naming scheme <xref target="RFC6920"/>, concurrency control using monotonically increasing sequence numbers <xref target="RFC0677"/>, and HTTP transport <xref target="RFC9110"/>.
        Relying Parties can combine information retrieved via Erik Synchronization with other RPKI transport protocols (<xref target="RFC5781"/> and <xref target="RFC8182"/>).
        The protocol's design is intended to be efficient, fast, and easy to implement <xref target="RFC1925"/>.
      </t>
      <section anchor="reqs-lang">
        <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&nbsp;14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
      </section>
      <section anchor="Related">
        <name>Related Work</name>
        <t>
          The reader is assumed to be familiar with the terms and concepts described in
          "<xref target="RFC0677" format="title"/>" <xref target="RFC0677" format="default"/>,
          "<xref target="RFC6480" format="title"/>" <xref target="RFC6480" format="default"/>,
          "<xref target="RFC8182" format="title"/>" <xref target="RFC8182" format="default"/>,
          "<xref target="RFC9286" format="title"/>" <xref target="RFC9286" format="default"/>,
          and "<xref target="M1987" format="title"/>" <xref target="M1987" format="default"/>.
        </t>
      </section>
      <section anchor="glossary">
        <name>Glossary</name>
        <t>
          This section describes the terminology and abbreviations used in this document.
          Though the definitions might not be clear on a first read, later on the terms will be introduce with more detail.
        </t>
        <dl>
          <dt>Erik relay</dt>
          <dd>An intermediate between CA publication repositories and Relying Parties.</dd>
          <dt>FQDN</dt>
          <dd>The fully qualified domain name of a RPKI repository instance referenced in an end-entity certificate's Subject Information Access (SIA) extension's id-ad-signedObject accessDescription.</dd>
          <dt>Hash</dt>
          <dd>A message digest calculated for an object using the SHA-256 algorithm.</dd>
          <dt>Tree head</dt>
          <dd>Also known as "root hash", this is the hash of the current ErikIndex associated with a given FQDN.</dd>
          <dt>ErikIndex</dt>
          <dd>An ordered listing of Partition identifiers and associated ErikPartition objects' hashes.</dd>
          <dt>ErikPartition</dt>
          <dd>An ordered listing of the manifest objects' hashes, manifestNumbers, and their certificates' SIA extension values.</dd>
          <dt>Snapshot</dt>
          <dd>A compressed tarball archive containing all RPKI objects for a given FQDN.</dd>
        </dl>
      </section>
    </section>
    <section anchor="overview">
      <name>Informal Overview</name>
      <t>
        In this synchronization protocol Merkle trees are used to determine whether differences exist between client and relay.
        Merkle trees are hierarchical data structures: the hash value of each node is computed recursively by hashing the concatenated hash values of the node's children.
        The tree head hash represents the entire dataset.
        If the tree head hash is not the same between two replicas, the relay provides the client with hashes of smaller and smaller portions of the to-be-replicated dataset until the exact list of out-of-sync or missing objects is identified.
        Sequence numbers are then used to determine whether these differences are relevant enough for the client to fetch.
        All data is fetched using addresses derived from hashes (except for the hash tree heads).
        This approach reduces unnecessary data transfer between caches which contain mostly similar data.
      </t>
      <t>
        The client starts by querying an Erik relay for its current tree head for a given FQDN.
        If the tree head is different compared to the previous run (or compared to the tree head calculated from the locally cached objects), the client can fetch the ErikIndex object using the tree head hash.
        With the ErikIndex in hand, the client can determine which ErikParitions changed or are missing and fetch accordingly.
        The client then can compare the <em>manifestNumber</em> sequence number for each manifest listed in the ErikPartition, and proceed to fetch (purportedly) newer versions of manifests of interest.
        Whenever a relay offers a manifest with a lower sequence number the client can ignore it.
        With the information contained within manifests, clients can fetch addressed by content and store by name.
        The client now has sufficient information to proceed to fetch any missing Certificates, Signed objects, and CRLs.
      </t>
    </section>
    <section anchor="asn1">
      <name>Erik Synchronization Data Structure Definitions</name>
      <t>
        In this synchronization protocol the <em>signal layer</em> makes use of DER-encoded messages <xref target="X.690"/>.
      </t>
      <t>
        <em>Design note: DER encoding was selected for its canonical properities and because RPKI cache implementations already support ASN.1 encoding.</em>
      </t>
      <sourcecode type="asn.1" markers="false">

RpkiErikSynchronization-2025
  { iso(1) member-body(2) us(840) rsadsi(113549)
    pkcs(1) pkcs9(9) smime(16) mod(0)
    id-mod-rpkiErikSynchronization-2025(TBD) }

DEFINITIONS EXPLICIT TAGS ::=
BEGIN

IMPORTS
  CONTENT-TYPE, Digest, DigestAlgorithmIdentifier
  FROM CryptographicMessageSyntax-2010 -- in [RFC6268]
  { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
    pkcs-9(9) smime(16) modules(0) id-mod-cms-2009(58) }

  AccessDescription, KeyIdentifier
  FROM PKIX1Implicit88 -- in [RFC5280]
  { iso(1) identified-organization(3) dod(6) internet(1) security(5)
    mechanisms(5) pkix(7) id-mod(0) id-pkix1-implicit(19) }
;

ct-rpkiErikIndex CONTENT-TYPE ::=
  { TYPE ErikIndex IDENTIFIED BY id-ct-rpkiErikIndex }

id-ct-rpkiErikIndex OBJECT IDENTIFIER ::=
  { iso(1) identified-organization(3) dod(6) internet(1) private(4)
    enterprise(1) snijders(41948) erikindex(826) }

ErikIndex ::= SEQUENCE {
  version [0]      INTEGER DEFAULT 0,
  indexScope       IA5String,
  indexTime        GeneralizedTime,
  hashAlg          DigestAlgorithmIdentifier,
  partitionList    SEQUENCE SIZE (1..ub-Partitions) OF PartitionRef }

ub-Partitions INTEGER ::= 1024

PartitionRef ::= SEQUENCE {
  identifier       INTEGER (1..ub-Partitions),
  hash             Digest,
  size             INTEGER (100..MAX) }

ct-rpkiErikPartition CONTENT-TYPE ::=
  { TYPE ErikPartition IDENTIFIED BY id-ct-rpkiErikPartition }

id-ct-rpkiErikPartition OBJECT IDENTIFIER ::=
  { iso(1) identified-organization(3) dod(6) internet(1) private(4)
    enterprise(1) snijders(41948) erikpartition(827) }

ErikPartition ::= SEQUENCE {
  version [0]      INTEGER DEFAULT 0,
  partitionTime    GeneralizedTime,
  hashAlg          DigestAlgorithmIdentifier,
  manifestList     SEQUENCE SIZE (1..MAX) OF ManifestRef }

ManifestRef ::= SEQUENCE {
  hash             Digest,
  size             INTEGER (1000..MAX),
  aki              KeyIdentifier,
  manifestNumber   INTEGER (0..MAX),
  location         SEQUENCE SIZE (1..MAX) OF AccessDescription }
END
</sourcecode>
      <section anchor="asn1-index">
        <name>ErikIndex</name>
        <t>
          An ErikIndex represents all current manifest objects available under a given FQDN and thus the complete state of the repository as it is known to the relay.
        </t>
        <section title="The version field">
          <t>
            The version number of the ErikIndex object <bcp14>MUST</bcp14> be 0.
          </t>
        </section>
        <section title="The indexScope field">
          <t>
            The <tt>indexScope</tt> field contains the fully qualified domain name of the Signed Object location of the manifests referenced through this particular ErikIndex.
            The FQDN MUST be in the "preferred name syntax", as specified by <xref target="RFC1034" section="3.5"/> and modified by <xref target="RFC1123" section="2.1"/>.
          </t>
        </section>
        <section title="The indexTime field">
          <t>
            The <tt>indexTime</tt> is the most recent <tt>partitionTime</tt> value among the ErikPartitions referenced from this ErikIndex.
            The field's value roughly indicates when the ErikIndex was generated and can be used for troubleshooting and measurement purposes.
          </t>
          <t>
            For the purposes of this profile, <tt>GeneralizedTime</tt> values MUST be expressed UTC (Zulu) and MUST include seconds (i.e., times are YYYYMMDDHHMMSSZ), even where the number of seconds is zero.
            GeneralizedTime values MUST NOT include fractional seconds.
            See <xref target="RFC5280" section="4.1.2.5.2"/>.
          </t>
          <t>
            <em>
              Design note: using the most recent <tt>partitionTime</tt>, rather than the local system's notion of "now", helps reduce churn in distributed systems.
            </em>
          </t>
        </section>
        <section title="The hashAlg field">
          <t>
            This field contains the OID of the hash algorithm used to hash the ErikPartitions.
            The hash algorithm used MUST conform to the RPKI Algorithms and Key Size Profile specification <xref target="RFC7935"/>.
          </t>
        </section>
        <section title="The partitionList field">
          <t>
            This field is a sequence of <tt>PartitionRef</tt> instances.
            There is one <tt>PartitionRef</tt> for each current ErikPartition.
            Each <tt>PartitionRef</tt> is a 3-tuple consisting of the partition identifier, the hash of the partition object, and the size of the partition object.
          </t>
          <t>
            Information elements are unique with respect to one another and sorted in ascending order of the partition identifier.
          </t>
        </section>
      </section>
      <section anchor="asn1-partition">
        <name>ErikPartition</name>
        <t>
          An ErikPartition represents a subset of manifest objects available under a given FQDN.
          Each ErikPartition is an ordered listing of the manifest objects' hashes, manifestNumbers, and their end-entity certificates' SIA extension values.
        </t>
        <section title="The version field">
          <t>
            The version number of the ErikPartition object <bcp14>MUST</bcp14> be 0.
          </t>
        </section>
        <section title="The partitionTime field">
          <t>
            The <tt>partitionTime</tt> is the most recent <tt>thisUpdate</tt> value among the manifests contained within this ErikPartition.
            The field's value roughly indicates when the ErikPartition was generated and can be used for troubleshooting and measurement purposes.
          </t>
          <t>
            For the purposes of this profile, <tt>GeneralizedTime</tt> values MUST be expressed UTC (Zulu) and MUST include seconds (i.e., times are YYYYMMDDHHMMSSZ), even where the number of seconds is zero.
            GeneralizedTime values MUST NOT include fractional seconds.
            See <xref target="RFC5280" section="4.1.2.5.2"/>.
          </t>
          <t>
            <em>
              Design note: using the most recent manifest <tt>thisUpdate</tt> value, rather than the local system's notion of "now", helps reduce churn in distributed systems.
            </em>
          </t>
        </section>
        <section title="The hashAlg field">
          <t>
            This field contains the OID of the hash algorithm used to hash the manifest objects referenced in this ErikPartition.
            The hash algorithm used MUST conform to the RPKI Algorithms and Key Size Profile specification <xref target="RFC7935"/>.
          </t>
        </section>
        <section title="The manifestList field">
          <t>
            This field is a sequence of <tt>ManifestRef</tt> instances.
            There is one <tt>ManifestRef</tt> for each current manifest.
            A manifest is nominally current until the time specified in nextUpdate or until a manifest is issued with a greater manifestNumber, whichever comes first (see <xref target="RFC9286" section="4.2.1"/>).
          </t>
          <t>
            A <tt>ManifestRef</tt> is a 4-tuple consisting of the hash of the manifest object, the size of the manifest object, the manifest issuer's key identifier, the manifestNumber contained within the object, and a sequence of <tt>AccessDescription</tt> instances from the manifest's End-Entity certificate's Subject Information Access extension.
          </t>
          <t>
            Information elements are unique with respect to one another and sorted in ascending order of the hash.
          </t>
        </section>
      </section>
    </section>
    <section anchor="snapshots">
      <name>Snapshots and Differentials</name>
      <t>
        Clients should be able to bootstrap initial state by fetching a snapshot.
        A snapshot contains all RPKI objects a relay associated with a given FQDN as of the time of the snapshot's production.
        Snapshots do not contain ErikIndex or ErikPartition objects.
        Because snapshots are not produced in lockstep with updates to the merkle trees, clients MUST perform a tree comparison after fetching a snapshot.
      </t>
      <t>
        Note: Snapshots encoding is TBD.
      </t>
      <t>
        A compressed form (<xref target="RFC1951"/>, <xref target="RFC1952"/>) should be used because opportunistic compression in the transport layer (e.g. HTTP compressed content-encoding) is not universally available.
      </t>
      <t>
        Fetching differences between snapshots ('deltas') might be specified at a later time, or might be concluded to be unnecessary.
      </t>
      <t>
        <em>
          Design notes:
          While the <xref target="ustar"/> format is 'streamable', widely available, and an open standard, a notable downside is that <tt>.tar.gz</tt> objects likely wont be produced in a deterministic fashion across different implementations, warranting a choice for a bespoke format.
        </em>
      </t>
    </section>
    <section anchor="rp">
      <name>Client-side Processing</name>
      <t>
        A client can decide whether or not to fetch ErikIndex and ErikPartition objects, by comparing the hash to previous fetches.
      </t>
      <t>
        A client can decide whether or not to fetch a given manifest object, by comparing the <tt>manifestNumber</tt> with what's locally cached and what's offered by the remote relay.
      </t>
      <t>
        A client can compute which products listed in the manifest's fileList need to be fetched from the relay.
      </t>
      <t>
        As there is no concept of 'sessions' (like in RRDP), clients can interchangably use different Erik relay.
        When one Erik relay generates a HTTP error, the client can try fetching the requested object from another Erik relay.
      </t>
    </section>
    <section anchor="querying">
      <name>Querying an Erik Relay</name>
      <section title="Fetching objects by hash">
        <t>
          This specification uses "Named Information" identifiers mapped to <tt>.well-known</tt> HTTP/HTTPS URLs for object retrieval, as described in <xref target="RFC6920"/>.
        </t>
        <t>
          For example, issuance <tt>#54</tt> of <tt>ripe-ncc-ta.mft</tt> has the following SHA256 digest: <tt>c2d0427bc5a32c42eea1ab5663d592b1fc29c7d4ef16ab0b5e1d631d039dcc21</tt>.
        </t>
        <t>
          To fetch the aforementioned object from an relay hosted at <tt>relay.example.net</tt>, a client would access the following HTTP URL:
          <tt>https://relay.example.net/.well-known/ni/sha-256/wtBCe8WjLELuoatWY9WSsfwpx9TvFqsLXh1jHQOdzCE</tt>
        </t>
      </section>
      <section title="Fetching ErikIndex objects">
        <t>
          The URIs to fetch ErikIndex objects can be constructed using the following Well-Known URI template with the <tt>erik</tt> keyword as suffix and the <tt>IndexScope</tt> as parameter: <tt>https://{relay_host}/.well-known/erik/{indexScope}</tt>.
        </t>
        <t>
          For example, the URI to fetch an ErikIndex for the <tt>rpki.ripe.net</tt> <tt>indexScope</tt> from a relay at <tt>relay.example.net</tt> would be: <tt>https://relay.example.net/.well-known/erik/rpki.ripe.net</tt>.
        </t>
      </section>
    </section>
    <section anchor="error">
      <name>Transport Error Detection and Handling</name>
      <t>
        The client MUST calculate the hash of fetched objects and verify it is the same as the expected hash (which is embedded in the name through which the object was retrieved).
        If there is a hash mismatch, the client may try fetching the object from a different Erik relay or treat this as a <em>failed fetch</em> (see <xref target="RFC9286" section="6.6"/>).
      </t>
    </section>
    <section anchor="relay">
      <name>Setting Up an Erik Relay</name>
      <t>
        Erik relays can be operated by third parties, without permission from or coordination with publication point operators or CAs.
      </t>
      <t>
        Relays generate ErikIndexes and ErikPartitions derived from their current validation state, the client then cherry-picks which objects (if any) it wishes to fetch.
        Relays fetch fresh data from other relays or from CA-designated publication points.
      </t>
      <t>
        <em>
          Design notes: a decision must be made a deterministic "manifest-to-partition" assignment scheme.
          Job's proof-of-concept relay <!-- (see <xref target="running_code"/>) --> uses the first few octets of the SHA-256 hash of the manifest for produce as a stable assignment strategy.
          Other strategies could be to assign manifests to ErikPartitions based on the "hour-of-day" of the CMS signing timestamp or the Authority Key Identifier.
        </em>
      </t>
    </section>
    <section anchor="comparison">
      <name>Comparison with other RPKI transport protocols</name>
      <t>
        Ignoring obvious "on the wire format" differences between Erik, Rsync, and RRDP; there are a number of key design differences between the protocols.
        Rsync and RRDP can be described as "general purpose" synchronisation protocols, while the Erik protocol design is RPKI-specific.
        In the Erik protocol, manifest objects (which RPs require for validation anyway) are an integral part of the signaling layer.
      </t>
      <section>
        <name>Comparison with Rsync</name>
        <t>
          In Rsync, the server and the client construct and transfer a full listing of all available objects, and then transfer objects as necessary.
          In effect, this allows clients to 'jump' to the latest repository state, regardless of the state of the local cache.
        </t>
        <t>
          A major downside of Rsync is that the list of files itself can become a burden to transfer.
          As of June 2025, in order to merely establish whether a client is synchronized or not with the RIPE NCC repository at <tt>rpki.ripe.net</tt>, as much as 5.8 megabytes of data are exchanged without exchanging any RPKI data.
        </t>
        <t>
          When synchronizing once an hour, Rsync generally consumes less network traffic than RRDP.
        </t>
      </section>
      <section>
        <name>Comparison with RRDP</name>
        <t>
          The key concept in RRDP is that the client downloads a "journal", containing all add/update/delete operations and replays this journal to arrive at the current repository state.
        </t>
        <t>
          A major downside of RRDP is that (depending on the RRDP polling interval) clients end up downloading data which has become outdated.
          Imagine a hypothetical CA which issues and revokes a ROA every 10 minutes and a client that synchronizes every 60 minutes; in effect the client must fetch 5 outdated states, wasting bandwidth.
        </t>
        <t>
          When synchronizing every 15 minutes, RRDP generally consumes less network traffic than Rsync.
        </t>
        <section>
          <name>Garbage Collection</name>
          <t>
            In contrast to RRDP, the Erik protocol has no concept of server-specific "stateful" sessions that persist across polling attempts.
            This obviates the need for <tt>withdraw</tt> instructions as part of the protocol exchange: clients can simply delete objects that are no longer referenced from their current validation state and refetch them later on if needed.
          </t>
        </section>
      </section>
    </section>
    <section anchor="openquestions" removeInRFC="true">
      <name>Open Questions</name>
      <ul>
        <li>Should the hash tree heads contain a <tt>previous hash</tt> field so clients can observe gaps in chains?</li>
        <li>Should ErikPartitions also list the filesize of the referenced manifests? Perhaps there are optimisations possible when the filesizes are communicated to clients?</li>
        <li>Which of the possible deterministic manifest-to-partition assignment strategies yield the best results?</li>
        <li>What is the best archive format for Snapshots? The ustar/gzip combo might not easily yield deterministic results across different implementations.</li>
        <li>Is the concept of Differentials/Deltas needed in Erik Synchronization?</li>
        <li>What will be the upperbound for the number of partitions? (<tt>ub-Partitions</tt>)</li>
      </ul>
    </section>
    <section anchor="operational">
      <name>Operational Considerations</name>
      <t>
        As of July 2025, the global Internet's RPKI churn rate appears to be 2 new objects per second.
        The ecosystem is estimated to be composed of ~ 5000 RPKI cache instances and ~ 50 repository servers.
        Assuming 10 minute fetching intervals and 150 metadata requests per synchronization run (for exchange of Merkle tree data), an Erik relay serving all the Internet's RPKI cache instances would probably need to be able to sustain serving an average of at least 11,000 HTTP requests per second.
        This order of magnitude in terms of scaling requirements can easily be handled by a single commodity server.
      </t>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>
        This document makes no changes to RPKI certificate validation procedures.
      </t>
      <t>
        See <xref target="RFC8182" section="5"/> for applicable security considerations.
      </t>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <section title="S/MIME Module Identifier">
        <t>
          The IANA is requested to add an item to the "SMI Security for S/MIME Module Identifier" registry as follows:
        </t>
        <artwork>
<![CDATA[
Decimal  Description                           References
--------------------------------------------------------------
    TDB  id-mod-rpkiErikSynchronization-2025   [this-draft]
]]>
        </artwork>
      </section>
      <section title="OIDs for Content Types">
        <t>
          For the current proof-of-concept phase the <tt>id-ct-rpkiErikIndex</tt> and <tt>id-ct-rpkiErikPartition</tt> OIDs were assigned from a PEN arc.
          This section will be updated once it is clear which IANA-managed registries would be best suited for OID assignment for these object identifiers.
        </t>
      </section>
      <section title="Well-Known URI">
        <t>
          An URI Suffix in the Well-Known URIs registry specific to Erik synchronization will be requested.
        </t>
        <t>
          The proposed suffix is <tt>erik</tt>.
        </t>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC1034" target="https://www.rfc-editor.org/info/rfc1034" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1034.xml">
          <front>
            <title>Domain names - concepts and facilities</title>
            <author fullname="P. Mockapetris" initials="P." surname="Mockapetris"/>
            <date month="November" year="1987"/>
            <abstract>
              <t>This RFC is the revised basic definition of The Domain Name System. It obsoletes RFC-882. This memo describes the domain style names and their used for host address look up and electronic mail forwarding. It discusses the clients and servers in the domain name system and the protocol used between them.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="13"/>
          <seriesInfo name="RFC" value="1034"/>
          <seriesInfo name="DOI" value="10.17487/RFC1034"/>
        </reference>
        <reference anchor="RFC1123" target="https://www.rfc-editor.org/info/rfc1123" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1123.xml">
          <front>
            <title>Requirements for Internet Hosts - Application and Support</title>
            <author fullname="R. Braden" initials="R." role="editor" surname="Braden"/>
            <date month="October" year="1989"/>
            <abstract>
              <t>This RFC is an official specification for the Internet community. It incorporates by reference, amends, corrects, and supplements the primary protocol standards documents relating to hosts. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="3"/>
          <seriesInfo name="RFC" value="1123"/>
          <seriesInfo name="DOI" value="10.17487/RFC1123"/>
        </reference>
        <reference anchor="RFC1951" target="https://www.rfc-editor.org/info/rfc1951" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1951.xml">
          <front>
            <title>DEFLATE Compressed Data Format Specification version 1.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch"/>
            <date month="May" year="1996"/>
            <abstract>
              <t>This specification defines a lossless compressed data format that compresses data using a combination of the LZ77 algorithm and Huffman coding, with efficiency comparable to the best currently available general-purpose compression methods. 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="1951"/>
          <seriesInfo name="DOI" value="10.17487/RFC1951"/>
        </reference>
        <reference anchor="RFC1952" target="https://www.rfc-editor.org/info/rfc1952" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1952.xml">
          <front>
            <title>GZIP file format specification version 4.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch"/>
            <date month="May" year="1996"/>
            <abstract>
              <t>This specification defines a lossless compressed data format that is compatible with the widely used GZIP utility. 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="1952"/>
          <seriesInfo name="DOI" value="10.17487/RFC1952"/>
        </reference>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
          <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="RFC5280" target="https://www.rfc-editor.org/info/rfc5280" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5280.xml">
          <front>
            <title>Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
            <author fullname="D. Cooper" initials="D." surname="Cooper"/>
            <author fullname="S. Santesson" initials="S." surname="Santesson"/>
            <author fullname="S. Farrell" initials="S." surname="Farrell"/>
            <author fullname="S. Boeyen" initials="S." surname="Boeyen"/>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <author fullname="W. Polk" initials="W." surname="Polk"/>
            <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="RFC6920" target="https://www.rfc-editor.org/info/rfc6920" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6920.xml">
          <front>
            <title>Naming Things with Hashes</title>
            <author fullname="S. Farrell" initials="S." surname="Farrell"/>
            <author fullname="D. Kutscher" initials="D." surname="Kutscher"/>
            <author fullname="C. Dannewitz" initials="C." surname="Dannewitz"/>
            <author fullname="B. Ohlman" initials="B." surname="Ohlman"/>
            <author fullname="A. Keranen" initials="A." surname="Keranen"/>
            <author fullname="P. Hallam-Baker" initials="P." surname="Hallam-Baker"/>
            <date month="April" year="2013"/>
            <abstract>
              <t>This document defines a set of ways to identify a thing (a digital object in this case) using the output from a hash function. It specifies a new URI scheme for this purpose, a way to map these to HTTP URLs, and binary and human-speakable formats for these names. The various formats are designed to support, but not require, a strong link to the referenced object, such that the referenced object may be authenticated to the same degree as the reference to it. The reason for this work is to standardise current uses of hash outputs in URLs and to support new information-centric applications and other uses of hash outputs in protocols.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6920"/>
          <seriesInfo name="DOI" value="10.17487/RFC6920"/>
        </reference>
        <reference anchor="RFC7935" target="https://www.rfc-editor.org/info/rfc7935" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7935.xml">
          <front>
            <title>The Profile for Algorithms and Key Sizes for Use in the Resource Public Key Infrastructure</title>
            <author fullname="G. Huston" initials="G." surname="Huston"/>
            <author fullname="G. Michaelson" initials="G." role="editor" surname="Michaelson"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>This document specifies the algorithms, algorithms' parameters, asymmetric key formats, asymmetric key size, and signature format for the Resource Public Key Infrastructure (RPKI) subscribers that generate digital signatures on certificates, Certificate Revocation Lists (CRLs), Cryptographic Message Syntax (CMS) signed objects and certification requests as well as for the relying parties (RPs) that verify these digital signatures.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7935"/>
          <seriesInfo name="DOI" value="10.17487/RFC7935"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
          <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>
        <reference anchor="RFC9110" target="https://www.rfc-editor.org/info/rfc9110" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9110.xml">
          <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="RFC9286" target="https://www.rfc-editor.org/info/rfc9286" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9286.xml">
          <front>
            <title>Manifests for the Resource Public Key Infrastructure (RPKI)</title>
            <author fullname="R. Austein" initials="R." surname="Austein"/>
            <author fullname="G. Huston" initials="G." surname="Huston"/>
            <author fullname="S. Kent" initials="S." surname="Kent"/>
            <author fullname="M. Lepinski" initials="M." surname="Lepinski"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This document defines a "manifest" for use in the Resource Public Key Infrastructure (RPKI). A manifest is a signed object (file) that contains a listing of all the signed objects (files) in the repository publication point (directory) associated with an authority responsible for publishing in the repository. For each certificate, Certificate Revocation List (CRL), or other type of signed objects issued by the authority that are published at this repository publication point, the manifest contains both the name of the file containing the object and a hash of the file content. Manifests are intended to enable a relying party (RP) to detect certain forms of attacks against a repository. Specifically, if an RP checks a manifest's contents against the signed objects retrieved from a repository publication point, then the RP can detect replay attacks, and unauthorized in-flight modification or deletion of signed objects. This document obsoletes RFC 6486.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9286"/>
          <seriesInfo name="DOI" value="10.17487/RFC9286"/>
        </reference>
        <reference anchor="X.690" target="https://www.itu.int/rec/T-REC-X.690-202102-I/en" quoteTitle="true" derivedAnchor="X.690">
          <front>
            <title>Information technology - ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)</title>
            <author>
              <organization showOnFrontPage="true">ITU-T</organization>
            </author>
            <date month="February" year="2021"/>
          </front>
          <seriesInfo name="ITU-T Recommendation" value="X.690"/>
          <seriesInfo name="ISO/IEC" value="8825-1:2021"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="M1987" quoteTitle="true" target="https://doi.org/10.1007/3-540-48184-2_32" derivedAnchor="M1987">
          <front>
            <title>A Digital Signature Based on a Conventional Encryption Function</title>
            <author fullname="R. Merkle" initials="R." surname="Merkle"/>
            <date year="1988"/>
          </front>
          <refcontent>Advances in Cryptology -- CRYPTO '87 Proceedings</refcontent>
          <refcontent>Lecture Notes in Computer Science, Vol. 293</refcontent>
          <seriesInfo name="DOI" value="10.1007/3-540-48184-2_32"/>
        </reference>
        <reference anchor="ustar" target="https://pubs.opengroup.org/onlinepubs/9799919799/utilities/pax.html#tag_20_94_13_06">
          <front>
            <title>ustar Interchange Format</title>
            <author>
              <organization>IEEE/Open Group</organization>
            </author>
            <date year="2024" month="June"/>
          </front>
          <seriesInfo name="IEEE Std" value="1003.1-2024"/>
          <seriesInfo name="DOI" value="10.1109/IEEESTD.2018.8423794"/>
        </reference>
        <reference anchor="RFC0677" target="https://www.rfc-editor.org/info/rfc677" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.0677.xml">
          <front>
            <title>Maintenance of duplicate databases</title>
            <author fullname="P.R. Johnson" initials="P.R." surname="Johnson"/>
            <author fullname="R. Thomas" initials="R." surname="Thomas"/>
            <date month="January" year="1975"/>
          </front>
          <seriesInfo name="RFC" value="677"/>
          <seriesInfo name="DOI" value="10.17487/RFC0677"/>
        </reference>
        <reference anchor="RFC1925" target="https://www.rfc-editor.org/info/rfc1925" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1925.xml">
          <front>
            <title>The Twelve Networking Truths</title>
            <author fullname="R. Callon" initials="R." surname="Callon"/>
            <date month="April" year="1996"/>
            <abstract>
              <t>This memo documents the fundamental truths of networking for the Internet community. This memo does not specify a standard, except in the sense that all standards must implicitly follow the fundamental truths. 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="1925"/>
          <seriesInfo name="DOI" value="10.17487/RFC1925"/>
        </reference>
        <reference anchor="RFC5781" target="https://www.rfc-editor.org/info/rfc5781" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5781.xml">
          <front>
            <title>The rsync URI Scheme</title>
            <author fullname="S. Weiler" initials="S." surname="Weiler"/>
            <author fullname="D. Ward" initials="D." surname="Ward"/>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <date month="February" year="2010"/>
            <abstract>
              <t>This document specifies the rsync Uniform Resource Identifier (URI) scheme. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5781"/>
          <seriesInfo name="DOI" value="10.17487/RFC5781"/>
        </reference>
        <reference anchor="RFC6480" target="https://www.rfc-editor.org/info/rfc6480" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6480.xml">
          <front>
            <title>An Infrastructure to Support Secure Internet Routing</title>
            <author fullname="M. Lepinski" initials="M." surname="Lepinski"/>
            <author fullname="S. Kent" initials="S." surname="Kent"/>
            <date month="February" year="2012"/>
            <abstract>
              <t>This document describes an architecture for an infrastructure to support improved security of Internet routing. The foundation of this architecture is a Resource Public Key Infrastructure (RPKI) that represents the allocation hierarchy of IP address space and Autonomous System (AS) numbers; and a distributed repository system for storing and disseminating the data objects that comprise the RPKI, as well as other signed objects necessary for improved routing security. As an initial application of this architecture, the document describes how a legitimate holder of IP address space can explicitly and verifiably authorize one or more ASes to originate routes to that address space. Such verifiable authorizations could be used, for example, to more securely construct BGP route filters. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6480"/>
          <seriesInfo name="DOI" value="10.17487/RFC6480"/>
        </reference>
        <reference anchor="RFC8182" target="https://www.rfc-editor.org/info/rfc8182" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8182.xml">
          <front>
            <title>The RPKI Repository Delta Protocol (RRDP)</title>
            <author fullname="T. Bruijnzeels" initials="T." surname="Bruijnzeels"/>
            <author fullname="O. Muravskiy" initials="O." surname="Muravskiy"/>
            <author fullname="B. Weber" initials="B." surname="Weber"/>
            <author fullname="R. Austein" initials="R." surname="Austein"/>
            <date month="July" year="2017"/>
            <abstract>
              <t>In the Resource Public Key Infrastructure (RPKI), Certificate Authorities (CAs) publish certificates, including end-entity certificates, Certificate Revocation Lists (CRLs), and RPKI signed objects to repositories. Relying Parties retrieve the published information from those repositories. This document specifies a new RPKI Repository Delta Protocol (RRDP) for this purpose. RRDP was specifically designed for scaling. It relies on an Update Notification File which lists the current Snapshot and Delta Files that can be retrieved using HTTPS (HTTP over Transport Layer Security (TLS)), and it enables the use of Content Distribution Networks (CDNs) or other caching infrastructures for the retrieval of these files.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8182"/>
          <seriesInfo name="DOI" value="10.17487/RFC8182"/>
        </reference>
        <!--
 later ...
        <reference anchor="rpki-client" target="https://www.rpki-client.org/">
          <front>
            <title>rpki-client</title>
            <author fullname="Claudio Jeker"/>
            <author fullname="Job Snijders"/>
            <author fullname="Kristaps Dzonsons"/>
            <author fullname="Theo Buehler"/>
            <date month="June" year="2024" />
          </front>
        </reference>

-->

      </references>
    </references>
    <!--
    <section anchor="running_code" title="Implementation status" removeInRFC="true">
      <t>
        This section records the status of known implementations of the protocol defined by this specification at the time of posting of this Internet-Draft, and is based on a proposal described in RFC 7942.
        The description of implementations in this section is intended to assist the IETF in its decision processes in progressing drafts to RFCs.
        Please note that the listing of any individual implementation here does not imply endorsement by the IETF.
        Furthermore, no effort has been spent to verify the information presented here that was supplied by IETF contributors.
        This is not intended as, and must not be construed to be, a catalog of available implementations or their features.
        Readers are advised to note that other implementations may exist.
      </t>

      <t>
        According to RFC 7942, "this will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.
        It is up to the individual working groups to use this information as they see fit".
      </t>
      <t>
        An experimental Erik relay is available here: <tt>https://cache.rpki-client.org/rpki/{FQDN}</tt>.
      </t>
      <t>
        An experimental Erik client was developed by Job Snijders using <tt>ksh</tt>, <tt>C</tt>, and <tt>Python</tt>.
      </t>
    </section>
-->

    <section anchor="acknowledgements" numbered="false">
      <name>Acknowledgements</name>
      <t>
        The authors wish to thank
          <contact fullname="George Michaelson"/>,
          <contact fullname="Theo de Raadt"/>,
          <contact fullname="Bob Beck"/>, and
          <contact fullname="Theo Buehler"/>
        for the lovely conversations that led to this proposal.
      </t>
      <t>
        This protocol is named after Erik Bais, who passed away in 2024, as a small token of appreciation for his friendship.
      </t>
    </section>
  </back>
</rfc>
