<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.34 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-sullivan-cfrg-raae-00" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.32.0 -->
  <front>
    <title abbrev="raAE">Random-Access Authenticated Encryption</title>
    <seriesInfo name="Internet-Draft" value="draft-sullivan-cfrg-raae-00"/>
    <author initials="N." surname="Sullivan" fullname="Nick Sullivan">
      <organization>Cryptography Consulting LLC</organization>
      <address>
        <email>nicholas.sullivan+ietf@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="25"/>
    <area>IRTF</area>
    <workgroup>Crypto Forum</workgroup>
    <abstract>
      <?line 72?>

<t>This document defines Random-Access Authenticated Encryption (raAE), a
mechanism for encrypting segmented content that supports decryption of
individual segments without processing others, selective re-encryption
of individual segments in place, and content-level integrity via an
accumulator binding all segment authentication tags.  raAE is
parameterized over an Authenticated Encryption with Associated Data
(AEAD) algorithm, a key derivation function (KDF), segment size, epoch
length, and nonce generation mode.</t>
      <t>raAE does not define wire formats, IANA registries, or key management;
applications instantiate it with a chosen parameter set and protocol
identifier.  This document also defines "raAE-v1", a concrete profile
with test vectors, supporting five AEAD algorithms: AES-256-GCM,
ChaCha20-Poly1305, AES-256-GCM-SIV, AEGIS-256, and AEGIS-256X2, each
with HKDF-SHA-256 and 65536-octet segments.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Crypto Forum Research Group mailing list (cfrg@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/cfrg"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/grittygrease/draft-sullivan-cfrg-raae"/>.</t>
    </note>
  </front>
  <middle>
    <?line 90?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Consider a 1 tebibyte (TiB) encrypted backup stored as 2^24 segments
of 64 KiB each.  A user changes one segment.  Today that service must
either re-encrypt the entire file or treat each segment as an
independent Authenticated Encryption with Associated Data (AEAD)
message and give up cross-segment integrity.  STREAM (<xref target="STREAM"/>) does
not help here; it chains nonces across segments, so reading segment
1000 requires verifying segments 0 through 999 first.</t>
      <t>Random-Access Authenticated Encryption (raAE) solves this.  It
encrypts each segment independently, supports in-place re-encryption,
and binds all segment tags into a single accumulator for content-level
integrity.</t>
      <t>The mechanism works in layers.  Start with a 32-octet random Content
Encryption Key (CEK) and a per-content salt.  From these, derive a
commitment (lets the reader reject a wrong key before decrypting
anything), a payload key, an accumulator key, and optionally a nonce
base.  For each segment, derive a per-segment key from the payload key
(either directly or through an epoch-key layer that bounds nonce reuse),
generate a nonce, and encrypt with an AEAD.  Take the AEAD tag from
each segment, feed it through a keyed pseudorandom function (PRF), and
XOR all the outputs together into the accumulator.</t>
      <t>The hierarchy is deterministic: CEK plus salt plus segment index is
enough to derive any key.</t>
      <t>This document defines "raAE-v1", a concrete profile supporting
AES-256-GCM, ChaCha20-Poly1305, AES-256-GCM-SIV, AEGIS-256, and
AEGIS-256X2, all with HKDF-SHA-256, and includes test vectors for each
nonce generation mode.  raAE does not define wire formats, IANA code
points, or key management; consuming protocols handle those.</t>
      <t><xref target="conventions"/> fixes notation.  <xref target="framework"/> defines the mechanism.
<xref target="framing"/> states the domain separation requirements any concrete KDF
framing must meet.  <xref target="security-properties"/> gives the security analysis.
<xref target="concrete"/> defines raAE-v1.</t>
      <section anchor="related-work">
        <name>Related Work</name>
        <t>STREAM (<xref target="STREAM"/>) encrypts sequential data by chaining a nonce from
one segment to the next: segment N's nonce depends on segment N-1's
ciphertext, so decryption is inherently sequential.  raAE replaces this
chain with independent per-segment nonces (random, derived, or
plaintext-bound), which is what makes random-access reads
possible.  Both constructions authenticate each segment individually;
raAE adds a content-level accumulator that STREAM does not need
because STREAM's chain already binds segment order.</t>
        <t>FLOE (<xref target="FLOE"/>) formalized the raAE security notion as ra-ROR
(random-access real-or-random), a simulation-based definition that
captures confidentiality and authenticity when segments can be encrypted
and decrypted in any order.  ra-ROR is strictly stronger than
nonce-based online authenticated encryption (nOAE2): a scheme can be
nOAE2-secure (secure for sequential encryption with random-access
decryption) but insecure when encryption order is also arbitrary.</t>
        <t>FLOE proved that its construction (epoch key rotation, per-segment AEAD,
and a hash-based integrity tag) satisfies ra-ROR, and defined ra-CMT
(random-access context commitment) as a commitment notion independent of
the underlying AEAD's commitment properties.  raAE-v1 draws on FLOE's
epoch key structure but uses a different integrity mechanism: a
XOR-of-PRF accumulator that supports O(1) incremental update on segment
rewrites.  The informal security argument in <xref target="security-properties"/>
follows FLOE's reduction structure, adapted for the XOR-of-PRF
accumulator.</t>
      </section>
      <section anchor="applicability">
        <name>Applicability</name>
        <t>Use raAE when the content is too large for a single AEAD call and the
application needs to read or write individual segments.  The format must
store per-segment nonces and tags.</t>
        <t>For small messages, a single AEAD call is simpler and sufficient.  For
sequential streaming, STREAM (<xref target="STREAM"/>) gives stronger ordering
guarantees with less machinery.  For formats where per-segment metadata
is prohibitively expensive, derived nonce mode removes the nonce
overhead but restricts the AEAD to Misuse-Resistant Authenticated
Encryption (MRAE, <xref target="RFC9771"/>) algorithms.</t>
      </section>
    </section>
    <section anchor="conventions">
      <name>Conventions and Terminology</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>A Segment is a fixed-size unit of plaintext.  Each segment is
individually encrypted and authenticated.  The final segment of a
message may be shorter than the nominal segment size.</t>
      <t>The Content Encryption Key (CEK) is a 32-octet uniform random master key
from which all other keys for a given message are derived.</t>
      <t>The protocol_id is an application-chosen octet string that binds all KDF
outputs to a specific protocol version and application context.
Different applications <bcp14>MUST</bcp14> use different protocol_id values even when
using the same underlying AEAD and KDF algorithms.</t>
      <t>Other terms (epoch, epoch_key, payload_key, accumulator, commitment, and
related values) are defined in <xref target="framework"/> where they first appear.</t>
      <section anchor="notation">
        <name>Notation</name>
        <dl>
          <dt>I2OSP(n, w):</dt>
          <dd>
            <t>The w-octet big-endian encoding of the non-negative integer n, as
defined in <xref target="RFC8017"/>.</t>
          </dd>
          <dt>uint64(n):</dt>
          <dd>
            <t>Shorthand for I2OSP(n, 8).</t>
          </dd>
          <dt>uint8(n):</dt>
          <dd>
            <t>Shorthand for I2OSP(n, 1).</t>
          </dd>
          <dt>||:</dt>
          <dd>
            <t>Octet string concatenation.</t>
          </dd>
          <dt>lp16(x):</dt>
          <dd>
            <t>The 2-octet big-endian length of x followed by x: I2OSP(len(x), 2)
|| x.</t>
          </dd>
          <dt>Encode(x1, ..., xn):</dt>
          <dd>
            <t>Injective length-prefixed encoding: lp16(x1) || ... || lp16(xn).
Each argument <bcp14>MUST</bcp14> be at most 65535 octets.  The concrete framing in
<xref target="concrete-framing"/> specifies how Encode is used in KDF calls.</t>
          </dd>
          <dt>XOR:</dt>
          <dd>
            <t>Bitwise exclusive-or of two octet strings of equal length.</t>
          </dd>
          <dt>x[a:b]:</dt>
          <dd>
            <t>Octets a through b-1 inclusive of x (zero-based, half-open
interval).</t>
          </dd>
          <dt>Nk:</dt>
          <dd>
            <t>Key size in octets for the chosen AEAD algorithm.</t>
          </dd>
          <dt>Nn:</dt>
          <dd>
            <t>Nonce size in octets for the chosen AEAD algorithm.</t>
          </dd>
          <dt>Nh:</dt>
          <dd>
            <t>Hash or PRF output size in octets for the chosen KDF.</t>
          </dd>
          <dt>Nt:</dt>
          <dd>
            <t>Authentication tag size in octets for the chosen AEAD algorithm.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="framework">
      <name>The raAE Framework</name>
      <t>The key hierarchy is shown below.  A CEK and per-content salt feed the
payload schedule, which derives four values.  The payload key feeds
per-segment keys (optionally through epoch keys), each segment produces
an AEAD tag, and all tags feed the accumulator.</t>
      <figure anchor="fig-hierarchy">
        <name>raAE Key Hierarchy</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="528" width="256" viewBox="0 0 256 528" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,240 L 8,288" fill="none" stroke="black"/>
              <path d="M 24,208 L 24,232" fill="none" stroke="black"/>
              <path d="M 40,240 L 40,288" fill="none" stroke="black"/>
              <path d="M 48,336 L 48,384" fill="none" stroke="black"/>
              <path d="M 64,240 L 64,288" fill="none" stroke="black"/>
              <path d="M 64,392 L 64,416" fill="none" stroke="black"/>
              <path d="M 72,80 L 72,128" fill="none" stroke="black"/>
              <path d="M 88,208 L 88,232" fill="none" stroke="black"/>
              <path d="M 88,296 L 88,328" fill="none" stroke="black"/>
              <path d="M 96,136 L 96,160" fill="none" stroke="black"/>
              <path d="M 96,392 L 96,416" fill="none" stroke="black"/>
              <path d="M 120,240 L 120,288" fill="none" stroke="black"/>
              <path d="M 120,336 L 120,384" fill="none" stroke="black"/>
              <path d="M 128,32 L 128,72" fill="none" stroke="black"/>
              <path d="M 136,336 L 136,384" fill="none" stroke="black"/>
              <path d="M 144,240 L 144,288" fill="none" stroke="black"/>
              <path d="M 152,136 L 152,160" fill="none" stroke="black"/>
              <path d="M 152,208 L 152,232" fill="none" stroke="black"/>
              <path d="M 168,80 L 168,128" fill="none" stroke="black"/>
              <path d="M 168,296 L 168,328" fill="none" stroke="black"/>
              <path d="M 168,392 L 168,416" fill="none" stroke="black"/>
              <path d="M 168,464 L 168,480" fill="none" stroke="black"/>
              <path d="M 176,240 L 176,288" fill="none" stroke="black"/>
              <path d="M 200,240 L 200,288" fill="none" stroke="black"/>
              <path d="M 208,208 L 208,232" fill="none" stroke="black"/>
              <path d="M 208,336 L 208,384" fill="none" stroke="black"/>
              <path d="M 248,240 L 248,288" fill="none" stroke="black"/>
              <path d="M 72,80 L 168,80" fill="none" stroke="black"/>
              <path d="M 72,128 L 168,128" fill="none" stroke="black"/>
              <path d="M 8,240 L 40,240" fill="none" stroke="black"/>
              <path d="M 64,240 L 120,240" fill="none" stroke="black"/>
              <path d="M 144,240 L 176,240" fill="none" stroke="black"/>
              <path d="M 200,240 L 248,240" fill="none" stroke="black"/>
              <path d="M 8,288 L 40,288" fill="none" stroke="black"/>
              <path d="M 64,288 L 120,288" fill="none" stroke="black"/>
              <path d="M 144,288 L 176,288" fill="none" stroke="black"/>
              <path d="M 200,288 L 248,288" fill="none" stroke="black"/>
              <path d="M 48,336 L 120,336" fill="none" stroke="black"/>
              <path d="M 136,336 L 208,336" fill="none" stroke="black"/>
              <path d="M 48,384 L 120,384" fill="none" stroke="black"/>
              <path d="M 136,384 L 208,384" fill="none" stroke="black"/>
              <path d="M 120,432 L 144,432" fill="none" stroke="black"/>
              <path d="M 200,144 L 208,160" fill="none" stroke="black"/>
              <path d="M 40,160 L 48,144" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="216,232 204,226.4 204,237.6" fill="black" transform="rotate(90,208,232)"/>
              <polygon class="arrowhead" points="216,160 204,154.4 204,165.6" fill="black" transform="rotate(63.43494882292201,208,160)"/>
              <polygon class="arrowhead" points="176,480 164,474.4 164,485.6" fill="black" transform="rotate(90,168,480)"/>
              <polygon class="arrowhead" points="176,416 164,410.4 164,421.6" fill="black" transform="rotate(90,168,416)"/>
              <polygon class="arrowhead" points="176,328 164,322.4 164,333.6" fill="black" transform="rotate(90,168,328)"/>
              <polygon class="arrowhead" points="160,232 148,226.4 148,237.6" fill="black" transform="rotate(90,152,232)"/>
              <polygon class="arrowhead" points="160,160 148,154.4 148,165.6" fill="black" transform="rotate(90,152,160)"/>
              <polygon class="arrowhead" points="152,432 140,426.4 140,437.6" fill="black" transform="rotate(0,144,432)"/>
              <polygon class="arrowhead" points="136,72 124,66.4 124,77.6" fill="black" transform="rotate(90,128,72)"/>
              <polygon class="arrowhead" points="104,416 92,410.4 92,421.6" fill="black" transform="rotate(90,96,416)"/>
              <polygon class="arrowhead" points="104,160 92,154.4 92,165.6" fill="black" transform="rotate(90,96,160)"/>
              <polygon class="arrowhead" points="96,328 84,322.4 84,333.6" fill="black" transform="rotate(90,88,328)"/>
              <polygon class="arrowhead" points="96,232 84,226.4 84,237.6" fill="black" transform="rotate(90,88,232)"/>
              <polygon class="arrowhead" points="72,416 60,410.4 60,421.6" fill="black" transform="rotate(90,64,416)"/>
              <polygon class="arrowhead" points="48,160 36,154.4 36,165.6" fill="black" transform="rotate(116.56505117707799,40,160)"/>
              <polygon class="arrowhead" points="32,232 20,226.4 20,237.6" fill="black" transform="rotate(90,24,232)"/>
              <g class="text">
                <text x="104" y="36">CEK</text>
                <text x="156" y="36">salt</text>
                <text x="120" y="100">Payload</text>
                <text x="124" y="116">Schedule</text>
                <text x="28" y="180">commit</text>
                <text x="96" y="180">payload</text>
                <text x="152" y="180">acc</text>
                <text x="216" y="180">nonce</text>
                <text x="88" y="196">key</text>
                <text x="152" y="196">key</text>
                <text x="212" y="196">base</text>
                <text x="24" y="260">cmt</text>
                <text x="80" y="260">seg</text>
                <text x="160" y="260">acc</text>
                <text x="224" y="260">nonce</text>
                <text x="92" y="276">key(i)</text>
                <text x="160" y="276">key</text>
                <text x="68" y="356">AEAD</text>
                <text x="168" y="356">contrib</text>
                <text x="80" y="372">Seal(i)</text>
                <text x="168" y="372">(i)</text>
                <text x="60" y="436">ct</text>
                <text x="96" y="436">tag</text>
                <text x="168" y="436">XOR</text>
                <text x="64" y="452">i</text>
                <text x="96" y="452">i</text>
                <text x="144" y="452">all</text>
                <text x="196" y="452">contribs</text>
                <text x="168" y="500">accumulator</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
                  CEK + salt
                      |
                      v
               .-----------.
               |  Payload  |
               |  Schedule |
               '-----------'
            /     |      |     \
           v      v      v      v
       commit  payload  acc    nonce
                key     key    base
         |       |       |      |
         v       v       v      v
       .---.  .------.  .---.  .-----.
       |cmt|  |seg   |  |acc|  |nonce|
       |   |  |key(i)|  |key|  |     |
       '---'  '------'  '---'  '-----'
                 |         |
                 v         v
            .--------. .--------.
            |AEAD    | |contrib |
            |Seal(i) | |  (i)   |
            '--------' '--------'
              |   |        |
              v   v        v
             ct  tag ---> XOR
              i   i    all contribs
                           |
                           v
                      accumulator
]]></artwork>
        </artset>
      </figure>
      <section anchor="parameters">
        <name>Parameters</name>
        <t>A raAE parameter set is a tuple (AEAD, KDF, protocol_id, segment_size,
epoch_length, nonce_mode, aad_label).</t>
        <dl>
          <dt>AEAD:</dt>
          <dd>
            <t>An authenticated encryption with associated data algorithm
satisfying the interface of <xref target="RFC5116"/>, with Nk-octet keys,
Nn-octet nonces, and Nt-octet authentication tags.</t>
          </dd>
          <dt>KDF:</dt>
          <dd>
            <t>A key derivation function supporting the abstract interface defined
in <xref target="key-derivation"/>.  Two-stage KDFs (HKDF) use Extract and
Expand; single-stage KDFs (extendable-output function, XOF) use a
direct derivation call.</t>
          </dd>
          <dt>protocol_id:</dt>
          <dd>
            <t>An application-chosen octet string that binds all derived values to
a specific protocol version.  Applications <bcp14>MUST NOT</bcp14> use the profile
identifier "raAE-v1" as their protocol_id; the test vectors in this
document use it for illustration only.  A real application would use
a value identifying itself (for example, "myapp-backup-v1").</t>
          </dd>
          <dt>segment_size:</dt>
          <dd>
            <t>A positive integer that is a power of two and at least 4096 octets.
Power-of-two sizes align to memory page boundaries and simplify
offset arithmetic.  All segments except possibly the last have
exactly this many octets of plaintext.  The segment size <bcp14>MUST</bcp14> remain
within the per-invocation plaintext limit of the chosen AEAD (for
example, 2^36 - 32 octets for AES-GCM per <xref target="NIST-SP-800-38D"/>).  A
zero-length plaintext produces a single segment of length 0 with
is_final = 1.</t>
          </dd>
          <dt>epoch_length:</dt>
          <dd>
            <t>A non-negative integer r, or absent (meaning the parameter is
omitted from the tuple entirely, not set to a sentinel value).  When
present, each epoch covers exactly 2^r consecutive segments starting
at a multiple of 2^r.  When absent, all segments use the payload key
directly and epoch derivation is skipped: segment_key(i) =
payload_key for all i.  When epoch_length = 0, each segment gets a
unique derived key.  The value r <bcp14>MUST</bcp14> be in the range 0 to 63
inclusive.  Implementations <bcp14>MUST</bcp14> reject r &gt;= 64.</t>
          </dd>
          <dt>nonce_mode:</dt>
          <dd>
            <t>One of the strings "random", "derived", or "plaintext-bound".  See
<xref target="nonce-generation"/>.  When nonce_mode is "derived", epoch_length
<bcp14>MUST</bcp14> be absent.  When nonce_mode is "random" or "plaintext-bound"
and the AEAD uses 96-bit nonces, epoch_length <bcp14>MUST</bcp14> be present to
bound per-key nonce usage.</t>
          </dd>
          <dt>aad_label:</dt>
          <dd>
            <t>A protocol-chosen ASCII string used as the first argument to Encode
in segment_aad construction.  See <xref target="segment-aad"/>.</t>
          </dd>
        </dl>
        <t>Two sizes are determined by the chosen algorithms rather than by the
parameter set directly.</t>
        <dl>
          <dt>Nh:</dt>
          <dd>
            <t>The hash or PRF output size for the KDF, in octets.  This is also
the size of each accumulator contribution and of the acc_key.</t>
          </dd>
          <dt>commitment_length:</dt>
          <dd>
            <t>A positive integer, defaulting to Nh, specifying the length of the
key commitment prefix in octets.</t>
          </dd>
        </dl>
      </section>
      <section anchor="components">
        <name>Components</name>
        <t>An encrypted message is built from three input values, four payload
schedule outputs, per-segment values derived from those outputs, and a
content-level integrity value.</t>
        <section anchor="inputs">
          <name>Inputs</name>
          <t>Three values are provided by the caller or constructed from parameters.</t>
          <dl>
            <dt>CEK:</dt>
            <dd>
              <t>A 32-octet uniform random Content Encryption Key generated fresh for
each message.</t>
            </dd>
            <dt>salt:</dt>
            <dd>
              <t>A per-content random value of Nh octets, generated fresh for each
message.  The salt separates payload schedule outputs across messages
even when the CEK is reused.  An application that writes a new
message <bcp14>MUST</bcp14> generate a fresh salt.  Reusing a salt with the same
CEK produces identical payload schedule outputs, causing nonce reuse
in derived mode and correlated nonces in random mode.  An
application extending an existing message <bcp14>MUST</bcp14> reuse the existing
salt.</t>
            </dd>
            <dt>payload_info:</dt>
            <dd>
              <t>A framed encoding of the parameter set context.  When epoch_length
is absent:</t>
            </dd>
          </dl>
          <artwork><![CDATA[
payload_info = Encode(AEAD_id, segment_size_str,
                      KDF_id, salt)
]]></artwork>
          <t>When epoch_length is present:</t>
          <artwork><![CDATA[
payload_info = Encode(AEAD_id, segment_size_str,
                      KDF_id, epoch_length_str, salt)
]]></artwork>
          <t>The exact encoding is defined in <xref target="concrete-framing"/>.</t>
        </section>
        <section anchor="payload-schedule-outputs">
          <name>Payload Schedule Outputs</name>
          <t>Four values are derived from the CEK and payload_info.  They are
computed once per message and fixed for its lifetime.</t>
          <dl>
            <dt>commitment:</dt>
            <dd>
              <t>A commitment_length-octet value derived from the CEK and
payload_info.  Stored at the start of the content to catch key or
parameter mismatches before decryption begins.</t>
            </dd>
            <dt>payload_key:</dt>
            <dd>
              <t>An Nk-octet key derived from the CEK and payload_info.  Used
directly as the segment key when epoch_length is absent, or as the
root for epoch key derivation.</t>
            </dd>
            <dt>acc_key:</dt>
            <dd>
              <t>An Nh-octet key derived from the CEK and payload_info.  Used to
compute per-segment accumulator contributions.</t>
            </dd>
            <dt>nonce_base:</dt>
            <dd>
              <t>An Nn-octet value derived from the CEK and payload_info, used in
derived nonce mode only.</t>
            </dd>
          </dl>
        </section>
        <section anchor="per-segment-values">
          <name>Per-Segment Values</name>
          <t>Each segment i has a set of derived values produced from the payload
schedule outputs and the segment index.</t>
          <dl>
            <dt>epoch_key(i):</dt>
            <dd>
              <t>An Nk-octet key for the epoch containing segment i, derived from the
payload_key and the epoch index.  Present only when epoch_length is
specified.</t>
            </dd>
            <dt>segment_key(i):</dt>
            <dd>
              <t>The AEAD key for segment i.  Equal to epoch_key(i) when epoch_length
is present; equal to payload_key otherwise.</t>
            </dd>
            <dt>nonce(i):</dt>
            <dd>
              <t>The Nn-octet nonce for AEAD operations on segment i.  Derived per
the chosen nonce_mode.</t>
            </dd>
            <dt>segment_aad(i, is_final):</dt>
            <dd>
              <t>Per-segment additional authenticated data that binds the segment to
its index and whether it is the final segment.</t>
            </dd>
            <dt>tag(i):</dt>
            <dd>
              <t>The Nt-octet AEAD authentication tag for segment i, produced by the
AEAD Seal operation.</t>
            </dd>
          </dl>
        </section>
        <section anchor="content-level-integrity">
          <name>Content-Level Integrity</name>
          <t>Two values provide integrity across the full set of segments.</t>
          <dl>
            <dt>contrib(i):</dt>
            <dd>
              <t>An Nh-octet accumulator contribution for segment i, derived from
acc_key, the segment index, and tag(i).</t>
            </dd>
            <dt>accumulator:</dt>
            <dd>
              <t>An Nh-octet content-level integrity value equal to the aggregation of
all contrib(i) values across all segments.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="key-derivation">
        <name>Key Derivation Structure</name>
        <t>A message's entire key hierarchy grows from two random values: the
32-octet CEK and the per-content salt.  All other keys are derived
deterministically from these two values, so there is no per-segment key
state to manage or synchronize.  The abstract interface below exists
so that raAE can support both two-stage (HKDF) and single-stage (XOF)
KDF families; <xref target="concrete"/> defines the only current concrete framing.
All key material flows through this interface:</t>
        <artwork><![CDATA[
KDF(protocol_id, label, ikm, info, L)
]]></artwork>
        <ul spacing="normal">
          <li>
            <t>protocol_id: binds the output to a specific protocol
version and application context.</t>
          </li>
          <li>
            <t>label: a unique ASCII string identifying the
derivation role.</t>
          </li>
          <li>
            <t>ikm: input keying material, provided as a single
octet string or an ordered list of octet strings.</t>
          </li>
          <li>
            <t>info: context information, provided as a single
octet string or an ordered list of octet strings.</t>
          </li>
          <li>
            <t>L: the requested output length in octets.</t>
          </li>
        </ul>
        <t>The KDF <bcp14>MUST</bcp14> satisfy these requirements.</t>
        <t>Outputs <bcp14>MUST</bcp14> be computationally indistinguishable from random given an
unknown ikm, under the assumption that the underlying hash or PRF is a
secure pseudorandom function.</t>
        <t>The framing of (protocol_id, label, ikm, info, L) into the octet
string input of the underlying primitive <bcp14>MUST</bcp14> be injective: each lp16
field is self-delimiting, so the concatenation can be uniquely parsed
regardless of the number of arguments.  Distinct input tuples <bcp14>MUST NOT</bcp14>
produce the same primitive input.  The concrete framing requirements are
specified in <xref target="framing"/>.</t>
        <t>The requested output length L <bcp14>MUST</bcp14> be committed in the primitive input.
This prevents attacks where an adversary truncates a longer output to
obtain a valid shorter one.</t>
        <t>The protocol_id <bcp14>MUST</bcp14> appear in the primitive input.  This prevents
cross-protocol reuse of derived values.</t>
        <t>Each label used within a protocol version <bcp14>MUST</bcp14> be distinct across all
derivation roles.</t>
        <t>The label appears in both the Extract and Expand phases of the two-stage
KDF as a defensive redundancy measure: if either phase is weak in
isolation, the label binding in the other phase preserves domain
separation.  Implementations <bcp14>MAY</bcp14> amortize the Extract computation
internally when deriving multiple outputs from the same protocol_id,
label, and ikm.</t>
        <section anchor="payload-schedule-derivation">
          <name>Payload Schedule Derivation</name>
          <t>Four values are derived from the CEK and per-content salt.  The
commitment allows early rejection of a wrong key.  The payload key
encrypts segments (directly, or via epoch keys).  The accumulator key
authenticates the set of segment tags.  The nonce base (derived-mode
only) seeds deterministic per-segment nonces.</t>
          <artwork><![CDATA[
commitment  = KDF(protocol_id, "commit",
                  [CEK], [payload_info],
                  commitment_length)
payload_key = KDF(protocol_id, "payload_key",
                  [CEK], [payload_info], Nk)
acc_key     = KDF(protocol_id, "acc_key",
                  [CEK], [payload_info], Nh)
]]></artwork>
          <t>For derived nonce mode, a nonce base is also derived:</t>
          <artwork><![CDATA[
nonce_base  = KDF(protocol_id, "nonce_base",
                  [CEK], [payload_info], Nn)
]]></artwork>
        </section>
        <section anchor="epoch-key-derivation">
          <name>Epoch Key Derivation</name>
          <t>AES-256-GCM uses 96-bit nonces.  The birthday bound for nonce collisions
under a single key becomes a practical concern at around 2^32
encryptions.  For rewritable content, this limit can be reached through
repeated modifications to the same segments.  Epoch keys partition the
nonce space: each epoch key covers at most 2^r segment positions
(initial writes plus rewrites), so the per-key invocation count is
bounded regardless of the content's total size.</t>
          <t>When epoch_length = r is specified, the segment key for segment i is an
epoch key derived from the payload key:</t>
          <artwork><![CDATA[
segment_key(i):
  epoch_index = i >> r
  return KDF(protocol_id, "epoch_key",
             [payload_key],
             [uint64(epoch_index)], Nk)
]]></artwork>
          <t>When epoch_length is absent, segment_key(i) = payload_key for all
segment indices i.  Epoch keys implement the parallel external rekeying
pattern of <xref target="RFC8645"/>, adapted for random-access patterns.</t>
        </section>
        <section anchor="key-schedule-design-rationale">
          <name>Key Schedule Design Rationale</name>
          <t>The single-CEK design separates key agreement from content encryption.
Different recipients can hold different wrappings of the same CEK;
adding a recipient requires only a new key-wrapping operation, not
re-encryption of the payload.  The per-content salt makes the payload
schedule unique even when a CEK is reused across messages, which matters
for applications that derive CEKs from passwords or group keys.  A
separate salt lets the encryptor choose it at write time without
coordinating with recipients; a counter in the CEK would require that
coordination.</t>
          <t>Epoch keys exist because 96-bit-nonce AEADs hit their birthday bound
quickly: without epoch partitioning, large content with many rewrites
exhausts the nonce space under a single key.  Rekeying the entire
content would defeat the random-access property, so epoch keys bound
the per-key invocation count without requiring a full re-encryption.</t>
          <t>Labels separate derivation roles: commitment and payload_key share the
same inputs but different labels, making them independent under the PRF
assumption.  Once CEK and salt are chosen the hierarchy is fixed, with
no mutable state to synchronize across writers.</t>
        </section>
      </section>
      <section anchor="nonce-generation">
        <name>Nonce Generation</name>
        <t>Three nonce modes trade off AEAD flexibility, storage cost, and
random number generator (RNG) trust.  The chosen mode is part of the
parameter set and <bcp14>MUST</bcp14> be consistent across all segments of a message.</t>
        <figure anchor="fig-nonce-modes">
          <name>Nonce Generation Modes</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="480" viewBox="0 0 480 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 104,64 L 104,96" fill="none" stroke="black"/>
                <path d="M 344,72 L 344,80" fill="none" stroke="black"/>
                <path d="M 384,120 L 384,160" fill="none" stroke="black"/>
                <path d="M 392,96 L 392,112" fill="none" stroke="black"/>
                <path d="M 384,112 L 408,112" fill="none" stroke="black"/>
                <path d="M 360,144 L 384,144" fill="none" stroke="black"/>
                <path d="M 400,112 C 391.16936,112 384,119.16936 384,128" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="416,112 404,106.4 404,117.6" fill="black" transform="rotate(0,408,112)"/>
                <polygon class="arrowhead" points="112,96 100,90.4 100,101.6" fill="black" transform="rotate(90,104,96)"/>
                <g class="text">
                  <text x="32" y="36">Random:</text>
                  <text x="188" y="36">Derived:</text>
                  <text x="372" y="36">Plaintext-Bound:</text>
                  <text x="196" y="52">nonce_base</text>
                  <text x="44" y="68">Random(Nn)</text>
                  <text x="96" y="68">-</text>
                  <text x="176" y="68">|</text>
                  <text x="348" y="68">Hash(pt_i)</text>
                  <text x="168" y="84">XOR</text>
                  <text x="224" y="84">uint64(i)</text>
                  <text x="176" y="100">|</text>
                  <text x="336" y="100">pt_digest</text>
                  <text x="384" y="100">-</text>
                  <text x="112" y="116">nonce_i</text>
                  <text x="184" y="116">nonce_i</text>
                  <text x="340" y="116">KDF(...)</text>
                  <text x="448" y="116">pt_hash</text>
                  <text x="324" y="148">Random</text>
                  <text x="392" y="180">nonce_i</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Random:            Derived:           Plaintext-Bound:
                   nonce_base
Random(Nn) -.        |                Hash(pt_i)
            |      XOR uint64(i)          |
            v        |               pt_digest -.
          nonce_i  nonce_i            KDF(...) -+-> pt_hash
                                               |
                                     Random ---+
                                               |
                                             nonce_i
]]></artwork>
          </artset>
        </figure>
        <section anchor="random-stored-nonces-noncemode-random">
          <name>Random Stored Nonces (nonce_mode = "random")</name>
          <t>Each segment gets an independent random nonce:</t>
          <artwork><![CDATA[
nonce(i) = Random(Nn)
]]></artwork>
          <t>The nonce is generated fresh on initial write and on each rewrite of
that segment.  Each segment's nonce is stored in per-segment metadata
and <bcp14>MUST</bcp14> be accessible to any reader that decrypts individual segments.</t>
          <t>This mode requires a functioning cryptographically secure pseudorandom
number generator (CSPRNG).  The nonce collision probability across
independently generated per-segment nonces follows the standard birthday
bound; see <xref target="aead-usage-limits"/>.</t>
        </section>
        <section anchor="derived-nonces-noncemode-derived">
          <name>Derived Nonces (nonce_mode = "derived")</name>
          <t>For MRAE AEADs, nonces are derived deterministically from the payload
schedule.  The AEAD nonce size Nn <bcp14>MUST</bcp14> be at least 8 octets.  The XOR
operation is applied to the last 8 octets of nonce_base, with the
remaining octets unchanged:</t>
          <artwork><![CDATA[
nonce(i) = nonce_base[0:Nn-8]
           || (nonce_base[Nn-8:Nn] XOR uint64(i))
]]></artwork>
          <t>No per-segment nonce storage is required.</t>
          <t>Nonce reuse on rewrite is tolerated by the MRAE AEAD.  The degraded
security is deterministic encryption (equality leakage), not plaintext
recovery.  Applications <bcp14>MUST</bcp14> use an MRAE AEAD such as
AES-256-GCM-SIV (<xref target="RFC8452"/>) when using derived nonce mode.</t>
        </section>
        <section anchor="plaintext-bound-nonces-noncemode-plaintext-bound">
          <name>Plaintext-Bound Nonces (nonce_mode = "plaintext-bound")</name>
          <t>The plaintext-bound construction mixes plaintext content into nonce
generation to defend against random number generator state duplication.
It uses two passes.</t>
          <t>Pass 1 compresses the plaintext to a fixed-size digest and then derives
a collision-resistant hash bound to the encryption parameters.  The
compression step avoids passing the full segment (up to 65536 octets)
through lp16, which is limited to 65535 octets.  The salt is excluded
because an application may need to compute pt_hash before choosing an
output destination (for example, during content-addressed
deduplication):</t>
          <artwork><![CDATA[
pt_digest(i) = Hash(plaintext_i)
encryption_params = Encode(AEAD_id, segment_size_str,
                           KDF_id)
pt_hash(i) = KDF(protocol_id, "pt-nonce",
                 [pt_digest(i)],
                 [encryption_params], Nh)
]]></artwork>
          <t>Hash is the hash function underlying the KDF (SHA-256 for HKDF-SHA-256).
The pt_digest is always Nh octets, well within the lp16 limit.</t>
          <t>Pass 2 mixes fresh random material with the payload key and the
plaintext commitment:</t>
          <artwork><![CDATA[
nonce_ctx = Encode(protocol_id,
    uint64(i), pt_hash(i))
nonce(i) = KDF(protocol_id, "nonce",
    [Random(Nn), payload_key],
    [payload_info, nonce_ctx], Nn)
]]></artwork>
          <t>Pass 1 is a deterministic function of the plaintext and algorithm
parameters; it targets collision resistance, not PRF security.  Pass 2
mixes fresh random material with the payload key and the plaintext
commitment.  When an RNG produces duplicated state (for example, from a
virtual machine snapshot), two calls with different plaintexts at the
same segment index produce different nonces because pt_hash(i) differs.
Two calls with the same plaintext at the same index produce the same
(key, nonce, aad) triple under RNG duplication, resulting in
deterministic encryption: the ciphertexts are identical, revealing that
the plaintexts are equal.  No additional information beyond this
equality is leaked.</t>
          <t>For plaintext-bound rewrites, the procedure is:</t>
          <ol spacing="normal" type="1"><li>
              <t>Recompute pt_hash(i) with the new plaintext.</t>
            </li>
            <li>
              <t>Derive a fresh nonce(i) using the new pt_hash(i)
  and a new Random(Nn).</t>
            </li>
            <li>
              <t>Seal the new plaintext under the new nonce.</t>
            </li>
            <li>
              <t>Update the accumulator as in <xref target="encrypt-decrypt"/>.</t>
            </li>
          </ol>
        </section>
        <section anchor="nonce-mode-design-rationale">
          <name>Nonce Mode Design Rationale</name>
          <t>Random mode is simplest but trusts the CSPRNG completely.  Derived mode
removes that trust entirely at the cost of requiring an MRAE AEAD.
Plaintext-bound mode splits the difference: it mixes plaintext into the
nonce, so different content at the same index gets different nonces even
under RNG duplication.  The cost is one hash of the full segment (for
pt_digest) plus two short KDF calls, comparable in time to the AEAD
encryption itself.</t>
        </section>
      </section>
      <section anchor="hedged-randomness">
        <name>Hedged Randomness (Optional)</name>
        <t>When a long-term symmetric key sk of at least Nh octets is available to
the encryptor, implementations <bcp14>SHOULD</bcp14> mix it into random generation
using the hedging pattern of <xref target="RFC8937"/>.  If only an asymmetric private
key is available, it <bcp14>MUST</bcp14> first be processed through a KDF to produce a
uniform symmetric key.</t>
        <artwork><![CDATA[
hedge_key = KDF(protocol_id, "hedge", sk, "", Nh)

HedgedRandom(n, label):
  return KDF(protocol_id, label,
      [hedge_key, Random(n)], "", n)
]]></artwork>
        <t>HedgedRandom output depends on both the CSPRNG and sk, so a weak CSPRNG
alone cannot predict it.  Hedging does not help when the CSPRNG state
itself is duplicated (VM snapshots, fork without reseed); identical
CSPRNG output still produces identical HedgedRandom output.  The
plaintext-bound nonce mode (<xref target="nonce-generation"/>) addresses that
distinct threat and is orthogonal to hedging; applications with a
long-term key <bcp14>SHOULD</bcp14> apply both.</t>
      </section>
      <section anchor="segment-aad">
        <name>Segment AAD</name>
        <t>Each segment is encrypted with additional authenticated data (AAD)
that binds it to its position in the content and to whether it is the
final segment:</t>
        <artwork><![CDATA[
segment_aad(i, is_final):
  return Encode(aad_label,
      uint64(i), uint8(is_final))
]]></artwork>
        <t>The aad_label is the protocol-chosen label from the parameter set.  The
segment index i is encoded as a big-endian 8-octet integer, and is_final
is 1 for the last segment and 0 for all others.</t>
        <t>The salt is not included in the AAD because it is already bound into
segment_key via the payload schedule; different messages produce
different segment keys even at the same index.  Transposing two
segments within a message fails because the AAD at each position
encodes the expected index.
Truncation is detectable: a reader that sees is_final = 0 knows more
data must follow.  Extension is also caught: appending after a segment
marked is_final = 1 either invalidates the original final segment on
re-read or produces a ciphertext that cannot verify.  Encoding both the
index and the finality bit in the AAD, rather than relying on the
accumulator alone, catches these attacks per-segment without requiring
the reader to hold all tags before decrypting any one of them.</t>
      </section>
      <section anchor="commitment-aggregation">
        <name>Commitment and Aggregation</name>
        <t>Per-segment AEAD alone has two blind spots.  Without a commitment, a
reader with the wrong key attempts decryption of every segment before
discovering the mismatch, leaking timing information in the process.
Without an accumulator, an adversary who controls storage can replace
segment 3's ciphertext with a different valid ciphertext for index 3
(from another message encrypted under the same key), and the per-segment
AEAD check will pass.  The commitment catches the first; the accumulator
catches the second.</t>
        <section anchor="framework-commitment">
          <name>Key Commitment</name>
          <t>The commitment is a commitment_length-octet value derived from the CEK
and payload_info:</t>
          <artwork><![CDATA[
commitment = KDF(protocol_id, "commit",
                 [CEK], [payload_info],
                 commitment_length)
]]></artwork>
          <t>Before decrypting any segment, a reader derives the expected commitment
from the CEK and payload_info and compares it octet-for-octet with
the stored value.  A mismatch indicates a wrong key, wrong parameter
set, or corrupted header.</t>
          <t>The commitment achieves CMT-1 security (as defined in <xref target="RFC9771"/>).
Under the PRF assumption on the KDF, the probability that any other
(CEK, payload_info) pair produces the same commitment is at most
2^(-8 * commitment_length), which is 2^(-256) for commitment_length
= 32.  Across q key queries the birthday bound gives a collision
probability of at most q^2 / 2^(8 * commitment_length + 1).</t>
          <t>Several AEADs including AES-GCM (<xref target="NIST-SP-800-38D"/>) and
ChaCha20-Poly1305 (<xref target="RFC8439"/>) lack strong native key commitment.  An
external PRF-based commitment delivers uniform collision resistance
regardless of the AEAD choice.</t>
          <t>FLOE (<xref target="FLOE"/>) defines ra-CMT, a commitment notion for raAE schemes
that is independent of the underlying AEAD's commitment properties.
raAE achieves ra-CMT because the PRF-based commitment is checked
before any AEAD operation: a wrong key is rejected at the commitment
step, so the AEAD's lack of native key commitment cannot be exploited.</t>
          <t>For reference, CMT-4 (<xref target="RFC9771"/>) depends on AEAD-specific properties
beyond indistinguishability under chosen-ciphertext attack (IND-CCA2).
AES-256-GCM and ChaCha20-Poly1305 do not achieve CMT-4;
AES-256-GCM-SIV does.  raAE's ra-CMT guarantee holds regardless, as
long as the commitment check is not bypassed.</t>
        </section>
        <section anchor="aggregation">
          <name>Aggregation</name>
          <t>The accumulator binds all segment authentication tags into a single
Nh-octet content-level integrity value.</t>
          <t>The per-segment accumulator contribution is:</t>
          <artwork><![CDATA[
contrib(i) = KDF(protocol_id, "acc_contrib",
                 [acc_key],
                 [uint64(i), tag(i)], Nh)
]]></artwork>
          <t>The aggregation function used to combine contributions <bcp14>MUST</bcp14> be
commutative, associative, and support O(1) incremental update when a
single segment is rewritten.  Formally, the aggregation function Agg
over Nh-octet values <bcp14>MUST</bcp14> satisfy:</t>
          <ul spacing="normal">
            <li>
              <t>Agg(a, b) = Agg(b, a) for all a, b.</t>
            </li>
            <li>
              <t>Agg(Agg(a, b), c) = Agg(a, Agg(b, c)) for all
a, b, c.</t>
            </li>
            <li>
              <t>There exists an identity element e such that
Agg(a, e) = a for all a.</t>
            </li>
            <li>
              <t>Given the current accumulator, the old contribution,
and the new contribution, the updated accumulator is computable in
O(1) time.</t>
            </li>
          </ul>
          <t>The accumulator for a message with N segments is:</t>
          <artwork><![CDATA[
accumulator = Agg(contrib(0), contrib(1),
                  ..., contrib(N-1))
]]></artwork>
          <t>When segment i is rewritten, the accumulator is updated as:</t>
          <artwork><![CDATA[
accumulator = Agg(Agg(accumulator,
                      inverse(old_contrib(i))),
                  new_contrib(i))
]]></artwork>
          <t>For XOR-based aggregation (the concrete instantiation defined in
<xref target="concrete"/>), this simplifies to:</t>
          <artwork><![CDATA[
accumulator = accumulator XOR old_contrib
              XOR new_contrib
]]></artwork>
          <t>A Merkle tree of tags would give O(log N) per-segment verification, but
updates cost O(log N) hashes and require storing the tree.  XOR-of-PRF
trades per-segment verification (which requires all tags) for O(1)
update and no auxiliary storage.  For a rewrite-heavy workload, O(1)
update matters more.  To rewrite segment i, compute contrib(i) from the
old tag (which is already stored alongside the ciphertext), XOR it out
of the current accumulator, encrypt the new plaintext to get a new tag,
compute the new contrib(i), and XOR it in.  No other segment is read or
decrypted; the accumulator update touches only the rewritten segment's
metadata.  A hash chain would force re-reading all prior tags on every
rewrite, defeating the random-access property.  The PRF-keyed
contribution prevents an adversary without acc_key from predicting any
contrib(i) value, so forging a valid accumulator for a modified set of
segment tags requires breaking the KDF's PRF security.  The accumulator
does not bind the total segment count; see <xref target="accumulator-limitations"/>
for the implications and required mitigations.</t>
        </section>
      </section>
      <section anchor="encrypt-decrypt">
        <name>Encryption and Decryption</name>
        <t>Three operations use the framework above.</t>
        <section anchor="encryption">
          <name>Encryption</name>
          <t>Given a CEK, a fresh salt, a parameter set, and a plaintext P split into
segments P_0 through P_{N-1}, encryption works in two phases.</t>
          <t>First, derive commitment, payload_key, acc_key (and nonce_base for
derived mode) from the payload schedule.  Store the commitment as the
first commitment_length octets of output.</t>
          <t>Then, for each segment i from 0 to N-1:</t>
          <ol spacing="normal" type="1"><li>
              <t>Compute segment_key(i) per <xref target="key-derivation"/>.</t>
            </li>
            <li>
              <t>Compute nonce(i) per the chosen nonce_mode
  (<xref target="nonce-generation"/>).</t>
            </li>
            <li>
              <t>Set is_final = 1 if i = N-1, else set is_final = 0.</t>
            </li>
            <li>
              <t>Compute aad = segment_aad(i, is_final).</t>
            </li>
            <li>
              <t>Compute C_i = AEAD.Seal(segment_key(i), nonce(i),
  aad, P_i).  The ciphertext ct_i is the first len(P_i) octets of C_i
  and tag_i is the final Nt octets.  This assumes
  C_i = ct_i || tag_i per <xref target="RFC5116"/> Section 2.1, which holds for
  all AEADs profiled in <xref target="concrete-algorithms"/>.</t>
            </li>
            <li>
              <t>Store nonce(i) (random mode only), ct_i, and tag_i.</t>
            </li>
            <li>
              <t>Compute contrib(i) = KDF(protocol_id, "acc_contrib",
  [acc_key], [uint64(i), tag_i], Nh).</t>
            </li>
          </ol>
          <t>After all segments are encrypted, compute the accumulator as the XOR of
all contrib values:</t>
          <artwork><![CDATA[
accumulator = contrib(0) XOR contrib(1)
              XOR ... XOR contrib(N-1)
]]></artwork>
          <t>Store the accumulator alongside the commitment and segment data.</t>
        </section>
        <section anchor="decryption-of-segment-i">
          <name>Decryption of Segment i</name>
          <t>Given the CEK, salt, parameter set, segment index i, finality status,
and the stored ciphertext for segment i:</t>
          <ol spacing="normal" type="1"><li>
              <t>Derive commitment, payload_key, acc_key from the
  CEK and salt via the payload schedule.</t>
            </li>
            <li>
              <t>Verify that the stored commitment equals the derived
  commitment.  If they differ, the implementation <bcp14>MUST NOT</bcp14> proceed
  with decryption, <bcp14>SHOULD</bcp14> zeroize derived key material, and <bcp14>MUST</bcp14>
  return an error to the caller.</t>
            </li>
            <li>
              <t>Optionally, verify the stored accumulator against
  the derived contributions from all available segment tags before
  proceeding to segment decryption.  Applications that have all
  segment tags available <bcp14>SHOULD</bcp14> perform this check.  A reader
  decrypting a single segment without verifying the accumulator gets
  per-segment AEAD integrity only; cross-segment integrity (detecting
  substitution or removal) requires accumulator verification.</t>
            </li>
            <li>
              <t>Compute segment_key(i) and nonce(i).</t>
            </li>
            <li>
              <t>Compute aad = segment_aad(i, is_final).</t>
            </li>
            <li>
              <t>Compute P_i = AEAD.Open(segment_key(i), nonce(i),
  aad, ct_i || tag_i) per <xref target="RFC5116"/> Section 2.2.  Return a
  decryption error if verification fails.</t>
            </li>
          </ol>
          <t>Decryption can fail in three distinguishable ways: commitment mismatch
(wrong key or parameters), AEAD verification failure (corrupted or
tampered segment), and accumulator mismatch (segment set modified).
Implementations <bcp14>SHOULD</bcp14> report these as distinct error conditions for
local diagnosis, but <bcp14>SHOULD</bcp14> return a single opaque error to untrusted
callers to avoid leaking an oracle (for example, distinguishing "wrong
key" from "tampered segment" over a network).</t>
        </section>
        <section anchor="rewriting-segment-i">
          <name>Rewriting Segment i</name>
          <t>The rewrite procedure assumes the caller has already verified the
commitment or otherwise confirmed it holds the correct CEK.  A rewrite
under the wrong key produces unreadable ciphertext and corrupts the
accumulator; the error is detectable only on a subsequent read.</t>
          <t>Rewriting a segment does not require reading or decrypting any other
segment.  The old tag is already stored alongside the old ciphertext.
For random nonce mode:</t>
          <ol spacing="normal" type="1"><li>
              <t>Read the old tag_i from storage.</t>
            </li>
            <li>
              <t>Compute old_contrib = KDF(protocol_id, "acc_contrib",
  [acc_key], [uint64(i), old_tag_i], Nh).</t>
            </li>
            <li>
              <t>Generate a fresh nonce(i) = Random(Nn).</t>
            </li>
            <li>
              <t>Compute C_i = AEAD.Seal(segment_key(i), nonce(i),
  segment_aad(i, is_final), new_P_i).  Extract new_ct_i and new_tag_i.</t>
            </li>
            <li>
              <t>Compute new_contrib = KDF(protocol_id, "acc_contrib",
  [acc_key], [uint64(i), new_tag_i], Nh).</t>
            </li>
            <li>
              <t>Update the accumulator:
  acc = acc XOR old_contrib XOR new_contrib.</t>
            </li>
            <li>
              <t>Store the new nonce(i), new_ct_i, new_tag_i, and the
  updated accumulator.</t>
            </li>
          </ol>
          <t>For derived nonce mode, nonce(i) is computed per <xref target="nonce-generation"/>
and is the same on rewrite as on initial encryption.  The MRAE AEAD
tolerates this reuse.  The accumulator update proceeds identically.</t>
          <t>Note that the accumulator cannot be validated during an in-place
rewrite.  Validation requires computing contrib(j) for every segment j
and checking that their XOR matches the stored accumulator, which means
reading all tags.  During a rewrite the application trusts the stored
accumulator and applies the delta.  Full validation is a separate
operation that an application performs when it has access to all tags
(for example, on a full read or an integrity audit).</t>
          <figure anchor="fig-acc-update">
            <name>Accumulator Update on Segment Rewrite</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="400" viewBox="0 0 400 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 344,144 L 344,160" fill="none" stroke="black"/>
                  <path d="M 88,32 L 104,32" fill="none" stroke="black"/>
                  <path d="M 272,32 L 288,32" fill="none" stroke="black"/>
                  <path d="M 104,64 L 120,64" fill="none" stroke="black"/>
                  <path d="M 256,64 L 336,64" fill="none" stroke="black"/>
                  <path d="M 88,96 L 104,96" fill="none" stroke="black"/>
                  <path d="M 272,96 L 288,96" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="352,160 340,154.4 340,165.6" fill="black" transform="rotate(90,344,160)"/>
                  <polygon class="arrowhead" points="344,64 332,58.4 332,69.6" fill="black" transform="rotate(0,336,64)"/>
                  <polygon class="arrowhead" points="296,96 284,90.4 284,101.6" fill="black" transform="rotate(0,288,96)"/>
                  <polygon class="arrowhead" points="296,32 284,26.4 284,37.6" fill="black" transform="rotate(0,288,32)"/>
                  <polygon class="arrowhead" points="112,96 100,90.4 100,101.6" fill="black" transform="rotate(0,104,96)"/>
                  <polygon class="arrowhead" points="112,32 100,26.4 100,37.6" fill="black" transform="rotate(0,104,32)"/>
                  <g class="text">
                    <text x="40" y="36">old_tag_i</text>
                    <text x="188" y="36">KDF("acc_contrib")</text>
                    <text x="344" y="36">old_contrib</text>
                    <text x="344" y="52">|</text>
                    <text x="48" y="68">accumulator</text>
                    <text x="136" y="68">XOR</text>
                    <text x="200" y="68">old_contrib</text>
                    <text x="352" y="68">XOR</text>
                    <text x="344" y="84">|</text>
                    <text x="40" y="100">new_tag_i</text>
                    <text x="188" y="100">KDF("acc_contrib")</text>
                    <text x="344" y="100">new_contrib</text>
                    <text x="344" y="116">|</text>
                    <text x="280" y="132">XOR</text>
                    <text x="344" y="132">new_contrib</text>
                    <text x="288" y="180">new</text>
                    <text x="352" y="180">accumulator</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
old_tag_i --> KDF("acc_contrib") --> old_contrib
                                          |
accumulator ---XOR old_contrib ---------->XOR
                                          |
new_tag_i --> KDF("acc_contrib") --> new_contrib
                                          |
                                 XOR new_contrib
                                          |
                                          v
                                  new accumulator
]]></artwork>
            </artset>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="framing">
      <name>Framing and Domain Separation Requirements</name>
      <t>The security analysis in <xref target="security-properties"/> assumes that distinct
KDF input tuples produce distinct primitive inputs.  This section states
the requirements that any concrete framing must satisfy for that
assumption to hold.</t>
      <dl>
        <dt>Injectivity:</dt>
        <dd>
          <t>The mapping from the tuple (protocol_id, label, ikm, info, L) to
the octet string input of the underlying hash or KDF primitive <bcp14>MUST</bcp14>
be injective.  Distinct input tuples <bcp14>MUST NOT</bcp14> produce the same
primitive input.</t>
        </dd>
        <dt>Label uniqueness:</dt>
        <dd>
          <t>Each derivation role, including commitment, payload key, accumulator
key, nonce base, epoch key, accumulator contribution, segment nonce,
and hedged nonce, <bcp14>MUST</bcp14> use a distinct label string within each
protocol version.</t>
        </dd>
        <dt>Protocol binding:</dt>
        <dd>
          <t>The protocol_id <bcp14>MUST</bcp14> appear as a distinct component of the KDF
primitive input.  Different application protocols using the same
AEAD and KDF <bcp14>MUST</bcp14> use different protocol_id values to ensure that
derived values from one protocol cannot be confused with those from
another.</t>
        </dd>
        <dt>Output length commitment:</dt>
        <dd>
          <t>The requested output length L <bcp14>MUST</bcp14> be part of the KDF primitive
input.  This prevents attacks in which an adversary attempts to use
a truncated version of a longer derived output as a valid shorter
one.</t>
        </dd>
        <dt>Cross-role isolation:</dt>
        <dd>
          <t>A KDF output for one derivation role, such as payload_key, <bcp14>MUST</bcp14> be
computationally independent of the output for any other role, such
as acc_key, even when derived from the same CEK and payload_info.
This property follows from label uniqueness and PRF security of the
underlying primitive.</t>
        </dd>
      </dl>
    </section>
    <section anchor="security-properties">
      <name>Security Properties and Assumptions</name>
      <t>The adversary can observe all ciphertexts and content metadata, tamper
with individual segments or their ordering, replace the accumulator, and
attempt decryption with chosen keys.  The adversary does not know the
CEK, any derived key, or the per-content salt.  When multiple messages
share a CEK, the per-content salt separates payload schedule outputs
across messages under the PRF assumption; the multi-message advantage
grows linearly in the number of messages.  raAE claims the properties
below against this adversary.</t>
      <t>The security argument assumes that the KDF is a PRF.  For HKDF-SHA-256,
HKDF-Extract with a public salt (protocol_id) acts as a randomness
extractor on the IKM, which follows from the PRF property of the HMAC
compression function per the HKDF analysis <xref target="RFC5869"/>.  All raAE-v1 KDF
outputs are at most Nh octets, so HKDF-Expand makes a single HMAC call
per derivation and the PRF assumption applies directly.</t>
      <section anchor="segment-security">
        <name>Segment Confidentiality and Integrity</name>
        <t>raAE targets ra-ROR security (<xref target="FLOE"/>): the adversary can adaptively
interleave encryption and decryption of segments for different
messages, in any order, across different keys.  The security argument
reduces ra-ROR to the multi-user real-or-random (mu-ROR) security of
the underlying AEAD in three steps.  First, PRF security of the KDF
replaces payload_key with a uniformly random key (one hybrid step per
message, since the salt makes each message's derivation independent).
Second, each epoch_key is similarly replaced.  Third, mu-ROR security
of the AEAD bounds per-segment confidentiality and integrity loss.</t>
        <t>The bound below uses the following variables.  Let F be the number
of messages encrypted under adversary-chosen keys, E the total number
of epoch keys derived across all messages, and S the total number of
segment encryption queries.  For each per-epoch key k, let q_k be
the number of segment encryptions under that key.</t>
        <t>Conditioned on no nonce collisions among segments sharing a key
(the birthday bound for each per-epoch key; see
<xref target="confidentiality-nonce-collision"/>), the advantage is informally
bounded by:</t>
        <artwork><![CDATA[
Adv <= F * 4 * Adv_PRF
       + E * Adv_PRF
       + S * Adv_muROR
       + Adv_acc
]]></artwork>
        <t>where Adv_PRF is the PRF advantage of the KDF, Adv_muROR is the
per-query multi-user real-or-random advantage of the AEAD, and
Adv_acc is the accumulator forgery advantage.</t>
        <t>The total advantage is the sum of the nonce collision probability
and the conditioned bound above.  In derived nonce mode, nonces are
distinct by construction and the collision term vanishes.  In random
nonce mode with epoch_length = 0 (one key per segment), q_k equals
the rewrite count for a single segment position.</t>
        <t>In practice the dominant term is Adv_muROR, which scales with the
total number of segment encryption queries.  The PRF terms (payload
schedule and epoch keys) are typically negligible because F and E are
small relative to S.  The accumulator forgery advantage Adv_acc is
bounded by Adv_PRF + q_forge * 2^(-8 * Nh), where q_forge is
the number of forgery attempts.  Under the PRF assumption each
contrib value is uniformly random, so each attempt succeeds with
probability at most 2^(-256) for Nh = 32.</t>
        <t>A formal proof extending the ra-ROR analysis of FLOE <xref target="FLOE"/> to the
XOR-of-PRF accumulator is in preparation; the bound above captures
the reduction structure.</t>
        <t>Segment ciphertexts are indistinguishable from random under the ra-ROR
definition.  Each segment is authenticated, including its binding to its
index and finality status via the segment AAD.  An adversary cannot
modify, reorder, truncate, or extend the set of segments without causing
an AEAD verification failure on at least one affected segment.</t>
      </section>
      <section anchor="key-commitment">
        <name>Key Commitment</name>
        <t>raAE-v1 uses commitment_length = 32 (Nh octets) and Nt = 16.  The
birthday bound and CMT-1 analysis in <xref target="framework-commitment"/> apply
directly; the per-pair collision probability is at most 2^(-257),
and the per-pair forgery probability is at most 2^(-128).</t>
      </section>
      <section anchor="accumulator-security">
        <name>Accumulator Security</name>
        <t>The accumulator is unforgeable without knowledge of the acc_key.  An
adversary who does not know acc_key cannot predict any individual
contrib(i) value (by the PRF security of the KDF), and therefore cannot
construct a valid accumulator for any set of segment tags that differs
from the authenticated set.</t>
        <t>The XOR-based aggregation is susceptible to cancellation: if an
adversary can control two contributions simultaneously such that their
XOR equals the XOR of two target contributions, a forgery is possible.
However, each contrib(i) is a KDF output keyed by acc_key and bound to
the segment index and AEAD tag.  Without knowledge of acc_key, the
adversary cannot select segment tags to achieve a target contribution
value.</t>
        <t>An adversary who compromises acc_key can forge accumulator values
without recovering any segment plaintext.  Applications <bcp14>MUST</bcp14> treat
acc_key exposure as equivalent to accumulator integrity loss and <bcp14>MUST</bcp14>
rotate the CEK if acc_key compromise is suspected.</t>
      </section>
      <section anchor="aead-usage-limits">
        <name>AEAD Usage Limits</name>
        <t>Two bounds constrain the number of segment operations under a single
key: a confidentiality bound driven by nonce collisions and a per-query
integrity bound driven by forgery probability.  Both are analyzed in
<xref target="I-D.irtf-cfrg-aead-limits"/>.  For raAE with segment_size = 65536
octets (L = 4096 AES blocks, or L' ~ 4099 Poly1305 blocks), the per-key
limits are:</t>
        <section anchor="confidentiality-nonce-collision">
          <name>Confidentiality (Nonce Collision)</name>
          <t>For random nonce mode with Nn-octet nonces and q segment encryptions
under one key, the collision probability follows the birthday bound:</t>
          <artwork><![CDATA[
P(collision) <= q^2 / 2^(8*Nn + 1)
]]></artwork>
          <t>When epoch_length = r is specified, q counts encryptions per epoch key
(initial writes plus rewrites within that epoch), not across the whole
content.  Each epoch key has an independent budget.</t>
          <t>For derived nonce mode, nonces are deterministic and distinct across
segment indices.  Rewriting the same segment reuses the nonce, which is
tolerated by the MRAE AEAD with degradation to equality leakage.</t>
        </section>
        <section anchor="integrity-forgery">
          <name>Integrity (Forgery)</name>
          <t>Each AEAD decryption query gives the adversary a chance to forge a valid
ciphertext.  The forgery advantage per query depends on the AEAD and the
segment size.</t>
          <t>For AES-256-GCM (<xref target="I-D.irtf-cfrg-aead-limits"/> Section 5.1):</t>
          <artwork><![CDATA[
IA <= 2 * v * (L + 1) / 2^128
]]></artwork>
          <t>where v is the number of forgery attempts and L = 4096 blocks per
segment.</t>
          <t>For ChaCha20-Poly1305 (<xref target="I-D.irtf-cfrg-aead-limits"/> Section 5.2):</t>
          <artwork><![CDATA[
IA <= v * (L' + 1) / 2^103
]]></artwork>
          <t>The 2^103 denominator (not 2^128) reflects Poly1305's per-query forgery
bound.  At 65536-octet segments, the integrity limit for
ChaCha20-Poly1305 is tighter than for AES-GCM.</t>
        </section>
        <section anchor="combined-budget">
          <name>Combined Budget</name>
          <t>The binding constraint is whichever limit is reached first.  For random
nonce mode with 96-bit nonces, nonce collision (q &lt; 2^32 at 2^(-32)
target) is typically the binding constraint because integrity limits are
much larger (v &lt; 2^83 for AES-GCM, v &lt; 2^59 for ChaCha20-Poly1305 at the
same target).</t>
          <t>Applications <bcp14>MUST</bcp14> track total segment encryptions per key and rotate the
CEK before exceeding either limit.</t>
        </section>
      </section>
      <section anchor="rewrite-budget-security">
        <name>Rewrite Budget</name>
        <t>The rewrite budget is the per-key limit from <xref target="aead-usage-limits"/>
applied to segment rewrites.  Each rewrite counts as one encryption
query against the confidentiality bound and may trigger decryption
queries (for verification) against the integrity bound.</t>
        <t>With epoch_length = r and Nn = 12, each epoch key covers at most 2^r
segment positions.  The per-epoch nonce budget is independent of other
epochs, so the content's total rewrite capacity scales with the
number of epochs.</t>
        <t>For derived nonce mode, nonce collisions cannot occur from rewrites
because the AEAD is MRAE.  The budget is limited by the AEAD's native
integrity margin (approximately 2^48 messages for AES-256-GCM-SIV per
<xref target="RFC8452"/> Section 6.2) and the application's key rotation policy.</t>
      </section>
    </section>
    <section anchor="concrete">
      <name>raAE-v1 Profile</name>
      <t>This section defines the "raAE-v1" profile.  All values are as defined
in this section unless otherwise specified.  The identifier "raAE-v1" is
reserved for the profile defined in this document.  Applications <bcp14>MUST
NOT</bcp14> reuse it for a different parameter set.</t>
      <section anchor="concrete-algorithms">
        <name>Algorithms</name>
        <table anchor="aead-table">
          <name>Supported AEAD Algorithms</name>
          <thead>
            <tr>
              <th align="left">Algorithm</th>
              <th align="left">Identifier</th>
              <th align="left">Nk</th>
              <th align="left">Nn</th>
              <th align="left">Nt</th>
              <th align="left">MRAE</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">AES-256-GCM</td>
              <td align="left">aes-256-gcm</td>
              <td align="left">32</td>
              <td align="left">12</td>
              <td align="left">16</td>
              <td align="left">No</td>
            </tr>
            <tr>
              <td align="left">ChaCha20-Poly1305</td>
              <td align="left">chacha20-poly1305</td>
              <td align="left">32</td>
              <td align="left">12</td>
              <td align="left">16</td>
              <td align="left">No</td>
            </tr>
            <tr>
              <td align="left">AES-256-GCM-SIV</td>
              <td align="left">aes-256-gcm-siv</td>
              <td align="left">32</td>
              <td align="left">12</td>
              <td align="left">16</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256</td>
              <td align="left">aegis-256</td>
              <td align="left">32</td>
              <td align="left">32</td>
              <td align="left">16</td>
              <td align="left">No</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256X2</td>
              <td align="left">aegis-256x2</td>
              <td align="left">32</td>
              <td align="left">32</td>
              <td align="left">16</td>
              <td align="left">No</td>
            </tr>
          </tbody>
        </table>
        <t>The MRAE column indicates Nonce Misuse-Resistant Authenticated
Encryption as defined in <xref target="RFC9771"/>.  All algorithms provide
<xref target="RFC5116"/> semantics with 16-octet tags (Nt = 16).  AES-256-GCM is
specified in <xref target="NIST-SP-800-38D"/>.  ChaCha20-Poly1305 is specified in
<xref target="RFC8439"/>.  AES-256-GCM-SIV is specified in <xref target="RFC8452"/>.  AEGIS-256
and AEGIS-256X2 are specified in <xref target="I-D.irtf-cfrg-aegis-aead"/>.</t>
        <t>The epoch_length parameter interacts with the AEAD choice.  For
ChaCha20-Poly1305, epoch_length <bcp14>MUST</bcp14> be present because 96-bit nonces
require epoch keys to bound the per-key AEAD invocation count.  For
AES-256-GCM, epoch_length <bcp14>MUST</bcp14> be present for the same reason.  For
AES-256-GCM-SIV, epoch_length <bcp14>MUST NOT</bcp14> be present because
AES-256-GCM-SIV is an MRAE AEAD and uses derived nonce mode where epoch
keys are not applicable.  For AEGIS-256 and AEGIS-256X2, epoch_length
<bcp14>SHOULD NOT</bcp14> be present because 256-bit nonces make collision probability
negligible even without per-epoch key rotation.</t>
        <t>The following table summarizes valid parameter combinations:</t>
        <table anchor="param-table">
          <name>Valid Parameter Combinations</name>
          <thead>
            <tr>
              <th align="left">AEAD</th>
              <th align="left">nonce_mode</th>
              <th align="left">epoch_length</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">AES-256-GCM</td>
              <td align="left">random, pt-bound</td>
              <td align="left">
                <bcp14>MUST</bcp14> present</td>
            </tr>
            <tr>
              <td align="left">ChaCha20-Poly1305</td>
              <td align="left">random, pt-bound</td>
              <td align="left">
                <bcp14>MUST</bcp14> present</td>
            </tr>
            <tr>
              <td align="left">AES-256-GCM-SIV</td>
              <td align="left">derived</td>
              <td align="left">
                <bcp14>MUST NOT</bcp14> present</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256</td>
              <td align="left">random, pt-bound</td>
              <td align="left">
                <bcp14>SHOULD NOT</bcp14> present</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256X2</td>
              <td align="left">random, pt-bound</td>
              <td align="left">
                <bcp14>SHOULD NOT</bcp14> present</td>
            </tr>
          </tbody>
        </table>
        <t>The KDF is HKDF-SHA-256 (<xref target="RFC5869"/>), with Nh = 32.  The framework
supports single-stage KDFs; a future document may define a profile using
one (for example, TurboSHAKE256).</t>
        <t>The supported segment sizes are 16384 and 65536 octets.  Both values are
powers of two and at least 4096 octets.  The 16384-octet size aligns to
16 KiB memory pages (for example, on Apple Silicon).  The 65536-octet
size aligns to 64 KiB (four 16 KiB pages).</t>
        <t>The commitment_length is 32 octets.  The aad_label is "raAE-DATA".</t>
        <t>The per-AEAD usage limits for raAE-v1 follow the analysis in
<xref target="aead-usage-limits"/>.  The table below gives per-key limits for
65536-octet segments at a 2^(-32) advantage target.</t>
        <table anchor="budget-table">
          <name>Per-Key AEAD Usage Limits</name>
          <thead>
            <tr>
              <th align="left">AEAD</th>
              <th align="left">Conf. (q)</th>
              <th align="left">Integ. (v)</th>
              <th align="left">Binding</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">AES-256-GCM</td>
              <td align="left">2^32</td>
              <td align="left">2^83</td>
              <td align="left">conf.</td>
            </tr>
            <tr>
              <td align="left">ChaCha20-Poly1305</td>
              <td align="left">2^32</td>
              <td align="left">2^59</td>
              <td align="left">conf.</td>
            </tr>
            <tr>
              <td align="left">AES-256-GCM-SIV</td>
              <td align="left">(MRAE)</td>
              <td align="left">2^48</td>
              <td align="left">integ.</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256</td>
              <td align="left">2^112</td>
              <td align="left">2^83</td>
              <td align="left">integ.</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256X2</td>
              <td align="left">2^112</td>
              <td align="left">2^83</td>
              <td align="left">integ.</td>
            </tr>
          </tbody>
        </table>
        <t>Confidentiality values are rounded down to the nearest integer exponent.
The "Binding" column indicates which limit is reached first in practice.
For 96-bit-nonce AEADs with random nonces, confidentiality (nonce
collision) binds.  For AEGIS and GCM-SIV, integrity binds because nonce
collisions are either negligible (256-bit nonces) or impossible (derived
nonces).  The AEGIS integrity values are conservative: with 256-bit
tags AEGIS has a stronger per-query forgery bound than AES-GCM, but
raAE-v1 uses 128-bit tags (Nt = 16) where the per-query bound is
comparable.  2^83 (the AES-GCM value) is used as a floor pending a
published per-query analysis in <xref target="I-D.irtf-cfrg-aegis-aead"/>.</t>
        <t>For AES-256-GCM with epoch_length = 0 (one segment per epoch): the
per-epoch budget equals the rewrite count for a single segment position.
At the default segment_size of 65536, a 1 TiB file contains
approximately 2^24 segments.  With epoch_length = 0, each segment can be
rewritten approximately 2^32 times before the per-epoch birthday bound
is reached at the 2^(-32) target.  Epoch keys are fresh for each epoch,
so rewrites in one epoch do not affect the collision bound for other
epochs.</t>
      </section>
      <section anchor="concrete-framing">
        <name>Concrete Framing</name>
        <t>The concrete framing uses a length-prefixed encoding.</t>
        <artwork><![CDATA[
lp16(x) = I2OSP(len(x), 2) || x
Encode(x1, ..., xn) = lp16(x1) || ... || lp16(xn)
]]></artwork>
        <t>Each argument to Encode <bcp14>MUST</bcp14> be at most 65535 octets (the maximum
representable by a 2-octet length prefix).  Encode is injective: each
lp16 field is self-delimiting, so the concatenation can be uniquely
parsed regardless of the number of arguments.  Distinct input tuples
produce distinct output strings.</t>
        <section anchor="two-stage-kdf-sha-256">
          <name>Two-Stage KDF (sha-256)</name>
          <artwork><![CDATA[
KDF(protocol_id, label, ikm, info, L):
  extract_input = Encode(protocol_id, label,
                         ...ikm)
  prk = HKDF-Extract(salt=protocol_id,
                     ikm=extract_input)
  expand_info = Encode(protocol_id, label,
                       ...info, I2OSP(L, 2))
  return HKDF-Expand(prk, expand_info, L)
]]></artwork>
          <t>The notation <tt>...ikm</tt> means each element of the ikm list is a separate
argument to Encode.  When ikm is a single octet string rather than a
list, it is treated as a one-element list.  The protocol_id appears in
both the HKDF salt and the extract_input as a defensive measure; binding
in either position suffices for domain separation.</t>
        </section>
        <section anchor="payload-info-construction">
          <name>Payload Info Construction</name>
          <t>When epoch_length is absent:</t>
          <artwork><![CDATA[
payload_info = Encode(AEAD_id, segment_size_str,
                      KDF_id, salt)
]]></artwork>
          <t>When epoch_length is present:</t>
          <artwork><![CDATA[
payload_info = Encode(AEAD_id, segment_size_str,
                      KDF_id, epoch_length_str, salt)
]]></artwork>
          <t>Each element is an ASCII string or raw octet string.  AEAD_id and KDF_id
are the identifier strings from <xref target="concrete-algorithms"/> (for example,
"aes-256-gcm" and "sha-256").  segment_size_str is the decimal ASCII
representation of the segment size (for example, "65536").
epoch_length_str is the decimal ASCII representation of epoch_length
(for example, "0" or "1").</t>
        </section>
        <section anchor="concrete-segment-aad">
          <name>Segment AAD</name>
          <t>The following instantiates the abstract segment AAD construction
in <xref target="segment-aad"/> for the raAE-v1 profile.</t>
          <artwork><![CDATA[
segment_aad(i, is_final):
  return Encode("raAE-DATA",
                I2OSP(i, 8),
                I2OSP(is_final, 1))
]]></artwork>
        </section>
        <section anchor="labels">
          <name>Labels</name>
          <table anchor="label-table">
            <name>KDF Labels by Role</name>
            <thead>
              <tr>
                <th align="left">Derivation Role</th>
                <th align="left">Label</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Commitment</td>
                <td align="left">"commit"</td>
              </tr>
              <tr>
                <td align="left">Payload key</td>
                <td align="left">"payload_key"</td>
              </tr>
              <tr>
                <td align="left">Accumulator key</td>
                <td align="left">"acc_key"</td>
              </tr>
              <tr>
                <td align="left">Nonce base</td>
                <td align="left">"nonce_base"</td>
              </tr>
              <tr>
                <td align="left">Epoch key</td>
                <td align="left">"epoch_key"</td>
              </tr>
              <tr>
                <td align="left">Accumulator contribution</td>
                <td align="left">"acc_contrib"</td>
              </tr>
              <tr>
                <td align="left">Plaintext-bound hash</td>
                <td align="left">"pt-nonce"</td>
              </tr>
              <tr>
                <td align="left">Plaintext-bound nonce</td>
                <td align="left">"nonce"</td>
              </tr>
              <tr>
                <td align="left">Hedged key</td>
                <td align="left">"hedge"</td>
              </tr>
            </tbody>
          </table>
          <t>Each label is an ASCII string and is distinct from all others.</t>
        </section>
      </section>
      <section anchor="concrete-procedures">
        <name>Concrete Procedures</name>
        <section anchor="concrete-payload-schedule">
          <name>Concrete Payload Schedule</name>
          <t>The following instantiates the abstract payload schedule derivation
in <xref target="key-derivation"/> for the raAE-v1 profile.</t>
          <artwork><![CDATA[
payload_info = Encode(AEAD_id, segment_size_str,
                      KDF_id, salt)           ;; epoch absent
;; or:
payload_info = Encode(AEAD_id, segment_size_str,
                      KDF_id, epoch_length_str,
                      salt)                   ;; epoch present

commitment  = KDF("raAE-v1", "commit",
                  [CEK], [payload_info], 32)
payload_key = KDF("raAE-v1", "payload_key",
                  [CEK], [payload_info], Nk)
acc_key     = KDF("raAE-v1", "acc_key",
                  [CEK], [payload_info], Nh)

;; For derived nonce mode only:
nonce_base  = KDF("raAE-v1", "nonce_base",
                  [CEK], [payload_info], Nn)
]]></artwork>
        </section>
        <section anchor="epoch-key">
          <name>Epoch Key</name>
          <artwork><![CDATA[
segment_key(i):
  if epoch_length absent:
    return payload_key
  epoch_index = i >> epoch_length
  return KDF("raAE-v1", "epoch_key",
             [payload_key],
             [I2OSP(epoch_index, 8)], Nk)
]]></artwork>
        </section>
        <section anchor="segment-encryption">
          <name>Segment Encryption</name>
          <artwork><![CDATA[
key_i     = segment_key(i)
nonce_i   = (per nonce_mode)
is_final  = 1 if i == N-1 else 0
aad       = Encode("raAE-DATA",
                I2OSP(i, 8),
                I2OSP(is_final, 1))
(ct_i, tag_i) = AEAD.Seal(key_i, nonce_i,
                           aad, plaintext_i)
]]></artwork>
        </section>
        <section anchor="accumulator">
          <name>Accumulator</name>
          <artwork><![CDATA[
contrib_i = KDF("raAE-v1", "acc_contrib",
                [acc_key],
                [I2OSP(i, 8), tag_i], Nh)

accumulator = contrib_0 XOR contrib_1
              XOR ... XOR contrib_{N-1}
]]></artwork>
        </section>
        <section anchor="rewrite-update">
          <name>Rewrite Update</name>
          <artwork><![CDATA[
old_contrib = KDF("raAE-v1", "acc_contrib",
                  [acc_key],
                  [I2OSP(i, 8), old_tag], Nh)
new_contrib = KDF("raAE-v1", "acc_contrib",
                  [acc_key],
                  [I2OSP(i, 8), new_tag], Nh)
accumulator = accumulator XOR old_contrib
              XOR new_contrib
]]></artwork>
          <t>Test vectors for the raAE-v1 profile are provided in
<xref target="test-vectors"/>.</t>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>raAE's ra-ROR security (<xref target="FLOE"/>) rests on three assumptions: the AEAD
is mu-ROR secure, the KDF is a secure PRF, and nonces do not collide.
Each subsection below describes a way one of these can fail and what
breaks.</t>
      <section anchor="nonce-misuse">
        <name>Nonce Misuse</name>
        <t>Nonce reuse under a non-MRAE AEAD leaks plaintext: an adversary who
observes two ciphertexts under the same key and nonce recovers the XOR
of the plaintexts (for CTR-based AEADs) and can forge new ciphertexts.</t>
        <t>Random nonce mode depends entirely on the CSPRNG.  If the CSPRNG returns
duplicated state, segments collide.  Derived nonce mode is immune
because nonces are deterministic; the MRAE AEAD degrades to equality
leakage on rewrite, not plaintext recovery.  Plaintext-bound mode
partially defends against CSPRNG duplication: different plaintexts at
the same index produce different nonces because pt_hash differs, but
equal plaintexts still collide.  Implementations that need full
RNG-duplication defense <bcp14>MUST</bcp14> use derived nonce mode with an MRAE AEAD.</t>
      </section>
      <section anchor="parameter-set-mismatch">
        <name>Parameter Set Mismatch</name>
        <t>The nonce_mode and aad_label are not bound into the commitment or
payload_info.  If a reader uses a different nonce_mode or aad_label than
the writer, the per-segment AEAD decryption will fail (wrong nonce or
wrong AAD), but the commitment check will pass because the commitment
depends only on the CEK and payload_info.  Consuming protocols <bcp14>MUST</bcp14>
authenticate the full parameter set, including nonce_mode and aad_label,
before decryption.  In particular, confusing derived for random mode
with a non-MRAE AEAD causes nonce reuse on every rewrite, breaking
confidentiality completely.  Consuming protocols <bcp14>MUST</bcp14> integrity-protect
the nonce_mode before attempting nonce recovery or AEAD decryption.</t>
      </section>
      <section anchor="framing-and-label-errors">
        <name>Framing and Label Errors</name>
        <t>Two classes of implementation error break cross-role isolation.  A
non-injective framing function maps distinct KDF input tuples to the
same primitive input, correlating outputs that should be independent;
implementations <bcp14>MUST</bcp14> verify injectivity per <xref target="framing"/>.  Reusing a
label across roles (for example, "commit" for both commitment and
payload key) has the same effect.  Labels <bcp14>MUST</bcp14> be distinct within a
protocol version, and a new version that changes any derivation <bcp14>MUST</bcp14>
change the protocol_id.</t>
      </section>
      <section anchor="parameter-misuse">
        <name>Parameter Misuse</name>
        <t>The nonce mode and AEAD choice are coupled.  An MRAE AEAD in random
nonce mode wastes its misuse resistance; a non-MRAE AEAD in derived
nonce mode reuses nonces on every rewrite and breaks completely.  Epoch
keys compound the problem: they add a derivation layer that the MRAE
nonce structure does not expect.  The rule is simple.  MRAE AEADs <bcp14>MUST</bcp14>
use derived nonce mode and <bcp14>MUST NOT</bcp14> use epoch keys.  Non-MRAE AEADs <bcp14>MUST</bcp14>
use random or plaintext-bound nonce mode.  See <xref target="concrete-algorithms"/>
for per-AEAD guidance.</t>
      </section>
      <section anchor="accumulator-limitations">
        <name>Accumulator Limitations</name>
        <t>The accumulator has four limitations worth highlighting.</t>
        <t>First, it does not bind the segment count.  An adversary who controls
the storage layer can remove the final segment (the one marked is_final
= 1) and present truncated content where every remaining segment
individually verifies.  Applications <bcp14>MUST</bcp14> store the expected segment
count or content size independently.  A reader decrypting a single
segment without verifying the accumulator and without an independent
segment count cannot detect truncation.  Applications that support
random-access single-segment reads <bcp14>MUST</bcp14> either store the total segment
count alongside the commitment and accumulator, or verify the
accumulator on every read.</t>
        <t>Second, compromising acc_key lets an adversary forge accumulator values
without recovering plaintext (see <xref target="accumulator-security"/>).  Rotate the
CEK if acc_key compromise is suspected.</t>
        <t>Third, without accumulator verification a storage adversary can roll
back individual segments to previously valid versions.  The per-segment
AEAD cannot detect this because the old ciphertext remains valid under
the same key and index.  Applications that skip accumulator verification
on reads accept this rollback risk.</t>
        <t>Fourth, a different aggregation function (not XOR) must still be
commutative, associative, and support O(1) incremental update.  The
XOR-of-PRF instantiation in <xref target="concrete"/> satisfies all three;
substitutes <bcp14>MUST</bcp14> be verified independently.</t>
      </section>
      <section anchor="salt-reuse">
        <name>Salt Reuse</name>
        <t>Reusing a salt with the same CEK across two files produces identical
payload schedule outputs: the same payload_key, acc_key, and (in derived
mode) the same nonces.  An adversary can silently swap segments between
the two files, and both per-segment AEAD checks and the accumulator will
pass.  This is a complete integrity break.  Applications <bcp14>MUST</bcp14> ensure
salt uniqueness per CEK; the <bcp14>MUST</bcp14> at <xref target="components"/> exists for this
reason.</t>
      </section>
      <section anchor="rewrite-hazards">
        <name>Rewrite Hazards</name>
        <t>Two rewrite-related hazards deserve attention.</t>
        <t>Applications <bcp14>MUST</bcp14> track total segment encryptions per key and rotate the
CEK before exceeding the budget in <xref target="rewrite-budget-security"/>.  For
AES-256-GCM with epoch_length = 0, that budget is roughly 2^32 rewrites
per segment position; exceeding it risks nonce collisions and plaintext
recovery.</t>
        <t>When multiple writers rewrite different segments concurrently, each
computes an independent accumulator delta (old_contrib XOR new_contrib).
Applying these deltas is commutative, but the read-modify-write on the
stored accumulator requires coordination.  As a recovery mechanism, the
accumulator can always be rebuilt from scratch by XOR-ing all contrib
values.</t>
        <t>raAE also does not guarantee atomic rewrites.  A segment rewrite touches
four values (nonce, ciphertext, tag, accumulator).  A crash between any
two of these leaves the content inconsistent.  Applications <bcp14>MUST</bcp14> use
write-ahead logging, copy-on-write, or an equivalent mechanism to make
rewrites recoverable.</t>
      </section>
      <section anchor="password-derived-ceks">
        <name>Password-Derived CEKs</name>
        <t>The CEK is specified as a 32-octet uniform random value.  If an
application derives the CEK from a password, the commitment becomes a
deterministic function of the password and payload_info (both known to
the attacker), enabling offline dictionary attacks.  Applications that
derive CEKs from passwords <bcp14>MUST</bcp14> use a memory-hard KDF (such as Argon2id)
to produce the CEK, and <bcp14>MUST NOT</bcp14> use the raw password output as the CEK
without stretching.</t>
      </section>
      <section anchor="constant-time-implementation">
        <name>Constant-Time Implementation</name>
        <t>Several raAE operations handle secret data and <bcp14>MUST</bcp14> be implemented in
constant time to prevent timing side-channels.</t>
        <t>The KDF calls in the payload schedule and epoch key derivation take the
CEK or payload_key as input keying material.  Implementations <bcp14>MUST</bcp14>
ensure that HKDF-Extract and HKDF-Expand execute in constant time with
respect to their key inputs.  In practice this is satisfied by HMAC
implementations that do not branch on key octets.</t>
        <t>The commitment comparison (<xref target="encrypt-decrypt"/>) <bcp14>MUST</bcp14> use a
constant-time octet comparison.  A variable-time comparison leaks the
position of the first differing octet, which reveals partial
information about the derived commitment and thus about the CEK.</t>
        <t>The XOR operations in accumulator update and derived nonce construction
are inherently constant-time on standard hardware.  No special care is
needed for these.</t>
        <t>AEAD Seal and Open operations inherit the constant-time requirements of
the underlying AEAD.  Implementations <bcp14>SHOULD</bcp14> use AEAD libraries that
document constant-time guarantees.</t>
      </section>
      <section anchor="properties-not-provided">
        <name>Properties Not Provided</name>
        <t>raAE protects segment content and binds segments together.  It
deliberately does not address four concerns that belong to the consuming
protocol.</t>
        <t>The CEK must remain available as long as any reader needs access, so
there is no forward secrecy.  Ciphertexts are not bound to any sender
identity; a signing or MAC layer is needed for sender authentication.
Key identifiers and structural features of the encrypted format are
visible, so unlinkability requires application-layer measures.  Finally,
the accumulator verifies segments within a message but cannot detect
replacement of the message itself; an adversary who swaps one encrypted
message for another goes undetected unless the application binds
message identity externally.</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>raAE does not define wire formats, so the privacy properties below apply
to the abstract mechanism; consuming protocols inherit responsibility
for metadata protection.</t>
      <t>The number of segments and the size of the final segment reveal the
plaintext length to within one segment_size boundary.  Applications that
require length hiding <bcp14>SHOULD</bcp14> pad the final segment before encryption.</t>
      <t>In random nonce mode, stored nonces change on each rewrite.  An observer
comparing two snapshots of the same encrypted content can identify which
segments were rewritten by comparing per-segment nonces.  The
accumulator also changes on rewrite, revealing that at least one segment
was modified.  raAE does not provide write-pattern privacy; consuming
protocols that require this property must re-encrypt all segments on
each write.</t>
      <t>The per-content salt is stored unencrypted and uniquely identifies a
content object.  Observers can use the salt to link different copies or
versions of the same encrypted content across storage locations or
backups.  Applications requiring unlinkability must encrypt the salt
under a separate mechanism.</t>
      <t>In derived nonce mode, the accumulator is a deterministic function of
the CEK, salt, and plaintext.  Two encryptions of identical content
under the same key material produce identical accumulators, revealing
content equality to any observer of the stored accumulator.</t>
      <t>For a systematic treatment of privacy threats in Internet protocols, see
<xref target="RFC6973"/>.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>Algorithm identifiers in the raAE-v1 profile are scoped to that profile.
Consuming protocols define their own identifier mappings.  This document
has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC5116">
          <front>
            <title>An Interface and Algorithms for Authenticated Encryption</title>
            <author fullname="D. McGrew" initials="D." surname="McGrew"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>This document defines algorithms for Authenticated Encryption with Associated Data (AEAD), and defines a uniform interface and a registry for such algorithms. The interface and registry can be used as an application-independent set of cryptoalgorithm suites. This approach provides advantages in efficiency and security, and promotes the reuse of crypto implementations. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5116"/>
          <seriesInfo name="DOI" value="10.17487/RFC5116"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
        <reference anchor="RFC8017">
          <front>
            <title>PKCS #1: RSA Cryptography Specifications Version 2.2</title>
            <author fullname="K. Moriarty" initials="K." role="editor" surname="Moriarty"/>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski"/>
            <author fullname="J. Jonsson" initials="J." surname="Jonsson"/>
            <author fullname="A. Rusch" initials="A." surname="Rusch"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document provides recommendations for the implementation of public-key cryptography based on the RSA algorithm, covering cryptographic primitives, encryption schemes, signature schemes with appendix, and ASN.1 syntax for representing keys and for identifying the schemes.</t>
              <t>This document represents a republication of PKCS #1 v2.2 from RSA Laboratories' Public-Key Cryptography Standards (PKCS) series. By publishing this RFC, change control is transferred to the IETF.</t>
              <t>This document also obsoletes RFC 3447.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8017"/>
          <seriesInfo name="DOI" value="10.17487/RFC8017"/>
        </reference>
        <reference anchor="RFC8439">
          <front>
            <title>ChaCha20 and Poly1305 for IETF Protocols</title>
            <author fullname="Y. Nir" initials="Y." surname="Nir"/>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <date month="June" year="2018"/>
            <abstract>
              <t>This document defines the ChaCha20 stream cipher as well as the use of the Poly1305 authenticator, both as stand-alone algorithms and as a "combined mode", or Authenticated Encryption with Associated Data (AEAD) algorithm.</t>
              <t>RFC 7539, the predecessor of this document, was meant to serve as a stable reference and an implementation guide. It was a product of the Crypto Forum Research Group (CFRG). This document merges the errata filed against RFC 7539 and adds a little text to the Security Considerations section.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8439"/>
          <seriesInfo name="DOI" value="10.17487/RFC8439"/>
        </reference>
        <reference anchor="RFC8452">
          <front>
            <title>AES-GCM-SIV: Nonce Misuse-Resistant Authenticated Encryption</title>
            <author fullname="S. Gueron" initials="S." surname="Gueron"/>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="Y. Lindell" initials="Y." surname="Lindell"/>
            <date month="April" year="2019"/>
            <abstract>
              <t>This memo specifies two authenticated encryption algorithms that are nonce misuse resistant -- that is, they do not fail catastrophically if a nonce is repeated.</t>
              <t>This document is the product of the Crypto Forum Research Group.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8452"/>
          <seriesInfo name="DOI" value="10.17487/RFC8452"/>
        </reference>
        <reference anchor="RFC9771">
          <front>
            <title>Properties of Authenticated Encryption with Associated Data (AEAD) Algorithms</title>
            <author fullname="A. Bozhko" initials="A." role="editor" surname="Bozhko"/>
            <date month="May" year="2025"/>
            <abstract>
              <t>Authenticated Encryption with Associated Data (AEAD) algorithms provide both confidentiality and integrity of data. The widespread use of AEAD algorithms in various applications has led to an increased demand for AEAD algorithms with additional properties, driving research in the field. This document provides definitions for the most common of those properties and aims to improve consistency in the terminology used in documentation. This document is a product of the Crypto Forum Research Group.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9771"/>
          <seriesInfo name="DOI" value="10.17487/RFC9771"/>
        </reference>
        <reference anchor="I-D.irtf-cfrg-aegis-aead">
          <front>
            <title>The AEGIS Family of Authenticated Encryption Algorithms</title>
            <author fullname="Frank Denis" initials="F." surname="Denis">
              <organization>Fastly Inc.</organization>
            </author>
            <author fullname="Samuel Lucas" initials="S." surname="Lucas">
              <organization>Individual Contributor</organization>
            </author>
            <date day="5" month="October" year="2025"/>
            <abstract>
              <t>   This document describes the AEGIS-128L, AEGIS-256, AEGIS-128X, and
   AEGIS-256X AES-based authenticated encryption algorithms designed for
   high-performance applications.

   The document is a product of the Crypto Forum Research Group (CFRG).
   It is not an IETF product and is not a standard.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Source for this draft and an issue tracker can be found at
   https://github.com/cfrg/draft-irtf-cfrg-aegis-aead.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-aegis-aead-18"/>
        </reference>
        <reference anchor="NIST-SP-800-38D" target="https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf">
          <front>
            <title>Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC</title>
            <author initials="M." surname="Dworkin">
              <organization/>
            </author>
            <date year="2007" month="November"/>
          </front>
          <seriesInfo name="NIST" value="Special Publication 800-38D"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC6973">
          <front>
            <title>Privacy Considerations for Internet Protocols</title>
            <author fullname="A. Cooper" initials="A." surname="Cooper"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="B. Aboba" initials="B." surname="Aboba"/>
            <author fullname="J. Peterson" initials="J." surname="Peterson"/>
            <author fullname="J. Morris" initials="J." surname="Morris"/>
            <author fullname="M. Hansen" initials="M." surname="Hansen"/>
            <author fullname="R. Smith" initials="R." surname="Smith"/>
            <date month="July" year="2013"/>
            <abstract>
              <t>This document offers guidance for developing privacy considerations for inclusion in protocol specifications. It aims to make designers, implementers, and users of Internet protocols aware of privacy-related design choices. It suggests that whether any individual RFC warrants a specific privacy considerations section will depend on the document's content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6973"/>
          <seriesInfo name="DOI" value="10.17487/RFC6973"/>
        </reference>
        <reference anchor="RFC8645">
          <front>
            <title>Re-keying Mechanisms for Symmetric Keys</title>
            <author fullname="S. Smyshlyaev" initials="S." role="editor" surname="Smyshlyaev"/>
            <date month="August" year="2019"/>
            <abstract>
              <t>A certain maximum amount of data can be safely encrypted when encryption is performed under a single key. This amount is called the "key lifetime". This specification describes a variety of methods for increasing the lifetime of symmetric keys. It provides two types of re-keying mechanisms based on hash functions and block ciphers that can be used with modes of operations such as CTR, GCM, CBC, CFB, and OMAC.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8645"/>
          <seriesInfo name="DOI" value="10.17487/RFC8645"/>
        </reference>
        <reference anchor="RFC8937">
          <front>
            <title>Randomness Improvements for Security Protocols</title>
            <author fullname="C. Cremers" initials="C." surname="Cremers"/>
            <author fullname="L. Garratt" initials="L." surname="Garratt"/>
            <author fullname="S. Smyshlyaev" initials="S." surname="Smyshlyaev"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="C. Wood" initials="C." surname="Wood"/>
            <date month="October" year="2020"/>
            <abstract>
              <t>Randomness is a crucial ingredient for Transport Layer Security (TLS) and related security protocols. Weak or predictable "cryptographically secure" pseudorandom number generators (CSPRNGs) can be abused or exploited for malicious purposes. An initial entropy source that seeds a CSPRNG might be weak or broken as well, which can also lead to critical and systemic security problems. This document describes a way for security protocol implementations to augment their CSPRNGs using long-term private keys. This improves randomness from broken or otherwise subverted CSPRNGs.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8937"/>
          <seriesInfo name="DOI" value="10.17487/RFC8937"/>
        </reference>
        <reference anchor="I-D.irtf-cfrg-aead-limits">
          <front>
            <title>Usage Limits on AEAD Algorithms</title>
            <author fullname="Felix Günther" initials="F." surname="Günther">
              <organization>IBM Research Europe - Zurich</organization>
            </author>
            <author fullname="Martin Thomson" initials="M." surname="Thomson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="4" month="December" year="2025"/>
            <abstract>
              <t>   An Authenticated Encryption with Associated Data (AEAD) algorithm
   provides confidentiality and integrity.  Excessive use of the same
   key can give an attacker advantages in breaking these properties.
   This document provides simple guidance for users of common AEAD
   functions about how to limit the use of keys in order to bound the
   advantage given to an attacker.  It considers limits in both single-
   and multi-key settings.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-aead-limits-11"/>
        </reference>
        <reference anchor="STREAM" target="https://eprint.iacr.org/2015/189">
          <front>
            <title>Online Authenticated-Encryption and its Nonce-Reuse Misuse-Resistance</title>
            <author initials="V. T." surname="Hoang">
              <organization/>
            </author>
            <author initials="R." surname="Reyhanitabar">
              <organization/>
            </author>
            <author initials="P." surname="Rogaway">
              <organization/>
            </author>
            <author initials="D." surname="Vizár">
              <organization/>
            </author>
            <date year="2015"/>
          </front>
          <seriesInfo name="IACR" value="ePrint 2015/189"/>
        </reference>
        <reference anchor="FLOE" target="https://eprint.iacr.org/2025/2275">
          <front>
            <title>Random-Access AEAD for Fast Lightweight Online Encryption</title>
            <author initials="A." surname="Fábrega">
              <organization/>
            </author>
            <author initials="J." surname="Len">
              <organization/>
            </author>
            <author initials="T." surname="Ristenpart">
              <organization/>
            </author>
            <author initials="G." surname="Rubin">
              <organization/>
            </author>
            <date year="2025"/>
          </front>
          <seriesInfo name="IACR" value="ePrint 2025/2275"/>
        </reference>
      </references>
    </references>
    <?line 1690?>

<section anchor="file-layouts">
      <name>Example File Layouts</name>
      <t>This appendix is informative.  It describes two example layouts a
consuming protocol might use to store raAE output.  raAE does not
mandate either layout.</t>
      <section anchor="linear-layout">
        <name>Linear Layout</name>
        <t>In a linear layout the salt, commitment, accumulator, and segment data
appear in sequence.  The salt comes first because it is needed to derive
all payload schedule values.  The commitment follows so a reader can
reject a wrong key before reading any segment data.  The accumulator
precedes the segment data so a streaming reader can verify
content-level integrity before beginning decryption; this also
removes any ambiguity about which segment is final.  Segments then
follow in index order.</t>
        <figure anchor="fig-linear-layout">
          <name>Linear Layout</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="128" width="512" viewBox="0 0 512 128" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,112" fill="none" stroke="black"/>
                <path d="M 64,32 L 64,112" fill="none" stroke="black"/>
                <path d="M 168,32 L 168,112" fill="none" stroke="black"/>
                <path d="M 280,32 L 280,112" fill="none" stroke="black"/>
                <path d="M 368,32 L 368,112" fill="none" stroke="black"/>
                <path d="M 416,32 L 416,112" fill="none" stroke="black"/>
                <path d="M 504,32 L 504,112" fill="none" stroke="black"/>
                <path d="M 8,32 L 504,32" fill="none" stroke="black"/>
                <path d="M 8,112 L 504,112" fill="none" stroke="black"/>
                <g class="text">
                  <text x="36" y="52">salt</text>
                  <text x="116" y="52">commitment</text>
                  <text x="224" y="52">accumulator</text>
                  <text x="320" y="52">segment</text>
                  <text x="392" y="52">...</text>
                  <text x="456" y="52">segment</text>
                  <text x="36" y="68">(Nh)</text>
                  <text x="108" y="68">(commit_</text>
                  <text x="220" y="68">(Nh)</text>
                  <text x="304" y="68">0</text>
                  <text x="332" y="68">data</text>
                  <text x="440" y="68">N-1</text>
                  <text x="476" y="68">data</text>
                  <text x="112" y="84">length)</text>
                  <text x="300" y="84">ct</text>
                  <text x="320" y="84">+</text>
                  <text x="344" y="84">tag</text>
                  <text x="436" y="84">ct</text>
                  <text x="456" y="84">+</text>
                  <text x="480" y="84">tag</text>
                  <text x="324" y="100">(+nonce)</text>
                  <text x="460" y="100">(+nonce)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+------+------------+-------------+----------+-----+----------+
| salt | commitment | accumulator | segment  | ... | segment  |
| (Nh) | (commit_   |    (Nh)     |  0 data  |     | N-1 data |
|      |  length)   |             | ct + tag |     | ct + tag |
|      |            |             | (+nonce) |     | (+nonce) |
+------+------------+-------------+----------+-----+----------+
]]></artwork>
          </artset>
        </figure>
        <t>In random nonce mode the per-segment nonce is stored alongside the
ciphertext and tag for that segment.  In derived nonce mode no nonce
storage is required.</t>
        <t>Linear layout supports streaming writes.  A writer emits the salt,
commitment, and a placeholder for the accumulator, then streams
segments.  After all segments are written the writer seeks back to the
accumulator position and writes the final value in place.</t>
      </section>
      <section anchor="aligned-layout">
        <name>Aligned Layout</name>
        <t>In an aligned layout all per-segment metadata is collected into a
header, followed by fixed-size ciphertext blocks.  The header contains
the salt, commitment, accumulator, and one (nonce, tag) pair per
segment.  Ciphertext blocks follow at fixed offsets.</t>
        <figure anchor="fig-aligned-layout">
          <name>Aligned Layout</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="336" width="368" viewBox="0 0 368 336" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,320" fill="none" stroke="black"/>
                <path d="M 352,128 L 352,144" fill="none" stroke="black"/>
                <path d="M 360,32 L 360,112" fill="none" stroke="black"/>
                <path d="M 360,192 L 360,320" fill="none" stroke="black"/>
                <path d="M 8,32 L 360,32" fill="none" stroke="black"/>
                <path d="M 8,192 L 360,192" fill="none" stroke="black"/>
                <path d="M 8,224 L 360,224" fill="none" stroke="black"/>
                <path d="M 8,256 L 360,256" fill="none" stroke="black"/>
                <path d="M 8,288 L 360,288" fill="none" stroke="black"/>
                <path d="M 8,320 L 360,320" fill="none" stroke="black"/>
                <g class="text">
                  <text x="48" y="52">Header:</text>
                  <text x="44" y="68">salt</text>
                  <text x="84" y="68">(Nh)</text>
                  <text x="68" y="84">commitment</text>
                  <text x="192" y="84">(commitment_length)</text>
                  <text x="72" y="100">accumulator</text>
                  <text x="140" y="100">(Nh)</text>
                  <text x="72" y="116">per-segment</text>
                  <text x="160" y="116">metadata:</text>
                  <text x="72" y="132">nonce_0</text>
                  <text x="128" y="132">(Nn),</text>
                  <text x="176" y="132">tag_0</text>
                  <text x="220" y="132">(Nt)</text>
                  <text x="72" y="148">nonce_1</text>
                  <text x="128" y="148">(Nn),</text>
                  <text x="176" y="148">tag_1</text>
                  <text x="220" y="148">(Nt)</text>
                  <text x="56" y="164">...</text>
                  <text x="360" y="164">|</text>
                  <text x="88" y="180">nonce_{N-1}</text>
                  <text x="160" y="180">(Nn),</text>
                  <text x="224" y="180">tag_{N-1}</text>
                  <text x="284" y="180">(Nt)</text>
                  <text x="352" y="180">|</text>
                  <text x="48" y="212">Segment</text>
                  <text x="88" y="212">0</text>
                  <text x="140" y="212">ciphertext</text>
                  <text x="244" y="212">(segment_size)</text>
                  <text x="48" y="244">Segment</text>
                  <text x="88" y="244">1</text>
                  <text x="140" y="244">ciphertext</text>
                  <text x="244" y="244">(segment_size)</text>
                  <text x="32" y="276">...</text>
                  <text x="48" y="308">Segment</text>
                  <text x="96" y="308">N-1</text>
                  <text x="156" y="308">ciphertext</text>
                  <text x="268" y="308">(&lt;=segment_size)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+-------------------------------------------+
| Header:                                   |
|  salt (Nh)                                |
|  commitment (commitment_length)           |
|  accumulator (Nh)                         |
|  per-segment metadata:                    |
|    nonce_0 (Nn), tag_0 (Nt)              |
|    nonce_1 (Nn), tag_1 (Nt)              |
|    ...                                    |
|    nonce_{N-1} (Nn), tag_{N-1} (Nt)      |
+-------------------------------------------+
| Segment 0 ciphertext (segment_size)       |
+-------------------------------------------+
| Segment 1 ciphertext (segment_size)       |
+-------------------------------------------+
| ...                                       |
+-------------------------------------------+
| Segment N-1 ciphertext (<=segment_size)   |
+-------------------------------------------+
]]></artwork>
          </artset>
        </figure>
        <t>To read segment i, a reader seeks to header_size + i *
segment_size.  The header contains all nonces and tags, so the
accumulator can be verified by reading only the header.  This layout
supports efficient random-access reads (one seek per segment) and
enables accumulator verification without reading any segment
ciphertext.</t>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This appendix is informative.</t>
      <t>All test vectors use protocol_id = "raAE-v1" and KDF = sha-256.
Unless stated otherwise, segment_size = 65536 octets.  Vectors are
provided for AES-256-GCM, ChaCha20-Poly1305, AES-256-GCM-SIV,
AEGIS-256, and AEGIS-256X2.  The initial vectors below use
AES-256-GCM with nonce_mode = "random".</t>
      <section anchor="single-segment-vector">
        <name>Single-Segment Vector</name>
        <t>This vector encrypts the 12-octet string "Hello, raAE!" as a single
segment.  The payload_info is constructed by Encode()-ing the AEAD
identifier "aes-256-gcm", the segment size "65536", the KDF identifier
"sha-256", and the 32-octet salt.  The commitment is then derived by
calling KDF with protocol_id "raAE-v1", label "commit", the CEK as
ikm, and payload_info as info.  The KDF trace below shows the
HKDF-Extract input (Encode of protocol_id, label, CEK) and the
HKDF-Expand info (Encode of protocol_id, label, payload_info, and
output length), followed by the 32-octet commitment.  The payload_key
and acc_key follow the same pattern with their respective labels.</t>
        <artwork><![CDATA[
Inputs:
  protocol_id:  "raAE-v1"
  CEK:          aaaaaaaa...aa (32 octets of 0xAA)
  salt:         04040404...04 (32 octets of 0x04)
  plaintext:    "Hello, raAE!" (12 octets)
  nonce_0:      030303030303030303030303
  AEAD:         aes-256-gcm
  segment_size: 65536
  KDF:          sha-256

payload_info (hex):
  000b6165732d3235362d67636d000536353533
  3600077368612d3235360020040404040404040404
  0404040404040404040404040404040404040404040404

KDF Trace (commitment):
  extract_input:
    0007726141452d76310006636f6d6d6974
    0020aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  prk:
    cb10c1430a1c89fef79ddd6d99ef698b
    6a64161bbc349c2f6eb3e673e32508c6
  expand_info:
    0007726141452d76310006636f6d6d6974003f
    000b6165732d3235362d67636d000536353533
    3600077368612d32353600200404040404040404
    0404040404040404040404040404040404040404
    04040404040400020020
  commitment:
    454f1649919652acf3032d9331fbec23
    34c68fc7031f114fe15808d2029c91fa

payload_key:
  170573c64e86782013e37149914db731
  d25968df650f85ea1062093f297aabe3
acc_key:
  d4b04ab7b60d6d3fd4bc4f110f018279
  5c3bd3f5f9f4dcce2f82c2d7c2f284f0

Segment 0 (is_final=1):
  nonce_0:      030303030303030303030303
  segment_aad:  Encode("raAE-DATA",
                    I2OSP(0, 8), I2OSP(1, 1))
    = 0009726141452d4441544100080000000000000000000101
  ct+tag:
    cb4139ff74b6e97c9e2e8adbb711ee1a
    212aa0d7054ecbd2d567fa49
  tag_0: b711ee1a212aa0d7054ecbd2d567fa49

Accumulator (single segment):
  contrib_0:
    de0c0c543502add75f3ffdab8129bb0d
    d77d8a4a9da83184024cb153f58880a6
  accumulator:
    de0c0c543502add75f3ffdab8129bb0d
    d77d8a4a9da83184024cb153f58880a6
    (accumulator = contrib_0 for N=1)
]]></artwork>
      </section>
      <section anchor="two-segment-vector">
        <name>Two-Segment Vector</name>
        <artwork><![CDATA[
Inputs:
  protocol_id:  "raAE-v1"
  CEK:          aaaaaaaa...aa (32 octets of 0xAA)
  salt:         04040404...04 (32 octets of 0x04)
  segment_0:    "Block zero data!" (16 octets)
  segment_1:    "Final block." (12 octets, final)
  nonce_0:      030303030303030303030303
  nonce_1:      050505050505050505050505
  AEAD:         aes-256-gcm
  segment_size: 65536
  KDF:          sha-256

Payload Schedule (same as single-segment):
  commitment:
    454f1649919652acf3032d9331fbec23
    34c68fc7031f114fe15808d2029c91fa
  payload_key:
    170573c64e86782013e37149914db731
    d25968df650f85ea1062093f297aabe3
  acc_key:
    d4b04ab7b60d6d3fd4bc4f110f018279
    5c3bd3f5f9f4dcce2f82c2d7c2f284f0

Segment 0 (is_final=0):
  nonce_0:      030303030303030303030303
  segment_aad:  Encode("raAE-DATA",
                    I2OSP(0, 8), I2OSP(0, 1))
    = 0009726141452d4441544100080000000000000000000100
  ct+tag_0:
    c1483af070bab36b8d00ef9ed6fb1452
    36cf3e20e3de9375aaa2c2e2a873318e
  tag_0: 36cf3e20e3de9375aaa2c2e2a873318e

Segment 1 (is_final=1):
  nonce_1:      050505050505050505050505
  segment_aad:  Encode("raAE-DATA",
                    I2OSP(1, 8), I2OSP(1, 1))
    = 0009726141452d4441544100080000000000000001000101
  ct+tag_1:
    a10003997560fbb42adc3a8de0b4131e
    e8e5d0154190bd588bf5e7a6
  tag_1: e0b4131ee8e5d0154190bd588bf5e7a6

Accumulator (two segments):
  contrib_0:
    a61d5e6bcb37211246d6ac546f29262f
    9f39c690462bce8834a1292e0f55937a
  contrib_1:
    097c8a52de03b224dd43f471a9341282
    55f5c8b6d623ab87a46f5eb83cc706e3
  accumulator:
    af61d439153493369b955825c61d34ad
    cacc0e269008650f90ce779633929599
    (accumulator = contrib_0 XOR contrib_1)
]]></artwork>
      </section>
      <section anchor="epoch-key-vectors">
        <name>Epoch Key Vectors</name>
        <t>The following vectors use the same CEK and salt as above.  They
demonstrate the effect of epoch_length on payload_info and on segment
key derivation.</t>
        <artwork><![CDATA[
--- epoch_length absent ---
payload_info (hex):
  000b6165732d3235362d67636d000536353533
  3600077368612d3235360020040404040404040404
  0404040404040404040404040404040404040404040404
payload_key:
  170573c64e86782013e37149914db731
  d25968df650f85ea1062093f297aabe3
segment_key(0) = payload_key
segment_key(1) = payload_key

--- epoch_length = 0 ---
payload_info (hex):
  000b6165732d3235362d67636d000536353533
  3600077368612d3235360001300020040404040404
  04040404040404040404040404040404040404040404
  04040404
payload_key:
  223b82c12818dd4cb8da2b4ae5092075
  0a6bc404661c3dbb291a069aca0e3aa5
segment_key(0) = epoch_key(epoch=0):
  65cca11fda472b224be476566897c09c
  5006c856ec1698be47b27db8154e8a01
segment_key(1) = epoch_key(epoch=1):
  e9b26223a1ca32d620a2462170f56b24
  5f8d859519b7681a0fa229fc8a155e85

--- epoch_length = 1 ---
payload_info (hex):
  000b6165732d3235362d67636d000536353533
  3600077368612d3235360001310020040404040404
  04040404040404040404040404040404040404040404
  04040404
payload_key:
  23e9988c2cfd2db4f6e648fced969c81
  c7d676f31254def813a3f841fe733a5f
segment_key(0) = segment_key(1) = epoch_key(epoch=0):
  b0def46ad428a0c0395473c4129632b5
  127cb4c825d7db558551c0e27f5c7ebf
segment_key(2) = epoch_key(epoch=1):
  8af593d86913dfa1e3d193a4d9dc0378
  d51c1536b454986569e82420ff568eae
]]></artwork>
        <t>When epoch_length = 0, each segment receives a unique derived key (one
segment per epoch).  When epoch_length is absent, epoch derivation is
skipped entirely and all segments use payload_key directly.</t>
      </section>
      <section anchor="kdf-isolation-vectors">
        <name>KDF Isolation Vectors</name>
        <artwork><![CDATA[
Common inputs:
  protocol_id: "raAE-v1"
  label:       "TEST-LABEL"
               (hex: 544553542d4c4142454c)
  ikm:         0a0b0c0d0e0f (6 octets)
  info:        "" (0 octets)

KDF("raAE-v1", "TEST-LABEL", ikm, "", 32):
  92e7e2777e02b90014ab3e66ffa55ad9
  2cdaba3aee1627c8dd51224ed6899e05

KDF("raAE-v1", "TEST-LABEL", ikm, "", 16):
  6a66aec2c022b339df1299b66a591fe2
]]></artwork>
        <t>The two outputs above share no prefix even though they differ only in
the requested length L.  This demonstrates that the output length
commitment in the framing produces independent outputs for different L
values.</t>
      </section>
      <section anchor="derived-nonce-mode-vector">
        <name>Derived Nonce Mode Vector</name>
        <t>This vector uses the same CEK, salt, and plaintext as the
single-segment random vector, but with nonce_mode = "derived" and
epoch_length absent.  The nonce is computed deterministically from
nonce_base.  This vector uses AES-256-GCM with derived nonces for KDF
testing convenience (same CEK and salt as the random-nonce vector
above).  In production, derived nonce mode <bcp14>MUST</bcp14> only be used with MRAE
AEADs; see <xref target="nonce-generation"/>.</t>
        <artwork><![CDATA[
Inputs:
  protocol_id:  "raAE-v1"
  CEK:          aaaaaaaa...aa (32 octets of 0xAA)
  salt:         04040404...04 (32 octets of 0x04)
  plaintext:    "Hello, raAE!" (12 octets)
  nonce_mode:   derived
  AEAD:         aes-256-gcm
  segment_size: 65536
  KDF:          sha-256

Payload Schedule (same CEK and salt, epoch absent):
  commitment:   (same as single-segment vector)
  payload_key:  (same as single-segment vector)
  acc_key:      (same as single-segment vector)
  nonce_base:
    50328410634d38b5798e931e

nonce_0 = nonce_base XOR uint64(0):
  50328410634d38b5798e931e

Segment 0 (is_final=1):
  nonce_0:      50328410634d38b5798e931e
  segment_aad:
    0009726141452d44415441
    00080000000000000000000101
  ct+tag:
    bc72c63154666be5e8cc253a110ddc57
    7932263db32b2d861d5d6c61
  tag_0: 110ddc577932263db32b2d861d5d6c61

Accumulator:
  contrib_0:
    84c0f459b51162bc69ad4f9e32ffc310
    ce8e47ea4d95372e246d9781ef63025b
  accumulator:
    84c0f459b51162bc69ad4f9e32ffc310
    ce8e47ea4d95372e246d9781ef63025b
]]></artwork>
      </section>
      <section anchor="plaintext-bound-nonce-mode-vector">
        <name>Plaintext-Bound Nonce Mode Vector</name>
        <t>This vector uses the same CEK, salt, and plaintext as above, but with
nonce_mode = "plaintext-bound".  The nonce depends on both the
plaintext content and fresh random material.  For reproducibility,
Random(12) = 0x070707...07 (12 octets of 0x07).</t>
        <artwork><![CDATA[
Inputs:
  protocol_id:  "raAE-v1"
  CEK:          aaaaaaaa...aa (32 octets of 0xAA)
  salt:         04040404...04 (32 octets of 0x04)
  plaintext:    "Hello, raAE!" (12 octets)
  Random(12):   070707070707070707070707
  nonce_mode:   plaintext-bound
  AEAD:         aes-256-gcm
  segment_size: 65536
  KDF:          sha-256

Payload Schedule:
  (same as single-segment vector)

nonce_0 (plaintext-bound):
  5e8def13adb2d65b5054fd15

Segment 0 (is_final=1):
  nonce_0:      5e8def13adb2d65b5054fd15
  segment_aad:
    0009726141452d44415441
    00080000000000000000000101
  ct+tag:
    81df8f47c31648f379b0493bd746c293
    b815f4e94cbeb5530fde3f5b
  tag_0: d746c293b815f4e94cbeb5530fde3f5b

Accumulator:
  contrib_0:
    c80f4a347e6e74a58d3ee8b25bb5a3f9
    982321de03593fbab7b471d99e2cf1bc
  accumulator:
    c80f4a347e6e74a58d3ee8b25bb5a3f9
    982321de03593fbab7b471d99e2cf1bc
]]></artwork>
      </section>
      <section anchor="chacha20-poly1305-vector">
        <name>ChaCha20-Poly1305 Vector</name>
        <t>Single segment with random nonce mode and ChaCha20-Poly1305.  Same CEK
and salt as above; different AEAD_id changes the payload_info and all
derived values.</t>
        <artwork><![CDATA[
Inputs:
  AEAD:         chacha20-poly1305
  nonce_mode:   random
  (CEK, salt, plaintext, nonce as single-segment)

commitment:
  1e30998c28c0224cca320e5ba27f8514
  d232b9e58f1df3dccffff903c5efedfd
payload_key:
  12a66095dccb074137667f5f6fe9fc41
  0943dba7b9fdea052828609297ecb897
acc_key:
  985ce823be86c332e410d30066cbd9f1
  1a9a840b8d691adda468ecbea988e2eb

Segment 0 (is_final=1):
  nonce_0:      030303030303030303030303
  ct+tag:
    ff7ac17f504ffc08032b100aaa2ee764
    25e9128c8ff9d6ed8b66dc08
  tag_0: aa2ee76425e9128c8ff9d6ed8b66dc08

Accumulator:
  accumulator:
    58babbc3e19ebdfc7e88bde91b8a9e3b
    42fc8f0090892783648761ad6cec65ed
]]></artwork>
      </section>
      <section anchor="aes-256-gcm-siv-vector">
        <name>AES-256-GCM-SIV Vector</name>
        <t>Single segment with derived nonce mode and AES-256-GCM-SIV.
epoch_length is absent (required for MRAE AEADs).</t>
        <artwork><![CDATA[
Inputs:
  AEAD:         aes-256-gcm-siv
  nonce_mode:   derived
  (CEK, salt, plaintext as single-segment)

commitment:
  5d6d5c00c15b2a6bf44f28cedd1b99f4
  35b0f51085470b2c5f5b9a4a2fe17cc9
payload_key:
  ce2969d3b94dc1c4b173d3c1baf37de0
  b1a1a5fece2bcea662ba6fe284a8c0a8
nonce_base:
  ef1630c621ebbe963a18ab66

nonce_0 = nonce_base XOR uint64(0):
  ef1630c621ebbe963a18ab66

Segment 0 (is_final=1):
  ct+tag:
    12c611b3a380d5474ea9af7686f2ca90
    63b34086d29e41bdfccb08f4
  tag_0: 86f2ca9063b34086d29e41bdfccb08f4

Accumulator:
  accumulator:
    e131f4c66daf6b7c6300e190325a164a
    6058daf07d76670ebb1cfcdce937f97c
]]></artwork>
      </section>
      <section anchor="rewrite-vector">
        <name>Rewrite Vector</name>
        <t>This vector demonstrates accumulator update when segment 0 of the
two-segment AES-256-GCM message is rewritten with new plaintext.  The
accumulator is updated by XOR-ing out the old contribution and XOR-ing
in the new one.</t>
        <artwork><![CDATA[
Original message:
  segment_0:    "Block zero data!" (16 octets)
  segment_1:    "Final block." (12 octets, final)
  accumulator:
    af61d439153493369b955825c61d34ad
    cacc0e269008650f90ce779633929599

Rewrite segment 0:
  new_plaintext: "Updated data!!!!" (16 octets)
  new_nonce:     090909090909090909090909
  new_ct+tag:
    050fa5774cdfd95c94bec167dcf2a7d0
    daf41e183622c7fb6aeb355652f6c050
  new_tag:
    daf41e183622c7fb6aeb355652f6c050

Accumulator update:
  old_contrib_0:
    a61d5e6bcb37211246d6ac546f29262f
    9f39c690462bce8834a1292e0f55937a
  new_contrib_0:
    83ef8c0d86c63f63ce507723ca44d46c
    d2755468d6923a5f5b0b8ae1860fddfa
  new_accumulator =
    old_acc XOR old_contrib_0 XOR new_contrib_0:
    8a93065f58c58d47131383526370c6ee
    87809cde00b191d8ff64d459bac8db19
]]></artwork>
      </section>
      <section anchor="segment-size-16384-vector">
        <name>Segment Size 16384 Vector</name>
        <t>This vector uses segment_size = 16384 with AES-256-GCM.  The same CEK,
salt, plaintext, and nonce as the single-segment vector above are used;
the different segment_size changes payload_info and all derived values.</t>
        <artwork><![CDATA[
Inputs:
  AEAD:         aes-256-gcm
  segment_size: 16384
  nonce_mode:   random
  (CEK, salt, plaintext, nonce as single-segment)

payload_info (hex):
  000b6165732d3235362d67636d000531
  3633383400077368612d323536002004
  04040404040404040404040404040404
  040404040404040404040404040404

commitment:
  3670f64513fa362f5ed8881ee41bba09
  e3e8c9d69f92f1018671c00995546022
payload_key:
  30039f0450af5845f73eb170549cb81d
  30327157c72727ae6bfa4deca5bc11d4
acc_key:
  d429ed408c97218e051141cd1a215086
  2cf799dda14eafd1e18920fbf06632fc

Segment 0 (is_final=1):
  nonce_0:      030303030303030303030303
  segment_aad:
    0009726141452d44415441
    00080000000000000000000101
  ct+tag:
    7ecae9c12c31383e27f074c2cc735c19
    0d91f5fbb4b9b40f87608a97
  tag_0: cc735c190d91f5fbb4b9b40f87608a97

Accumulator:
  contrib_0:
    66c8f92ec5341ae4fad08afdb3f509e1
    2e92cae583bd6b90a2f77fb75b4419fd
  accumulator:
    66c8f92ec5341ae4fad08afdb3f509e1
    2e92cae583bd6b90a2f77fb75b4419fd
]]></artwork>
      </section>
      <section anchor="multi-segment-full-size-vector">
        <name>Multi-Segment Full-Size Vector</name>
        <t>This vector encrypts two full 65536-octet segments.  It demonstrates
the segment_aad is_final flag, per-segment AEAD, and accumulator XOR
across full-size blocks.  Segment 0 is 65536 octets of 0x00; segment 1
is 65536 octets of 0x01.</t>
        <artwork><![CDATA[
Inputs:
  protocol_id:  "raAE-v1"
  CEK:          aaaaaaaa...aa (32 octets of 0xAA)
  salt:         04040404...04 (32 octets of 0x04)
  segment_0:    0x00 * 65536 (65536 octets)
  segment_1:    0x01 * 65536 (65536 octets, final)
  nonce_0:      030303030303030303030303
  nonce_1:      050505050505050505050505
  AEAD:         aes-256-gcm
  segment_size: 65536
  KDF:          sha-256

Payload Schedule (same as single-segment):
  commitment:   (same as single-segment vector)
  payload_key:  (same as single-segment vector)
  acc_key:      (same as single-segment vector)

Segment 0 (is_final=0):
  nonce_0:      030303030303030303030303
  segment_aad:
    0009726141452d44415441
    00080000000000000000000100
  ct (first 16): 832455931b9ac90eff6fcffab78f7573
  ct (last 16):  60aefecea60d483670e82d15030da101
  tag_0: 2ae0e657af52f40b5a97716e809727fb

Segment 1 (is_final=1):
  nonce_1:      050505050505050505050505
  segment_aad:
    0009726141452d44415441
    00080000000000000001000101
  ct (first 16): e6686cf9184198d944be50a2cb6acef2
  ct (last 16):  cb929c96667c24ce1822d1c88d5613cb
  tag_1: 8a148be124e0f085638e81a4cc2c947a

Accumulator (two segments):
  contrib_0:
    6670594c17d70d9ed935408cd3a07f93
    e599f389cef9d26003af30423b07c460
  contrib_1:
    b221f9b0b2ad7eb446842b22a7e80600
    b393e94f27a48e6e4e2e155dedf11b46
  accumulator:
    d451a0fca57a732a9fb16bae74487993
    560a1ac6e95d5c0e4d81251fd6f6df26
    (accumulator = contrib_0 XOR contrib_1)
]]></artwork>
      </section>
      <section anchor="aegis-256-vector">
        <name>AEGIS-256 Vector</name>
        <t>Single segment with random nonce mode and AEGIS-256.  Same CEK and
salt as above.  AEGIS-256 uses 32-octet nonces.</t>
        <artwork><![CDATA[
Inputs:
  AEAD:         aegis-256
  nonce_mode:   random
  (CEK, salt, plaintext as single-segment)

payload_info (hex):
  000961656769732d3235360005363535
  333600077368612d3235360020040404
  04040404040404040404040404040404
  04040404040404040404040404

commitment:
  93cc15475b3383b353bb908f979cc493
  c271abb4409a1fb9a1588b508fb3ebd9
payload_key:
  041d039530a5c34fb19fee3f719fc4d3
  eefaa28da5df8a8ed24b7df78a2e990e
acc_key:
  37aa2cfb9b79fc8b0f97c327cc1c8bd9
  b9c5b70f3c3bd0ea24480b24a6b34d73

Segment 0 (is_final=1):
  nonce_0:
    03030303030303030303030303030303
    03030303030303030303030303030303
  ct+tag:
    219cc576e7c5662f8dda048000f22574
    b490f3af2c0b3a2842605dfa
  tag_0: 00f22574b490f3af2c0b3a2842605dfa

Accumulator:
  contrib_0:
    2561aa0b0317d3640be35a3b81edf5a5
    b1efebdeeaad67e253e77b12a8410a3e
  accumulator:
    2561aa0b0317d3640be35a3b81edf5a5
    b1efebdeeaad67e253e77b12a8410a3e
]]></artwork>
      </section>
      <section anchor="aegis-256x2-vector">
        <name>AEGIS-256X2 Vector</name>
        <t>Single segment with random nonce mode and AEGIS-256X2.  Same CEK and
salt as above.  AEGIS-256X2 uses 32-octet nonces.</t>
        <artwork><![CDATA[
Inputs:
  AEAD:         aegis-256x2
  nonce_mode:   random
  (CEK, salt, plaintext as single-segment)

payload_info (hex):
  000b61656769732d3235367832000536
  3535333600077368612d323536002004
  04040404040404040404040404040404
  040404040404040404040404040404

commitment:
  63f577c993f7ba7ed4acfca98366702e
  242c820055f6e67c143bcb2e6a15b87d
payload_key:
  57e33ccba9081a1332632354af0cb00b
  54fb5a66742aa9e0079c77e49f25afec
acc_key:
  96e4b420589f9fbd2103fb995372d91a
  8a5b5b6ae03425b5b6952b1ac792dea5

Segment 0 (is_final=1):
  nonce_0:
    03030303030303030303030303030303
    03030303030303030303030303030303
  ct+tag:
    cba698d2ed783f03ef1c10839c7ce962
    94644faf13fdb98843f61457
  tag_0: 9c7ce96294644faf13fdb98843f61457

Accumulator:
  contrib_0:
    768297bffc6313db1059ad3e714fdaad
    6386689b2dc4dc9aa87d250df622aad6
  accumulator:
    768297bffc6313db1059ad3e714fdaad
    6386689b2dc4dc9aa87d250df622aad6
]]></artwork>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA9y9637bVpYn+h1PgVE+hKqQCgHe5U7NUWwn8ZRje2xXdfcv
qfLgsiGhTJEKQdpWxelnOfMqZ15s1nVfAFC2K8mZPkfpLksksO973dd/jUaj
aF/v1+Y8Pnmebcrt9eiiKEzTxBeH/ZXZ7Osi25syfrgpdrc3+3q7OYmyPN+Z
N/DCLrt4eBKV22KTXUMD5S6r9qPmsF7Xb7LNqKh2l6NdlpnReBxhK5fb3e15
XG+qbVTf7M7j/e7Q7NPxeDVOo2xnsvP40fOX30Rvt7vXl7vt4eY8vo99buNv
trvDddTsYXyvsvV2A33dmiZqrrPd/tVPh+3eNOfxZhvd1OdRHI/i/bagf5vt
br8zVcN/3F7T71EGE9vu+Ml6A28+OYtfyKDhwzjm2Typi9fh59vdZbap/5Hh
KujYLnfZzdVtfH+7gXnv681l/PjxfXraXGf1GoZVF1fbddac6bp8UZt99X9d
4rdnxfY6ijbb3TW0+cbgkJ5/cz9NkpX8ukwWU/l1liRz/XU5tw+Mk4X+Op3Y
T6ezVH5dLRYJ/vpo9OCs3u0r3pXMXNYN/G9W4ndPHr14OXrxbLQcj0eT5YNz
Gv4+212a/Xl8td/fNOdffrl5s7455M3Zpm72Z5fbN1/iL/jJl4/NZVbcfvni
GX3U3JiizvDZNR4dWCputjy7KStuWY+bgelfm01JT8XVdhd/vd7Cot+vb67M
Lv5+W5om3lbx0xuz40X/kRqI4x/jb+Ec1M2X97eHzV6ejQff3v/+NIZDEn/7
/cX9E3rWbTb+yIZ/fxY/wFNW877CAGA8cBAXoyShTxqzq02DJ1XfxDU6j1/w
5OJnbnaxrFoU4ePhTs5Xi4luyXw6019Xk0XflmTlaF1f1/sGv3zx8vnDi+/7
t8Lc7OrN/qzOit0ZnMkv03Ey+zJZroLVfbpZ1xsT3uKRu8W0TNCXW9En201h
Rs/NoTHx93UD/8AfTY23rjB3LOZfzuKXZ/F322xzGX7x/Cx+bm6v4Mrsszzb
hV8+gy+3l9nb7Db8/MFZ/Jf6H//rf+6CnUlmR7bl5NHF/ecnMF3zDNck1qXA
8X7z+OnDj13AdPZlmi5m4fkMyeHDiwd0Rr/Jmn38uL682r81+L9uBWXJfVJ5
dNUuzuJv/tf/BDp6mYVf/Lez+LHZhJ/B+j6HjTCbGyB44VffwleHvHWQ049f
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
egHXypfVq1cBAA==

-->

</rfc>
