<?xml version="1.0" encoding="UTF-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     version="3"
     docName="draft-cummings-hypr-00"
     category="info"
     submissionType="IETF"
     ipr="trust200902"
     xml:lang="en"
     tocInclude="true"
     tocDepth="3"
     symRefs="true"
     sortRefs="true">

  <front>
    <title abbrev="HyPR">HyPR: Hybrid Parity for Remote Resilience</title>
    <seriesInfo name="Internet-Draft" value="draft-cummings-hypr-00"/>

    <author fullname="Samuel S. Cummings" initials="S. S." surname="Cummings">
      <organization>E2 LLC</organization>
      <address>
        <postal>
          <city>Livonia</city>
          <region>Michigan</region>
          <country>United States of America</country>
        </postal>
        <email>samuel@samuelcummings.com</email>
      </address>
    </author>

    <date year="2026" month="October" day="20"/>

    <keyword>erasure coding</keyword>
    <keyword>parity</keyword>
    <keyword>backup</keyword>
    <keyword>storage resilience</keyword>
    <keyword>client-side encryption</keyword>

    <abstract>
      <t>Local redundancy mechanisms such as RAID and software-defined
      parity pools tolerate only a bounded number of correlated device
      losses, while remote backup services typically require
      replication of the full data set. HyPR's remote storage requirement
      scales with the parity-to-data ratio m/k rather than with the
      size of the protected data, at the cost of not protecting
      against total loss of the local copy. This document specifies HyPR
      (Hybrid Parity for Remote Resilience), a framework that treats
      remote storage, including consumer-grade end-to-end-encrypted
      cloud services, as additional failure-domain participants in an
      erasure-coded storage system. HyPR defines a content-chunked
      Remote Parity Fragment format, transport requirements for
      backend-agnostic encrypted fragment delivery, immutable and
      versioned vault semantics, a resumable reconstruction protocol
      that produces signed rebuild receipts, and a boundary within
      which machine-learned orchestration agents may advise but never
      replace deterministic reconstruction.</t>
    </abstract>

    <note removeInRFC="true">
      <name>Note to Readers</name>
      <t>This is an individual submission. It is not the product of an
      IETF working group, and it does not represent IETF consensus.
      Comments may be sent to the author at the address above.</t>
    </note>
  </front>

  <middle>

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

      <t>Redundant arrays and erasure codes tolerate loss only within
      the failure domains they span. A RAID-Z3 array survives three
      drive failures, but it does not survive a controller fault that
      removes several drives at once, a firmware or manufacturing-batch
      failure that affects a whole cohort of drives, or the loss of the
      site that houses the array. Remote replication addresses site
      loss, but it carries at least 100% storage overhead and exposes
      plaintext to the provider unless the data is separately
      encrypted.</t>

      <t>No standardized protocol currently allows a client to compute
      supplemental erasure-coded parity for data held on an existing
      local array and deposit that parity on arbitrary remote storage,
      so that losses exceeding the local redundancy budget can be
      repaired using only a fractional amount of remote capacity. This
      document describes such a framework, called HyPR.</t>

      <t>HyPR does not propose a new file system and does not modify the
      local array. It operates above the storage mechanism layer, on
      content-defined chunks of file data, and computes Remote Parity
      Fragments that are encrypted on the client and delivered to any
      conforming remote store.</t>

      <t>HyPR is complementary to, and not a replacement for, a full
      offsite copy. As shown in <xref target="envelope"/>, remote
      parity of fractional size cannot by itself restore a data set
      whose local copy has been lost entirely. HyPR addresses losses
      that are partial, correlated, or beyond the local redundancy
      budget.</t>

      <section anchor="scope">
        <name>Scope and Non-Goals</name>
        <t>This document specifies the Remote Parity Fragment format
        (<xref target="rpf-format"/>), the vault manifest
        (<xref target="manifest"/>), transport and vault requirements
        (<xref target="transport"/>, <xref target="keys"/>,
        <xref target="vault"/>), degraded-stripe detection and
        restoration (<xref target="detection"/>,
        <xref target="writeback"/>), the
        reconstruction protocol (<xref target="reconstruction"/>), and
        the boundary between deterministic reconstruction and advisory
        orchestration (<xref target="orchestration"/>).</t>
        <t>This document does not specify a file system, a replacement
        for local RAID, a cloud provider API, a key escrow service, or
        the internal behavior of any machine-learned model.</t>
      </section>

      <section anchor="reqs">
        <name>Requirements Language</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
        "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT
        RECOMMENDED", "MAY", and "OPTIONAL" 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>

    <!-- ============================================================ -->
    <section anchor="terminology">
      <name>Terminology</name>
      <dl newline="true">
        <dt>Local Array</dt>
        <dd>A set of storage devices under a common electrical,
        administrative, and spatial failure domain, for example a ZFS
        pool, a Btrfs volume, or an mdadm array.</dd>

        <dt>Failure Domain</dt>
        <dd>Any grouping of storage elements subject to correlated
        failure, including power, controller, firmware cohort,
        manufacturing batch, and physical location.</dd>

        <dt>Chunk</dt>
        <dd>A variable-length unit of file data produced by
        content-defined chunking (<xref target="chunking"/>).</dd>

        <dt>Stripe Unit</dt>
        <dd>A fixed-size block of data formed from one Chunk, or from a
        padded or concatenated group of Chunks, that serves as an input
        symbol to the supplemental erasure code.</dd>

        <dt>Supplemental Stripe</dt>
        <dd>A logical stripe consisting of k Stripe Units and the m
        Remote Parity Fragments computed over them.</dd>

        <dt>Remote Parity Fragment (RPF)</dt>
        <dd>An erasure-coded parity fragment, computed and encrypted on
        the client, that holds no independently intelligible data and
        is deposited on remote storage.</dd>

        <dt>Vault</dt>
        <dd>A remote, append-only, versioned store of RPFs and manifests
        with the immutability properties of
        <xref target="vault"/>.</dd>

        <dt>Epoch</dt>
        <dd>A monotonically increasing identifier for a consistent
        point-in-time state of a Vault.</dd>

        <dt>Manifest</dt>
        <dd>An encrypted, versioned record stored in the Vault that
        describes Supplemental Stripe membership, code parameters, and
        fragment locations for an Epoch.</dd>

        <dt>HyPR Core</dt>
        <dd>The deterministic userspace component that performs
        chunking, encoding, encryption, transport, and
        reconstruction.</dd>

        <dt>Orchestration Agent</dt>
        <dd>An optional local component that provides advisory failure
        prediction, repair prioritization, and tiering suggestions. An
        Orchestration Agent does not participate in reconstruction
        arithmetic (<xref target="orchestration"/>).</dd>

        <dt>Rebuild Receipt</dt>
        <dd>A signed record emitted by the HyPR Core after a
        reconstruction (<xref target="reconstruction"/>).</dd>
      </dl>
    </section>

    <!-- ============================================================ -->
    <section anchor="problem">
      <name>Problem Statement</name>
      <t>Existing approaches fall short along three axes.</t>
      <ol>
        <li><t>Domain binding. Standard local erasure codes, such as
        mdadm RAID levels, ZFS RAID-Z, and Btrfs profiles, cannot
        extend parity across a wide-area boundary. Their redundancy is
        bounded by the devices in the local array, and a single
        correlated event can exceed it.</t></li>
        <li><t>Asymmetry. Remote backup replicates data, which carries
        100% or greater storage overhead and, absent separate
        encryption, exposes content to the provider. Parity fragments
        carry no independently intelligible payload and incur only
        fractional overhead.</t></li>
        <li><t>Reconstruction coupling. No widely deployed remote-backup
        mechanism defines how a degraded local array identifies which
        parity it requires, so that a targeted partial rebuild can be
        performed instead of a full restore.</t></li>
      </ol>
      <t>Related mechanisms exist but address different problems. File
      parity tools such as PAR2 <xref target="PAR2"/> and SnapRAID
      compute parity over files or disk sets, typically stored locally
      and without a defined remote delivery or immutability model.
      Distributed filesystems such as Tahoe-LAFS
      <xref target="TAHOE"/> erasure-code and encrypt the data itself
      across servers, rather than adding supplemental parity to an
      existing local array. Deduplicating backup tools such as restic
      and Borg use content-defined chunking and encrypted repositories
      but replicate chunks rather than computing cross-chunk
      parity.</t>
    </section>

    <!-- ============================================================ -->
    <section anchor="architecture">
      <name>Architecture</name>
      <figure anchor="fig-arch">
        <name>HyPR Architecture</name>
        <artwork type="ascii-art"><![CDATA[
+-------------------------------------------------------------+
|           Orchestration Agent (optional, advisory)          |
|       failure prediction / tiering / repair scheduling      |
+------------------------------+------------------------------+
                               | advice only
+------------------------------v------------------------------+
|                  HyPR Core (deterministic)                  |
|   chunking | supplemental EC | encryption | keys | rebuild  |
+---------------+-----------------------------+---------------+
                |                             |
      +---------v---------+         +---------v---------+
      |    Local Array    |         |  Remote Vault(s)  |
      |(ZFS, Btrfs, mdadm;|-RPFs--->|  (S3-compatible,  |
      |    unmodified)    |         |   SFTP, WebDAV)   |
      +-------------------+         +-------------------+
]]></artwork>
      </figure>
      <t>The HyPR Core reads file data from the Local Array, forms
      Supplemental Stripes, computes RPFs, encrypts them, and delivers
      them to one or more Vaults together with an encrypted Manifest.
      The Local Array is not modified and need not be aware of HyPR.
      The layering is two-tier: the Local Array provides inner
      redundancy at the device level, and HyPR provides outer
      redundancy at the Chunk level.</t>
    </section>

    <!-- ============================================================ -->
    <section anchor="coding">
      <name>Chunking and Supplemental Erasure Coding</name>

      <section anchor="chunking">
        <name>Content-Defined Chunking</name>
        <t>A HyPR Core MUST divide file data into Chunks using
        content-defined chunking, for example Rabin fingerprinting
        <xref target="RABIN"/>, such that an insertion or deletion
        perturbs a bounded number of Chunks.</t>
        <t>Chunking parameters, including any polynomial or seed, SHOULD
        be secret to the Vault owner and derived from the Vault key
        material. Public, fixed chunking parameters allow an observer
        of fragment sizes and boundaries to confirm the presence of
        known content (<xref target="security"/>).</t>
        <t>Minimum, average, and maximum Chunk sizes are
        deployment-configurable and are recorded in the Manifest.</t>
      </section>

      <section anchor="stripes">
        <name>Supplemental Stripes</name>
        <t>The HyPR Core groups Stripe Units into Supplemental Stripes of
        k units and computes m RPFs over each stripe using a systematic
        maximum-distance-separable (MDS) code, for example
        Reed-Solomon over GF(2^8) or GF(2^16)
        <xref target="REEDSOLOMON"/> <xref target="PLANK"/>. Any k of
        the k+m members of a Supplemental Stripe suffice to recover all
        k Stripe Units. When GF(2^8) is used, k+m MUST NOT exceed
        256.</t>
        <t>The Supplemental Stripe is a logical construct defined by
        HyPR over Chunks. It does not depend on the physical stripe
        geometry or the parity of the Local Array, which HyPR treats as
        opaque.</t>
        <t>Because HyPR cannot observe where the Local Array places
        data, stripe membership SHOULD be formed by interleaving Chunks
        drawn from files written at different times and from different
        parts of the file tree. This reduces the likelihood that a
        localized failure in the Local Array erases more than m members
        of any one Supplemental Stripe. The protection this provides
        against physical loss is therefore statistical rather than
        guaranteed.</t>
        <t>As an illustration only, assume that Stripe Units are placed
        uniformly and independently across the Local Array, and that a
        fraction f of local data becomes unreadable while the m RPFs of
        each stripe remain intact. A stripe is then unrecoverable when
        more than m of its k local Stripe Units are lost, which has
        probability P(X &gt; m) for X distributed Binomial(k, f). For
        k = 10, m = 2, and f = 1%, this is about 1.1 x 10^-4 per
        stripe. With 1 MiB Stripe Units, a 50 TB data set has roughly
        4.8 million such stripes, so about 540 stripes would be
        unrecoverable. The model shows that HyPR is most effective
        against small, scattered losses and that its benefit falls
        quickly as the lost fraction rises. It is not a guarantee,
        because real placement is neither uniform nor
        independent.</t>
      </section>

      <section anchor="updates">
        <name>Immutability of Stripes and Incremental Updates</name>
        <t>A Supplemental Stripe is immutable once sealed, and a Vault
        object is never modified in place. When file data changes, the
        HyPR Core forms new Stripe Units, new Supplemental Stripes, and
        new RPFs in a new Epoch. Stripes that no longer reference live
        data are released by retention policy (<xref target="vault"/>)
        and not by overwrite.</t>
        <t>Because RPFs are encrypted on the client, a remote party
        cannot apply parity deltas. The client computes each new RPF in
        full and uploads it as a new object. Remote write amplification
        is bounded by the number of Supplemental Stripes touched by
        changed Chunks, not by the size of the data set. Implementations
        MAY use the linearity of the code to compute an updated RPF from
        the old and new Stripe Units, where each parity row is combined
        using the appropriate field coefficient, but this is a local
        optimization and is not visible to the Vault.</t>
      </section>

      <section anchor="envelope">
        <name>Protection Envelope</name>
        <t>For a Supplemental Stripe of k Stripe Units and m RPFs, the
        stripe remains recoverable after the loss or corruption of any
        m or fewer of its k+m members, where RPFs held on remote storage
        count as members.</t>
        <t>Recovering a data set of size D requires at least D units of
        information to survive. Consequently, if every local copy of
        the k Stripe Units is lost and only m &lt; k RPFs remain, the
        stripe cannot be recovered. HyPR therefore protects against:</t>
        <ul>
          <li>device or controller failures that exhaust the local
          redundancy budget while leaving a majority of each stripe's
          Stripe Units readable;</li>
          <li>correlated failures of a drive cohort, within the
          statistical limits of <xref target="stripes"/>;</li>
          <li>latent unreadable sectors and silent corruption that
          surface during a degraded rebuild of the Local Array;</li>
          <li>destructive modification or encryption of a subset of
          local data by malware, provided the affected fraction of each
          stripe does not exceed m.</li>
        </ul>
        <t>HyPR does not, by itself, protect against the simultaneous
        loss of all or most local data, such as loss of the entire site.
        Deployments that require that property MUST maintain a full
        offsite copy, and MAY use HyPR in addition to it. A deployment
        that sets m greater than or equal to k obtains full-copy
        recoverability from parity alone, at storage overhead
        comparable to replication.</t>
      </section>

      <section anchor="overhead">
        <name>Remote Storage Overhead</name>
        <t>A principal advantage of HyPR over full offsite replication is
        reduced remote storage. For a Supplemental Stripe of k Stripe
        Units and m RPFs, the remote parity occupies m/k of the
        protected data size, whereas a full offsite copy occupies 100%
        of it. <xref target="tbl-overhead"/> gives examples for a 50 TB
        data set.</t>

        <table anchor="tbl-overhead">
          <name>Remote Storage for a 50 TB Data Set</name>
          <thead>
            <tr><th>Scheme</th><th>Remote overhead</th><th>Remote storage</th><th>Survives total local loss</th></tr>
          </thead>
          <tbody>
            <tr><td>Full offsite copy</td><td>100%</td><td>50 TB</td><td>Yes</td></tr>
            <tr><td>HyPR, k=4, m=2</td><td>50%</td><td>25 TB</td><td>No</td></tr>
            <tr><td>HyPR, k=10, m=2</td><td>20%</td><td>10 TB</td><td>No</td></tr>
            <tr><td>HyPR, k=20, m=2</td><td>10%</td><td>5 TB</td><td>No</td></tr>
          </tbody>
        </table>

        <t>The figures in <xref target="tbl-overhead"/> are the steady-state
        parity size only. This saving is obtained in exchange for the
        limitation stated in <xref target="envelope"/>: remote parity of
        fractional size cannot restore a data set whose local copy has
        been lost entirely. HyPR is therefore a means of obtaining
        protection against losses that exceed the local redundancy
        budget at a fraction of the remote cost of replication. It is
        not a substitute for a full offsite copy where total site loss
        must be survived.</t>

        <t>The following factors increase actual remote usage above the
        figures in <xref target="tbl-overhead"/>.</t>
        <ul>
          <li>Immutability and retention (<xref target="vault"/>): changed
          data produces new Supplemental Stripes in a new Epoch
          (<xref target="updates"/>), and superseded stripes remain until
          their retention period expires. Remote usage therefore grows
          with the rate of data change multiplied by the retention
          period.</li>
          <li>Padding and framing: a fixed Fragment Length
          (<xref target="privacy"/>) pads small Chunks, and each RPF
          carries a 72-octet header and an authentication tag
          (<xref target="rpf-format"/>). Manifests (<xref target="manifest"/>)
          add further storage. These costs are small for large files
          and more significant for data sets of many small files.</li>
          <li>Upload volume: because RPFs are encrypted on the client, an
          updated RPF is uploaded in full and not as a delta
          (<xref target="updates"/>).</li>
        </ul>

        <t>Under a simplified model, remote usage is approximately
        (m/k) x D x (1 + c x R), where D is the protected data size, c
        is the fraction of data that changes per day, and R is the
        retention period in days. The model assumes that changed data
        forms new stripes and that superseded stripes are kept for the
        full retention period. <xref target="tbl-retention"/> applies it
        to the 50 TB data set with k = 10 and m = 2, and compares it
        with a full offsite copy kept under the same retention, whose
        usage is approximately D x (1 + c x R) under the same
        assumptions.</t>

        <table anchor="tbl-retention">
          <name>Remote Usage under Churn and Retention (50 TB, k=10, m=2)</name>
          <thead>
            <tr><th>Daily change (c)</th><th>Retention (R)</th><th>HyPR remote usage</th><th>Versioned full copy</th></tr>
          </thead>
          <tbody>
            <tr><td>0%</td><td>any</td><td>10 TB</td><td>50 TB</td></tr>
            <tr><td>0.5%</td><td>30 days</td><td>11.5 TB</td><td>57.5 TB</td></tr>
            <tr><td>0.5%</td><td>90 days</td><td>14.5 TB</td><td>72.5 TB</td></tr>
            <tr><td>2%</td><td>30 days</td><td>16 TB</td><td>80 TB</td></tr>
            <tr><td>2%</td><td>90 days</td><td>28 TB</td><td>140 TB</td></tr>
          </tbody>
        </table>

        <t>The ratio between the two right-hand columns stays at m/k, so
        the relative saving is unchanged by churn, but absolute usage
        can grow to a multiple of the steady-state parity size.
        Deployments with high churn and long retention should size
        remote capacity with this model and not from
        <xref target="tbl-overhead"/> alone.</t>

        <t>Compared with adding parity devices to the Local Array, HyPR
        does not reduce the amount of parity stored. It places that
        parity in a separate failure domain, which is its purpose.</t>
      </section>

      <section anchor="rateless">
        <name>Rateless Extension</name>
        <t>Implementations MAY use rateless erasure codes such as
        RaptorQ <xref target="RFC6330"/> where the number of surviving
        fragments is uncertain. Rateless reconstruction is best suited
        to immutable or rarely mutating data, which is consistent with
        the immutability of <xref target="updates"/>.</t>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="rpf-format">
      <name>Remote Parity Fragment Format</name>
      <t>An RPF is a binary object with the layout in
      <xref target="fig-rpf"/>. All multi-octet integers are in network
      byte order. The fixed header is 72 octets and is authenticated, but
      not encrypted, as associated data of the AEAD construction
      (<xref target="transport"/>).</t>

      <figure anchor="fig-rpf">
        <name>RPF Layout</name>
        <artwork type="ascii-art"><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Magic (0x48795052)                      |
+---------------+---------------+-------------------------------+
|    Version    |    Code ID    |          Flags (zero)         |
+---------------+---------------+-------------------------------+
|                                                               |
|                      Vault ID (16 octets)                     |
|                                                               |
|                                                               |
+---------------------------------------------------------------+
|                                                               |
|                     Stripe ID (16 octets)                     |
|                                                               |
|                                                               |
+---------------------------------------------------------------+
|                        Epoch (8 octets)                       |
|                                                               |
+-------------------------------+-------------------------------+
|         Fragment Index        |               K               |
+-------------------------------+-------------------------------+
|               M               |        Key Generation        |
+-------------------------------+-------------------------------+
|                        Fragment Length                        |
+---------------------------------------------------------------+
|                                                               |
|                       Nonce (12 octets)                       |
|                                                               |
+---------------------------------------------------------------+
|              Ciphertext (Fragment Length octets)              |
+---------------------------------------------------------------+
|                                                               |
|                 Authentication Tag (16 octets)                |
|                                                               |
|                                                               |
+---------------------------------------------------------------+
]]></artwork>
      </figure>

      <table anchor="tbl-fields">
        <name>RPF Header Fields</name>
        <thead>
          <tr><th>Field</th><th>Size (octets)</th><th>Description</th></tr>
        </thead>
        <tbody>
          <tr><td>Magic</td><td>4</td><td>0x48 0x79 0x50 0x52 ("HyPR")</td></tr>
          <tr><td>Version</td><td>1</td><td>Format version; this document defines 0x01</td></tr>
          <tr><td>Code ID</td><td>1</td><td>1 = Reed-Solomon over GF(2^8); 2 = Reed-Solomon over GF(2^16); 3 = RaptorQ</td></tr>
          <tr><td>Flags</td><td>2</td><td>Reserved; MUST be zero on send and ignored on receipt</td></tr>
          <tr><td>Vault ID</td><td>16</td><td>Random identifier of the Vault</td></tr>
          <tr><td>Stripe ID</td><td>16</td><td>Random identifier of the Supplemental Stripe</td></tr>
          <tr><td>Epoch</td><td>8</td><td>Epoch in which the RPF was written</td></tr>
          <tr><td>Fragment Index</td><td>2</td><td>Index of this RPF among the m parity fragments, starting at zero</td></tr>
          <tr><td>K</td><td>2</td><td>Number of Stripe Units in the stripe</td></tr>
          <tr><td>M</td><td>2</td><td>Number of RPFs in the stripe</td></tr>
          <tr><td>Key Generation</td><td>2</td><td>Identifier of the master key generation from which this RPF's key is derived (<xref target="keys"/>)</td></tr>
          <tr><td>Fragment Length</td><td>4</td><td>Length of the ciphertext in octets</td></tr>
          <tr><td>Nonce</td><td>12</td><td>AEAD nonce</td></tr>
        </tbody>
      </table>

      <t>Implementations SHOULD use a fixed Fragment Length across a
      Vault so that fragment sizes do not reveal Chunk sizes
      (<xref target="privacy"/>). The IANA media type for an RPF
      container is requested in <xref target="iana"/>.</t>
    </section>

    <!-- ============================================================ -->
    <section anchor="manifest">
      <name>Vault Manifest</name>
      <t>Reconstruction after loss of local state requires knowing which
      Chunks belong to which Supplemental Stripe and where the
      corresponding RPFs are stored. The HyPR Core MUST therefore write,
      for each Epoch, an encrypted Manifest to the Vault. A Manifest
      records:</t>
      <ul>
        <li>the code parameters (Code ID, k, m, Fragment Length);</li>
        <li>for each Supplemental Stripe, its Stripe ID and the digest
        of each member Stripe Unit;</li>
        <li>for each Chunk, the file path, the offset and length of the
        Chunk within that file, and the file's size and modification
        time at the time the Epoch was sealed, so that reconstructed
        Chunks can be placed back into files
        (<xref target="writeback"/>);</li>
        <li>the Vault object name of each RPF;</li>
        <li>the chunking parameters of <xref target="chunking"/>, as
        permitted by the key policy; and</li>
        <li>the digest of the preceding Epoch's Manifest, forming a hash
        chain.</li>
      </ul>
      <t>Digests MUST use SHA-256 <xref target="RFC6234"/> or a stronger
      function. A Manifest MUST be encrypted with an AEAD construction
      under a key distinct from the RPF keys. A HyPR Core MUST verify the
      hash chain when it enumerates Epochs and MUST report any
      discontinuity to the operator.</t>
    </section>

    <!-- ============================================================ -->
    <section anchor="transport">
      <name>Transport Requirements</name>
      <t>A conforming transport MUST provide the following.</t>
      <ol>
        <li><t>Client-side encryption before egress. The remote party
        MUST NOT hold, and MUST NOT be able to derive, any decryption
        key. RPFs and Manifests MUST be encrypted with an AEAD
        construction. ChaCha20-Poly1305 <xref target="RFC8439"/> is
        mandatory to implement. Implementations MUST ensure that a
        (key, nonce) pair is never reused. Deriving a distinct key for
        each RPF from the master key, Vault ID, Stripe ID, Fragment
        Index, and Epoch using HKDF <xref target="RFC5869"/> is
        RECOMMENDED.</t></li>
        <li><t>Resumable retrieval. The transport MUST support
        byte-range retrieval of fragments and resumption of an
        interrupted transfer without restarting completed
        fragments.</t></li>
        <li><t>Integrity verification. The HyPR Core MUST verify the
        AEAD tag of every RPF and the digest of every recovered Stripe
        Unit before using them in reconstruction.</t></li>
      </ol>
      <t>Transports SHOULD map onto existing protocols, including
      S3-compatible object APIs, SFTP, and WebDAV <xref target="RFC4918"/>.
      A HyPR Core MUST NOT depend on any provider feature other than
      object creation, ranged read, listing, and, where available,
      object-level immutability.</t>
    </section>

    <!-- ============================================================ -->
    <section anchor="keys">
      <name>Key Management</name>
      <t>This section defines the minimum key management required for
      interoperable recovery. Key escrow services, hardware token
      interfaces, and organizational key policy are out of scope.</t>
      <dl newline="true">
        <dt>Key hierarchy.</dt>
        <dd>A Vault has one master key of at least 256 bits, generated
        by a cryptographically secure random number generator. Keys for
        RPF encryption, Manifest encryption, and the chunking secret
        (<xref target="chunking"/>) MUST each be derived from the master
        key using HKDF <xref target="RFC5869"/> with a distinct context
        label per purpose, so that no two purposes share a key. The
        Rebuild Receipt signing key (<xref target="reconstruction"/>) is
        independent of the master key.</dd>

        <dt>Key generations.</dt>
        <dd>Each master key has a 16-bit Key Generation identifier. It is
        recorded in the Key Generation field of every RPF header
        (<xref target="rpf-format"/>) and in the object name of every
        Manifest, and it is an input to key derivation.</dd>

        <dt>Backup and recovery.</dt>
        <dd>The master key MUST be backed up to at least one location
        that is neither the protected host nor the Vault, for example
        offline media or a hardware token. The recovery procedure MUST be
        documented and tested. Escrow with a trusted second party is
        RECOMMENDED where the loss of a single custodian is a realistic
        risk. Because the Manifest is encrypted, a lost master key means
        that neither the RPFs nor the Manifest can be read.</dd>

        <dt>Rotation.</dt>
        <dd>Rotation starts a new Key Generation. New RPFs and Manifests
        use the new generation, existing objects remain under their
        original generation, and the HyPR Core MUST retain each old master
        key for as long as objects protected by it remain in the Vault.
        Rotation therefore does not retroactively protect existing
        objects against disclosure of an old key. An operator who needs
        that protection MUST download, decrypt, re-encrypt under the new
        generation, and upload the affected RPFs as new objects, and then
        allow the old objects to expire under the retention policy. During
        the transition, remote usage is approximately that of the
        existing parity set plus the re-encrypted copy.</dd>

        <dt>Disclosure.</dt>
        <dd>Disclosure of a master key allows an attacker to decrypt the
        RPFs and the Manifest. The Manifest contains file paths and
        digests, so the impact includes disclosure of file names and
        structure and not only of parity.</dd>
      </dl>
    </section>

    <!-- ============================================================ -->
    <section anchor="vault">
      <name>Immutable Vault Semantics</name>
      <t>A Vault MUST enforce append-only writes with configurable
      retention, such that compromise of the local system, including
      malware operating with the local host's credentials, cannot
      destructively rewrite or delete remote parity within the retention
      period.</t>
      <t>To that end:</t>
      <ul>
        <li>The credential held by the protected host MUST be limited to
        creating new objects and reading existing objects. It MUST NOT
        permit overwrite or deletion.</li>
        <li>A credential permitting deletion or retention reduction MUST
        NOT be stored on the protected host. Such operations MUST
        require explicit operator action.</li>
        <li>Vaults SHOULD expose object-lock or equivalent immutability
        primitives with a retention period at least as long as the
        longest interval over which an undetected compromise is
        considered credible.</li>
        <li>Point-in-time Vault states (Epochs) SHOULD be enumerable,
        permitting restoration to a pre-incident Epoch.</li>
      </ul>
      <t>Where a provider cannot enforce immutability, the deployment
      MUST document that limitation, and the HyPR Core SHOULD detect and
      report unexpected modification or removal of objects at each
      Epoch.</t>
    </section>

    <!-- ============================================================ -->
    <section anchor="detection">
      <name>Detecting Degraded Stripes</name>
      <t>The reconstruction protocol (<xref target="reconstruction"/>)
      starts from a degraded Supplemental Stripe, that is, one with one
      or more unreadable or corrupt Stripe Units. Because HyPR treats the
      Local Array as opaque, it has no direct view of device health, and
      detection relies on the following sources.</t>
      <ol>
        <li>Read errors. A read of a Stripe Unit fails with an I/O error,
        and the unit is treated as missing.</li>
        <li>Array-reported integrity errors. Checksum errors, scrub
        results, or degraded-state reports from the Local Array's own
        integrity mechanism, for example a ZFS or Btrfs scrub. Where the
        Local Array checksums data, a HyPR Core SHOULD use these reports
        in preference to hashing all data itself.</li>
        <li>Verification pass. The HyPR Core reads protected data,
        recomputes the digest of each Stripe Unit, and compares it with
        the Manifest. This is the only source that detects silent
        corruption on a Local Array that does not checksum its own
        data.</li>
        <li>Operator request.</li>
      </ol>
      <t>A verification pass reads every protected byte, so its cost is
      proportional to the data set size D. For example, a full pass over
      50 TB at an aggregate 500 MB/s takes about 28 hours of read time.
      The HyPR Core therefore MUST make the verification schedule
      configurable, SHOULD support rate limiting so that production
      workloads are not starved, and SHOULD support sampled passes that
      verify a rotating fraction of Stripe Units so that every unit is
      verified within a bounded number of passes. Encoding needs to read
      only data that is new or changed since the last Epoch, so a full
      verification pass is the cost of independent confirmation and not a
      routine cost of operating HyPR.</t>
      <t>A Stripe Unit digest in the Manifest is valid only for the data
      as it was when the Epoch was sealed. A digest mismatch on a file
      whose size and modification time are unchanged since the Epoch is
      treated as corruption. A mismatch on a file whose size or
      modification time has changed is treated as legitimate
      modification and is not degradation. Such a file is re-encoded in a
      new Epoch (<xref target="updates"/>). A change that preserves
      file metadata cannot be distinguished from corruption, and treating
      it as corruption is the safe interpretation.</t>
      <t>An Orchestration Agent MAY advise on the scheduling and ordering
      of verification passes. The result of a detection step derives
      solely from the sources above (<xref target="orchestration"/>).</t>
    </section>

    <!-- ============================================================ -->
    <section anchor="reconstruction">
      <name>Reconstruction Protocol</name>
      <t>When the HyPR Core detects a degraded stripe, that is, a
      Supplemental Stripe with one or more unreadable or corrupt Stripe
      Units, it proceeds as follows.</t>
      <ol>
        <li>It retrieves and verifies the Manifest for the relevant
        Epoch and identifies the minimal set of RPFs sufficient to
        reconstruct the missing Stripe Units. It MUST NOT retrieve
        unnecessary fragments.</li>
        <li>It opens a resumable, integrity-checked retrieval session
        with the Vault and fetches only those RPFs.</li>
        <li>It reconstructs the missing Stripe Units locally and
        deterministically, and verifies each against the digest in the
        Manifest. An Orchestration Agent MUST NOT modify reconstructed
        bytes under any circumstance.</li>
        <li>It emits a Rebuild Receipt.</li>
      </ol>
      <t>An interrupted rebuild MUST be resumable without restarting
      completed fragment transfers.</t>
      <t>A Rebuild Receipt identifies the Epoch, the reconstructed
      extents, the source RPFs, and the verification digests, and it is
      signed with Ed25519 <xref target="RFC8032"/>. The signing key
      SHOULD be held outside the protected host, for example in a
      hardware token, so that a compromised host cannot forge a receipt.
      A receipt records what the HyPR Core did; it does not by itself
      prove that the reconstructed data is the data originally
      written.</t>
    </section>

    <!-- ============================================================ -->
    <section anchor="writeback">
      <name>Restoring Reconstructed Data</name>
      <t>Reconstruction (<xref target="reconstruction"/>) yields verified
      Stripe Units. This section defines how they are returned to the
      Local Array.</t>
      <ol>
        <li>Staging. The HyPR Core MUST first write reconstructed Chunks
        to a staging location outside the protected data tree, on storage
        other than the degraded devices where practicable, and MUST
        verify each against its Manifest digest. The chunk map in the
        Manifest (<xref target="manifest"/>) identifies the file, offset,
        and length of each Chunk.</li>
        <li>Assembly. Replacement files are assembled in the staging
        location from reconstructed Chunks and surviving local Chunks,
        and are verified Chunk by Chunk.</li>
        <li>Placement. Replacing or modifying a file in the protected
        tree is a restoration over existing local data and requires
        explicit operator authorization (<xref target="orchestration"/>).
        When authorized, the HyPR Core MUST write through the ordinary
        file system interface and MUST NOT write to raw devices, and it
        SHOULD write under a temporary name followed by an atomic rename
        where the file system supports one. HyPR does not repair file
        system structures. If the file system itself is damaged, the
        operator restores to a new volume.</li>
        <li>Degraded array. While the Local Array is itself degraded or
        resilvering, the HyPR Core SHOULD defer placement until that
        completes, or restore to a different volume, so that restoration
        does not add load to, or write into, a failing array.</li>
        <li>Confirmation. After placement, the HyPR Core re-reads and
        re-verifies the restored data and emits a receipt addendum,
        signed in the same way as the Rebuild Receipt, that records the
        placement.</li>
      </ol>
    </section>

    <!-- ============================================================ -->
    <section anchor="orchestration">
      <name>Advisory Orchestration</name>
      <t>An Orchestration Agent MAY provide advice on: disk failure
      prediction from time-series device telemetry
      <xref target="PINHEIRO"/> <xref target="SCHROEDER"/>;
      degradation-aware repair ordering, which prioritizes stripes
      approaching their fault-tolerance budget; tiering of data across
      parity depths on the basis of replaceability; and anomaly
      detection on synchronization behavior.</t>
      <t>The following constraints apply.</t>
      <ul>
        <li>Orchestration advice is non-binding. The HyPR Core retains
        authority over, and the ability to refuse, every action.</li>
        <li>An Orchestration Agent MUST NOT perform, or supply inputs
        to, reconstruction arithmetic, and MUST NOT modify any data,
        Manifest, or RPF.</li>
        <li>An Orchestration Agent MUST NOT initiate actions that are
        destructive or irreversible, including reduction of retention,
        deletion of RPFs, rotation or destruction of keys, and
        restoration over existing local data. Those actions require
        explicit operator authorization.</li>
        <li>An Orchestration Agent SHOULD run without access to key
        material or plaintext file content.</li>
        <li>Local inference is RECOMMENDED for privacy-sensitive
        telemetry. Where remote inference is used, the payload MUST be
        minimized.</li>
        <li>Learned components MUST degrade gracefully to a static
        schedule if the model is unavailable.</li>
      </ul>
    </section>

    <!-- ============================================================ -->
    <section anchor="privacy">
      <name>Privacy Considerations</name>
      <t>RPFs are parity, so they carry no independently intelligible
      payload, and they are encrypted on the client. A remote provider
      that is compelled to disclose stored objects can disclose only
      ciphertext, and it cannot recover protected content without keys
      it does not hold.</t>
      <t>The provider can still observe access patterns, object counts,
      object sizes, write timing, and the cleartext header fields of
      <xref target="rpf-format"/>, which reveal code geometry
      (K, M), Epoch, and fragment indices. To reduce this surface,
      deployments SHOULD use a fixed Fragment Length, SHOULD upload on a
      uniform cadence where practical, and SHOULD use random Vault and
      Stripe identifiers that carry no semantic content.</t>
    </section>

    <!-- ============================================================ -->
    <section anchor="security">
      <name>Security Considerations</name>
      <dl newline="true">
        <dt>Key management.</dt>
        <dd>Loss of client keys is equivalent to loss of remote
        protection. Key backup and recovery procedures are REQUIRED to
        be documented for each deployment. Keys MUST NOT be stored
        solely within the Vault they protect.</dd>

        <dt>Compromised host.</dt>
        <dd>A host holding keys and Vault write credentials can write
        valid-looking but worthless RPFs, and can poison future Epochs.
        The hash chain and enumerable Epochs of
        <xref target="manifest"/> and <xref target="vault"/> allow
        recovery to a pre-incident Epoch, but only if the compromise is
        detected within the retention window.</dd>

        <dt>Rollback and withholding.</dt>
        <dd>Vault immutability is a defense, not a guarantee. A
        malicious or faulty provider can withhold, delay, or roll back
        objects. Vault authentication, Manifest hash chaining, and
        monitoring are complementary controls. Using more than one
        Vault reduces exposure to a single provider.</dd>

        <dt>Chunking side channels.</dt>
        <dd>Content-defined chunking with public parameters can allow an
        observer to confirm that known content is stored. Secret
        chunking parameters (<xref target="chunking"/>) and fixed
        fragment sizes mitigate, but do not eliminate, this
        channel.</dd>

        <dt>Model integrity.</dt>
        <dd>The advisory-only constraints of
        <xref target="orchestration"/> bound the effect of a
        compromised, erroneous, or hallucinating model, because it can
        neither alter data nor perform irreversible actions.</dd>

        <dt>Correlated local failure.</dt>
        <dd>HyPR reduces but cannot eliminate exposure to correlated
        failure (<xref target="envelope"/>). Implementation guidance on
        diversity of drive cohorts and on offsite copies is
        RECOMMENDED.</dd>

        <dt>Code and parameter choice.</dt>
        <dd>Weak parameters, such as m = 1 over very large stripes, give
        little protection against multi-unit loss. Deployments should
        select k and m in light of measured failure rates.</dd>
      </dl>
    </section>

    <!-- ============================================================ -->
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document requests registration of the following media
      type in the standards tree, in accordance with
      <xref target="RFC6838"/>.</t>
      <dl newline="false" spacing="compact">
        <dt>Type name:</dt><dd>application</dd>
        <dt>Subtype name:</dt><dd>hypr-rpf</dd>
        <dt>Required parameters:</dt><dd>N/A</dd>
        <dt>Optional parameters:</dt><dd>N/A</dd>
        <dt>Encoding considerations:</dt><dd>binary</dd>
        <dt>Security considerations:</dt><dd>See <xref target="security"/> of this document.</dd>
        <dt>Interoperability considerations:</dt><dd>See <xref target="rpf-format"/>.</dd>
        <dt>Published specification:</dt><dd>This document.</dd>
        <dt>Applications that use this media type:</dt><dd>Backup and storage-resilience software implementing HyPR.</dd>
        <dt>Fragment identifier considerations:</dt><dd>N/A</dd>
        <dt>Additional information:</dt><dd>Magic number: the first four octets are 0x48 0x79 0x50 0x52 ("HyPR"). File extension: .rpf.</dd>
        <dt>Person and email address to contact for further information:</dt><dd>Samuel S. Cummings, samuel@samuelcummings.com</dd>
        <dt>Intended usage:</dt><dd>COMMON</dd>
        <dt>Restrictions on usage:</dt><dd>None</dd>
        <dt>Author:</dt><dd>Samuel S. Cummings</dd>
        <dt>Change controller:</dt><dd>Author, pending any future working group.</dd>
      </dl>
      <t>This document also requests that IANA create a registry for the
      RPF Code ID field (<xref target="tbl-fields"/>), with initial
      values 1, 2, and 3 as defined above and a registration policy of
      Specification Required.</t>
    </section>

  </middle>

  <back>
    <references>
      <name>References</name>

      <references anchor="normative">
        <name>Normative References</name>

        <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 initials="S." surname="Bradner" fullname="S. Bradner"/>
            <date year="1997" month="March"/>
          </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 initials="B." surname="Leiba" fullname="B. Leiba"/>
            <date year="2017" month="May"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>

        <reference anchor="RFC8439" target="https://www.rfc-editor.org/info/rfc8439">
          <front>
            <title>ChaCha20 and Poly1305 for IETF Protocols</title>
            <author initials="Y." surname="Nir" fullname="Y. Nir"/>
            <author initials="A." surname="Langley" fullname="A. Langley"/>
            <date year="2018" month="June"/>
          </front>
          <seriesInfo name="RFC" value="8439"/>
          <seriesInfo name="DOI" value="10.17487/RFC8439"/>
        </reference>

        <reference anchor="RFC8032" target="https://www.rfc-editor.org/info/rfc8032">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
            <author initials="S." surname="Josefsson" fullname="S. Josefsson"/>
            <author initials="I." surname="Liusvaara" fullname="I. Liusvaara"/>
            <date year="2017" month="January"/>
          </front>
          <seriesInfo name="RFC" value="8032"/>
          <seriesInfo name="DOI" value="10.17487/RFC8032"/>
        </reference>

        <reference anchor="RFC6234" target="https://www.rfc-editor.org/info/rfc6234">
          <front>
            <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
            <author initials="D." surname="Eastlake 3rd" fullname="D. Eastlake 3rd"/>
            <author initials="T." surname="Hansen" fullname="T. Hansen"/>
            <date year="2011" month="May"/>
          </front>
          <seriesInfo name="RFC" value="6234"/>
          <seriesInfo name="DOI" value="10.17487/RFC6234"/>
        </reference>

        <reference anchor="RFC5869" target="https://www.rfc-editor.org/info/rfc5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author initials="H." surname="Krawczyk" fullname="H. Krawczyk"/>
            <author initials="P." surname="Eronen" fullname="P. Eronen"/>
            <date year="2010" month="May"/>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>

        <reference anchor="RFC6838" target="https://www.rfc-editor.org/info/rfc6838">
          <front>
            <title>Media Type Specifications and Registration Procedures</title>
            <author initials="N." surname="Freed" fullname="N. Freed"/>
            <author initials="J." surname="Klensin" fullname="J. Klensin"/>
            <author initials="T." surname="Hansen" fullname="T. Hansen"/>
            <date year="2013" month="January"/>
          </front>
          <seriesInfo name="BCP" value="13"/>
          <seriesInfo name="RFC" value="6838"/>
          <seriesInfo name="DOI" value="10.17487/RFC6838"/>
        </reference>
      </references>

      <references anchor="informative">
        <name>Informative References</name>

        <reference anchor="RFC6330" target="https://www.rfc-editor.org/info/rfc6330">
          <front>
            <title>RaptorQ Forward Error Correction Scheme for Object Delivery</title>
            <author initials="M." surname="Luby" fullname="M. Luby"/>
            <author initials="A." surname="Shokrollahi" fullname="A. Shokrollahi"/>
            <author initials="M." surname="Watson" fullname="M. Watson"/>
            <author initials="T." surname="Stockhammer" fullname="T. Stockhammer"/>
            <author initials="L." surname="Minder" fullname="L. Minder"/>
            <date year="2011" month="August"/>
          </front>
          <seriesInfo name="RFC" value="6330"/>
          <seriesInfo name="DOI" value="10.17487/RFC6330"/>
        </reference>

        <reference anchor="RFC4918" target="https://www.rfc-editor.org/info/rfc4918">
          <front>
            <title>HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)</title>
            <author initials="L." surname="Dusseault" fullname="L. Dusseault" role="editor"/>
            <date year="2007" month="June"/>
          </front>
          <seriesInfo name="RFC" value="4918"/>
          <seriesInfo name="DOI" value="10.17487/RFC4918"/>
        </reference>

        <reference anchor="REEDSOLOMON">
          <front>
            <title>Polynomial Codes over Certain Finite Fields</title>
            <author initials="I. S." surname="Reed" fullname="Irving S. Reed"/>
            <author initials="G." surname="Solomon" fullname="Gustave Solomon"/>
            <date year="1960"/>
          </front>
          <refcontent>Journal of the Society for Industrial and Applied Mathematics, vol. 8, no. 2, pp. 300-304</refcontent>
        </reference>

        <reference anchor="PLANK">
          <front>
            <title>A Tutorial on Reed-Solomon Coding for Fault-Tolerance in RAID-like Systems</title>
            <author initials="J. S." surname="Plank" fullname="James S. Plank"/>
            <date year="1997" month="September"/>
          </front>
          <refcontent>Software: Practice and Experience, vol. 27, no. 9, pp. 995-1012</refcontent>
        </reference>

        <reference anchor="RABIN">
          <front>
            <title>Fingerprinting by Random Polynomials</title>
            <author initials="M. O." surname="Rabin" fullname="Michael O. Rabin"/>
            <date year="1981"/>
          </front>
          <refcontent>Harvard University Center for Research in Computing Technology, Technical Report TR-15-81</refcontent>
        </reference>

        <reference anchor="TAHOE">
          <front>
            <title>Tahoe: The Least-Authority Filesystem</title>
            <author initials="Z." surname="Wilcox-O'Hearn" fullname="Zooko Wilcox-O'Hearn"/>
            <author initials="B." surname="Warner" fullname="Brian Warner"/>
            <date year="2008"/>
          </front>
          <refcontent>Proceedings of the 4th ACM International Workshop on Storage Security and Survivability (StorageSS)</refcontent>
        </reference>

        <reference anchor="PAR2" target="http://parchive.sourceforge.net/docs/specifications/parity-volume-spec/article-spec.html">
          <front>
            <title>Parity Volume Set Specification 2.0</title>
            <author initials="P." surname="Clements" fullname="Peter Clements"/>
            <author initials="M." surname="Nahas" fullname="Michael Nahas"/>
            <date year="2003"/>
          </front>
        </reference>

        <reference anchor="PINHEIRO">
          <front>
            <title>Failure Trends in a Large Disk Drive Population</title>
            <author initials="E." surname="Pinheiro" fullname="Eduardo Pinheiro"/>
            <author initials="W.-D." surname="Weber" fullname="Wolf-Dietrich Weber"/>
            <author initials="L. A." surname="Barroso" fullname="Luiz Andre Barroso"/>
            <date year="2007" month="February"/>
          </front>
          <refcontent>Proceedings of the 5th USENIX Conference on File and Storage Technologies (FAST)</refcontent>
        </reference>

        <reference anchor="SCHROEDER">
          <front>
            <title>Disk Failures in the Real World: What Does an MTTF of 1,000,000 Hours Mean to You?</title>
            <author initials="B." surname="Schroeder" fullname="Bianca Schroeder"/>
            <author initials="G. A." surname="Gibson" fullname="Garth A. Gibson"/>
            <date year="2007" month="February"/>
          </front>
          <refcontent>Proceedings of the 5th USENIX Conference on File and Storage Technologies (FAST)</refcontent>
        </reference>
      </references>
    </references>
  </back>
</rfc>
