<?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.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-sullivan-cfrg-raae-04" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="raAE">Random-Access Authenticated Encryption</title>
    <seriesInfo name="Internet-Draft" value="draft-sullivan-cfrg-raae-04"/>
    <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="November" day="02"/>
    <area>IRTF</area>
    <workgroup>Crypto Forum</workgroup>
    <abstract>
      <?line 148?>

<t>This document defines random-access authenticated encryption (raAE), a
primitive that partitions a message into an indexed sequence of segments
that can be encrypted and decrypted independently and in any order.  It
also specifies SEAL (Segmented Encryption and Authentication Layer), a
parameterized construction that defines a family of concrete raAE
instantiations, one for each valid choice of an Authenticated Encryption
with Associated Data (AEAD) algorithm, a key derivation function (KDF),
and associated parameters.</t>
      <t>SEAL supports immutable (write-once), append-only, and mutable (in-place
ciphertext rewrite) operations, each with per-segment authentication.  A
separately configured snapshot authenticator can additionally
authenticate the complete, indexed segment set.</t>
      <t>The document also defines the security notions of raAE, specifies the
requirements for conforming constructions, and analyzes SEAL against
those requirements.  Concrete cipher suites, serialization layouts, and
test vectors for SEAL are specified in a companion document.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    raae mailing list (raae@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/raae/"/>.</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 169?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Large encrypted content is often stored as a sequence of fixed-size
segments, so that an application can read or modify any part of it
without processing the whole.  Encrypted backups, encrypted file
formats, object stores with partial updates, and full-disk encryption
over fixed-size blocks all work this way.  Such a system needs to
encrypt, decrypt, or re-encrypt any individual segment on its own and in
arbitrary order, and to verify that the stored object as a whole is
authentic and complete, without re-encrypting the segments that did not
change.</t>
      <t>This document specifies the raAE primitive (<xref target="raae"/>), whose base
interface and security notions come from Fábrega et al. (<xref target="FLRR25"/>),
and defines SEAL (Segmented Encryption and Authentication Layer), a
parameterized construction of raAE.  The base algorithms encrypt and
decrypt segments in arbitrary order, so a caller can read or replace any
segment on its own.  On top of that base, the extended raAE interface
adds in-place rewrite and a snapshot, a stored value that authenticates
the segment set and count the writer recorded for it.  A rewrite
re-encrypts only the changed segment and updates the snapshot, leaving
every other segment untouched.  Appending to the end, or truncating from
the end, composes the same per-segment operations, so the snapshot stays
consistent without a separate algorithm.</t>
      <t>SEAL builds the primitive from a chosen AEAD algorithm, a key derivation
function (KDF), and configuration parameters.  Under a snapshot
authenticator, it binds every segment and the count into a keyed
snapshot that an adversary cannot forge without the content-derived key.</t>
      <figure anchor="fig-overview">
        <name>The raAE primitive and the SEAL construction</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="464" width="520" viewBox="0 0 520 464" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,128 L 8,304" fill="none" stroke="black"/>
              <path d="M 8,384 L 8,432" fill="none" stroke="black"/>
              <path d="M 40,208 L 40,288" fill="none" stroke="black"/>
              <path d="M 120,336 L 120,376" fill="none" stroke="black"/>
              <path d="M 136,32 L 136,80" fill="none" stroke="black"/>
              <path d="M 224,208 L 224,288" fill="none" stroke="black"/>
              <path d="M 240,384 L 240,432" fill="none" stroke="black"/>
              <path d="M 256,88 L 256,120" fill="none" stroke="black"/>
              <path d="M 256,312 L 256,336" fill="none" stroke="black"/>
              <path d="M 264,208 L 264,288" fill="none" stroke="black"/>
              <path d="M 296,384 L 296,432" fill="none" stroke="black"/>
              <path d="M 384,32 L 384,80" fill="none" stroke="black"/>
              <path d="M 392,336 L 392,376" fill="none" stroke="black"/>
              <path d="M 448,208 L 448,288" fill="none" stroke="black"/>
              <path d="M 496,384 L 496,432" fill="none" stroke="black"/>
              <path d="M 512,128 L 512,304" fill="none" stroke="black"/>
              <path d="M 136,32 L 384,32" fill="none" stroke="black"/>
              <path d="M 136,80 L 384,80" fill="none" stroke="black"/>
              <path d="M 8,128 L 512,128" fill="none" stroke="black"/>
              <path d="M 40,208 L 224,208" fill="none" stroke="black"/>
              <path d="M 264,208 L 448,208" fill="none" stroke="black"/>
              <path d="M 40,288 L 224,288" fill="none" stroke="black"/>
              <path d="M 264,288 L 448,288" fill="none" stroke="black"/>
              <path d="M 8,304 L 512,304" fill="none" stroke="black"/>
              <path d="M 120,336 L 392,336" fill="none" stroke="black"/>
              <path d="M 8,384 L 240,384" fill="none" stroke="black"/>
              <path d="M 296,384 L 496,384" fill="none" stroke="black"/>
              <path d="M 8,432 L 240,432" fill="none" stroke="black"/>
              <path d="M 296,432 L 496,432" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="400,376 388,370.4 388,381.6" fill="black" transform="rotate(90,392,376)"/>
              <polygon class="arrowhead" points="264,120 252,114.4 252,125.6" fill="black" transform="rotate(90,256,120)"/>
              <polygon class="arrowhead" points="128,376 116,370.4 116,381.6" fill="black" transform="rotate(90,120,376)"/>
              <g class="text">
                <text x="220" y="52">raAE</text>
                <text x="280" y="52">primitive</text>
                <text x="220" y="68">abstract</text>
                <text x="296" y="68">interface</text>
                <text x="204" y="148">SEAL</text>
                <text x="276" y="148">construction</text>
                <text x="88" y="164">parameterized</text>
                <text x="156" y="164">by</text>
                <text x="176" y="164">a</text>
                <text x="212" y="164">cipher</text>
                <text x="264" y="164">suite</text>
                <text x="312" y="164">(AEAD</text>
                <text x="344" y="164">+</text>
                <text x="376" y="164">KDF),</text>
                <text x="408" y="164">a</text>
                <text x="448" y="164">maximum</text>
                <text x="64" y="180">segment</text>
                <text x="120" y="180">size,</text>
                <text x="160" y="180">and</text>
                <text x="188" y="180">an</text>
                <text x="224" y="180">epoch</text>
                <text x="276" y="180">length</text>
                <text x="104" y="228">mutability:</text>
                <text x="320" y="228">snapshot:</text>
                <text x="96" y="244">immutable</text>
                <text x="300" y="244">none</text>
                <text x="328" y="244">|</text>
                <text x="368" y="244">present</text>
                <text x="104" y="260">append-only</text>
                <text x="88" y="276">mutable</text>
                <text x="308" y="324">provides</text>
                <text x="72" y="404">per-segment</text>
                <text x="172" y="404">authenticity</text>
                <text x="356" y="404">snapshot</text>
                <text x="432" y="404">integrity</text>
                <text x="88" y="420">(always</text>
                <text x="156" y="420">present)</text>
                <text x="360" y="420">(when</text>
                <text x="420" y="420">present)</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
                   .------------------------------.
                   |        raAE primitive        |
                   |      abstract interface      |
                   '------------------------------'
                                  |
                                  v
   .--------------------------------------------------------------.
   |                      SEAL construction                       |
   |   parameterized by a cipher suite (AEAD + KDF), a maximum    |
   |   segment size, and an epoch length                          |
   |                                                              |
   |   .----------------------.    .----------------------.       |
   |   |  mutability:         |    |  snapshot:           |       |
   |   |  immutable           |    |  none | present      |       |
   |   |  append-only         |    |                      |       |
   |   |  mutable             |    |                      |       |
   |   '----------------------'    '----------------------'       |
   '--------------------------------------------------------------'
                                  |  provides
                 +----------------+----------------+
                 |                                 |
                 v                                 v
   .----------------------------.      .------------------------.
   |  per-segment authenticity  |      |   snapshot integrity   |
   |      (always present)      |      |     (when present)     |
   '----------------------------'      '------------------------'
]]></artwork>
        </artset>
      </figure>
      <t>raAE separates the two authentication scopes that applications often
conflate:</t>
      <dl>
        <dt>Per-segment authenticity:</dt>
        <dd>
          <t>One AEAD tag verifies under the segment index, a finality bit
marking the last segment, and any caller-supplied associated data.
It does not establish that the segment belongs to the current
snapshot.</t>
        </dd>
        <dt>Snapshot integrity:</dt>
        <dd>
          <t>When a snapshot authenticator is configured, snapshot verification
checks that the present segment set and the count are exactly what the
writer recorded for that snapshot, under a content-derived key.
Verification targets the whole segment set, and, where the
authenticator supports it, can instead confirm that a designated
subset of segments is included at their recorded positions, without
reading the others (<xref target="snapshot-interface"/>).  It does not establish
freshness against whole-object rollback, which a consuming protocol
must supply.</t>
        </dd>
      </dl>
      <t>raAE and SEAL are deliberately distinct layers.  A consuming protocol
supplies serialization, storage transactions, key management, and
rollback protection, which are out of scope here.  The full boundary of
what raAE does not provide is <xref target="properties-not-provided"/>.</t>
      <t>The remainder of this document presents raAE first and SEAL second.
<xref target="related-work"/> situates raAE against prior segmented
authenticated-encryption (AE) constructions.  <xref target="conventions"/> fixes
terminology and notation.  <xref target="raae"/> specifies the extended raAE
primitive and its snapshot operations.  <xref target="framework"/> defines SEAL.
<xref target="security-properties"/> states the target security properties an raAE
construction must meet, the assumptions SEAL's components must satisfy,
and the operational limits on its use, and defines the security notions.
Cipher suites, serialization layouts, named instantiations, and test
vectors are specified in the companion document
<xref target="I-D.sullivan-seal-concrete"/>.</t>
      <section anchor="related-work">
        <name>Related Work</name>
        <t>CHAIN (<xref target="HRRV15"/>) is a segmented authenticated-encryption construction
that chains state from one segment to the next.  It is sequential by
construction and supports neither independent random-access reads nor
in-place segment rewrites.</t>
        <t>STREAM (<xref target="HRRV15"/>) turns a nonce-based AEAD into a segmented
construction using induced nonces that encode a message nonce, the
segment index, and a final-segment bit.  STREAM supports random-access
decryption and encryption of individual segments, but defines neither
authenticated snapshots nor authenticated rewrites.  SEAL's derived
nonce mode (<xref target="derived-nonces"/>) follows STREAM's counter-plus-final-bit
structure and adds those operations.</t>
        <t>Tink Streaming AEAD (<xref target="Tink"/>) and OpenPGP v2 Symmetrically Encrypted
and Integrity Protected Data (SEIPD) packets (<xref target="RFC9580"/>) are deployed
STREAM-family formats.  Both derive a message key and nonce prefix from
a key and a salt, encrypt each chunk under an AEAD nonce carrying the
chunk index, and detect truncation with a final tag over the empty
string.  Tink derives an AES-GCM key with the HMAC-based Key Derivation
Function (HKDF) (<xref target="RFC5869"/>), while v2 SEIPD selects its cipher and
AEAD from packet identifiers.  Each chunk is independently authenticated
and can be verified locally at its boundary.  Neither format defines an
in-place rewrite operation or a snapshot authenticator over an updatable
set of segment tags.</t>
        <t>SEAL's snapshot authenticator addresses exactly that gap.  Its
per-segment input is the segment leaf (<xref target="segment-leaf"/>), which binds
the segment's content when the ciphertext digest is set.  It verifies
the whole segment set against the snapshot, and optionally a designated
subset (<xref target="snapshot-interface"/>).  A consuming protocol that
authenticates the one keyed snapshot obtains integrity over the whole
segment set and its count.  Where the ciphertext digest is set over a
strict ordering (<xref target="snapshot-interface"/>), the authenticated snapshot
also pins each index to one ciphertext, even against holders of the
content-encryption key (CEK).</t>
        <t>Tahoe-LAFS (<xref target="TAHOE"/>) authenticates separately encrypted pieces with a
signed Merkle tree:  it encrypts a mutable file in segments, builds
Merkle hash trees over its erasure-coded blocks, and has the writer sign
a value that includes the tree's root with an RSA key, so a reader
checks one segment against the signature through the hashes on its path.
A signature over an unkeyed root gives integrity and origin to a
verifier that holds no decryption key.  SEAL's keyed snapshot does not
do that on its own.  The counterpart in SEAL is the public snapshot that
every strict authenticator defines, for a consuming protocol to sign
(<xref target="open-count-public"/>).</t>
        <t>Fábrega et al. (<xref target="FLRR25"/>) formalized random-access AEAD security over
a raAE primitive syntax in which segment encryption and decryption may
be invoked in arbitrary order, and gave a construction, FLOE (Fast
Lightweight Online Encryption), proved to meet it.  FLOE realizes the
base interface:  segments are written once, and there is no snapshot.
SEAL realizes that primitive with the extension of this document, and
<xref target="raae-security"/> defines the security notions used in its analysis.</t>
        <t>Each precedent covers part of the random-access AE design space.  raAE
is the abstract interface that generalizes the family with three
capabilities none of the precedents combines:  arbitrary-order
encryption, in-place authenticated rewrite, and a snapshot over the
whole segment set.  SEAL realizes all three in one construction.</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 message segment is a unit of plaintext that is individually encrypted
and authenticated.  Segments need not be uniform in length.  A
construction <bcp14>MAY</bcp14> set a maximum segment size, and the construction or its
consuming format <bcp14>MAY</bcp14> set a minimum, which applies to every segment, the
final one included, unless the format exempts the final segment.  A
segment may be any length within those bounds.  The final segment of a
message is the one at its highest index, whatever that segment's length.</t>
      <t>A message is the content that one CEK and salt pair protects, the unit
the primitive encrypts.  An object is that message in stored form: the
ciphertext segments, their metadata, and any snapshot that a storage
layer holds.  Each object carries one message, whose content may change
through rewrite and length-changing operations.</t>
      <t>A ciphertext core is the AEAD encryption output corresponding to one
message segment, excluding file-level headers and external segment
metadata.  An AEAD-specific split divides this output into ct_i, the
encrypted segment body, and tag_i, the authentication tag.</t>
      <t>A ciphertext segment is the stored representation of one encrypted
message segment.  Depending on nonce_mode, it contains the ciphertext
core and may also contain a stored nonce or other per-segment metadata.</t>
      <t>Segment metadata is per-segment information needed to decrypt or verify
a ciphertext segment, such as a stored nonce, tag, finality status, or
profile-defined values.</t>
      <t>This document writes AEAD.Encrypt and AEAD.Decrypt for the authenticated
encryption and decryption operations defined in <xref target="RFC5116"/>.</t>
      <t>Symbol form follows the layer a name belongs to.  The abstract interface
and the analysis use mathematical notation:  a capital letter is an
operand of that interface, either an octet string (K, N, G, T_g, A_i,
M_i, C_i) or the per-message state (S).  A lowercase letter is an
integer index or bound (i, e, r), except the position identifier p, a
pair (i, b) (<xref target="raae-writable"/>).</t>
      <t>N with a lowercase letter is a size that a chosen component fixes rather
than one a deployment picks:  the AEAD (Nk, Nn, Nt, Nb), the KDF (Nh),
the snapshot authenticator (Na), or the nonce mode (Np).  Everything the
construction names concretely uses lowercase snake_case, whatever its
type:  octet strings (salt, commitment, segment_key, ct_i), counts
(n_seg, n_ep), lengths a deployment configures (segment_max,
commitment_length), and identifiers, which take an _id suffix (aead_id,
kdf_id, snap_id, protocol_id).</t>
      <t>Names that take arguments follow the same split.  Initialisms are
capitalized (LH, KDF, AEAD, and XOF, an extendable-output function), and
LH is defined in <xref target="kdf-combiner"/>.  The raAE tuple is CamelCase (KeyGen,
StartEnc, EncSeg, StartDec, DecSeg, RewriteSeg, SnapVerify), while the
methods of a component it parameterizes over are lowercase (snapshot,
verify, add, remove, and set_length of <xref target="snapshot-interface"/>), so a
name shows which interface it belongs to.  Derivations this document
defines are lowercase (encode and frame in <xref target="kdf-combiner"/>, leaf in
<xref target="segment-leaf"/>, and nonce in <xref target="nonce-generation"/>).</t>
      <t>A subscript selects one instance of a value:  X_i is X for the segment
at index i, as in A_i, P_i, ct_i, and tag_i, and d_e is the epoch head
for epoch e (<xref target="I-D.sullivan-seal-concrete"/>).  A value written f(i), as
in segment_key(i) or nonce(i), is the value that the named derivation
defines for index i.</t>
      <t>Two suffixes and one prefix recur.  A _label suffix is an ASCII
constant that separates one derivation from another (aad_label,
epoch_key_label).  A _calc suffix marks a value recomputed for
comparison against a stored one (d_calc(e) and leaf_calc(i) in
<xref target="I-D.sullivan-seal-concrete"/>).  An Adv_ prefix names an adversary's
advantage in the analysis (Adv_snap, Adv_muPRF).</t>
      <t>The remaining terms (ikm, label, info, L, salt, CEK, protocol_id,
nonce_mode, payload_info, segment_commitment, epoch_length, epoch,
epoch_key, payload_key, segment_key, snap_key, and the commitment) are
defined in <xref target="framework"/> where they first appear.</t>
      <section anchor="taxonomy">
        <name>Taxonomy</name>
        <dl>
          <dt>raAE primitive:</dt>
          <dd>
            <t>The abstract random-access AE interface and security target.</t>
          </dd>
          <dt>Extended raAE interface:</dt>
          <dd>
            <t>The base interface plus snapshot maintenance and verification.</t>
          </dd>
          <dt>SEAL construction:</dt>
          <dd>
            <t>The construction specified in <xref target="framework"/>.</t>
          </dd>
          <dt>Cipher suite:</dt>
          <dd>
            <t>The AEAD and KDF algorithms and their sizes.</t>
          </dd>
          <dt>Profile:</dt>
          <dd>
            <t>A named set of fixed parameter choices, identified by a protocol_id,
needed for interoperability.</t>
          </dd>
          <dt>Parameter set:</dt>
          <dd>
            <t>The per-object values that affect derivation and verification.</t>
          </dd>
          <dt>Consuming protocol:</dt>
          <dd>
            <t>The protocol or format that stores objects and manages keys.</t>
          </dd>
          <dt>Serialization:</dt>
          <dd>
            <t>The consuming protocol's wire or storage encoding.</t>
          </dd>
          <dt>Segment:</dt>
          <dd>
            <t>A zero-based independently encrypted plaintext unit.</t>
          </dd>
          <dt>Epoch:</dt>
          <dd>
            <t>A group of 2^epoch_length segment indices sharing one epoch key.</t>
          </dd>
          <dt>Keyed snapshot:</dt>
          <dd>
            <t>The value, computed under snap_key, that authenticates one segment set
when a snapshot authenticator is configured.</t>
          </dd>
          <dt>Snapshot authenticator:</dt>
          <dd>
            <t>A pluggable SEAL component that produces and verifies the snapshot.
Its abstract interface is <xref target="snapshot-interface"/>, and its concrete
instantiations are in <xref target="I-D.sullivan-seal-concrete"/>.</t>
          </dd>
          <dt>Public snapshot:</dt>
          <dd>
            <t>The unkeyed counterpart of the keyed snapshot, which a strict snapshot
authenticator defines for a verifier that holds no key:  a snapshot of
the same leaves, payload_info, the commitment, and the count, computed
with an empty ikm in place of snap_key (<xref target="open-count-public"/>).</t>
          </dd>
          <dt>Per-segment authenticity:</dt>
          <dd>
            <t>AEAD verification for one segment only.</t>
          </dd>
          <dt>Snapshot integrity:</dt>
          <dd>
            <t>Verification of the segment set, or of a designated subset or, by
prefix verification, a prefix of it, against the snapshot.</t>
          </dd>
          <dt>Ciphertext digest:</dt>
          <dd>
            <t>LH(ct_i) (<xref target="kdf-combiner"/>), the digest of one segment's ciphertext,
stored in that segment's metadata and carried first in the strict
authenticators' leaf when the instantiation sets it; the payload_info
parameter segment_commitment selects it.  It binds the segment's
content, not its position (<xref target="snapshot-interface"/>), and is distinct
from the commitment, which binds the CEK, payload_info, and G.</t>
          </dd>
          <dt>External freshness:</dt>
          <dd>
            <t>Rollback protection supplied outside raAE.</t>
          </dd>
        </dl>
      </section>
      <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>uint8(n), uint16(n), uint32(n), uint64(n):</dt>
          <dd>
            <t>Shorthand for I2OSP(n, 1), I2OSP(n, 2), I2OSP(n, 4), and I2OSP(n, 8)
respectively.</t>
          </dd>
          <dt>||:</dt>
          <dd>
            <t>Octet string concatenation.</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>[x, y, ...]:</dt>
          <dd>
            <t>An ordered list of octet strings.  A single-element list is written
[x].  The brackets denote a list, not an optional parameter.</t>
          </dd>
          <dt>frame, encode:</dt>
          <dd>
            <t>The length-prefixed injective encoding used by SEAL, defined in
<xref target="kdf-combiner"/>.  frame is total over all field lengths.  The
construction requires an injective framing (<xref target="framing"/>) but does not
mandate this encoding.  Another profile <bcp14>MAY</bcp14> use any injective encoding
that meets <xref target="framing"/>.</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>Np:</dt>
          <dd>
            <t>Presented nonce size in octets:  the per-segment nonce stored in
metadata.  Np = Nn in random nonce mode (<xref target="nonce-generation"/>) and Np
= 0 in derived nonce mode (<xref target="derived-nonces"/>), where the nonce is
recomputed from the key schedule.</t>
          </dd>
          <dt>Nh:</dt>
          <dd>
            <t>Hash or pseudorandom function (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>
          <dt>Nb:</dt>
          <dd>
            <t>Cipher block size in octets for the chosen AEAD algorithm, defined
only for an AEAD built on a block cipher.  The block-size birthday
limit of <xref target="aead-usage-limits"/> is expressed in Nb and does not apply
to an AEAD with no block-cipher structure.</t>
          </dd>
          <dt>Na:</dt>
          <dd>
            <t>The keyed snapshot length in octets, the output size of the configured
snapshot authenticator.  It <bcp14>MAY</bcp14> depend on the segment count n_seg, and
is 0 when none (<xref target="snapshot-authenticator"/>).</t>
          </dd>
          <dt>n_seg:</dt>
          <dd>
            <t>The number of ciphertext segments in a stored message.  Written
n_seg (lowercase) to distinguish it from the per-message nonce N in
the raAE interface (<xref target="raae-syntax"/>).</t>
          </dd>
          <dt>n_ep:</dt>
          <dd>
            <t>The number of epochs in a stored message, ceil(n_seg /
2^epoch_length).</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="raae">
      <name>The raAE Primitive</name>
      <section anchor="raae-overview">
        <name>Overview</name>
        <t>Random-access authenticated encryption (raAE) partitions a message into
segments, each encrypted and decrypted on its own and in any order.  A
reader can open one segment without the rest of the message, and a
writer can encrypt one without holding the others.  In the base
interface <xref target="FLRR25"/>, each segment is written once and thereafter only
read.</t>
        <t>The extended raAE interface keeps that base and adds one capability:  a
segment already written may be replaced in place, without disturbing the
rest.  Rewriting changes the threat model.  Per-segment authentication
binds each segment in isolation, so it cannot tie the segments a reader
assembles to a single recorded version of the object:  a storage layer
holding the ciphertext can roll a segment back to an older valid copy,
substitute one valid same-index segment for another, or drop one, and
each segment it presents still authenticates.  An optional snapshot
authenticates the segment set as the writer recorded it, so a reader can
detect these changes.  The extension (<xref target="raae-writable"/>) defines the
snapshot and the operations that maintain it.</t>
        <t>The security notions follow the interface.  raAE and its rewrites target
ra-ROR (random-access real-or-random) and ra-CMT (random-access context
commitment) (<xref target="raae-security"/>).  Rewriting leaves the ra-CMT definition
untouched, and the ra-ROR definition too in random nonce mode
(<xref target="nonce-generation"/>), since replacing a segment there is an encryption
the read-only adversary could already ask for.  In derived nonce mode a
rewrite is deterministic and relies on an equality-leakage relaxation of
ra-ROR (<xref target="appendix-nonce-modes"/>), and in any nonce mode the ra-ROR
bounds of <xref target="FLRR25"/> do not cover it (<xref target="ra-ror"/>).  Snapshot
authentication adds the one notion of its own, snapshot integrity
(<xref target="snapshot-integrity"/>).</t>
      </section>
      <section anchor="raae-syntax">
        <name>Interface</name>
        <t>The base raAE interface, from <xref target="FLRR25"/>, is a tuple of five algorithms:
KeyGen, StartEnc, EncSeg, StartDec, and DecSeg.</t>
        <dl>
          <dt>KeyGen:</dt>
          <dd>
            <t>Randomized key generation.  Takes no input.  Outputs a secret key K.</t>
          </dd>
          <dt>StartEnc(K, N, G):</dt>
          <dd>
            <t>Deterministic.  Takes a secret key K, nonce N, and global associated
data G.  Outputs a ciphertext header T_g and an initial per-message
encryption state S.</t>
          </dd>
          <dt>EncSeg(S, p, A_i, M_i):</dt>
          <dd>
            <t>Randomized.  Takes the encryption state S, a position identifier
p, per-segment associated data A_i, and message segment M_i.
Outputs a ciphertext segment C_i.  S is not modified.  EncSeg may
be called with the same S at any position, in any order, or
concurrently.</t>
          </dd>
          <dt>StartDec(K, N, G, T_g):</dt>
          <dd>
            <t>Deterministic.  Takes key K, nonce N, global associated data G, and
ciphertext header T_g.  Outputs a per-message decryption state S or
an error.</t>
          </dd>
          <dt>DecSeg(S, p, A_i, C_i):</dt>
          <dd>
            <t>Deterministic.  Takes the decryption state S, position identifier
p, per-segment associated data A_i, and ciphertext segment C_i.
Outputs message segment M_i or an error.</t>
          </dd>
        </dl>
        <t>The position identifier p = (i, b) consists of a segment number i and a
terminal bit b in {0, 1}.  They impose a total ordering on segments and
carry a truncation defense:  a ciphertext lacking a segment with b = 1
is incomplete.  The encryption state S is immutable, so EncSeg calls are
order-independent and can run in parallel.  The ciphertext header T_g
commits to K, the nonce N, and global associated data G.  A headerless
scheme emits T_g = empty.</t>
      </section>
      <section anchor="raae-writable">
        <name>Extended Interface</name>
        <t>Replacing a segment already written, without re-encrypting the others,
requires no new operation:  re-encrypting a position is an ordinary
EncSeg call over the immutable state.  The ra-CMT definition applies to
it unchanged, and so does the ra-ROR definition in random nonce mode
(<xref target="ra-ror"/>).</t>
        <t>A scheme that supports rewriting <bcp14>MAY</bcp14> carry a snapshot, a value over the
current set of segments that a reader checks to detect tampering that
per-segment authentication does not catch.  A write-once scheme <bcp14>MAY</bcp14>
carry one too:  a single value that a consuming protocol authenticates
once for the whole segment set (<xref target="snapshot-interface"/>).</t>
        <t>Two operations, added by this document, maintain and check the snapshot.
RewriteSeg replaces a segment and updates the snapshot in the same step.
SnapVerify decides whether a given set of segments is one the writer
recorded under the snapshot presented.</t>
        <t>The keyed snapshot is a deterministic function of the per-message state,
the (index, input) set, and the count.  It is not part of the immutable
encryption state S.  The add, remove, set_length, and snapshot()
operations of <xref target="snapshot-interface"/> update it over the writer's (index,
input) set or over the authenticator's summary of that set, and the
consuming protocol serializes those updates as that section requires.
The verify() operation runs over the (index, input) set recomputed from
the segments presented to SnapVerify, with any witness it is given.</t>
        <dl>
          <dt>RewriteSeg(S, p, A_i, M'_i, C_i, snapshot, witness):</dt>
          <dd>
            <t>Randomized.  Takes the encryption state S and position identifier p,
per-segment associated data A_i, the new message segment M'_i, the
existing ciphertext C_i at position p, the current snapshot, and a
witness for the segment set before the update.  Outputs replacement
ciphertext C'_i and an updated keyed snapshot, snapshot', together
with the updated summary where the authenticator keeps one.</t>
          </dd>
          <dt>SnapVerify(S, segments, snapshot, witness):</dt>
          <dd>
            <t>Deterministic.  Takes a per-message state S, either the encryption
state from StartEnc or the decryption state from StartDec, the
segments to verify as (position, ciphertext segment, A_i) triples,
with A_i empty where a segment has none, the snapshot, which the
caller declares complete or open (an intermediate snapshot), and a
witness, which is empty for the whole-object target.  The segments are
either the whole current object state or, where the authenticator
supports it, a designated subset of it.  Outputs accept or reject.</t>
          </dd>
        </dl>
        <t>The extension also adds an output to StartEnc.  In the extended
interface:</t>
        <dl>
          <dt>StartEnc(K, N, G):</dt>
          <dd>
            <t>Deterministic.  As in <xref target="raae-syntax"/>, and additionally outputs the
initial keyed snapshot, the snapshot over the empty segment set.</t>
          </dd>
        </dl>
        <t>EncSeg retains its base signature and outputs only C_i.  The caller adds
C_i to the object by updating the snapshot over the new (index, input)
set and count with the authenticator's operations
(<xref target="snapshot-interface"/>), in place from a summary or by recomputing.</t>
        <t>These additions define the extended raAE interface of this document:
the tuple (KeyGen, StartEnc, EncSeg, StartDec, DecSeg, RewriteSeg,
SnapVerify) over the keyed snapshot.</t>
        <t>Changing a message's length is a composition of these operations, not a
separate algorithm in either direction.  Position-addressed encryption
over immutable state already permits re-encrypting a position or
encrypting at a higher index (see <xref target="ra-ror"/>).</t>
        <t>A holder appends by encrypting the new segments and re-marking the old
final segment with RewriteSeg, which re-encrypts its existing plaintext
to clear its terminal bit.  It truncates to the first m segments by
dropping the segments at index m and above and re-marking segment m-1
with RewriteSeg, which re-encrypts its existing plaintext to set its
terminal bit.  Appending to an empty object skips the re-mark, since
there is no old final segment, and truncating to zero segments yields
the empty object.  Each length change updates the snapshot, and
<xref target="extend"/> gives the construction for both directions.</t>
        <section anchor="witness-rules">
          <name>Witness Rules</name>
          <t>A witness is untrusted data that a subset SnapVerify reads in place of
the segments it does not verify:  a deterministic function of the subset
presented, the (index, input) set, the count, and the snapshot key,
which may include the inputs of segments not presented.  The
authenticator specifies its witness.  Under a strict ordering
(<xref target="snapshot-interface"/>) it is the count and per-segment inputs, or
values derived from them, so a witness supplies the A_i of the segments
it stands for (<xref target="segment-leaf"/>, <xref target="I-D.sullivan-seal-concrete"/>).  A
subset SnapVerify that reads a witness checks it against the keyed
snapshot, so the witness adds no trust to that check.  A witness is not
part of the keyed snapshot.</t>
          <t>An update reads a witness for the segment set before the update:  its
count and, in place of the inputs the update leaves unchanged, what the
authenticator needs to compute the new value.  The authenticator defines
that witness and how it is checked (<xref target="I-D.sullivan-seal-concrete"/>).</t>
          <t>An authenticator's summary is state it derives from the inputs and keeps
beside the object so that an update reads fewer of them;
<xref target="I-D.sullivan-seal-concrete"/> calls its stored form the aux region.  A
whole-object SnapVerify does not validate a stored summary:  it
recomputes the value from the segments and never reads the stored copy.</t>
          <t>The writer <bcp14>MUST NOT</bcp14> use a witness it has not authenticated:  one it
produced itself as the sole writer, or one it has checked against a
verified snapshot for the same commitment and count
(<xref target="snapshot-limitations"/>).</t>
          <t>Each removed input <bcp14>MUST</bcp14> be one the writer produced itself as the sole
writer or be checked at its index against the same verified snapshot,
unless the authenticator permits its use without that check
(<xref target="I-D.sullivan-seal-concrete"/>).  An authenticator grants that
permission only where an incorrect input leaves no segment set, short of
a forgery, verifying against the resulting snapshot or any snapshot
derived from it.  It lists the permitted cases and their assumptions.</t>
          <t>When an update decrypts a stored record, the input formed from the same
record bytes, under the finality bit and A_i it decrypted under, <bcp14>MUST</bcp14>
match the authenticated or locally trusted input at that position.  If
the authenticator permits removal without checking the input, the
removed input <bcp14>MUST</bcp14> instead be that record's own input, read once with
the record.  The update <bcp14>MUST</bcp14> fail if any required check or decryption
fails.</t>
          <t>A snapshot is verified in one of two ways.  It is known to be current
when it comes from the locally trusted storage of a sole writer or from
authentication outside the construction that carries external freshness
(<xref target="snapshot-limitations"/>).  Otherwise a whole-object SnapVerify that
accepts the stored object verifies the stored snapshot.</t>
          <t>In an application that requires whole-object rollback resistance
(<xref target="snapshot-limitations"/>), a writer <bcp14>MUST</bcp14> update only from a current
verified snapshot, or it would certify a rolled-back state as the next
version.</t>
          <t>Under an append-only profile (<xref target="append-only"/>) the count an append
starts from <bcp14>MUST</bcp14> be current, whatever the application's rollback
requirement:  the writer takes n_seg from locally trusted storage or
from authentication outside the construction that carries external
freshness, never from the stored object alone.  An append from a
rolled-back count can encrypt new content at (i, b) positions the object
has already used.  In derived nonce mode that is the nonce reuse of
<xref target="nonce-misuse"/>, unless the AEAD provides misuse-resistant
authenticated encryption (MRAE).  In random nonce mode the two
encryptions draw independent nonces, so AEAD-level nonce reuse occurs
only by collision.  Still, the pair is encrypted twice, which the
<xref target="FLRR25"/> hypothesis excludes regardless of nonce mode (<xref target="ra-ror"/>).</t>
        </section>
      </section>
    </section>
    <section anchor="framework">
      <name>The SEAL Construction</name>
      <t>SEAL is a construction for the raAE primitive of <xref target="raae"/>, realizing its
extended interface from a KDF, an AEAD, the labels, a nonce-generation
method, and an optional snapshot authenticator.  Its KDF combiner
(<xref target="kdf-combiner"/>) frames every derived key and input over any KDF with
a two-step or one-step form.  SEAL provides commitment around the AEAD,
which need not itself commit.</t>
      <t>A SEAL construction <bcp14>MAY</bcp14> select any AEAD, KDF, nonce mode, commitment
configuration, or snapshot authenticator that satisfies the requirements
of this section.  <xref target="security-properties"/> derives SEAL's bounds from the
abstract properties of these components.  Concrete parameter choices and
interoperable suites are in <xref target="I-D.sullivan-seal-concrete"/>.</t>
      <t>In the key hierarchy below, a CEK and per-content salt feed the payload
schedule, which derives four per-message values (<xref target="key-derivation"/>).</t>
      <figure anchor="fig-hierarchy">
        <name>SEAL Key Hierarchy</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="624" width="272" viewBox="0 0 272 624" 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 64,240 L 64,288" 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,352 L 88,400" fill="none" stroke="black"/>
              <path d="M 96,136 L 96,160" fill="none" stroke="black"/>
              <path d="M 120,240 L 120,288" fill="none" stroke="black"/>
              <path d="M 120,496 L 120,544" fill="none" stroke="black"/>
              <path d="M 128,32 L 128,72" fill="none" stroke="black"/>
              <path d="M 136,240 L 136,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 176,352 L 176,400" fill="none" stroke="black"/>
              <path d="M 184,240 L 184,288" fill="none" stroke="black"/>
              <path d="M 192,552 L 192,576" fill="none" stroke="black"/>
              <path d="M 216,208 L 216,488" fill="none" stroke="black"/>
              <path d="M 264,496 L 264,544" 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 136,240 L 184,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 136,288 L 184,288" fill="none" stroke="black"/>
              <path d="M 88,352 L 176,352" fill="none" stroke="black"/>
              <path d="M 88,400 L 176,400" fill="none" stroke="black"/>
              <path d="M 120,496 L 264,496" fill="none" stroke="black"/>
              <path d="M 120,544 L 264,544" fill="none" stroke="black"/>
              <path d="M 92,296 L 116,344" fill="none" stroke="black"/>
              <path d="M 172,456 L 188,488" fill="none" stroke="black"/>
              <path d="M 156,408 L 168,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"/>
              <path d="M 96,432 L 108,408" fill="none" stroke="black"/>
              <path d="M 140,344 L 164,296" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="224,488 212,482.4 212,493.6" fill="black" transform="rotate(90,216,488)"/>
              <polygon class="arrowhead" points="216,160 204,154.4 204,165.6" fill="black" transform="rotate(63.43494882292201,208,160)"/>
              <polygon class="arrowhead" points="200,576 188,570.4 188,581.6" fill="black" transform="rotate(90,192,576)"/>
              <polygon class="arrowhead" points="196,488 184,482.4 184,493.6" fill="black" transform="rotate(63.43494882292201,188,488)"/>
              <polygon class="arrowhead" points="176,432 164,426.4 164,437.6" fill="black" transform="rotate(63.43494882292201,168,432)"/>
              <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="148,344 136,338.4 136,349.6" fill="black" transform="rotate(116.56505117707799,140,344)"/>
              <polygon class="arrowhead" points="136,72 124,66.4 124,77.6" fill="black" transform="rotate(90,128,72)"/>
              <polygon class="arrowhead" points="124,344 112,338.4 112,349.6" fill="black" transform="rotate(63.43494882292201,116,344)"/>
              <polygon class="arrowhead" points="104,432 92,426.4 92,437.6" fill="black" transform="rotate(116.56505117707799,96,432)"/>
              <polygon class="arrowhead" points="104,160 92,154.4 92,165.6" fill="black" transform="rotate(90,96,160)"/>
              <polygon class="arrowhead" points="96,232 84,226.4 84,237.6" fill="black" transform="rotate(90,88,232)"/>
              <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="160" y="180">nonce</text>
                <text x="220" y="180">snap</text>
                <text x="88" y="196">key</text>
                <text x="156" y="196">base</text>
                <text x="216" y="196">key</text>
                <text x="24" y="260">cmt</text>
                <text x="80" y="260">seg</text>
                <text x="160" y="260">nonce</text>
                <text x="92" y="276">key(i)</text>
                <text x="160" y="276">(i)</text>
                <text x="132" y="372">AEAD</text>
                <text x="136" y="388">Seal(i)</text>
                <text x="92" y="452">ct_i</text>
                <text x="168" y="452">tag_i</text>
                <text x="188" y="516">Snapshot</text>
                <text x="192" y="532">Authenticator</text>
                <text x="188" y="596">snapshot</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
                  CEK + salt
                      |
                      v
               .-----------.
               |  Payload  |
               |  Schedule |
               '-----------'
            /     |      |     \
           v      v      v      v
       commit  payload  nonce   snap
                key     base    key
         |       |       |       |
         v       v       v       |
       .---.  .------. .-----.   |
       |cmt|  |seg   | |nonce|   |
       |   |  |key(i)| | (i) |   |
       '---'  '------' '-----'   |
                  \       /      |
                   \     /       |
                    v   v        |
                 .----------.    |
                 |   AEAD   |    |
                 |  Seal(i) |    |
                 '----------'    |
                   /      \      |
                  v        v     |
                ct_i     tag_i   |
                            \    |
                             v   v
                     .-----------------.
                     |    Snapshot     |
                     |  Authenticator  |
                     '-----------------'
                              |
                              v
                          snapshot
]]></artwork>
        </artset>
      </figure>
      <t>The figure shows each segment's tag feeding the authenticator.  Its
actual per-segment input is the segment leaf, formed from the metadata
entry (<xref target="segment-leaf"/>).</t>
      <section anchor="raae-mapping">
        <name>Construction Overview</name>
        <t>The commitment lets a reader reject a wrong key or parameter set before
decrypting.  The snapshot, when present, authenticates the current
segment set.  SEAL realizes the raAE operations of <xref target="raae-syntax"/> as
follows:</t>
        <table anchor="op-mapping">
          <name>raAE operations and their SEAL realizations</name>
          <thead>
            <tr>
              <th align="left">raAE operation</th>
              <th align="left">SEAL realization</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">StartEnc</td>
              <td align="left">Derive the payload schedule from the CEK and salt, committing G (<xref target="key-derivation"/>), and, under a snapshot authenticator, the snapshot over the empty set</td>
            </tr>
            <tr>
              <td align="left">StartDec</td>
              <td align="left">Re-derive the schedule and verify the stored commitment (<xref target="framework-commitment"/>)</td>
            </tr>
            <tr>
              <td align="left">EncSeg, DecSeg</td>
              <td align="left">EncryptSegment and DecryptSegment (<xref target="segment-subroutines"/>)</td>
            </tr>
            <tr>
              <td align="left">RewriteSeg</td>
              <td align="left">RewriteSegment, then update the snapshot authenticator for the changed segment (<xref target="full-rewrite"/>)</td>
            </tr>
            <tr>
              <td align="left">SnapVerify</td>
              <td align="left">Check the index set, count, and authenticator inputs, then verify the snapshot via the authenticator (<xref target="snapshot-authenticator"/>)</td>
            </tr>
          </tbody>
        </table>
        <t>SEAL's salt, payload_info, and G carry the raAE per-message inputs, and
the commitment stands in for the header (<xref target="components"/>).</t>
      </section>
      <section anchor="components">
        <name>Component Suite and Parameters</name>
        <t anchor="parameters"><xref target="param-table"/> lists the parameters, inputs, and derived values, with
what sets each and where it is defined.</t>
        <table anchor="param-table">
          <name>Parameters, inputs, and derived values</name>
          <thead>
            <tr>
              <th align="left">Parameter</th>
              <th align="left">Type or range</th>
              <th align="left">Set by</th>
              <th align="left">Defined in</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">AEAD</td>
              <td align="left">RFC 5116 algorithm</td>
              <td align="left">suite</td>
              <td align="left">
                <xref target="suite-choices"/></td>
            </tr>
            <tr>
              <td align="left">KDF</td>
              <td align="left">KDF algorithm</td>
              <td align="left">suite</td>
              <td align="left">
                <xref target="kdf-combiner"/></td>
            </tr>
            <tr>
              <td align="left">segment_max</td>
              <td align="left">power of two, at least 4096</td>
              <td align="left">suite</td>
              <td align="left">
                <xref target="suite-choices"/></td>
            </tr>
            <tr>
              <td align="left">epoch_length</td>
              <td align="left">integer r in 0 to 63</td>
              <td align="left">suite</td>
              <td align="left">
                <xref target="epoch-key-derivation"/></td>
            </tr>
            <tr>
              <td align="left">protocol_id</td>
              <td align="left">octet string</td>
              <td align="left">application</td>
              <td align="left">
                <xref target="security-domain-separation"/></td>
            </tr>
            <tr>
              <td align="left">nonce_mode</td>
              <td align="left">"random" or "derived"</td>
              <td align="left">message, within the profile</td>
              <td align="left">
                <xref target="nonce-generation"/></td>
            </tr>
            <tr>
              <td align="left">aad_label</td>
              <td align="left">ASCII string</td>
              <td align="left">profile</td>
              <td align="left">
                <xref target="concrete-segment-aad"/></td>
            </tr>
            <tr>
              <td align="left">commitment_length</td>
              <td align="left">integer, at least 16, default Nh</td>
              <td align="left">profile</td>
              <td align="left">
                <xref target="appendix-commitment"/></td>
            </tr>
            <tr>
              <td align="left">Nk, Nn, Nt, Nb</td>
              <td align="left">sizes in octets</td>
              <td align="left">AEAD</td>
              <td align="left">
                <xref target="notation"/></td>
            </tr>
            <tr>
              <td align="left">Nh</td>
              <td align="left">size in octets</td>
              <td align="left">KDF</td>
              <td align="left">
                <xref target="notation"/></td>
            </tr>
            <tr>
              <td align="left">CEK</td>
              <td align="left">32 uniform random octets</td>
              <td align="left">message input</td>
              <td align="left">
                <xref target="key-derivation"/></td>
            </tr>
            <tr>
              <td align="left">salt</td>
              <td align="left">32 uniform random octets</td>
              <td align="left">message input</td>
              <td align="left">
                <xref target="key-derivation"/></td>
            </tr>
            <tr>
              <td align="left">payload_info</td>
              <td align="left">ordered element list</td>
              <td align="left">message input</td>
              <td align="left">
                <xref target="seal-encodings"/></td>
            </tr>
            <tr>
              <td align="left">G</td>
              <td align="left">octet string, empty by default</td>
              <td align="left">message input</td>
              <td align="left">
                <xref target="framework-commitment"/></td>
            </tr>
            <tr>
              <td align="left">commitment</td>
              <td align="left">commitment_length octets</td>
              <td align="left">derived per message</td>
              <td align="left">
                <xref target="key-derivation"/></td>
            </tr>
            <tr>
              <td align="left">payload_key</td>
              <td align="left">Nk octets</td>
              <td align="left">derived per message</td>
              <td align="left">
                <xref target="key-derivation"/></td>
            </tr>
            <tr>
              <td align="left">snap_key</td>
              <td align="left">Nh octets</td>
              <td align="left">derived per message</td>
              <td align="left">
                <xref target="key-derivation"/></td>
            </tr>
            <tr>
              <td align="left">nonce_base</td>
              <td align="left">Nn octets, derived mode only</td>
              <td align="left">derived per message</td>
              <td align="left">
                <xref target="key-derivation"/></td>
            </tr>
            <tr>
              <td align="left">epoch_key(i)</td>
              <td align="left">Nk octets</td>
              <td align="left">derived per segment</td>
              <td align="left">
                <xref target="epoch-key-derivation"/></td>
            </tr>
            <tr>
              <td align="left">segment_key(i)</td>
              <td align="left">Nk octets</td>
              <td align="left">derived per segment</td>
              <td align="left">
                <xref target="epoch-key-derivation"/></td>
            </tr>
            <tr>
              <td align="left">nonce(i)</td>
              <td align="left">Nn octets</td>
              <td align="left">derived per segment</td>
              <td align="left">
                <xref target="nonce-generation"/></td>
            </tr>
            <tr>
              <td align="left">segment_aad(i, is_final, A_i)</td>
              <td align="left">octet string</td>
              <td align="left">derived per segment</td>
              <td align="left">
                <xref target="concrete-segment-aad"/></td>
            </tr>
            <tr>
              <td align="left">tag_i</td>
              <td align="left">Nt octets</td>
              <td align="left">derived per segment</td>
              <td align="left">
                <xref target="segment-subroutines"/></td>
            </tr>
          </tbody>
        </table>
        <t>SEAL fixes the segment additional authenticated data (AAD) encoding
(<xref target="concrete-segment-aad"/>), the commitment derivation
(<xref target="framework-commitment"/>), and the keyed snapshot
(<xref target="snapshot-authenticator"/>) identically across all suites.  Their octet
lengths still vary by suite, because Nh and Nt are suite-dependent.</t>
        <section anchor="suite-choices">
          <name>Suite Choices</name>
          <t>A suite is assembled from the following choices.</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="kdf-combiner"/>.</t>
            </dd>
            <dt>segment_max:</dt>
            <dd>
              <t>A positive integer, a power of two and at least 4096 octets.  Each
segment carries at most this many plaintext octets.  The
length-dependent limits of <xref target="aead-usage-limits"/> are computed at
this size.</t>
            </dd>
            <dt>epoch_length:</dt>
            <dd>
              <t>A non-negative integer r in 0 to 63.  Each epoch covers 2^r
consecutive segments aligned to a multiple of 2^r, so r sets the
key-rotation granularity:  r = 0 gives a fresh epoch key per segment
and r = 63 one key for all segments (<xref target="epoch-key-derivation"/>).
Profiles <bcp14>MAY</bcp14> restrict r further per AEAD.</t>
            </dd>
            <dt>protocol_id:</dt>
            <dd>
              <t>An application-chosen octet string that binds all derived values to
a specific protocol version.  Selection guidance is in
<xref target="security-domain-separation"/>.</t>
            </dd>
            <dt>nonce_mode:</dt>
            <dd>
              <t>A payload_info element selecting one of two nonce constructions,
"random" or "derived".  The constructions are defined in
<xref target="nonce-generation"/>, and the valid (nonce_mode, snap_id,
segment_commitment) tuples depend on the profile.</t>
            </dd>
          </dl>
        </section>
        <section anchor="profile-constants">
          <name>Profile-Level Constants</name>
          <t>One constant is fixed by the profile rather than carried per message.</t>
          <dl>
            <dt>aad_label:</dt>
            <dd>
              <t>A profile-level ASCII string bound as the first element of the
segment AAD encoding (<xref target="concrete-segment-aad"/>).  Consuming
protocols <bcp14>MAY</bcp14> define their own profiles with a distinct aad_label.</t>
            </dd>
          </dl>
        </section>
        <section anchor="algorithm-sizes">
          <name>Algorithm-Determined Sizes</name>
          <t>The sizes Nk, Nn, Nt, and Nh are fixed by the chosen AEAD and KDF rather
than by the parameter set directly, as is Nb where it is defined.  They
are defined in <xref target="notation"/>.  One configurable length defaults from Nh.</t>
          <dl>
            <dt>commitment_length:</dt>
            <dd>
              <t>A positive integer of at least 16, defaulting to Nh, the length in
octets of the key commitment prefix.  The collision bounds for each
length are given in <xref target="appendix-commitment"/>.</t>
            </dd>
          </dl>
        </section>
        <section anchor="message-inputs">
          <name>Per-Message Inputs</name>
          <t>An encrypted message is built from four input values.</t>
          <dl>
            <dt>CEK:</dt>
            <dd>
              <t>A 32-octet uniform random Content Encryption Key generated fresh for
each message.  The CEK is input keying material for the key
schedule, not an AEAD key.</t>
            </dd>
            <dt>salt:</dt>
            <dd>
              <t>A per-content value of 32 uniformly random octets.  The salt
separates payload schedule outputs across messages even when the
CEK is reused.  <xref target="full-encryption"/> and <xref target="extend"/> give the rules
for generating and reusing it, and <xref target="salt-reuse"/> analyzes the
consequences of reuse.</t>
            </dd>
            <dt>payload_info:</dt>
            <dd>
              <t>The committed record of the object's configuration: an ordered
list of parameter set context elements covering key derivation,
AEAD operations, AAD construction, and nonce construction, which
the commitment (<xref target="framework-commitment"/>) binds.  The profile fixes
the concrete element set and their encodings.  SEAL's payload_info
is specified in <xref target="seal-encodings"/>.</t>
            </dd>
            <dt>G:</dt>
            <dd>
              <t>An octet string of global associated data, the G input of StartEnc in
the raAE primitive (<xref target="raae-syntax"/>), binding whole-message
application context such as a name, version, or policy.  G defaults to
the empty octet string and is never stored:  a decryptor supplies it
from application context, and the commitment binds it
(<xref target="framework-commitment"/>).</t>
            </dd>
          </dl>
          <t>The remaining symbols in <xref target="param-table"/> are derived values.  The
payload schedule computes the per-message values once from the CEK and
payload_info, fixing them for the message's lifetime
(<xref target="key-derivation"/>).  The commitment additionally binds G
(<xref target="framework-commitment"/>).  Per-segment values are defined where they
are computed, in the sections <xref target="param-table"/> cites.</t>
        </section>
      </section>
      <section anchor="kdf-combiner">
        <name>The KDF Combiner</name>
        <t>The KDF combiner uses a length-prefixed encoding for all of its inputs.</t>
        <artwork><![CDATA[
frame(x):
    if len(x) <= 0xFFFE:  return uint16(len(x)) || x     ;; literal
    else:                 return uint16(0xFFFF) || LH(x) ;; digest

encode(x1, ..., xn) = frame(x1) || ... || frame(xn)
]]></artwork>
        <t>frame is total over every field length.  A field too large to emit
literally is instead prefixed by the reserved length 0xFFFF and an
Nh-octet digest LH(x).</t>
        <t>LH(x), the over-large-field digest, runs the cipher suite's native KDF
primitive directly on x, invoking neither encode nor frame, and returns
Nh octets.  The two-step and one-step classes are HPKE's: a two-step KDF
(<xref target="RFC9180"/>) uses its extract step, and a one-step KDF
(<xref target="I-D.ietf-hpke-pq"/>) its XOF, with x carried under the label
"raAE-LP-v1":</t>
        <artwork><![CDATA[
two-step:  LH(x) = Extract("raAE-LP-v1", x)
one-step:  LH(x) = XOF("raAE-LP-v1" || x, Nh)
]]></artwork>
        <t>Running LH through the full KDF would re-enter frame on the over-large x
and recurse.  The direct native call avoids that.</t>
        <t><xref target="framing"/> requires the construction to justify the collision
resistance of the over-large-field digest.  LH's is that of the cipher
suite's KDF primitive at the suite's Nh.  In the two-step class LH(x) is
HMAC under the fixed public key "raAE-LP-v1", so a collision in LH
yields a collision in the underlying hash:  with the key fixed, an HMAC
collision on distinct inputs is a collision of its inner or its outer
hash call.  In the one-step class LH(x) is the XOF itself over a
domain-separated input, so a collision in LH is a collision in the XOF
at that output length.</t>
        <t>The injectivity of encode, and LH's domain separation from the literal
encoding, are established in <xref target="framing"/>.</t>
        <t>Key material is derived through a KDF with the 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>This KDF binds protocol_id, a label, and inputs of any size into a
derived value.  frame reduces any over-large input to a fixed-size
digest before the KDF sees it.  Any protocol instantiates the combiner
by supplying its own protocol_id, which domain-separates its derivations
from those of every other protocol.</t>
        <t>The KDF is built from the cipher suite's hash in one of two forms.  The
cipher suite's kdf_id selects which one.</t>
        <section anchor="two-step-kdf">
          <name>Two-Step KDF</name>
          <artwork><![CDATA[
KDF(protocol_id, label, ikm, info, L):
  extract_input = encode(protocol_id, label,
                         ...ikm)
  prk = Extract(salt=protocol_id,
                ikm=extract_input)
  expand_info = encode(protocol_id, label,
                       ...info, uint16(L))
  return Expand(prk, expand_info, L)
]]></artwork>
          <t>The notation <tt>...x</tt> means each element of the sequence x, whether ikm or
info, is a separate argument to encode.  A single octet string is the
one-element sequence containing it.  An absent value is the empty
sequence and contributes no arguments.  The empty sequence and the
one-element sequence whose element is the empty octet string are
distinct:  the first adds nothing to the encode, the second adds one
zero-length field.  A derivation with no info <bcp14>MUST</bcp14> use the empty
sequence, not the empty octet string, so that every implementation
encodes a given (protocol_id, label, ikm, info, L) tuple to the same
octets.  The protocol_id appears in both the Extract salt and the
extract_input as a defensive measure, and binding in either position
suffices for domain separation.</t>
          <t>The label appears in both Extract and Expand so that label binding is
preserved even if one phase is weak in isolation.  Implementations <bcp14>MAY</bcp14>
amortize the Extract computation internally when deriving multiple
outputs from the same protocol_id, label, and ikm.</t>
        </section>
        <section anchor="one-step-kdf">
          <name>One-Step KDF</name>
          <artwork><![CDATA[
KDF(protocol_id, label, ikm, info, L):
  M = encode(protocol_id, label,
             encode(...ikm), encode(...info),
             uint16(L))
  return XOF(M, L)
]]></artwork>
          <t>The XOF-based form frames ikm and info each as a single element of one
length-prefixed encode and squeezes L octets of output.  protocol_id
binding is via the message-side encode prefix only.  In both forms the
encoded input ends with uint16(L):  the two-step form places it last in
expand_info and the one-step form places it last in M.  Within a fixed
kdf_id, distinct (protocol_id, label, ikm, info, L) tuples have distinct
framed inputs, subject to the digest-collision qualification in
<xref target="framing"/>.  KDF output pseudorandomness is a separate requirement;
distinct framed inputs can still produce colliding outputs.  The two
forms are not mutually injective:  a cipher suite's kdf_id selects one
form for that suite, and payload_info commits to the kdf_id
(<xref target="seal-encodings"/>), so no derivation ever compares outputs across
forms.  The two-step form binds ikm in Extract and info in Expand.  A
multi-value ikm or info is the encode of its elements, so any number of
elements is admitted.</t>
        </section>
      </section>
      <section anchor="seal-encodings">
        <name>SEAL Encodings and Labels</name>
        <section anchor="payload-info-construction">
          <name>Payload Info Construction</name>
          <artwork><![CDATA[
payload_info = [aead_id, segment_max_be, kdf_id, snap_id,
                segment_commitment, nonce_mode, epoch_length_u8, salt]
]]></artwork>
          <t>Element encodings for SEAL:</t>
          <ul spacing="normal">
            <li>
              <t>aead_id: 2 octets, uint16(id), the unsigned 16-bit AEAD identifier.</t>
            </li>
            <li>
              <t>segment_max_be: 4 octets, uint32(segment_max).</t>
            </li>
            <li>
              <t>kdf_id: 2 octets, uint16(id), the unsigned 16-bit KDF identifier.</t>
            </li>
            <li>
              <t>snap_id: 2 octets, uint16(id), the snapshot authenticator identifier.</t>
            </li>
            <li>
              <t>segment_commitment: 1 octet, 0x00 when the leaf does not bind the
segment's content and 0x01 when it does (<xref target="snapshot-interface"/>).  It
is a choice independent of snap_id, but not every (snap_id,
segment_commitment) pair is sound, so a profile selects a valid one.</t>
            </li>
            <li>
              <t>nonce_mode: 1 octet, the nonce construction:  0x00 for random, 0x01
for derived.  A profile <bcp14>MAY</bcp14> select any valid (nonce_mode, snap_id,
segment_commitment) tuple.</t>
            </li>
            <li>
              <t>epoch_length_u8: 1 octet, uint8(epoch_length).  Implementations <bcp14>MUST</bcp14>
reject epoch_length &gt;= 64 on both encode and decode.</t>
            </li>
            <li>
              <t>salt: 32 raw octets, the per-message salt.</t>
            </li>
          </ul>
          <t>The aad_label is a profile-level constant for SEAL (see
<xref target="concrete-segment-aad"/>) and is not carried in payload_info.  The KDF
(<xref target="kdf-combiner"/>) applies frame to each element of the list.</t>
        </section>
        <section anchor="concrete-segment-aad">
          <name>Segment AAD</name>
          <t>The segment AAD binds each segment to its context.  What it must carry
depends on the nonce mode: a random nonce binds neither the segment
index nor the finality bit, so the AAD must, whereas a derived nonce
binds both (<xref target="derived-nonces"/>).</t>
          <artwork><![CDATA[
segment_aad(i, is_final, A_i):
  if nonce_mode is "random":
    if A_i is empty:
      return encode(aad_label, uint64(i), uint8(is_final))
    return encode(aad_label, uint64(i), uint8(is_final), A_i)
  ;; derived nonce mode
  if A_i is empty:
    return ""
  return encode(aad_label, A_i)
]]></artwork>
          <table anchor="segment-aad-modes">
            <name>Segment AAD by nonce mode</name>
            <thead>
              <tr>
                <th align="left"> </th>
                <th align="left">Random nonce mode</th>
                <th align="left">Derived nonce mode</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Index i and is_final</td>
                <td align="left">bound in the AAD</td>
                <td align="left">bound in the nonce</td>
              </tr>
              <tr>
                <td align="left">A_i, when present</td>
                <td align="left">appended as a fourth encode element</td>
                <td align="left">the sole variable element</td>
              </tr>
              <tr>
                <td align="left">A_i, when empty</td>
                <td align="left">omitted, not a zero-length element</td>
                <td align="left">segment_aad is empty, with no associated-data pass</td>
              </tr>
            </tbody>
          </table>
          <t>aad_label is the profile-chosen label from the parameter set, the index
i is a big-endian 8-octet integer, and is_final is 1 for the last
segment and 0 for all others.  Because encode length-prefixes every
element, omitting an empty A_i stays injective, so the index and
finality bit remain authenticated.  Any profile that defines a
random-mode segment_aad <bcp14>MUST</bcp14> preserve injectivity and <bcp14>MUST</bcp14> authenticate
the segment index and finality bit.  aad_label is bound transitively
through protocol_id (<xref target="parameter-mismatch"/>), so segment_aad need not
repeat it for cross-profile separation.</t>
          <t>More generally, the binding of the triple (i, is_final, A_i) <bcp14>MUST</bcp14> be
unambiguous under one segment key, so that no two distinct triples
present the same inputs to the AEAD.  In random nonce mode segment_aad
alone <bcp14>MUST</bcp14> injectively bind the triple, because the nonce is an
independent random draw.  In derived nonce mode i and is_final are bound
in the nonce and A_i, when present, in segment_aad, and the (nonce,
segment_aad) pair <bcp14>MUST</bcp14> jointly determine the triple
(<xref target="derived-nonces"/>).</t>
          <t>A_i is the caller-supplied per-segment associated data of EncSeg and
DecSeg (<xref target="raae-syntax"/>), passed to the segment algorithms
(<xref target="segment-subroutines"/>).  It <bcp14>MAY</bcp14> be empty and <bcp14>MAY</bcp14> differ per segment.
Unlike a global associated data value G, which the commitment fixes at
creation (<xref target="framework-commitment"/>), A_i rides the per-segment AEAD
associated data and is rewritable: a rewrite can change a segment's A_i.</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.</t>
          <t>Because each segment binds its index and finality bit
(<xref target="segment-aad-modes"/>), unauthorized truncation and extension fail
per-segment authentication, which <xref target="full-decryption"/> requires a
decryptor to check.  Authorized truncation by the CEK holder re-marks
the new last segment as final, or empties the object, and updates the
snapshot (<xref target="extend"/>).</t>
          <t>The per-segment AEAD binds a segment's index and finality, not its
length, by the same means.  A segment's ciphertext length is
authenticated implicitly by the AEAD tag over the ciphertext:  altering,
truncating, or splicing a segment ciphertext is an AEAD forgery, not a
parsing ambiguity.  Because segments may be shorter than segment_max,
the consuming format <bcp14>MUST</bcp14> convey each segment's ciphertext length to the
decoder.  A wrong length yields an AEAD rejection, never a silent
accept.</t>
        </section>
        <section anchor="labels">
          <name>Labels</name>
          <table anchor="label-table">
            <name>SEAL core KDF labels by role</name>
            <thead>
              <tr>
                <th align="left">Derivation role</th>
                <th align="left">Label variable</th>
                <th align="left">Value</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Commitment</td>
                <td align="left">commit_label</td>
                <td align="left">"commit"</td>
              </tr>
              <tr>
                <td align="left">Payload key</td>
                <td align="left">payload_key_label</td>
                <td align="left">"payload_key"</td>
              </tr>
              <tr>
                <td align="left">Snapshot authenticator key</td>
                <td align="left">snap_key_label</td>
                <td align="left">"snap_key"</td>
              </tr>
              <tr>
                <td align="left">Nonce base</td>
                <td align="left">nonce_base_label</td>
                <td align="left">"nonce_base"</td>
              </tr>
              <tr>
                <td align="left">Epoch key</td>
                <td align="left">epoch_key_label</td>
                <td align="left">"epoch_key"</td>
              </tr>
            </tbody>
          </table>
          <t>SEAL fixes each label to the value above.  The construction formulas
reference labels by variable name, so the labels are SEAL parameters
rather than constants of the raAE construction.  Each value is an ASCII
string and is distinct from all others.  These are the always-present
key-schedule labels.  The configured snapshot authenticator
(<xref target="snapshot-interface"/>), the plaintext-bound nonce construction
(<xref target="appendix-pt-bound"/>), and hedged randomness (<xref target="hedged-randomness"/>)
each define their own labels.</t>
        </section>
      </section>
      <section anchor="key-derivation">
        <name>Key Schedule and Nonce Generation</name>
        <t>A message's entire key hierarchy grows from two random values.  All
other keys are derived deterministically through the KDF of
<xref target="kdf-combiner"/>.</t>
        <section anchor="payload-schedule">
          <name>Payload Schedule</name>
          <t>Four values are derived from the CEK and per-content salt.</t>
          <artwork><![CDATA[
payload_info = [aead_id,
                uint32(segment_max),
                kdf_id,
                snap_id,
                segment_commitment,
                nonce_mode,
                uint8(epoch_length),
                salt]

commitment  = KDF(protocol_id, commit_label,
                  [CEK], [...payload_info, G], commitment_length)
payload_key = KDF(protocol_id, payload_key_label,
                  [CEK], payload_info, Nk)
snap_key     = KDF(protocol_id, snap_key_label,
                  [CEK], payload_info, Nh)

;; For derived nonce mode only:
nonce_base  = KDF(protocol_id, nonce_base_label,
                  [CEK], payload_info, Nn)
]]></artwork>
          <t>G is the global associated data of <xref target="message-inputs"/>, always the last
element of the commitment info.  It defaults to the empty octet string,
one zero-length element, so every commitment derivation includes it.
The other three derivations never take G.</t>
        </section>
        <section anchor="epoch-key-derivation">
          <name>Epoch Key Derivation</name>
          <t>An AEAD with a 96-bit nonce (Nn = 12) has, at a 2^(-32)
collision-probability target, a random-nonce budget of about 2^32
encryptions per key.  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.  Meeting an
aggregate target also requires <xref target="aggregate-usage"/>.</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 >> epoch_length
  return KDF(protocol_id, epoch_key_label,
             [payload_key],
             [uint64(epoch_index)], Nk)
]]></artwork>
          <t>At epoch_length = 0 the shift is the identity, so each segment has its
own epoch key.  At a large epoch_length every segment shares one epoch
key.  Implementations <bcp14>MUST</bcp14> apply this derivation at every epoch_length,
including 0, and <bcp14>MUST NOT</bcp14> use payload_key directly as a segment key.
Epoch keys implement the parallel external rekeying pattern of
<xref target="RFC8645"/>, adapted for random-access patterns.</t>
        </section>
        <section anchor="nonce-generation">
          <name>Nonce Generation</name>
          <t>Two nonce modes, random and derived, trade off AEAD flexibility, storage
cost, and trust in a cryptographically secure pseudorandom number
generator (CSPRNG).  Derived mode needs misuse-resistant authenticated
encryption (MRAE) unless the profile's writer discipline keeps every
derived nonce unique.  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>The Two Nonce Modes</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="128" width="328" viewBox="0 0 328 128" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 40,80 L 40,96" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="48,96 36,90.4 36,101.6" fill="black" transform="rotate(90,40,96)"/>
                  <g class="text">
                    <text x="32" y="36">Random:</text>
                    <text x="188" y="36">Derived:</text>
                    <text x="196" y="52">nonce_base</text>
                    <text x="44" y="68">Random(Nn)</text>
                    <text x="176" y="68">|</text>
                    <text x="168" y="84">XOR</text>
                    <text x="256" y="84">((i&lt;&lt;1)|is_final)</text>
                    <text x="176" y="100">|</text>
                    <text x="44" y="116">nonce(i)</text>
                    <text x="196" y="116">nonce(i)</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
Random:            Derived:
                   nonce_base
Random(Nn)           |
    |              XOR ((i<<1)|is_final)
    v                |
 nonce(i)           nonce(i)
]]></artwork>
            </artset>
          </figure>
          <t>The two modes differ as follows:</t>
          <table anchor="nonce-mode-comparison">
            <name>Random and derived nonce modes</name>
            <thead>
              <tr>
                <th align="left">Property</th>
                <th align="left">Random nonce mode</th>
                <th align="left">Derived nonce mode</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Per-segment nonce stored</td>
                <td align="left">yes, in segment metadata</td>
                <td align="left">no</td>
              </tr>
              <tr>
                <td align="left">CSPRNG required</td>
                <td align="left">yes</td>
                <td align="left">no</td>
              </tr>
              <tr>
                <td align="left">AEAD requirement</td>
                <td align="left">any AEAD</td>
                <td align="left">MRAE, or any under a nonce-uniqueness discipline</td>
              </tr>
              <tr>
                <td align="left">Rewrite</td>
                <td align="left">fresh nonce each write</td>
                <td align="left">nonce fixed by index, reused on rewrite</td>
              </tr>
              <tr>
                <td align="left">Per-segment AAD</td>
                <td align="left">binds index and finality</td>
                <td align="left">empty when no A_i (index/finality in nonce)</td>
              </tr>
              <tr>
                <td align="left">Minimum nonce size Nn</td>
                <td align="left">no added constraint</td>
                <td align="left">at least 8 octets</td>
              </tr>
            </tbody>
          </table>
          <section anchor="random-nonce-mode">
            <name>Random Nonce Mode</name>
            <t>In random nonce mode (nonce_mode = "random"), each segment gets an
independent random nonce:</t>
            <artwork><![CDATA[
nonce(i) = Random(Nn)
]]></artwork>
            <t>Each segment's nonce is stored in per-segment metadata and <bcp14>MUST</bcp14> be
accessible to any reader that decrypts individual segments.  This mode
requires a functioning CSPRNG.  The nonce collision probability across
independently generated per-segment nonces follows the standard birthday
bound.  See <xref target="aead-usage-limits"/>.</t>
            <t>Two optional encryptor-side hedges harden this mode against different
threats.  Hedged randomness (<xref target="hedged-randomness"/>) mixes a long-term
key into each draw and defends against a weak or predictable CSPRNG.
The hedge's inputs are the CSPRNG output and a per-call value, tag2.
If tag2 stays unique, duplicated CSPRNG state alone cannot repeat the
hedged output.  Duplication that also rolls back tag2's source replays
the hedged output (<xref target="hedged-randomness"/>).  Only the plaintext-bound
construction (<xref target="appendix-pt-bound"/>) defends against that, because it
mixes in the plaintext.  It defends only segments whose plaintext or
segment AAD differ.  Both hedges are implementation-local, leave the
wire format unchanged, and are not separate nonce modes.</t>
          </section>
          <section anchor="derived-nonces">
            <name>Derived Nonce Mode</name>
            <t>Derived nonce mode is intended for profiles that do not store a
per-segment nonce.  Nonces are derived deterministically from the
payload schedule.  Derived nonce mode is defined only for AEADs whose
nonce size Nn is at least 8 octets.  The segment index occupies the high
bits of an 8-octet counter and the finality bit occupies the low bit, so
the per-segment AAD need not carry either one.  The XOR 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 << 1) | is_final))
]]></artwork>
            <t>The encoded value (i &lt;&lt; 1) | is_final <bcp14>MUST</bcp14> fit in the low 8 octets of
nonce_base, so the segment index i <bcp14>MUST</bcp14> be less than 2^63.  This caps an
object at 2^63 segments, far beyond any reachable object.  See
<xref target="max-object-size"/> for the resulting size limit.</t>
            <t>A derived nonce is fixed by the segment's index and finality bit, so
re-encrypting a segment at the same index and finality repeats its
nonce.  With unchanged plaintext and associated data, the repetition
reproduces the first ciphertext, because AEAD.Encrypt is a function of
its inputs.</t>
            <t>With changed inputs the outcome depends on the AEAD.  An MRAE AEAD
tolerates the repetition, degrading to equality leakage rather than
plaintext recovery, within the rewrite count its multi-user bound allows
(<xref target="mrae-bounds"/>).  A non-MRAE AEAD leaks plaintext.  So with a non-MRAE
AEAD, derived nonce mode <bcp14>MUST</bcp14> be confined to a profile whose discipline
never re-encrypts a segment with a different plaintext or associated
data.</t>
            <t>Two such disciplines matter here.  A write-once profile rewrites nothing
and performs no length change, so no segment is re-encrypted at all.  An
append-only profile re-encrypts one segment per append, the re-mark that
supersedes the old terminal segment, and that re-mark carries the
segment's existing plaintext and changes only the finality bit, which
changes the nonce (<xref target="append-only"/>).</t>
            <t>Under either discipline, each object <bcp14>MUST</bcp14> have its own fresh salt, so
its nonce base differs from every other object's.  The encryptor <bcp14>MUST
NOT</bcp14> perform a second encryption at any (i, is_final) pair under that
salt, including after a crash (<xref target="nonce-misuse"/>), and <bcp14>MUST NOT</bcp14> restart
encryption of an incomplete object under that salt, even at pairs it has
not used.  Resending stored ciphertext and its metadata is not an
encryption; anything else needs a fresh salt.  The restart rule keeps
each index to one finality form, which the terminal check of
<xref target="full-decryption"/> rests on.  A writer interrupted after encrypting
index k as the final segment that restarted under the same salt with a
longer input would write a non-final segment at k beside the final one,
and a holder of the old bytes could present a truncation that verifies.</t>
            <t>Because the nonce binds index and finality, an immutable, write-once
profile in derived nonce mode coincides with STREAM (<xref target="related-work"/>)
at the nonce-and-AEAD layer:  a key-derived counter-plus-final-bit nonce
over a per-segment AEAD with no associated data.</t>
          </section>
        </section>
      </section>
      <section anchor="framework-commitment">
        <name>Commitment</name>
        <t>The commitment is a commitment_length-octet value the payload schedule
derives from the CEK, payload_info, and the global associated data G
(<xref target="key-derivation"/>).</t>
        <t>A reader <bcp14>MUST</bcp14> verify the commitment before decrypting any segment,
deriving the expected value from the CEK, payload_info, and G and
comparing it octet-for-octet with the stored value, and <bcp14>MUST</bcp14> treat a
mismatch as an authentication failure for the object.  A mismatch
indicates a wrong key, parameter set, or G, or a corrupted header.  This
is the ra-CMT context commitment for fixed per-segment A_i (<xref target="ra-cmt"/>).
The reduction outline and bound are in <xref target="key-commitment"/>.</t>
        <t>Because the commitment is fixed at creation, G is immutable:  changing
it invalidates the stored commitment, while segment contents stay
rewritable through the snapshot authenticator
(<xref target="snapshot-authenticator"/>).</t>
        <t>G defaults to the empty octet string, so an application that supplies no
context commits over an empty final element.  A wrong G fails the
commitment check (<xref target="full-decryption"/>) the same way a wrong CEK does
(<xref target="parameter-mismatch"/>).</t>
      </section>
      <section anchor="snapshot-authenticator">
        <name>Snapshot Authenticator</name>
        <t>The snapshot authenticator binds the current segment set into the keyed
snapshot.  A SEAL profile selects one with snap_id.</t>
        <section anchor="snapshot-interface">
          <name>Interface and Requirements</name>
          <t>A snapshot authenticator defines a per-segment input, one value per
segment.  It produces and checks a keyed snapshot over the (index,
input) set and the count with two operations:</t>
          <dl>
            <dt>snapshot():</dt>
            <dd>
              <t>Produce the keyed snapshot over the current (index, input) set and the
count n_seg.</t>
            </dd>
            <dt>verify(snapshot):</dt>
            <dd>
              <t>Recompute the keyed snapshot over the current (index, input) set and
the count, reading any witness SnapVerify passes in place of the
segments not presented (none for the whole-object target), and accept
only if it equals the stored snapshot under a constant-time
comparison.</t>
            </dd>
          </dl>
          <t>The per-segment input is defined by the authenticator, and SEAL's strict
authenticators use the segment leaf (<xref target="segment-leaf"/>).</t>
          <t>The AEAD tag binds the segment's index and finality bit against a party
without the key, through the segment AAD in random nonce mode and
through the nonce in derived nonce mode.  A CEK holder can produce a
valid tag for altered content at any index.  Setting the ciphertext
digest puts LH(ct_i) in the leaf, so changing the ciphertext changes the
keyed snapshot.  The commitment is therefore needed where the object is
shared among CEK holders, and <bcp14>MAY</bcp14> be omitted where the CEK has a single
holder.</t>
          <t>The ciphertext digest is necessary for that binding but not sufficient.
An ordering is linear when a holder of the snapshot key can find a
different segment set giving the same keyed snapshot below the cost of a
collision, and strict when finding one is a collision problem, as the
snapshot authenticators registry defines them
(<xref target="I-D.sullivan-seal-concrete"/>).  An authenticator with a strict
ordering defines a public snapshot and, at every count k at which the
object is open, an intermediate snapshot:  its keyed or public snapshot
over segments 0..k-1 at count k, with segment k-1 written non-final.
Both are specified in <xref target="open-count-public"/>.  An authenticator with a
linear ordering carries no public snapshot, for the reason given there,
and defines no intermediate snapshot.</t>
          <t>Every authenticator supports the whole-object target:  verify the full
(index, input) set and the count.  An authenticator <bcp14>MAY</bcp14> additionally
support a subset target:  verify that a designated subset of (index,
input) pairs is included at their recorded positions without presenting
the other segments, reading a witness (<xref target="raae-writable"/>) in their place
and checking it against the keyed snapshot.  The keyed snapshot stays a
single target-independent value of length Na, with no per-segment proof
stored.</t>
          <t>To change a stored object, an authenticator updates its keyed snapshot.
It <bcp14>MAY</bcp14> provide add(i, input), remove(i, input), and set_length(n) to
update the value in place from the changed segment alone, or it <bcp14>MAY</bcp14>
recompute the value over the changed (index, input) set.</t>
          <t>A snapshot update is not atomic against a second concurrent update, so a
consuming protocol <bcp14>MUST</bcp14> serialize concurrent updates to one object.
This document requires that a serialization exist and does not say how
to obtain it, which remains a storage-transaction concern of the
consuming protocol.  Serialization is needed whether the authenticator
recomputes the value or updates it in place, and only the failure
differs.  An authenticator that recomputes over the full set binds
whatever set it read, which is neither the state before the interleaved
update nor the state after.  One that updates in place loses an update,
when two read-modify-write cycles on the stored value interleave and the
later write never observed the earlier delta.  This is the concurrent
case, distinct from the crash case of <xref target="rewrite-hazards"/>, where one
update is interrupted rather than two interleaved.</t>
          <t>The scheme's RewriteSeg and SnapVerify (<xref target="raae-writable"/>) are realized
from these operations.  For the whole-object target, SnapVerify takes no
witness and checks a stored snapshot as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>Let n_seg be the number of present segments.</t>
            </li>
            <li>
              <t>Verify that the present segments occupy exactly the indices
  0..n_seg-1, each once.</t>
            </li>
            <li>
              <t>Call verify(snapshot) over the present (index, input) set and the
  count n_seg.</t>
            </li>
          </ol>
          <t>Where the authenticator's input carries the finality bit, as the strict
authenticators' leaf does, SnapVerify binds the declared finality:  it
forms each input with is_final(i) for a snapshot declared complete, and
with 0 at every index for one declared open.  The terminal bit b of each
presented position <bcp14>MUST</bcp14> agree with that declaration:  b = 1 only at
index n_seg-1 of a snapshot declared complete.  SnapVerify rejects a set
whose bits disagree.  SnapVerify does not decrypt, so it does not
establish that a segment opens under that finality.  Segment decryption
checks is_final through the segment AEAD, and <xref target="full-decryption"/>
rejects a present set whose highest-indexed segment does not carry
is_final = 1.</t>
          <t>A duplicate or missing index is caught only by step 2, because an
authenticator's verify <bcp14>MAY</bcp14> accept a malformed index multiset.  An
implementation <bcp14>MUST NOT</bcp14> skip the index-set check.</t>
          <t>A conforming authenticator's snapshot() <bcp14>MUST</bcp14> bind both the (index,
input) set and the count n_seg, so a verifier detects any added,
dropped, reordered, or re-marked segment and any changed input, and the
keyed snapshot <bcp14>MUST</bcp14> be unforgeable by a party without the
authenticator's key, under that authenticator's security assumption.</t>
          <t>The keyed snapshot is a fixed-length value of Na octets, with Na = 0
meaning no value.</t>
          <t>In a complete object, a segment's finality is a function of its index
and the count:</t>
          <artwork><![CDATA[
is_final(i) = 1 if i = n_seg - 1, else 0
]]></artwork>
          <t>It is carried by that segment's input, and every segment of an
intermediate snapshot carries 0.  Because finality follows the count,
changing n_seg moves the terminal position, so rewrite, extend, and
truncate are one update over the segments whose input changes, each
starting from a complete object:</t>
          <ol spacing="normal" type="1"><li>
              <t>Under the current count, remove each changed segment's current
  input (remove(i, input)).  The current n_seg fixes which segment
  is terminal, so each removal carries that segment's current finality.</t>
            </li>
            <li>
              <t>Set the length to the new count (set_length(n)).</t>
            </li>
            <li>
              <t>Under the new count, re-encrypt each surviving changed segment under
  its new finality and add its new input (add(i, input)).  New
  segments are added here.  Discarded segments are not added back.</t>
            </li>
            <li>
              <t>Call snapshot(), which recomputes the keyed snapshot over the new
  count and segment set.</t>
            </li>
          </ol>
          <t>Each operation is an instance of that shape over different segments:</t>
          <table anchor="length-change-table">
            <name>Rewrite, extend, and truncate</name>
            <thead>
              <tr>
                <th align="left">Operation</th>
                <th align="left">Count</th>
                <th align="left">Inputs removed</th>
                <th align="left">Inputs added</th>
                <th align="left">Terminal re-mark</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Rewrite</td>
                <td align="left">unchanged</td>
                <td align="left">the changed segment</td>
                <td align="left">the changed segment</td>
                <td align="left">none</td>
              </tr>
              <tr>
                <td align="left">Extend by k</td>
                <td align="left">n_seg to n_seg+k</td>
                <td align="left">old terminal</td>
                <td align="left">old terminal and k new</td>
                <td align="left">old final, 1 to 0 (none if empty)</td>
              </tr>
              <tr>
                <td align="left">Truncate to m</td>
                <td align="left">n_seg to m</td>
                <td align="left">segments m to n_seg-1, and the old input at m-1</td>
                <td align="left">the re-marked m-1 (none if m=0)</td>
                <td align="left">m-1, 0 to 1 (none if m=0)</td>
              </tr>
            </tbody>
          </table>
          <t>This sequence uses remove, the mutable-authenticator path.  One that
omits remove instead resets and re-adds the surviving segments to
rebuild the value.</t>
          <t>SnapVerify detects truncation in every case but one:  the truncated
object is presented with the snapshot of an earlier complete version at
that shorter count, and presenting it is rollback
(<xref target="snapshot-limitations"/>).  A snapshot at that count taken while the
object was open is not that case, since such a snapshot fixes is_final =
0 at its last index, and so does not verify the shorter object declared
complete.</t>
        </section>
        <section anchor="segment-leaf">
          <name>Segment Leaf</name>
          <t>The per-segment input, leaf(i), is formed from the segment's metadata
entry and its context.  SEAL's strict authenticators use:</t>
          <artwork><![CDATA[
leaf(i) = [LH(ct_i)] || tag_i || nonce_field(i)
          || segment_aad(i, is_final, A_i)

nonce_field(i) = nonce(i), as stored           ;; random nonce mode
               = uint64((i << 1) | is_final)   ;; derived nonce mode
]]></artwork>
          <t>LH(ct_i) is present when the ciphertext digest is set.  In random nonce
mode nonce_field(i) is the stored nonce(i).  In derived nonce mode it is
the counter from which nonce(i) is derived (<xref target="derived-nonces"/>), so
nonce_base is never published, and once the commitment fixes the CEK and
payload_info the counter fixes the nonce.  The field segment_aad is the
segment AAD the segment was encrypted under (<xref target="concrete-segment-aad"/>),
so the leaf carries A_i in both nonce modes, and a verifier needs each
segment's A_i, empty or supplied, to form its leaf.  The bit is_final is
the finality bit the segment was encrypted under:  is_final(i) above for
a complete object, and 0 at every index of an intermediate snapshot.
The stored metadata entry holds the leaf's leading fields, the optional
ciphertext digest, the tag, and the optional stored nonce, in the same
order (<xref target="I-D.sullivan-seal-concrete"/>).  The masked multiset hash uses
tag_i alone as leaf(i).</t>
        </section>
        <section anchor="open-count-public">
          <name>Intermediate and Public Snapshots</name>
          <t>A strict authenticator produces two snapshots over the same leaves
(<xref target="snapshot-kinds-table"/>), and either can be produced while the object
is open.</t>
          <table anchor="snapshot-kinds-table">
            <name>Keyed and public snapshots</name>
            <thead>
              <tr>
                <th align="left"> </th>
                <th align="left">Keyed snapshot</th>
                <th align="left">Public snapshot</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Computed</td>
                <td align="left">under snap_key (<xref target="I-D.sullivan-seal-concrete"/>)</td>
                <td align="left">with an empty ikm in place of snap_key (<xref target="I-D.sullivan-seal-concrete"/>)</td>
              </tr>
              <tr>
                <td align="left">Who can compute it</td>
                <td align="left">holders of the CEK, from which snap_key derives</td>
                <td align="left">anyone who holds the segments and their A_i</td>
              </tr>
              <tr>
                <td align="left">Who can verify it</td>
                <td align="left">holders of the CEK</td>
                <td align="left">anyone, but it is authentic only under a signature or trusted reference</td>
              </tr>
              <tr>
                <td align="left">Protects against</td>
                <td align="left">a party without the CEK altering, dropping, reordering, or truncating segments; with the ciphertext digest, a CEK holder making a fixed, externally authenticated snapshot verify a different segment set</td>
                <td align="left">anyone but the signer doing the same, checked by any verifier; the origin it gives is the signer's</td>
              </tr>
              <tr>
                <td align="left">Does not protect against</td>
                <td align="left">CEK holders producing new keyed snapshots for each other; rollback; staleness</td>
                <td align="left">a signer signing several statements; rollback; staleness; it proves neither that a segment decrypts nor which key derived the commitment</td>
              </tr>
            </tbody>
          </table>
          <t>The two snapshots overlap with the commitment, which binds the CEK,
payload_info, and G.  A key holder checks the commitment before
decrypting, so a wrong key, parameter set, or G fails there
(<xref target="framework-commitment"/>).  snap_key does not bind G, so SEAL's strict
authenticators include the commitment in both snapshots, which ties each
to that object's context.  A verifier without the key cannot check how
the commitment was derived:  for it the commitment is a bound
identifier, and payload_info is in the public snapshot so that the
parameters are authenticated.  The ciphertext digest, LH(ct_i) in the
leaf, is what makes either snapshot bind ciphertext rather than tags
alone.</t>
          <t>Under a strict authenticator a writer <bcp14>MAY</bcp14> produce the snapshot at a
count n at which the object is open, segment n-1 written with is_final =
0 and the object not ended.  It binds the (index, input) set 0..n-1 and
the count n as any snapshot does, so SnapVerify over those segments with
the snapshot declared open accepts, but it is not a snapshot of a
complete object, and the authenticator's specification states what a
reader of the prefix learns from it (<xref target="I-D.sullivan-seal-concrete"/>).</t>
          <t>A public snapshot is an unkeyed function of payload_info, the
commitment, the count, and the ordered (index, input) set.  A linear
ordering cannot carry one, because without a key every party is in the
snap_key holder's position, and a linear ordering lets that party find a
different segment set with the same value below the cost of a collision.
An authenticated public snapshot binds payload_info, the commitment, the
count, and each index's input in order, under the collision resistance
of the functions that compute it, and it is not a hiding commitment:
over inputs that are withheld it gives an offline equality test for
guesses at them.</t>
          <t>A profile or consuming protocol that relies on a public snapshot <bcp14>MUST</bcp14>
set the ciphertext digest:  without it the public snapshot binds tags
but not ciphertext, so anyone can replace a segment's ciphertext and a
verifier without the key still accepts the signed public snapshot.</t>
          <t>A verifier <bcp14>MUST</bcp14> accept a public snapshot only under a signature, or an
authenticated reference from a party it trusts, over a statement that
names the object or stream, the count, whether the object was open at
that count or complete, and the value itself, and that binds G where the
verifier interprets G.  From an accepted public snapshot it learns that
the leaves it recomputes from the segments it holds and their A_i are
those the signer authenticated, at those positions, ciphertext included.</t>
          <t>The two snapshots are computed separately and can cover different
segment sets, so a CEK holder can authenticate one segment set to key
holders and sign another for verifiers without the key.  Where the
signer signed a public snapshot, a key holder that claims the signer's
origin for its segments <bcp14>MUST</bcp14> also verify the signature and recompute the
public snapshot over them, which establishes agreement with the signed
statement, not that the signer signed no other.  A public snapshot does
not replace SnapVerify for a key holder, and freshness, rollback,
withholding, equivocation, and completeness are out of its scope, as for
the keyed snapshot (<xref target="snapshot-limitations"/>).</t>
        </section>
        <section anchor="snapshot-none">
          <name>None</name>
          <t>This selection configures no snapshot authenticator:  no keyed snapshot
is produced (Na = 0), snapshot() and verify() are no-ops, and an object
rests on per-segment authentication alone.  Such a profile <bcp14>MUST NOT</bcp14>
produce the empty object (n_seg = 0).  With no keyed snapshot to bind
the zero count, a truncation that removed every segment would be
indistinguishable from a legitimate empty object, so a valid object
always has at least one segment.</t>
        </section>
      </section>
      <section anchor="segment-subroutines">
        <name>Segment Algorithms</name>
        <t>The construction defines the per-segment subroutines EncryptSegment,
DecryptSegment, and RewriteSegment.  In this random-access construction,
is_final is an explicit input to each subroutine.  Full-message
encryption derives it from the total segment count n_seg, while
random-access decryption and rewrite callers supply it directly.  The
full-message procedures (<xref target="full-encryption"/>, <xref target="full-decryption"/>,
<xref target="extend"/>) and the rewrite procedure (<xref target="full-rewrite"/>) compose them.</t>
        <t>Each subroutine is the cryptographic core of one operation of the base
or extended raAE interface (<xref target="raae-syntax"/>, <xref target="raae-writable"/>),
refining <xref target="op-mapping"/> to the signature level.  The primitive's
position becomes the explicit arguments i and is_final, and its state is
the payload schedule, which the segment_key(i), nonce(i), and
segment_aad calls below read from context rather than take as an
argument.  A segment's plaintext is P_i, and its stored record is
stored_i = (nonce_metadata_i, ct_i, tag_i), which names the stored
values, not their order on the wire (<xref target="I-D.sullivan-seal-concrete"/>).
leaf(i) is the segment's leaf (<xref target="segment-leaf"/>), and new_leaf(i) the
leaf of the record that replaces segment i.</t>
        <table anchor="subroutine-mapping">
          <name>Segment subroutines and the primitive operations they realize</name>
          <thead>
            <tr>
              <th align="left">Subroutine</th>
              <th align="left">Realizes</th>
              <th align="left">Composed by</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">EncryptSegment</td>
              <td align="left">the encryption core of EncSeg</td>
              <td align="left">
                <xref target="full-encryption"/> and <xref target="extend"/>, which add the snapshot bookkeeping</td>
            </tr>
            <tr>
              <td align="left">DecryptSegment</td>
              <td align="left">DecSeg</td>
              <td align="left">
                <xref target="full-decryption"/></td>
            </tr>
            <tr>
              <td align="left">RewriteSegment</td>
              <td align="left">the encryption core of RewriteSeg</td>
              <td align="left">
                <xref target="full-rewrite"/> and <xref target="extend"/>, which add the snapshot bookkeeping</td>
            </tr>
          </tbody>
        </table>
        <t>These subroutines emit ct_i and tag_i as separate fields, with ct_i of
length len(P_i), at most segment_max.  DecryptSegment splits stored_i
using the ciphertext length the consuming format conveys
(<xref target="concrete-segment-aad"/>).</t>
        <t>In every subroutine, i is the segment index (a non-negative integer),
is_final is 1 for the last segment and 0 for all others, A_i is the
caller-supplied associated data for segment i, and P_i is the segment
plaintext.  The subroutines call segment_key(i) and nonce(i) as defined
in <xref target="key-derivation"/>, with nonce(i) following the chosen nonce_mode,
and segment_aad(i, is_final, A_i) as defined in
<xref target="concrete-segment-aad"/>.</t>
        <t>nonce_metadata_i denotes the stored nonce metadata for segment i:
nonce(i) when nonce_mode is "random", and empty when it is "derived".
In random mode DecryptSegment reads its nonce from nonce_metadata_i,
and in derived mode it recomputes nonce(i).</t>
        <section anchor="encryptsegment">
          <name>EncryptSegment</name>
          <artwork><![CDATA[
EncryptSegment(i, is_final, A_i, P_i):
  key   = segment_key(i)
  nonce = nonce(i)
  aad   = segment_aad(i, is_final, A_i)
  C_i   = AEAD.Encrypt(key, nonce, aad, P_i)
  split C_i into ct_i and tag_i
  return (nonce_metadata_i, ct_i, tag_i)
]]></artwork>
          <t>AEAD.Encrypt and AEAD.Decrypt are the interfaces of <xref target="RFC5116"/> Sections
2.1 and 2.2.  For an AEAD whose ciphertext places the tag in its final
Nt octets, ct_i is the first len(P_i) octets and C_i = ct_i || tag_i.</t>
          <t>The caller supplies the segment's leaf to the snapshot authenticator
(<xref target="segment-leaf"/>).  EncryptSegment itself does no snapshot work.</t>
        </section>
        <section anchor="decryptsegment">
          <name>DecryptSegment</name>
          <t>DecryptSegment returns the segment plaintext, or a decryption error:</t>
          <artwork><![CDATA[
DecryptSegment(i, is_final, A_i, stored_i):
  nonce_metadata_i, ct_i, tag_i = stored_i
  key   = segment_key(i)
  nonce = nonce_metadata_i or nonce(i)
  aad   = segment_aad(i, is_final, A_i)
  C_i   = ct_i || tag_i
  P_i   = AEAD.Decrypt(key, nonce, aad, C_i)
          (on verification failure, return a decryption error)
  return P_i
]]></artwork>
        </section>
        <section anchor="rewritesegment">
          <name>RewriteSegment</name>
          <t>RewriteSegment 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 snapshot
authenticator's state.  The error is detectable only on a subsequent
read.</t>
          <t>RewriteSegment(i, is_final, A_i, new_P_i) is defined as
EncryptSegment(i, is_final, A_i, new_P_i):  a rewrite is a fresh
encryption of the new plaintext new_P_i.  The output record new_stored_i
replaces the stored record for segment i.</t>
          <t>RewriteSegment produces the replacement record new_stored_i only.  The
caller updates the snapshot authenticator with the old and new leaves,
calling remove(i, leaf(i)) then add(i, new_leaf(i)) (<xref target="full-rewrite"/>).</t>
        </section>
      </section>
      <section anchor="toplevel-algorithms">
        <name>Top-level Algorithms</name>
        <t>The top-level algorithms compose the segment subroutines
(<xref target="segment-subroutines"/>) over complete messages.  They call the
snapshot-authenticator operations of <xref target="snapshot-authenticator"/>
(snapshot() and verify() in every profile, add(i, input) wherever
segments are written, set_length(n) at creation and on any length
change, and remove(i, input) in a mutable or append-only profile)
without referring to how any is computed.  The profile's selected
authenticator realizes those operations (<xref target="snapshot-interface"/>).</t>
        <t>These procedures do not expose per-segment associated data, so they pass
an empty A_i to each subroutine.  An application that needs per-segment
A_i calls the subroutines directly.</t>
        <section anchor="read-only-ops">
          <name>Read-Only Operations</name>
          <t>Encryption and decryption are available in every SEAL profile.  They
write a message once and read individual segments.  Neither rewrites a
stored segment.  When the profile configures no snapshot authenticator,
the snapshot steps below are omitted, and a reader relies on per-segment
authentication alone.</t>
          <section anchor="full-encryption">
            <name>Encryption</name>
            <t>Encryption runs in two phases.  The first derives the per-message
schedule and writes the commitment.  The second encrypts each segment
independently, feeds its input to the snapshot authenticator, and then
calls snapshot() to bind the whole (index, input) set and the count.
Because the segments are independent, the second phase may encrypt them
in any order or in parallel.  The snapshot calls mutate one value under
a single writer, so encryption is never the concurrent case that
<xref target="snapshot-interface"/> requires a protocol to order.</t>
            <figure anchor="fig-encrypt-build">
              <name>Key Schedule and Segment Encryption</name>
              <artset>
                <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="528" viewBox="0 0 528 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                    <path d="M 24,112 L 24,128" fill="none" stroke="black"/>
                    <path d="M 64,48 L 64,64" fill="none" stroke="black"/>
                    <path d="M 64,96 L 64,112" fill="none" stroke="black"/>
                    <path d="M 152,112 L 152,128" fill="none" stroke="black"/>
                    <path d="M 152,160 L 152,176" fill="none" stroke="black"/>
                    <path d="M 152,208 L 152,224" fill="none" stroke="black"/>
                    <path d="M 240,112 L 240,128" fill="none" stroke="black"/>
                    <path d="M 24,112 L 240,112" fill="none" stroke="black"/>
                    <polygon class="arrowhead" points="248,128 236,122.4 236,133.6" fill="black" transform="rotate(90,240,128)"/>
                    <polygon class="arrowhead" points="160,224 148,218.4 148,229.6" fill="black" transform="rotate(90,152,224)"/>
                    <polygon class="arrowhead" points="160,176 148,170.4 148,181.6" fill="black" transform="rotate(90,152,176)"/>
                    <polygon class="arrowhead" points="160,128 148,122.4 148,133.6" fill="black" transform="rotate(90,152,128)"/>
                    <polygon class="arrowhead" points="72,64 60,58.4 60,69.6" fill="black" transform="rotate(90,64,64)"/>
                    <polygon class="arrowhead" points="32,128 20,122.4 20,133.6" fill="black" transform="rotate(90,24,128)"/>
                    <g class="text">
                      <text x="44" y="36">CEK,</text>
                      <text x="84" y="36">salt</text>
                      <text x="48" y="84">payload</text>
                      <text x="116" y="84">schedule</text>
                      <text x="44" y="148">commitment</text>
                      <text x="152" y="148">payload_key</text>
                      <text x="252" y="148">snap_key</text>
                      <text x="96" y="196">EncryptSegment(i,</text>
                      <text x="188" y="196">P_i)</text>
                      <text x="248" y="196">using</text>
                      <text x="320" y="196">payload_key</text>
                      <text x="404" y="196">(one</text>
                      <text x="440" y="196">per</text>
                      <text x="492" y="196">segment)</text>
                      <text x="128" y="244">ct_i,</text>
                      <text x="176" y="244">tag_i</text>
                    </g>
                  </svg>
                </artwork>
                <artwork type="ascii-art"><![CDATA[
   CEK, salt
       |
       v
  payload schedule
       |
  +----+----------+----------+
  v               v          v
commitment   payload_key   snap_key
                  |
                  v
   EncryptSegment(i, P_i)   using payload_key   (one per segment)
                  |
                  v
             ct_i, tag_i
]]></artwork>
              </artset>
            </figure>
            <t>An application that writes a new message <bcp14>MUST</bcp14> generate a fresh,
uniformly random salt.  Given a CEK, that salt, a parameter set, G, and
a plaintext P split into segments P_0 through P_{n_seg-1}:</t>
            <artwork><![CDATA[
derive  commitment, payload_key, snap_key from the payload schedule
        (and nonce_base, in derived mode)
store   commitment

for i in 0 .. n_seg-1:
    is_final = 1 if i = n_seg-1, else 0
    stored_i = EncryptSegment(i, is_final, empty, P_i)
    store stored_i

if snapshot authentication is enabled:
    set_length(n_seg)
    for i in 0 .. n_seg-1:
        add(i, leaf(i))
    snapshot = snapshot()
    store snapshot
]]></artwork>
            <t>Under an authenticator that recomputes, the set_length and add calls
collapse into one snapshot() over the (index, input) set
(<xref target="snapshot-interface"/>).</t>
            <t>A zero-length plaintext produces a single segment of length 0 with
is_final = 1.  A writer encrypts each segment once its content is
complete and marks the last one final.  A writer that does not know
where its input ends holds one complete segment back until more content
or the end of input arrives, so it knows whether that segment is the
last when it encrypts it.  Re-marking the last segment afterwards would
be a re-encryption, which a write-once profile forbids and an
append-only profile admits only inside an append (<xref target="append-only"/>).
Under a strict authenticator a writer may also produce the keyed
snapshot at any count while the object is open (<xref target="open-count-public"/>).</t>
          </section>
          <section anchor="full-decryption">
            <name>Decryption of Segment i</name>
            <t>Opening a segment is a local operation:  check the commitment to reject
a wrong key early, then AEAD-decrypt the one segment.  This yields
per-segment authenticity over the ciphertext core, the segment index,
and the finality bit.  Under a snapshot authenticator, whole-set
authenticity is a separate and stronger check that requires the full
present segment set.  It detects any altered segment set, including
same-index rollback to an older sibling (<xref target="snapshot-interface"/>).  A
reader holding only one segment gets per-segment authenticity but <bcp14>MUST
NOT</bcp14> claim snapshot integrity until it runs SnapVerify
(<xref target="snapshot-authenticator"/>).  A profile with no snapshot authenticator
defines no snapshot, so per-segment authenticity is the whole integrity
guarantee.</t>
            <t>Given the CEK, salt, parameter set, G, segment index i, finality status,
and the stored ciphertext segment for index i:</t>
            <artwork><![CDATA[
derive  commitment from CEK, salt, and G
derive  payload_key, snap_key from CEK and salt
if stored commitment != derived commitment:  return error
P_i = DecryptSegment(i, is_final, empty, stored_i)
       (return its error on failure)
if snapshot authentication is enabled and the full set is available:
    if SnapVerify(snapshot) fails:  return error  (do not deliver P_i)
return P_i
]]></artwork>
            <t>Here SnapVerify is the whole-object form of <xref target="raae-writable"/>:  S is the
decryption state derived above, segments is the full present set, each
with its A_i (<xref target="snapshot-interface"/>), the snapshot is declared
complete, and no witness is passed.</t>
            <t>Whole-object SnapVerify needs the leaf of every segment
(<xref target="segment-leaf"/>).  A reader that streams segments in order can gate
their release on it only by buffering those leaves first, or by using a
layout that holds their leading fields in a header, completed with each
segment's A_i.  Two cases need less.  Where the authenticator supports a
subset target, a reader verifies the segments it holds against the
snapshot, reading a witness (<xref target="raae-writable"/>) in place of the others.
Where the authenticator is strict and the writer produces an
intermediate snapshot at count n (<xref target="open-count-public"/>), a reader that
holds segments 0..n-1 verifies them, declared open, against the value
for count n.  It learns that they are the segments a snap_key holder
recorded at those positions, and nothing about later indices or
completeness (<xref target="open-count-public"/>).  Releasing plaintext on
per-segment authenticity alone forgoes snapshot freshness for that
segment (<xref target="snapshot-limitations"/>).</t>
            <t>A streaming reader cannot rule out truncation before the end of the
stream.  Plaintext delivered before the highest-indexed segment verifies
under is_final = 1, and before SnapVerify passes where a snapshot
authenticator is configured, <bcp14>MUST</bcp14> be treated as unverified with respect
to completeness.</t>
            <t>A decryptor <bcp14>MUST</bcp14> reject a truncated object:  one whose highest-indexed
present segment carries is_final = 0 is incomplete, and the decryptor
<bcp14>MUST</bcp14> fail rather than return the partial plaintext as the complete
message.  A streaming reader that delivered plaintext as unverified, as
the preceding paragraph permits, reports that failure when the stream
ends.</t>
            <t>The decryptor derives the finality each segment must carry from the
segment count n_seg the application supplies (<xref target="segment-subroutines"/>),
so the last surviving segment of a truncated object, written non-final,
fails verification as the final segment.  The finality bit is bound per
segment and unforgeable without the CEK, through the nonce or the
segment AAD per the nonce mode (<xref target="concrete-segment-aad"/>).</t>
            <t>Under a write-once profile no segment ever carried an earlier terminal
form, so an adversary cannot present a valid is_final = 1 segment at a
truncated boundary:  it cannot re-mark a non-final segment, and this
check detects every dropped trailing segment.  An append re-marks the
old terminal segment (<xref target="extend"/>), so under a profile that appends, a
retained segment may have carried is_final = 1 under an earlier nonce.
An adversary can replay that retained terminal ciphertext at the shorter
count, which this check alone accepts.  SnapVerify over the complete
segment set then rejects the replay, except where the shorter object is
an earlier complete version presented with its own snapshot, which is
rollback (<xref target="snapshot-interface"/>).  The mutable profile requires a
snapshot authenticator, so SnapVerify always runs there
(<xref target="rewritable-ops"/>).</t>
            <t>Authorized truncation by the CEK holder to a nonempty prefix re-marks
the new last segment under is_final = 1 (<xref target="extend"/>), so a legitimately
truncated object still ends with is_final = 1 and verifies.  This check
needs no snapshot authenticator.</t>
            <t>Truncation to an empty object is covered too.  Without a snapshot
authenticator a valid object has at least one segment, so a decryptor
<bcp14>MUST</bcp14> reject one with none.  With a snapshot authenticator the snapshot
binds the count, making the empty object (n_seg = 0) a distinct
authenticated state (<xref target="snapshot-interface"/>).</t>
            <t>On a commitment mismatch the implementation <bcp14>MUST NOT</bcp14> proceed with
decryption, <bcp14>SHOULD</bcp14> zeroize derived key material, and <bcp14>MUST</bcp14> return an
error.  The SnapVerify gate in the procedure above runs whenever a
snapshot authenticator is configured and the full present set is
available, for example a full read or an integrity audit.</t>
            <t>Decryption can fail in up to three distinguishable ways:</t>
            <table anchor="decryption-failures">
              <name>Decryption failure conditions</name>
              <thead>
                <tr>
                  <th align="left">Failure</th>
                  <th align="left">Cause</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">Commitment mismatch</td>
                  <td align="left">wrong key or parameters</td>
                </tr>
                <tr>
                  <td align="left">AEAD verification failure</td>
                  <td align="left">corrupted or tampered segment</td>
                </tr>
                <tr>
                  <td align="left">Snapshot mismatch</td>
                  <td align="left">segment set or count modified (snapshot authenticator only)</td>
                </tr>
              </tbody>
            </table>
            <t>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>
        <section anchor="rewritable-ops">
          <name>Rewritable Operations</name>
          <t>Rewriting is available only in a mutable profile, which requires a
snapshot authenticator.  Length change is a separate operation
(<xref target="extend"/>), available in both directions in a mutable profile and in
the append direction alone in an append-only profile (<xref target="append-only"/>).
The procedure below is written against the in-place update path (add,
remove, set_length; <xref target="snapshot-interface"/>).  Under an authenticator
that recomputes instead, the remove, add, and set_length calls in this
procedure collapse into a single snapshot() over the updated (index,
input) set, and the operations are otherwise identical.  A caller that
cannot recover a re-encrypted segment's plaintext cannot perform it.</t>
          <section anchor="full-rewrite">
            <name>Rewriting Segment i</name>
            <t>A rewrite touches exactly one segment's ciphertext, and no other segment
is decrypted.  Beyond that segment, it reads only the verified snapshot
and the witness its authenticator takes for the update, checked against
that snapshot (<xref target="raae-writable"/>).</t>
            <t>Rewrite takes the segment index i and the new plaintext new_P_i, at most
segment_max octets, and keeps the segment's finality bit.  Only a length
change moves that bit (<xref target="extend"/>).  The procedure is:</t>
            <artwork><![CDATA[
def Rewrite(i, new_P_i):
  is_final = 1 if i = n_seg-1, else 0
  form leaf(i) from stored_i, is_final, and an empty A_i
  new_stored_i = RewriteSegment(i, is_final, empty, new_P_i)
  remove(i, leaf(i))
  add(i, new_leaf(i))
  snapshot = snapshot()
  store new_stored_i, snapshot
]]></artwork>
            <t>In derived nonce mode the nonce for segment i is deterministic, so a
rewrite reuses the same nonce under a key whose derivation context is
identical.  A mutable profile that selects derived nonce mode requires
an MRAE AEAD.</t>
            <t>A rewrite is an update under the writer rule of <xref target="witness-rules"/>, so
the writer checks the witness and the removed input before the rewrite,
as that rule requires.  Otherwise a storage adversary can swap stored
data for an older copy and have the writer launder it into a snapshot
that verifies going forward (<xref target="snapshot-limitations"/>).  Full validation
is a separate operation performed with access to all tags, for example
on a full read or an integrity audit.</t>
          </section>
        </section>
        <section anchor="extend">
          <name>Changing Message Length</name>
          <t>An application that holds the CEK <bcp14>MAY</bcp14> change a stored message's length
in either direction:  appending new segments, or truncating to a prefix.
An append re-encrypts one retained segment, the old terminal one, with
its existing plaintext to clear its finality bit, and none when
appending to the empty object.  A truncation re-encrypts one retained
segment, the new terminal one, with its existing plaintext to set its
finality bit, and none when truncating to the empty object; it drops the
segments past the prefix.  Every other changed segment is removed or
added by tag, and the snapshot is updated over the new count
(<xref target="length-change-table"/>).  Both directions are updates under the writer
rule of <xref target="raae-writable"/>, which the writer meets before either changes
the object.</t>
          <t>Under a mutable profile, a writer that wants the start of the new
content in the old terminal segment's spare capacity rewrites that
segment first (<xref target="full-rewrite"/>) and then appends the rest.</t>
          <t>Both directions reuse the existing salt:  an application extending an
existing message <bcp14>MUST</bcp14> reuse the salt from the object it extends.  A
fresh salt would change every payload schedule output and force
re-encryption of the retained segments.</t>
          <t>Append takes P_new, the list of new segment plaintexts, each at most
segment_max octets, and requires k = len(P_new) &gt;= 1.  Content that adds
no segment is handled by a rewrite of the terminal segment under a
mutable profile (<xref target="full-rewrite"/>).</t>
          <figure anchor="alg-append">
            <name>Append</name>
            <artwork><![CDATA[
def Append(P_new):
  old_n_seg = n_seg
  k         = len(P_new)
  t         = old_n_seg - 1

  if k < 1:
    return an input error
  if any element of P_new is longer than segment_max:
    return an input error

  if old_n_seg > 0:
    P_t = DecryptSegment(t, 1, empty, stored_t)
          (return its error on failure)
    new_stored_t = RewriteSegment(t, 0, empty, P_t)
    form leaf(t) from stored_t, is_final = 1, and an empty A_i
    remove(t, leaf(t))   ;; leaf of the stored_t just decrypted

  set_length(old_n_seg + k)

  if old_n_seg > 0:
    store new_stored_t
    add(t, new_leaf(t))

  for j in old_n_seg .. old_n_seg+k-1:
    is_final = 1 if j == old_n_seg+k-1 else 0
    stored_j = EncryptSegment(j, is_final, empty,
                              P_new[j-old_n_seg])
    store stored_j
    add(j, leaf(j))

  store snapshot()
]]></artwork>
          </figure>
          <t>Truncate takes m &lt; n_seg, the number of segments that survive.  For m &gt;
0 it drops segments m and above and re-marks segment m-1 as final, the
reverse of the append re-mark, so the truncated object has m segments.
Truncate(0) drops every segment and yields the empty object.  For m = 0
it decrypts nothing, so, like RewriteSegment, it assumes the caller has
already verified the commitment or otherwise confirmed it holds the
correct CEK.</t>
          <figure anchor="alg-truncate">
            <name>Truncate</name>
            <artwork><![CDATA[
def Truncate(m):
  old_n_seg = n_seg
  t         = m - 1

  if m >= old_n_seg:
    return an input error

  if m > 0:
    P_t = DecryptSegment(t, 0, empty, stored_t)
          (return its error on failure)
    new_stored_t = RewriteSegment(t, 1, empty, P_t)
    form leaf(t) from stored_t, is_final = 0, and an empty A_i
    remove(t, leaf(t))   ;; leaf of the stored_t just decrypted

  for j in m .. old_n_seg-1:
    form leaf(j) from stored_j, an empty A_i, and is_final = 1
        only at j = old_n_seg-1
    remove(j, leaf(j))
  discard segments m .. old_n_seg-1

  set_length(m)

  if m > 0:
    store new_stored_t
    add(t, new_leaf(t))

  store snapshot()
]]></artwork>
          </figure>
          <t>Where an authenticator's input is the stored tag alone, each add and
remove takes that tag, which already encodes the segment's is_final bit,
so an implementation never tracks finality separately.  A strict
authenticator's leaf carries the bit explicitly, so each remove forms
the leaf with the finality the segment was encrypted under and each add
with the new one.</t>
          <t>A botched in-place update corrupts the snapshot authenticator's state
silently, surfacing only at a later SnapVerify.  An implementation <bcp14>MAY</bcp14>
run SnapVerify over the new segment set immediately after a length
change to catch this.  An authenticator that recomputes rebuilds the
snapshot from the per-segment leaves, formed from the stored entries, on
every update, so it has no analogous silent-corruption failure mode.</t>
          <t>Both operations count against the same AEAD usage budgets as initial
encryption (<xref target="aead-usage-limits"/>).  An append re-encrypts the old
terminal segment, except from the empty object, and a truncate
re-encrypts the new terminal segment, except to the empty object (m =
0).  In derived nonce mode the nonce of the segment each one encrypts is
fixed by its index and finality bit.  Each re-mark flips the finality
bit, so its nonce differs from the segment's previous one, but a
truncate's re-mark at (m-1, 1) can land on a pair the object has used,
as after an earlier truncation to m, and repeated length changes in both
directions can make any pair recur.  Only an MRAE AEAD tolerates the
resulting nonce reuse (<xref target="key-derivation"/>).  An append-only profile
admits no truncation and appends only from the current count
(<xref target="raae-writable"/>), so no pair recurs and the AEAD need not be MRAE
(<xref target="append-only"/>).</t>
          <t>Applications that do not need length changes <bcp14>MAY</bcp14> forbid them.  The
salt-reuse requirement applies only when a length change is performed.
An application that re-encrypts the entire content can generate a fresh
salt and is not bound by the constraints in this section.</t>
          <section anchor="append-only">
            <name>Appending Under an Append-Only Profile</name>
            <t>An append-only profile admits the append direction of this section
(<xref target="alg-append"/>) and forbids truncation.</t>
            <t>An encryptor under an append-only profile <bcp14>MUST NOT</bcp14> rewrite a segment
with a different plaintext or associated data, and <bcp14>MUST NOT</bcp14> truncate
(<xref target="alg-truncate"/>).</t>
            <t>The first rule is what lets the profile pair a derived nonce with any
AEAD, including a non-MRAE one.  At a fixed index and finality the key
and the nonce are already fixed by the payload schedule, so the
plaintext and the associated data are the only inputs that can differ,
and the rule forbids exactly those.  No nonce ever carries two different
plaintexts, which is the condition <xref target="derived-nonces"/> sets for a
non-MRAE AEAD.</t>
            <t>The segment an append re-encrypts keeps its existing plaintext
(<xref target="extend"/>), so the re-encryption satisfies the first rule:  it changes
only the finality bit, not the plaintext or the associated data
(<xref target="derived-nonces"/>).</t>
            <t>The second rule makes the profile append-only rather than non-rewriting.
It forbids the truncate direction, so a stored object can only grow.
Provided each append starts from the current count (<xref target="raae-writable"/>),
an index the object has spent is never freed for a later append to fill
with different content.  After an interrupted append, the writer follows
the crash rule of <xref target="derived-nonces"/>.</t>
            <t>An append re-encrypts one retained segment, so each segment is encrypted
at most twice, and an epoch key covers at most 2^(epoch_length + 1)
segment encryptions (<xref target="max-object-size"/>).</t>
            <t>An append keeps the re-encrypted segment's length (<xref target="extend"/>), and this
profile cannot rewrite that segment first.  So an append to an object
whose terminal segment is short leaves a short interior segment, which a
layout with uniformly sized interior segments cannot represent.  A
consuming protocol using this profile supplies a serialization that
conveys each segment's ciphertext length (<xref target="concrete-segment-aad"/>).</t>
          </section>
        </section>
      </section>
    </section>
    <section anchor="security-properties">
      <name>Security Analysis</name>
      <t>The formal proofs are not reproduced here.  The ra-ROR and ra-CMT
notions are taken unchanged from <xref target="FLRR25"/>, which proved them for a
construction that instantiates the same component contracts other than
the snapshot authenticator (<xref target="framing"/>) and that never re-encrypts a
position (<xref target="raae-writable"/>).  Snapshot integrity is the one notion this
document defines.  The configured authenticator argues its bound
(<xref target="snapshot-security"/>), and a combined proof is deferred to
<xref target="SEALPROOFS"/>.  The limits of <xref target="aead-usage-limits"/> are operational
deployment bounds, not proof obligations.</t>
      <section anchor="raae-security">
        <name>Security Notions</name>
        <t>raAE has two security tiers.  The base tier comprises the notions of
<xref target="FLRR25"/>:  ra-ROR, ra-CMT, and its position-choosing variant ra-CMT-p.
The extension tier adds one notion, snapshot integrity, defined by this
document.  A construction <bcp14>MAY</bcp14> provide the base tier only.</t>
        <section anchor="ra-ror">
          <name>ra-ROR</name>
          <t>ra-ROR (random-access real-or-random) is the joint confidentiality and
authenticity notion for raAE in a multi-user, nonce-respecting setting.
An adversary with adaptive encryption and decryption access across many
key instances, sessions, and arbitrary positions cannot distinguish real
ciphertexts and headers from random, and cannot make an out-of-context
ciphertext segment decrypt.  The game is defined in <xref target="FLRR25"/>.</t>
          <t>The encryption core of the extension operations is ordinary EncSeg.  A
RewriteSeg produces its replacement ciphertext as a repeated EncSeg at
the same index.  Appending is EncSeg at the positions past the current
end plus one RewriteSeg of the old final segment, and truncating to a
nonempty prefix is one RewriteSeg of the new final segment.  Under a
mutable profile the positions either one writes need not be fresh, since
a truncate's re-mark can encrypt at a pair the object has used and
repeated length changes in both directions can make any (index, finality
bit) pair recur (<xref target="extend"/>).</t>
          <t>In random nonce mode these draw fresh nonces, which repeat only by
collision.  For an append whose positions are new, the ra-ROR bound
charges that collision, in Adv_muROR$ for directly drawn nonces and in
Adv_nonce_coll under a nonce hedge (<xref target="appendix-adv-notation"/>).  A
rewrite in place still re-encrypts a position, and so can a length
change under a mutable profile.  Either falls outside the ra-ROR bound
in any nonce mode, since that bound assumes a position-respecting
adversary (<xref target="appendix-adv-notation"/>).  The ra-ROR bounds do not carry
over in any nonce mode:  Theorems 4 and 6 of <xref target="FLRR25"/> assume an
adversary that never queries EncSeg twice at the same key instance,
session, and position.  Re-encrypting a position falls outside them and
needs an extended analysis, deferred to <xref target="SEALPROOFS"/>.  In derived
nonce mode the analysis turns on whether the profile permits a rewrite
in place.</t>
          <t>Where it does, a rewrite repeats the position's derived nonce with new
content.  In derived nonce mode EncSeg at a position is deterministic,
so one repeated query separates the real and random ra-ROR games.  That
is a deliberate nonce-repeating query, and the underlying MRAE AEAD
handles it under the equality-leakage relaxation documented for derived
nonce mode (<xref target="appendix-nonce-modes"/>), not the unmodified
nonce-respecting game.</t>
          <t>Where it does not, no query repeats a position with new content.  The
write-once profile re-encrypts nothing.  The append-only profile
re-encrypts only at the append's RewriteSeg, which flips the finality
bit and so writes a position the initial write did not use.  A writer
recovering from a crash may resend saved ciphertext without another
EncSeg call.  Both profiles use each position at most once in encryption
(<xref target="derived-nonces"/>, <xref target="append-only"/>), so both meet the <xref target="FLRR25"/>
hypothesis that no position is encrypted twice, each derived nonce is
used once, and neither needs an MRAE AEAD.</t>
          <t>The keyed snapshot these operations maintain is outside the <xref target="FLRR25"/>
syntax and is governed by snapshot integrity (<xref target="snapshot-integrity"/>),
not by ra-ROR.</t>
        </section>
        <section anchor="ra-cmt">
          <name>ra-CMT</name>
          <t>ra-CMT (random-access context commitment) is the segment-level
commitment notion:  no single ciphertext segment decrypts successfully
under two different decryption contexts (key, nonce, global associated
data, and per-segment associated data).  In this position-matched notion
the two contexts share a position.  Because the scheme is random access,
committing one segment's context commits the full ciphertext's context.</t>
          <t>The external commitment in this construction establishes the
position-matched claim only for fixed per-segment associated data A_i:
both openings use the same A_i at the shared position.  The full notion
also permits differing A_i, which the external commitment does not bind.
That case requires a separate AEAD AAD-commitment assumption and is
outside the claim established here (<xref target="key-commitment"/>).</t>
          <t>ra-CMT is distinct from the per-AEAD notions CMT-1 and CMT-4 of
<xref target="RFC9771"/>: a scheme can achieve ra-CMT through an external commitment
mechanism even when its underlying AEAD commits to nothing.  The
Invisible Salamanders attacks (<xref target="DGRW18"/>) show what a non-committing
AEAD permits, and <xref target="ADG22"/> frames it as a key-commitment failure with
fixes.</t>
        </section>
        <section anchor="ra-cmt-p">
          <name>ra-CMT-p</name>
          <t>ra-CMT-p is the position-choosing variant of ra-CMT:  the two decryption
contexts need not share a position, so the adversary binds a segment's
content to a position of its choice.</t>
          <t>Under honest keys a construction inherits ra-CMT-p from the underlying
AEAD's commitment.  Against a holder of the CEK it does not follow from
per-segment AEAD alone, and SEAL's snapshot authenticators give at most
the weaker per-index binding of <xref target="key-commitment"/>, under the conditions
stated there (<xref target="adversary-model"/>, <xref target="appendix-commitment"/>).</t>
        </section>
        <section anchor="snapshot-integrity">
          <name>Snapshot Authentication</name>
          <t>Per-segment AEAD authenticates a segment at its position, but it does
not authenticate the current object snapshot: which set of segments
belongs to the current stored object state.  An adversary with write
access to stored segments can silently substitute an old valid
same-index segment or delete a segment, and per-segment AEAD
verification at each presented segment still passes.  (A segment moved
to a different index fails its AEAD check through the index binding of
<xref target="concrete-segment-aad"/>.)</t>
          <t>Snapshot integrity is the notion that covers that set.  Its interface
is in <xref target="snapshot-interface"/> and its bound in <xref target="snapshot-security"/>.
SEAL provides it under a snapshot authenticator and omits it otherwise
(<xref target="raae-security"/>).</t>
        </section>
      </section>
      <section anchor="raae-relations">
        <name>Relations to Other Notions</name>
        <dl>
          <dt>AEAD (<xref target="RFC5116"/>):</dt>
          <dd>
            <t>raAE generalizes AEAD to multi-segment content with arbitrary-order
encryption.  A single-segment raAE is an AEAD.</t>
          </dd>
          <dt>nOAE2 (<xref target="Tink"/>):</dt>
          <dd>
            <t>nOAE2 is the nonce-based online authenticated encryption notion for
schemes that encrypt in order and support random-access decryption.
Hoang and Shen introduced nOAE2 in their analysis of Tink Streaming
AEAD (<xref target="Tink"/>), where they also show STREAM satisfies it.  ra-ROR is
strictly stronger:  every ra-ROR-secure scheme is nOAE2-secure when
used in order, but nOAE2-secure schemes can fail when encryption order
is arbitrary (<xref target="FLRR25"/>).</t>
          </dd>
          <dt>Commitment (<xref target="RFC9771"/>):</dt>
          <dd>
            <t>CMT-1 and CMT-4 (<xref target="RFC9771"/>) are per-AEAD commitment notions.
ra-CMT is the corresponding notion for segmented random-access
schemes.  See <xref target="ra-cmt"/>.</t>
          </dd>
        </dl>
        <t>Rewrite safety and extension safety need no notions beyond ra-ROR and
snapshot integrity.  Replacing a segment in place is an EncSeg at an
already-used position together with a snapshot update (<xref target="ra-ror"/>).  In
derived nonce mode it repeats the segment nonce, so it <bcp14>MUST</bcp14> use an MRAE
AEAD (<xref target="derived-nonces"/>).  Each rewrite also counts against the AEAD
usage budgets (<xref target="aead-usage-limits"/>).</t>
        <t>Appending and truncating likewise add no algorithm (<xref target="extend"/>) and no
notion.  An adversary's ability to add, drop, reorder, or re-mark a
terminal segment is exactly the snapshot integrity adversary of
<xref target="snapshot-integrity"/>, and detection follows from the index and
finality binding of <xref target="concrete-segment-aad"/> together with snapshot
verification.  Rollback of the whole object to an earlier honest (state,
snapshot) after truncation is the freshness case that snapshot integrity
excludes (<xref target="snapshot-limitations"/>).</t>
      </section>
      <section anchor="adversary-model">
        <name>Adversary Model and Assumptions</name>
        <t>The adversary model is that of the ra-ROR game (<xref target="ra-ror"/>, <xref target="FLRR25"/>).
In the construction's terms:  the adversary can observe all ciphertexts
and content metadata, tamper with individual segments or their ordering,
replace the keyed snapshot, and attempt decryption with chosen keys.
The per-content salt is public metadata available to the adversary, and
the arguments need it fresh and uniform, not secret.  The
confidentiality and integrity bounds assume the CEK is secret and
uniform, the single-owner regime:  an application <bcp14>MUST</bcp14> supply a CEK that
is either generated uniformly at random or derived so that it is
computationally indistinguishable from uniform, such as the output of a
KDF keyed by a secret.  When multiple messages share a CEK, the
per-content salt separates payload schedule outputs across messages
under the PRF assumption (<xref target="appendix-adv-notation"/>).</t>
        <t>The commitment notions ra-CMT and ra-CMT-p (<xref target="key-commitment"/>) also
cover a shared-CEK regime, where the adversary holds the CEK and so can
decrypt and forge segment tags at will.</t>
        <t>One binding can still hold against a CEK holder, under three conditions
that each close a distinct gap.  The keyed snapshot <bcp14>MUST</bcp14> be
authenticated outside the construction, because a CEK holder derives
snap_key and can otherwise forge any keyed snapshot directly.  The
ciphertext digest <bcp14>MUST</bcp14> be set:  without it a segment's leaf binds its
ciphertext only through the AEAD tag, which a CEK holder forges for
altered content.  The authenticator's ordering <bcp14>MUST</bcp14> be strict:  under a
linear ordering a snap_key holder can present a different segment set
with the same keyed snapshot even when every leaf commits to its
content, and only a strict ordering makes finding one a collision
problem.  A snapshot meeting all three is the basis of the per-index
binding of <xref target="key-commitment"/>.</t>
        <t>The persistent state of an raAE object, and the party that owns each
item, is:</t>
        <dl>
          <dt>CEK:</dt>
          <dd>
            <t>Secret key-management state.  It is the root secret for the object.</t>
          </dd>
          <dt>salt:</dt>
          <dd>
            <t>Public stored object metadata.  It separates objects under one CEK.</t>
          </dd>
          <dt>parameter set:</dt>
          <dd>
            <t>Profile or object metadata.  It fixes suite, maximum segment size,
and epoch policy.</t>
          </dd>
          <dt>commitment:</dt>
          <dd>
            <t>Stored object metadata.  It rejects wrong key or parameter context
before decryption.</t>
          </dd>
          <dt>segment metadata:</dt>
          <dd>
            <t>Storage-format state.  It holds AEAD tags, the per-segment nonces in
random nonce mode, and, when set, each segment's ciphertext digest
(<xref target="snapshot-interface"/>).</t>
          </dd>
          <dt>snapshot:</dt>
          <dd>
            <t>Stored object metadata.  It authenticates the segment set and
segment count.</t>
          </dd>
          <dt>external freshness state:</dt>
          <dd>
            <t>Consuming-protocol state.  It detects whole-object rollback.</t>
          </dd>
        </dl>
        <t>The security argument relies on three distinct assumptions about the
KDF.  For derivations whose input keying material is secret and
uniformly random, including payload_key, snap_key, nonce_base,
epoch_key, and the snapshot authenticator's keyed derivations, the KDF
is assumed to be a multi-user PRF with domain separation by protocol_id
and label.</t>
        <t>For commitment, the function</t>
        <artwork><![CDATA[
Commit(CEK, payload_info, G, L) =
    KDF(protocol_id, "commit", [CEK], [...payload_info, G], L)
]]></artwork>
        <t>is additionally assumed to be collision resistant over adversarially
chosen tuples (CEK, payload_info, G), with G empty by default.  PRF
security alone is not sufficient for this property, because the
commitment adversary may choose the CEK and context values.</t>
        <t>For the plaintext-bound nonce construction, the plaintext digest step
targets collision resistance, not PRF security.</t>
      </section>
      <section anchor="framing">
        <name>raAE Construction Requirements</name>
        <t>The bounds below rely on the KDF framing and the snapshot authenticator.
Their requirements are obligations on the raAE construction, not part of
the raAE primitive of <xref target="raae"/>.  A profile selects the concrete framing
for every derivation surface:  the KDF input assembly
(<xref target="key-derivation"/>), the payload_info construction (<xref target="components"/>),
the segment AAD (<xref target="concrete-segment-aad"/>), and the snapshot
authenticator's keyed inputs (<xref target="snapshot-authenticator"/>).  Any such
framing <bcp14>MUST</bcp14> meet the following contract.  SEAL is one such framing
(<xref target="kdf-combiner"/>, <xref target="seal-encodings"/>).</t>
        <dl>
          <dt>Pseudorandomness:</dt>
          <dd>
            <t>KDF outputs <bcp14>MUST</bcp14> be computationally indistinguishable from random to
an adversary that does not know the ikm, assuming the underlying
hash or PRF is a secure pseudorandom function.</t>
          </dd>
          <dt>Injectivity:</dt>
          <dd>
            <t>A construction encodes the tuple (protocol_id, label, ikm, info, L)
into the underlying primitive input, and that encoding <bcp14>MUST</bcp14> be
injective:  distinct tuples map to distinct primitive inputs.  This is
a requirement on the encoding, not on the KDF, which need not itself
be injective. ikm and info <bcp14>MUST</bcp14> be unambiguously separable in the
encoded input, whatever the number of elements each contains.  The
two-step form binds ikm and info in its separate Extract and Expand
inputs.  The one-step form frames ikm and info each as a single encode
element.  Where the encoding admits inputs too large to encode
literally, it <bcp14>MAY</bcp14> substitute a fixed-length digest of the over-large
field.  The encoding is then injective only up to the collision
resistance of that digest, which the construction <bcp14>MUST</bcp14> justify and
domain-separate from the literal encoding (<xref target="kdf-combiner"/>).</t>
          </dd>
          <dt>Label uniqueness:</dt>
          <dd>
            <t>Each derivation role, including commitment, payload key, snapshot
authenticator key, nonce base, epoch key, segment nonce, hedged key,
and the authenticator's internal roles, <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.</t>
          </dd>
          <dt>Output length commitment:</dt>
          <dd>
            <t>The requested output length L <bcp14>MUST</bcp14> be part of the KDF primitive
input, so a truncated longer output cannot pass as a shorter one.</t>
          </dd>
          <dt>Cross-role isolation:</dt>
          <dd>
            <t>Cross-role isolation follows from label uniqueness and PRF security of
the underlying primitive:  a KDF output for one derivation role, such
as payload_key, is computationally independent of the output for any
other role, such as snap_key, even when derived from the same CEK and
payload_info.</t>
          </dd>
          <dt>Snapshot authenticator:</dt>
          <dd>
            <t>When a snapshot authenticator is configured, the construction <bcp14>MUST</bcp14>
bind the current (index, input) set and the segment count into a keyed
snapshot that an adversary without the authenticator's secret key
cannot forge for a modified (index, input) set or count, even after
observing keyed snapshots and their deltas across rewrites.  How the
value is computed, and whether a single-segment change updates it in
place or rebuilds it, is the authenticator's choice.  SEAL's snapshot
authenticators are in <xref target="snapshot-authenticator"/>.</t>
          </dd>
        </dl>
        <t>SEAL's construction (<xref target="framework"/>) satisfies these requirements.  Its
KDF (<xref target="kdf-combiner"/>), keyed by the CEK, is modeled as a pseudorandom
function.  Its encode framing (<xref target="kdf-combiner"/>) is injective, up to LH
collision resistance for over-large fields, and places protocol_id and
the output length L in the primitive input, so injectivity, protocol
binding, and output-length commitment hold.  SEAL's labels
(<xref target="label-table"/>, each configured snapshot authenticator's own labels,
the plaintext-bound construction's labels in <xref target="appendix-pt-bound"/>, and
the hedged-randomness label in <xref target="hedged-randomness"/>) are distinct,
giving label uniqueness and, with PRF security, cross-role isolation.
Each configured snapshot authenticator satisfies the snapshot
authenticator requirement, with its forgery argument accounted in
<xref target="snapshot-security"/>.  Of SEAL's fields only the caller-supplied G
(<xref target="message-inputs"/>) and A_i, and a strict authenticator's leaf, which
carries A_i, can exceed 0xFFFE octets and so take the LH digest path.
Cross-protocol separation comes from protocol_id in the KDF inputs and
from aad_label in the segment AAD, not from LH (<xref target="kdf-combiner"/>).</t>
      </section>
      <section anchor="segment-security">
        <name>Segment Confidentiality and Integrity</name>
        <t>The construction targets ra-ROR security (<xref target="ra-ror"/>).  The advantage
bound, its adversary parameters, and the per-term analysis are in
<xref target="appendix-reductions"/>.</t>
        <t>Ciphertext cores are indistinguishable from random under the ra-ROR
definition, up to the public length leakage and public metadata exposed
by the consuming format (file-level headers, stored nonces in random
mode, the salt, and the commitment).  Re-encrypting a position is
outside that bound in either nonce mode.  Under a derived nonce and an
MRAE AEAD it also reveals whether the new plaintext and associated data
equal the old (<xref target="appendix-nonce-modes"/>).  Each segment AEAD ciphertext
binds the segment to its own index and finality bit (through segment_aad
in random nonce mode and through the nonce in derived nonce mode) so an
adversary cannot modify or substitute a segment under a given index, or
flip its finality bit, without causing an AEAD verification failure on
that segment.</t>
        <t>Three quadratic floors bound the multi-message advantage:</t>
        <artwork><![CDATA[
salt collision       q_m^2 / 2^256          all suites
epoch-key collision  n_ep^2 / 2^128         128-bit-key suite
nonce collision      q^2 / 2^(8*Nn + 1)     random nonce mode
                     q^2 / 2^97  at Nn = 12
]]></artwork>
        <t>In derived nonce mode the salt-collision floor is the only one for the
256-bit-key suites.  The 128-bit-key suite also has the epoch-key
collision floor, which dominates (<xref target="appendix-adv-notation"/>).  In random
nonce mode, with or without the plaintext-bound hedge, the
nonce-collision floor applies, summed over keys (<xref target="aggregate-usage"/>).
Here q is the number of segment encryptions under one key, and Nn is the
nonce length in octets.  The block-size birthday term is derived in
<xref target="aead-usage-limits"/>.</t>
        <t>Segment size enters the analysis only through the forgery and block-size
terms, both bounded in <xref target="aead-usage-limits"/>.  A segment's length is
authenticated implicitly by its AEAD tag, not through segment_aad or the
nonce, so the analysis assumes the consuming format conveys each
segment's true ciphertext length.  Segments shorter than segment_max
consume no more than their share of the per-key budget and need no
separate accounting.</t>
      </section>
      <section anchor="key-commitment">
        <name>Commitment Security</name>
        <t>raAE's commitment target here is ra-CMT for fixed per-segment A_i
(<xref target="ra-cmt"/>), not the per-AEAD CMT-1 (<xref target="RFC9771"/>):  the commitment
binds the CEK and payload_info, which together carry the full parameter
context affecting key derivation, AEAD operation, and AAD and nonce
construction.</t>
        <t>For fixed A_i, ra-CMT relies on collision resistance of the derivation
map over the tuple (protocol_id, "commit", CEK, payload_info, G,
commitment_length), with G empty by default (<xref target="adversary-model"/>).  SEAL
sets commitment_length = Nh, so the commitment offers about 2^128
collision-search work at Nh = 32 and about 2^256 at Nh = 64.  The
reduction outline and the collision quantities for a general
commitment_length are in <xref target="appendix-commitment"/>.</t>
        <t>The commitment bounds ra-CMT where the positions and A_i match
(<xref target="ra-cmt"/>).  It does not bind the segment position.  Position binding
for the ra-CMT-p variant is inherited from the underlying AEAD's
commitment level.  Because the SEAL AEADs are not relied upon to provide
it, position confusion under an adversarially chosen key is out of
scope, consistent with <xref target="FLRR25"/>.  A malicious encryptor that controls
the CEK can craft a single ciphertext segment that opens at two
positions, and the per-segment AEAD tag does not prevent it.</t>
        <t>A strict authenticator with the ciphertext digest set pins each index to
one ciphertext even against a CEK holder, where a profile selects it and
a consuming protocol authenticates the one keyed snapshot outside the
construction (<xref target="snapshot-interface"/>, <xref target="adversary-model"/>).  Where that
snapshot also binds the commitment, as SEAL's strict authenticators do,
each index accepts one opening:  one (CEK, nonce, plaintext) under which
the commitment verifies and the stored ciphertext and tag at that index
decrypt under that index's segment AAD.  In random nonce mode the nonce
field is the nonce.  In derived nonce mode it is the counter, which
fixes the nonce once the commitment fixes the CEK, so the binding holds
for a decryptor that verifies the commitment.  It holds in both nonce
modes for every suite, for any A_i, and at the last index of an
intermediate snapshot, where the leaf fixes is_final = 0.</t>
        <t>Per-index binding is weaker than the ra-CMT-p of <xref target="FLRR25"/>, which also
rules out one ciphertext opening at two positions.  The object's author
can store one ciphertext at two indices whose epoch keys both accept it,
and the snapshot then accepts it at both.  For example, at epoch_length
10, indices 0 and 1024 fall under different epoch keys, and an AES-GCM
ciphertext valid under both keys costs no search (<xref target="DGRW18"/>).  Under
ChaCha20-Poly1305 and AES-256-GCM-SIV the two indices need not fall
under different epoch keys, since each index's nonce gives it its own
authentication key (<xref target="ADG22"/>).</t>
        <t>The per-segment associated data A_i is likewise outside the commitment:
SEAL binds A_i through segment_aad and the AEAD tag for that segment, so
contexts that differ only in A_i fall outside the ra-CMT claim
(<xref target="ra-cmt"/>).  A_i is also rewritable.  The strict authenticators' leaf
carries segment_aad, so an authenticated strict snapshot binds each
index's A_i.  A snapshot under a linear ordering does not, and an
application that needs A_i bound under one <bcp14>MUST</bcp14> bind it externally.</t>
        <t>A deployment that must defend against a malicious encryptor who controls
the CEK can close the adversarial-key position gap by one of two
changes, neither of which SEAL adds to the base construction.  They are
optional because only the object's author, who holds the CEK, can make
one ciphertext open at two positions, which gains it nothing it could
not already write, and the gap matters only to a system that identifies
content by ciphertext independent of position, such as deduplication or
content addressing.</t>
        <ul spacing="normal">
          <li>
            <t>A context-committing AEAD, so that each segment ciphertext
commits to its full decryption context rather than relying on the
external commitment over (CEK, payload_info, G).</t>
          </li>
          <li>
            <t>A per-segment collision-resistant commitment over the segment's
position and ciphertext, on the order of 16 to 64 octets per segment,
bound alongside the segment so that no segment opens at two
positions.</t>
          </li>
        </ul>
        <t>A strict authenticator with the ciphertext digest set narrows the gap
without closing it, giving at most the per-index binding above
(<xref target="snapshot-interface"/>).</t>
        <t>None of the SEAL AEADs is relied upon to provide CMT-1 or CMT-4
(<xref target="RFC9771"/>).  In particular AES-256-GCM-SIV is not key-committing,
with known attacks such as partitioning oracles.</t>
        <t>With commitment_length = Nh and Nt = 16, ra-CMT for fixed A_i is bounded
by commitment collision resistance, and ra-CMT-p for fixed A_i adds the
AEAD position-commitment term (<xref target="appendix-commitment"/>).  Under honestly
generated keys the idealized per-pair tag-forgery floor is 2^(-128)
because Nt = 16, and concrete per-AEAD authenticity bounds degrade with
segment length (<xref target="aead-usage-limits"/>).</t>
      </section>
      <section anchor="snapshot-security">
        <name>Snapshot Authenticator Security</name>
        <table anchor="snapshot-guarantee-matrix">
          <name>What each layer guarantees</name>
          <thead>
            <tr>
              <th align="left">Guarantee</th>
              <th align="left">Established by</th>
              <th align="left">Scope</th>
              <th align="left">Provided by</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Segment confidentiality and integrity, index and finality bound</td>
              <td align="left">AEAD decrypt, per segment</td>
              <td align="left">segment</td>
              <td align="left">this construction</td>
            </tr>
            <tr>
              <td align="left">Segment-set integrity: per-segment input, position, count</td>
              <td align="left">SnapVerify over the keyed snapshot</td>
              <td align="left">whole object</td>
              <td align="left">this construction</td>
            </tr>
            <tr>
              <td align="left">Segment-set integrity for a designated subset: per-segment input, position</td>
              <td align="left">SnapVerify with a witness</td>
              <td align="left">designated subset</td>
              <td align="left">this construction, under an authenticator that supports the subset target</td>
            </tr>
            <tr>
              <td align="left">Segment-set integrity for a prefix (prefix verification): per-segment input, position, count</td>
              <td align="left">SnapVerify over a snapshot the writer produced at that count</td>
              <td align="left">prefix 0..n-1</td>
              <td align="left">this construction, under a strict authenticator</td>
            </tr>
            <tr>
              <td align="left">Sender attribution, third-party verifiability</td>
              <td align="left">signature over the keyed snapshot, or over a public snapshot for a verifier without the CEK</td>
              <td align="left">whole object, or prefix 0..n-1 under an intermediate snapshot</td>
              <td align="left">consuming protocol, not provided</td>
            </tr>
            <tr>
              <td align="left">Freshness, whole-object rollback protection</td>
              <td align="left">external version or freshness state</td>
              <td align="left">whole object</td>
              <td align="left">consuming protocol, not provided</td>
            </tr>
          </tbody>
        </table>
        <t>Snapshot integrity is keyed by snap_key and protects the writer's
current segment set against a storage or write adversary that does not
hold snap_key.  A verifier who holds snap_key, hence the CEK from which
it is derived, detects any alteration of the segment set
(<xref target="snapshot-interface"/>).  The value gives no protection among parties
that share the CEK, which can recompute snap_key, and it is not a
third-party-verifiable commitment to a segment set.  Whether a fixed,
externally authenticated keyed snapshot binds segment content against
key holders depends on the authenticator (<xref target="snapshot-interface"/>).  An
application that needs sender attribution or third-party verifiability
<bcp14>MUST</bcp14> add a signing layer, over the keyed snapshot for a verifier that
holds the CEK, or over a public snapshot for one that does not, where
the authenticator defines one (<xref target="open-count-public"/>).</t>
        <t>A profile <bcp14>MUST</bcp14> keep each of an authenticator's KDF labels inside the
injective encode frame (<xref target="kdf-combiner"/>) so distinct roles cannot
collide on the primitive input.</t>
        <t>snap_key is derived per message from the CEK and salt and is not exposed
through the interface.</t>
      </section>
      <section anchor="aead-usage-limits">
        <name>Capacity and Usage Limits</name>
        <t>These usage limits are organized around independent limit classes, not
around named suites.  The accounting unit is one segment encryption
under one epoch key (<xref target="accounting-model"/>).</t>
        <t>The budgets depend on the AEAD's nonce, key, tag, and cipher block sizes
(Nn, Nk, Nt, Nb), on the AEAD's own published confidentiality and
integrity analysis, on the KDF's output size Nh and its mu-PRF security
(<xref target="appendix-adv-notation"/>), and on the suite's segment_max.  A suite
that fixes those works out every figure below.  The mu-PRF security
allows epoch keys to be treated as independent random keys, subject to
its distinguishing cost.</t>
        <t>The length-dependent limits in this section are computed at the suite's
segment_max, the largest plaintext one segment encryption carries.
Independent of these per-key budgets, a segment-encryption procedure
<bcp14>MUST</bcp14> respect each underlying AEAD's per-invocation input limits.</t>
        <section anchor="accounting-model">
          <name>Accounting Model</name>
          <t>One segment encryption consumes one write from a segment-encryption
key's budget.  Initial writes and rewrites are both segment encryptions.
The write budget belongs to the epoch key, not the CEK.  A derived-nonce
MRAE AEAD's data-volume term is the exception:  absent an allocation it
is counted in accounted blocks across all of the object's epoch keys
(<xref target="mrae-bounds"/>).</t>
          <dl>
            <dt>epoch-key budget:</dt>
            <dd>
              <t>the segment encryptions allowed under one epoch key.</t>
            </dd>
            <dt>write (initial write):</dt>
            <dd>
              <t>the first encryption of a segment.</t>
            </dd>
            <dt>rewrite:</dt>
            <dd>
              <t>a later encryption of the same segment.</t>
            </dd>
            <dt>epoch_length (r):</dt>
            <dd>
              <t>the base-2 log of the number of segments that share one epoch key.</t>
            </dd>
            <dt>n_blk:</dt>
            <dd>
              <t>the most AAD-plus-plaintext blocks one segment encryption processes,
for a block-cipher AEAD:  about segment_max / Nb when the segment AAD
is short.</t>
            </dd>
            <dt>advantage target:</dt>
            <dd>
              <t>the bound a budget is solved against.  The numerical confidentiality
figures in this section use 2^-32 for one of these scopes:  one
indicated term under one key; the derived-nonce data-volume term over
one object; one term across the aggregate scope; or the stated
isolated workload.  The exception is AES-GCM with random nonces, whose
own specification caps it at 2^32 encryptions per key, here the epoch
key, rewrites included (<xref target="NIST-SP-800-38D"/> Section 8.3).  A budget
quoted from an AEAD's own analysis holds at the target that analysis
states (<xref target="aggregate-usage"/>).</t>
            </dd>
          </dl>
        </section>
        <section anchor="aggregate-usage">
          <name>Aggregate Security Accounting</name>
          <t>The scope of an aggregate target includes all objects and epoch keys
available to the adversary.  Only the consuming protocol can see that
scope, so it allocates the target among the terms of
<xref target="appendix-adv-notation"/>, and the sum of these allocations stays within
the target.  For a workload that re-encrypts a position, which the
ra-ROR bound does not cover, these terms are AEAD-level operating
limits, not the ra-ROR bound.</t>
          <t>Let K count epoch keys in this scope, q_j their encryption counts, s_j
their processed block counts, and v_j their forgery-attempt counts.  A
union bound gives the random-nonce term, and summing the single-key
block-size bounds, here AES-GCM's (<xref target="conf-block-size"/>), gives a
conservative contribution in the independent key hybrid:</t>
          <artwork><![CDATA[
Adv_nonce_coll <= sum_j q_j^2 / 2^(8*Nn + 1)
CA_blocks      <= sum_j (s_j + q_j + 1)^2 / 2^(8*Nb + 1)
IA_forgery     <= sum_j v_j * F(segment_max)
]]></artwork>
          <t>The applicable AEAD analysis supplies any further terms.  Key collisions
and KDF distinguishing costs are charged separately as in
<xref target="appendix-adv-notation"/>.  For equal q_j, allocating epsilon_nonce to
nonce collisions gives:</t>
          <artwork><![CDATA[
q_j <= sqrt(epsilon_nonce * 2^(8*Nn + 1) / K)
]]></artwork>
          <t>A published multi-user bound can improve on this conservative accounting
when applied with its full workload parameters and hypotheses.
Derived-nonce MRAE accounting is given in <xref target="mrae-bounds"/>.</t>
        </section>
        <section anchor="limit-classes">
          <name>Limit Classes</name>
          <t>Five phenomena bound how much may be encrypted.</t>
          <table anchor="limit-class-table">
            <name>Usage-limit classes</name>
            <thead>
              <tr>
                <th align="left">Limit class</th>
                <th align="left">Applies to</th>
                <th align="left">Depends on</th>
                <th align="left">Failure mode</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Random-nonce collision</td>
                <td align="left">random nonce modes</td>
                <td align="left">nonce size, or a lower specification cap</td>
                <td align="left">confidentiality and integrity</td>
              </tr>
              <tr>
                <td align="left">Forgery bound</td>
                <td align="left">all AEADs</td>
                <td align="left">MAC strength, segment size</td>
                <td align="left">integrity</td>
              </tr>
              <tr>
                <td align="left">Block-size birthday</td>
                <td align="left">block-cipher AEADs</td>
                <td align="left">total blocks</td>
                <td align="left">confidentiality</td>
              </tr>
              <tr>
                <td align="left">Derived-nonce MRAE workload</td>
                <td align="left">derived-nonce MRAE</td>
                <td align="left">total blocks, and blocks per (key, nonce) pair</td>
                <td align="left">confidentiality and integrity</td>
              </tr>
              <tr>
                <td align="left">Epoch-key collision</td>
                <td align="left">128-bit-key AEADs</td>
                <td align="left">key size</td>
                <td align="left">confidentiality</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="max-object-size">
          <name>Maximum Object Size</name>
          <t>A write-once object is bounded by each epoch key's AEAD write budget,
the aggregate security budget (<xref target="aggregate-usage"/>), and the 2^63
segment index ceiling.  The same limits bound an append-only object, at
the write counts given at the end of this section.</t>
          <t>Under a flat key (one epoch key for the whole object), the AEAD budget
sets the size.  Which class binds follows from the AEAD:</t>
          <table anchor="write-once-table">
            <name>Flat-key write-once size limit by binding class</name>
            <thead>
              <tr>
                <th align="left">Binding class</th>
                <th align="left">Flat-key write-once limit</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Block-size birthday</td>
                <td align="left">the AEAD's own block-count bound, for AES-GCM 2^((8*Nb + 1 - 32)/2) / n_blk segments</td>
              </tr>
              <tr>
                <td align="left">Derived-nonce MRAE workload</td>
                <td align="left">the AEAD's coupled multi-user bound (<xref target="mrae-bounds"/>)</td>
              </tr>
              <tr>
                <td align="left">No block-cipher structure</td>
                <td align="left">2^63 segments, the index ceiling</td>
              </tr>
              <tr>
                <td align="left">No published block-size analysis</td>
                <td align="left">2^63 segments, the index ceiling</td>
              </tr>
            </tbody>
          </table>
          <t>The last two classes carry the same limit for different reasons.  An
AEAD with no block-cipher structure, such as one built on a stream
cipher, has no block-size term.  An AEAD whose analysis publishes none
may still have one, so a suite that places an AEAD in this class says
which case applies.</t>
          <t>These figures assume derived nonce mode, which a non-MRAE AEAD may use
only under a nonce-uniqueness discipline, the write-once or append-only
profiles (<xref target="derived-nonces"/>).  In random nonce mode such an AEAD binds
earlier, at the random-nonce-collision budget of 2^((8*Nn + 1 - 32)/2),
about 2^32 per epoch key at Nn = 12 (<xref target="conf-nonce-collision"/>), or at a
lower cap that the AEAD's own specification sets for random nonces, such
as AES-GCM's 2^32 encryptions per key (<xref target="accounting-model"/>).</t>
          <t>An append-only object re-encrypts one retained segment per append
(<xref target="append-only"/>), so a segment appended one at a time is written twice
rather than once, at two distinct (i, is_final) pairs.  The block-size
birthday figure, which counts blocks, therefore halves, and an MRAE
AEAD's multi-user bound counts the doubled writes in its total workload
(<xref target="mrae-bounds"/>).  The 2^63 index ceiling is unchanged.</t>
          <t>Epoch rotation supplies fresh keys but does not reset the aggregate
security budget.  The structural ceiling is 2^63 segments, about 2^79
octets at segment_max 65536.  Reaching it also requires the applicable
multi-user bounds to meet the aggregate target (<xref target="aggregate-usage"/>).
An AEAD subject to the epoch-key collision class additionally needs a
sufficiently large epoch_length.  At epoch_length 0 that floor caps the
total across every object in the aggregate scope near 2^(4*Nk - 16)
segments, about 2^48 at Nk = 16 (<xref target="epoch-length-guidance"/>).  Reaching
2^63 segments in one object then needs epoch_length at least 15, which
spends the scope's whole budget of about 2^48 epoch keys on that object.</t>
          <t>A rotating profile <bcp14>MUST</bcp14> keep each epoch key's 2^epoch_length initial
writes within its per-key budget.  For a derived-nonce MRAE AEAD, which
has no per-key figure, the per-object rule of <xref target="mrae-bounds"/> takes the
place of that budget absent an allocation.  An append-only profile adds
one re-mark per superseded segment, so each epoch key spans up to
2^(epoch_length + 1) pairs, and an encryptor <bcp14>MUST</bcp14> size the per-key
budget to cover those encryptions (<xref target="append-only"/>).  Rewrite capacity
is a separate condition (<xref target="rewrite-budget-security"/>).</t>
        </section>
        <section anchor="rewrite-budget-security">
          <name>Rewrite Capacity</name>
          <t>A rewrite consumes the same budget as an initial write.  How that budget
is shared depends on the nonce mode.</t>
          <t>For a random-nonce AEAD, epoch_length divides one per-epoch-key pool
among the 2^epoch_length segments that share the key.  If encryptions
are spread evenly, the count each segment can take falls as epoch_length
rises:</t>
          <artwork><![CDATA[
encryptions per segment  =  2^((8*Nn + 1 - 32)/2) / 2^epoch_length
]]></artwork>
          <t>The count includes each segment's initial write, so it leaves one fewer
rewrite.  At Nn = 12 that is about 2^(32 - epoch_length):  about 2^32
encryptions per segment at epoch_length 0, about 2^26 at 6, and about
2^22 at 10.  For AES-GCM the numerator is instead its cap of 2^32
(<xref target="accounting-model"/>), which counts initial writes and rewrites
together, so at epoch_length 32 an AES-GCM epoch has room for its
initial writes and no rewrites.</t>
          <t>For a derived-nonce MRAE AEAD, a rewrite reuses the segment's derived
nonce.  Its isolated hot-segment cap depends on length, but its allowed
rewrite count also depends on the aggregate workload.  For AES-GCM-SIV,
the multi-user bound couples total processed blocks to the maximum
blocks at one (epoch key, nonce) pair (<xref target="mrae-bounds"/>).  Giving every
segment the isolated hot-segment cap exceeds the same advantage target.
Distinct-nonce counts and forgery attempts also enter that bound.  An
MRAE AEAD built another way uses its own analysis.</t>
          <t>The random-nonce figures above are per-key nonce-collision figures;
<xref target="aggregate-usage"/> scales them to an aggregate target.  An AEAD whose
nonce size makes a flat key safe uses one, subject to its full
confidentiality and integrity bounds.</t>
          <t>Applications <bcp14>MUST</bcp14> track segment encryptions per key, and for a
derived-nonce MRAE AEAD the accounted blocks of <xref target="mrae-bounds"/>, and
freeze the object before a per-key, per-object, or aggregate budget is
exceeded.  The CEK is fixed per object and cannot be rotated in place,
so continued writing requires a new object under a fresh CEK, whose
budgets are new but still count in the aggregate (<xref target="aggregate-usage"/>).</t>
        </section>
        <section anchor="epoch-length-guidance">
          <name>Choosing epoch_length</name>
          <t>epoch_length means different things by mode.  For the random-nonce
AEADs, a smaller epoch_length puts fewer segments under each key, so
each segment keeps a larger share of the random-nonce collision pool, at
the cost of more epoch keys to derive and hold.  For a derived-nonce
MRAE AEAD, a smaller epoch_length reduces the distinct derived nonces
under an epoch key, but the allowed rewrite count still depends on the
aggregate workload (<xref target="mrae-bounds"/>).  An AEAD with a 256-bit nonce (Nn
= 32) makes collision negligible and has a high forgery floor, so a flat
key (epoch_length 63) is the natural choice.</t>
          <t>The cipher suite's default epoch_length, used when no epoch_length is
chosen, is 0 for the suites with an epoch_length range and 63 for the
suites whose nonce size makes a flat key safe.  A referencing protocol
may choose directly, or by citing a profile or named instantiation that
fixes a value.</t>
          <t>A referencing protocol that chooses an epoch_length tuned to its
expected segment count, rather than taking the default, trades some
rotation for fewer epoch keys while staying within budget.  Because a
segment may be shorter than segment_max, size epoch_length by the number
of segments rather than the object's octet length.</t>
          <t>The epoch keys are independent under the PRF security of the KDF
(<xref target="RFC8645"/>), so the epoch_length parameter controls budget
distribution, not key strength.</t>
          <t>An AEAD with a 128-bit key (Nk = 16) adds one further constraint.  The
epoch-key collision term (<xref target="appendix-adv-notation"/>) over the n_ep
distinct epoch keys is about:</t>
          <artwork><![CDATA[
n_ep^2 / 2^(8*Nk)
]]></artwork>
          <t>A profile whose AEAD has Nk = 16 <bcp14>SHOULD</bcp14> keep total distinct epoch keys
in the aggregate scope below about 2^(4*Nk - 16), which is about 2^48
at Nk = 16 and holds that term within the 2^-32 target.  At epoch_length
0 this caps the total across every object in that scope at about 2^48
segments, about 2^64 octets at segment_max 65536.</t>
        </section>
        <section anchor="derivations">
          <name>Derivations</name>
          <section anchor="conf-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.  The probability of any collision across keys is the sum bound
in <xref target="aggregate-usage"/>, so per-key budgets share an aggregate
allocation.  A collision costs integrity as well.  For a non-MRAE AEAD
whose authenticator is a polynomial universal hash it recovers an
authentication key (<xref target="nonce-misuse"/>):  under AES-GCM the GHASH key
(<xref target="NIST-SP-800-38D"/>), which authenticates every nonce under that epoch
key, and under ChaCha20-Poly1305 the one-time Poly1305 key for that
nonce.</t>
            <t>For derived nonce mode, nonces are deterministic and distinct across
segment indices, so this collision term does not apply.  The limits on
reusing a derived nonce are in <xref target="mrae-bounds"/>.</t>
          </section>
          <section anchor="conf-block-size">
            <name>Confidentiality (Block-Size Birthday Bound)</name>
            <t>Nonce collisions alone do not exhaust the confidentiality bound.  A
block-cipher AEAD has a distinguishing bound that grows with the total
number of cipher blocks processed under a key, which each AEAD takes
from its own analysis.  For AES-GCM, following the AEAD usage-limits
analysis (<xref target="I-D.irtf-cfrg-aead-limits"/>), if s is the total number of
AAD-plus-plaintext blocks, each Nb octets, and q is the number of
encryption queries under a key, the confidentiality advantage is at
most:</t>
            <artwork><![CDATA[
CA <= ((s + q + 1)^2) / 2^(8*Nb + 1)
]]></artwork>
            <t>Each encryption processes at most n_blk blocks, so s &lt;= n_blk * q and
CA is at most about q^2 * n_blk^2 / 2^(8*Nb + 1).  Solved against the
2^-32 target, the per-key budget is about:</t>
            <artwork><![CDATA[
q  <=  2^((8*Nb + 1 - 32)/2) / n_blk
]]></artwork>
            <t>about 2^36 at Nb = 16 and n_blk = 4096.  In random nonce mode the
nonce-collision bound dominates for typical deployments, and the
block-size term overtakes it only once n_blk^2 exceeds the threshold
below, which is 2^32 at Nb = 16 and Nn = 12:</t>
            <artwork><![CDATA[
nonce collision:  q^2 / 2^(8*Nn + 1)
threshold:        n_blk^2 > 2^(8*(Nb - Nn))
]]></artwork>
            <t>In derived nonce mode the nonce-collision term vanishes and the
block-size term is the binding confidentiality constraint.</t>
            <t>An AEAD with no block-cipher structure, such as one built on a stream
cipher, has no comparable block-size bound, leaving nonce collision and
forgery as the only relevant terms.  Nonce collision is negligible at a
large Nn, and the per-query forgery bound governs integrity.</t>
            <t>SEAL implementations <bcp14>MUST</bcp14> enforce usage budgets computed from the
AEAD-specific confidentiality and integrity bounds, not from
nonce-collision probability alone, and within any cap the AEAD's own
specification sets.  The budgets derive from the consuming protocol's
allocation of the aggregate target (<xref target="aggregate-usage"/>), or, absent an
allocation, are the per-key figures of this section, with the per-object
rule of <xref target="mrae-bounds"/> as the data-volume budget for a derived-nonce
MRAE AEAD.</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's own
analysis and on segment_max:</t>
            <artwork><![CDATA[
IA <= v * F(segment_max)
]]></artwork>
            <t>where v is the number of forgery attempts and F(segment_max) is the
per-query forgery advantage the AEAD's analysis gives at a segment of
segment_max octets.  F grows with segment_max, so a larger segment
lowers the attempt budget for a fixed target.  The tag length bounds F
from below, at about 2^(-8*Nt), so no AEAD offers more than about 8*Nt
bits of forgery resistance per query.  An AEAD's authenticator may
achieve less than its tag length suggests, so F is not determined by Nt
and a suite takes F from the analysis of its own AEAD.
<xref target="I-D.irtf-cfrg-aead-limits"/> gives F for several AEADs.</t>
          </section>
          <section anchor="mrae-bounds">
            <name>Derived-Nonce Bounds</name>
            <t>A derived-nonce MRAE AEAD needs its own multi-user analysis.  Counts of
distinct nonces and repeated encryptions at each nonce are coupled to
the total workload and are not independent budgets.</t>
            <t>For AES-GCM-SIV this section takes one term of the bound, the
data-volume term of <xref target="BHT18"/> Theorem 6, with c the theorem's hash
parameter:</t>
            <artwork><![CDATA[
C * L * B / 2^128,   C = 48*c + 30
]]></artwork>
            <t>L is the total block length of encryption and verification queries.  B
bounds encryption blocks at any one (user, nonce) pair, a user being one
epoch key here.  Block accounting includes associated data and padding
as in that analysis.  The theorem's bound is all-in-one, so this term
governs integrity as well as confidentiality.  The full bound adds a
constant term and further terms in L, in the ideal-cipher work, and in
the cross-user nonce repetition, and its hypotheses must hold.  Those
terms share the aggregate allocation of <xref target="aggregate-usage"/>.  This
section's figures take an adversary that reads ciphertexts and makes no
verification queries, so L counts encryption blocks.  Assigning
epsilon_data to this term requires:</t>
            <artwork><![CDATA[
C * L * B / 2^128 <= epsilon_data
]]></artwork>
            <t>For an illustration of the scaling, let ell be the accounted blocks per
encryption, with the whole workload in scope n_rw encryptions at one
(key, nonce) pair and no other encryption, or H equally busy pairs, each
encrypted n_rw times:</t>
            <artwork><![CDATA[
one active pair:  L = B = n_rw * ell
H active pairs:   L = H * n_rw * ell,  B = n_rw * ell
]]></artwork>
            <t>The allocated term gives:</t>
            <artwork><![CDATA[
one active pair:  n_rw <= sqrt(epsilon_data * 2^128 / C) / ell
H active pairs:   n_rw <= sqrt(epsilon_data * 2^128 / (C * H)) / ell
]]></artwork>
            <t>POLYVAL has c = 1.5 (<xref target="BHT18"/> Remark 1), so C = 102, and an
epsilon_data of 2^-32 then gives one active pair about 2^34.7
encryptions of a 16 KiB segment and about 2^32.7 of a 64 KiB one.
Initial writes and the finality re-marks of appends and truncations also
contribute to the full workload.</t>
            <t>Absent an allocation of the aggregate target (<xref target="aggregate-usage"/>), the
object is the scope for this term.  The encryptor tracks L_obj, the
accounted blocks of every segment encryption under the object's epoch
keys, and B_obj, the largest total of accounted blocks over all
encryptions at any one (epoch key, nonce) pair.  It freezes the object
before the term exceeds 2^96, the term at 2^-32:</t>
            <artwork><![CDATA[
C * L_obj * B_obj <= 2^96,   about L_obj * B_obj <= 2^89.3 at C = 102
]]></artwork>
            <t>Verifying a ciphertext that no encryption produced at the same (epoch
key, nonce, associated data) is a forgery attempt
(<xref target="integrity-forgery"/>), and its blocks enter L as well.  Each attempt
adds about the following for every block it processes, with B the
largest encryption load at any one pair, whichever pair the attempt
targets:</t>
            <artwork><![CDATA[
C * B / 2^128
]]></artwork>
            <t>Where a deployment admits such attempts, L_obj also counts the blocks of
those the consuming protocol allows, which the encryptor does not
observe.</t>
          </section>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>For a position-respecting adversary, raAE's ra-ROR security target
(<xref target="ra-ror"/>) rests on a multi-user real-or-random (mu-ROR$) AEAD, a
multi-user pseudorandom (mu-PRF) KDF, a fresh per-message salt, and,
where configured, nonces that do not collide under a nonce hedge, the
hedge KDF's PRF security under HedgedRandom, and the snapshot
authenticator's forgery resistance (<xref target="appendix-adv-notation"/>,
<xref target="appendix-proof-map"/>).  Integrity is bounded by the AEAD tag, about
8*Nt bits per query (<xref target="integrity-forgery"/>).  A larger AEAD key raises
confidentiality margins, not the tag-length forgery floor.</t>
      <section anchor="resource-exhaustion">
        <name>Resource Exhaustion</name>
        <t>An adversary can supply large segment counts, long ciphertexts or
associated data, or repeated invalid objects to exhaust memory, storage,
or verification time.  Snapshot verification can require work over the
entire segment set before rejecting an object.  These are
denial-of-service threats of the kind Section 4.6 of <xref target="RFC3552"/>
describes.  Cryptographic authentication does not prevent them, since a
verifier does the work before it rejects.</t>
        <t>Consuming protocols <bcp14>MUST</bcp14> define and enforce limits on segment and epoch
counts, object and segment lengths, associated-data lengths,
allocations, storage, and verification work.  Implementations <bcp14>MUST</bcp14> check
these limits before allocating from untrusted counts or lengths or
undertaking the corresponding verification work.  Offset and size
arithmetic <bcp14>MUST</bcp14> be checked for overflow and for bounds within the
supplied object before accessing data.  A consuming protocol also needs
limits on repeated presentations of objects, valid or not, since
individually bounded objects can exhaust aggregate resources.  It sets
these limits according to its available resources; the cryptographic
usage budgets alone do not supply them.</t>
      </section>
      <section anchor="detection-summary">
        <name>Detection Summary</name>
        <t>The rows detected by SnapVerify assume a snapshot authenticator is
configured.  Without one, those modes go undetected, except the
write-once truncation case that the finality requirement of
<xref target="full-decryption"/> detects (the truncation row).</t>
        <table anchor="detection-table">
          <name>Failure modes and the checks that detect them</name>
          <thead>
            <tr>
              <th align="left">Failure mode</th>
              <th align="left">Detected by</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Wrong CEK, salt, or parameter set</td>
              <td align="left">The commitment, before any segment decryption (<xref target="framework-commitment"/>), when reader and writer share the payload_info construction.</td>
            </tr>
            <tr>
              <td align="left">Modified ciphertext core or AEAD tag</td>
              <td align="left">AEAD.Decrypt for the affected segment.</td>
            </tr>
            <tr>
              <td align="left">Segment moved to a different index</td>
              <td align="left">AEAD.Decrypt: index and finality are bound by segment_aad (random nonce mode) or the nonce (derived nonce mode).</td>
            </tr>
            <tr>
              <td align="left">Segment copied from another object at the same index</td>
              <td align="left">AEAD.Decrypt, when the source used a different CEK or salt; a reused salt under the same CEK breaks this separation (<xref target="salt-reuse"/>).</td>
            </tr>
            <tr>
              <td align="left">Segment copied from another version at the same index</td>
              <td align="left">SnapVerify, not per-segment AEAD alone, unless the whole object including its snapshot is rolled back to that earlier valid version, whether presented as is or after a writer updates it from a verified snapshot that is not current (<xref target="raae-writable"/>).</td>
            </tr>
            <tr>
              <td align="left">Dropped trailing segment(s) (truncation)</td>
              <td align="left">Write-once: the finality requirement of <xref target="full-decryption"/> (top present segment carries is_final = 0). Length-changing: SnapVerify, since a re-marked terminal (<xref target="extend"/>) can be replayed; the mutable profile always configures an authenticator. Truncation to the count of an intermediate snapshot, presented with that snapshot: SnapVerify with the value declared complete, and the finality requirement. Rollback (<xref target="snapshot-limitations"/>). Truncation to zero: the zero-segment prohibition (<xref target="snapshot-none"/>), or SnapVerify.</td>
            </tr>
            <tr>
              <td align="left">Missing interior, duplicated, reordered, or inserted segment</td>
              <td align="left">SnapVerify (index set, count, authenticator inputs, recomputed keyed snapshot).</td>
            </tr>
            <tr>
              <td align="left">Stale keyed snapshot</td>
              <td align="left">SnapVerify, unless the stale value is part of a whole-object rollback.</td>
            </tr>
            <tr>
              <td align="left">Whole-object rollback</td>
              <td align="left">Not detected by raAE alone; the consuming protocol needs authenticated external freshness state.</td>
            </tr>
            <tr>
              <td align="left">Equality leakage in derived nonce mode</td>
              <td align="left">Not an authentication failure; rewriting equal plaintext at the same index can reveal equality (<xref target="nonce-generation"/>, <xref target="nonce-misuse"/>).</td>
            </tr>
          </tbody>
        </table>
      </section>
      <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.
When such an AEAD's authenticator is a polynomial universal hash, nonce
reuse also recovers the authentication key, enabling forgery of
arbitrary messages.</t>
        <t>Random nonce mode depends on the CSPRNG.  If the CSPRNG returns
duplicated state, segments collide unless a hedge prevents it
(<xref target="hedged-randomness"/>, <xref target="appendix-pt-bound"/>).  Derived nonce mode
removes that dependence, since nonces are deterministic, but the
determinism is itself a hazard:  re-encrypting a segment with different
content under its repeated derived nonce is a two-time pad, catastrophic
for a non-MRAE AEAD.</t>
        <t>A non-MRAE AEAD therefore uses derived nonces only under the write-once
or append-only discipline of <xref target="derived-nonces"/>, which draws a fresh
salt per object and never encrypts an (i, is_final) pair twice under
that salt, including after a crash.  Retransmission of saved ciphertext
does not invoke encryption.  An MRAE AEAD instead degrades only to
equality leakage, not plaintext recovery.</t>
        <t>The plaintext-bound construction (<xref target="appendix-pt-bound"/>) partially
defends against CSPRNG duplication:  different plaintexts or segment AAD
at the same index produce different nonces because the derivation input
differs, but an equal plaintext under equal segment AAD still collides.
Implementations that need segment contents defended against random
number generator (RNG) state duplication <bcp14>MUST</bcp14> use derived nonce mode
with an MRAE AEAD, which limits what duplication reveals about segment
contents to equality.  HedgedRandom with a tag2 that stays unique covers
duplication of the CSPRNG state alone (<xref target="hedged-randomness"/>), but an
implementation rarely knows whether a restore also rolled back tag2, so
the hedge does not meet this requirement.</t>
      </section>
      <section anchor="parameter-mismatch">
        <name>Parameter Set Mismatch</name>
        <t>The full parameter set that affects encryption, decryption, AAD
construction, nonce construction, and key derivation is bound into
payload_info (see <xref target="components"/>) and therefore into the commitment.  A
reader using a different parameter set than the writer triggers a
commitment mismatch before any AEAD operation is attempted.  A reader
supplying a different G than the encryptor likewise triggers a
commitment mismatch (<xref target="framework-commitment"/>).  Consuming protocols
<bcp14>MUST</bcp14> still reject unrecognized or unsupported parameter values before
decryption, since the commitment check detects mismatch but does not by
itself indicate which parameter value the recipient is unable to
support.</t>
        <t>One profile-level constant is bound transitively rather than via
payload_info:  aad_label is bound through protocol_id (each profile
fixes its own aad_label).  Profiles <bcp14>MUST NOT</bcp14> share a protocol_id across
distinct aad_label values.  Reusing a protocol_id with a changed
aad_label produces objects whose commitment matches the wrong reader
but whose per-segment AEAD verification fails with no clear error
attribution.</t>
      </section>
      <section anchor="framing-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, and the table gives the rule
for each pairing:</t>
        <table anchor="nonce-aead-table">
          <name>Nonce mode by AEAD class and profile</name>
          <thead>
            <tr>
              <th align="left">AEAD class / profile</th>
              <th align="left">random nonce</th>
              <th align="left">derived nonce</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">non-MRAE, mutable</td>
              <td align="left">valid</td>
              <td align="left">unsafe</td>
            </tr>
            <tr>
              <td align="left">non-MRAE, write-once or append-only</td>
              <td align="left">valid</td>
              <td align="left">valid</td>
            </tr>
            <tr>
              <td align="left">MRAE, any profile</td>
              <td align="left">wasteful</td>
              <td align="left">valid</td>
            </tr>
          </tbody>
        </table>
        <t>Rewrite is where the coupling matters:  a derived nonce is reused where
a random nonce is redrawn, and the consequences of that reuse by AEAD
class are in <xref target="nonce-misuse"/> and <xref target="derived-nonces"/>.</t>
      </section>
      <section anchor="snapshot-limitations">
        <name>Snapshot Integrity Limitations</name>
        <t>A reader that does not run snapshot verification
(<xref target="snapshot-authenticator"/>) gets per-segment AEAD authenticity only
(<xref target="snapshot-integrity"/>):  the ciphertext core is authenticated under
its index and finality bit, but substitution of a previous valid
same-index segment, and dropping or rolling back other segments, go
undetected.  Such readers <bcp14>MUST</bcp14> still verify the commitment per
<xref target="framework-commitment"/>.  Applications that support random-access
single-segment reads <bcp14>MUST</bcp14> either run snapshot verification on every read
or explicitly document that they accept per-segment authenticity without
snapshot freshness.</t>
        <t>Snapshot verification authenticates the segment set, its positions, and
the count.  Without the ciphertext digest it does not confirm that a tag
is a valid AEAD tag for the ciphertext beside it.  With the ciphertext
digest set, the strict authenticators bind the ciphertext bytes, tag,
nonce field, and segment AAD, but do not establish that the tag opens
the ciphertext under the AEAD (<xref target="snapshot-interface"/>), which decrypting
the segment does (<xref target="key-commitment"/>).</t>
        <t>Snapshot integrity does not provide freshness against whole-object
rollback.  A storage adversary that rolls back the entire encrypted
object, including the snapshot, to a previously valid version is not
detected by raAE alone, because the rolled-back snapshot is itself a
valid snapshot for that prior state.  This is replay, not forgery.
Applications that require whole-object rollback resistance <bcp14>MUST</bcp14> bind an
authenticated version field, timestamp, monotonic counter, or
authenticated storage layer into the snapshot context.  An update that
meets the writer rule of <xref target="witness-rules"/> from a current verified
snapshot cannot launder a rolled-back snapshot into a valid ongoing
history.</t>
        <t>Same-index rollback within a snapshot is detected when snapshot
verification runs:  replacing one segment with a previously valid
same-index segment under the current keyed snapshot changes the
recomputed value, so verification fails except with the forgery
probability of <xref target="snapshot-security"/>.</t>
        <t>Truncation, including removal of the final segment marked is_final = 1,
is detected by snapshot verification, since the removed segment is
absent from the recomputed value and the count n_seg no longer matches.
Truncation to the count of an earlier complete version, presented with
that version's snapshot, is the exception <xref target="snapshot-interface"/> states.</t>
      </section>
      <section anchor="salt-reuse">
        <name>Salt Reuse</name>
        <t>Reusing a salt with the same CEK, protocol_id, and other payload_info
fields across two files produces the same payload_key, the same
snap_key, and, in derived nonce mode, the same nonce_base.  It defeats
schedule-based object separation in every nonce mode, but it does not by
itself make an individual swap pass a fixed snapshot.</t>
        <t>With equal protocol_id and payload_info, a donor segment can pass the
recipient's per-segment AEAD check at the same index when finality and
A_i also match.  That check binds the segment key, nonce, and effective
AAD (<xref target="concrete-segment-aad"/>); it does not separately bind the object's
commitment or G.  In random nonce mode the donor's stored nonce travels
with the segment.  Without a snapshot authenticator, a reader relying
only on per-segment AEAD checks accepts this substitution.</t>
        <t>An individual substitution that changes the authenticated leaf fails
snapshot verification, except by forgery, if the recipient's current
snapshot stays in place (<xref target="snapshot-limitations"/>).</t>
        <t>Substitution together with donor snapshot state can pass when the
resulting segment set, count, and bound context match that donor state.
This includes replay of the donor's entire object in a recipient context
that admits it.  A keyed snapshot over indexed tags and the count alone
binds, through snap_key, protocol_id and payload_info but not G.  One
that also includes the commitment, as SEAL's strict authenticators do,
rejects a donor snapshot under a different recipient commitment
(<xref target="I-D.sullivan-seal-concrete"/>).  G changes the commitment but not
payload_key, snap_key, or nonce_base (<xref target="key-derivation"/>).  Where all
bound contexts match, no snapshot authenticator supplies a separate
object identity to distinguish cross-object replay.  A consuming
protocol's authenticated object identity or freshness can reject that
replay (<xref target="snapshot-limitations"/>).</t>
        <t>In derived nonce mode the nonces also repeat across the two files, so an
MRAE AEAD degrades to deterministic encryption and leaks plaintext
equality between same-index segments.  A non-MRAE AEAD then permits
plaintext recovery:  its discipline (<xref target="derived-nonces"/>) keeps derived
nonces unique only within one object, and a reused salt repeats
nonce_base, hence every derived nonce, across two.</t>
        <t>In random nonce mode (and with the plaintext-bound hedge) fresh nonces
keep confidentiality intact, although the per-key nonce-collision budget
of <xref target="conf-nonce-collision"/> then counts encryptions across both files
under each shared segment key.  The object-separation failure above
remains.  Applications <bcp14>MUST</bcp14> therefore ensure salt uniqueness per CEK
when creating a new message.  The freshness requirement in
<xref target="full-encryption"/> exists for this reason.</t>
      </section>
      <section anchor="rewrite-hazards">
        <name>Rewrite Hazards</name>
        <t>The tracking and freezing requirement of <xref target="rewrite-budget-security"/>
applies to rewrites.  In random nonce mode with Nn = 12 the per-key
nonce-collision figure is roughly 2^32 encryptions per epoch key, and
exceeding it risks nonce collisions, which a non-MRAE AEAD turns into
plaintext recovery (<xref target="nonce-misuse"/>).</t>
        <t>A mutable profile with derived nonces and an MRAE AEAD reuses a
segment's deterministic nonce across non-terminal rewrites, and a writer
that encrypts when it retries after a crash reuses it once more.
Confidentiality then rests not on nonce uniqueness but on the
workload-dependent rewrite bound (<xref target="rewrite-budget-security"/>):  the
AEAD degrades to equality leakage between identical rewrites rather than
to plaintext recovery, as long as the per-object or allocated aggregate
budget of <xref target="mrae-bounds"/> is respected.</t>
        <t>The append-only profile has no such margin.  It admits a non-MRAE AEAD,
so its safety rests on never re-encrypting a segment with different
content (<xref target="append-only"/>), and a writer that breaks that rule gets a
two-time pad rather than a bounded leak.</t>
        <t>Per-segment associated data A_i is rewritable, so a reader cannot treat
it as context fixed at creation (<xref target="concrete-segment-aad"/>).  An
application that needs creation-fixed context places it in G, which the
commitment binds (<xref target="framework-commitment"/>), not in A_i.</t>
        <t>raAE also does not guarantee atomic rewrites.  A segment rewrite touches
the nonce metadata, ciphertext core, AEAD tag, the keyed snapshot, and
any stored summary such as the masked accumulator or the epoch heads.  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="constant-time">
        <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 the KDF's keyed operations execute in constant time with
respect to their key inputs.  For an HMAC-based KDF this is satisfied by
implementations that do not branch on key octets.</t>
        <t>Both the commitment comparison (<xref target="full-decryption"/>) and the snapshot
comparison in SnapVerify <bcp14>MUST</bcp14> use a constant-time octet comparison.  A
variable-time comparison lets an adversary who can retry tampered inputs
learn the expected value one octet at a time, reducing the forgery cost
of either check to a linear number of trials.</t>
        <t>AEAD.Encrypt and AEAD.Decrypt 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.  Everything a
complete storage or messaging system needs beyond that is the consuming
protocol's responsibility.</t>
        <dl>
          <dt>Freshness and whole-object rollback:</dt>
          <dd>
            <t>Snapshot integrity binds the segment set of one recorded object
state, not its recency.  A party holding the ciphertext can present an
earlier honest state in full, and both per-segment and snapshot
verification still pass.  Telling the current state from a stale one
requires external freshness (<xref target="snapshot-limitations"/>).</t>
          </dd>
          <dt>Forward secrecy:</dt>
          <dd>
            <t>The CEK must remain available as long as any reader needs access, so
raAE provides none.</t>
          </dd>
          <dt>Sender identity:</dt>
          <dd>
            <t>Ciphertexts are not bound to any sender.  A signing or MAC layer is
needed for sender authentication.</t>
          </dd>
          <dt>Unlinkability:</dt>
          <dd>
            <t>Key identifiers and structural features of the encrypted format are
visible, so unlinkability requires application-layer measures.</t>
          </dd>
          <dt>Whole-message replacement:</dt>
          <dd>
            <t>Snapshot verification covers 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>
          </dd>
          <dt>Serialization, storage, and key management:</dt>
          <dd>
            <t>raAE emits and consumes component values but defines no wire
container, storage transactions, or key lifecycle.  A consuming
protocol supplies these.</t>
          </dd>
        </dl>
      </section>
      <section anchor="security-domain-separation">
        <name>Cross-Application Domain Separation</name>
        <t>Two applications that both reuse the same SEAL profile label with the
same input keying material, the same payload_info, and the same G derive
identical commitments, keys, nonces, and AADs.  The protocol_id provides
cross-application domain separation only when it is distinct per
application.  Applications whose keying material may be shared across
systems <bcp14>SHOULD</bcp14> use an application-specific protocol_id (for example,
"myapp-backup-v1") rather than a SEAL profile label.  An application
adopting a SEAL profile unchanged <bcp14>MAY</bcp14> use that profile's label.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.  It defines an abstract primitive
and a parameterized construction and requests no code points or
registries of its own.  The cipher-suite code points and the registries
of named instantiations and snapshot authenticators are specified in the
companion (<xref target="I-D.sullivan-seal-concrete"/>).</t>
      <t>The normative reference to <xref target="I-D.ietf-hpke-pq"/>, which defines the
one-step KDF class this document's combiner admits, is a reference to
a work in progress, so publication of this document waits on it.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <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="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="RFC9180">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan"/>
            <author fullname="B. Lipp" initials="B." surname="Lipp"/>
            <author fullname="C. Wood" initials="C." surname="Wood"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9180"/>
          <seriesInfo name="DOI" value="10.17487/RFC9180"/>
        </reference>
        <reference anchor="I-D.ietf-hpke-pq">
          <front>
            <title>Post-Quantum and Post-Quantum/Traditional Hybrid Algorithms for HPKE</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="Deirdre Connolly" initials="D." surname="Connolly">
              <organization>Selkie Cryptography</organization>
            </author>
            <date day="6" month="July" year="2026"/>
            <abstract>
              <t>   Updating key exchange and public-key encryption protocols to resist
   attack by quantum computers is a high priority given the possibility
   of "harvest now, decrypt later" attacks.  Hybrid Public Key
   Encryption (HPKE) is a widely-used public key encryption scheme based
   on combining a Key Encapsulation Mechanism (KEM), a Key Derivation
   Function (KDF), and an Authenticated Encryption with Associated Data
   (AEAD) scheme.  In this document, we define KEM algorithms for HPKE
   based on both post-quantum KEMs and hybrid constructions of post-
   quantum KEMs with traditional KEMs, as well as a KDF based on SHA-3
   that is suitable for use with these KEMs.  When used with these
   algorithms, HPKE is resilient with respect to attacks by a quantum
   computer.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-hpke-pq-05"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC3552">
          <front>
            <title>Guidelines for Writing RFC Text on Security Considerations</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <author fullname="B. Korver" initials="B." surname="Korver"/>
            <date month="July" year="2003"/>
            <abstract>
              <t>All RFCs are required to have a Security Considerations section. Historically, such sections have been relatively weak. This document provides guidelines to RFC authors on how to write a good Security Considerations section. 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="72"/>
          <seriesInfo name="RFC" value="3552"/>
          <seriesInfo name="DOI" value="10.17487/RFC3552"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="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="RFC9580">
          <front>
            <title>OpenPGP</title>
            <author fullname="P. Wouters" initials="P." role="editor" surname="Wouters"/>
            <author fullname="D. Huigens" initials="D." surname="Huigens"/>
            <author fullname="J. Winter" initials="J." surname="Winter"/>
            <author fullname="Y. Niibe" initials="Y." surname="Niibe"/>
            <date month="July" year="2024"/>
            <abstract>
              <t>This document specifies the message formats used in OpenPGP. OpenPGP provides encryption with public key or symmetric cryptographic algorithms, digital signatures, compression, and key management.</t>
              <t>This document is maintained in order to publish all necessary information needed to develop interoperable applications based on the OpenPGP format. It is not a step-by-step cookbook for writing an application. It describes only the format and methods needed to read, check, generate, and write conforming packets crossing any network. It does not deal with storage and implementation questions. It does, however, discuss implementation issues necessary to avoid security flaws.</t>
              <t>This document obsoletes RFCs 4880 ("OpenPGP Message Format"), 5581 ("The Camellia Cipher in OpenPGP"), and 6637 ("Elliptic Curve Cryptography (ECC) in OpenPGP").</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9580"/>
          <seriesInfo name="DOI" value="10.17487/RFC9580"/>
        </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-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="3" month="September" year="2026"/>
            <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.  This document is a product of the Crypto
   Forum Research Group (CFRG) in the IRTF.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-aead-limits-13"/>
        </reference>
        <reference anchor="I-D.sullivan-seal-concrete">
          <front>
            <title>SEAL Cipher Suites and Instantiations</title>
            <author initials="N." surname="Sullivan" fullname="Nick Sullivan">
              <organization/>
            </author>
            <date year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-sullivan-seal-concrete-01"/>
        </reference>
        <reference anchor="BHT18" target="https://eprint.iacr.org/2018/136">
          <front>
            <title>Revisiting AES-GCM-SIV: Multi-user Security, Faster Key Derivation, and Better Bounds</title>
            <author initials="P." surname="Bose">
              <organization/>
            </author>
            <author initials="V. T." surname="Hoang">
              <organization/>
            </author>
            <author initials="S." surname="Tessaro">
              <organization/>
            </author>
            <date year="2018"/>
          </front>
          <seriesInfo name="IACR" value="ePrint 2018/136"/>
        </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>
        <reference anchor="HRRV15" 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="TAHOE" target="https://eprint.iacr.org/2012/524">
          <front>
            <title>Tahoe: The Least-Authority Filesystem</title>
            <author initials="Z." surname="Wilcox-O'Hearn">
              <organization/>
            </author>
            <author initials="B." surname="Warner">
              <organization/>
            </author>
            <date year="2008" month="October"/>
          </front>
          <seriesInfo name="StorageSS '08" value="pp. 21-26"/>
          <seriesInfo name="DOI" value="10.1145/1456469.1456474"/>
        </reference>
        <reference anchor="Tink" target="https://eprint.iacr.org/2020/1019">
          <front>
            <title>Security of Streaming Encryption in Google's Tink Library</title>
            <author initials="V. T." surname="Hoang">
              <organization/>
            </author>
            <author initials="Y." surname="Shen">
              <organization/>
            </author>
            <date year="2020"/>
          </front>
          <seriesInfo name="IACR" value="ePrint 2020/1019"/>
        </reference>
        <reference anchor="DGRW18" target="https://doi.org/10.1007/978-3-319-96884-1_6">
          <front>
            <title>Fast Message Franking: From Invisible Salamanders to Encryptment</title>
            <author initials="Y." surname="Dodis">
              <organization/>
            </author>
            <author initials="P." surname="Grubbs">
              <organization/>
            </author>
            <author initials="T." surname="Ristenpart">
              <organization/>
            </author>
            <author initials="J." surname="Woodage">
              <organization/>
            </author>
            <date year="2018"/>
          </front>
          <seriesInfo name="CRYPTO 2018, LNCS" value="vol. 10991, pp. 155-186"/>
          <seriesInfo name="DOI" value="10.1007/978-3-319-96884-1_6"/>
        </reference>
        <reference anchor="ADG22" target="https://www.usenix.org/conference/usenixsecurity22/presentation/albertini">
          <front>
            <title>How to Abuse and Fix Authenticated Encryption Without Key Commitment</title>
            <author initials="A." surname="Albertini">
              <organization/>
            </author>
            <author initials="T." surname="Duong">
              <organization/>
            </author>
            <author initials="S." surname="Gueron">
              <organization/>
            </author>
            <author initials="S." surname="Kölbl">
              <organization/>
            </author>
            <author initials="A." surname="Luykx">
              <organization/>
            </author>
            <author initials="S." surname="Schmieg">
              <organization/>
            </author>
            <date year="2022"/>
          </front>
          <seriesInfo name="USENIX Security 2022" value="pp. 3291-3308"/>
        </reference>
        <reference anchor="FLRR25" 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="2026"/>
          </front>
          <seriesInfo name="EUROCRYPT" value="2026"/>
          <seriesInfo name="DOI" value="10.1007/978-3-032-25333-0_10"/>
        </reference>
        <reference anchor="SEALPROOFS">
          <front>
            <title>Security Analysis of the SEAL Construction: raAE, Snapshot Integrity, and Commitment</title>
            <author initials="N." surname="Sullivan">
              <organization/>
            </author>
            <date/>
          </front>
          <seriesInfo name="Work in Progress" value="manuscript in preparation"/>
        </reference>
      </references>
    </references>
    <?line 3514?>

<section anchor="appendix-pt-bound">
      <name>Optional Plaintext-Bound Nonce Construction</name>
      <t>This appendix is informative.  It describes an optional encryptor-side
construction that mixes plaintext content into the per-segment nonce
derivation to defend against RNG state duplication.  The construction is
encryptor-only: the decryptor reads the resulting nonce from the wire
(in the same slot used by random mode) and never invokes any of the
machinery below.  Implementations <bcp14>MAY</bcp14> use this construction in place of
a fresh CSPRNG call when generating nonces under nonce_mode "random".
The wire format is indistinguishable from random mode and decryption is
unaffected.</t>
      <t>One such construction:</t>
      <artwork><![CDATA[
pt_digest(i) = LH(P_i)

encryption_params = [aead_id, segment_max_be, kdf_id]
pt_hash(i) = KDF(protocol_id, pt_hash_label,
                 [pt_digest(i)],
                 encryption_params, Nh)

nonce_ctx = encode(protocol_id, uint64(i), pt_hash(i),
                   segment_aad(i, is_final, A_i))
nonce(i) = KDF(protocol_id, pt_nonce_label,
               [Random(Nn), payload_key],
               [...payload_info, nonce_ctx], Nn)
]]></artwork>
      <t>This construction fixes two labels:</t>
      <table anchor="pt-bound-labels">
        <name>Plaintext-bound construction labels</name>
        <thead>
          <tr>
            <th align="left">Derivation role</th>
            <th align="left">Label variable</th>
            <th align="left">Value</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Plaintext digest binding</td>
            <td align="left">pt_hash_label</td>
            <td align="left">"pt-nonce"</td>
          </tr>
          <tr>
            <td align="left">Final nonce derivation</td>
            <td align="left">pt_nonce_label</td>
            <td align="left">"nonce"</td>
          </tr>
        </tbody>
      </table>
      <t>Both labels are distinct from all other SEAL labels.  Neither derivation
uses nonce_base_label (<xref target="label-table"/>):  the "nonce_base" label belongs
to derived nonce mode and does not appear in this construction.  In the
final derivation nonce_ctx enters the info list as one element after the
payload_info elements:  its encode output is framed behind a length
prefix like any other element, not spliced flat into the list.</t>
      <t>LH is the over-large-field digest of <xref target="kdf-combiner"/>.  Its collision
resistance is justified in <xref target="kdf-combiner"/>.</t>
      <t>nonce_ctx carries segment_aad (<xref target="concrete-segment-aad"/>), so the
derivation binds the finality bit and A_i as well as the plaintext and
index.  A derivation over the plaintext and index alone does not bind
the complete effective AEAD context.  Under duplicated RNG state, an
unchanged-plaintext terminal re-mark or a change to A_i would repeat
the earlier nonce under different associated data.  For a non-MRAE AEAD
with a polynomial-hash authenticator, that recovers the authentication
key (<xref target="nonce-misuse"/>).</t>
      <t>When the encryptor's CSPRNG produces duplicated state (for example, from
a virtual machine snapshot or a fork without reseed), two encryptions
that differ in plaintext or segment AAD at the same index yield
different derivation inputs, subject to LH and KDF collisions.  Nonce
collisions remain subject to the Nn-octet output bound.  Under the same
payload schedule, identical plaintexts, index, segment AAD, and random
input yield identical nonces and ciphertexts, revealing only plaintext
equality.  An identical rewrite then also repeats its tag, which voids
the random-mode exemption that <xref target="I-D.sullivan-seal-concrete"/> gives
removed tags under the writer rule (<xref target="raae-writable"/>).</t>
      <t>For rewrites under this construction, the encryptor recomputes
pt_hash(i) and nonce_ctx from the new plaintext and segment AAD, derives
a fresh nonce(i) with a new Random(Nn), seals the new plaintext under
the new nonce, and updates the keyed snapshot as in <xref target="full-rewrite"/>.</t>
    </section>
    <section anchor="hedged-randomness">
      <name>Optional Hedged Randomness</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_label, sk, [], Nh)

HedgedRandom(n, label):
  ;; tag2: unique to each call under hedge_key, such as a counter
  return KDF(protocol_id, label,
      [hedge_key, Random(n)], [tag2], n)
]]></artwork>
      <t>This construction fixes one label, hedge_label = "hedge", distinct from
all other SEAL labels.  Here tag2 is the per-call nonce of <xref target="RFC8937"/>
Section 4:  a value unique to each call under one hedge_key, such as a
counter that never repeats or a timer guaranteed to differ per call.
With it no two calls present the KDF the same input, even when their
CSPRNG draws repeat.  Calls under one hedge_key <bcp14>MUST NOT</bcp14> repeat tag2,
including calls by another process or device that holds sk and calls
after a restart (<xref target="RFC8937"/> Section 4).  A counter therefore needs
persistent state or an instance-unique prefix, the role tag1 plays in
<xref target="RFC8937"/>.</t>
      <t>HedgedRandom output depends on both the CSPRNG and sk, so a weak CSPRNG
alone cannot predict it.  Hedging does not help when duplicated state
also rolls back tag2's source, as restoring a virtual machine snapshot
can roll back a counter:  the CSPRNG output and tag2 then repeat
together, against the rule above, and HedgedRandom repeats its output.
<xref target="appendix-pt-bound"/> describes an optional encryptor-side construction
that partially defends against state duplication.  It is orthogonal to
hedging and the two <bcp14>MAY</bcp14> be combined.</t>
    </section>
    <section anchor="appendix-reductions">
      <name>Proof Status and Security Claim Provenance</name>
      <t>This appendix is informative.  <xref target="proof-map-table"/> gives each security
claim's source, argument, and assumptions.  Each is inherited from
<xref target="FLRR25"/>, argued in this document, referenced from external work, or
deferred to the proof paper in preparation (<xref target="SEALPROOFS"/>).  The one
claim proved in full here is the KDF combiner's injectivity.</t>
      <t>The combiner's input encoding is injective by its length-prefixed
framing, not by any KDF property (<xref target="kdf-combiner"/>, <xref target="framing"/>).
Collision resistance is assumed only of LH for over-large fields, of the
commitment derivation (<xref target="appendix-commitment"/>), and, with the
ciphertext digest set, of LH and, against a key holder, of the KDF under
a known snap_key, to bind each segment's ciphertext
(<xref target="snapshot-interface"/>).</t>
      <section anchor="appendix-proof-map">
        <name>Provenance of the Security Claims</name>
        <table anchor="proof-map-table">
          <name>Provenance of the security claims</name>
          <thead>
            <tr>
              <th align="left">Property</th>
              <th align="left">Source</th>
              <th align="left">Argument</th>
              <th align="left">Rests on</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">ra-ROR</td>
              <td align="left">
                <xref target="FLRR25"/> notion and base proof; SEAL's arbitrary-position ra-ROR syntax is a SEAL-specific obligation; re-encrypting a position is outside the base proof, formal treatment in <xref target="SEALPROOFS"/></td>
              <td align="left">
                <xref target="appendix-adv-notation"/>, <xref target="appendix-ror"/></td>
              <td align="left">mu-PRF KDF (two keying levels), mu-ROR$ AEAD, a nonce-collision term only under a nonce hedge, a PRF hedge KDF under HedgedRandom keyed by an sk sampled independently of all CEKs, fresh per-message salt, an information-theoretic commitment guess for a forged StartDec header (q_sd / 2^(8*commitment_length)), and the configured snapshot authenticator's resistance to forgery (Adv_snap)</td>
            </tr>
            <tr>
              <td align="left">ra-CMT (commitment, position-matched, fixed A_i)</td>
              <td align="left">
                <xref target="FLRR25"/> notion, restricted here to fixed A_i</td>
              <td align="left">
                <xref target="appendix-commitment"/></td>
              <td align="left">collision resistance of the commitment derivation map over (protocol_id, "commit", CEK, payload_info, G, commitment_length); differing A_i requires a separate AEAD AAD-commitment term not established here</td>
            </tr>
            <tr>
              <td align="left">ra-CMT-p (position commitment, fixed A_i)</td>
              <td align="left">
                <xref target="FLRR25"/> notion and base proof; for fixed A_i it reduces to the underlying AEAD's commitment bound, which SEAL's suites do not provide against a CEK holder, and the weaker per-index binding of <xref target="key-commitment"/> applies; formal write-up in <xref target="SEALPROOFS"/></td>
              <td align="left">
                <xref target="appendix-commitment"/></td>
              <td align="left">scoped ra-CMT collision bound plus the underlying AEAD's commitment bound for the forged position, not restored against a CEK holder, where SEAL's strict snapshot authenticators with the ciphertext digest set give the weaker per-index binding of <xref target="key-commitment"/> in both nonce modes and every suite under an externally authenticated snapshot; differing A_i remains outside the ra-CMT-p claim</td>
            </tr>
            <tr>
              <td align="left">KDF combiner injectivity and domain separation</td>
              <td align="left">this document (injectivity structural and proof-complete; domain separation by assumption)</td>
              <td align="left">
                <xref target="kdf-combiner"/>, <xref target="framing"/></td>
              <td align="left">injectivity of the length-prefixed encoding (KDF need not be injective); collision resistance of LH for over-large fields only; domain separation further rests on HMAC used as a PRF through its message input in the two-step form, where the secret enters Extract's ikm under the public protocol_id salt, and on the XOF used as a PRF through a secret element of its framed input in the one-step form</td>
            </tr>
            <tr>
              <td align="left">Snapshot integrity</td>
              <td align="left">this document (notion, <xref target="snapshot-integrity"/>); configured authenticator (bound, with no writer oracle; a game with one is deferred to <xref target="SEALPROOFS"/>)</td>
              <td align="left">
                <xref target="snapshot-security"/></td>
              <td align="left">unforgeability of the keyed snapshot by a party without snap_key; per-object separation via salt-bound snap_key</td>
            </tr>
            <tr>
              <td align="left">AEAD usage, rewrite, and max-object bounds</td>
              <td align="left">external work (operational, not proven here)</td>
              <td align="left">
                <xref target="aead-usage-limits"/>, <xref target="max-object-size"/>, <xref target="mrae-bounds"/></td>
              <td align="left">
                <xref target="I-D.irtf-cfrg-aead-limits"/>, <xref target="RFC8452"/> Section 9 with <xref target="BHT18"/>, <xref target="NIST-SP-800-38D"/> Section 8.3 for the AES-GCM random-nonce cap, 2^63 segment-index ceiling</td>
            </tr>
            <tr>
              <td align="left">Derived-nonce unique-nonce transform</td>
              <td align="left">precedent, not proof (TLS 1.3 <xref target="RFC8446"/>, STREAM <xref target="HRRV15"/>)</td>
              <td align="left">
                <xref target="derived-nonces"/>, <xref target="appendix-nonce-modes"/></td>
              <td align="left">write-once or append-only uniqueness discipline reducing to nonce-respecting AEAD security</td>
            </tr>
            <tr>
              <td align="left">Derived-nonce equality leakage (MRAE)</td>
              <td align="left">this document; full proof in <xref target="SEALPROOFS"/></td>
              <td align="left">
                <xref target="appendix-nonce-modes"/></td>
              <td align="left">MRAE AEAD (<xref target="RFC8452"/>); the coupled data-volume term of the AEAD's multi-user bound (<xref target="mrae-bounds"/>)</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="appendix-adv-notation">
        <name>Advantage Notation and Adversary Parameters</name>
        <t>For a ra-ROR adversary (<xref target="adversary-model"/>) whose messages and StartDec
queries all use one parameter set (<xref target="components"/>), using at most u
distinct CEKs and q_m messages, each encrypted with an independent fresh
32-octet per-content salt (<xref target="full-encryption"/>), across n_ep total
epochs and making q_sd StartDec queries, and q_e encryption and q_d
decryption segment queries with sigma = q_e + q_d, the advantage is
bounded by:</t>
        <artwork><![CDATA[
Adv_raROR(A) <= Adv_salt_coll
                   + 2 * Adv_muPRF(KDF, B_KDF)
                   + q_sd / 2^(8*commitment_length)
                   + Adv_muROR$(AEAD, B_AEAD)
                   + Adv_nonce_coll  (plaintext-bound or
                                      hedged random nonces only)
                   + Adv_hedge       (HedgedRandom only)
                   + Adv_snap
]]></artwork>
        <t>The parameter set fixes the nonce mode (<xref target="nonce-generation"/>), on which
the AEAD term depends.  The bound holds for a position-respecting
adversary, one that never queries EncSeg twice at one position of one
session, as in <xref target="FLRR25"/>.  In derived nonce mode the write-once and
append-only disciplines guarantee that (<xref target="derived-nonces"/>, <xref target="ra-ror"/>).
Re-encrypting a position is outside the bound in either nonce mode,
pending <xref target="SEALPROOFS"/>.  Under a derived nonce the reduction fails for
an in-place rewrite, which repeats the nonce with new content, and the
claim itself fails for an identical re-encryption, which reproduces the
first write's ciphertext where the random ra-ROR game would return a
fresh one.</t>
        <dl>
          <dt>Adv_salt_coll</dt>
          <dd>
            <t>The probability that two messages encrypted under one CEK draw the
same salt.  Because the salt is a 32-octet value drawn uniformly at
random, this term is at most q_m^2 / 2^256.  A salt collision is not a
PRF-distinguishing event:  the KDF deterministically produces
identical payload_key, snap_key, and nonce_base outputs whenever (CEK,
payload_info) repeats, so the event must be charged separately.  This
term holds only under the fresh per-message uniform salt requirement
of <xref target="full-encryption"/>.  A profile that reuses salts or draws them
non-uniformly forfeits it and must argue payload-schedule separation
by other means (<xref target="salt-reuse"/>).</t>
          </dd>
          <dt>Adv_muPRF(KDF, B_KDF)</dt>
          <dd>
            <t>The multi-user PRF advantage of the KDF, in a game that draws each
user's key uniformly from that user's key space:  32 octets for a CEK,
Nk for a payload_key, and Nh for a snap_key.  The bound charges it
twice (<xref target="appendix-ror"/>).  Level A is keyed by the CEK and produces
the commitment, payload_key, snap_key, and nonce_base.  It has u users
and at most 4 * (q_m + q_sd) queries, four per StartEnc or StartDec
call.  Level B is keyed by payload_key (producing epoch_key per
<xref target="epoch-key-derivation"/> and, in the plaintext-bound construction,
per-segment nonces per <xref target="appendix-pt-bound"/>) and by snap_key
(producing the snapshot authenticator's keyed derivations).  It has up
to 2 * q_m users, a payload_key and a snap_key per message, with at
most 2 * q_e + q_d payload_key queries plus the snapshot
authenticator's snap_key queries.</t>
          </dd>
          <dt>q_sd / 2^(8*commitment_length)</dt>
          <dd>
            <t>The header-forgery term.  StartDec verifies the stored commitment
(<xref target="framework-commitment"/>), and the random ra-ROR game accepts no
header at StartDec, while the real game refuses as a trivial win any
header a StartEnc produced (<xref target="FLRR25"/>).  The term bounds the
probability that one of the q_sd StartDec queries accepts a (salt, G,
commitment) that no StartEnc under that CEK produced, the event
<xref target="FLRR25"/> charges for its own header tag.  At commitment_length = 32
it is q_sd / 2^256.</t>
          </dd>
          <dt>Adv_muROR$(AEAD, B_AEAD)</dt>
          <dd>
            <t>The multi-user real-or-random advantage of the AEAD over sigma total
segment queries.  When every nonce is nonce(i) = Random(Nn) taken
directly from the CSPRNG, it is the advantage in the variant of
<xref target="FLRR25"/> whose encryption oracle draws each nonce uniformly at
random instead of taking it from the adversary, which is how those
nonces are drawn.  Otherwise, under a nonce hedge or in derived nonce
mode, B_AEAD plays the nonce-respecting game of <xref target="FLRR25"/> and
supplies the nonces itself, and Adv_muROR$ denotes that game's
advantage.  There is one mu-ROR user per epoch key, n_ep in total
(n_ep = q_m when each message uses a single flat epoch key).  This
advantage absorbs a key-collision birthday term of about
n_ep^2/2^(8*Nk) over the n_ep keys.  For the 256-bit-key suites (Nk =
32) that term is about n_ep^2/2^256 and is negligible.  For the
128-bit-key suite (Nk = 16) it is about n_ep^2/2^128 and is the
binding epoch-key collision floor.  <xref target="epoch-length-guidance"/> bounds
n_ep for that suite.</t>
          </dd>
          <dt>Adv_nonce_coll</dt>
          <dd>
            <t>The probability of a nonce collision under any segment key.  When
every nonce is taken directly from the CSPRNG, Adv_muROR$(AEAD,
B_AEAD) includes it, so the bound does not charge it separately:  a
nonce-respecting AEAD bound becomes a bound on Adv_muROR$ by adding
this probability (<xref target="FLRR25"/>).  Under a nonce hedge it is the term the
bound adds, because B_AEAD's queries are nonce-respecting only while
no nonce repeats under one segment key.  In random nonce mode (with or
without the plaintext-bound hedge) it is bounded per
<xref target="conf-nonce-collision"/>.  Under HedgedRandom (<xref target="hedged-randomness"/>)
that bound holds once Adv_hedge is charged.  In derived nonce mode,
within the scope above, it is zero (<xref target="appendix-nonce-modes"/>).</t>
          </dd>
          <dt>Adv_hedge</dt>
          <dd>
            <t>Present only under HedgedRandom (<xref target="hedged-randomness"/>):  the PRF
advantage of the KDF keyed by sk on its one hedge_label query, plus
that of the KDF keyed by hedge_key over the HedgedRandom calls, one
per salt and per drawn nonce, none of which an Adv_muPRF level covers.
Because tag2 gives every call a distinct input, replacing that KDF
with a random function makes every HedgedRandom output, salt or nonce,
uniform and independent, as a direct CSPRNG draw is
(<xref target="appendix-ror"/>).  It assumes an sk sampled independently of all
CEKs.</t>
          </dd>
          <dt>Adv_snap</dt>
          <dd>
            <t>The snapshot-forgery advantage of the configured snapshot
authenticator in the combined game (<xref target="SEALPROOFS"/>), which adds
SnapVerify to the game that the Level B and AEAD hops leave
(<xref target="appendix-ror"/>), where its snap_key-keyed KDF is a random function
and each segment AEAD output is a random string.  It is zero in the
<xref target="FLRR25"/> game and under None (<xref target="snapshot-none"/>).  It covers the
forgery and any further terms the authenticator's own construction
requires.  An intermediate snapshot (<xref target="open-count-public"/>) is one
more SnapVerify target in that game, at its own count.  Both
replacements are charged elsewhere:  the KDF's to the snap_key subset
of Level B in Adv_muPRF(KDF, B_KDF), and the AEAD's to
Adv_muROR$(AEAD, B_AEAD).  A key-holder content-binding property,
where an authenticator provides one, is a separate notion from this
without-key advantage and is not counted here.</t>
          </dd>
        </dl>
      </section>
      <section anchor="appendix-ror">
        <name>ra-ROR Reduction</name>
        <t>The reduction follows the <xref target="FLRR25"/> hybrid over the two-level key
schedule (<xref target="key-derivation"/>).  Under HedgedRandom, with sk sampled
independently of all CEKs, it first replaces the KDF keyed by sk, on its
one hedge_label query, with a random function, which makes hedge_key
uniform, and then replaces the KDF keyed by hedge_key with a random
function.  The two hops together cost Adv_hedge, after which every
HedgedRandom output is distributed as a direct CSPRNG draw.  Condition
on no salt collision (Adv_salt_coll).  A flat epoch key is the
single-epoch case of the same argument.</t>
        <dl>
          <dt>Level A PRF hop</dt>
          <dd>
            <t>Replace the KDF keyed by each CEK with an independent random function.
A multi-user PRF adversary with one user per CEK, u users, runs A and
answers every CEK-keyed derivation from its oracle.  The hop costs
that adversary's advantage.  With no salt collision, distinct messages
and roles reach the random function at distinct inputs, so the
commitment, payload_key, snap_key, and nonce_base are now uniform and
independent for every message.</t>
          </dd>
          <dt>Header hop</dt>
          <dd>
            <t>Make StartDec reject every (salt, G, commitment) that no StartEnc
under that CEK produced.  After the Level A hop such a tuple passes
the commitment check only by matching a uniform value that A has not
seen, so the q_sd StartDec queries together accept one with
probability at most q_sd / 2^(8*commitment_length), the cost of this
hop.  Every decryption session from here on belongs to a message that
StartEnc produced.</t>
          </dd>
          <dt>Level B PRF hop</dt>
          <dd>
            <t>Replace the KDF keyed by each payload_key and by each snap_key with an
independent random function, through a second multi-user PRF adversary
with one user per payload_key and one per snap_key, up to 2 * q_m
users.  The two levels cannot share one game:  a multi-user PRF game
draws each user's key uniformly and independently from that user's key
space, and payload_key and snap_key have that distribution only after
the Level A hop.  The epoch keys are then uniform and independent, one
per distinct epoch index under each payload_key.  B_KDF runs one of
the two hop adversaries, chosen uniformly at random, so the two hops
together cost 2 * Adv_muPRF(KDF, B_KDF).  B_KDF has the users and
queries of the level it runs (<xref target="appendix-adv-notation"/>), so at most
max(u, 2 * q_m) users.</t>
          </dd>
          <dt>AEAD hop</dt>
          <dd>
            <t>B_AEAD runs A with each epoch key as one user of its multi-user AEAD
game, n_ep users over sigma segment queries, and answers every segment
encryption and decryption from that game.  The Level B hop made the
epoch keys uniform and independent, as that game draws its keys.  In
the game's random world each segment ciphertext is a uniformly random
string and each segment decryption fails.  When every nonce is taken
directly from the CSPRNG, the game draws each nonce as the
construction does, so a nonce collision is one of the events
Adv_muROR$ already measures.  Under a nonce hedge B_AEAD supplies the
nonces to the nonce-respecting game instead, which is valid except
when a nonce repeats under one segment key, an event charged to the
conditional Adv_nonce_coll term.  In derived nonce mode B_AEAD
supplies the derived nonces, which the injective transform keeps
distinct at the distinct positions a position-respecting adversary
encrypts, so Adv_nonce_coll is zero (<xref target="appendix-nonce-modes"/>).  The
hop costs Adv_muROR$(AEAD, B_AEAD), plus the conditional
Adv_nonce_coll term under a nonce hedge.</t>
          </dd>
          <dt>Snapshot remainder</dt>
          <dd>
            <t>The snapshot authenticator's forgery, a SnapVerify acceptance that
snapshot integrity (<xref target="snapshot-integrity"/>) rules out, in the game the
AEAD hop leaves.  Its probability is Adv_snap
(<xref target="appendix-adv-notation"/>, <xref target="snapshot-security"/>).</t>
          </dd>
        </dl>
        <t>B_KDF and B_AEAD each run in time approximately that of A.</t>
      </section>
      <section anchor="appendix-commitment">
        <name>Commitment</name>
        <t>For fixed per-segment A_i at the shared position, ra-CMT security
reduces to collision resistance of the commitment derivation map over
the tuple (protocol_id, "commit", CEK, payload_info, G,
commitment_length), with G empty by default (<xref target="adversary-model"/>).
Openings that differ only in A_i are outside this reduction:  the map
has no A_i input.  The full ra-CMT game needs an additional AEAD
AAD-commitment term, for which no SEAL instantiation bound is
established here.</t>
        <t>For commitment_length = L octets, the relevant quantities are:</t>
        <artwork><![CDATA[
fixed-pair collision probability:  2^(-8*L)
q-query birthday probability:      q^2 / 2^(8*L + 1)
collision-search work factor:      about 2^(4*L)
]]></artwork>
        <t>Thus 16 octets gives about 2^64 collision-search work, 32 octets about
2^128, 48 octets about 2^192, and 64 octets about 2^256, each capped by
the collision resistance of the underlying hash.  The fixed-pair
collision probabilities at 32, 48, and 64 octets are 2^(-256), 2^(-384),
and 2^(-512), respectively.</t>
        <t>For fixed A_i, the ra-CMT-p advantage is bounded by two terms:  the
commitment collision bound above and the underlying AEAD's commitment
bound for the forged position.  Against a CEK holder, SEAL's strict
authenticators with the ciphertext digest set give, under an externally
authenticated snapshot, only the per-index binding of
<xref target="key-commitment"/>, not ra-CMT-p (<xref target="appendix-proof-map"/>).</t>
      </section>
      <section anchor="appendix-nonce-modes">
        <name>Nonce Modes</name>
        <t>The unique-nonce transform of <xref target="derived-nonces"/>, which XORs the segment
index and finality bit into nonce_base, follows TLS 1.3 (<xref target="RFC8446"/>)
static-IV-XOR-identifier and STREAM (<xref target="HRRV15"/>) counter-plus-final-bit
precedent.  The transform is injective in the pair (i, is_final).  The
leading Nn - 8 octets of nonce_base are unchanged; XOR by its fixed low
8-octet value is a bijection on 8-octet strings; and (i, is_final) maps
to the integer (i &lt;&lt; 1) | is_final, which is a bijection from the index
range i &lt; 2^63 onto the 64-bit values.  Distinct pairs therefore yield
distinct nonces, and a derived nonce repeats only when an object
encrypts twice at one pair.</t>
        <t>Under both disciplines of <xref target="derived-nonces"/> every encryption invocation
uses a distinct (i, is_final) pair (<xref target="nonce-misuse"/>, <xref target="append-only"/>),
so each reduces to nonce-respecting AEAD security under distinct nonces.
That reduction is precedent, not a new proof.</t>
        <t>In derived nonce mode Adv_nonce_coll is therefore zero within the scope
of the bound (<xref target="appendix-adv-notation"/>), conditional on no salt
collision.  A rewrite reuses a segment's derived nonce, so the
construction relies on the underlying MRAE AEAD:  re-encrypting the same
plaintext and associated data under the same key and nonce reproduces
the same ciphertext, which leaks only equality of those inputs, while
distinct inputs stay real-or-random secure (<xref target="RFC8452"/>).  The formal
treatment, in preparation (<xref target="SEALPROOFS"/>), replaces the
nonce-respecting AEAD assumption of <xref target="FLRR25"/> with deterministic-MRAE
security.</t>
      </section>
    </section>
    <section anchor="appendix-rationale">
      <name>Design Rationale</name>
      <t>This appendix is informative.</t>
      <section anchor="key-schedule-design-rationale">
        <name>Key Schedule Design Rationale</name>
        <t>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 group keys.  The encryptor chooses the salt locally at write
time.  A per-message counter would instead require synchronized state.</t>
        <t>The CEK is 32 octets regardless of the AEAD key size Nk, so a
128-bit-key AEAD still derives its keys from a 256-bit CEK.</t>
        <t>Epoch keys bound the number of AEAD invocations under any one segment
encryption key.  The underlying AEAD's per-key bounds (the birthday
bound for 96-bit-nonce schemes, the block-size bound for AES, and the
forgery bound for every scheme) limit security long before the nonce
space is exhausted.  Large content reaches them under one key even when
written once, and rewrites only reach them sooner.  Rekeying all the
content would defeat random access, so epoch keys cap the per-key count
without 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 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.  In a mutable profile it requires an MRAE AEAD,
because an in-place rewrite reuses the segment nonce
(<xref target="parameter-misuse"/>).  In the write-once profile the write-once rule
keeps every derived nonce unique, and in the append-only profile the
append-only rules and the current-count rule of <xref target="raae-writable"/> do.
Under either, derived mode therefore admits any AEAD.  A third rule was
available and rejected:  permitting a length change in either direction
would let a truncation free indices the object had already spent, for a
later append to encrypt new content at (<xref target="append-only"/>).</t>
        <t>The nonce mode is a profile parameter:  a profile selects a valid
(nonce_mode, snap_id, segment_commitment) tuple, subject to the MRAE
requirement above.</t>
      </section>
    </section>
    <section anchor="changes-since-03">
      <name>Changes Since -03</name>
      <ul spacing="normal">
        <li>
          <t>The strict snapshot authenticators' segment leaf carries the stored
nonce in random nonce mode or the counter (i &lt;&lt; 1) | is_final in
derived nonce mode, then the segment AAD, and metadata entries hold
its leading fields in leaf order.  With the ciphertext digest set,
per-index binding under an authenticated snapshot holds in both nonce
modes for every suite, for any A_i, and under an intermediate
snapshot.  SnapVerify takes each segment's A_i and the snapshot's
declared state.</t>
        </li>
        <li>
          <t>ra-CMT and ra-CMT-p are scoped to fixed A_i.  An authenticated strict
snapshot with the ciphertext digest set gives per-index binding, not
ra-CMT-p.  The plaintext-bound nonce derivation frames the full
segment AAD.</t>
        </li>
        <li>
          <t>EncSeg keeps its base signature and outputs only the ciphertext.  The
snapshot is a function of the (index, input) set and the count.
RewriteSeg and SnapVerify take a witness, and before an update the
writer checks the witness, and any input it removes, against a
verified snapshot unless it produced them itself as the sole writer.
The crash-retry rule is reconciled.</t>
        </li>
        <li>
          <t>A truncation to a nonempty prefix drops the trailing segments and
re-marks the new last segment as final, the reverse of the append
re-mark, and the append-only profile forbids truncation itself rather
than a reduced count.  An append's re-mark carries the segment's
existing plaintext, and Rewrite's inputs are bound.</t>
        </li>
        <li>
          <t>An authenticator with a strict ordering has intermediate snapshots,
its keyed and public snapshots at any count where the object is open,
and a linear one has none; what such a value binds and how truncation
to that count is detected are stated.</t>
        </li>
        <li>
          <t>A strict authenticator defines a public snapshot, an unkeyed function
of payload_info and the same inputs, which a verifier without the CEK
accepts only under a signed statement naming the object, the count,
whether the object was open or complete, and the value.  A key holder
that claims the signer's origin checks both values.</t>
        </li>
        <li>
          <t>The ra-ROR bound is restated with a header-forgery term and the
configured authenticator's Adv_snap; the LH collision argument is
stated precisely.  HedgedRandom carries a per-call tag2.</t>
        </li>
        <li>
          <t>Aggregate usage accounting and the coupled MRAE rewrite bounds; the
AES-GCM random-nonce cap of 2^32 per epoch key; the salt-reuse swap
discussion.</t>
        </li>
        <li>
          <t>The salt is public in the threat model; resource-exhaustion
considerations are added; references are updated; the discussion venue
is raae@ietf.org.</t>
        </li>
        <li>
          <t>Terms: keyed snapshot, public snapshot, intermediate snapshot, prefix
verification, and ciphertext digest.</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author thanks Andrés Fábrega, Thomas Ristenpart, Gregory Rubin,
Richard Barnes, Brendan McMillion, Thibault Meunier, Kenny Paterson,
Christopher Patton, Martin Thomson, Stanislav V. Smyshlyaev, and
Christopher A. Wood for their reviews, comments, and discussions.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA7S96XocyZEt+N+fIi7rB4FRJopgLWKhVH0HAtcpbkNQKvWo
1LyBzAAQzcyMVEQmQahQ/SxzX2IeYPrFxo4t7uYRkSBLfYffJxWQiPTw1dyW
Y8em02nY1JtFdVTceVOu5s1yejybVV1XHG83l9VqU8/KTTUvHq1m7fV6Uzer
O6E8O2urD/SFtjx+dCfMm9mqXFID87Y830y77WJRfyhX09l5ezFty7Ka3vs6
oJWLpr0+KurVeRPqdXtUbNptt7l/79539+6Hbnu2rLuO2t9cr6mtZ2/ePg5l
W5X641XTvr9om+36qDhBR5ricdNul6HbUKfflYtmRV+6rrrQLct28+7v22ZT
dUfFqgnr+igUxbTYNDP+b9e0m7Y67+SX6yX/HEoabdPKk/WKvvnyoDjVkdCH
RSFDfFnP3uefN+1Fuar/UWJqrG8Xbbm+vC5OmhVNxqZeXRTPn5/w09WyrBfU
rXp22SzK7sAm63d1tTn/3y/w14NZswxh1bRLavNDhS69eXzyzeHht/bjg2+/
0x8f3Dv8vf349Tf39cfvDh/cw4/Ppg8P0O70cv2+mq7/fhQCJj9v+Ktv4vce
fP21vePBt19/Yz9+95W947tvpGH8+PvfH8Z3tPQOXu2yKufTRb2sN539MW6H
rioX01lD+6ja8MuLwjbe6aPj58VJvb6sWprcmlauoFUtnq2wupua57a7w19J
64R/O9bqtvWa00Y8Ku7fu/8t/9pVbV11mBZr89lqU7WrajN9iO082NXZMKb3
Dulbf3z69vCBjqhsLyr60uVms+6OvvyyWrf1anNQl7P2gHbKl/fvHT748vCr
b7Phv6k+1F3N++T40en0ycmL6emzPx8VL7B5ptsOs1LNtm29uZ78rL38uXhc
dtTR4sfqunhIg/jAszThiftjtcGf/thsV/Pb5u31AT3TVfmHfz4o3h4UT5ty
dZH/4ZT+QIKhbJtsIg8f7JjIO8+OT97cofFVrzEJhY0dHXr57PTt9PT19MG9
e9OvHjwcn7zVh8V6e9YdrOpuc3DRfPgSP+CTL59XF+Xs+svT1/xRt65mdYln
F5BWNA3S7PxgPT/vzTQdrmW1mvNTBZ2F4o+LhraIbr4XzZz2XnNevFpXrRzp
NOFPSMrU3ZcnNKsbfbbYo8Xa5zl/8uL45JapfnFQPIQMq/NdeO/308PDHfOH
OaJZl8EVr9PoCp01eu7pmzd/Pvzms/feN18ePvgum5FXq0W9qnJhP03CnodG
pznNwkva+tX0TUXbsnhRd/Qf+qWrcVJn1S0TsHNbvTko3lTXlyREN+VZ2Q52
6Jvmorwqr/PPHx4Uf67/8Z//s8234jefvxV5KtDft8dPXz367Bm8/+U397/O
ZvBtednQf99eVsXzis7k9JiHT4e1eFwvqu6ajunylon5vw6Kn+rFrPk4fXX3
aVW2q/zPf6Q/04dVPtJ7D6aH93YN9nTTtOVFdXpa3L33AKNerw+K+4fT+9/e
sUcevnqGPxzeOzg8/Jqm4utvvv362+8O+L+//5qnpV69/9xZuX/vy8N7h/nG
MomF03RKF265hHxzO6teuaPVNBeL6m7Hby2e12dt2V7/M5vpX+kmoI2cS/qd
EzXYFToQvPnhkzc/7ZLq86bmkWP66Ah/+d3vH0y/mn51+N30u28fPPh6evgu
F/AQ1cULyM6LqnjclisSAxdH9FOzpOsGwv9sUaXZOC0X5ZIOXtV2pLXYnJHY
2twyJTTyh8287gbn50m7PTvrfUyT94aObLVak7KU/+n/oP3WNHPq6WdK+ZM3
//r67St+ZFI8f3lyihn90CwOisN73313OCmw+w6/+WZ6+GB0/+2YQDx6/PDJ
/fvjS3B1dXVAsmdVf+SVoAv5vGorEkFfyqedbr/7979ctxV9tGHR+WW5OKta
umrrbIGeNleY6eMzSDWIvMf1x1wmptVxW/inmhZiu+E7+IQulvpTi3R8UBxn
HfAr8nDbjFy5T7ZV26wGH//4n//P4mwxaP359vr9x8HDp7PLZV1d5Kfi/q4F
/dPpo5fP/hJVDn7WpMhX9787nH71FYkVevrx8zdv7n/25XP/my/v3//9N/l9
nFscj44f8p3M5+V5fXG5uarw/2ny9bry1shtk/34P/8nmSoX5WCLP69Wn30i
ntCftmf1Z6qPdx796c0rPhOYMzx4+6a/99X96f1vvvqKfnp3eA/PQht+/ebV
q8enPS3ZFuR4VS6u6cqFaKUtWoj6TCoyGVQzsUNgmTld8XRVrrvLZsPK7QUr
krzNP2vT9rVrmYLzcqGa48gc/ESaDn25eN2SLURLi2GTRNt2s7Zeb/AXOpQ0
06UsYZhOp0V5Rv0vZ5sQ3l7S2Miq3KJjxbw6pyXvaEi8V0rZK2VmnVbpTO5h
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
8vwoYocrzmnINloKqVplWKyxrEe2mKUtZwRiC6neKhYBwJqFTLWMJRCog1pm
6NrLVZliXms+4uybCXoNuzRYdKmrKi17cry6Ti7IVFclSlcFl3MsA2zuCns3
Z1IakgKE82Msl2HaFF3QI9Vw1oPqJ7GSArd2kJS83N0wohmw2MkzpbDupoX3
npb6nbHsi/RYKHngF3lLwvrU7uffcAqPmN+IL9p3sgg/qHAZ++5ubCHpddTu
Pjvx3rvLG3b7D70SZvk/+toPWQ/2uUtr2l3i+P1nOoTu8AhVa32+L8VUWJN9
xI1Tc+8n/kVOKL3lHBf19f8Pauzj/yBjpVwp/CZ3exbmfCi4hLpQr6FiU9MG
aVcq6Ub+D62syporj8xVOskPttw4rPAkG11fprWpZU9ritBZlxxBVu0SZmqI
35L02hU1f8YW3apJlV6NYVIBd+4bOzsh5dDtY//KnmUMpKTez5p4peUGJble
y/ZK4r1dbmp4NY67PXClGRVYrPvw3DnJbTUaeOtIjltXjcyE+NXGuzuJ+eJy
xmvQNGGEEqqV/nWRXu/Tp0yZanR8nJyaafAeWyQFGNliZ64MfOORaeSAotiC
5Me2FBo+kIxCr6Pd2m1b1RDMH5L4ZiwVLHABz5kWOxsoESrOBEzU75h1Cm+Q
IxWnTb4QX9sJXwYbXuxBrKUI1/qSazuSNKvK9xnJPTSxbNI5JBDKJUKm/6iy
SRFjvVRWTEmwk0xozWPja1vDe8E8m1mqcDG2gny9vV+qgH1F298ELFn2piBO
SS7/+lsF7ovfINP0OZWvE/87tbjfe3pM3ME2etETbvSZ1kuUquuSawWhJZc6
4m1lLDMvkslJPZzEUaeF1vikI1bBP/vcxQlk4g8KP9chbZGIKzVnPqdTaqNW
Fg5V6VhH5w3It6UcBX7M0sKYpYjlQJwOlTnRpOFRK+tmjf3KZdyCv3YiH79P
Iht+p3iBgieCz1PlJdbajhbJ50oIKAXsHtDSa7wupmRNQD4jrG4iR0Q9miZb
gonkY2U+rp2btPqCd66qfL54kJGXuCvKpZd9H+V2kfWG800FMKIMC2LUSJk1
OWTJPxFkrWB4MB/3FokAC1dtyvEi71J5sOlkt8acOEGocDqYDxU7omI2HLkd
hsv03NNSVnvV+AuEnbdSs7jqeoGQ4BS03mZS96wUavSikXtUm9bB9CAsjKZ6
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
AzD0Kf+O+QIA

-->

</rfc>
