<?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.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-sullivan-safe-01" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="SAFE">SAFE: Sealed, Algorithm-Flexible Envelope</title>
    <seriesInfo name="Internet-Draft" value="draft-sullivan-safe-01"/>
    <author initials="N." surname="Sullivan" fullname="Nick Sullivan">
      <organization>Cryptography Consulting LLC</organization>
      <address>
        <email>nicholas.sullivan+ietf@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="15"/>
    <abstract>
      <?line 101?>

<t>SAFE defines an encryption envelope that encrypts a payload once for
multiple recipients.  Decryption can require multiple credentials in
sequence (public keys, passphrases, or other registered methods), so
that no single compromise reveals content.  The format targets large,
writable files: it supports streaming decryption, random-access reads
at block granularity, and selective re-encryption of modified blocks
without re-keying.  Per-block Authenticated Encryption with
Associated Data (AEAD) provides confidentiality and
integrity and detects reordering, truncation, and extension.  SAFE
accommodates post-quantum key encapsulation without format changes,
provides algorithm agility through IANA registries, supports
recipient privacy, and defines application profiles for common
deployment scenarios.</t>
    </abstract>
  </front>
  <middle>
    <?line 117?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>SAFE is an encryption format for files and objects.  A SAFE-encoded
file contains an encrypted payload and one or more LOCK blocks.
Each LOCK wraps a Content-Encryption Key (CEK) for one recipient;
multiple LOCKs allow multiple recipients to decrypt the same payload
without duplicating ciphertext.  A LOCK can require several
credentials in sequence (a passphrase AND a private key, for example),
so neither factor alone suffices.</t>
      <t>The payload is split into fixed-size blocks, each encrypted with
Authenticated Encryption with Associated Data (AEAD) <xref target="RFC5116"/>
and a per-block random nonce.  Blocks can be
decrypted individually or streamed sequentially.  An aligned binary
layout (<xref target="aligned-layout"/>) places each ciphertext block at a
predictable offset, enabling O(1) random reads.  Per-block random
nonces (<xref target="per-block-nonces"/>) allow individual blocks to be
re-encrypted without re-wrapping the CEK or touching other blocks.</t>
      <t>Existing formats address subsets of these capabilities;
<xref target="comparison-with-related-formats"/> surveys the differences.
SAFE provides algorithm agility through IANA registries
(<xref target="iana-considerations"/>) and accommodates post-quantum
key encapsulation mechanisms without format changes.
Recipient privacy modes (<xref target="recipient-anonymity"/>) allow Hybrid Public
Key Encryption (HPKE) steps to omit key identifiers, preventing passive
observers from linking files to recipients.  Application profiles
(<xref target="application-profiles"/>) provide baseline algorithm guidance for
common deployment scenarios.</t>
      <t>For example, a deployment might require that documents be decryptable
only with both a passphrase AND a recipient private key.  The LOCK
block for such a recipient would contain two Step lines:</t>
      <artwork><![CDATA[
Step: pass(kdf=argon2id, salt=...)
Step: hpke(kem=p-256, id=..., kemct=...)
]]></artwork>
      <t>Both steps are evaluated with the known passphrase and private key
to derive the key that wraps the CEK.  Neither factor alone suffices.
See <xref target="kek-schedule-example"/> for the cryptographic details.</t>
      <t>The payload layer and LOCK layer serve distinct roles.  The LOCK
layer manages key encapsulation and multi-factor access control,
wrapping the CEK independently for each recipient.  The payload
layer provides per-block authenticated encryption with support
for random-access reads and selective re-encryption of modified
blocks.  A file-level commitment value precedes independently
decryptable fixed-size blocks.  Confidentiality and integrity
are enforced per block.  Block AAD authenticates both the block
index and a final-block indicator, so a Decryptor can detect
block substitution, reordering, truncation, and extension
(<xref target="data-aad"/>).  A 32-octet commitment prefix derived from the
CEK, the negotiated algorithm parameters, and a per-file salt
provides uniform key commitment across all AEAD choices
(<xref target="key-commitment"/>).
<xref target="FLOE"/> formalizes a similar set of properties under the term
random-access authenticated encryption (raAE).</t>
      <t>SAFE's registered AEADs fall into two usage classes.
Nonce-Misuse-Resistant (NMR) and non-NMR suites.  Non-NMR suites
(AES-256-GCM, ChaCha20-Poly1305, AEGIS-256, AEGIS-256X2) use
stored per-block random nonces; their security depends on nonce
uniqueness and the total number of block encryptions under a given
payload key.  The NMR suite
(AES-256-GCM-SIV, where SIV denotes Synthetic Initialization
Vector) uses derived nonces and tolerates nonce reuse, degrading
to deterministic encryption rather than permitting plaintext
recovery.  Because block rewrites consume additional encryptions
under the same payload key, the relevant usage budget is not
just the current file size but the total lifetime block
encryptions, including all rewrites.  See <xref target="aead-usage-bounds"/>
for per-AEAD analysis.</t>
    </section>
    <section anchor="comparison-with-related-formats">
      <name>Comparison with Related Formats</name>
      <t>The following table compares SAFE with existing encryption formats
on the capabilities most relevant to encrypted file storage.
X indicates native support, P indicates that the capability is
achievable but is not a design goal of the format, and - indicates
no support.</t>
      <table>
        <thead>
          <tr>
            <th align="left">Capability</th>
            <th align="center">SAFE</th>
            <th align="center">JWE</th>
            <th align="center">CMS</th>
            <th align="center">OpenPGP</th>
            <th align="center">S/MIME</th>
            <th align="center">SFrame</th>
            <th align="center">Age</th>
            <th align="center">AEA</th>
            <th align="center">FLOE</th>
            <th align="center">Chunked OHTTP</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Large-file framing</td>
            <td align="center">X</td>
            <td align="center">P</td>
            <td align="center">P</td>
            <td align="center">P</td>
            <td align="center">P</td>
            <td align="center">-</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">X</td>
          </tr>
          <tr>
            <td align="left">Streaming decrypt</td>
            <td align="center">X</td>
            <td align="center">P</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">P</td>
          </tr>
          <tr>
            <td align="left">Random-access reads</td>
            <td align="center">X</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">P</td>
            <td align="center">-</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">-</td>
          </tr>
          <tr>
            <td align="left">Random-access writes</td>
            <td align="center">X</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">P</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">X</td>
            <td align="center">-</td>
          </tr>
          <tr>
            <td align="left">Random per-block nonces</td>
            <td align="center">X</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">X</td>
            <td align="center">-</td>
          </tr>
          <tr>
            <td align="left">Multi-recipient (single ciphertext)</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">-</td>
            <td align="center">P</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">-</td>
          </tr>
          <tr>
            <td align="left">Multi-factor per recipient</td>
            <td align="center">X</td>
            <td align="center">P</td>
            <td align="center">P</td>
            <td align="center">-</td>
            <td align="center">P</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">-</td>
          </tr>
          <tr>
            <td align="left">Algorithm agility</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">P</td>
            <td align="center">P</td>
          </tr>
          <tr>
            <td align="left">Restricts insecure configurations</td>
            <td align="center">X</td>
            <td align="center">P</td>
            <td align="center">P</td>
            <td align="center">P</td>
            <td align="center">P</td>
            <td align="center">P</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">X</td>
            <td align="center">-</td>
          </tr>
        </tbody>
      </table>
      <t>JWE (<xref target="RFC7516"/>) encrypts the entire plaintext as a single AEAD
operation; its JSON Serialization wraps the Content-Encryption Key
per recipient but defines no block structure for streaming or
random access.</t>
      <t>CMS (<xref target="RFC5652"/>) wraps a content-encryption key per recipient and
supports streaming, but defines no fixed-size blocks for random access
or selective rewrite.</t>
      <t>OpenPGP (<xref target="RFC9580"/>) similarly wraps a session key per recipient via
PKESK packets and supports streaming through partial body lengths.  Like
CMS, it provides no block structure for random access or selective
rewrite.  Both CMS and OpenPGP provide recipient-level composition
(multiple recipients, each with one key), not per-recipient
multi-factor.</t>
      <t>SFrame (<xref target="RFC9605"/>) targets real-time media: low-latency per-frame
AEAD for conferencing, not stored-object encryption.</t>
      <t>Age <xref target="AGE"/> streams fixed-size chunks with counter-derived nonces and
wraps keys per recipient but deliberately avoids algorithm agility
(single cipher suite, no registries).  Counter-based nonces prevent
selective editing; modifying any block requires re-encrypting the
entire payload.  Age's payload AEAD (ChaCha20-Poly1305) is not
key-committing; <xref target="AGE-COMMIT"/> demonstrates that a malicious
encryptor can craft recipient stanzas that unwrap to different file
keys while the same ciphertext decrypts under each, limiting
multi-recipient robustness against targeted attacks.</t>
      <t>AEA <xref target="AEA"/> encrypts segments (1 MB default, 256 per cluster) using
hierarchical HKDF-SHA256 key derivation and AES-256-CTR with
HMAC-SHA256 per segment (encrypt-then-MAC).  Per-segment keys are
derived deterministically from the main key and segment index,
enabling parallel decryption and random-access reads without
decrypting preceding segments.  Key encapsulation uses Elliptic Curve
Diffie-Hellman Ephemeral (ECDHE) P-256 for a single recipient or scrypt
for passwords; there is no multi-recipient key wrapping and no algorithm
agility (the cipher suite is fixed per profile).</t>
      <t>FLOE <xref target="FLOE"/> defines a rewritable authenticated encryption scheme
(raAE) with epoch-based key rotation for segment-level random
access.  SAFE adapts FLOE's epoch key rotation
(<xref target="epoch-key-derivation"/>) but adds multi-recipient key wrapping,
multi-factor authentication, and algorithm agility.</t>
      <t>Chunked OHTTP <xref target="I-D.ietf-ohai-chunked-ohttp"/> splits HTTP message
bodies into individually encrypted chunks for incremental processing
through an oblivious relay.  It targets live HTTP streaming, not
stored-object encryption, and provides no random access or
multi-recipient support.</t>
      <t>SAFE's block construction builds on the STREAM <xref target="STREAM"/> streaming
AEAD pattern (truncation detection via a last-block indicator in
<xref target="data-aad"/>) and extends it with per-block nonces
(<xref target="per-block-nonces"/>) so that individual blocks can be re-encrypted
without re-wrapping the CEK.  Non-NMR suites use stored random
nonces, which are compatible with AEAD implementations that provide
only random IV generation, including FIPS-validated AES-GCM modules
per <xref target="NIST-SP-800-38D"/> Section 8.2.2.  The NMR suite uses
deterministic per-block nonces derived from the key schedule and
block index, tolerating nonce reuse during rewrites
(<xref target="derived-nonces-security"/>).</t>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <t>This section summarizes the encryption and decryption procedures.
Normative details appear in the referenced sections.</t>
      <t>Given a plaintext and a set of recipients (each defined by one or more
credentials), an Encryptor produces a SAFE object:</t>
      <ol spacing="normal" type="1"><li>
          <t>Select AEAD, Block-Size, and Hash (or use defaults).</t>
        </li>
        <li>
          <t>Generate a random 32-octet CEK using SafeRandom
(<xref target="random-generation"/>).</t>
        </li>
        <li>
          <t>For each recipient, build a LOCK: generate step artifacts
(salts, KEM ciphertexts), derive a KEK, and wrap the CEK.</t>
        </li>
        <li>
          <t>Generate a 32-octet per-file salt:
<tt>SafeRandom(32, "SAFE-SALT")</tt>.</t>
        </li>
        <li>
          <t>Derive payload_key and acc_key from CEK and salt
(<xref target="payload-schedule"/>).</t>
        </li>
        <li>
          <t>Split plaintext into blocks; encrypt each with a per-block
nonce.</t>
        </li>
        <li>
          <t>Compute the snapshot accumulator from block tags
(<xref target="snapshot-accumulator"/>).</t>
        </li>
        <li>
          <t>Write the file: optional CONFIG, LOCK blocks, and payload
(salt is the first 32 octets of the DATA block).</t>
        </li>
      </ol>
      <t>Given a SAFE object and the appropriate credentials (private keys,
passphrases, or other step inputs), a Decryptor recovers the plaintext:</t>
      <ol spacing="normal" type="1"><li>
          <t>Parse CONFIG, LOCK, and DATA blocks.</t>
        </li>
        <li>
          <t>Try each LOCK until one succeeds: evaluate its steps with the
recipient's credentials to derive a KEK, then unwrap the CEK.</t>
        </li>
        <li>
          <t>Read the 32-octet salt from the start of the DATA block.</t>
        </li>
        <li>
          <t>Verify the commitment prefix.</t>
        </li>
        <li>
          <t>Derive payload_key and acc_key from CEK and salt
(<xref target="payload-schedule"/>).</t>
        </li>
        <li>
          <t>If all N block nonces and tags are available (i.e., not
streaming or partial random-access reads), verify the
snapshot accumulator (<xref target="snapshot-accumulator"/>).</t>
        </li>
        <li>
          <t>Decrypt requested blocks.</t>
        </li>
      </ol>
      <t>The CEK enables multi-recipient encryption (wrap once per recipient).
The KEK binds each recipient's credentials to the CEK.  The payload_key
is derived from the CEK, the encryption_parameters (the AEAD,
Block-Size, and Hash; <xref target="encryption-parameters"/>), and the per-file
salt, providing domain separation: distinct salts produce distinct
payload keys even under the same CEK.</t>
    </section>
    <section anchor="conventions-and-notation">
      <name>Conventions and Notation</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>Header text is UTF-8. Base64 means <xref target="RFC4648"/> with padding equals signs
and no line wrapping in the source value.  When Base64 values appear in
SAFE blocks, Encryptors <bcp14>SHOULD</bcp14> wrap lines at 64 characters;
Decryptors <bcp14>MUST</bcp14> accept any line length and <bcp14>MUST</bcp14> ignore line breaks
within Base64 values.  LF denotes the newline U+000A;
Encryptors <bcp14>MUST</bcp14> use LF, Decryptors <bcp14>MUST</bcp14> accept LF and <bcp14>MAY</bcp14> accept
CRLF.</t>
      <t>String constants used in Encode AAD labels are ASCII and begin with
SAFE- (e.g., SAFE-DATA, SAFE-STEP).  SafeDerive labels are
ASCII (e.g., commit, kek); the protocol prefix SAFE-v1 is added
automatically.</t>
      <t>ABNF follows <xref target="RFC5234"/>.  The following common ABNF rule is used
throughout this document:</t>
      <artwork><![CDATA[
BASE64CHAR = ALPHA / DIGIT / "+" / "/" / "="
]]></artwork>
      <t>This rule is a loose character-class approximation.
Implementations <bcp14>MUST</bcp14> validate Base64 encoding per <xref target="RFC4648"/>
Section 4, including correct padding placement.</t>
      <section anchor="notation">
        <name>Notation</name>
        <t>This document uses the following notation:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Symbol</th>
              <th align="left">Meaning</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">||</td>
              <td align="left">Octet string concatenation</td>
            </tr>
            <tr>
              <td align="left">
                <tt>XOR</tt></td>
              <td align="left">Bitwise exclusive-or of equal-length octet strings</td>
            </tr>
            <tr>
              <td align="left">
                <tt>len(x)</tt></td>
              <td align="left">Length of x in octets</td>
            </tr>
            <tr>
              <td align="left">
                <tt>x[i:j]</tt></td>
              <td align="left">Slice of x from octet i (inclusive) to j (exclusive), zero-indexed</td>
            </tr>
            <tr>
              <td align="left">
                <tt>uint8(n)</tt></td>
              <td align="left">8-bit unsigned integer n (single octet)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>I2OSP(n, w)</tt></td>
              <td align="left">w-octet big-endian encoding of non-negative integer n</td>
            </tr>
            <tr>
              <td align="left">
                <tt>lp16(x)</tt></td>
              <td align="left">I2OSP(len(x), 2) || x — 2-octet length-prefixed encoding</td>
            </tr>
            <tr>
              <td align="left">
                <tt>Encode(x1, ..., xn)</tt></td>
              <td align="left">lp16(x1) || ... || lp16(xn) — multi-value length-prefixed encoding</td>
            </tr>
            <tr>
              <td align="left">
                <tt>...x</tt></td>
              <td align="left">List expansion: if x is a list, each element becomes a separate argument; if x is a single octet string, it is passed as one argument</td>
            </tr>
            <tr>
              <td align="left">
                <tt>uint64(n)</tt></td>
              <td align="left">64-bit unsigned integer n in network byte order (big-endian)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>floor(x)</tt></td>
              <td align="left">Largest integer less than or equal to x</td>
            </tr>
            <tr>
              <td align="left">
                <tt>ceil(x)</tt></td>
              <td align="left">Smallest integer greater than or equal to x</td>
            </tr>
          </tbody>
        </table>
        <t>All integers serialized in binary are unsigned and use network byte
order (big-endian).  Multi-byte integer fields are serialized
most-significant byte first.</t>
      </section>
      <section anchor="string-encoding">
        <name>Text Encoding</name>
        <t>SAFE header lines (fence markers, field names, field values) <bcp14>MUST</bcp14>
contain only ASCII printable characters (0x20-0x7E) plus LF (0x0A).
Derive info strings and AEAD AAD prefixes use ASCII.  Decryptors <bcp14>MUST</bcp14>
reject malformed UTF-8 in text fields.</t>
        <t>SAFE uses standard Base64 per Section 4 of <xref target="RFC4648"/>.  Padding is
<bcp14>REQUIRED</bcp14>.  Base64 values in headers <bcp14>MAY</bcp14> wrap across lines; continuation
lines <bcp14>MUST</bcp14> begin with whitespace.  Decryptors <bcp14>MUST</bcp14> strip leading
whitespace from continuation lines before decoding.  In armored
encoding,
the DATA block's Base64 <bcp14>MAY</bcp14> contain line breaks; Decryptors <bcp14>MUST</bcp14> ignore
them.</t>
        <t>Encryptors <bcp14>MUST</bcp14> use LF (0x0A) line terminators.  Decryptors <bcp14>MUST</bcp14>
accept LF and <bcp14>MAY</bcp14> accept CRLF.  Decryptors <bcp14>MUST</bcp14> strip trailing
whitespace from header lines.</t>
        <dl>
          <dt>Case sensitivity:</dt>
          <dd>
            <t>All field names, identifiers, and fence markers are
case-sensitive.</t>
          </dd>
        </dl>
      </section>
      <section anchor="terminology">
        <name>Terminology</name>
        <dl>
          <dt>CEK (Content-Encryption Key):</dt>
          <dd>
            <t>A randomly generated 32-octet key used to derive the payload
encryption key.  The CEK is wrapped independently for each
recipient.</t>
          </dd>
          <dt>KEK (Key-Encryption Key):</dt>
          <dd>
            <t>A 32-octet key derived from a LOCK's step sequence.  Used to
wrap or unwrap the CEK.</t>
          </dd>
          <dt>Encryptor:</dt>
          <dd>
            <t>The party that creates a SAFE-encoded file.</t>
          </dd>
          <dt>Decryptor:</dt>
          <dd>
            <t>The party that recovers plaintext from a SAFE-encoded file
using appropriate credentials.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="algorithms">
      <name>Algorithms</name>
      <section anchor="default-parameters">
        <name>Default Parameters</name>
        <t>The following defaults apply whenever a CONFIG block is absent or when
a field is omitted from the CONFIG block:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Default Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">AEAD</td>
              <td align="left">aes-256-gcm</td>
            </tr>
            <tr>
              <td align="left">Block-Size</td>
              <td align="left">65536</td>
            </tr>
            <tr>
              <td align="left">Hash</td>
              <td align="left">sha-256</td>
            </tr>
            <tr>
              <td align="left">Key-Epoch</td>
              <td align="left">(absent)</td>
            </tr>
            <tr>
              <td align="left">Lock-Encoding</td>
              <td align="left">armored</td>
            </tr>
            <tr>
              <td align="left">Data-Encoding</td>
              <td align="left">armored</td>
            </tr>
          </tbody>
        </table>
        <t>Implementations <bcp14>MUST</bcp14> use these values for any omitted fields.
CONFIG need only include fields that differ from the defaults; see
<xref target="safe-config"/>.</t>
      </section>
      <section anchor="algorithm-summary-tables">
        <name>Algorithm Summary Tables</name>
        <t>This section provides a quick reference of all cryptographic algorithms
and identifiers used in SAFE. Detailed specifications appear in later
sections.</t>
        <section anchor="aead-summary">
          <name>AEAD Algorithms</name>
          <table>
            <thead>
              <tr>
                <th align="left">Algorithm</th>
                <th align="left">Identifier</th>
                <th align="left">Nk</th>
                <th align="left">Nn</th>
                <th align="left">NMR</th>
                <th align="left">Key-Epoch</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">AES-256-GCM</td>
                <td align="left">aes-256-gcm</td>
                <td align="left">32</td>
                <td align="left">12</td>
                <td align="left">No</td>
                <td align="left">Recommended</td>
              </tr>
              <tr>
                <td align="left">ChaCha20-Poly1305</td>
                <td align="left">chacha20-poly1305</td>
                <td align="left">32</td>
                <td align="left">12</td>
                <td align="left">No</td>
                <td align="left">Required</td>
              </tr>
              <tr>
                <td align="left">AES-256-GCM-SIV</td>
                <td align="left">aes-256-gcm-siv</td>
                <td align="left">32</td>
                <td align="left">12</td>
                <td align="left">Yes</td>
                <td align="left">Not Applicable</td>
              </tr>
              <tr>
                <td align="left">AEGIS-256</td>
                <td align="left">aegis-256</td>
                <td align="left">32</td>
                <td align="left">32</td>
                <td align="left">No</td>
                <td align="left">Not Recommended</td>
              </tr>
              <tr>
                <td align="left">AEGIS-256X2</td>
                <td align="left">aegis-256x2</td>
                <td align="left">32</td>
                <td align="left">32</td>
                <td align="left">No</td>
                <td align="left">Not Recommended</td>
              </tr>
            </tbody>
          </table>
          <t>Nk/Nn are key/nonce sizes in octets.  "NMR" indicates nonce-misuse
resistance (see <xref target="nonce-generation-and-cek-reuse"/>).  "Key-Epoch"
indicates whether Encryptors should include Key-Epoch in CONFIG:
Required means <bcp14>MUST</bcp14>, Recommended means <bcp14>SHOULD</bcp14>, Not Applicable
means <bcp14>MUST NOT</bcp14> (NMR AEADs), Not Recommended means <bcp14>SHOULD NOT</bcp14>
(256-bit nonce AEADs gain no practical benefit).  See
<xref target="safe-config"/> and <xref target="epoch-key-derivation"/> for details.
AEADs without NMR permit plaintext recovery under nonce reuse;
Encryptors <bcp14>SHOULD</bcp14> select an NMR AEAD when nonce reuse cannot be
ruled out.  All AEADs
provide <xref target="RFC5116"/> semantics with 16-octet tags.  All SAFE DATA
payloads begin with a 32-octet salt followed by a 32-octet
commitment prefix derived per <xref target="payload-schedule"/> that binds
the ciphertext to the CEK, the negotiated algorithm parameters,
and the per-file salt (see <xref target="key-commitment"/>).</t>
        </section>
        <section anchor="kem-summary">
          <name>Key Encapsulation Mechanisms</name>
          <table>
            <thead>
              <tr>
                <th align="left">KEM</th>
                <th align="left">Identifier</th>
                <th align="left">HPKE KEM ID</th>
                <th align="left">Encap Size</th>
                <th align="left">Auth</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">X25519</td>
                <td align="left">x25519</td>
                <td align="left">0x0020</td>
                <td align="left">32 octets</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">P-256</td>
                <td align="left">p-256</td>
                <td align="left">0x0010</td>
                <td align="left">65 octets</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">ML-KEM-768</td>
                <td align="left">ml-kem-768</td>
                <td align="left">0x0041</td>
                <td align="left">1088 octets</td>
                <td align="left">No</td>
              </tr>
            </tbody>
          </table>
          <t>HPKE KEM IDs are defined in Section 7.1 of <xref target="RFC9180"/> and the IANA HPKE
KEM Identifiers registry.  ML-KEM-768 enables hybrid post-quantum
constructions via multi-step step sequences (see <xref target="kem-support"/>).</t>
          <t>All KEMs use HPKE <xref target="RFC9180"/> in export-only mode (AEAD ID 0xFFFF).
The encryptor calls SetupBaseS (or SetupAuthS when <tt>sid</tt> or <tt>shint</tt>
is present) to produce a KEM ciphertext and an HPKE context, then
calls Export on the context to derive the step secret
(<xref target="hpke-exporter"/>).  When a sender parameter is present, HPKE Auth
mode is used (see <xref target="hpke-auth-mode"/>).  The KEM identifier appears
in hpke(...) step tokens (<xref target="hpke-step"/>).  SAFE maintains a registry
mapping string identifiers to HPKE KEM IDs (<xref target="iana-kem"/>).</t>
        </section>
        <section anchor="step-summary">
          <name>Step Types</name>
          <table>
            <thead>
              <tr>
                <th align="left">Step Type</th>
                <th align="left">Token Format</th>
                <th align="left">Parameters</th>
                <th align="left">Secret</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Passphrase</td>
                <td align="left">pass(kdf=..., salt=...)</td>
                <td align="left">kdf, salt</td>
                <td align="left">32 octets</td>
              </tr>
              <tr>
                <td align="left">HPKE</td>
                <td align="left">hpke(kem=X, kemct=..., ...)</td>
                <td align="left">kem, kemct, id/hint, sid/shint</td>
                <td align="left">32 octets</td>
              </tr>
            </tbody>
          </table>
          <t>Step types are composed via multiple Step lines within a LOCK
block, with AND semantics: all steps are required to derive the KEK.
Each step conforms to the interface defined in <xref target="steps"/> and
produces a 32-octet secret that contributes to KEK derivation
(<xref target="kek-schedule"/>).  Additional step types <bcp14>MAY</bcp14> be
registered per <xref target="iana-steps"/>.</t>
        </section>
      </section>
      <section anchor="algorithm-requirements">
        <name>Algorithm Requirements</name>
        <t>AEADs used with SAFE <bcp14>MUST</bcp14> provide <xref target="RFC5116"/> semantics
with a 16-octet authentication tag.  KEMs <bcp14>MUST</bcp14> use HPKE
export-only mode (AEAD ID 0xFFFF) as specified in <xref target="hpke-step"/>.
When <tt>sid</tt> or <tt>shint</tt> is present, HPKE Auth mode is used
(<xref target="hpke-auth-mode"/>).</t>
      </section>
      <section anchor="hash-function">
        <name>Hash Function and KDF</name>
        <t>SAFE piggybacks on the HPKE KDF interface.  HPKE <xref target="RFC9180"/> and
<xref target="I-D.ietf-hpke-pq"/> define two KDF classes:</t>
        <t>Two-stage KDFs (e.g., HKDF-SHA256, KDF ID 0x0001):</t>
        <ul spacing="normal">
          <li>
            <t><tt>KDF.Nh</tt>: output size of Extract (32 for HKDF-SHA256)</t>
          </li>
          <li>
            <t><tt>KDF.Extract(salt, ikm) -&gt; prk</tt> (Nh octets)</t>
          </li>
          <li>
            <t><tt>KDF.Expand(prk, info, L) -&gt; okm</tt> (L octets)</t>
          </li>
        </ul>
        <t>Single-stage KDFs (e.g., TurboSHAKE256, <xref target="I-D.ietf-hpke-pq"/>):</t>
        <ul spacing="normal">
          <li>
            <t><tt>KDF.Derive(ikm, L) -&gt; okm</tt> (L octets).
For TurboSHAKE256: <tt>TurboSHAKE256(M=ikm, D=0x1F, L)</tt>.</t>
          </li>
        </ul>
        <t>The Hash config parameter selects both the KDF and its class.
Any KDF registered for SAFE <bcp14>MUST</bcp14> be registered in the HPKE KDF
Identifiers registry <xref target="RFC9180"/> and <bcp14>MUST</bcp14> implement either the
two-stage (Extract/Expand/Nh) or single-stage (Derive) interface.</t>
        <section anchor="safe-derive">
          <name>SafeDerive</name>
          <t>SafeDerive binds every derivation to the protocol version and a
call-site label.  The ikm and info parameters accept a single octet
string or a list; list elements are individually lp16-encoded by
Encode().</t>
          <t>Callers that require suite binding include encryption_parameters in
the info argument.  Config-independent derivations such as key
identifiers (<xref target="key-identifier"/>) omit it.</t>
          <t>Two-stage (HKDF):</t>
          <artwork><![CDATA[
SafeDerive(label, ikm, info, L):
    prk = Extract(
        "SAFE-v1",
        Encode("SAFE-v1", label, ...ikm))
    return Expand(prk,
        Encode("SAFE-v1", label, ...info,
               I2OSP(L, 2)), L)
]]></artwork>
          <t>Single-stage (Extendable Output Function (XOF)):</t>
          <artwork><![CDATA[
SafeDerive(label, ikm, info, L):
    return Derive(
        Encode("SAFE-v1", label, ...ikm,
               I2OSP(L, 2), ...info), L)
]]></artwork>
          <t>SafeDerive labels <bcp14>MUST</bcp14> be unique across all call sites within a single
protocol version.  The labels defined by this specification are
reserved; future extensions and step type registrations <bcp14>MUST NOT</bcp14> reuse
them.  Similarly, SafeRandom labels (<xref target="random-generation"/>) <bcp14>MUST</bcp14> be
unique and <bcp14>MUST NOT</bcp14> be reused by extensions.</t>
        </section>
        <section anchor="random-generation">
          <name>Random Generation (SafeRandom)</name>
          <t>SafeRandom is the random generation function used for all
encryptor-generated random values in SAFE.  It requires a
cryptographically secure pseudorandom number generator (CSPRNG).</t>
          <section anchor="base-construction">
            <name>Base Construction</name>
            <artwork><![CDATA[
SafeRandom(n, label):
    return CSPRNG(n)
]]></artwork>
            <t>When no private key is available, SafeRandom returns raw CSPRNG
output.  The label parameter is reserved for use by the hedged
construction (<xref target="hedged-construction"/>).</t>
          </section>
          <section anchor="hedged-construction">
            <name>Hedged Construction</name>
            <t>When a long-term private key <tt>sk</tt> is available, the Encryptor <bcp14>SHOULD</bcp14>
mix it into SafeRandom to defend against a weak or attacker-influenced
RNG.  The construction follows <xref target="RFC8937"/>: hedge_key is a
deterministic function of <tt>sk</tt> (replacing the signature in
<xref target="RFC8937"/> with a KDF, since SAFE does not require a signature
scheme), and SafeRandom combines it with CSPRNG output via
SafeDerive.</t>
            <artwork><![CDATA[
hedge_key = SafeDerive("SAFE-HEDGE", sk, "", 32)

SafeRandom(n, label):
    return SafeDerive(label,
        [hedge_key, CSPRNG(n)], "", n)
]]></artwork>
            <t>An adversary who can predict CSPRNG output but does not know <tt>sk</tt>
cannot predict the hedged values.  Hedging does not prevent repeated
output from RNG state duplication (VM snapshot restore, process fork
without reseed); identical CSPRNG output produces identical hedged
output regardless of the private key.</t>
            <t>Suitable private keys include any long-term key held by the Encryptor
(an HPKE sender private key, an application-provided signing key, or
similar).  The key need not correspond to any LOCK step.</t>
            <t>Encryptors <bcp14>MUST</bcp14> use SafeRandom for all random values generated during
SAFE encoding: CEK, payload salt, passphrase salt, lock_nonce, and
block nonce base.
HPKE internal randomness (Encap) is not hedged by default.
Implementations whose HPKE library accepts an external randomness
source <bcp14>SHOULD</bcp14> supply SafeRandom(Nrand, "SAFE-ENCAP") instead of
raw CSPRNG output, where Nrand is the randomness length required
by the KEM.</t>
            <t>A functioning CSPRNG is <bcp14>REQUIRED</bcp14> when no private key is available.
See <xref target="nonce-generation-and-cek-reuse"/> for the security analysis.</t>
          </section>
        </section>
      </section>
      <section anchor="encryption-parameters">
        <name>Encryption Parameters</name>
        <t>The encryption_parameters is an ordered list of the effective
parameters (defaults augmented by any config overrides):</t>
        <artwork><![CDATA[
encryption_parameters = [aead_id, block_size, hash_id]
]]></artwork>
        <t>When Key-Epoch is present in CONFIG, the list includes it as a
fourth element:</t>
        <artwork><![CDATA[
encryption_parameters = [aead_id, block_size, hash_id,
                         key_epoch_str]
]]></artwork>
        <t>where key_epoch_str is the decimal ASCII representation of
Key-Epoch with no leading zeros.  When Key-Epoch is absent,
encryption_parameters has three elements, preserving backward
compatibility with files that predate this feature.  Because
Key-Epoch changes encryption_parameters, adding or removing it
requires re-encryption of the payload and re-wrapping of the CEK
in new LOCKs.</t>
        <t>aead_id, block_size, and hash_id are the ASCII string
forms of the AEAD, Block-Size, and Hash parameters
respectively.  SafeDerive splices this list via
<tt>...encryption_parameters</tt> and applies lp16 framing to
each element (<xref target="safe-derive"/>).</t>
        <t>AEAD identifiers <bcp14>MUST</bcp14> be lowercase ASCII and match exactly
the registered values in <xref target="iana-aead"/>.  Block-Size <bcp14>MUST</bcp14>
be rendered as a decimal string with no leading zeros
(except for the value 0 itself).  Hash identifiers <bcp14>MUST</bcp14> be
lowercase ASCII and match exactly the registered values in
<xref target="iana-hash"/>.</t>
        <t>SafeDerive binds encryption_parameters throughout
the key schedule: the KEK aggregator initialization
and final derivation (<xref target="kek-schedule"/>), and each
payload schedule call (<xref target="payload-schedule"/>).
See <xref target="test-vectors"/> for a worked example.</t>
      </section>
      <section anchor="steps">
        <name>Steps</name>
        <t>Step terminology at a glance:</t>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="264" viewBox="0 0 264 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 80,48 L 80,64" fill="none" stroke="black"/>
              <path d="M 80,96 L 80,112" fill="none" stroke="black"/>
              <path d="M 112,112 L 112,144" fill="none" stroke="black"/>
              <path d="M 144,96 L 144,112" fill="none" stroke="black"/>
              <path d="M 168,48 L 168,64" fill="none" stroke="black"/>
              <path d="M 216,96 L 216,144" fill="none" stroke="black"/>
              <path d="M 56,48 L 224,48" fill="none" stroke="black"/>
              <path d="M 80,112 L 144,112" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="224,144 212,138.4 212,149.6" fill="black" transform="rotate(90,216,144)"/>
              <polygon class="arrowhead" points="120,144 108,138.4 108,149.6" fill="black" transform="rotate(90,112,144)"/>
              <g class="text">
                <text x="24" y="36">Step:</text>
                <text x="128" y="36">&lt;type&gt;(&lt;key&gt;=&lt;val&gt;,</text>
                <text x="228" y="36">...)</text>
                <text x="52" y="84">step</text>
                <text x="92" y="84">type</text>
                <text x="140" y="84">step</text>
                <text x="204" y="84">parameters</text>
                <text x="108" y="164">step_token</text>
                <text x="216" y="164">step_secret</text>
                <text x="100" y="180">(Encode)</text>
                <text x="184" y="180">(32</text>
                <text x="232" y="180">octets)</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
  Step: <type>(<key>=<val>, ...)
        '--+--''------+------'
           |          |
      step type  step parameters
           |       |        |
           +---+---+        |
               |            |
               v            v
          step_token   step_secret
          (Encode)     (32 octets)
]]></artwork>
        </artset>
        <section anchor="step-interface">
          <name>Step Interface</name>
          <t>A step is a registered cryptographic operation that produces a
32-octet step secret from user-supplied credentials or cryptographic
material.  Each step type <bcp14>MUST</bcp14> define:</t>
          <dl>
            <dt>Step name:</dt>
            <dd>
              <t>A unique ASCII identifier used in step tokens (e.g., "pass",
"hpke").</t>
            </dd>
            <dt>Parameters:</dt>
            <dd>
              <t>An ABNF grammar for step-specific parameters appearing in the token
(e.g., kem=x25519, id=...).</t>
            </dd>
            <dt>Derivation:</dt>
            <dd>
              <t>A deterministic algorithm that produces exactly 32 octets.
The algorithm <bcp14>MUST</bcp14> be reproducible given the same inputs.
The step definition <bcp14>MUST</bcp14> specify all required inputs for
both encryption and decryption.</t>
            </dd>
            <dt>KEK schedule integration:</dt>
            <dd>
              <t>The step secret and binding step_token feed into the KEK
schedule (<xref target="kek-schedule"/>) via
<tt>SafeDerive("kek_step", [agg, step_secret],
step_token, 32)</tt>.
The step secret (ikm) enters Extract; the step token
(info) enters Expand.  The on-wire step token appears
verbatim in the LOCK block.
Each step type defines an Encode form: the canonical binary
encoding of its cryptographically relevant fields via Encode()
(<xref target="notation"/>).  The Encode form serves as the binding step_token
in the KEK schedule.  Display-only fields (label, hint, shint)
are excluded.  The binding forms for the built-in step types are:
</t>
              <table>
                <thead>
                  <tr>
                    <th align="left">Step</th>
                    <th align="left">Binding step_token</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td align="left">pass</td>
                    <td align="left">Encode("pass", kdf, salt)</td>
                  </tr>
                  <tr>
                    <td align="left">hpke</td>
                    <td align="left">Encode("hpke", kem, kemct, id)</td>
                  </tr>
                  <tr>
                    <td align="left">hpke (auth)</td>
                    <td align="left">Encode("hpke", kem, kemct, id, "auth", sid)</td>
                  </tr>
                </tbody>
              </table>
              <t>String values (kdf, kem) are UTF-8; binary values (salt, kemct,
id, sid) are raw decoded octets, not Base64.</t>
              <t>Fields computed for binding (hpke id, hpke sid, webauthn-prf
rpid) may be omitted on-wire for privacy but are
deterministically reconstructed during decryption and always
appear in the binding form.  For hpke, <tt>id</tt> is always present in
the binding step_token even when omitted from the on-wire token;
it is computed during trial decryption.  Similarly, <tt>sid</tt> is
optional on-wire but always present in auth-mode binding; when
omitted, it is computed from the candidate sender public key.</t>
            </dd>
            <dt>Registration:</dt>
            <dd>
              <t>New step types are registered via the IANA SAFE Step Names
registry (<xref target="iana-steps"/>) with Specification Required policy.  The
registration <bcp14>MUST</bcp14> include: step name, parameters grammar, inputs,
derivation algorithm, Encode binding form, and any step-specific
parameter definitions.  See <xref target="defining-new-steps"/> for an example.</t>
            </dd>
            <dt>label (<bcp14>OPTIONAL</bcp14>, any step):</dt>
            <dd>
              <t>A human-readable display name intended to help users identify
which passphrase, credential, or key to use during decryption
(e.g., "Work laptop", "Recovery key").  The label is always
excluded from the binding step_token and has no cryptographic
effect.  Encryptors <bcp14>MAY</bcp14> include a label in any step token;
Decryptors <bcp14>MUST</bcp14> ignore it for binding purposes.  The label
value <bcp14>MUST</bcp14> match the grammar <tt>1*(ALPHA / DIGIT / "-")</tt>.</t>
            </dd>
          </dl>
          <t>Steps are registered in the IANA SAFE Step Names registry
(<xref target="iana-steps"/>).  The following subsections define the initial
registered steps.</t>
        </section>
        <section anchor="passphrase-step">
          <name>Passphrase Step</name>
          <t>The passphrase step derives a 32-octet step secret from a user
passphrase using a password-based KDF.  The <tt>kdf</tt> parameter
selects the algorithm:</t>
          <table>
            <thead>
              <tr>
                <th align="left">KDF</th>
                <th align="left">Algorithm</th>
                <th align="left">Parameters</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">argon2id</td>
                <td align="left">Argon2id <xref target="RFC9106"/></td>
                <td align="left">m=65536 KiB, t=2, p=1</td>
              </tr>
              <tr>
                <td align="left">pbkdf2</td>
                <td align="left">PBKDF2-HMAC-SHA-256 <xref target="RFC8018"/></td>
                <td align="left">iter=600000</td>
              </tr>
            </tbody>
          </table>
          <t>The step token format is:</t>
          <artwork><![CDATA[
pass(kdf=<kdf>,salt=<Base64>)
pass(kdf=<kdf>,salt=<Base64>,label=<text>)
]]></artwork>
          <t>The <tt>kdf</tt> parameter is <bcp14>REQUIRED</bcp14>.  The <tt>label</tt> parameter
is <bcp14>OPTIONAL</bcp14> and is for display only; it is not included
in the binding step_token (<xref target="steps"/>).  Encryptors <bcp14>MUST</bcp14>
generate a fresh 16-octet salt using
<tt>SafeRandom(16, "SAFE-PASS-SALT")</tt> for each pass(...)
step in a LOCK.  Decryptors <bcp14>MUST</bcp14> reject pass(...) steps
whose <tt>salt</tt> value does not decode to exactly 16 octets.</t>
          <t>Grammar:</t>
          <artwork><![CDATA[
pass-step   = "pass(" pass-params ")"
pass-params = "kdf=" kdf-name "," "salt=" salt
              [ "," "label=" label-value ]
kdf-name    = "argon2id" / "pbkdf2"
salt        = 1*BASE64CHAR
label-value = 1*( ALPHA / DIGIT / "-" )
]]></artwork>
          <t>Encode form:</t>
          <artwork><![CDATA[
Encode("pass", kdf, salt)
]]></artwork>
          <t>Binding step_token: Encode("pass", kdf, salt).</t>
          <t>The step secret is computed as follows:</t>
          <dl>
            <dt>For kdf=argon2id:</dt>
            <dd>
              <t>Argon2id(passphrase, salt, m=65536, t=2, p=1,
T=32) per Section 3.1 of <xref target="RFC9106"/>.</t>
            </dd>
            <dt>For kdf=pbkdf2:</dt>
            <dd>
              <t>PBKDF2(PRF=HMAC-SHA-256, Password=passphrase, Salt=salt,
c=600000, dkLen=32).</t>
            </dd>
          </dl>
          <t>In both cases, salt is the decoded value of the <tt>salt</tt>
parameter.</t>
          <t>Implementations <bcp14>SHOULD</bcp14> prefer argon2id for its memory-hardness
properties.  Implementations <bcp14>MAY</bcp14> support pbkdf2 for environments
where Argon2id is not permitted by policy.</t>
        </section>
        <section anchor="hpke-step">
          <name>HPKE Step</name>
          <t>The HPKE step token has three forms:</t>
          <artwork><![CDATA[
hpke(kem=x25519, kemct=<Base64>, id=<Base64>)    ; Identified mode
hpke(kem=x25519, kemct=<Base64>, hint=<digits>)  ; Hinted mode
hpke(kem=x25519, kemct=<Base64>)                 ; Anonymous mode
]]></artwork>
          <t>The parameters are:</t>
          <dl>
            <dt>kem (<bcp14>REQUIRED</bcp14>):</dt>
            <dd>
              <t>The KEM algorithm.  Supported values: x25519, p-256, ml-kem-768.</t>
            </dd>
            <dt>kemct (<bcp14>REQUIRED</bcp14>):</dt>
            <dd>
              <t>The Base64-encoded HPKE KEM encapsulated key material (the KEM
ciphertext).  This value <bcp14>MUST</bcp14> decode to the encapsulated key length
for the selected KEM (see <xref target="kem-summary"/>).  Decryptors <bcp14>MUST</bcp14> reject
hpke steps whose decoded kemct length does not match the KEM's
encapsulated key length.</t>
            </dd>
            <dt>id (<bcp14>OPTIONAL</bcp14>):</dt>
            <dd>
              <t>The key identifier computed as
SafeDerive("SAFE-SPKI-v1", spki_der, "", 32) using the
configured Hash (default: sha-256).  When present, Decryptors
match this value against their local keys.  When omitted,
Decryptors perform trial decryption.  See <xref target="key-identifier"/>
and <xref target="recipient-anonymity"/>.</t>
            </dd>
            <dt>hint (<bcp14>OPTIONAL</bcp14>):</dt>
            <dd>
              <t>A 4-digit decimal value (0000-9999) assigned by the recipient
out-of-band; not solely dependent on the public key.  When present,
Decryptors filter candidate keys to those associated with this hint
in their local key storage.  Mutually exclusive with id.</t>
            </dd>
          </dl>
          <t>Encryptors <bcp14>MUST</bcp14> include exactly one of: <tt>id</tt>, <tt>hint</tt>, or neither
(but not both <tt>id</tt> and <tt>hint</tt>).</t>
          <section anchor="hpke-auth-mode">
            <name>HPKE Auth Mode</name>
            <t>In Base mode, any party who knows a recipient's public key can
create a valid SAFE object for that recipient.  Auth mode
<xref target="RFC9180"/> uses SetupAuthS/SetupAuthR, which bind the HPKE
context to the sender's private key so that the Decryptor can
verify who produced the object.  This is useful for offline
encrypted file exchange where the recipient needs assurance of
origin (for example, encrypted firmware images, signed-then-encrypted
document workflows, or air-gapped key escrow) without requiring a
separate signature layer.</t>
            <t>The presence of <tt>sid</tt> or <tt>shint</tt> selects HPKE Auth mode (mode_auth)
instead of Base mode.  Auth mode <bcp14>MUST</bcp14> only be used with
Diffie-Hellman KEM (DHKEM) based KEMs (x25519, p-256).
Encryptors <bcp14>MUST NOT</bcp14> include <tt>sid</tt> or <tt>shint</tt> with ml-kem-768
or other non-DHKEM KEMs, because these KEMs do not
define AuthEncap/AuthDecap.</t>
            <dl>
              <dt>sid (<bcp14>OPTIONAL</bcp14>):</dt>
              <dd>
                <t>The sender's key identifier, computed as
SafeDerive("SAFE-SPKI-v1", spki_der, "", 32) using the same
Hash as <tt>id</tt>.  When present with a Base64 value, Decryptors match
it against known sender public keys.  The special value <tt>anon</tt>
indicates anonymous sender Auth mode: the sender's key is not
identified, and Decryptors perform trial decryption across
candidate sender keys.  Mutually exclusive with <tt>shint</tt>.</t>
              </dd>
              <dt>shint (<bcp14>OPTIONAL</bcp14>):</dt>
              <dd>
                <t>A 4-digit decimal value (0000-9999) assigned by the sender
out-of-band; parallels <tt>hint</tt> for recipient keys.  When present,
Decryptors filter candidate sender keys to those associated with
this value.  Mutually exclusive with <tt>sid</tt>.</t>
              </dd>
            </dl>
            <t>Encryptors <bcp14>MUST</bcp14> include exactly one of <tt>sid</tt> or <tt>shint</tt> (but not
both) when using Auth mode.</t>
            <t>Auth mode token forms extend the base forms:</t>
            <artwork><![CDATA[
hpke(kem=x25519, kemct=<B64>, id=<B64>, sid=<B64>)
hpke(kem=x25519, kemct=<B64>, sid=<B64>)
hpke(kem=x25519, kemct=<B64>, sid=anon)
hpke(kem=x25519, kemct=<B64>, shint=1234)
]]></artwork>
            <t>All combinations of recipient identification (id, hint, or
anonymous) and sender identification (sid, shint, or sid=anon)
are valid.</t>
            <t>The hpke step token refines the step-token grammar in
<xref target="step-syntax"/>.  OWS (optional whitespace) is permitted
after each comma separator, consistent with step-params:</t>
            <artwork><![CDATA[
hpke-step    = "hpke(" hpke-params ")"
hpke-params  = "kem=" kem-name "," OWS "kemct=" kemct
               [ "," OWS recipient-id ]
               [ "," OWS sender-id ]
kem-name     = 1*( ALPHA / DIGIT / "-" )
                 ; registered in SAFE KEM Identifiers
                 ; registry ({{iana-kem}})
kemct        = 1*BASE64CHAR
recipient-id = "id=" 1*BASE64CHAR / "hint=" hint-value
sender-id    = "sid=" ( 1*BASE64CHAR / "anon" )
             / "shint=" hint-value
hint-value   = 4DIGIT
]]></artwork>
            <t>Encryptors <bcp14>MUST NOT</bcp14> include both <tt>id</tt> and <tt>hint</tt>, and <bcp14>MUST NOT</bcp14>
include both <tt>sid</tt> and <tt>shint</tt>.</t>
            <t>Each HPKE step uses HPKE <xref target="RFC9180"/> in export-only mode with
ciphersuite (KEM_ID, KDF_ID, 0xFFFF) constructed from the KEM's
registered identifiers (<xref target="kem-support"/>).  AEAD ID 0xFFFF
disables Seal/Open; only Export is used.</t>
            <t>For Base mode (default):</t>
            <artwork><![CDATA[
;; Encryptor
(kemct, ctx) = SetupBaseS(pkR, info="SAFE-v1")
step_secret  = ctx.Export(exporter_context, L=32)

;; Decryptor
ctx          = SetupBaseR(kemct, skR, info="SAFE-v1")
step_secret  = ctx.Export(exporter_context, L=32)
]]></artwork>
            <t>For Auth mode (sid or shint present):</t>
            <artwork><![CDATA[
;; Encryptor
(kemct, ctx) = SetupAuthS(pkR, skS, info="SAFE-v1")
step_secret  = ctx.Export(exporter_context, L=32)

;; Decryptor
ctx          = SetupAuthR(kemct, skR, pkS, info="SAFE-v1")
step_secret  = ctx.Export(exporter_context, L=32)
]]></artwork>
            <t>The <tt>kemct</tt> value is the KEM ciphertext (<tt>enc</tt> in HPKE
terminology).  The <tt>exporter_context</tt> is defined in
<xref target="hpke-exporter"/>.</t>
            <t>This design uses HPKE's standardized key schedule and export
interface for KDF agility, while SAFE's own SafeDerive function
handles KEK aggregation, payload key derivation, and nonce
constructions.</t>
          </section>
          <section anchor="kem-support">
            <name>Supported KEMs</name>
            <t>The following table lists the KEMs defined in the IANA HPKE KEM
Identifiers registry <xref target="RFC9180"/> that are recognized by SAFE:</t>
            <table>
              <thead>
                <tr>
                  <th align="left">KEM</th>
                  <th align="left">KEM ID</th>
                  <th align="left">KDF ID</th>
                  <th align="left">HPKE Ciphersuite</th>
                  <th align="left">Key Encoding</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">x25519</td>
                  <td align="left">0x0020</td>
                  <td align="left">(see below)</td>
                  <td align="left">(0x0020, KDF_ID, 0xFFFF)</td>
                  <td align="left">
                    <xref target="RFC8410"/></td>
                </tr>
                <tr>
                  <td align="left">p-256</td>
                  <td align="left">0x0010</td>
                  <td align="left">(see below)</td>
                  <td align="left">(0x0010, KDF_ID, 0xFFFF)</td>
                  <td align="left">
                    <xref target="RFC5480"/></td>
                </tr>
                <tr>
                  <td align="left">ml-kem-768</td>
                  <td align="left">0x0041</td>
                  <td align="left">(see below)</td>
                  <td align="left">(0x0041, KDF_ID, 0xFFFF)</td>
                  <td align="left">(see below)</td>
                </tr>
              </tbody>
            </table>
            <t>The HPKE Ciphersuite column shows the (KEM_ID, KDF_ID, AEAD_ID)
triple used with HPKE's Setup functions.  AEAD ID 0xFFFF selects
export-only mode per Section 5.3 of <xref target="RFC9180"/>.</t>
            <ul spacing="normal">
              <li>
                <t>All KEMs, including DHKEM-based KEMs (x25519, p-256),
use the KDF selected by the Hash parameter, both for the HPKE
key schedule and for DHKEM's internal operations per
<xref target="I-D.ietf-hpke-hpke"/>: HKDF-SHA256 (KDF ID 0x0001) when
Hash=sha-256, or TurboSHAKE256 (KDF ID 0x0013) when
Hash=turboshake256.</t>
              </li>
              <li>
                <t>When Hash=turboshake256, the HPKE implementation <bcp14>MUST</bcp14>
conform to the one-stage key schedule defined in
<xref target="I-D.ietf-hpke-hpke"/>.</t>
              </li>
            </ul>
            <t>ML-KEM-768 key encoding follows
<xref target="I-D.ietf-lamps-kyber-certificates"/>.  Auth mode requires
AuthEncap/AuthDecap, which are defined only for
DHKEM-based KEMs.  ML-KEM-768 <bcp14>MUST NOT</bcp14> be used with
Auth mode.  Additional KEMs from the
IANA HPKE KEM Identifiers registry <bcp14>MAY</bcp14> be supported following the
process defined in <xref target="iana-kem"/>.</t>
          </section>
          <section anchor="key-identifier">
            <name>Key Identifier Computation</name>
            <t>The <tt>id</tt> parameter in hpke(...) steps identifies the intended recipient
public key.  Key identifiers hash the SubjectPublicKeyInfo (SPKI)
Distinguished Encoding Rules (DER) encoding rather than raw key octets.
This ensures key identifiers are consistent with certificate fingerprint
practices and include the algorithm Object Identifier (OID), preventing
collisions between keys of different types.</t>
            <artwork><![CDATA[
spki_der = DER-encode SubjectPublicKeyInfo for pk
           per the KEM's registered SPKI Encoding ({{iana-kem}})
           DER encoding MUST be canonical.

id = Base64( SafeDerive("SAFE-SPKI-v1",
    spki_der, "", 32) ) per {{RFC4648}}
]]></artwork>
            <t>The resulting Base64 string is the value of the <tt>id</tt> parameter
(44 characters for the 32-octet output).</t>
          </section>
          <section anchor="hpke-exporter">
            <name>HPKE Step Secret Derivation</name>
            <t>When the step sequence includes one or more hpke(...) steps, the LOCK
<bcp14>MUST</bcp14> include a corresponding <tt>kemct</tt> parameter value for each HPKE
step, in the same order as they appear in the step sequence.
Encryptors <bcp14>MUST</bcp14> generate a fresh encapsulation per LOCK; reusing a
prior encapsulation is prohibited.</t>
            <t>For Auth mode, the Decryptor resolves the sender public key as
follows:</t>
            <ul spacing="normal">
              <li>
                <t>If <tt>sid</tt> is present: match against known sender public keys
using the configured Hash.</t>
              </li>
              <li>
                <t>If <tt>shint</tt> is present: filter candidate sender keys by the
hint value.</t>
              </li>
              <li>
                <t>If neither is present: try all locally known sender keys
matching the <tt>kem</tt> type.</t>
              </li>
            </ul>
            <t>The step secret is derived via HPKE's Export interface:</t>
            <artwork><![CDATA[
exporter_context = SafeDerive("SAFE-STEP",
    step_token, "", 32)

step_secret = ctx.Export(exporter_context, L=32)
]]></artwork>
            <t>where <tt>ctx</tt> is the HPKE context returned by SetupBaseS/R (or
SetupAuthS/R for Auth mode) as described in <xref target="kem-support"/>,
and step_token is the binding form defined in <xref target="steps"/>.</t>
            <t>When <tt>id</tt> or <tt>sid</tt> is omitted from the on-wire token,
the Decryptor reconstructs it during trial decryption
per <xref target="steps"/>.</t>
            <t>The KEM binds the shared secret to the recipient key (and
for Auth mode, the sender key).  The exporter_context binds
the step secret to the step token, preventing key-confusion
attacks where an attacker substitutes one recipient's
encapsulation for another's.  The HPKE info parameter
"SAFE-v1" binds the key schedule to this protocol, preventing
cross-protocol reuse of the same KEM keys from producing
valid SAFE step secrets.  Suite binding is not needed here
because the final KEK derivation commits to
encryption_parameters (<xref target="kek-schedule"/>).</t>
            <t>Encode form:</t>
            <artwork><![CDATA[
Encode("hpke", kem, kemct, id)
Encode("hpke", kem, kemct, id,
       "auth", sid)                    ; auth
]]></artwork>
            <t>Binding step_token: Encode("hpke", kem, kemct, id)
for Base mode; Encode("hpke", kem, kemct, id,
"auth", sid) for Auth mode.  Display-only fields (hint,
shint) are not included.  The id and sid fields are
reconstructed per <xref target="steps"/> when omitted on-wire.</t>
          </section>
        </section>
      </section>
      <section anchor="key-schedules">
        <name>Key Schedules</name>
        <t>SAFE uses two applications of SafeDerive
(<xref target="hash-function"/>).  The KEK derivation produces a LOCK-specific
KEK from its ordered step secrets.  The payload derivation
produces the per-file payload key, commitment, accumulator key,
and (for NMR AEADs) nonce base from the CEK, encryption
parameters, and per-file salt.</t>
        <t>The following diagram shows the two independent chains:</t>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="576" width="408" viewBox="0 0 408 576" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,160 L 8,448" fill="none" stroke="black"/>
              <path d="M 80,224 L 80,272" fill="none" stroke="black"/>
              <path d="M 80,344 L 80,360" fill="none" stroke="black"/>
              <path d="M 80,448 L 80,480" fill="none" stroke="black"/>
              <path d="M 96,64 L 96,80" fill="none" stroke="black"/>
              <path d="M 96,112 L 96,136" fill="none" stroke="black"/>
              <path d="M 152,192 L 152,200" fill="none" stroke="black"/>
              <path d="M 152,320 L 152,328" fill="none" stroke="black"/>
              <path d="M 192,48 L 192,64" fill="none" stroke="black"/>
              <path d="M 192,160 L 192,448" fill="none" stroke="black"/>
              <path d="M 208,160 L 208,448" fill="none" stroke="black"/>
              <path d="M 216,464 L 216,544" fill="none" stroke="black"/>
              <path d="M 288,64 L 288,80" fill="none" stroke="black"/>
              <path d="M 288,112 L 288,128" fill="none" stroke="black"/>
              <path d="M 392,152 L 392,432" fill="none" stroke="black"/>
              <path d="M 400,464 L 400,544" fill="none" stroke="black"/>
              <path d="M 96,64 L 288,64" fill="none" stroke="black"/>
              <path d="M 8,160 L 192,160" fill="none" stroke="black"/>
              <path d="M 208,160 L 392,160" fill="none" stroke="black"/>
              <path d="M 8,448 L 192,448" fill="none" stroke="black"/>
              <path d="M 216,544 L 400,544" fill="none" stroke="black"/>
              <path d="M 48,256 L 56,272" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="296,128 284,122.4 284,133.6" fill="black" transform="rotate(90,288,128)"/>
              <polygon class="arrowhead" points="104,136 92,130.4 92,141.6" fill="black" transform="rotate(90,96,136)"/>
              <polygon class="arrowhead" points="88,480 76,474.4 76,485.6" fill="black" transform="rotate(90,80,480)"/>
              <polygon class="arrowhead" points="88,272 76,266.4 76,277.6" fill="black" transform="rotate(90,80,272)"/>
              <polygon class="arrowhead" points="64,272 52,266.4 52,277.6" fill="black" transform="rotate(63.43494882292201,56,272)"/>
              <g class="text">
                <text x="160" y="36">CEK</text>
                <text x="192" y="36">(32</text>
                <text x="240" y="36">octets)</text>
                <text x="80" y="100">(sealed</text>
                <text x="128" y="100">by)</text>
                <text x="268" y="100">(derives</text>
                <text x="328" y="100">from)</text>
                <text x="24" y="148">KEK</text>
                <text x="64" y="148">chain</text>
                <text x="108" y="148">(per</text>
                <text x="152" y="148">LOCK)</text>
                <text x="232" y="148">Payload</text>
                <text x="288" y="148">chain</text>
                <text x="332" y="148">(per</text>
                <text x="376" y="148">file)</text>
                <text x="40" y="180">agg_0</text>
                <text x="72" y="180">=</text>
                <text x="124" y="180">SafeDerive</text>
                <text x="268" y="180">payload_info</text>
                <text x="328" y="180">=</text>
                <text x="76" y="196">("kek_init",</text>
                <text x="140" y="196">""</text>
                <text x="268" y="196">enc_params</text>
                <text x="320" y="196">+</text>
                <text x="348" y="196">salt</text>
                <text x="80" y="212">enc_params,</text>
                <text x="144" y="212">32)</text>
                <text x="260" y="228">commitment</text>
                <text x="312" y="228">=</text>
                <text x="44" y="244">secret</text>
                <text x="132" y="244">step_token</text>
                <text x="308" y="244">SafeDerive("commit",</text>
                <text x="252" y="260">CEK,</text>
                <text x="288" y="276">payload_info,</text>
                <text x="360" y="276">32)</text>
                <text x="40" y="292">agg_1</text>
                <text x="72" y="292">=</text>
                <text x="124" y="292">SafeDerive</text>
                <text x="76" y="308">("kek_step",</text>
                <text x="264" y="308">payload_key</text>
                <text x="320" y="308">=</text>
                <text x="56" y="324">[agg_0,</text>
                <text x="120" y="324">secret]</text>
                <text x="272" y="324">SafeDerive(</text>
                <text x="80" y="340">step_token,</text>
                <text x="144" y="340">32)</text>
                <text x="292" y="340">"payload_key",</text>
                <text x="372" y="340">CEK,</text>
                <text x="288" y="356">payload_info,</text>
                <text x="360" y="356">Nk)</text>
                <text x="80" y="372">...</text>
                <text x="80" y="388">v</text>
                <text x="260" y="388">nonce_base</text>
                <text x="312" y="388">=</text>
                <text x="32" y="404">kek</text>
                <text x="56" y="404">=</text>
                <text x="108" y="404">SafeDerive</text>
                <text x="272" y="404">SafeDerive(</text>
                <text x="56" y="420">("kek",</text>
                <text x="116" y="420">agg_N,</text>
                <text x="288" y="420">"nonce_base",</text>
                <text x="364" y="420">CEK,</text>
                <text x="80" y="436">enc_params,</text>
                <text x="144" y="436">Nk)</text>
                <text x="288" y="436">payload_info,</text>
                <text x="360" y="436">Nn)</text>
                <text x="244" y="452">(NMR</text>
                <text x="296" y="452">suites)</text>
                <text x="384" y="452">|</text>
                <text x="256" y="484">acc_key</text>
                <text x="296" y="484">=</text>
                <text x="72" y="500">Encrypted-CEK</text>
                <text x="136" y="500">=</text>
                <text x="280" y="500">SafeDerive(</text>
                <text x="68" y="516">lock_nonce</text>
                <text x="124" y="516">||</text>
                <text x="284" y="516">"acc_key",</text>
                <text x="348" y="516">CEK,</text>
                <text x="84" y="532">AEAD.Seal(kek,</text>
                <text x="296" y="532">payload_info,</text>
                <text x="368" y="532">Nh)</text>
                <text x="80" y="548">lock_nonce,</text>
                <text x="144" y="548">"",</text>
                <text x="180" y="548">CEK)</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
                   CEK (32 octets)
                        |
            +-----------+-----------+
            |                       |
       (sealed by)            (derives from)
            |                       |
            v                       v
  KEK chain (per LOCK)    Payload chain (per file)
 +----------------------+ +----------------------+
 | agg_0 = SafeDerive   | | payload_info =       |
 |  ("kek_init", "",    | |  enc_params + salt   |
 |   enc_params, 32)    | |                      |
 |        |             | | commitment =         |
 | secret | step_token  | |  SafeDerive("commit",|
 |    \   |             | |   CEK,               |
 |     v  v             | |   payload_info, 32)  |
 | agg_1 = SafeDerive   | |                      |
 |  ("kek_step",        | | payload_key =        |
 |  [agg_0, secret],    | |  SafeDerive(         |
 |   step_token, 32)    | |   "payload_key", CEK,|
 |        |             | |   payload_info, Nk)  |
 |       ...            | |                      |
 |        v             | | nonce_base =         |
 | kek = SafeDerive     | |  SafeDerive(         |
 |  ("kek", agg_N,      | |   "nonce_base", CEK, |
 |   enc_params, Nk)    | |   payload_info, Nn)  |
 +--------+-------------+ |  (NMR suites)       |
          |                |                      |
          v                | acc_key =            |
   Encrypted-CEK =         |  SafeDerive(         |
    lock_nonce ||          |   "acc_key", CEK,    |
    AEAD.Seal(kek,         |   payload_info, Nh)  |
     lock_nonce, "", CEK)  +----------------------+
]]></artwork>
        </artset>
        <t>Payload encryption is performed once under the CEK and per-file
salt and does not depend on lock structure.  Locks are independent
wrappers of the same CEK and can be added or removed without
touching payload ciphertext.</t>
        <section anchor="kek-schedule">
          <name>KEK Schedule</name>
          <t>The KEK schedule derives a KEK from an ordered sequence of
step secrets using a running aggregator.</t>
          <t>Algorithm:</t>
          <artwork><![CDATA[
agg = SafeDerive("kek_init", "",
          encryption_parameters, 32)

for each (step_token_i, step_secret_i) in order:
    agg = SafeDerive("kek_step",
              [agg, step_secret_i],
              step_token_i, 32)

derived_kek = SafeDerive("kek", agg,
                  encryption_parameters, Nk)
]]></artwork>
          <t>Each step folds the aggregator and step secret into ikm (Extract)
as an Encode-framed array.  The step token is placed in info
(Expand).  Suite binding enters at kek_init and again at the final
kek derivation, where encryption_parameters commits the aggregator
to the negotiated AEAD, Block-Size, and Hash.</t>
          <section anchor="kek-schedule-example">
            <name>Multi-Step Example</name>
            <t>Consider a LOCK block with two steps requiring both a passphrase and
a private key:</t>
            <artwork><![CDATA[
Step: pass(kdf=argon2id, salt=<Base64>)
Step: hpke(kem=p-256, id=<Base64>, kemct=<Base64>)
Encrypted-CEK: <Base64>
]]></artwork>
            <t>Evaluation proceeds per <xref target="kek-schedule"/>:</t>
            <artwork><![CDATA[
agg = SafeDerive("kek_init", "",
          encryption_parameters, 32)

// Step 1: passphrase
step_secret_1  = Argon2id(passphrase, salt)
agg = SafeDerive("kek_step",
          [agg, step_secret_1],
          step_token_1, 32)

// Step 2: HPKE (export-only mode)
ctx            = SetupBaseR(kemct, sk, info="SAFE-v1")
step_secret_2  = ctx.Export(
    exporter_context =
        SafeDerive("SAFE-STEP",
            step_token_2, "", 32),
    L = 32)
agg = SafeDerive("kek_step",
          [agg, step_secret_2],
          step_token_2, 32)

derived_kek = SafeDerive("kek", agg,
                  encryption_parameters, Nk)
]]></artwork>
            <t>The derived_kek depends on both factors.  Each step is
bound to its position via the aggregator chaining through
ikm, preventing step reordering.</t>
          </section>
        </section>
        <section anchor="sealing-encrypted-cek">
          <name>Sealing Encrypted-CEK</name>
          <t>The per-step <tt>salt</tt> and <tt>kemct</tt> values <bcp14>MUST</bcp14> be unique per LOCK.
Reusing these values with the same credentials produces the same
step_secret, weakening KEK uniqueness.</t>
          <t>With derived_kek computed per <xref target="kek-schedule"/>, the Encrypted-CEK
field is:</t>
          <artwork><![CDATA[
Encrypted-CEK = lock_nonce || AEAD.Seal(
    key   = derived_kek,
    nonce = lock_nonce,
    aad   = "",
    pt    = CEK )
]]></artwork>
          <t>The AEAD algorithm is the one specified in the CONFIG block (or the
default aes-256-gcm when CONFIG is absent); the same AEAD is used for
both CEK wrapping and payload encryption.  Empty AAD is sufficient
because derived_kek already binds encryption_parameters (via kek_init
and the final kek derivation, <xref target="kek-schedule"/>) and all step_tokens (via
kek_step chaining); repeating this binding in the AEAD AAD would be
redundant.</t>
          <t>Encryptors <bcp14>MUST</bcp14> generate lock_nonce using
<tt>SafeRandom(Nn, "SAFE-LOCK-NONCE")</tt>; each LOCK requires a fresh
value.</t>
        </section>
        <section anchor="payload-schedule">
          <name>Payload Schedule</name>
          <t>The payload schedule derives the commitment, payload key, accumulator
key, and (for NMR AEADs) nonce base from the CEK using SafeDerive.
The salt is a 32-octet random value generated using
<tt>SafeRandom(32, "SAFE-SALT")</tt> and stored at the start of the DATA
block.  It is appended to encryption_parameters in the info input:</t>
          <artwork><![CDATA[
payload_info = [...encryption_parameters, salt]

commitment  = SafeDerive("commit", CEK,
                  payload_info, 32)
payload_key = SafeDerive("payload_key", CEK,
                  payload_info, Nk)
acc_key     = SafeDerive("acc_key", CEK,
                  payload_info, Nh)
]]></artwork>
          <t>For NMR AEADs (NMR=Yes in <xref target="aead-summary"/>), the payload schedule
also derives nonce_base:</t>
          <artwork><![CDATA[
nonce_base  = SafeDerive("nonce_base", CEK,
                  payload_info, Nn)
]]></artwork>
          <t>For non-NMR AEADs, nonce_base is not derived.  The accumulator key
acc_key is always derived and is used for the snapshot accumulator
(<xref target="snapshot-accumulator"/>).</t>
          <t>The commitment prefix is always 32 octets for all AEADs.  Decryptors
<bcp14>MUST</bcp14> verify the commitment before decrypting any block and <bcp14>MUST</bcp14> reject
the file if the derived commitment does not match the stored value
(see <xref target="key-commitment"/>).</t>
          <t>Each call independently derives from CEK with distinct labels.  Using
the wrong AEAD identifier or Block-Size when attempting decryption
produces different SafeDerive outputs, causing AEAD verification to
fail on every block.  The per-file salt ensures that even when the
same CEK is reused across files, each file produces unique derived
keys.  This binding provides implicit integrity assurance that the
decryptor is using the correct encryption parameters.</t>
        </section>
        <section anchor="epoch-key-derivation">
          <name>Epoch Key Derivation</name>
          <t>When Key-Epoch is present in CONFIG, per-block encryption uses
an epoch key derived from the payload key.  Key-Epoch is a
non-negative integer r; each epoch spans 2^r consecutive blocks.</t>
          <artwork><![CDATA[
block_key(i):
  if key_epoch is absent:
    return payload_key
  epoch_index = i >> key_epoch
  return SafeDerive("epoch_key", payload_key,
             [I2OSP(epoch_index, 8)], Nk)
]]></artwork>
          <t>Blocks 0 through 2^r - 1 share epoch 0, blocks 2^r through
2^(r+1) - 1 share epoch 1, and so on.  When Key-Epoch is 0,
every block has its own key (epoch size 1).</t>
          <t>Since Key-Epoch is included in encryption_parameters when present
(<xref target="encryption-parameters"/>), the commitment and all payload
schedule outputs change when the epoch configuration changes.
Implementations <bcp14>SHOULD</bcp14> cache epoch keys across consecutive blocks
in the same epoch.</t>
          <t>This construction is inspired by <xref target="FLOE"/>, adapted to
SAFE's key schedule.</t>
        </section>
        <section anchor="per-block-nonces">
          <name>Per-block Nonces</name>
          <t>Nonces are unique per block; their size Nn is determined by the AEAD
algorithm (see <xref target="iana-aead"/>).  Encryptors <bcp14>MUST</bcp14> ensure nonce uniqueness
within each block_key(i)'s lifetime (<xref target="epoch-key-derivation"/>).</t>
          <t>The per-block encryption produces:</t>
          <artwork><![CDATA[
(ciphertext_i, tag_i) = AEAD.Seal(key   = block_key(i),
                                   nonce = nonce_i,
                                   aad   = aad_i,
                                   pt    = plaintext_block_i)
]]></artwork>
          <t>See <xref target="epoch-key-derivation"/> for block_key(i).  AEAD.Seal returns
(ciphertext, tag) where tag is the final 16 octets of the combined
AEAD output per <xref target="RFC5116"/>.  Implementations receiving a single
output <bcp14>MUST</bcp14> split at offset len(output) - 16.</t>
          <t>For non-NMR AEADs, Encryptors <bcp14>MUST</bcp14> use one of the nonce
constructions defined in <xref target="nonce-constructions"/>.  Each block's
nonce and tag are stored:</t>
          <artwork><![CDATA[
block_metadata_i = nonce_i || tag_i      (Nn + 16 octets)
]]></artwork>
          <t>Where nonce_i is Nn random octets and aad_i is defined below.  In
armored mode, blocks are stored as <tt>nonce_i || ciphertext_i || tag_i</tt>.
In binary mode, the block metadata (nonce + tag) is stored separately
from the ciphertext to enable single-seek block access.</t>
          <t>For NMR AEADs, per-block nonces are derived deterministically
from nonce_base (<xref target="payload-schedule"/>):</t>
          <artwork><![CDATA[
nonce_i = nonce_base XOR uint64(i)
]]></artwork>
          <t>The XOR is applied to the last 8 octets of nonce_base;
leading octets are unchanged.  Nonces are not stored;
only the authentication tag is kept:</t>
          <artwork><![CDATA[
block_metadata_i = tag_i                 (16 octets)
]]></artwork>
          <t>See <xref target="nonce-generation-and-cek-reuse"/> for security rationale.</t>
          <t>This design enables re-encryption of the payload without re-wrapping
the CEK for each recipient, and supports selective editing of
individual blocks.  For non-NMR AEADs, per-block random nonces
allow CEK reuse across payload revisions while maintaining AEAD
security.</t>
        </section>
        <section anchor="nonce-constructions">
          <name>Nonce Constructions</name>
          <t>Two nonce constructions are defined for non-NMR block encryption.  Both
produce Nn-octet nonces suitable for use with the configured AEAD.
Decryptors read the stored nonce from each block and do not need to know
which construction was used.</t>
          <section anchor="base-xor-nonce">
            <name>Base-XOR Construction</name>
            <artwork><![CDATA[
base    = SafeRandom(Nn, "SAFE-NONCE")
nonce_i = base XOR uint64(i)
]]></artwork>
            <t>The XOR is applied to the last 8 octets of <tt>base</tt>; leading octets are
unchanged.  Within a single file, the XOR with distinct block indices
guarantees nonce uniqueness.</t>
            <t>This construction is one-pass and supports parallel block encryption.</t>
          </section>
          <section anchor="plaintext-bound-nonce">
            <name>Plaintext-Bound Construction</name>
            <t>Encryptors <bcp14>SHOULD</bcp14> incorporate plaintext into per-block nonce derivation
for SIV-like nonce-misuse resistance when RNG state duplication is a
concern (e.g., VM snapshots, process forks without reseed).  This
requires two passes over each block (hash then encrypt).</t>
            <t>The construction proceeds in two steps:</t>
            <artwork><![CDATA[
;; Pass 1: hash the plaintext block
pt_hash_i = SafeDerive("SAFE-NONCE",
    plaintext_i, encryption_parameters, 32)

;; Pass 2: derive the nonce
nonce_ctx = Encode("SAFE-NONCE",
    I2OSP(i, 8), pt_hash_i)
nonce_i   = SafeDerive("nonce",
    [SafeRandom(Nn, "SAFE-NONCE"),
     payload_key],
    [...encryption_parameters, nonce_ctx],
    Nn)
]]></artwork>
            <t>Pass 1 commits to the plaintext via a SafeDerive hash bound to the
suite.  Pass 2 mixes fresh randomness, the payload key, and the
plaintext hash into the final nonce.  Under RNG state duplication, this
construction produces different nonces when plaintext differs, limiting
exposure to leaking equality of identical blocks at the same index.</t>
          </section>
        </section>
        <section anchor="block-rewrite">
          <name>Block Rewrite Rules</name>
          <t>When re-encrypting a modified block, the procedure depends on the
AEAD's nonce-misuse resistance property.</t>
          <t>For non-NMR AEADs (stored nonce required):</t>
          <artwork><![CDATA[
Rewriting block i:
  old_tag  = stored tag_i
  nonce_i  = SafeRandom(Nn, "SAFE-NONCE")
  (ct, new_tag) = AEAD.Seal(block_key(i), nonce_i,
                      data_aad(i, is_final),
                      new_plaintext)
  Update stored nonce_i and tag_i
  Update accumulator ({{snapshot-accumulator}})
]]></artwork>
          <t>For NMR AEADs (derived nonce; Key-Epoch <bcp14>MUST</bcp14> be absent):</t>
          <artwork><![CDATA[
Rewriting block i:
  old_tag  = stored tag_i
  nonce_i  = nonce_base XOR uint64(i)
  (ct, new_tag) = AEAD.Seal(block_key(i), nonce_i,
                      data_aad(i, is_final),
                      new_plaintext)
  Update stored tag_i
  Update accumulator ({{snapshot-accumulator}})
]]></artwork>
          <t>NMR rewrites reuse the derived nonce for that block index.  Because
the AEAD is nonce-misuse resistant, this degrades to deterministic
encryption: identical plaintext at the same index produces identical
ciphertext, leaking equality but not content.  See
<xref target="derived-nonces-security"/>.</t>
        </section>
        <section anchor="snapshot-accumulator">
          <name>Snapshot Accumulator</name>
          <t>The snapshot accumulator binds all block authentication
tags into a single value, providing file-level integrity
without decrypting every block.  It uses SafeDerive and
XOR; no additional primitives are needed.</t>
          <t>For each block i with authentication tag tag_i, the per-block
contribution is:</t>
          <artwork><![CDATA[
contrib_i = SafeDerive("acc_contrib", acc_key,
                [uint64(i), tag_i], Nh)
]]></artwork>
          <t>The accumulator is the XOR of all contributions:</t>
          <artwork><![CDATA[
accumulator = contrib_0 XOR contrib_1
              XOR ... XOR contrib_{N-1}
]]></artwork>
          <t>XOR is commutative and associative: blocks may be processed in
any order, and a single contribution can be replaced without
reprocessing other blocks.  The result is Nh octets (32 for all
registered Hash algorithms).</t>
          <t>When re-encrypting block i with new tag new_tag_i (replacing old tag
old_tag_i):</t>
          <artwork><![CDATA[
old_c = SafeDerive("acc_contrib", acc_key,
            [uint64(i), old_tag_i], Nh)
new_c = SafeDerive("acc_contrib", acc_key,
            [uint64(i), new_tag_i], Nh)
accumulator = accumulator XOR old_c XOR new_c
]]></artwork>
          <t>This update costs two SafeDerive calls and two XOR operations,
independent of the total block count.</t>
          <t>Verification:</t>
          <ol spacing="normal" type="1"><li>
              <t>Derive acc_key from the CEK and salt (<xref target="payload-schedule"/>).</t>
            </li>
            <li>
              <t>Read all stored tags from block metadata.</t>
            </li>
            <li>
              <t>Compute the accumulator by XOR-combining per-block contributions.</t>
            </li>
            <li>
              <t>Compare the result to the stored accumulator.  If they differ,
at least one block has been modified, replaced, or is missing.</t>
            </li>
          </ol>
          <t>The accumulator is a PRF-based XOR-checksum over the set of (index, tag)
pairs.  Each contribution is a PRF output under acc_key with unique
inputs; an adversary who does not know acc_key cannot predict any
individual contribution and therefore cannot forge a valid accumulator
value.
Decryptors <bcp14>MUST</bcp14> verify the accumulator before per-block decryption
when the full set of block tags is available.  Streaming Decryptors
that process blocks incrementally <bcp14>MUST</bcp14> verify the accumulator once
all blocks have been processed.</t>
        </section>
        <section anchor="data-aad">
          <name>Block AAD</name>
          <t>For block index i in the range 0 &lt;= i &lt; N, the associated data binds
each block to its position and indicates whether it is the final block:</t>
          <artwork><![CDATA[
data_aad(i, is_final) = Encode("SAFE-DATA",
    I2OSP(i, 8), I2OSP(is_final, 1))
]]></artwork>
          <t>Where I2OSP(i, 8) is the block index in network byte order
and is_final is 0x01 for the last block (index N-1) and 0x00
for all preceding blocks.  Encode provides prefix-free
framing via lp16 (<xref target="notation"/>).  No KDF call is needed:
payload_key already depends on encryption_parameters
(<xref target="payload-schedule"/>), and the AEAD tag authenticates
the AAD under that key.</t>
          <t>The is_final flag provides truncation detection: if a Decryptor
decrypts block i with is_final=0 and no subsequent block exists,
truncation has occurred.  Decryptors <bcp14>MUST</bcp14> abort when truncation
is detected (is_final=0 with no successor block).  For
random-access reads, Decryptors <bcp14>SHOULD</bcp14> verify that the block
count N in the metadata matches the actual number of blocks.
The flag also prevents extension attacks: appending blocks
after a block marked is_final=1 will fail AEAD verification.</t>
          <t>For streaming writes where the total block count is unknown,
Encryptors buffer the last block until more data arrives or the
stream ends.  All emitted blocks use is_final=0; only when
the stream closes does the Encryptor encrypt the final block
with is_final=1.</t>
          <t>Encryptors <bcp14>MUST</bcp14> ensure block indices remain below 2^64.  Encryptors
<bcp14>SHOULD</bcp14> limit i to at most 2^48 to avoid Base64 strings exceeding typical
filesystem or object store limits; this is a practical recommendation,
not a protocol limit.  Decryptors <bcp14>MUST</bcp14> reject block indices i where i &gt;=
2^64.</t>
        </section>
      </section>
    </section>
    <section anchor="file-layout">
      <name>File Layout</name>
      <t>A SAFE encoding <bcp14>MUST</bcp14> consist of an optional config header
(<xref target="safe-config"/>), followed by one or more LOCK blocks (<xref target="safe-lock"/>),
followed by exactly one DATA block (<xref target="payload-layouts"/>).  Blocks <bcp14>MUST</bcp14>
appear in this order; Decryptors <bcp14>MUST</bcp14> reject encodings that violate it.
There is no version marker in the fences.  Multiple LOCK blocks provide
multi-recipient encryption; the DATA block is shared.</t>
      <section anchor="safe-config">
        <name>SAFE CONFIG</name>
        <t>The config header may be omitted when all defaults apply.  When present,
it lists only non-default parameters.  The config does not need to be
parsed before attempting decryption if the Decryptor already knows or
can infer the default parameters.</t>
        <t>The header is:</t>
        <artwork><![CDATA[
-----BEGIN SAFE CONFIG-----
AEAD: aes-256-gcm | chacha20-poly1305 | ...
Block-Size: 16384 | 65536
Hash: sha-256 | turboshake256
Key-Epoch: <non-negative integer>
Lock-Encoding: armored | readable
Data-Encoding: armored | binary | binary-linear
-----END SAFE CONFIG-----
]]></artwork>
        <t>All CONFIG fields are optional.  Omitted fields use default values
(<xref target="default-parameters"/>): AEAD defaults to aes-256-gcm, Block-Size to
65536, Hash to sha-256, Lock-Encoding to armored,
and Data-Encoding to armored.  Hash selects the hash function used
throughout the protocol (<xref target="hash-function"/>); any identifier in the
SAFE KDF Identifiers registry (<xref target="iana-hash"/>) is valid.
Lock-Encoding specifies the LOCK block representation (<xref target="safe-lock"/>).
Data-Encoding specifies the payload format (<xref target="data-encoding"/>):
"armored" uses Base64 within DATA fence markers, "binary" uses
block-aligned raw binary after the last LOCK, and "binary-linear" uses
sequential raw binary after the last LOCK.  The encoding fields
are presentational choices that do not affect cryptographic
operations.</t>
        <t>Key-Epoch enables per-epoch key derivation
(<xref target="epoch-key-derivation"/>).  When absent, all blocks use the
payload key directly.  When present, it is a non-negative integer
r where r <bcp14>MUST</bcp14> be less than 64; Decryptors <bcp14>MUST</bcp14> reject files where
Key-Epoch is 64 or greater.  Block i uses an epoch key derived
from the payload key with epoch index i &gt;&gt; r, giving each epoch
2^r blocks and limiting AEAD invocations per key
(<xref target="aead-usage-bounds"/>).  Key-Epoch <bcp14>MUST NOT</bcp14> be present for NMR
AEADs; Decryptors <bcp14>MUST</bcp14> reject files where Key-Epoch is present
and the AEAD has NMR=Yes in <xref target="aead-summary"/>.  Encryptors using
chacha20-poly1305 <bcp14>MUST</bcp14> include Key-Epoch; Section 4 of <xref target="RFC8439"/>
requires nonce uniqueness per key, and epoch keys limit the
collision domain to rewrites within each epoch.  Encryptors using
aes-256-gcm <bcp14>SHOULD</bcp14> include Key-Epoch for rewritable files to stay
within the per-key invocation limits of <xref target="NIST-SP-800-38D"/>; see
<xref target="epoch-key-rotation"/> for budget calculations.  Key-Epoch: 0 is
<bcp14>RECOMMENDED</bcp14> for maximum security; Key-Epoch: 5 is a practical
alternative when key-derivation overhead matters.</t>
        <t>NMR AEADs (NMR=Yes in <xref target="aead-summary"/>) implicitly use derived
nonces: per-block nonces are computed from the key schedule and
block index, and the format nonce length is 0 (nonces are not
serialized).  Non-NMR AEADs use stored random nonces.  See
<xref target="per-block-nonces"/> for details.</t>
        <t>Implementations <bcp14>MUST</bcp14> support Lock-Encoding: armored and
Data-Encoding: armored.  Support for Lock-Encoding: readable and
Data-Encoding: binary or binary-linear is <bcp14>OPTIONAL</bcp14>.</t>
        <t>A conforming SAFE file <bcp14>MAY</bcp14> omit the SAFE CONFIG block entirely; parsers
<bcp14>MUST</bcp14> treat this identically to a CONFIG block with all defaults.  When
CONFIG is present, it <bcp14>MAY</bcp14> contain any subset of fields.  Implementations
<bcp14>MUST</bcp14> construct encryption_parameters using defaults for any omitted
fields.</t>
        <t>Field names within the SAFE CONFIG are case-sensitive.  Encryptors
<bcp14>MUST NOT</bcp14> include duplicate field names; Decryptors <bcp14>MUST</bcp14> reject SAFE
config blocks containing duplicate fields.  Decryptors <bcp14>MUST</bcp14> reject
SAFE CONFIG blocks containing field names not listed in the SAFE
Config Options registry (<xref target="iana-config"/>).</t>
        <t>The order of fields within a CONFIG block is not
significant.  Encryptors <bcp14>MAY</bcp14> emit fields in any order;
Decryptors <bcp14>MUST</bcp14> accept fields in any order.</t>
        <t>All header lines <bcp14>MUST</bcp14> contain only ASCII characters (octets 0x20-0x7E
and LF).  Encryptors <bcp14>MUST NOT</bcp14> include non-ASCII characters in field
names or values.  Decryptors <bcp14>MUST</bcp14> reject SAFE CONFIG blocks
containing non-ASCII octets or malformed UTF-8 sequences.</t>
        <t>Implementations <bcp14>SHOULD</bcp14> bound SAFE CONFIG size;
Decryptors <bcp14>MAY</bcp14> reject SAFE CONFIG headers exceeding
64 KiB.</t>
        <t>Field values <bcp14>MAY</bcp14> wrap across multiple lines using the same rules as
LOCK blocks (<xref target="line-wrapping"/>): continuation lines <bcp14>MUST</bcp14> be
indented with at least two spaces, and Decryptors <bcp14>MUST</bcp14> concatenate
continuation lines (stripping leading whitespace) before processing.</t>
        <section anchor="block-size-selection">
          <name>Block-Size Selection</name>
          <t>SAFE defines two Block-Size values: 16384 and 65536.  Only these
values are valid; Decryptors <bcp14>MUST</bcp14> reject any other Block-Size.
Adding new Block-Size values requires Standards Action.</t>
          <dl>
            <dt>65536 (default):</dt>
            <dd>
              <t>Larger blocks amortize per-block AEAD overhead and reduce I/O
syscalls, yielding higher throughput for sequential encrypt and
decrypt.  This value is appropriate when the payload will be
decrypted in full or streamed sequentially.</t>
            </dd>
            <dt>16384:</dt>
            <dd>
              <t>Smaller blocks reduce the cost of partial updates.  Re-encrypting a
modified block requires reading and rewriting only that block; at
16384 octets the I/O cost per edit is one quarter of the default.
Applications that perform random-access writes to encrypted data
<bcp14>SHOULD</bcp14> use Block-Size 16384.</t>
            </dd>
          </dl>
          <t>Both values align to hardware page boundaries.  Block-Size 16384
is one page on systems with 16 KiB pages (e.g., Apple Silicon) and
four pages on systems with 4 KiB pages (e.g., x86-64).  Block-Size
65536 is four pages and sixteen pages, respectively.  This alignment
avoids page-crossing penalties with direct I/O or memory-mapped
access.</t>
          <t>The Encryptor selects Block-Size at encryption time.  The value is
recorded in the SAFE CONFIG and applies to all recipients.  There
is no mechanism to change Block-Size after encryption without
re-encrypting the entire payload.</t>
        </section>
      </section>
      <section anchor="safe-lock">
        <name>SAFE LOCK</name>
        <t>A LOCK block defines the unlock steps for a single recipient and
carries the artifacts needed to recover the CEK.  Each LOCK
contains one or more steps and exactly one Encrypted-CEK.</t>
        <t>Steps are evaluated in the order they appear.  Step-specific inputs
are carried as parameters (e.g., <tt>salt=</tt> for pass, <tt>kemct=</tt> for
hpke).  See <xref target="passphrase-step"/> and <xref target="hpke-step"/> for step-specific
requirements.</t>
        <t>The Encrypted-CEK is the concatenation of lock_nonce and the AEAD
ciphertext of the CEK under the derived KEK with empty associated
data (<xref target="sealing-encrypted-cek"/>).  The lock_nonce length is the
AEAD's nonce size (Nn) as specified in <xref target="iana-aead"/>.  Encryptors
<bcp14>MUST</bcp14> generate a fresh lock_nonce per LOCK using <tt>SafeRandom(Nn,
"SAFE-LOCK-NONCE")</tt> (<xref target="random-generation"/>).  Decryptors <bcp14>MUST</bcp14>
reject Encrypted-CEK values that do not decode to exactly
Nn + 32 + 16 octets (lock_nonce, CEK ciphertext, AEAD tag).</t>
        <t>Decryptors <bcp14>MUST</bcp14> skip LOCK blocks containing unknown KEM identifiers
or unknown step types, and attempt other LOCKs (if available).
Decryptors <bcp14>MUST</bcp14> reject step tokens containing parameter names not
defined for the step type in its registration.</t>
        <t>Implementations <bcp14>SHOULD</bcp14> bound the number of LOCK blocks; Decryptors
<bcp14>MAY</bcp14> reject files containing more than 1024 LOCK blocks to prevent
resource exhaustion.</t>
        <t>Two Lock-Encoding values are defined: readable (text) and armored
(binary).  Both produce the same binding step_tokens for the KEK
schedule (<xref target="steps"/>).</t>
        <section anchor="readable-lock-format">
          <name>Readable Format</name>
          <t>The readable format uses text step tokens and colon-delimited
fields:</t>
          <artwork><![CDATA[
-----BEGIN SAFE LOCK-----
Step: pass(kdf=argon2id, salt=<Base64>)
Step: hpke(kem=x25519, id=<Base64>, kemct=<Base64>)
Encrypted-CEK: <Base64>
-----END SAFE LOCK-----
]]></artwork>
          <t>Field names are case-sensitive.  Encryptors <bcp14>MUST NOT</bcp14> include fields
other than Step and Encrypted-CEK.  Encryptors <bcp14>MUST</bcp14> include at
least one Step line and exactly one Encrypted-CEK line.  Decryptors
<bcp14>MUST</bcp14> reject LOCK blocks containing multiple Encrypted-CEK lines or
unknown field names.  Optional whitespace (OWS) after colons and
commas is permitted for readability.</t>
          <section anchor="step-syntax">
            <name>Step Syntax</name>
            <t>Each Step line declares a single cryptographic step.  Multiple
steps form an ordered sequence with AND semantics: all steps <bcp14>MUST</bcp14>
be satisfied to derive the KEK.  The syntax follows this ABNF,
which applies after Decryptors perform line unfolding (concatenating
continuation lines and stripping leading whitespace per
<xref target="line-wrapping"/>):</t>
            <artwork><![CDATA[
step-line       = "Step:" OWS step-token LF
step-token      = step-name "(" step-params ")"
step-name       = 1*( ALPHA / DIGIT / "-" )
step-params     = param *( "," OWS param )
param           = param-name "=" param-value
param-name      = 1*( ALPHA / DIGIT / "-" )
param-value     = 1*PCHAR
PCHAR           = %x21-28 / %x2A-2B / %x2D-7E
                    ; VCHAR except SP, ")", ","
OWS             = *( SP / HTAB )
]]></artwork>
            <t>The binding step_token used in the KEK schedule (<xref target="kek-schedule"/>)
is derived per <xref target="steps"/>: extract the binding fields and encode them
with Encode().</t>
            <t>Each Step line contains exactly one step token.  LOCK blocks with
multiple steps use multiple Step lines.  Step-specific inputs are
carried as step token parameters (e.g., <tt>salt=</tt> for pass, <tt>kemct=</tt>
for hpke).</t>
            <t>The param-value production forbids spaces (SP, 0x20) and tabs
(HTAB, 0x09).  Percent-encoding is not supported; all parameter
values <bcp14>MUST</bcp14> be literal UTF-8 printable characters excluding
whitespace.</t>
            <t>Encryptors <bcp14>MUST</bcp14> emit parameters in the order specified by the step
definition.  Decryptors <bcp14>MUST</bcp14> reject step tokens whose parameters
are not in the specified order.  Decryptors <bcp14>MUST</bcp14> reject step tokens
containing duplicate parameter names within a single step.</t>
            <t>See <xref target="key-schedules"/> for how step secrets are combined to derive
the KEK.  See <xref target="hpke-step"/> for the HPKE step format and
<xref target="passphrase-step"/> for the passphrase step format.</t>
          </section>
          <section anchor="line-wrapping">
            <name>Line Wrapping</name>
            <t>Field values <bcp14>MAY</bcp14> wrap across multiple lines.  Continuation lines
<bcp14>MUST</bcp14> be indented with at least two spaces.  Decryptors <bcp14>MUST</bcp14> unfold
wrapped values by concatenating continuation lines and stripping
leading whitespace.</t>
            <ul spacing="normal">
              <li>
                <t>Step tokens <bcp14>MAY</bcp14> wrap at parameter boundaries
(after commas).  Encryptors <bcp14>SHOULD</bcp14> insert a space
after the comma at each wrap point.  Continuation
lines use 4-space indent.</t>
              </li>
              <li>
                <t>Encrypted-CEK values use 2-space indent for
continuation lines.</t>
              </li>
            </ul>
            <t>Encryptors <bcp14>SHOULD</bcp14> wrap lines at 64 characters.
Decryptors <bcp14>MUST</bcp14> accept any line length.</t>
            <t>A field value extends from immediately after the colon (and any
following whitespace) until one of:</t>
            <ol spacing="normal" type="1"><li>
                <t>A line starting with "Step:" (unindented)</t>
              </li>
              <li>
                <t>A line starting with "Encrypted-CEK:" (unindented)</t>
              </li>
              <li>
                <t>A fence line "-----END SAFE LOCK-----"</t>
              </li>
            </ol>
            <t>Trailing whitespace on individual lines <bcp14>SHOULD</bcp14> be avoided;
Decryptors <bcp14>MUST</bcp14> strip trailing spaces and tabs from each line
before concatenation.</t>
            <t>Example with wrapped HPKE step token:</t>
            <artwork><![CDATA[
Step: hpke(kem=ml-kem-768, hint=4217,
    kemct=bWxrZW03NjhrZW1jaXBoZXJ0ZXh0
    ZXh0cmVtZWx5bG9uZ2JhY2U2NGVuY29kZW
    RkYXRhYXBwcm94aW1hdGVseTEwODhvY3Rl
    dHNmb3JwcXNlY3VyaXR5)
]]></artwork>
            <t>Decryptors parse the text, extract field values, and produce the
step Encode form for binding.</t>
          </section>
        </section>
        <section anchor="armored-lock-format">
          <name>Armored Format</name>
          <t>When Lock-Encoding is armored, the SAFE LOCK block contains a
single Base64 value.  The value is the Base64 encoding of the
Encode-serialized LOCK:</t>
          <artwork><![CDATA[
armored_lock = Base64(
    Encode(step_1, step_2, ..., encrypted_cek))
]]></artwork>
          <t>Each step_i is the binding Encode form (excluding display-only
fields) as defined in the step's specification.  The encrypted_cek
is the raw Encrypted-CEK octets (lock_nonce || ciphertext).</t>
          <t>Decryptors decode the Base64, split the outer Encode into
lp16-framed elements.  The last element is the Encrypted-CEK;
preceding elements are step tokens.  Each step token is itself an
Encode whose first element is the step name.</t>
          <t>Encryptors <bcp14>MUST</bcp14> use Base64 with padding per <xref target="RFC4648"/>.  The
Base64 value <bcp14>MAY</bcp14> wrap across multiple lines; continuation lines
<bcp14>MUST</bcp14> be indented with at least two spaces.  Decryptors <bcp14>MUST</bcp14>
concatenate continuation lines (stripping leading whitespace)
before decoding.</t>
        </section>
        <section anchor="recipient-discovery">
          <name>LOCK Selection</name>
          <t>A decryptor determines candidate LOCK blocks without touching the
SAFE data block.</t>
          <section anchor="candidate-selection">
            <name>Candidate Selection</name>
            <t>For each LOCK block, determine candidacy as follows:</t>
            <ol spacing="normal" type="1"><li>
                <t>Parse the Step tokens.  If any token references an unsupported
step type, the LOCK is not a candidate.</t>
              </li>
              <li>
                <t>For each hpke(...) step, determine candidate keys based on mode:  </t>
                <dl>
                  <dt>Identified (<tt>id</tt> present):</dt>
                  <dd>
                    <t>Compute the key identifier for locally available
public keys using SafeDerive("SAFE-SPKI-v1",
spki_der, "", 32) with the configured Hash (default:
sha-256).  Keys whose identifier matches the <tt>id</tt>
parameter are candidates.</t>
                  </dd>
                  <dt>Hinted (<tt>hint</tt> present):</dt>
                  <dd>
                    <t>Look up keys in local storage associated with this hint value.
Keys with matching hint are candidates.</t>
                  </dd>
                  <dt>Anonymous (neither <tt>id</tt> nor <tt>hint</tt>):</dt>
                  <dd>
                    <t>All local keys matching the <tt>kem</tt> type are candidates.</t>
                  </dd>
                </dl>
                <t>
If no local recipient keys are candidates, the LOCK is not a
candidate.  </t>
                <t>
For auth-mode hpke(...) steps (sid or shint present),
also determine candidate sender keys:  </t>
                <dl>
                  <dt>Identified (<tt>sid</tt> with Base64 value):</dt>
                  <dd>
                    <t>Keys whose identifier matches <tt>sid</tt> are candidates.</t>
                  </dd>
                  <dt>Hinted (<tt>shint</tt> present):</dt>
                  <dd>
                    <t>Keys with matching shint are candidates.</t>
                  </dd>
                  <dt>Anonymous (<tt>sid=anon</tt>):</dt>
                  <dd>
                    <t>All locally known sender keys matching the <tt>kem</tt>
type are candidates.</t>
                  </dd>
                </dl>
                <t>
If no sender keys are candidates for an auth-mode step, the
LOCK is not a candidate.</t>
              </li>
              <li>
                <t>For pass(...) steps: the LOCK is a candidate if the
implementation supports passphrase entry.</t>
              </li>
              <li>
                <t>For other registered steps: the LOCK is a candidate if the
implementation supports them and local policy permits.</t>
              </li>
            </ol>
          </section>
          <section anchor="attempt-order">
            <name>Attempt Order</name>
            <t>Among remaining candidates, Decryptors <bcp14>SHOULD</bcp14> attempt LOCKs in order
of confidence:</t>
            <ol spacing="normal" type="1"><li>
                <t>LOCKs where all hpke steps are identified or hinted; the
decryptor has confirmed it holds matching keys.</t>
              </li>
              <li>
                <t>LOCKs with anonymous hpke steps; requires trial decryption
across all keys of the matching KEM type.</t>
              </li>
              <li>
                <t>LOCKs with pass steps; may require user interaction,
so defer until key-only LOCKs are exhausted.</t>
              </li>
            </ol>
            <t>Encryptors <bcp14>MAY</bcp14> include multiple pass(...)-only LOCK blocks if they use
different KDF variants (e.g., one pass(kdf=argon2id, ...) and one
pass(kdf=pbkdf2, ...) for the same passphrase).  This enables
interoperability between implementations with different passphrase
KDF support.  Encryptors
<bcp14>MUST NOT</bcp14> include duplicate pass(...)-only LOCKs with the same KDF
variant.
Decryptors <bcp14>MUST</bcp14> stop at the first successful CEK recovery.  Decryptors
<bcp14>MAY</bcp14> attempt multiple candidates in parallel.</t>
          </section>
          <section anchor="trial-decryption">
            <name>Trial Decryption</name>
            <t>For hinted or anonymous step sequences, Decryptors iterate through
candidate key combinations.  For composable step sequences (multiple
hpke steps with AND semantics), trial decryption <bcp14>MUST</bcp14> consider the
combinatorial product of candidates for each step.  For auth-mode
steps, the product includes sender key candidates in addition to
recipient key candidates.  For each combination:</t>
            <ol spacing="normal" type="1"><li>
                <t>Establish an HPKE context for each hpke(...) step via
SetupBaseR (or SetupAuthR with the candidate sender key
for auth-mode steps) and call Export per <xref target="hpke-exporter"/></t>
              </li>
              <li>
                <t>Derive the KEK by aggregating step secrets per <xref target="kek-schedule"/></t>
              </li>
              <li>
                <t>Attempt to open Encrypted-CEK with the derived KEK</t>
              </li>
            </ol>
            <t>A candidate succeeds when AEAD tag verification passes on Encrypted-CEK.
If the KEK is wrong, the tag will not verify.</t>
          </section>
        </section>
      </section>
      <section anchor="data-encoding">
        <name>Data Encoding</name>
        <t>The Data-Encoding CONFIG field specifies how the payload is
represented.  SAFE defines two payload layouts: linear concatenates
encrypted blocks sequentially, while aligned adds padding for
block-aligned random access.  Three encoding values are defined:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Layout</th>
              <th align="left">Representation</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">armored</td>
              <td align="left">linear</td>
              <td align="left">Base64 within fence markers</td>
            </tr>
            <tr>
              <td align="left">binary</td>
              <td align="left">aligned</td>
              <td align="left">Raw binary, block-aligned</td>
            </tr>
            <tr>
              <td align="left">binary-linear</td>
              <td align="left">linear</td>
              <td align="left">Raw binary, sequential</td>
            </tr>
          </tbody>
        </table>
        <t>The default is "armored" when Data-Encoding is omitted.</t>
        <section anchor="armored-encoding">
          <name>Armored Encoding</name>
          <t>Armored encoding wraps the linear layout (<xref target="linear-layout"/>) in
Base64 with fence markers:</t>
          <artwork><![CDATA[
-----BEGIN SAFE DATA-----
<Base64: linear_payload>
-----END SAFE DATA-----
]]></artwork>
          <t>The Base64 string <bcp14>MAY</bcp14> be wrapped across multiple lines for
readability.  When wrapped, each line break <bcp14>MUST</bcp14> be a single LF
character.  For length calculations and random-access arithmetic,
Decryptors <bcp14>MUST</bcp14> first remove all line breaks (LF and CRLF) and CR
octets (0x0D), then strip trailing whitespace from the result.  The
normalized string length determines padding and block offset
computations.  Decryptors <bcp14>MUST</bcp14> ignore these characters during Base64
decoding and concatenate all lines before decoding.</t>
          <t>Encryptors <bcp14>SHOULD</bcp14> wrap Base64 lines at 64 characters.  Decryptors
<bcp14>MUST</bcp14> accept any line length.</t>
          <t>Implementations <bcp14>MAY</bcp14> enforce an upper bound on payload size to prevent
over-allocation; Decryptors <bcp14>MAY</bcp14> reject payloads exceeding 64 TiB of
ciphertext.</t>
          <t>Armored data arithmetic (computing block count, byte-to-Base64
offsets, and per-block decryption) is detailed in
<xref target="armored-data-arithmetic"/>.</t>
        </section>
        <section anchor="binary-encoding">
          <name>Binary Encoding</name>
          <t>Binary encoding omits fence markers.  Binary data begins at the octet
immediately following the LF (0x0A) that terminates the last
<tt>-----END SAFE ...-----</tt> line (typically the final LOCK block).
Binary data ends at EOF.</t>
          <t>Two variants exist:</t>
          <dl>
            <dt><tt>Data-Encoding: binary</tt></dt>
            <dd>
              <t>Uses the aligned layout (<xref target="aligned-layout"/>).  Optimized for
random access to large files via memory-mapped I/O or O_DIRECT.</t>
            </dd>
            <dt><tt>Data-Encoding: binary-linear</tt></dt>
            <dd>
              <t>Uses the linear layout (<xref target="linear-layout"/>).  Suitable for streaming
or simple implementations that do not require block-aligned
random access.</t>
            </dd>
          </dl>
          <t>Implementations that do not support binary encoding <bcp14>MUST</bcp14> fail when
encountering <tt>Data-Encoding: binary</tt> or <tt>Data-Encoding: binary-linear</tt>,
consistent with the handling of unknown AEAD or Hash values.</t>
          <t>Encryptors <bcp14>SHOULD</bcp14> prefer armored encoding for maximum compatibility.
Binary encoding is intended for performance-critical applications or
programmatic access where human readability is not required.</t>
        </section>
      </section>
      <section anchor="payload-layouts">
        <name>Payload Layouts</name>
        <t>SAFE defines two payload layouts that describe how encrypted blocks
are structured.</t>
        <section anchor="linear-layout">
          <name>Linear Layout</name>
          <t>The linear layout concatenates encrypted blocks sequentially with no
padding or alignment constraints:</t>
          <artwork><![CDATA[
[salt] [commitment] [accumulator] [eb_0] [eb_1] ... [eb_{N-1}]

For non-NMR AEADs:

    eb_i = nonce_i || ciphertext_i || tag_i    (Nn + len(pt_i) + 16)

For NMR AEADs:

    eb_i = ciphertext_i || tag_i               (len(pt_i) + 16)
]]></artwork>
          <t>The payload begins with a 32-octet salt, a 32-octet commitment
(both derived per <xref target="payload-schedule"/>), and the Nh-octet
accumulator (<xref target="snapshot-accumulator"/>), followed by encrypted
blocks.</t>
          <t>For non-NMR AEADs, each encrypted block (eb_i) is Nn +
len(plaintext_i) + 16 octets.  For NMR AEADs, each encrypted block
is len(plaintext_i) + 16 octets (nonces are derived, not stored).</t>
          <t>Decryptors <bcp14>MUST</bcp14> verify the commitment before decryption and <bcp14>MUST</bcp14> reject
the file if the derived commitment does not match the stored value.
See <xref target="key-commitment"/>.</t>
          <t>All blocks except the final block contain Block-Size octets of
plaintext.  The final block <bcp14>MAY</bcp14> be smaller.  For non-NMR AEADs,
each encrypted block consists of a nonce (Nn octets), ciphertext
(same length as the plaintext), and authentication tag (16 octets).
For NMR AEADs, each encrypted block consists of ciphertext and
authentication tag only.</t>
          <t>Zero-length plaintexts are allowed.  A zero-length plaintext
produces N = 1, L_final = 0.  For non-NMR AEADs with Nn = 12,
the minimum payload is 124 octets (32-octet salt + 32-octet
commitment + 32-octet accumulator + 28-octet encrypted block).
For NMR AEADs, the minimum is 112 octets
(32 + 32 + 32 + 16).</t>
          <t>Decryptors <bcp14>MUST</bcp14> reject payloads with unexpected structure:
incorrect commitment length, missing or invalid accumulator,
or block boundaries that do not align with expected sizes.</t>
          <t>In binary-linear encoding the block count N is not stored explicitly.
Streaming readers determine N by reading blocks sequentially until EOF:
each non-final block is exactly C octets (Nn + B + 16 for non-NMR AEADs;
B + 16 for NMR AEADs).  The final block is smaller than C.</t>
        </section>
        <section anchor="aligned-layout">
          <name>Aligned Layout</name>
          <t>The aligned layout structures the file so that every ciphertext block
begins at an offset that is an exact multiple of the Block-Size B.
This alignment enables efficient memory-mapped I/O and O_DIRECT access,
since the operating system can read any block without copying data
across page boundaries.</t>
          <t>The file begins with a header section containing the text headers
(CONFIG and LOCK blocks) followed by binary fields: salt,
commitment, block count N, first ciphertext index D, per-block
metadata (nonces and tags), and the snapshot accumulator.  The
header is padded with zeros to a block boundary, followed by zero
or more padding blocks for append growth, then ciphertext blocks.</t>
          <t>Let B denote the Block-Size in octets (16384 or 65536).  Let Nn be
the nonce size (12 for AES-GCM and ChaCha20, 32 for AEGIS-256 and
AEGIS-256X2).  N is the block count (uint32), and D is the first
ciphertext block index (uint32).  Let meta_len be the per-block
metadata size: Nn + 16 for non-NMR AEADs, or 16 for NMR AEADs.</t>
          <t>Each row below represents one Block-Size:</t>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="240" width="456" viewBox="0 0 456 240" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,224" fill="none" stroke="black"/>
                <path d="M 120,32 L 120,56" fill="none" stroke="black"/>
                <path d="M 176,32 L 176,56" fill="none" stroke="black"/>
                <path d="M 280,32 L 280,56" fill="none" stroke="black"/>
                <path d="M 312,32 L 312,56" fill="none" stroke="black"/>
                <path d="M 344,32 L 344,56" fill="none" stroke="black"/>
                <path d="M 448,32 L 448,224" fill="none" stroke="black"/>
                <path d="M 8,32 L 448,32" fill="none" stroke="black"/>
                <path d="M 8,64 L 448,64" fill="none" stroke="black"/>
                <path d="M 8,96 L 448,96" fill="none" stroke="black"/>
                <path d="M 8,128 L 448,128" fill="none" stroke="black"/>
                <path d="M 8,160 L 448,160" fill="none" stroke="black"/>
                <path d="M 8,192 L 448,192" fill="none" stroke="black"/>
                <path d="M 8,224 L 448,224" fill="none" stroke="black"/>
                <g class="text">
                  <text x="64" y="52">CONFIG+LOCK</text>
                  <text x="148" y="52">salt</text>
                  <text x="228" y="52">commitment</text>
                  <text x="296" y="52">N</text>
                  <text x="328" y="52">D</text>
                  <text x="400" y="52">metadata...</text>
                  <text x="64" y="84">...metadata</text>
                  <text x="144" y="84">(cont.)</text>
                  <text x="184" y="84">|</text>
                  <text x="240" y="84">accumulator</text>
                  <text x="296" y="84">|</text>
                  <text x="336" y="84">padding</text>
                  <text x="48" y="116">padding</text>
                  <text x="120" y="116">(optional</text>
                  <text x="188" y="116">append</text>
                  <text x="248" y="116">growth)</text>
                  <text x="32" y="148">ct0</text>
                  <text x="32" y="180">ct1</text>
                  <text x="32" y="212">...</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+-------------+------+------------+---+---+------------+
| CONFIG+LOCK | salt | commitment | N | D | metadata...|
+------------------------------------------------------+
| ...metadata (cont.) | accumulator | padding          |
+------------------------------------------------------+
| padding (optional append growth)                     |
+------------------------------------------------------+
| ct0                                                  |
+------------------------------------------------------+
| ct1                                                  |
+------------------------------------------------------+
| ...                                                  |
+------------------------------------------------------+
]]></artwork>
          </artset>
          <t>Per-block metadata entry:</t>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="144" width="408" viewBox="0 0 408 144" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 152,32 L 152,64" fill="none" stroke="black"/>
                <path d="M 152,96 L 152,128" fill="none" stroke="black"/>
                <path d="M 208,96 L 208,128" fill="none" stroke="black"/>
                <path d="M 216,32 L 216,64" fill="none" stroke="black"/>
                <path d="M 272,32 L 272,64" fill="none" stroke="black"/>
                <path d="M 152,32 L 272,32" fill="none" stroke="black"/>
                <path d="M 152,64 L 272,64" fill="none" stroke="black"/>
                <path d="M 152,96 L 208,96" fill="none" stroke="black"/>
                <path d="M 152,128 L 208,128" fill="none" stroke="black"/>
                <g class="text">
                  <text x="32" y="36">Non-NMR</text>
                  <text x="92" y="36">AEADs:</text>
                  <text x="300" y="36">Nn</text>
                  <text x="320" y="36">+</text>
                  <text x="340" y="36">16</text>
                  <text x="380" y="36">octets</text>
                  <text x="184" y="52">nonce</text>
                  <text x="240" y="52">tag</text>
                  <text x="16" y="100">NMR</text>
                  <text x="60" y="100">AEADs:</text>
                  <text x="236" y="100">16</text>
                  <text x="276" y="100">octets</text>
                  <text x="176" y="116">tag</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Non-NMR AEADs:    +-------+------+  Nn + 16 octets
                  | nonce | tag  |
                  +-------+------+

NMR AEADs:        +------+  16 octets
                  | tag  |
                  +------+
]]></artwork>
          </artset>
          <t>The binary portion immediately follows the text headers:</t>
          <ul spacing="normal">
            <li>
              <t>salt (32 octets)</t>
            </li>
            <li>
              <t>commitment (32 octets)</t>
            </li>
            <li>
              <t>N: block count (uint32, big-endian)</t>
            </li>
            <li>
              <t>D: first ciphertext block index (uint32, big-endian)</t>
            </li>
            <li>
              <t>metadata: N entries, each meta_len octets</t>
            </li>
            <li>
              <t>accumulator: Nh octets (<xref target="snapshot-accumulator"/>)</t>
            </li>
            <li>
              <t>padding to block boundary, then zero or more padding blocks</t>
            </li>
            <li>
              <t>ciphertext blocks starting at offset (D × B)</t>
            </li>
          </ul>
          <t>The uint32 block count limits aligned-layout files to 2^32 - 1 blocks.
Files exceeding this count <bcp14>MUST</bcp14> use linear layout.</t>
          <section anchor="writing">
            <name>Writing</name>
            <t>To write an aligned-layout file, the Encryptor computes D as
follows.  Let H be the total header octet count: all CONFIG and
LOCK text (including fence markers and newlines), plus 32
(salt) + 32 (commitment) + 4 (N) + 4 (D) + N * meta_len
(metadata) + Nh (accumulator).  Then:</t>
            <artwork><![CDATA[
D = ceil(H / B)
]]></artwork>
            <t>Padding blocks for append growth <bcp14>MAY</bcp14> be added by increasing D
beyond the minimum value.  The encryptor writes the header, pads
to D * B octets, then writes ciphertext blocks at offsets D * B,
(D+1) * B, and so on.</t>
            <t>The aligned layout requires a seekable output.  For streaming
writes where N is unknown at the start, the Encryptor estimates
a maximum block count, computes D from that estimate, reserves
space for D, N, and metadata in the header, then seeks back to
fill the actual values once the stream closes.</t>
          </section>
          <section anchor="reading">
            <name>Reading</name>
            <t>To read an aligned-layout file:</t>
            <ol spacing="normal" type="1"><li>
                <t>Parse CONFIG and LOCK text to determine AEAD and Block-Size.</t>
              </li>
              <li>
                <t>Read the 32-octet salt, 32-octet commitment, N, and D.</t>
              </li>
              <li>
                <t>Read N metadata entries, each meta_len octets.</t>
              </li>
              <li>
                <t>Read the Nh-octet accumulator.</t>
              </li>
              <li>
                <t>Verify the accumulator (<xref target="snapshot-accumulator"/>).</t>
              </li>
              <li>
                <t>Ciphertext block i is at offset (D + i) × B.</t>
              </li>
            </ol>
            <t>To read only block i: for NMR AEADs, compute nonce_i from nonce_base
and the block index; for non-NMR AEADs, read the nonce from the
metadata entry.  Read the tag from the metadata entry in both cases.
Then read B octets (or fewer for the final block) at offset
(D + i) x B.  The final block's ciphertext length is
file_size - (D + N - 1) * B octets.</t>
          </section>
        </section>
      </section>
    </section>
    <section anchor="compatibility">
      <name>Compatibility and Migration</name>
      <section anchor="handling-unknown-elements">
        <name>Handling Unknown Elements</name>
        <t>Decryptors processing SAFE-encoded data <bcp14>MUST</bcp14>:</t>
        <ul spacing="normal">
          <li>
            <t>Fail if they encounter an unrecognized or unimplemented value
for any CONFIG field (AEAD, Hash, Data-Encoding, Lock-Encoding,
Block-Size).  Implementations <bcp14>MUST NOT</bcp14> silently ignore CONFIG
values they do not support.</t>
          </li>
          <li>
            <t>Reject Block-Size values other than 16384 or 65536.</t>
          </li>
          <li>
            <t>Skip LOCKs containing unknown field names, KEM identifiers, or step
types and attempt other LOCKs (if available).</t>
          </li>
          <li>
            <t>Fail if a CONFIG block contains field names not listed in the SAFE
Config Options registry (<xref target="iana-config"/>).</t>
          </li>
          <li>
            <t>Fail if the payload has unexpected structure (wrong commitment
length, trailing octets, misaligned block boundaries).</t>
          </li>
          <li>
            <t>Skip unknown block types if the IANA SAFE Block Types registry
(<xref target="iana-blocks"/>) marks them as Ignorable; otherwise fail.</t>
          </li>
        </ul>
      </section>
      <section anchor="versioning">
        <name>Versioning</name>
        <t>This document defines SAFE version 1, identified by fence markers
("-----BEGIN SAFE CONFIG-----", etc.).  Future incompatible versions
would use different fence markers or a new media type.  New features
<bcp14>SHOULD</bcp14> be added through IANA registries rather than format version
changes.</t>
      </section>
      <section anchor="extension-points">
        <name>Extension Points</name>
        <t>SAFE provides IANA registries for AEADs (<xref target="iana-aead"/>), KEMs
(<xref target="iana-kem"/>), step types (<xref target="iana-steps"/>), and block types
(<xref target="iana-blocks"/>).</t>
        <t>Unknown block types are critical by default: Decryptors <bcp14>MUST</bcp14> fail if
they encounter an unrecognized block.  The IANA SAFE Block Types
registry (<xref target="iana-blocks"/>) <bcp14>MAY</bcp14> mark specific block types as Ignorable,
enabling forward-compatible optional extensions such as metadata or
signatures that older implementations can safely skip.</t>
      </section>
      <section anchor="application-profiles">
        <name>Application Profiles</name>
        <t>This section is informative.  It describes three parameter
combinations for common deployment scenarios.  These profiles
compose the CONFIG fields defined in <xref target="safe-config"/>; they do not
introduce new protocol elements.</t>
        <section anchor="profile-objects">
          <name>Objects</name>
          <t>Applications that prioritize text-safe output and maximum
interoperability <bcp14>SHOULD</bcp14> use the default parameters
(<xref target="default-parameters"/>).  No CONFIG block is required.  The
resulting SAFE object is entirely printable ASCII and can be
embedded in email, JSON, YAML, or version-controlled files.
AES-256-GCM is the default AEAD (<xref target="default-parameters"/>).</t>
        </section>
        <section anchor="profile-streaming">
          <name>Streaming</name>
          <t>Applications that process data sequentially at high throughput
<bcp14>SHOULD</bcp14> consider:</t>
          <artwork><![CDATA[
-----BEGIN SAFE CONFIG-----
AEAD: aegis-256
Data-Encoding: binary-linear
-----END SAFE CONFIG-----
]]></artwork>
          <t>AEGIS-256 offers high throughput and a 32-octet nonce that
simplifies nonce management.  Combined with binary-linear
encoding (<xref target="linear-layout"/>), this yields minimal framing overhead
and sequential I/O without alignment padding.  Encryptors using
this profile <bcp14>SHOULD</bcp14> apply the hedged nonce construction
(<xref target="hedged-construction"/>) or plaintext-bound nonce construction
(<xref target="plaintext-bound-nonce"/>) per <xref target="nonce-generation-and-cek-reuse"/>.</t>
          <t>Encryptors targeting broad interoperability <bcp14>SHOULD</bcp14> verify recipient
support before selecting this profile.</t>
        </section>
        <section anchor="profile-edit">
          <name>Edit</name>
          <t>Applications that perform random-access reads and writes on
encrypted data <bcp14>SHOULD</bcp14> consider:</t>
          <artwork><![CDATA[
-----BEGIN SAFE CONFIG-----
AEAD: aes-256-gcm-siv
Block-Size: 16384
Data-Encoding: binary
-----END SAFE CONFIG-----
]]></artwork>
          <t>AES-256-GCM-SIV is nonce-misuse resistant (<xref target="aead-summary"/>),
so per-block nonces are derived rather than stored
(<xref target="per-block-nonces"/>).  This reduces per-block metadata from
Nn + 16 octets to 16 octets.  Block-Size 16384 aligns each
block to a single page on 16 KiB-page systems, minimizing
page faults per edit
(<xref target="block-size-selection"/>).  Binary aligned encoding
(<xref target="aligned-layout"/>) enables O(1) random access to any block via
memory-mapped I/O.</t>
          <t>Re-encrypting a modified block reuses the derived nonce for that
block index.  Because AES-256-GCM-SIV is nonce-misuse resistant,
this degrades to deterministic encryption for unchanged blocks
rather than catastrophic nonce reuse
(<xref target="derived-nonces-security"/>).</t>
        </section>
        <section anchor="profile-fips-edit">
          <name>FIPS Edit</name>
          <t>Applications that require FIPS 140-validated algorithms for
random-access editing <bcp14>SHOULD</bcp14> consider:</t>
          <artwork><![CDATA[
-----BEGIN SAFE CONFIG-----
AEAD: aes-256-gcm
Data-Encoding: binary
Key-Epoch: 5
-----END SAFE CONFIG-----
]]></artwork>
          <t>AES-256-GCM is FIPS 140-validated; ChaCha20-Poly1305, AES-256-GCM-SIV,
AEGIS-256, and AEGIS-256X2 are not currently covered by a FIPS 140
validation program.  Key-Epoch: 5 limits each epoch key to 32 blocks,
giving 2^27 - 1 (over 134 million) rewrites per block before exhausting
the per-key nonce budget (<xref target="epoch-key-rotation"/>).  This is sufficient
for virtually all editing workloads while adding negligible
key-derivation overhead.  The default Block-Size of 65536 reduces the
number of epoch key derivations relative to smaller block sizes.</t>
          <t>Unlike the Edit profile (<xref target="profile-edit"/>), this profile stores
random per-block nonces (Nn + 16 octets per block vs. 16 octets
for GCM-SIV).  Applications that can tolerate block-level
equality leakage on rewrite <bcp14>SHOULD</bcp14> prefer the Edit profile for
its lower per-block overhead.</t>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>SAFE provides:</t>
      <dl>
        <dt>Confidentiality:</dt>
        <dd>
          <t>Indistinguishability under adaptive chosen-ciphertext attack
(IND-CCA2) security for the payload, assuming IND-CCA2-secure
AEAD.  This follows from the standard reduction: SafeDerive is a PRF,
so payload_key is indistinguishable from random; under a random key,
the registered AEADs provide IND-CCA2 per their specifications.</t>
        </dd>
        <dt>Authentication:</dt>
        <dd>
          <t>Each LOCK's Encrypted-CEK is authenticated via AEAD under
derived_kek, which binds step tokens and step secrets through the
KEK schedule.  Block AEAD with index-bound AAD (<xref target="integrity"/>)
prevents reordering, modification, and splicing.  The snapshot
accumulator (<xref target="snapshot-accumulator"/>) provides file-level integrity
over all block tags.</t>
        </dd>
        <dt>Binding:</dt>
        <dd>
          <t>The KEK schedule binds encryption_parameters at initialization
and final derivation (<xref target="kek-schedule"/>).  Step tokens and per-step
secrets are folded into the aggregator via sequential
SafeDerive chaining.  Payload keys inherit suite binding from
their own SafeDerive calls (<xref target="payload-schedule"/>).</t>
        </dd>
      </dl>
      <t>SAFE does not provide:</t>
      <dl>
        <dt>Encryptor authentication (Base mode):</dt>
        <dd>
          <t>Without a sender parameter (sid or shint), any party with
recipient public keys can create SAFE-encoded data.  See
<xref target="sender-auth-properties"/> for Auth mode authentication
properties.</t>
        </dd>
        <dt>Forward secrecy:</dt>
        <dd>
          <t>CEK compromise exposes all recipients' copies.  This is inherent
to stored-object encryption, which has no interactive key exchange.</t>
        </dd>
        <dt>Unlinkability:</dt>
        <dd>
          <t>Key identifiers enable linking SAFE-encoded data to the same
recipient.  See <xref target="recipient-anonymity"/> for privacy modes.</t>
        </dd>
      </dl>
      <t>SAFE assumes secure key storage, side-channel resistant
implementations, and trusted cryptographic primitives.  A
functioning CSPRNG is <bcp14>REQUIRED</bcp14>.  See
<xref target="nonce-generation-and-cek-reuse"/> for defenses against RNG
weakness or state duplication.</t>
      <section anchor="threat-model">
        <name>Threat Model</name>
        <t>SAFE defends against:</t>
        <dl>
          <dt>Compromised storage provider (confidentiality):</dt>
          <dd>
            <t>An adversary with read access to stored SAFE-encoded
data cannot decrypt without valid credentials (passphrase or
private key) for at least one LOCK.  The adversary can
observe approximate file size, recipient count, and key
identifier linkability.  SAFE detects block corruption
(AEAD failure) and truncation (is_final mismatch), but does
not detect LOCK removal, LOCK addition, or whole-file
replacement by an adversary with write access.</t>
          </dd>
        </dl>
        <t>SAFE does not defend against:</t>
        <dl>
          <dt>Compromised recipient:</dt>
          <dd>
            <t>If a recipient's credentials (passphrase or private key) are
compromised, the adversary can decrypt the payload.  All recipients
share the same CEK; compromise of one recipient's KEK does not expose
other recipients' KEKs, but does expose the shared CEK and payload.
The weakest LOCK determines the effective security of the entire
file: an attacker who can satisfy any single LOCK recovers the CEK.</t>
          </dd>
          <dt>Active attacker with key compromise:</dt>
          <dd>
            <t>If an attacker compromises a recipient's private key and can modify
files, they can create valid SAFE-encoded data for that recipient
(in Base mode).  Auth mode (<xref target="hpke-auth-mode"/>) mitigates this for
steps where the attacker does not also hold the sender's private
key; see <xref target="sender-auth-properties"/>.</t>
          </dd>
          <dt>Side-channel attacks:</dt>
          <dd>
            <t>SAFE assumes implementations do not intentionally leak secrets.
Timing attacks on Argon2id, HPKE, or AEAD operations are out of scope
for this document.</t>
          </dd>
          <dt>Malicious Encryptor:</dt>
          <dd>
            <t>Any party with a recipient's public key can create valid SAFE-encoded
data for that recipient.  SAFE does not constrain what an Encryptor
can encrypt or for whom.  Applications <bcp14>MUST</bcp14> validate decrypted content
independently of the encryption envelope.</t>
          </dd>
        </dl>
      </section>
      <section anchor="sender-auth-properties">
        <name>Sender Authentication Properties</name>
        <t>When <tt>sid</tt> or <tt>shint</tt> is present in an hpke(...) step,
SAFE uses HPKE Auth mode (mode_auth, <xref target="RFC9180"/>).
Auth mode defends against
forgery by parties who do not hold the sender's private key: a
decryptor who successfully processes an auth-mode step is
assured that the encapsulation was produced by a holder of skS.
This closes the "encryptor authentication" gap identified above
for Base mode, within the following limits:</t>
        <dl>
          <dt>Non-repudiation:</dt>
          <dd>
            <t>Auth mode authenticates the sender only to the holder of the
recipient's private key.  The recipient cannot prove to a
third party that the sender created the SAFE object.
Applications requiring non-repudiation <bcp14>MUST</bcp14> use external
signatures.</t>
          </dd>
          <dt>Sender identity confidentiality:</dt>
          <dd>
            <t>The <tt>sid</tt> parameter (when a Base64 value) reveals the
sender's key identifier to any observer.  <tt>shint</tt>
narrows the sender's identity.  Anonymous Auth mode
(<tt>sid=anon</tt>) avoids explicit sender identification,
at the cost of trial decryption across all candidate
sender keys.</t>
          </dd>
          <dt>Sender key trust:</dt>
          <dd>
            <t>SAFE does not define a trust model for sender public keys.
Decryptors <bcp14>MUST</bcp14> independently verify that a sender's public
key is authentic (e.g., via a certificate, trust on first
use (TOFU), or out-of-band verification) before relying on
auth-mode authentication.</t>
          </dd>
        </dl>
      </section>
      <section anchor="integrity">
        <name>Integrity and Authenticity</name>
        <t>The KEK schedule binds encryption_parameters at initialization
and final derivation, with step tokens and per-step secrets
folded via sequential SafeDerive chaining.  The payload schedule
binds payload_key to encryption_parameters independently, tying
block encryption to the negotiated AEAD and Block-Size.  Payload
AEAD authenticates each block with index-bound AAD, preventing
reordering and cross-file splicing.  SAFE detects truncation and
extension at block boundaries via is_final in block AAD
(<xref target="data-aad"/>).</t>
        <t>The snapshot accumulator (<xref target="snapshot-accumulator"/>) provides file-level
integrity: a single Nh-octet value that binds all block tags under
acc_key.  Decryptors can verify whole-file consistency from metadata
alone, without decrypting every block.  The accumulator updates in O(1)
when individual blocks are rewritten.</t>
        <t>Applications requiring third-party verifiability (e.g., signatures)
<bcp14>MUST</bcp14> use external signatures.</t>
      </section>
      <section anchor="implementation-considerations">
        <name>Implementation Considerations</name>
        <t>The step sequence has AND semantics: an attacker must break every
step to recover the CEK, so security is at least that of the
strongest step.  Compromising one step secret (e.g., a passphrase)
allows the attacker to compute intermediate aggregator values up
to that step; this is inherent to sequential chaining and does not
weaken subsequent steps.
Nonces <bcp14>MUST</bcp14> be unique: fresh lock_nonce per LOCK, and fresh random
nonce per block.
Implementations <bcp14>MUST</bcp14> zeroize sensitive values (CEK, KEK, PRKs,
payload_key, acc_key, nonce_base) immediately after use.  Long-lived
processes that retain a CEK (e.g., for incremental writes) <bcp14>SHOULD</bcp14> store
it in swap-protected memory (e.g., mlock).
To prevent error oracles, implementations exposing decryption to
untrusted callers (e.g., network services, APIs) <bcp14>MUST</bcp14> return a
single generic "decryption failed" error rather than distinguishing
between wrong passphrase, wrong key, commitment mismatch, or AEAD
failure.  Local tools (e.g., CLI applications, test harnesses) <bcp14>MAY</bcp14>
use the detailed error codes in <xref target="error-codes"/> for diagnostics.
Implementations <bcp14>MUST</bcp14> use constant-time AEAD, KEM, KDF, commitment
comparison, and accumulator verification operations.  This extends
to passphrase KDF evaluation and Base64 decoding of secret material
(Encrypted-CEK, step parameters carrying key material).  Commitment
and accumulator comparisons <bcp14>MUST</bcp14> use a constant-time equality
function (e.g., CRYPTO_memcmp or equivalent).  Trial decryption loops
(<xref target="trial-complexity"/>) <bcp14>MUST NOT</bcp14> leak timing information about which
candidate key succeeded.</t>
      </section>
      <section anchor="passphrase-kdf-selection">
        <name>Passphrase KDF Selection</name>
        <t>SAFE supports two passphrase KDF variants with different security
properties:</t>
        <dl>
          <dt>pass(kdf=argon2id, ...):</dt>
          <dd>
            <t>Memory-hard function that resists GPU and ASIC attacks.  The default
parameters (64 MiB memory, 2 iterations) provide strong resistance
to offline attacks.  Recommended for most deployments.</t>
          </dd>
          <dt>pass(kdf=pbkdf2, ...):</dt>
          <dd>
            <t>Widely deployed function using PBKDF2-HMAC-SHA-256.  Lacks
memory-hardness, making it more vulnerable to GPU and ASIC attacks
than Argon2id.  The 600,000 iteration count provides equivalent
CPU-based attack resistance but does not mitigate hardware-based
attacks.  Use only when policy prohibits memory-hard KDFs.</t>
          </dd>
        </dl>
        <t>Encryptors targeting Decryptors with mixed policy
constraints <bcp14>MAY</bcp14> include two pass(...) LOCK blocks: one
with pass(kdf=argon2id, ...) and one
with pass(kdf=pbkdf2, ...), using the same passphrase but fresh salts
for each.</t>
        <t>Applications <bcp14>SHOULD</bcp14> enforce a minimum passphrase complexity
policy (e.g., at least 20 characters or equivalent entropy).
For high-value data, Encryptors <bcp14>SHOULD</bcp14> combine a pass(...)
step with an hpke(...) step in the same LOCK, so that
compromise of the passphrase alone is insufficient.</t>
        <t>Multiple LOCK blocks allow observers to infer shared payload access.
HPKE key identifiers link files to the same recipient across objects.
The Base64 length reveals approximate payload size; LOCK count reveals
recipient count.  Applications concerned about traffic analysis <bcp14>SHOULD</bcp14>
pad payloads.</t>
      </section>
      <section anchor="recipient-anonymity">
        <name>Recipient Anonymity and Trial Decryption</name>
        <t>SAFE supports three levels of recipient identification for hpke(...)
steps:</t>
        <dl>
          <dt>Identified mode:</dt>
          <dd>
            <t>The <tt>id</tt> parameter uniquely identifies the recipient's public key.
Observers can link SAFE-encoded data encrypted to the same recipient.</t>
          </dd>
          <dt>Hinted mode:</dt>
          <dd>
            <t>The <tt>hint</tt> parameter is a recipient-assigned value (not
cryptographically derived).  It filters candidates locally while
revealing nothing about the key itself.  Multiple keys may share the
same hint.</t>
          </dd>
          <dt>Anonymous mode:</dt>
          <dd>
            <t>No identifier is present.  Decryptors <bcp14>MUST</bcp14> trial-decrypt against all
local keys matching the <tt>kem</tt> type.  Provides maximum privacy at the
cost of increased decryptor computation.</t>
          </dd>
        </dl>
        <section anchor="privacy-benefits">
          <name>Privacy Benefits</name>
          <t>Omitting or replacing the key identifier with a hint prevents passive
observers from mapping SAFE-encoded data to specific public keys.  This
is valuable when file-recipient associations are sensitive metadata.</t>
        </section>
        <section anchor="sender-anonymity">
          <name>Sender Anonymity</name>
          <t>Auth-mode hpke(...) steps support the same three levels of
sender identification via <tt>sid</tt> and <tt>shint</tt>:</t>
          <dl>
            <dt>Identified (<tt>sid</tt> present):</dt>
            <dd>
              <t>The <tt>sid</tt> parameter identifies the sender's public key using
the same Hash as <tt>id</tt>.  Observers can link SAFE objects to the
same sender across files.</t>
            </dd>
            <dt>Hinted (<tt>shint</tt> present):</dt>
            <dd>
              <t>The <tt>shint</tt> parameter is a sender-assigned value that filters
candidates locally.  It reveals less than <tt>sid</tt> but still narrows
the sender's identity.</t>
            </dd>
            <dt>Anonymous (neither <tt>sid</tt> nor <tt>shint</tt>):</dt>
            <dd>
              <t>Decryptors trial-decrypt against all locally known sender keys
matching the <tt>kem</tt> type.  Provides sender privacy at the cost of
increased trial decryption (see <xref target="trial-complexity"/>).</t>
            </dd>
          </dl>
          <t>Encryptors <bcp14>SHOULD</bcp14> prefer <tt>sid</tt> unless sender privacy is required.
The same trade-offs between identification, hinting, and anonymity
apply to sender keys as to recipient keys.</t>
        </section>
        <section anchor="trial-complexity">
          <name>Trial Complexity</name>
          <t>Anonymous mode with composable step sequences (multiple hpke steps)
requires combinatorial trial decryption.  For a step sequence with
two anonymous hpke(...) steps, where the Decryptor holds K1 keys for
step 1 and K2 keys for step 2, up to K1 x K2 combinations may be
attempted.  Auth-mode steps add a further multiplicative factor: if
an auth-mode step has no <tt>sid</tt> or <tt>shint</tt>, the Decryptor <bcp14>MUST</bcp14> try
all S candidate sender keys, multiplying the search space by S.</t>
          <t>Implementations <bcp14>MUST</bcp14> set a MaxTrialAttempts limit to bound
computation and <bcp14>MUST</bcp14> reject LOCK blocks that would exceed this
limit.  A value of 1024 is <bcp14>RECOMMENDED</bcp14>; implementations <bcp14>MAY</bcp14>
adjust based on deployment constraints.</t>
        </section>
      </section>
      <section anchor="trial-dos">
        <name>Denial of Service Considerations</name>
        <t>An attacker can craft SAFE-encoded data with many anonymous LOCK blocks
to force Decryptors into expensive cryptographic operations.
Implementations <bcp14>MUST</bcp14>:</t>
        <ul spacing="normal">
          <li>
            <t>Limit the number of LOCK blocks processed per object</t>
          </li>
          <li>
            <t>Prioritize identified blocks over hinted blocks over anonymous blocks</t>
          </li>
          <li>
            <t>Abort early when resource limits are exceeded</t>
          </li>
        </ul>
        <t>Implementations <bcp14>MUST</bcp14> also limit the number of steps per LOCK block.  A
limit of 16 steps per LOCK is <bcp14>RECOMMENDED</bcp14>; this prevents an attacker
from crafting a single LOCK block that forces evaluation of an excessive
number of passphrase KDF computations.  Implementations <bcp14>SHOULD</bcp14> limit
the total number of passphrase KDF evaluations to 8 per file; an
attacker who crafts multiple LOCKs with pass(...) steps can otherwise
force expensive Argon2id computations proportional to the LOCK count.</t>
        <t>ML-KEM decapsulation is significantly more expensive than X25519;
anonymous ML-KEM steps amplify the DoS potential.</t>
      </section>
      <section anchor="hint-assignment">
        <name>Hint Assignment</name>
        <t>The hint is a 4-digit decimal value (0000-9999) assigned by the
recipient; it is not solely dependent on the public key.  Recipients
communicate their hint to Encryptors out-of-band.
Multiple keys <bcp14>MAY</bcp14> share the same hint.</t>
        <t>Encryptors <bcp14>MUST NOT</bcp14> assume the hint uniquely identifies a key.
Decryptors <bcp14>MAY</bcp14> reassign hints at any time; Encryptors <bcp14>SHOULD</bcp14> refresh
hint values periodically through out-of-band communication.</t>
        <t>Encryptors <bcp14>SHOULD</bcp14> prefer identified mode unless recipient privacy is
required.</t>
      </section>
      <section anchor="nonce-generation-and-cek-reuse">
        <name>Nonce Generation and CEK Reuse</name>
        <t>Encryptors <bcp14>SHOULD</bcp14> use the hedged construction
(<xref target="hedged-construction"/>) when a private key is available, the
plaintext-bound nonce construction (<xref target="plaintext-bound-nonce"/>) when
RNG state duplication is a concern, and an NMR AEAD
(<xref target="aead-summary"/>) for additional protection.  The following cases
describe the resulting security properties.</t>
        <dl>
          <dt>With private key, working RNG:</dt>
          <dd>
            <t>Full protection.  The block nonce base is derived from both fresh
randomness and the hedge key.  Nonces are unique across files and
within files.</t>
          </dd>
          <dt>With private key, duplicated RNG state:</dt>
          <dd>
            <t>Deterministic encryption per Encryptor.  Different Encryptors (with
different private keys) produce different hedge keys and therefore
different CEKs and nonce bases.  Within a single file, block indices
guarantee nonce uniqueness.  Across files from the same encryptor,
the CEK and salt repeat, producing identical payload keys and
ciphertext for identical plaintext blocks at the same index.  This
leaks equality but not content.  The plaintext-bound nonce
construction (<xref target="plaintext-bound-nonce"/>) further limits exposure:
nonces differ when plaintext differs, even across files.</t>
          </dd>
          <dt>Without private key, working RNG:</dt>
          <dd>
            <t>Full protection.  SafeRandom returns raw CSPRNG output.  Nonce
uniqueness depends on the RNG.</t>
          </dd>
          <dt>Without private key, duplicated RNG state:</dt>
          <dd>
            <t>No defense.  CEKs and salts repeat across files, producing
identical payload keys and nonce bases.  Within a file, block
indices still provide distinct nonces.  Across files, nonce
reuse under distinct plaintext permits key recovery attacks
against AES-GCM, ChaCha20-Poly1305, AEGIS-256,
and AEGIS-256X2.  AES-256-GCM-SIV limits
the damage to deterministic encryption (leaks equality).  The
plaintext-bound nonce construction also limits nonce reuse to
identical blocks at the same index.</t>
          </dd>
        </dl>
        <t>A functioning CSPRNG is <bcp14>REQUIRED</bcp14> when no private key is available.</t>
        <t>Encryptors operating in environments where RNG state duplication
is possible (VM snapshots, process forks without reseed, container
cloning) <bcp14>SHOULD</bcp14> use the plaintext-bound nonce construction
(<xref target="plaintext-bound-nonce"/>).  Because the plaintext-bound
construction incorporates a plaintext-dependent derivation via
SafeDerive("SAFE-NONCE", plaintext_i, encryption_parameters, 32)
into nonce derivation, two instances that share identical key
material still produce distinct nonces whenever plaintext differs.
The two-pass cost of this construction is justified by the defense
it provides against state duplication.</t>
        <t>Within a single file, block indices are bounded by the plaintext length
and Block-Size.  Encryptors <bcp14>MUST</bcp14> ensure block indices remain below 2^64.
Practical implementations <bcp14>SHOULD</bcp14> enforce a lower bound; for example,
rejecting plaintexts exceeding 2^48 blocks (approximately 16 EiB at
the default Block-Size of 65536 octets) provides a conservative
margin while supporting files far larger than current storage
systems.</t>
        <section anchor="file-extension">
          <name>File Extension</name>
          <t>Appending data to an existing SAFE file requires
re-encrypting the old final block (which had is_final=1) with
is_final=0, then encrypting the new blocks.  Encryptors <bcp14>MUST
NOT</bcp14> generate a new CEK or salt; the existing LOCKs and salt
are reused.  Encryptors <bcp14>MUST</bcp14> verify the snapshot accumulator
before extending the file; extending a corrupted file
propagates undetected damage.  The procedure is:</t>
          <ol spacing="normal" type="1"><li>
              <t>Decrypt the current final block (index N-1) and verify
is_final=1.</t>
            </li>
            <li>
              <t>Re-encrypt block N-1 with is_final=0.  For non-NMR AEADs,
Encryptors <bcp14>MUST</bcp14> generate a fresh nonce using SafeRandom
(<xref target="random-generation"/>).  For NMR AEADs, re-encrypting
block N-1 at the same index produces the same nonce
(nonce_base XOR uint64(N-1)).  The AAD differs because
is_final changes from 1 to 0; nonce-misuse resistance
ensures security despite the repeated nonce.
See <xref target="derived-nonces-security"/>.</t>
            </li>
            <li>
              <t>Encrypt new blocks N through N+K-1 with is_final=0.</t>
            </li>
            <li>
              <t>Encrypt block N+K (the new final block) with is_final=1.</t>
            </li>
            <li>
              <t>Update the metadata (nonces, tags) and block count N.</t>
            </li>
            <li>
              <t>Recompute the snapshot accumulator.</t>
            </li>
          </ol>
          <t>For NMR AEADs, re-encryption of block N-1 at the same index reuses the
same derived nonce.  Because the AAD differs (is_final changed from 1
to 0), the NMR AEAD produces different ciphertext.  This is the
standard NMR equality-leakage property: an observer can detect that
block N-1 was re-encrypted, but content is not revealed.</t>
        </section>
        <section anchor="derived-nonces-security">
          <name>Derived Nonces</name>
          <t>For NMR AEADs, per-block nonces are derived deterministically
from nonce_base and the block index rather than generated randomly
and stored.  This is restricted to NMR AEADs for the following
reasons:</t>
          <dl>
            <dt>Uniqueness:</dt>
            <dd>
              <t>The SafeDerive output is unique per CEK (each CEK produces a
distinct nonce_base).  XOR with distinct block indices yields
distinct nonces for all i &lt; 2^64.</t>
            </dd>
            <dt>Nonce reuse tolerance:</dt>
            <dd>
              <t>Re-encrypting block i with the same CEK reuses nonce_i.
NMR AEADs degrade gracefully to deterministic encryption:
identical plaintext at the same index produces identical
ciphertext, but no additional information is leaked.
Non-NMR AEADs would suffer catastrophic nonce reuse,
which is why derived nonces are not used with them.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="selective-editing-security">
        <name>Selective Editing Security</name>
        <t>Per-block random nonces and the is_final flag enable selective
editing: individual blocks can be re-encrypted without affecting
other blocks or LOCK blocks.  When editing:</t>
        <ul spacing="normal">
          <li>
            <t>Generate a fresh random nonce for any re-encrypted block</t>
          </li>
          <li>
            <t>Update the is_final flag if the last block changes</t>
          </li>
          <li>
            <t>Update the snapshot accumulator (<xref target="snapshot-accumulator"/>)</t>
          </li>
          <li>
            <t>Blocks not being edited retain their original nonces and
ciphertexts</t>
          </li>
        </ul>
        <t>The is_final flag prevents truncation and extension attacks:</t>
        <ul spacing="normal">
          <li>
            <t>Truncation: decrypting a block with is_final=0 when no successor
exists indicates malicious or accidental truncation</t>
          </li>
          <li>
            <t>Extension: appending blocks after a block with is_final=1 will fail
AEAD verification because the original final block's AAD included
is_final=1</t>
          </li>
        </ul>
      </section>
      <section anchor="key-identifier-collisions">
        <name>Key Identifier Collisions</name>
        <t>Key identifiers are 32-octet hashes of SPKI DER encodings
(<xref target="key-identifier"/>).  Both registered Hash algorithms (sha-256 and
turboshake256) produce 32-octet output, giving a birthday bound on
collision probability of approximately N^2 / 2^257 for a deployment
with N keys.  This is negligible for any practical key population.</t>
        <t>Implementers <bcp14>MUST NOT</bcp14> rely solely on key identifier matching for
authorization; successful HPKE decapsulation and AEAD verification of
Encrypted-CEK are required.</t>
      </section>
      <section anchor="key-commitment">
        <name>Key Commitment</name>
        <t>SAFE supports multiple LOCK blocks that can be added or removed
independently without re-encrypting the payload, because each LOCK wraps
the same CEK.  However, removing a LOCK does not revoke access: any
party who previously decrypted the CEK retains the ability to decrypt
the payload.  Applications requiring revocation <bcp14>MUST</bcp14> generate a new CEK
and re-encrypt.</t>
        <t>Without key commitment, an adversary could craft LOCK blocks that
decrypt to different CEKs and exploit AEAD malleability to create
payload ciphertext valid under multiple keys:</t>
        <ol spacing="normal" type="1"><li>
            <t>Creates LOCK₁ that wraps CEK₁ for recipient A</t>
          </li>
          <li>
            <t>Creates LOCK₂ that wraps CEK₂ for recipient B</t>
          </li>
          <li>
            <t>Crafts payload ciphertext C that decrypts to plaintext P₁ under
payload_key₁ (derived from CEK₁) and to P₂ under payload_key₂
(derived from CEK₂)</t>
          </li>
        </ol>
        <t>None of the AEADs registered for SAFE provide key commitment
from the AEAD mechanism alone at the 128-bit security level
(AES-GCM and ChaCha20-Poly1305 are well-known to lack this
property; AEGIS-256 with 128-bit tags provides only birthday-bound
commitment at approximately 2^64).  SAFE's external 32-octet commitment
prefix (<xref target="payload-schedule"/>) supersedes the AEAD's native commitment
properties, providing uniform 2^128 key-commitment security across all
registered suites.</t>
        <t>The commitment prefix in the SAFE DATA block
(<xref target="linear-layout"/>) provides uniform key commitment for
all AEAD choices.  The commitment is always 32 octets,
derived via
<tt>SafeDerive("commit", CEK, payload_info, 32)</tt>
where payload_info = [...encryption_parameters, salt],
per <xref target="payload-schedule"/>.  Recipients verify that the
derived commitment equals the prefix before block
decryption.  This binds the ciphertext to the CEK, the
negotiated algorithm parameters, and the per-file salt,
providing 2^128 key-commitment security and preventing
cross-algorithm commitment collisions.  The security
relies on collision resistance of SafeDerive: the Encode() framing
ensures unambiguous parsing of all inputs, so distinct
(encryption_parameters, salt, CEK) tuples cannot produce the same
commitment.  Formally, for any two distinct input tuples the probability
of a commitment collision is at most 2^(-128), under the assumption that
the underlying KDF is a PRF.</t>
      </section>
      <section anchor="aead-usage-bounds">
        <name>AEAD Usage Bounds</name>
        <t>The security properties described in this section address distinct
threats and are provided by separate mechanisms.  Key commitment
(<xref target="key-commitment"/>) prevents an adversary from crafting ciphertext
that decrypts to different plaintexts under different keys; the
32-octet commitment prefix solves this uniformly for all registered
AEADs and is independent of nonce discipline.  Block-level
integrity (<xref target="data-aad"/>) prevents reordering, truncation, and
extension; the block index and final-block indicator in each
block's AAD solve this independently of nonce collision risk.</t>
        <t>Nonce collision risk is a separate concern.  For non-NMR AEADs
with stored random nonces, the primary practical constraint is
the total number of block encryptions performed under one payload
key over the file's lifetime.  This total includes both initial
writes and all subsequent rewrites of individual blocks.  See
<xref target="nonce-generation-and-cek-reuse"/> for defenses against RNG
weakness and state duplication, including the hedged
nonce construction (<xref target="hedged-construction"/>,
<xref target="RFC8937"/>).</t>
        <section anchor="lifetime-encryption-budget">
          <name>Lifetime Encryption Budget</name>
          <t>Let q denote the total number of block encryptions under one
payload key, counting every initial block write and every block
rewrite.  Because all recipients of a SAFE object share one
CEK and therefore one payload key, the per-key analysis applies
regardless of recipient count; adding recipients does not
increase q.  For AEADs with Nn-octet random nonces, the
probability
of at least one nonce collision among q encryptions is
approximately:</t>
          <artwork><![CDATA[
P_collision ≈ q^2 / 2^(8*Nn + 1)
]]></artwork>
          <t>For 96-bit nonces (Nn = 12), this simplifies to approximately
q^2 / 2^97.  This is a standard birthday-bound
approximation, not a formal proof of the AEAD's concrete
multi-user security.</t>
          <t>The following table illustrates q for representative workloads
at the default Block-Size of 65536 octets:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Total encrypted data</th>
                <th align="left">Approximate q</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">1 TiB</td>
                <td align="left">2^24</td>
              </tr>
              <tr>
                <td align="left">16 TiB</td>
                <td align="left">2^28</td>
              </tr>
              <tr>
                <td align="left">256 TiB</td>
                <td align="left">2^32</td>
              </tr>
            </tbody>
          </table>
          <t>The same values of q can be reached by smaller files that are
rewritten many times.  A 1 GiB file contains 2^14 blocks at
the default block size; rewriting the entire file 1024 times
produces approximately 2^24 total block encryptions, the same
budget as encrypting 1 TiB once.  The relevant quantity is
lifetime encrypted blocks per payload key, not current file
size.</t>
          <t>When Key-Epoch is present (<xref target="epoch-key-rotation"/>), each epoch key
covers at most 2^r blocks and their rewrites.  The birthday bound
then applies per epoch key rather than file-wide, so the effective
q per key is bounded by the epoch size plus rewrites, not total
file size.  See <xref target="epoch-key-rotation"/> for per-epoch budget
calculations.</t>
          <t>In a multi-user setting where an attacker targets any one of U
independently keyed SAFE files, the effective collision probability is
approximately U * q^2 / 2^(8*Nn + 1).  For 96-bit nonces with U = 2^20
files each at q = 2^32, this is approximately 2^(-13), which is not
negligible.  Key-Epoch (<xref target="epoch-key-rotation"/>) mitigates this by
reducing the per-key q to the per-epoch budget; with Key-Epoch: 0 each
key encrypts a single block, making per-key q equal to the number of
rewrites of that block.  At more typical workloads without epochs
(q = 2^24 per file), the multi-user bound is approximately 2^(-29).
The 256-bit nonce AEADs (AEGIS-256, AEGIS-256X2) render multi-user
bounds operationally irrelevant (approximately 2^(-173) at the same
parameters).</t>
        </section>
        <section anchor="per-aead-analysis">
          <name>Per-AEAD Analysis</name>
          <dl>
            <dt>AES-256-GCM:</dt>
            <dd>
              <t>AES-256-GCM <xref target="NIST-SP-800-38D"/> <xref target="RFC5116"/> is
nonce-respecting with 96-bit nonces.  SAFE uses a fresh
random nonce per block for this suite.  With stored random
nonces, the practical limit is birthday-bound nonce
collision under a single payload key: approximately
q^2 / 2^97.  At q = 2^32 (approximately 256 TiB at the
default block size, or equivalent rewrite volume), the
collision probability is approximately 2^(-33), which is
negligible for most applications.  Nonce reuse under
AES-GCM permits authentication-key recovery and full
plaintext recovery for the affected blocks.
Encryptors <bcp14>SHOULD</bcp14> include Key-Epoch (<xref target="epoch-key-rotation"/>)
for rewritable files to limit per-key invocations within the
bounds of <xref target="NIST-SP-800-38D"/>.  Key-Epoch: 0 is <bcp14>RECOMMENDED</bcp14>;
Key-Epoch: 5 is a practical alternative when key-derivation
overhead matters (see <xref target="epoch-key-rotation"/> for the tradeoff).
Alternatively, implementations <bcp14>MAY</bcp14> generate a fresh CEK and
re-wrap it in new LOCKs.</t>
            </dd>
            <dt>ChaCha20-Poly1305:</dt>
            <dd>
              <t>ChaCha20-Poly1305 <xref target="RFC8439"/> is nonce-respecting with
96-bit nonces.  The ChaCha20-Poly1305 specification
(Section 4 of <xref target="RFC8439"/>) requires nonce uniqueness per
key and notes the collision risk of random nonces;
SAFE's use of stored random nonces gives the same
birthday-style collision accounting as AES-256-GCM
(approximately q^2 / 2^97).  Nonce reuse under
ChaCha20-Poly1305 permits XOR of plaintexts for the
affected blocks and compromises Poly1305
authentication.  Block rewrites are especially
relevant because the same logical block may be
encrypted multiple times under the same payload key,
each time consuming budget.  Because <xref target="RFC8439"/>
requires nonce uniqueness per key, Encryptors <bcp14>MUST</bcp14>
include Key-Epoch when using chacha20-poly1305
(<xref target="safe-config"/>).  Key-Epoch: 0 is <bcp14>RECOMMENDED</bcp14>; Key-Epoch: 5
is a practical alternative when key-derivation overhead
matters.  Key-Epoch (<xref target="epoch-key-rotation"/>) confines the
collision domain to rewrites within each epoch.</t>
            </dd>
            <dt>AES-256-GCM-SIV:</dt>
            <dd>
              <t>AES-256-GCM-SIV <xref target="RFC8452"/> is nonce-misuse resistant
(NMR).  Under nonce reuse, it degrades to deterministic
encryption: identical plaintext at the same block index
produces identical ciphertext, leaking equality but not
content.  The collision analysis is therefore qualitatively
different from AES-256-GCM and ChaCha20-Poly1305: the
practical question is whether leaking block-level equality
across rewrites is acceptable for a given application, not
whether a nonce collision permits plaintext recovery.
SAFE uses derived nonces for NMR AEADs (<xref target="per-block-nonces"/>),
which are deterministic per block index by design.  Key-Epoch
<bcp14>MUST NOT</bcp14> be present for this suite (<xref target="safe-config"/>).  Unique
nonces remain preferred to avoid equality leakage; misuse
resistance does not provide unlimited safety.  The concrete security
bound for AES-256-GCM-SIV (Section 6 of <xref target="RFC8452"/>) includes a
message-length-dependent term: the distinguishing advantage is bounded
by approximately (q * l)^2 / 2^128, where q is the number of queries
and l is the maximum message length in 128-bit blocks.  At SAFE's
default Block-Size of 65536 (l = 4096 blocks), this term is negligible
for practical query counts.</t>
            </dd>
            <dt>AEGIS-256:</dt>
            <dd>
              <t>AEGIS-256 <xref target="I-D.irtf-cfrg-aegis-aead"/> is
nonce-respecting with 256-bit nonces.  The birthday bound
for 256-bit random nonces is approximately q^2 / 2^257.
At q = 2^48 (approximately 16 EiB at the default block
size), the collision probability is approximately
2^(-161), which is negligible for any foreseeable SAFE
workload.  The larger nonce space makes random-nonce
collision operationally irrelevant at SAFE scale.
Key-Epoch adds no practical benefit for this suite
(<xref target="epoch-key-rotation"/>).  Implementations <bcp14>MUST</bcp14> still generate
fresh random nonces for each block encryption.</t>
            </dd>
            <dt>AEGIS-256X2:</dt>
            <dd>
              <t>AEGIS-256X2 shares the 256-bit nonce of AEGIS-256.  The
same analysis applies: the birthday bound of
q^2 / 2^257 makes nonce collision negligible for any
practical SAFE deployment.  As with AEGIS-256,
Key-Epoch adds no practical benefit.  AEGIS-256X2
provides higher throughput on wide-vector hardware;
the nonce discipline requirements are identical to
AEGIS-256.</t>
            </dd>
          </dl>
        </section>
        <section anchor="epoch-key-rotation">
          <name>Epoch Key Rotation</name>
          <t>Key-Epoch (<xref target="epoch-key-derivation"/>) limits AEAD invocations per
key.  With Key-Epoch = r, each epoch key covers at most 2^r
blocks (plus their rewrites).  The birthday bound applies per
epoch key, not file-wide.</t>
          <t>For 96-bit nonce AEADs, each epoch key's budget is 2^32
encryptions (P &lt; 2^(-33)).  The total rewrite budget per epoch
key is 2^32 - 2^r encryptions, shared across all 2^r blocks in
the epoch.  Assuming uniform rewrite distribution:</t>
          <artwork><![CDATA[
avg_rewrites_per_block = 2^(32-r) - 1
]]></artwork>
          <table>
            <thead>
              <tr>
                <th align="left">Key-Epoch</th>
                <th align="left">Epoch size</th>
                <th align="left">Avg rewrites/block</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">0</td>
                <td align="left">1</td>
                <td align="left">2^32 - 1</td>
              </tr>
              <tr>
                <td align="left">5</td>
                <td align="left">32</td>
                <td align="left">2^27 (134M)</td>
              </tr>
              <tr>
                <td align="left">8</td>
                <td align="left">256</td>
                <td align="left">2^24 (16M)</td>
              </tr>
              <tr>
                <td align="left">16</td>
                <td align="left">65536</td>
                <td align="left">2^16 (65K)</td>
              </tr>
            </tbody>
          </table>
          <t>In a multi-user setting with U files, the per-epoch multi-user bound is
U * q_epoch^2 / 2^(8*Nn + 1), where q_epoch is the total encryptions
under one epoch key (at most 2^r initial blocks plus their rewrites).
With Key-Epoch: 0 (r=0) and W rewrites per block, q_epoch = 1 + W; even
at U = 2^20 files and W = 2^20 rewrites, the bound is approximately 2^20
* 2^40 / 2^97 = 2^(-37).</t>
          <t>If rewrites concentrate on a single block within an epoch, that
block can consume the full epoch budget.  With r=0 each key
encrypts a single block, so the cross-block collision risk is
eliminated and the only collision risk is across rewrites of that
block — over 2^32 rewrites to reach the threshold.  <xref target="FLOE"/>
Section 8 benchmarks the overhead of epoch key derivation across
segment sizes and rotation masks; at r=0 the overhead is
noticeable for small segments but decreases rapidly with segment
size, and by r=5 it is dominated by the cost of processing the
plaintext.  Each epoch key at r=5 still permits over 134 million
rewrites per block.</t>
          <t>Implementations <bcp14>SHOULD</bcp14> set Key-Epoch: 0 for maximum security.
When throughput is critical (e.g., Hardware Security Module (HSM)-backed
key derivation or constrained devices), Key-Epoch: 5 provides a
practical alternative with strong security margins.</t>
          <t>For 256-bit nonce AEADs (AEGIS-256, AEGIS-256X2), epoch rotation
adds no practical benefit.  Implementations <bcp14>SHOULD NOT</bcp14> include
Key-Epoch for these suites.</t>
          <t>Epoch keys are derived, not stored, so no LOCK re-wrapping is
needed.  This construction adapts the epoch-based key rotation of
<xref target="FLOE"/> to SAFE's key schedule.</t>
        </section>
        <section anchor="relationship-to-key-commitment">
          <name>Relationship to Key Commitment</name>
          <t>The nonce-collision analysis above is orthogonal to key
commitment.  As noted in <xref target="key-commitment"/>, none of the
AEADs registered for SAFE provide key commitment from the
AEAD mechanism alone at the target security level.  SAFE
therefore provides a uniform file-level commitment prefix
that is verified before block decryption.
Commitment addresses wrong-key and cross-parameter ambiguity;
the nonce analysis in this section addresses per-key AEAD
lifetime and rewrite safety.  The choice of layout (linear
versus aligned, <xref target="payload-layouts"/>) does not change the
cryptographic analysis; it affects only framing and on-disk
storage layout.</t>
        </section>
      </section>
      <section anchor="algorithm-agility-pq">
        <name>Algorithm Agility and Post-Quantum Support</name>
        <t>SAFE accommodates post-quantum KEMs without format changes.  ML-KEM-768
(HPKE KEM ID 0x0041) is registered and <bcp14>MAY</bcp14> be used as kem=ml-kem-768.</t>
        <t>Hybrid post-quantum constructions require no protocol extensions.
An encryptor lists both a classical and a post-quantum hpke(...) step in
the same step sequence:</t>
        <artwork><![CDATA[
Step: hpke(kem=x25519, kemct=<Base64>, id=<classical-id>)
Step: hpke(kem=ml-kem-768, kemct=<Base64>, id=<pq-id>)
]]></artwork>
        <t>The KEK schedule (<xref target="kek-schedule"/>) folds each step's secret into the
aggregator in order, so the derived KEK depends on both the X25519 and
ML-KEM-768 shared secrets.  An attacker must break both KEMs to recover
the KEK.  Because the KEK schedule folds each step secret
sequentially, the derived KEK's security is conjunctive: an
attacker must break every step.  Hybrid post-quantum
protection follows naturally from combining classical and
post-quantum steps.</t>
        <t>The decryptor evaluates both decapsulations during CEK recovery.
Each KEM ciphertext
is carried in the <tt>kemct</tt> parameter of its corresponding hpke(...) step
token.  See <xref target="examples"/> for a complete example.</t>
        <t>Implementations planning PQ migration <bcp14>SHOULD</bcp14> ensure <tt>kemct</tt> parsing does
not impose unnecessary length limits (ML-KEM-768 ciphertexts are 1088
octets).</t>
        <t>Auth mode (<xref target="hpke-auth-mode"/>) relies on DHKEM AuthEncap/AuthDecap,
which requires a CDH-hard group.  No post-quantum KEM currently
supports Auth mode; ML-KEM-768 <bcp14>MUST NOT</bcp14> be used with Auth mode
(<xref target="kem-support"/>).  Applications requiring post-quantum sender
authentication <bcp14>MUST</bcp14> use external signatures.</t>
      </section>
      <section anchor="security-design-notes">
        <name>Security Level and Design Notes</name>
        <t>SAFE derives all symmetric keys at 256 bits.  The AEAD tag length
(128 bits), accumulator contribution length (Nh = 256 bits), and
commitment length (256 bits) provide at least 128-bit security
against forgery and collision attacks.</t>
        <t>The KEK schedule initializer <tt>kek_init = SafeDerive("kek_init", "",
encryption_parameters, 32)</tt> uses an empty ikm.  This is a public
derivation: its output is deterministic and computable by anyone
who knows the encryption parameters.  Security of the KEK relies
on the step secrets folded in subsequent aggregator rounds, not
on kek_init being secret.</t>
        <t>The Encode function is injective for a fixed number of arguments:
distinct input tuples produce distinct outputs because each field
is length-prefixed.  This ensures that binding step_tokens are
unambiguous.</t>
        <t>Per-block nonces are unique within a file by construction: for
non-NMR AEADs, each nonce is generated via SafeRandom; for NMR
AEADs, nonce_base XOR block_index is unique because block indices
are unique.  The relevant birthday bound for nonce collisions is
across files or across block rewrites under the same payload key;
see <xref target="aead-usage-bounds"/> for per-AEAD analysis.</t>
      </section>
      <section anchor="downgrade-resistance">
        <name>Downgrade Resistance</name>
        <t>SAFE has no algorithm negotiation: the Encryptor selects
encryption_parameters unilaterally, and the Decryptor either accepts
them or fails.  An active attacker who modifies
encryption_parameters (e.g., substituting a weaker AEAD) changes
the derived KEK (<xref target="kek-schedule"/>) and payload keys
(<xref target="payload-schedule"/>), causing CEK unwrapping or block decryption
to fail.  Forging a valid SAFE object with altered parameters
requires the attacker to also hold valid credentials for the target
LOCK.</t>
        <t>Decryptors <bcp14>SHOULD</bcp14> enforce a locally configured allowlist of
acceptable encryption parameters.  Rejecting algorithms outside
the allowlist limits the attack surface to supported primitives.</t>
        <t>The symmetric components of SAFE (HPKE export-only key schedules,
SafeDerive-based KEK aggregation, commitment prefixes, and AEAD
encryption) are not vulnerable to quantum attacks.
Grover's algorithm provides at most a quadratic speedup against
symmetric primitives, leaving all symmetric operations at or above
128-bit security.  The post-quantum migration surface is limited to
KEM selection.</t>
        <t>A deployment using Hash=turboshake256 eliminates all SHA-256
dependencies: per <xref target="I-D.ietf-hpke-hpke"/>, all KEMs use the
Hash-selected KDF internally.</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>This section addresses the privacy properties of SAFE per <xref target="RFC6973"/>.
SAFE is primarily a data-at-rest format; it does not define a transport
protocol, so many <xref target="RFC6973"/> considerations (correlation by IP, traffic
analysis of flows) do not apply directly.</t>
      <t>SAFE-encoded data reveals the following metadata to passive observers:
approximate payload size (from Base64 or binary length), recipient count
(from the number of LOCK blocks), and — when key identifiers are present
— linkability across files encrypted to the same recipient
(<xref target="recipient-anonymity"/>).  Hinted mode (<xref target="privacy-benefits"/>) reduces
linkability; anonymous mode eliminates key-identifier-based linking at
the cost of increased trial decryption.  Auth-mode sender identifiers
(<tt>sid</tt>, <tt>shint</tt>) create analogous sender linkability
(<xref target="sender-anonymity"/>).  Applications concerned about metadata leakage
<bcp14>SHOULD</bcp14> pad payloads and <bcp14>SHOULD</bcp14> prefer hinted or anonymous modes.</t>
      <t>Beyond the metadata listed above, the step types and KEM identifiers
in each LOCK are visible in cleartext, revealing the authentication
factors required (e.g., passphrase, X25519, ML-KEM-768).  In
multi-recipient files, the set of LOCK blocks reveals co-recipient
relationships.  For NMR AEADs, block rewrites at the same index
produce identical ciphertext when the plaintext is unchanged,
leaking equality (<xref target="derived-nonces-security"/>).  A comprehensive
<xref target="RFC6973"/> privacy analysis is deferred to a future revision.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="iana-aead">
        <name>SAFE AEAD Identifiers Registry</name>
        <t>IANA is requested to create a SAFE AEAD Identifiers registry.
Registration policy is Specification Required.  Designated Experts
should verify that proposed AEADs provide <xref target="RFC5116"/> semantics
with a 16-octet authentication tag and Nk of 32 octets (SAFE
derives all keys at 256 bits).  Experts <bcp14>MUST</bcp14> reject
registrations where Nk is not 32.  Identifiers <bcp14>MUST</bcp14> consist of
lowercase ASCII letters, digits, and hyphens, and <bcp14>MUST NOT</bcp14> exceed
255 octets.  The algorithm <bcp14>MUST</bcp14> be
appropriate for general-purpose use in encrypted data formats.</t>
        <t>Initial entries:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Identifier</th>
              <th align="left">Nk</th>
              <th align="left">Nn</th>
              <th align="left">NMR</th>
              <th align="left">Key-Epoch</th>
              <th align="left">Reference</th>
              <th align="left">Change Controller</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">aes-256-gcm</td>
              <td align="left">32</td>
              <td align="left">12</td>
              <td align="left">No</td>
              <td align="left">Recommended</td>
              <td align="left">
                <xref target="NIST-SP-800-38D"/></td>
              <td align="left">IETF</td>
            </tr>
            <tr>
              <td align="left">chacha20-poly1305</td>
              <td align="left">32</td>
              <td align="left">12</td>
              <td align="left">No</td>
              <td align="left">Required</td>
              <td align="left">
                <xref target="RFC8439"/></td>
              <td align="left">IETF</td>
            </tr>
            <tr>
              <td align="left">aes-256-gcm-siv</td>
              <td align="left">32</td>
              <td align="left">12</td>
              <td align="left">Yes</td>
              <td align="left">Not Applicable</td>
              <td align="left">
                <xref target="RFC8452"/></td>
              <td align="left">IETF</td>
            </tr>
            <tr>
              <td align="left">aegis-256</td>
              <td align="left">32</td>
              <td align="left">32</td>
              <td align="left">No</td>
              <td align="left">Not Recommended</td>
              <td align="left">
                <xref target="I-D.irtf-cfrg-aegis-aead"/></td>
              <td align="left">IETF</td>
            </tr>
            <tr>
              <td align="left">aegis-256x2</td>
              <td align="left">32</td>
              <td align="left">32</td>
              <td align="left">No</td>
              <td align="left">Not Recommended</td>
              <td align="left">
                <xref target="I-D.irtf-cfrg-aegis-aead"/></td>
              <td align="left">IETF</td>
            </tr>
          </tbody>
        </table>
        <t>Nk/Nn are key/nonce sizes in octets.  Nn is required to compute block
boundaries (<xref target="per-block-nonces"/>).  "NMR" indicates nonce-misuse
resistance.  "Key-Epoch" indicates whether Encryptors should include
Key-Epoch in CONFIG; see <xref target="safe-config"/> for normative requirements
and <xref target="epoch-key-derivation"/> for details.</t>
      </section>
      <section anchor="iana-kem">
        <name>SAFE KEM Identifiers Registry</name>
        <t>IANA is requested to create a SAFE KEM Identifiers registry.  This
registry maps SAFE's string identifiers (used in kem= parameters) to
HPKE KEM IDs.  Registration policy is Specification Required.
Designated Experts should verify that the KEM is registered in the
IANA HPKE KEM Identifiers registry, is compatible with HPKE
export-only mode (AEAD ID 0xFFFF) as specified in <xref target="hpke-step"/>,
and that a specification for SPKI encoding of public keys is
provided.  The Auth column indicates whether the KEM supports
AuthEncap/AuthDecap for HPKE Auth mode.  Encryptors <bcp14>MUST NOT</bcp14>
include <tt>sid</tt> or <tt>shint</tt> with KEMs where Auth=No.</t>
        <t>Initial entries:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Identifier</th>
              <th align="left">HPKE KEM ID</th>
              <th align="left">Encap Size</th>
              <th align="left">Auth</th>
              <th align="left">SPKI Encoding</th>
              <th align="left">Change Controller</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">x25519</td>
              <td align="left">0x0020</td>
              <td align="left">32 octets</td>
              <td align="left">Yes</td>
              <td align="left">
                <xref target="RFC8410"/></td>
              <td align="left">IETF</td>
            </tr>
            <tr>
              <td align="left">p-256</td>
              <td align="left">0x0010</td>
              <td align="left">65 octets</td>
              <td align="left">Yes</td>
              <td align="left">
                <xref target="RFC5480"/></td>
              <td align="left">IETF</td>
            </tr>
            <tr>
              <td align="left">ml-kem-768</td>
              <td align="left">0x0041</td>
              <td align="left">1088 octets</td>
              <td align="left">No</td>
              <td align="left">
                <xref target="I-D.ietf-lamps-kyber-certificates"/></td>
              <td align="left">IETF</td>
            </tr>
          </tbody>
        </table>
        <t>HPKE KEM IDs are defined in the IANA HPKE KEM Identifiers registry
established by <xref target="RFC9180"/>.  Identifiers <bcp14>MUST</bcp14>
consist of lowercase ASCII letters, digits, and hyphens, and <bcp14>MUST NOT</bcp14>
exceed 255 octets.</t>
      </section>
      <section anchor="iana-hash">
        <name>SAFE KDF Identifiers Registry</name>
        <t>IANA is requested to create a SAFE KDF Identifiers registry.
Registration policy is Specification Required.  Designated Experts
should verify that identifiers consist of lowercase ASCII letters,
digits, and hyphens, do not exceed 255 octets, that the underlying
KDF provides at least 128-bit security,
and that the entry references a KDF registered in the HPKE KDF
Identifiers registry (Section 7.2 of <xref target="RFC9180"/>).</t>
        <t>Each entry <bcp14>MUST</bcp14> reference a KDF registered in the HPKE KDF
Identifiers registry.  Two-stage KDFs provide Extract(salt, ikm),
Expand(prk, info, L), and Nh.  Single-stage KDFs
(<xref target="I-D.ietf-hpke-pq"/>) provide Derive(ikm, L).  The Nh column
specifies the output size in octets used for accumulator
contributions and commitment derivation; Nh <bcp14>MUST</bcp14> be 32 for all
registrations.  The Class column determines which SafeDerive
instantiation is used (see <xref target="hash-function"/>).</t>
        <t>The CONFIG field name remains "Hash" for wire compatibility;
the IANA registry is named "SAFE KDF Identifiers" because
the identifiers select a KDF (and its underlying hash
function) rather than a bare hash algorithm.</t>
        <t>All conforming implementations <bcp14>MUST</bcp14> implement sha-256, which is
the default when Hash is omitted from the SAFE CONFIG.
Implementations <bcp14>MAY</bcp14> implement turboshake256.</t>
        <t>Initial entries:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Identifier</th>
              <th align="left">HPKE KDF ID</th>
              <th align="left">Class</th>
              <th align="right">Nh</th>
              <th align="left">Reference</th>
              <th align="left">Change Controller</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">sha-256</td>
              <td align="left">0x0001</td>
              <td align="left">two-stage</td>
              <td align="right">32</td>
              <td align="left">
                <xref target="RFC5869"/></td>
              <td align="left">IETF</td>
            </tr>
            <tr>
              <td align="left">turboshake256</td>
              <td align="left">TBD</td>
              <td align="left">single-stage</td>
              <td align="right">32</td>
              <td align="left">
                <xref target="I-D.ietf-hpke-pq"/></td>
              <td align="left">IETF</td>
            </tr>
          </tbody>
        </table>
        <t>[RFC Editor: The HPKE KDF ID for turboshake256 is pending
allocation in the HPKE KDF Identifiers registry per
<xref target="I-D.ietf-hpke-pq"/>.  Replace "TBD" with the assigned value before
publication.]</t>
      </section>
      <section anchor="iana-steps">
        <name>SAFE Step Names Registry</name>
        <t>IANA is requested to create a SAFE Step Names registry.  Each
registration defines a step type conforming to the interface in
<xref target="steps"/>.  The registry has the following columns:</t>
        <dl>
          <dt>Step Name:</dt>
          <dd>
            <t>Unique ASCII identifier for the step type (e.g., "pass", "hpke").</t>
          </dd>
          <dt>Parameters Grammar:</dt>
          <dd>
            <t>ABNF grammar for step-specific parameters in the token, or "None" if
no parameters.</t>
          </dd>
          <dt>Inputs:</dt>
          <dd>
            <t>Description of required inputs (e.g., "user passphrase,
salt", "recipient private key, kemct").</t>
          </dd>
          <dt>Secret Length:</dt>
          <dd>
            <t><bcp14>MUST</bcp14> be 32 octets for all registered steps.</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t>Document specifying the step's derivation algorithm.</t>
          </dd>
        </dl>
        <t>Registration policy is Specification Required.  Designated Experts <bcp14>MUST</bcp14>
verify:</t>
        <ul spacing="normal">
          <li>
            <t>The derivation algorithm is deterministic and produces exactly
32 octets</t>
          </li>
          <li>
            <t>Parameter names do not conflict with existing registrations</t>
          </li>
          <li>
            <t>The specification provides complete implementation
guidance including the Encode binding form</t>
          </li>
        </ul>
        <t>Step names <bcp14>MUST</bcp14> match the grammar <tt>1*(ALPHA / DIGIT / "-")</tt> and <bcp14>MUST
NOT</bcp14> exceed 255 octets.</t>
        <t>Initial entries:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Step Name</th>
              <th align="left">Parameters Grammar</th>
              <th align="left">Inputs</th>
              <th align="left">Secret Length</th>
              <th align="left">Reference</th>
              <th align="left">Change Controller</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">pass</td>
              <td align="left">kdf, salt, (t, p, m for argon2id; c for pbkdf2)</td>
              <td align="left">passphrase, salt</td>
              <td align="left">32 octets</td>
              <td align="left">
                <xref target="passphrase-step"/></td>
              <td align="left">IETF</td>
            </tr>
            <tr>
              <td align="left">hpke</td>
              <td align="left">kem, kemct, id, (sid, shint for auth)</td>
              <td align="left">private key, kemct</td>
              <td align="left">32 octets</td>
              <td align="left">
                <xref target="hpke-step"/></td>
              <td align="left">IETF</td>
            </tr>
          </tbody>
        </table>
        <t>The pass step's algorithm variant (argon2id or pbkdf2) is
specified in the step token's <tt>kdf</tt> parameter.
The default KDF is argon2id; pbkdf2 is available for environments
where policy prohibits Argon2id.</t>
        <t>The hpke step additionally requires the step token itself
as input.  When <tt>sid</tt> or <tt>shint</tt> is present, the sender's
private key (for encryption) or public key (for decryption)
is also required.  Supported kem values are defined in
<xref target="kem-support"/>; key identifier computation is defined in
<xref target="hpke-step"/>.  hpke(...) with sid or shint is <bcp14>OPTIONAL</bcp14> and limited
to DHKEM-based KEMs (x25519, p-256).</t>
        <t>Future registrations <bcp14>MAY</bcp14> define additional step types (e.g., hardware
token, Oblivious Pseudorandom Function (OPRF)) or variant algorithms
for existing step names (subject to Designated Expert review for
interoperability impact).  A registration request <bcp14>MUST</bcp14> include:</t>
        <ul spacing="normal">
          <li>
            <t>Step Name and Parameters Grammar (ABNF)</t>
          </li>
          <li>
            <t>Complete list of Inputs with their sources</t>
          </li>
          <li>
            <t>Derivation algorithm producing exactly 32 octets</t>
          </li>
          <li>
            <t>Definition of any step-specific parameters (name, encoding, semantics)</t>
          </li>
          <li>
            <t>Security considerations for the step type</t>
          </li>
        </ul>
        <t>See <xref target="defining-new-steps"/> for an illustrative example.</t>
      </section>
      <section anchor="iana-config">
        <name>SAFE Config Options Registry</name>
        <t>IANA is requested to create a SAFE Config Options registry.  Each
registration defines a CONFIG field name and the registry or value set
that defines its legal values.  The registry has the following columns:</t>
        <dl>
          <dt>Field Name:</dt>
          <dd>
            <t>Case-sensitive ASCII field name used in SAFE CONFIG.</t>
          </dd>
          <dt>Value Definition:</dt>
          <dd>
            <t>Registry or fixed set of values allowed for the field.</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t>Document specifying the field and its semantics.</t>
          </dd>
        </dl>
        <t>Registration policy is Specification Required.  Designated Experts <bcp14>MUST</bcp14>
verify that the field name does not conflict with existing
registrations, that the specification defines default behavior when the
field is absent, and that the value definition is unambiguous.</t>
        <t>Initial entries:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field Name</th>
              <th align="left">Value Definition</th>
              <th align="left">Reference</th>
              <th align="left">Change Controller</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">AEAD</td>
              <td align="left">SAFE AEAD Identifiers registry</td>
              <td align="left">
                <xref target="iana-aead"/></td>
              <td align="left">IETF</td>
            </tr>
            <tr>
              <td align="left">Block-Size</td>
              <td align="left">16384, 65536</td>
              <td align="left">
                <xref target="safe-config"/></td>
              <td align="left">IETF</td>
            </tr>
            <tr>
              <td align="left">Hash</td>
              <td align="left">SAFE KDF Identifiers registry</td>
              <td align="left">
                <xref target="iana-hash"/></td>
              <td align="left">IETF</td>
            </tr>
            <tr>
              <td align="left">Key-Epoch</td>
              <td align="left">Non-negative integer; absent when disabled</td>
              <td align="left">
                <xref target="epoch-key-derivation"/></td>
              <td align="left">IETF</td>
            </tr>
            <tr>
              <td align="left">Lock-Encoding</td>
              <td align="left">armored (default), readable</td>
              <td align="left">
                <xref target="safe-lock"/></td>
              <td align="left">IETF</td>
            </tr>
            <tr>
              <td align="left">Data-Encoding</td>
              <td align="left">armored (default), binary, binary-linear</td>
              <td align="left">
                <xref target="data-encoding"/></td>
              <td align="left">IETF</td>
            </tr>
          </tbody>
        </table>
        <t>The default encoding is "armored" when the Data-Encoding field is
omitted.  The default Lock-Encoding is "armored" when omitted.
Key-Epoch is absent (disabled) when omitted.  Block-Size values
are fixed by this specification; adding new values requires a
Standards Track document update.</t>
      </section>
      <section anchor="iana-blocks">
        <name>SAFE Block Types Registry</name>
        <t>IANA is requested to create a SAFE Block Types registry.  This
registry lists the block types that may appear in SAFE-encoded data,
identified by
their fence markers.  The registry has the following columns:</t>
        <dl>
          <dt>Block Type:</dt>
          <dd>
            <t>The block type name as it appears in fence markers (e.g., "CONFIG",
"LOCK", "DATA").</t>
          </dd>
          <dt>Fence Marker:</dt>
          <dd>
            <t>The opening fence marker string (e.g., "-----BEGIN SAFE CONFIG-----").</t>
          </dd>
          <dt>Ignorable:</dt>
          <dd>
            <t>"Yes" if Decryptors <bcp14>MAY</bcp14> skip unrecognized instances of this block type
without failing; "No" if Decryptors <bcp14>MUST</bcp14> fail when encountering an
unrecognized block of this type.</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t>Document defining the block's semantics.</t>
          </dd>
        </dl>
        <t>Registration policy is Specification Required.  Designated Experts <bcp14>MUST</bcp14>
verify:</t>
        <ul spacing="normal">
          <li>
            <t>The block type name does not conflict with existing registrations</t>
          </li>
          <li>
            <t>The specification clearly defines the block's syntax and semantics</t>
          </li>
          <li>
            <t>Blocks marked Ignorable=Yes do not affect security or correctness
if omitted</t>
          </li>
        </ul>
        <t>Block type names <bcp14>MUST</bcp14> consist of uppercase ASCII letters and hyphens
and <bcp14>MUST NOT</bcp14> exceed 32 octets.</t>
        <t>Initial entries:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Block Type</th>
              <th align="left">Fence Marker</th>
              <th align="left">Ignorable</th>
              <th align="left">Reference</th>
              <th align="left">Change Controller</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">CONFIG</td>
              <td align="left">-----BEGIN SAFE CONFIG-----</td>
              <td align="left">No</td>
              <td align="left">
                <xref target="safe-config"/></td>
              <td align="left">IETF</td>
            </tr>
            <tr>
              <td align="left">LOCK</td>
              <td align="left">-----BEGIN SAFE LOCK-----</td>
              <td align="left">No</td>
              <td align="left">
                <xref target="safe-lock"/></td>
              <td align="left">IETF</td>
            </tr>
            <tr>
              <td align="left">DATA</td>
              <td align="left">-----BEGIN SAFE DATA-----</td>
              <td align="left">No</td>
              <td align="left">
                <xref target="armored-encoding"/></td>
              <td align="left">IETF</td>
            </tr>
          </tbody>
        </table>
        <t>All initial block types are critical (Ignorable=No).  Future extensions
<bcp14>MAY</bcp14> register new block types with Ignorable=Yes for optional features
such as detached signatures, metadata, or recipient hints.</t>
      </section>
      <section anchor="iana-media-type">
        <name>Media Type Registration</name>
        <t>IANA is requested to register the following media type per <xref target="RFC6838"/>:</t>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>application</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>safe</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>None</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>None</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>Binary or 7bit.  Armored-encoded SAFE data (the default) consists of
ASCII printable characters and line feeds, with Base64 encoding for
payload data.  Binary-encoded SAFE data have ASCII headers followed
by raw binary payload data.</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t>SAFE-encoded data contain encrypted content.  See
<xref target="security-considerations"/> of this document.</t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>SAFE-encoded data are ASCII-armored with PEM-style fence
markers.  Line wrapping of Base64 content is permitted;
Decryptors <bcp14>MUST</bcp14> accept any line length.</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t>This document</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>File encryption, secure file sharing, encrypted backups</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>None</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <t>Deprecated alias names for this type: None</t>
          </dd>
          <dt/>
          <dd>
            <t>Magic number(s): Files begin with "-----BEGIN SAFE" (ASCII)</t>
          </dd>
          <dt/>
          <dd>
            <t>File extension(s): .safe</t>
          </dd>
          <dt/>
          <dd>
            <t>Macintosh file type code(s): None</t>
          </dd>
          <dt>Person &amp; email address to contact for further information:</dt>
          <dd>
            <t>N. Sullivan (nicholas.sullivan+ietf@gmail.com)</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>None</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>See Authors' Addresses section</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
        </dl>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC5116">
          <front>
            <title>An Interface and Algorithms for Authenticated Encryption</title>
            <author fullname="D. McGrew" initials="D." surname="McGrew"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>This document defines algorithms for Authenticated Encryption with Associated Data (AEAD), and defines a uniform interface and a registry for such algorithms. The interface and registry can be used as an application-independent set of cryptoalgorithm suites. This approach provides advantages in efficiency and security, and promotes the reuse of crypto implementations. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5116"/>
          <seriesInfo name="DOI" value="10.17487/RFC5116"/>
        </reference>
        <reference anchor="RFC5234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
            <author fullname="P. Overell" initials="P." surname="Overell"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="68"/>
          <seriesInfo name="RFC" value="5234"/>
          <seriesInfo name="DOI" value="10.17487/RFC5234"/>
        </reference>
        <reference anchor="RFC5480">
          <front>
            <title>Elliptic Curve Cryptography Subject Public Key Information</title>
            <author fullname="S. Turner" initials="S." surname="Turner"/>
            <author fullname="D. Brown" initials="D." surname="Brown"/>
            <author fullname="K. Yiu" initials="K." surname="Yiu"/>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <author fullname="T. Polk" initials="T." surname="Polk"/>
            <date month="March" year="2009"/>
            <abstract>
              <t>This document specifies the syntax and semantics for the Subject Public Key Information field in certificates that support Elliptic Curve Cryptography. This document updates Sections 2.3.5 and 5, and the ASN.1 module of "Algorithms and Identifiers for the Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile", RFC 3279. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5480"/>
          <seriesInfo name="DOI" value="10.17487/RFC5480"/>
        </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="RFC6838">
          <front>
            <title>Media Type Specifications and Registration Procedures</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="13"/>
          <seriesInfo name="RFC" value="6838"/>
          <seriesInfo name="DOI" value="10.17487/RFC6838"/>
        </reference>
        <reference anchor="RFC8018">
          <front>
            <title>PKCS #5: Password-Based Cryptography Specification Version 2.1</title>
            <author fullname="K. Moriarty" initials="K." role="editor" surname="Moriarty"/>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski"/>
            <author fullname="A. Rusch" initials="A." surname="Rusch"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document provides recommendations for the implementation of password-based cryptography, covering key derivation functions, encryption schemes, message authentication schemes, and ASN.1 syntax identifying the techniques.</t>
              <t>This document represents a republication of PKCS #5 v2.1 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 2898.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8018"/>
          <seriesInfo name="DOI" value="10.17487/RFC8018"/>
        </reference>
        <reference anchor="RFC8410">
          <front>
            <title>Algorithm Identifiers for Ed25519, Ed448, X25519, and X448 for Use in the Internet X.509 Public Key Infrastructure</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <author fullname="J. Schaad" initials="J." surname="Schaad"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies algorithm identifiers and ASN.1 encoding formats for elliptic curve constructs using the curve25519 and curve448 curves. The signature algorithms covered are Ed25519 and Ed448. The key agreement algorithms covered are X25519 and X448. The encoding for public key, private key, and Edwards-curve Digital Signature Algorithm (EdDSA) structures is provided.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8410"/>
          <seriesInfo name="DOI" value="10.17487/RFC8410"/>
        </reference>
        <reference anchor="RFC8439">
          <front>
            <title>ChaCha20 and Poly1305 for IETF Protocols</title>
            <author fullname="Y. Nir" initials="Y." surname="Nir"/>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <date month="June" year="2018"/>
            <abstract>
              <t>This document defines the ChaCha20 stream cipher as well as the use of the Poly1305 authenticator, both as stand-alone algorithms and as a "combined mode", or Authenticated Encryption with Associated Data (AEAD) algorithm.</t>
              <t>RFC 7539, the predecessor of this document, was meant to serve as a stable reference and an implementation guide. It was a product of the Crypto Forum Research Group (CFRG). This document merges the errata filed against RFC 7539 and adds a little text to the Security Considerations section.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8439"/>
          <seriesInfo name="DOI" value="10.17487/RFC8439"/>
        </reference>
        <reference anchor="RFC9106">
          <front>
            <title>Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications</title>
            <author fullname="A. Biryukov" initials="A." surname="Biryukov"/>
            <author fullname="D. Dinu" initials="D." surname="Dinu"/>
            <author fullname="D. Khovratovich" initials="D." surname="Khovratovich"/>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="September" year="2021"/>
            <abstract>
              <t>This document describes the Argon2 memory-hard function for password hashing and proof-of-work applications. We provide an implementer-oriented description with test vectors. The purpose is to simplify adoption of Argon2 for Internet protocols. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9106"/>
          <seriesInfo name="DOI" value="10.17487/RFC9106"/>
        </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-hpke">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="Karthikeyan Bhargavan" initials="K." surname="Bhargavan">
              <organization>Inria</organization>
            </author>
            <author fullname="Benjamin Lipp" initials="B." surname="Lipp">
              <organization>Inria</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
         </author>
            <date day="2" month="March" year="2026"/>
            <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 a variant that authenticates possession of a pre-shared key.
   HPKE works for any combination of an asymmetric Key Encapsulation
   Mechanism (KEM), key derivation function (KDF), and authenticated
   encryption with additional data (AEAD) encryption function.  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>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-hpke-hpke-03"/>
        </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="2" month="March" 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-04"/>
        </reference>
        <reference anchor="I-D.ietf-lamps-kyber-certificates">
          <front>
            <title>Internet X.509 Public Key Infrastructure - Algorithm Identifiers for the Module-Lattice-Based Key-Encapsulation Mechanism (ML-KEM)</title>
            <author fullname="Sean Turner" initials="S." surname="Turner">
              <organization>sn3rd</organization>
            </author>
            <author fullname="Panos Kampanakis" initials="P." surname="Kampanakis">
              <organization>AWS</organization>
            </author>
            <author fullname="Jake Massimo" initials="J." surname="Massimo">
              <organization>AWS</organization>
            </author>
            <author fullname="Bas Westerbaan" initials="B." surname="Westerbaan">
              <organization>Cloudflare</organization>
            </author>
            <date day="22" month="July" year="2025"/>
            <abstract>
              <t>   The Module-Lattice-Based Key-Encapsulation Mechanism (ML-KEM) is a
   quantum-resistant key-encapsulation mechanism (KEM).  This document
   specifies the conventions for using the ML-KEM in X.509 Public Key
   Infrastructure.  The conventions for the subject public keys and
   private keys are also specified.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-lamps-kyber-certificates-11"/>
        </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="I-D.irtf-cfrg-aegis-aead">
          <front>
            <title>The AEGIS Family of Authenticated Encryption Algorithms</title>
            <author fullname="Frank Denis" initials="F." surname="Denis">
              <organization>Fastly Inc.</organization>
            </author>
            <author fullname="Samuel Lucas" initials="S." surname="Lucas">
              <organization>Individual Contributor</organization>
            </author>
            <date day="5" month="October" year="2025"/>
            <abstract>
              <t>   This document describes the AEGIS-128L, AEGIS-256, AEGIS-128X, and
   AEGIS-256X AES-based authenticated encryption algorithms designed for
   high-performance applications.

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

Discussion Venues

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

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-aegis-aead-18"/>
        </reference>
        <reference anchor="NIST-SP-800-38D" target="https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf">
          <front>
            <title>Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC</title>
            <author initials="M." surname="Dworkin">
              <organization/>
            </author>
            <date year="2007" month="November"/>
          </front>
          <seriesInfo name="NIST" value="Special Publication 800-38D"/>
        </reference>
        <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="RFC5652">
          <front>
            <title>Cryptographic Message Syntax (CMS)</title>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <date month="September" year="2009"/>
            <abstract>
              <t>This document describes the Cryptographic Message Syntax (CMS). This syntax is used to digitally sign, digest, authenticate, or encrypt arbitrary message content. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="70"/>
          <seriesInfo name="RFC" value="5652"/>
          <seriesInfo name="DOI" value="10.17487/RFC5652"/>
        </reference>
        <reference anchor="RFC6973">
          <front>
            <title>Privacy Considerations for Internet Protocols</title>
            <author fullname="A. Cooper" initials="A." surname="Cooper"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="B. Aboba" initials="B." surname="Aboba"/>
            <author fullname="J. Peterson" initials="J." surname="Peterson"/>
            <author fullname="J. Morris" initials="J." surname="Morris"/>
            <author fullname="M. Hansen" initials="M." surname="Hansen"/>
            <author fullname="R. Smith" initials="R." surname="Smith"/>
            <date month="July" year="2013"/>
            <abstract>
              <t>This document offers guidance for developing privacy considerations for inclusion in protocol specifications. It aims to make designers, implementers, and users of Internet protocols aware of privacy-related design choices. It suggests that whether any individual RFC warrants a specific privacy considerations section will depend on the document's content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6973"/>
          <seriesInfo name="DOI" value="10.17487/RFC6973"/>
        </reference>
        <reference anchor="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="RFC9497">
          <front>
            <title>Oblivious Pseudorandom Functions (OPRFs) Using Prime-Order Groups</title>
            <author fullname="A. Davidson" initials="A." surname="Davidson"/>
            <author fullname="A. Faz-Hernandez" initials="A." surname="Faz-Hernandez"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="December" year="2023"/>
            <abstract>
              <t>An Oblivious Pseudorandom Function (OPRF) is a two-party protocol between a client and a server for computing the output of a Pseudorandom Function (PRF). The server provides the PRF private key, and the client provides the PRF input. At the end of the protocol, the client learns the PRF output without learning anything about the PRF private key, and the server learns neither the PRF input nor output. An OPRF can also satisfy a notion of 'verifiability', called a VOPRF. A VOPRF ensures clients can verify that the server used a specific private key during the execution of the protocol. A VOPRF can also be partially oblivious, called a POPRF. A POPRF allows clients and servers to provide public input to the PRF computation. This document specifies an OPRF, VOPRF, and POPRF instantiated within standard prime-order groups, including elliptic curves. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9497"/>
          <seriesInfo name="DOI" value="10.17487/RFC9497"/>
        </reference>
        <reference anchor="RFC9578">
          <front>
            <title>Privacy Pass Issuance Protocols</title>
            <author fullname="S. Celi" initials="S." surname="Celi"/>
            <author fullname="A. Davidson" initials="A." surname="Davidson"/>
            <author fullname="S. Valdez" initials="S." surname="Valdez"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="June" year="2024"/>
            <abstract>
              <t>This document specifies two variants of the two-message issuance protocol for Privacy Pass tokens: one that produces tokens that are privately verifiable using the Issuer Private Key and one that produces tokens that are publicly verifiable using the Issuer Public Key. Instances of "issuance protocol" and "issuance protocols" in the text of this document are used interchangeably to refer to the two variants of the Privacy Pass issuance protocol.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9578"/>
          <seriesInfo name="DOI" value="10.17487/RFC9578"/>
        </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="RFC7516">
          <front>
            <title>JSON Web Encryption (JWE)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Hildebrand" initials="J." surname="Hildebrand"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Encryption (JWE) represents encrypted content using JSON-based data structures. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and IANA registries defined by that specification. Related digital signature and Message Authentication Code (MAC) capabilities are described in the separate JSON Web Signature (JWS) specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7516"/>
          <seriesInfo name="DOI" value="10.17487/RFC7516"/>
        </reference>
        <reference anchor="RFC9605">
          <front>
            <title>Secure Frame (SFrame): Lightweight Authenticated Encryption for Real-Time Media</title>
            <author fullname="E. Omara" initials="E." surname="Omara"/>
            <author fullname="J. Uberti" initials="J." surname="Uberti"/>
            <author fullname="S. G. Murillo" initials="S. G." surname="Murillo"/>
            <author fullname="R. Barnes" initials="R." role="editor" surname="Barnes"/>
            <author fullname="Y. Fablet" initials="Y." surname="Fablet"/>
            <date month="August" year="2024"/>
            <abstract>
              <t>This document describes the Secure Frame (SFrame) end-to-end encryption and authentication mechanism for media frames in a multiparty conference call, in which central media servers (Selective Forwarding Units or SFUs) can access the media metadata needed to make forwarding decisions without having access to the actual media.</t>
              <t>This mechanism differs from the Secure Real-Time Protocol (SRTP) in that it is independent of RTP (thus compatible with non-RTP media transport) and can be applied to whole media frames in order to be more bandwidth efficient.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9605"/>
          <seriesInfo name="DOI" value="10.17487/RFC9605"/>
        </reference>
        <reference anchor="I-D.ietf-ohai-chunked-ohttp">
          <front>
            <title>Chunked Oblivious HTTP Messages</title>
            <author fullname="Tommy Pauly" initials="T." surname="Pauly">
              <organization>Apple</organization>
            </author>
            <author fullname="Martin Thomson" initials="M." surname="Thomson">
              <organization>Mozilla</organization>
            </author>
            <date day="18" month="February" year="2026"/>
            <abstract>
              <t>   This document defines a variant of the Oblivious HTTP message format
   that allows chunks of requests and responses to be encrypted and
   decrypted before the entire request or response is processed.  This
   allows incremental processing of Oblivious HTTP messages, which is
   particularly useful for handling large messages or systems that
   process messages slowly.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ohai-chunked-ohttp-08"/>
        </reference>
        <reference anchor="AEA" target="https://support.apple.com/guide/security/protecting-app-access-to-user-data-secddd150c21/web">
          <front>
            <title>Apple Encrypted Archive (AEA)</title>
            <author>
              <organization>Apple Inc.</organization>
            </author>
            <date year="2024"/>
          </front>
        </reference>
        <reference anchor="AGE" target="https://age-encryption.org/v1">
          <front>
            <title>The age file encryption format</title>
            <author initials="F." surname="Valsorda">
              <organization/>
            </author>
            <date year="2025"/>
          </front>
        </reference>
        <reference anchor="AGE-COMMIT" target="https://ethz.ch/content/dam/ethz/special-interest/infk/inst-infsec/appliedcrypto/education/theses/semester-project_mirco-stauble.pdf">
          <front>
            <title>Actually Good Encryption? Confusing Users by Changing Nonces</title>
            <author initials="M." surname="Stäuble">
              <organization/>
            </author>
            <date year="2022"/>
          </front>
          <seriesInfo name="ETH Zürich" value="Semester Project"/>
        </reference>
        <reference anchor="W3C.webauthn-3" target="https://www.w3.org/TR/webauthn-3/">
          <front>
            <title>Web Authentication: An API for accessing Public Key Credentials - Level 3</title>
            <author/>
          </front>
          <seriesInfo name="W3C WD" value="webauthn-3"/>
          <seriesInfo name="W3C" value="webauthn-3"/>
        </reference>
        <reference anchor="STREAM" target="https://eprint.iacr.org/2015/189">
          <front>
            <title>Online Authenticated-Encryption and its Nonce-Reuse Misuse-Resistance</title>
            <author initials="V. T." surname="Hoang">
              <organization/>
            </author>
            <author initials="R." surname="Reyhanitabar">
              <organization/>
            </author>
            <author initials="P." surname="Rogaway">
              <organization/>
            </author>
            <author initials="D." surname="Vizár">
              <organization/>
            </author>
            <date year="2015"/>
          </front>
          <seriesInfo name="IACR" value="ePrint 2015/189"/>
        </reference>
        <reference anchor="FLOE" target="https://eprint.iacr.org/2025/2275">
          <front>
            <title>Random-Access AEAD for Fast Lightweight Online Encryption</title>
            <author initials="A." surname="Fábrega">
              <organization/>
            </author>
            <author initials="J." surname="Len">
              <organization/>
            </author>
            <author initials="T." surname="Ristenpart">
              <organization/>
            </author>
            <author initials="G." surname="Rubin">
              <organization/>
            </author>
            <date year="2025"/>
          </front>
          <seriesInfo name="IACR" value="ePrint 2025/2275"/>
        </reference>
      </references>
    </references>
    <?line 3511?>

<section anchor="examples">
      <name>Examples</name>
      <t>This appendix is informative.</t>
      <t>Note: The examples in this section illustrate structure and formatting
only.  The Base64 values are placeholders and do not represent valid
cryptographic outputs.  Implementers requiring test vectors with known
inputs and outputs should consult the Test Vectors appendix
(<xref target="test-vectors"/>).</t>
      <t>A minimal object with readable LOCK format (Lock-Encoding set to
readable; aes-256-gcm, commitment prefix):</t>
      <artwork><![CDATA[
-----BEGIN SAFE CONFIG-----
Lock-Encoding: readable
-----END SAFE CONFIG-----
-----BEGIN SAFE LOCK-----
Step: pass(kdf=argon2id, salt=c2FsdHZhbHVlMTIzNDU2Nzg=)
Encrypted-CEK:
  MTIzNDU2Nzg5MDEyM0FCQ0RFRkdISUpLTE1OT1BRUlNU
  VVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNA==
-----END SAFE LOCK-----
-----BEGIN SAFE DATA-----
cGxhY2Vob2xkZXJjZWtjb21taXRtZW50aGFzaDEyMzQ1Njc4YWJjZGVmZ2hpamts
bW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3
ODkrLz09
-----END SAFE DATA-----
]]></artwork>
      <t>A LOCK block encoded as armored (default Lock-Encoding):</t>
      <artwork><![CDATA[
-----BEGIN SAFE LOCK-----
U3RlcDpwYXNzKGtkZj1hcmdvbjJpZCxzYWx0PWMyRnNkSFpoYkhWbE1USXpORFUy
TnpnPSlFbmNyeXB0ZWQtQ0VLOk1USXpORFUyTnpnNU1ERXlNMEZDUTBSRlJrZElT
VXBMVEUxT1QxQlJVbE5VVlZaWFdGbGFZV0pqWkdWbVoyaHBhbXRzYlc1dmNIRnlj
M1IxZG5kNGVYb3dNVEl6TkE9PQ==
-----END SAFE LOCK-----
-----BEGIN SAFE DATA-----
YmFzZTY0bG9ja2V4YW1wbGVkYXRhY2h1bmtwbGFjZWhvbG
RlcmV4YW1wbGVkYXRhMTIzNDU2
-----END SAFE DATA-----
]]></artwork>
      <t>HPKE recipient in armored format (derived from the readable
example above):</t>
      <artwork><![CDATA[
-----BEGIN SAFE CONFIG-----
Block-Size: 16384
-----END SAFE CONFIG-----
-----BEGIN SAFE LOCK-----
U3RlcDpocGtlKGtlbT14MjU1MTksaWQ9Wmk2bVFuWTVqOHBJWXEzbzZyV2dOdz09
LGtlbWN0PVlXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWMzUjFkbmQ0ZVhveE1qTTBO
VFkzT0RrdylFbmNyeXB0ZWQtQ0VLOmNHRnpjM2R2Y21ReE1qTTBOVFkzT0Rrd1lX
SmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWMzUjFkbmQ0ZVhveE1qTTBOVFkzT0Rrd1lX
SmpaR1ZtWjJocGFnPT0=
-----END SAFE LOCK-----
-----BEGIN SAFE DATA-----
aHBrZWV4YW1wbGVjZWtjb21taXRtZW50aGFzaHZhbHVlMTJWR2hwY3lCcGN5QmhJ
SE5oYlhCc1pTQmxibU55ZVhCMFpXUWdjR0Y1Ykc5aFpDQjNhWFJvSUcxMWJIUnBj
R3hsSUdOb2RXNXJjdz09
-----END SAFE DATA-----
]]></artwork>
      <t>A HPKE recipient with non-default Block-Size (AEAD omitted, uses default
aes-256-gcm with commitment prefix):</t>
      <artwork><![CDATA[
-----BEGIN SAFE CONFIG-----
Block-Size: 16384
Lock-Encoding: readable
-----END SAFE CONFIG-----
-----BEGIN SAFE LOCK-----
Step: hpke(kem=x25519, id=Zi6mQnY5j8pIYq3o6rWgNw==,
  kemct=YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY3ODkw)
Encrypted-CEK:
  cGFzc3dvcmQxMjM0NTY3ODkwYWJjZGVmZ2hpamtsbW5vcHFy
  c3R1dnd4eXoxMjM0NTY3ODkwYWJjZGVmZ2hpag==
-----END SAFE LOCK-----
-----BEGIN SAFE DATA-----
aHBrZWV4YW1wbGVjZWtjb21taXRtZW50aGFzaHZhbHVlMTJWR2hwY3lCcGN5QmhJ
SE5oYlhCc1pTQmxibU55ZVhCMFpXUWdjR0Y1Ykc5aFpDQjNhWFJvSUcxMWJIUnBj
R3hsSUdOb2RXNXJjdz09
-----END SAFE DATA-----
]]></artwork>
      <t>HPKE recipient with Hash: turboshake256 (32-octet key identifier,
default aes-256-gcm with commitment prefix):</t>
      <artwork><![CDATA[
-----BEGIN SAFE CONFIG-----
Hash: turboshake256
Lock-Encoding: readable
-----END SAFE CONFIG-----
-----BEGIN SAFE LOCK-----
Step: hpke(kem=x25519,
  id=dHVyYm9zaGFrZTI1NmV4YW1wbGVoYXNoMzJvY3RldHM=,
  kemct=dHVyYm9zaGFrZWtlbWNpcGhlcnRleHRleGFtcGxlMTIz)
Encrypted-CEK:
  dHVyYm9ub25jZTEyMzQ1Njc4OWFiY2RlZmdoaWprbG1u
  b3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OTBhYmNkZWZnaGk=
-----END SAFE LOCK-----
-----BEGIN SAFE DATA-----
dHVyYm9zaGFrZWNla2NvbW1pdG1lbnRleGFtcGxlaGFzaDFSeGhiWEJzWlNCMWMy
bHVaeUJ6Y0d0cExYUjFjbUp2YzJoaGEyVXlOVFlnYTJWNUlHbGtaVzUwYVdacFpY
SWdkMmwwYUNBek1pMXZZM1JsZENBPT0=
-----END SAFE DATA-----
]]></artwork>
      <t>AEGIS-256 with TurboShake key identifier (commitment prefix in DATA):</t>
      <artwork><![CDATA[
-----BEGIN SAFE CONFIG-----
AEAD: aegis-256
Hash: turboshake256
Lock-Encoding: readable
-----END SAFE CONFIG-----
-----BEGIN SAFE LOCK-----
Step: hpke(kem=x25519,
  id=YWVnaXN0dXJib3NoYWtlaWRlbnRpZmllcjMyYnl0ZXM=,
  kemct=YWVnaXNrZW1jaXBoZXJ0ZXh0ZXhhbXBsZTEyMzQ1Njc4)
Encrypted-CEK:
  YWVnaXNub25jZTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIz
  YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2
  Nzg5MGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6
-----END SAFE LOCK-----
-----BEGIN SAFE DATA-----
YWVnaXNub2NvbW1pdG1lbnRjaHVua2NpcGhlcnRleHRvbmx5ZXhhbXBsZWRhdGE=
-----END SAFE DATA-----
]]></artwork>
      <t>Anonymous X25519 recipient (trial decryption required):</t>
      <artwork><![CDATA[
-----BEGIN SAFE CONFIG-----
Lock-Encoding: readable
-----END SAFE CONFIG-----
-----BEGIN SAFE LOCK-----
Step: hpke(kem=x25519,
  kemct=YW5vbnltb3VzZW5jYXBzdWxhdGVka2V5bWF0ZXJpYWwx
  MjM0NTY3ODkwYWJjZGVmZ2hpamtsbW5vcHFyc3R1dg==)
Encrypted-CEK:
  YW5vbnltb3VzZW5jcnlwdGVkY2VrZGF0YTEyMzQ1Njc4
  OTBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMg==
-----END SAFE LOCK-----
-----BEGIN SAFE DATA-----
YW5vbnltb3VzY2VrY29tbWl0bWVudGhhc2h2YWx1ZXBheWxvYWRjaHVua2RhdGE=
-----END SAFE DATA-----
]]></artwork>
      <t>Hinted ML-KEM-768 recipient (4-digit hint for candidate filtering):</t>
      <artwork><![CDATA[
-----BEGIN SAFE CONFIG-----
Lock-Encoding: readable
-----END SAFE CONFIG-----
-----BEGIN SAFE LOCK-----
Step: hpke(kem=ml-kem-768, hint=4217,
  kemct=bWxrZW1jaXBoZXJ0ZXh0d2l0aGhpbnRlZHJlY2lwaWVu
  dGZpbHRlcmluZ2V4YW1wbGVkYXRhMTIzNDU2Nzg5MA==)
Encrypted-CEK:
  aGludGVkZW5jcnlwdGVkY2VrZGF0YWV4YW1wbGUxMjM0
  NTY3ODkwYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo=
-----END SAFE LOCK-----
-----BEGIN SAFE DATA-----
aGludGVkY2VrY29tbWl0bWVudGhhc2h2YWx1ZXBheWxvYWRjaHVua2RhdGFoZXJl
-----END SAFE DATA-----
]]></artwork>
      <t>Two recipients, one passphrase-only and one HPKE (default aes-256-gcm):</t>
      <artwork><![CDATA[
-----BEGIN SAFE CONFIG-----
Lock-Encoding: readable
-----END SAFE CONFIG-----
-----BEGIN SAFE LOCK-----
Step: pass(kdf=argon2id, salt=cHdkc2FsdDEyMzQ1Njc4OTA=)
Encrypted-CEK:
  cHdkbm9uY2UxMjM0NTY3ODkwYWJjZGVmZ2hpamtsbW5vcHFy
  c3R1dnd4eXowMTIzNDU2Nzg5MGFiY2RlZmdoaWo=
-----END SAFE LOCK-----
-----BEGIN SAFE LOCK-----
Step: hpke(kem=p-256, id=Z1d0u6QG0cB2a4nM3Kp2Ww==,
  kemct=QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlq
  a2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkwYWJjZGVmZ2hp
  amtsbW5vcHFyc3R1dnd4eXo=)
Encrypted-CEK:
  aHBrZW5vbmNlMTIzNDU2Nzg5MGFiY2RlZmdoaWprbG1ub3Bx
  cnN0dXZ3eHl6MDEyMzQ1Njc4OTBhYmNkZWZnaGlq
-----END SAFE LOCK-----
-----BEGIN SAFE DATA-----
bXVsdGlyZWNpcGllbnRjZWtjb21taXRtZW50aGFzaHZhbHVlVFhWc2RHa3RjbVZq
YVhCcFpXNTBJR1Y0WVcxd2JHVWdkMmwwYUNCemFHRnlaV1FnY0dGNWJHOWhaQ0Js
Ym1OeWVYQjBaV1FnYjI1alpRPT0=
-----END SAFE DATA-----
]]></artwork>
      <t>Multi-step sequence with AND semantics (passphrase AND HPKE,
chacha20-poly1305 with commitment prefix):</t>
      <artwork><![CDATA[
-----BEGIN SAFE CONFIG-----
AEAD: chacha20-poly1305
Block-Size: 16384
Key-Epoch: 0
Lock-Encoding: readable
-----END SAFE CONFIG-----
-----BEGIN SAFE LOCK-----
Step: pass(kdf=argon2id, salt=bXVsdGlzdGVwc2FsdDEyMzQ=)
Step: hpke(kem=x25519, id=eEF3bXlyT3BWbXpLUjRCdz09,
  kemct=bXVsdGlzdGVwZXhhbXBsZWtlbWNpcGhlcnRleHQxMjM0NTY3)
Encrypted-CEK:
  bXVsdGlzdGVwbm9uY2UxMjM0NTY3ODkwYWJjZGVmZ2hpamts
  bW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5MGFiYw==
-----END SAFE LOCK-----
-----BEGIN SAFE DATA-----
bXVsdGlzdGVwY2VrY29tbWl0bWVudGhhc2h2YWx1ZTEyMzQ1VW1WeGRXbHlaWE1n
WW05MGFDQndZWE56ZDI5eVpDQkJUa1FnV0RJMU5URTVJSEJ5YVhaaGRHVWdhMlY1
SUhSdklHUmxZM0o1Y0hRPQ==
-----END SAFE DATA-----
]]></artwork>
      <t>Same multi-step example in armored format (default Lock-Encoding):</t>
      <artwork><![CDATA[
-----BEGIN SAFE CONFIG-----
AEAD: chacha20-poly1305
Block-Size: 16384
Key-Epoch: 0
-----END SAFE CONFIG-----
-----BEGIN SAFE LOCK-----
U3RlcDpwYXNzKGtkZj1hcmdvbjJpZCxzYWx0PWJYVnNkR2x6ZEdWd2MyRnNkREV5
TXpRPSlTdGVwOmhwa2Uoa2VtPXgyNTUxOSxpZD1lRUYzYlhseVQzQldiWHBMVWpS
Q2R6MDksa2VtY3Q9YlhWc2RHbHpkR1Z3WlhoaGJYQnNaV3RsYldOcGNHaGxjblJs
ZUhReE1qTTBOVFkzKUVuY3J5cHRlZC1DRUs6YlhWc2RHbHpkR1Z3Ym05dVkyVXhN
ak0wTlRZM09Ea3dZV0pqWkdWbVoyaHBhbXRzYlc1dmNIRnljM1IxZG5kNGVYb3dN
VEl6TkRVMk56ZzVNR0ZpWXc9PQ==
-----END SAFE LOCK-----
-----BEGIN SAFE DATA-----
bXVsdGlzdGVwY2VrY29tbWl0bWVudGhhc2h2YWx1ZTEyMzQ1VW1WeGRXbHlaWE1n
WW05MGFDQndZWE56ZDI5eVpDQkJUa1FnV0RJMU5URTVJSEJ5YVhaaGRHVWdhMlY1
SUhSdklHUmxZM0o1Y0hRPQ==
-----END SAFE DATA-----
]]></artwork>
      <t>Note: The armored LOCK examples above use placeholder Base64 values.
The armored payload is Base64(Encode(step_1, ..., encrypted_cek)) per
<xref target="armored-lock-format"/>.</t>
      <t>Two-passphrase step sequence (requires both passphrases to decrypt):</t>
      <artwork><![CDATA[
-----BEGIN SAFE CONFIG-----
Lock-Encoding: readable
-----END SAFE CONFIG-----
-----BEGIN SAFE LOCK-----
Step: pass(kdf=argon2id, salt=Zmlyc3RwYXNzd29yZHNhbHQ=)
Step: pass(kdf=pbkdf2, salt=c2Vjb25kcGFzc3dvcmRzYWx0)
Encrypted-CEK:
  dHdvcGFzc3dvcmRub25jZTEyMzQ1Njc4OTBhYmNkZWZnaGlq
  a2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkwYWI=
-----END SAFE LOCK-----
]]></artwork>
      <t>Hybrid post-quantum step sequence (X25519 AND ML-KEM-768, default
aes-256-gcm with commitment prefix):</t>
      <artwork><![CDATA[
-----BEGIN SAFE CONFIG-----
Lock-Encoding: readable
-----END SAFE CONFIG-----
-----BEGIN SAFE LOCK-----
Step: hpke(kem=x25519, id=cHF6RmlucHJpbnQxMjM0NTY3,
  kemct=eDI1NTE5a2VtY2lwaGVydGV4dDEyMzQ1Njc4OTBhYmNkZWY=)
Step: hpke(kem=ml-kem-768, id=bWxrZW1maW5nZXJwcmludDEyMw==,
  kemct=bWxrZW03NjhrZW1jaXBoZXJ0ZXh0ZXh0cmVtZWx5bG9uZ2Jh
  c2U2NGVuY29kZWRkYXRhYXBwcm94aW1hdGVseTEwODhvY3Rl
  dHNmb3JwcXNlY3VyaXR5dGhpc2lzZHVtbXlkYXRhZm9yZGVt
  ...
  NzY4a2VtY2lwaGVydGV4dGVuY2Fwc3VsYXRpb25kYXRh)
Encrypted-CEK:
  aHlicmlkbm9uY2UxMjM0NTY3ODkwYWJjZGVmZ2hpamtsbW5v
  cHFyc3R1dnd4eXowMTIzNDU2Nzg5MGFiY2RlZmc=
-----END SAFE LOCK-----
-----BEGIN SAFE DATA-----
aHlicmlkcHFjZWtjb21taXRtZW50aGFzaHZhbHVlMTIzNDU2VUc5emRDMXhkV0Z1
ZEhWdElHaDVZbkpwWkNCbGVHRnRjR3hsSUdSbGJXOXVjM1J5WVhScGJtY2dZMjl0
WW1sdVpXUWdXREkxTlRFNUlHRnVaQ0JOVEMxTFJVMHQ=
-----END SAFE DATA-----
]]></artwork>
    </section>
    <section anchor="implementation-guide">
      <name>Implementation Guide</name>
      <t>This appendix is informative.  For a concise summary of the
encryptor and decryptor flows, see <xref target="protocol-overview"/>.</t>
      <section anchor="encryptor-processing">
        <name>Encryptor Processing</name>
        <t>Encryptor processing proceeds in three phases: setup, recipient key
wrapping, and content encryption.</t>
        <t>During setup, the Encryptor:</t>
        <ol spacing="normal" type="1"><li>
            <t>Selects an AEAD algorithm and Block-Size (or accepts defaults)</t>
          </li>
          <li>
            <t>Emits a SAFE CONFIG block if using non-default values</t>
          </li>
          <li>
            <t>Generates a random 32-octet CEK: <tt>SafeRandom(32, "SAFE-CEK")</tt></t>
          </li>
          <li>
            <t>Generates a 32-octet salt: <tt>SafeRandom(32, "SAFE-SALT")</tt></t>
          </li>
        </ol>
        <t>Encryptors should generate a fresh CEK for each file.  When the same
CEK is reused across files, the per-file salt ensures payload keys
are unique: each salt produces distinct commitment, payload_key,
acc_key, and nonce_base values via <xref target="payload-schedule"/>.</t>
        <t>For each recipient, the Encryptor wraps the CEK by:</t>
        <ol spacing="normal" type="1"><li>
            <t>Emitting Step lines with required step parameters (<tt>salt</tt> for
pass steps, <tt>kemct</tt> for hpke steps)</t>
          </li>
          <li>
            <t>Generating a fresh lock_nonce: <tt>SafeRandom(Nn, "SAFE-LOCK-NONCE")</tt></t>
          </li>
          <li>
            <t>Deriving step secrets and computing the KEK per <xref target="kek-schedule"/></t>
          </li>
          <li>
            <t>Emitting the Encrypted-CEK field</t>
          </li>
        </ol>
        <t>To encrypt content, the Encryptor:</t>
        <ol spacing="normal" type="1"><li>
            <t>Derives payload_key from the CEK, encryption_parameters, and
salt per <xref target="payload-schedule"/></t>
          </li>
          <li>
            <t>Splits the plaintext into Block-Size blocks (N blocks total)</t>
          </li>
          <li>
            <t>For NMR AEADs, derives nonce_base per <xref target="payload-schedule"/>
and computes nonce_i = nonce_base XOR uint64(i) for each
block.  For non-NMR AEADs, generates per-block nonces using
one of the constructions in <xref target="nonce-constructions"/>.</t>
          </li>
          <li>
            <t>For each block i:
a.  Computes nonce_i per the chosen construction
b.  Determines is_final = 1 if i == N - 1, else 0
c.  Constructs data_aad(i, is_final) per <xref target="data-aad"/>
d.  Computes key_i = block_key(i)
   (<xref target="epoch-key-derivation"/>).
e.  For non-NMR AEADs: emits nonce_i ||
   AEAD.Seal(key_i, nonce_i, aad, block).  For NMR
   AEADs: emits AEAD.Seal(key_i, nonce_i, aad, block)
   (ciphertext and tag only; nonce is not stored).</t>
          </li>
        </ol>
      </section>
      <section anchor="decryptor-processing">
        <name>Decryptor Processing</name>
        <t>Decryptor processing proceeds in three phases: configuration, CEK
recovery, and content decryption.</t>
        <t>During configuration, the Decryptor reads the SAFE CONFIG (if present)
to learn non-default values and constructs encryption_parameters from
AEAD, Block-Size, and Hash.</t>
        <t>To recover the CEK, the Decryptor:</t>
        <ol spacing="normal" type="1"><li>
            <t>Selects a LOCK block per <xref target="recipient-discovery"/></t>
          </li>
          <li>
            <t>Parses lock_nonce (first Nn octets) from the Encrypted-CEK field</t>
          </li>
          <li>
            <t>Evaluates steps to derive the KEK per <xref target="kek-schedule"/></t>
          </li>
          <li>
            <t>Decrypts Encrypted-CEK to recover the 32-octet CEK</t>
          </li>
        </ol>
        <t>Encrypted-CEK size validation is specified in <xref target="safe-lock"/>.</t>
        <t>To decrypt content, the Decryptor reads the 32-octet salt from the
start of the DATA block, then derives payload_key from the CEK,
encryption_parameters, and salt per <xref target="payload-schedule"/>.  For each
block i, the Decryptor computes key_i = block_key(i)
(<xref target="epoch-key-derivation"/>).  For NMR AEADs, the Decryptor derives
nonce_base and computes nonce_i = nonce_base XOR uint64(i).
For non-NMR AEADs, the Decryptor reads each nonce from the stored
metadata.  Each block is decrypted using key_i, its nonce,
ciphertext, tag, and data_aad(i, is_final) per <xref target="data-aad"/>.
The location of these components depends on the layout:</t>
        <ul spacing="normal">
          <li>
            <t>Linear layout (<xref target="linear-layout"/>): for non-NMR AEADs, each
encrypted block contains nonce, ciphertext, and tag
concatenated; for NMR AEADs, ciphertext and tag only.</t>
          </li>
          <li>
            <t>Aligned layout (<xref target="aligned-layout"/>): for non-NMR AEADs,
nonces and tags are in the header metadata array; for NMR
AEADs, only tags are stored.  Ciphertext blocks are at
aligned offsets.</t>
          </li>
        </ul>
        <t>See <xref target="selective-decryption"/> for offset calculations.</t>
      </section>
    </section>
    <section anchor="error-codes">
      <name>Error Codes for Testing</name>
      <t>This appendix is informative.</t>
      <t>For interoperability testing, implementations <bcp14>MAY</bcp14> use the following
error identifiers to categorize failures:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Error Code</th>
            <th align="left">Description</th>
            <th align="left">When to Emit</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">ERR_UNSUPPORTED_AEAD</td>
            <td align="left">Unknown AEAD algorithm</td>
            <td align="left">Parsing SAFE CONFIG</td>
          </tr>
          <tr>
            <td align="left">ERR_UNSUPPORTED_KEM</td>
            <td align="left">Unknown KEM identifier</td>
            <td align="left">Parsing hpke(...) step</td>
          </tr>
          <tr>
            <td align="left">ERR_INVALID_BLOCK_SIZE</td>
            <td align="left">Invalid Block-Size value</td>
            <td align="left">Parsing SAFE CONFIG</td>
          </tr>
          <tr>
            <td align="left">ERR_HPKE_NO_MATCH</td>
            <td align="left">No matching private key</td>
            <td align="left">Recipient discovery</td>
          </tr>
          <tr>
            <td align="left">ERR_HPKE_DECAP_FAILED</td>
            <td align="left">HPKE decapsulation error</td>
            <td align="left">CEK recovery</td>
          </tr>
          <tr>
            <td align="left">ERR_LOCK_AEAD_FAILED</td>
            <td align="left">Encrypted-CEK decryption failed</td>
            <td align="left">CEK recovery</td>
          </tr>
          <tr>
            <td align="left">ERR_PAYLOAD_AEAD_FAILED</td>
            <td align="left">Block decryption failed</td>
            <td align="left">Content decryption</td>
          </tr>
          <tr>
            <td align="left">ERR_BLOCK_OUT_OF_RANGE</td>
            <td align="left">Block index invalid</td>
            <td align="left">Content decryption</td>
          </tr>
          <tr>
            <td align="left">ERR_MALFORMED_BASE64</td>
            <td align="left">Base64 decoding error</td>
            <td align="left">Any Base64 field</td>
          </tr>
          <tr>
            <td align="left">ERR_DUPLICATE_FIELD</td>
            <td align="left">Repeated field name</td>
            <td align="left">Parsing SAFE CONFIG</td>
          </tr>
          <tr>
            <td align="left">ERR_DUPLICATE_PARAM</td>
            <td align="left">Repeated step parameter</td>
            <td align="left">Parsing Step lines</td>
          </tr>
          <tr>
            <td align="left">ERR_MISSING_SALT</td>
            <td align="left">pass(...) without <tt>salt</tt></td>
            <td align="left">Parsing LOCK</td>
          </tr>
          <tr>
            <td align="left">ERR_MISSING_KEMCT</td>
            <td align="left">hpke(...) without <tt>kemct</tt></td>
            <td align="left">Parsing LOCK</td>
          </tr>
          <tr>
            <td align="left">ERR_MULTIPLE_PASS_ONLY_LOCK</td>
            <td align="left">Multiple same-variant pass-only LOCKs</td>
            <td align="left">Discovery</td>
          </tr>
          <tr>
            <td align="left">ERR_NON_ASCII_HEADER</td>
            <td align="left">Non-ASCII in header</td>
            <td align="left">Parsing any header</td>
          </tr>
          <tr>
            <td align="left">ERR_RESOURCE_LIMIT</td>
            <td align="left">Size/count limit exceeded</td>
            <td align="left">Parsing any block</td>
          </tr>
          <tr>
            <td align="left">ERR_INVALID_SALT_LENGTH</td>
            <td align="left">salt not exactly 16 octets</td>
            <td align="left">Parsing <tt>salt</tt></td>
          </tr>
          <tr>
            <td align="left">ERR_COMMITMENT_MISMATCH</td>
            <td align="left">Commitment verification failed</td>
            <td align="left">Key schedule</td>
          </tr>
          <tr>
            <td align="left">ERR_ACCUMULATOR_MISMATCH</td>
            <td align="left">Accumulator verification failed</td>
            <td align="left">Integrity check</td>
          </tr>
          <tr>
            <td align="left">ERR_TRUNCATION</td>
            <td align="left">Missing final block or block with is_final=0 at EOF</td>
            <td align="left">Content decryption</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="armored-data-arithmetic">
      <name>Armored Data Arithmetic</name>
      <t>This appendix is informative.</t>
      <t>In armored mode, Decryptors compute the block count N and final block
size from the Base64 payload length.  Let S_b64 be the payload string
between the fences, len_b64 its length in characters, pad the number
of trailing <tt>=</tt> signs (0, 1, or 2), and len_bin_total = 3 *
floor(len_b64 / 4) - pad.  The header region is 32 (salt) + 32
(commitment) + Nh (accumulator) octets.  The encrypted block region
is len_bin_ciphertext = len_bin_total - 64 - Nh.  Let B = Block-Size
and Nn = AEAD nonce length.  For NMR AEADs, nonces are derived
(not stored), so the per-block overhead excludes Nn.  Define:</t>
      <artwork><![CDATA[
if NMR:
    C      = B + 16
    C_min  = 16           # minimum: tag only
else:
    C      = Nn + B + 16
    C_min  = Nn + 16      # minimum: nonce + tag

N_nonfinal = floor( len_bin_ciphertext / C )
rem        = len_bin_ciphertext - N_nonfinal * C
if rem == 0:
    N       = N_nonfinal
    C_final = C
else if rem < C_min:
    reject as malformed
else:
    N       = N_nonfinal + 1
    C_final = rem

if NMR:
    L_final = C_final - 16
else:
    L_final = C_final - Nn - 16
]]></artwork>
      <t>A decryptor decrypting block index i computes octet offsets
relative to the start of the encrypted block region
(after salt, commitment, and accumulator):</t>
      <artwork><![CDATA[
block_byte_start = i * C
block_byte_len   = C if i < N - 1 else C_final
byte_start       = 64 + Nh + block_byte_start
byte_len         = block_byte_len
char_start       = 4 * floor( byte_start / 3 )
char_end         = 4 * ceil( (byte_start + byte_len) / 3 )
]]></artwork>
      <t>For each block index i, the Decryptor:</t>
      <ol spacing="normal" type="1"><li>
          <t>Extracts <tt>S_b64[char_start:char_end]</tt></t>
        </li>
        <li>
          <t>Base64-decodes to a temporary buffer tmp</t>
        </li>
        <li>
          <t>Computes <tt>skip = byte_start mod 3</tt></t>
        </li>
        <li>
          <t>Selects <tt>encrypted_block = tmp[skip : skip + byte_len]</tt></t>
        </li>
        <li>
          <t>For non-NMR AEADs: parses <tt>nonce_i = encrypted_block[0:Nn]</tt>
and <tt>ciphertext_i = encrypted_block[Nn:]</tt>.
For NMR AEADs: <tt>ciphertext_i = encrypted_block</tt> and
<tt>nonce_i = nonce_base XOR uint64(i)</tt> per <xref target="per-block-nonces"/></t>
        </li>
        <li>
          <t>Determines <tt>is_final = 1 if i == N - 1 else 0</tt></t>
        </li>
        <li>
          <t>Constructs data_aad(i, is_final) per <xref target="data-aad"/></t>
        </li>
        <li>
          <t>Computes key_i = block_key(i) (<xref target="epoch-key-derivation"/>)</t>
        </li>
        <li>
          <t>AEAD-opens ciphertext_i under key_i with nonce_i and data_aad</t>
        </li>
      </ol>
    </section>
    <section anchor="selective-decryption">
      <name>Selective Decryption</name>
      <t>This appendix is informative.</t>
      <t>To decrypt block index i from a long object, a Decryptor first
selects a candidate LOCK per <xref target="recipient-discovery"/>.  The decryptor
constructs encryption_parameters from the SAFE CONFIG or from
defaults, parses lock_nonce from Encrypted-CEK, evaluates the step
sequence to derive the KEK, and opens Encrypted-CEK to recover the
CEK.  The decryptor reads the 32-octet salt from the start of the
DATA block, then derives payload_key and acc_key from the CEK,
encryption_parameters, and salt.  It then locates block i in the
payload.  No other blocks need to be read or decoded.</t>
      <t>For binary encoding, read N and D from the header, then compute block
i's ciphertext offset as (D + i) × B.  The nonce and tag are at offset
header_len + 64 + 8 + i × meta_len, where meta_len is Nn + 16 for
non-NMR AEADs or 16 for NMR AEADs (<xref target="aligned-layout"/>).</t>
      <t>For armored encoding, the Decryptor must compute the Base64 character
window covering block i and decode only that window, as described below.</t>
      <section anchor="example-armored-selective-block-decryption">
        <name>Example: Armored Selective Block Decryption</name>
        <t>This example uses a non-NMR AEAD (AES-256-GCM, Nn=12).  For NMR
AEADs, omit Nn from per-block sizes (C = B + 16 instead of
Nn + B + 16).</t>
        <t>Consider Block-Size=16384, Nn=12, and three blocks: two full
blocks plus a 5000-octet final block.</t>
        <artwork><![CDATA[
C       = Nn + B + 16 = 12 + 16384 + 16 = 16412 octets (full block)
C_final = Nn + 5000 + 16 = 12 + 5000 + 16 = 5028 octets (final block)
total_binary = 32 + 32 + 16412 + 16412 + 5028 + 32 = 37948 octets
Base64 len   = ceil(37948 / 3) * 4 = 50600 characters
]]></artwork>
        <t>To decrypt block i=0, compute octet and character offsets
(salt, commitment, and accumulator occupy the first 96 octets):</t>
        <artwork><![CDATA[
byte_start  = 96 + (0 * C) = 96
byte_len    = C = 16412
char_start  = floor(byte_start / 3) * 4 = 128
char_end    = ceil((byte_start + byte_len) / 3) * 4 = 22012
skip        = byte_start mod 3 = 0
]]></artwork>
        <t>Extract <tt>S_b64[128:22012]</tt>, Base64-decode, then take 16412 octets
as the encrypted block (skip = 0, no leading octets to discard).
Parse the first Nn octets (12 for AES-256-GCM) as the stored
nonce, compute block_key(i) (<xref target="epoch-key-derivation"/>), and
AEAD-open the remaining octets under block_key(i) with the
extracted nonce and block AAD.  For NMR AEADs, derive the nonce
from nonce_base instead (<xref target="per-block-nonces"/>).</t>
      </section>
    </section>
    <section anchor="design-rationale">
      <name>Design Rationale</name>
      <t>This appendix is informative.</t>
      <t>SAFE's design choices reflect trade-offs between flexibility,
performance, and simplicity.  This section explains the rationale behind
key architectural decisions.</t>
      <section anchor="two-tier-key-hierarchy">
        <name>Two-Tier Key Hierarchy</name>
        <t>SAFE separates the Content-Encryption Key (CEK) from the Key-Encryption
Key (KEK) to enable multi-recipient encryption without duplicating
payload ciphertexts.</t>
        <section anchor="benefits">
          <name>Benefits</name>
          <t>A single CEK is generated once and used to encrypt the payload; each
recipient's LOCK derives a KEK that wraps the same CEK. This design
offers several advantages:</t>
          <ol spacing="normal" type="1"><li>
              <t>Storage and bandwidth efficiency: Adding recipients requires only
adding LOCK blocks (typically &lt; 1 KB each), not duplicating the
entire payload.  For large files, this is critical.</t>
            </li>
            <li>
              <t>Key rotation: Recipients can be added or removed by re-wrapping
the CEK under new KEKs without re-encrypting the payload.</t>
            </li>
            <li>
              <t>Operational flexibility: The CEK remains constant while KEKs
rotate, simplifying key management.</t>
            </li>
          </ol>
        </section>
        <section anchor="trade-offs">
          <name>Trade-offs</name>
          <t>This design implies that all recipients share the same payload_key.
Encryptors who require per-recipient payload keys (e.g., for
fine-grained access control that survives CEK compromise) would need to
encrypt multiple independent payloads.</t>
          <t>If recipients directly decrypted the payload with their KEK, each
recipient would require a distinct copy of the ciphertext, multiplying
storage and bandwidth costs.</t>
        </section>
      </section>
      <section anchor="minimal-block-aad">
        <name>Minimal Block AAD</name>
        <t>Block associated data is defined as
<tt>Encode("SAFE-DATA", I2OSP(i, 8),
I2OSP(is_final, 1))</tt>, binding each block to its
position and finality.  Suite parameters and
LOCK-specific data are excluded from block AAD.</t>
        <section anchor="rationale">
          <name>Rationale</name>
          <t>This choice prioritizes simplicity and O(1) random access:</t>
          <ol spacing="normal" type="1"><li>
              <t>Selective decryption: payload_key already depends on
encryption_parameters, so block AAD need not repeat
them.  This avoids requiring every block decryption
to reference the SAFE CONFIG.</t>
            </li>
            <li>
              <t>Multi-recipient caching: Including LOCK-specific data (Step lines,
kemct) would couple block decryption to a specific LOCK,
preventing efficient caching of payload_key across multiple
recipients.</t>
            </li>
          </ol>
        </section>
        <section anchor="security-properties">
          <name>Security Properties</name>
          <t>Suite and LOCK binding is indirect through the key hierarchy:</t>
          <ul spacing="normal">
            <li>
              <t>The KEK schedule binds encryption_parameters at initialization
and final derivation, with all step_tokens folded between;
Encrypted-CEK AEAD authenticates the CEK under this KEK.</t>
            </li>
            <li>
              <t>The payload schedule binds payload_key to encryption_parameters
via SafeDerive.</t>
            </li>
            <li>
              <t>Block AAD includes the block index and finality flag, preventing
reordering, splicing, truncation, and extension within a file.</t>
            </li>
            <li>
              <t>The snapshot accumulator (<xref target="snapshot-accumulator"/>) binds all block
tags under acc_key, providing file-level integrity without per-block
decryption.  Each contribution is a PRF output under acc_key; XOR
accumulation is unforgeable without knowledge of the CEK.</t>
            </li>
          </ul>
        </section>
        <section anchor="alternative-designs-considered">
          <name>Alternative Designs Considered</name>
          <t>An alternative design could include a "recipient_id" in block AAD, but
this would require additional per-recipient metadata and complicate
multi-recipient scenarios.  SAFE's choice favors performance and
simplicity for the common case of single-recipient or trust-equivalent
multi-recipient files, while accepting that ciphertext blocks alone do
not directly identify which LOCK unlocked them.</t>
          <t>SAFE provides built-in truncation and extension detection via the
is_final flag in block AAD (<xref target="data-aad"/>).  The final block is marked
with is_final=1; all preceding blocks use is_final=0.  This design,
inspired by the STREAM construction <xref target="STREAM"/>, enables:</t>
          <ul spacing="normal">
            <li>
              <t>Truncation detection: a block with is_final=0 and no successor
indicates truncation</t>
            </li>
            <li>
              <t>Extension prevention: appending after is_final=1 fails AEAD
verification</t>
            </li>
            <li>
              <t>Streaming writes: encryptors buffer the last block until the
stream closes, then encrypt it with is_final=1</t>
            </li>
          </ul>
          <t>Per-block random nonces (<xref target="per-block-nonces"/>) enable selective editing:
individual blocks can be re-encrypted without affecting LOCK blocks or
other blocks.  This design trades a small storage overhead (Nn octets per
block) for flexibility in payload modification.</t>
        </section>
      </section>
      <section anchor="fixed-hkdf-salt">
        <name>Fixed HKDF Salt</name>
        <t>SafeDerive (<xref target="safe-derive"/>) uses a fixed string ("SAFE-v1") as the HKDF
salt in its Extract step.  The same string appears in the Encode-framed
Input Keying Material (IKM), making its presence in the salt redundant
but harmless.  This design is intentional: the fixed salt binds every
Extract call to the protocol version at the HMAC key position, while
security relies on the entropy of the IKM, not the salt.  All
security-critical IKMs (CEK, step secrets, hedged random values) have
sufficient min-entropy for this to
hold.  Krawczyk's analysis of HKDF shows that Extract with a fixed salt
is a good randomness extractor when the IKM has high min-entropy.  For
the XOF single-stage variant, there is no separate salt; the version
string appears only within the Encode frame.</t>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This appendix is informative.</t>
      <t>This appendix provides a complete known-answer test for a
passphrase-based SAFE encoding using default parameters (aes-256-gcm,
Block-Size=65536, Hash=sha-256, Data-Encoding=armored).  All values
are hex unless noted.</t>
      <artwork><![CDATA[
## Inputs
Passphrase:    "correct horse battery staple" (UTF-8, 28 octets)
Salt:          01010101010101010101010101010101
CEK:           aaaaaaaa...aa (32 octets of 0xAA)
lock_nonce:    020202020202020202020202
payload_salt:  04040404...04 (32 octets of 0x04)
Plaintext:     "Hello, SAFE!" (12 octets)

## encryption_parameters
encryption_parameters = ["aes-256-gcm", "65536", "sha-256"]

## KEK Schedule
step_token:       00047061737300086172676f6e326964
                  001001010101010101010101010101010101
    Encode("pass", "argon2id", salt)
step_secret:      7d3491ac8af1b54526792869b7257f5dbf7cc3c20929417bb193e396c51d7965
agg_init:         1b257512ce57328cbb04bbf80b4b3aa220d875832c8439c0cdda85e1e4f8428b
    SafeDerive("kek_init", "",
    encryption_parameters, 32)
agg_step:         596a483b938ad11da3369007f1b7f073502101879eb257f0f4b22c0758fdee21
    SafeDerive("kek_step",
    [agg, secret], token, 32)
derived_kek:      bfedcafd41d9da3c1c77f73358b973a4ececfbc212ae558eed0dfba709cdc24e
    SafeDerive("kek", agg,
    encryption_parameters, 32)

## Encrypted-CEK
aad:              "" (empty)
Encrypted-CEK:    020202020202020202020202352cbe85
                  a8e4434e5cd98d6507c80759dfe41fbe
                  13a649df57a9f7f46d1a7f90c60e1531
                  92ecb8c83a649656a6785487

## Payload Schedule
payload_info = [...encryption_parameters, payload_salt]
commitment:       42330a7379357f4f369f0271369546047f702ff37c53a8e17eb2342731683905
    SafeDerive("commit", CEK,
    payload_info, 32)
payload_key:      01a830b8a79a687b784109020b70d58dd53e3b51260d468c8c5ba05181ae09d8
    SafeDerive("payload_key", CEK,
    payload_info, 32)
acc_key:          9ce7a1a28f00e17c601b49ef3959a797088c8872ec7dd33f7b1258c0362da6ec
    SafeDerive("acc_key", CEK,
    payload_info, 32)

## Block Encryption (block 0, is_final=1)
raw_random:       030303030303030303030303
uint64(0):        0000000000000000
nonce0:           030303030303030303030303 (= raw_random XOR 0)
data_aad:         0009534146452d4441544100080000000000000000000101
    Encode("SAFE-DATA",
    I2OSP(0, 8), I2OSP(1, 1))
ciphertext+tag:   b42ba125cc5d376aef03f1ec3ecbc9c96c4264265f94dea4a1312bbd
encrypted_block:  030303030303030303030303b42ba125
                  cc5d376aef03f1ec3ecbc9c96c426426
                  5f94dea4a1312bbd

## Snapshot Accumulator
tag_0:            3ecbc9c96c4264265f94dea4a1312bbd
contrib_0:        4b4160f1af84bd74fbb1cf7fdccae69b2027c7ffdc67a7a03bc33c1b9489a4e8
    SafeDerive("acc_contrib", acc_key,
    [uint64(0), tag_0], 32)
accumulator:      4b4160f1af84bd74fbb1cf7fdccae69b2027c7ffdc67a7a03bc33c1b9489a4e8
    = contrib_0 (single block)

## Complete SAFE Object
SAFE DATA = salt (32) + commitment (32) + accumulator (32)
            + encrypted_block (40)
= 136 octets, 184 Base64 chars.
]]></artwork>
      <t>Readable format:
~~~~
-----BEGIN SAFE CONFIG-----
Lock-Encoding: readable
-----END SAFE CONFIG-----
-----BEGIN SAFE LOCK-----
Step: pass(kdf=argon2id, salt=AQEBAQEBAQEBAQEBAQEBAQ==)
Encrypted-CEK:
  AgICAgICAgICAgICNSy+hajkQ05c2Y1lB8gHWd/kH74TpknfV6n39G0af5DGDhUx
  kuy4yDpkllameFSH
-----END SAFE LOCK-----
-----BEGIN SAFE DATA-----
BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARCMwpzeTV/TzafAnE2lUYE
f3Av83xTqOF+sjQnMWg5BUtBYPGvhL10+7HPf9zK5psgJ8f/3GenoDvDPBuUiaTo
AwMDAwMDAwMDAwMDtCuhJcxdN2rvA/HsPsvJyWxCZCZflN6koTErvQ==
-----END SAFE DATA-----
~~~~</t>
      <t>Same object in armored format (default Lock-Encoding).
The armored LOCK body is Base64(Encode(step, ecek))
per <xref target="armored-lock-format"/>:</t>
      <artwork><![CDATA[
-----BEGIN SAFE LOCK-----
ACIABHBhc3MACGFyZ29uMmlkABABAQEBAQEBAQEBAQEBAQEBADwCAgICAgICAgIC
AgI1LL6FqORDTlzZjWUHyAdZ3+QfvhOmSd9Xqff0bRp/kMYOFTGS7LjIOmSWVqZ4
VIc=
-----END SAFE LOCK-----
-----BEGIN SAFE DATA-----
BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARCMwpzeTV/TzafAnE2lUYE
f3Av83xTqOF+sjQnMWg5BUtBYPGvhL10+7HPf9zK5psgJ8f/3GenoDvDPBuUiaTo
AwMDAwMDAwMDAwMDtCuhJcxdN2rvA/HsPsvJyWxCZCZflN6koTErvQ==
-----END SAFE DATA-----
]]></artwork>
    </section>
    <section anchor="x25519-test-vector">
      <name>X25519 Test Vector</name>
      <t>This appendix is informative.</t>
      <t>This appendix provides a complete known-answer test for a
single X25519 recipient using DHKEM(X25519, HKDF-SHA256)
per <xref target="kem-summary"/>.  All values are hex unless noted.
The ephemeral and recipient keys are from RFC 9180,
Appendix A.7.1 (DHKEM(X25519, HKDF-SHA256), HKDF-SHA256,
AES-128-GCM), so the shared_secret value can be
independently verified against that appendix.</t>
      <artwork><![CDATA[
## Inputs
Recipient skR:  4612c550263fc8ad58375df3f557aac531d26850
                903e55a9f23f21d8534e8ac8
Recipient pkR:  3948cfe0ad1ddb695d780e59077195da6c56506b
                027329794ab02bca80815c4d
Ephemeral skE:  52c4a758a802cd8b936eceea314432798d5baf2d
                7e9235dc084ab1b9cfa2f736
Ephemeral pkE:  37fda3567bdbd628e88668c3c8d7e97d1d1253b6
                d4ea6d44c150f741f1bf4431 (= enc)
CEK:            aaaaaaaa...aa (32 octets of 0xAA)
lock_nonce:     020202020202020202020202
payload_salt:   04040404...04 (32 octets of 0x04)
Plaintext:      "Hello, SAFE!" (12 octets)

## encryption_parameters
encryption_parameters = ["aes-256-gcm", "65536", "sha-256"]

## DHKEM(X25519, HKDF-SHA256)
dh = DH(skE, pkR):
  b3b5c19eab3f088ac18f23f774ff6414
  ba4fde45404d10085efc3e4dc9c72e35
kem_context = enc || pkR:
  37fda3567bdbd628e88668c3c8d7e97d
  1d1253b6d4ea6d44c150f741f1bf4431
  3948cfe0ad1ddb695d780e59077195da
  6c56506b027329794ab02bca80815c4d
prk = LabeledExtract("", "eae_prk", dh):
  d8b4a0e70fe904de0f643c91e091903c
  f3c628994f51a025a7306bd4d4eb03c3
shared_secret = LabeledExpand(prk,
    "shared_secret", kem_context, 32):
  fe0e18c9f024ce43799ae393c7e8fe8f
  ce9d218875e8227b0187c04e7d2ea1fc

## SAFE Step Secret
key_id = SafeDerive("SAFE-SPKI-v1",
    [SPKI(pkR)], [""], 32):
  98cdd10b776ac15ed78f5520bed9f3e6
  ffdf682fe3ecb68163b4f1dd8b1dfefa
step_token = Encode("hpke", "x25519",
    enc, key_id):
  000468706b650006783235353139
  002037fda3567bdbd628e88668c3c8d7
  e97d1d1253b6d4ea6d44c150f741f1bf
  4431002098cdd10b776ac15ed78f5520
  bed9f3e6ffdf682fe3ecb68163b4f1dd
  8b1dfefa
exporter_context = SafeDerive(
    "SAFE-STEP", [token], [""], 32):
  3be7e9568086a415ada19b306534bc64
  6fcf0efc90e5faaaca358305c3ab7360
exporter_secret = KeySchedule(Base,
    shared_secret, info="SAFE-v1"):
  3b2120e20d71e9e93c01b659c4835c72
  d0e43c660dca0dba8439b64cc78a9b2b
step_secret = Export(exporter_secret,
    exporter_context, 32):
  42a4a3f299e1a71a97b04a3d9a7e9ae6
  7cd1b8ea3dec017e26fa1e369ee6f85b

## KEK Schedule
agg_init:
  1b257512ce57328cbb04bbf80b4b3aa2
  20d875832c8439c0cdda85e1e4f8428b
agg_step:
  16dfec67e5ab80a27b5c338de616c453
  c0660ed1c030dc29e6f4d46fadbad3a1
derived_kek:
  c88d0730216dd222c4d64ffceac8be3e
  25815bdf067cc3a27760928ab0cc82f6

## Encrypted-CEK
Encrypted-CEK:
  020202020202020202020202
  8865cde5f682dcd6155b30ffbcd80bd9
  879d6663ac56b340dfc0e082e78f23ea
  a44944abc2e4cb1bd2fba5ebffd08a8f

## Payload Schedule
payload_info = [...encryption_parameters, payload_salt]
commitment:
  42330a7379357f4f369f0271369546047f702ff3
  7c53a8e17eb2342731683905
payload_key:
  01a830b8a79a687b784109020b70d58dd53e3b51
  260d468c8c5ba05181ae09d8
acc_key:
  9ce7a1a28f00e17c601b49ef3959a797088c8872
  ec7dd33f7b1258c0362da6ec

## Block Encryption (block 0, is_final=1)
ciphertext+tag:
  b42ba125cc5d376aef03f1ec3ecbc9c9
  6c4264265f94dea4a1312bbd
encrypted_block:
  030303030303030303030303b42ba125
  cc5d376aef03f1ec3ecbc9c96c426426
  5f94dea4a1312bbd

## Snapshot Accumulator
tag_0:
  3ecbc9c96c4264265f94dea4a1312bbd
contrib_0:
  4b4160f1af84bd74fbb1cf7fdccae69b
  2027c7ffdc67a7a03bc33c1b9489a4e8
    SafeDerive("acc_contrib", acc_key,
    [uint64(0), tag_0], 32)
accumulator:
  4b4160f1af84bd74fbb1cf7fdccae69b
  2027c7ffdc67a7a03bc33c1b9489a4e8
    = contrib_0 (single block)

## Complete SAFE Object
SAFE DATA = salt (32) + commitment (32) + accumulator (32)
            + encrypted_block (40)
= 136 octets, 184 Base64 chars.
]]></artwork>
    </section>
    <section anchor="auth-test-vector">
      <name>Auth Mode Test Vector</name>
      <t>This appendix is informative.</t>
      <t>This appendix provides a known-answer test for Auth mode HPKE
(X25519) with a single recipient.  The recipient keys are the
same as <xref target="x25519-test-vector"/>.  All values are hex unless noted.</t>
      <artwork><![CDATA[
## Inputs
Recipient skR:  4612c550263fc8ad58375df3f557aac531d26850
                903e55a9f23f21d8534e8ac8
Recipient pkR:  3948cfe0ad1ddb695d780e59077195da6c56506b
                027329794ab02bca80815c4d
Sender skS:     6b7298af684f45181f80ac5cb3d9a3713abb62cb
                ecd21db5dba0eb2a8bfb3a05
Sender pkS:     ccc340219b8098b48749f1c36e2c336faefb87f9
                cbe3463e59e3b8ec18c44c49
Ephemeral skE:  52c4a758a802cd8b936eceea314432798d5baf2d
                7e9235dc084ab1b9cfa2f736
Ephemeral pkE:  37fda3567bdbd628e88668c3c8d7e97d1d1253b6
                d4ea6d44c150f741f1bf4431 (= enc)
CEK:            aaaaaaaa...aa (32 octets of 0xAA)
lock_nonce:     020202020202020202020202

## encryption_parameters
encryption_parameters = ["aes-256-gcm", "65536", "sha-256"]

## DHKEM Auth Mode (X25519)
shared_secret:
  8c1cd5a4e40708af36bf6446d65f62ed
  7a7b7f1286d966d9bc96b96808021ba8

## SAFE Step Secret (Auth mode)
id:
  98cdd10b776ac15ed78f5520bed9f3e6
  ffdf682fe3ecb68163b4f1dd8b1dfefa
sid:
  d9b9d59d0f10a55a8365b2f440dbf787
  f280e0f400427beaaf17de1f8662fcdc
step_token = Encode("hpke", "x25519",
    enc, id, "auth", sid):
  000468706b650006783235353139
  002037fda3567bdbd628e88668c3c8d7
  e97d1d1253b6d4ea6d44c150f741f1bf
  4431002098cdd10b776ac15ed78f5520
  bed9f3e6ffdf682fe3ecb68163b4f1dd
  8b1dfefa0004617574680020d9b9d59d
  0f10a55a8365b2f440dbf787f280e0f4
  00427beaaf17de1f8662fcdc
exporter_context:
  6da02fe479338d9a1798f8c02e09f601
  6dc3e0c49e2dff50c63ba273eabd2382
exporter_secret = KeySchedule(Auth,
    shared_secret, info="SAFE-v1"):
  c35c97b436c388b766bd65008d1c7c5f
  0f52aad653b4072cbc8bb70e98c035bf
step_secret:
  24c50a152128baaa3f77c255b0e5b895
  2cece2e7680b21bd7dc24aa1807e9374

## KEK Schedule
agg_init:
  1b257512ce57328cbb04bbf80b4b3aa2
  20d875832c8439c0cdda85e1e4f8428b
agg_step:
  2cb2cd8062e86b7dda6580d6bf8ba351
  25ef38644af50a8b1f6ab7eb53bae59c
derived_kek:
  4a2b4a469f961e824c8c1681723393f0
  3937ede4bb824fc507200f932ef9c739

## Encrypted-CEK
Encrypted-CEK:
  020202020202020202020202
  e29d2e1e0502fdbadaa1232a013a401c
  309e30dd7db132692a8dc03dfc64375d
  effa4696385b308f1093e41cf9f407f4
]]></artwork>
    </section>
    <section anchor="multiblock-test-vector">
      <name>Multi-Block Test Vector</name>
      <t>This appendix is informative.</t>
      <t>This appendix provides a known-answer test with two blocks,
demonstrating block index &gt; 0, is_final transitions, and
accumulator XOR of multiple contributions.  Uses a passphrase
LOCK with default parameters.  All values are hex unless noted.</t>
      <artwork><![CDATA[
## Inputs
Passphrase:   "correct horse battery staple" (28 octets)
Salt:         01010101...01 (32 octets of 0x01)
CEK:          aaaaaaaa...aa (32 octets of 0xAA)
lock_nonce:   020202020202020202020202
payload_salt: 04040404...04 (32 octets of 0x04)
Block 0:      "Block zero data!" (16 octets)
Block 1:      "Final block." (12 octets, final)

## Step Secret
step_secret:
  2bab4c606fb5c84123e48f0bb5eeb2a1
  39a6dd996c6cff2efad2ad78a12143e0

## KEK Schedule
derived_kek:
  152c31bd033c76fc1d4987681b7ca76a
  8948514d6e5b7c2a5d8a4b681873a56f

## Encrypted-CEK
Encrypted-CEK:
  020202020202020202020202
  3dbace72c0486e28026e6be8c1f0fc12
  dfc833d4c76b76a40dd68be3f423568c
  b4fb3d2ef43a2374f5a2fc0642e90cd1

## Payload Schedule
payload_info = [...encryption_parameters, payload_salt]
commitment:
  42330a7379357f4f369f027136954604
  7f702ff37c53a8e17eb2342731683905
payload_key:
  01a830b8a79a687b784109020b70d58d
  d53e3b51260d468c8c5ba05181ae09d8
acc_key:
  9ce7a1a28f00e17c601b49ef3959a797
  088c8872ec7dd33f7b1258c0362da6ec

## Block 0 (is_final=0)
nonce_0:          030303030303030303030303
data_aad_0:       0009534146452d44415441
                  00080000000000000000000100
    Encode("SAFE-DATA", I2OSP(0, 8), I2OSP(0, 1))
ciphertext+tag_0:
  be22a22ac8516d5cdc2a94a9863ced1c
  712ded5352105fddab8539c9570eda40
tag_0:            712ded5352105fddab8539c9570eda40

## Block 1 (is_final=1)
nonce_1:          050505050505050505050505
data_aad_1:       0009534146452d44415441
                  00080000000000000001000101
    Encode("SAFE-DATA", I2OSP(1, 8), I2OSP(1, 1))
ciphertext+tag_1:
  128cb7c8a035399b40d0a69d
  866cbbc0f49d8f85ce6b1883a0f0c028
tag_1:            866cbbc0f49d8f85ce6b1883a0f0c028

## Snapshot Accumulator (2 blocks)
contrib_0:
  c1ad6f915fa1babef344e5307b62bc7f
  33d6bf7269cdb84dbe5c76889204220d
contrib_1:
  4862e6122d79464e22a033c2b8dd17e5
  c8922f35898f35638802ae4b9e4f0bb9
accumulator = contrib_0 XOR contrib_1:
  89cf898372d8fcf0d1e4d6f2c3bfab9a
  fb449047e0428d2e365ed8c30c4b29b4
]]></artwork>
    </section>
    <section anchor="derive-vectors">
      <name>SafeDerive Test Vectors</name>
      <t>This appendix is informative.  These vectors validate the
SafeDerive function in isolation, independent of the
SAFE protocol.  Inputs are deliberately short for
readability.  See <xref target="safe-derive"/> for the definition.</t>
      <t>Common inputs for all vectors:</t>
      <artwork><![CDATA[
label:  "SAFE-TEST" (9 octets, hex: 534146452d54455354)
ikm:    0a0b0c0d0e0f (6 octets)
info:   "" (0 octets)
]]></artwork>
      <section anchor="hashsha-256-l32">
        <name>Hash=sha-256, L=32</name>
        <artwork><![CDATA[
Extract salt = "SAFE-v1":
  534146452d7631

Extract ikm = Encode("SAFE-v1",
    label, ...ikm):
  0007534146452d76310009534146452d5445535400060a0b0c0d0e0f

prk = Extract(salt, ikm):
  983d59830192955caf33fff4056ed415e2cd1cef7fe3072e075cf90903c97146

Expand info = Encode("SAFE-v1",
    label, ...info,
    I2OSP(32, 2)):
  0007534146452d76310009534146452d54455354000000020020

output = Expand(prk, info, 32):
  d7413c70bb7bde999f5e543c0796d63a0af6839ebbe5203cc526776b978ba147
]]></artwork>
      </section>
      <section anchor="hashsha-256-l16">
        <name>Hash=sha-256, L=16</name>
        <artwork><![CDATA[
output = SafeDerive(label, ikm, info, 16):
  e190628e91995808047c49a7269b9d3b
]]></artwork>
      </section>
      <section anchor="hashturboshake256-l32">
        <name>Hash=turboshake256, L=32</name>
        <artwork><![CDATA[
Derive(Encode("SAFE-v1",
              label, ...ikm,
              I2OSP(32, 2), ...info), 32):
  input:  0007534146452d76310009534146452d5445535400060a0b0c0d0e0f00020020
          0000
  output: 0394158419b3a24cb4f29376ada39b833f100a1825bfac7bc64f4f2ca9ff8a50
]]></artwork>
      </section>
      <section anchor="hashturboshake256-l16">
        <name>Hash=turboshake256, L=16</name>
        <artwork><![CDATA[
output = SafeDerive(label, ikm, info, 16):
  f1c0c2cd38c6b0cbd0fa6a986b12c82d
]]></artwork>
      </section>
    </section>
    <section anchor="defining-new-steps">
      <name>Defining New Step Types</name>
      <t>This appendix is informative.</t>
      <t>New step types can be defined and registered to extend SAFE
with additional authentication mechanisms.  This section illustrates the
process using three hypothetical steps: two Privacy Pass Key
Derivation Function (PPKDF) steps for token-gated key derivation
(<xref target="privacy-pass-steps"/>), and a
WebAuthn PRF step for hardware token authentication.</t>
      <section anchor="privacy-pass-steps">
        <name>Example: Privacy Pass Steps</name>
        <t>Privacy Pass <xref target="RFC9578"/> type 0x0001 tokens use a Verifiable
Oblivious Pseudorandom Function (VOPRF) <xref target="RFC9497"/>.  The
client constructs a TokenInput containing a nonce, blinds
it, and sends the blinded
element to the issuer.  The issuer evaluates its PRF
on the blinded element and returns the result.  The
client unblinds to obtain the authenticator, which is
a deterministic function of the TokenInput and the
issuer's secret key.</t>
        <t>In normal issuance the nonce is random, making each
token unique.  PPKDF sets the nonce to a deterministic
value derived from the SAFE context, so the
authenticator is reproducible and serves as step key
material.  The issuer's behavior is unchanged and
cannot distinguish a PPKDF request from normal token
issuance.</t>
        <t>Two step types use this mechanism:</t>
        <ul spacing="normal">
          <li>
            <t>ppkdf: token-gated key derivation with application-supplied
context.</t>
          </li>
          <li>
            <t>ppkdf-pass: token-gated key derivation with password-derived
context for online throttling.</t>
          </li>
        </ul>
        <section anchor="shared-parameters">
          <name>Shared Parameters</name>
          <dl>
            <dt>issuer (<bcp14>REQUIRED</bcp14>):</dt>
            <dd>
              <t>Server name (host or host:port) of the Privacy Pass token
issuer.  The issuer holds the VOPRF key pair; its public key
pkI must be known to the client.</t>
            </dd>
            <dt>salt (<bcp14>REQUIRED</bcp14>):</dt>
            <dd>
              <t>Base64-encoded salt; must decode to exactly 32 octets.
Generated at encryption time using SafeRandom.</t>
            </dd>
          </dl>
          <t>The binding step_token uses the Encode form
(<xref target="steps"/>):</t>
          <ul spacing="normal">
            <li>
              <t>ppkdf: Encode("ppkdf", issuer, salt)</t>
            </li>
            <li>
              <t>ppkdf-pass: Encode("ppkdf-pass", issuer, kdf, salt)</t>
            </li>
          </ul>
          <t>where issuer and kdf are UTF-8 strings and salt is
the raw decoded 32 octets.</t>
        </section>
        <section anchor="ppkdf-step">
          <name>ppkdf Step</name>
          <t>The ppkdf step provides token-gated key derivation with
application-supplied context.</t>
          <t>Token form:</t>
          <artwork><![CDATA[
ppkdf(issuer=tokens.example.com,salt=<Base64>)
]]></artwork>
          <t>Grammar:</t>
          <artwork><![CDATA[
ppkdf-step    = "ppkdf(" ppkdf-params ")"
ppkdf-params  = "issuer=" pp-host "," "salt=" salt
pp-host       = host [ ":" port ]
host          = 1*( ALPHA / DIGIT / "-" / "." )
port          = 1*DIGIT
salt          = 1*BASE64CHAR    ; 44 chars = 32 octets
]]></artwork>
          <t>Derivation:</t>
          <t>Decode salt to salt_bytes (32 octets).  Compute a
deterministic nonce for the TokenInput:</t>
          <artwork><![CDATA[
nonce = SafeDerive("SAFE-PPKDF",
    "", [...encryption_parameters,
         binding_step_token, salt_bytes], 32)
]]></artwork>
          <t>where binding_step_token is the Encode-based binding
form defined in <xref target="steps"/>.  Construct a type 0x0001
TokenInput
(<xref target="RFC9578"/>, Section 5.1) with nonce as above.  Set
challenge_digest to
SafeDerive("SAFE-PPKDF", TokenChallenge,
    encryption_parameters, 32),
using a TokenChallenge with issuer_name = issuer and
empty redemption_context and origin_info.</t>
          <t>Blind the TokenInput and send in a standard type 0x0001
TokenRequest.  The issuer evaluates the VOPRF and
returns a TokenResponse.  Verify the VOPRF proof and
unblind to obtain the authenticator (32 octets).
Set step_secret = authenticator.</t>
        </section>
        <section anchor="ppkdf-pass-step">
          <name>ppkdf-pass Step</name>
          <t>The ppkdf-pass step adds password-derived input.  Each password
guess requires a VOPRF evaluation from the issuer.</t>
          <t>Token form:</t>
          <artwork><![CDATA[
ppkdf-pass(issuer=tokens.example.com,kdf=argon2id,salt=<Base64>)
]]></artwork>
          <t>Grammar:</t>
          <artwork><![CDATA[
ppkdf-pass-step  = "ppkdf-pass(" ppkdf-pass-params ")"
ppkdf-pass-params = "issuer=" pp-host ","
                    "kdf=" kdf-name "," "salt=" salt
kdf-name          = "argon2id" / "pbkdf2"
]]></artwork>
          <t>The <tt>kdf</tt> parameter selects the password KDF using the same
algorithms and default parameters as the pass() step
(<xref target="passphrase-step"/>).</t>
          <t>Derivation:</t>
          <t>Decode salt to salt_bytes (32 octets).  Derive pw32 from
the user's password using the KDF indicated by the <tt>kdf</tt>
parameter, with salt_bytes as salt input and the default
parameters defined in <xref target="passphrase-step"/>.  Compute the
deterministic nonce:</t>
          <artwork><![CDATA[
nonce = SafeDerive("SAFE-PPKDF-PASS",
    pw32, [...encryption_parameters,
           binding_step_token], 32)
]]></artwork>
          <t>Execute the PPKDF protocol as in the ppkdf step using
this nonce.  Set step_secret = authenticator.</t>
        </section>
        <section anchor="iana-registry-entries">
          <name>IANA Registry Entries</name>
          <t>Registration of ppkdf and ppkdf-pass is deferred to a separate
document; this appendix is informative.  A registration for these
steps would include:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Step Name</th>
                <th align="left">Parameters</th>
                <th align="left">Inputs</th>
                <th align="left">Secret</th>
                <th align="left">Ref</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">ppkdf</td>
                <td align="left">issuer=X, salt=X</td>
                <td align="left">PPKDF token</td>
                <td align="left">32 octets</td>
                <td align="left">(this doc)</td>
              </tr>
              <tr>
                <td align="left">ppkdf-pass</td>
                <td align="left">issuer=X, kdf=X, salt=X</td>
                <td align="left">PPKDF token, password</td>
                <td align="left">32 octets</td>
                <td align="left">(this doc)</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="security-considerations-for-privacy-pass-steps">
          <name>Security Considerations for Privacy Pass Steps</name>
          <t>For ppkdf:</t>
          <t>The issuer sees only the blinded_element.  It cannot learn context,
step_secret, or anything about the SAFE file.  The VOPRF proof
lets the client detect the wrong issuer key.  Compromise of skI
enables offline computation of step_secret for any context,
breaking the online-gating property.</t>
          <t>For ppkdf-pass:</t>
          <t>Each password guess requires a VOPRF evaluation; issuer rate limits
control guessing frequency.  The issuer never sees the
password-derived context.  Compromise of skI still requires
inverting the memory-hard KDF to recover the password.</t>
          <t>Example LOCK block:</t>
          <artwork><![CDATA[
-----BEGIN SAFE CONFIG-----
Lock-Encoding: readable
-----END SAFE CONFIG-----
-----BEGIN SAFE LOCK-----
Step: ppkdf(issuer=tokens.example.com,salt=<Base64>)
Encrypted-CEK:
  Base64-encoded encrypted CEK
-----END SAFE LOCK-----
]]></artwork>
        </section>
      </section>
      <section anchor="example-webauthn-prf-step">
        <name>Example: WebAuthn PRF Step</name>
        <t>A WebAuthn-based step would allow hardware token authentication using
the PRF extension defined in Web Authentication Level 3
<xref target="W3C.webauthn-3"/>.  Unlike WebAuthn assertions (signatures), the PRF
extension provides deterministic output suitable for SAFE's step model.</t>
        <section anchor="step-definition">
          <name>Step Definition</name>
          <dl>
            <dt>Step name:</dt>
            <dd>
              <t>webauthn-prf</t>
            </dd>
          </dl>
          <t>The webauthn-prf step token has three forms:</t>
          <artwork><![CDATA[
webauthn-prf(rpid=example.com,salt=xyz...)           ; Identified RP
webauthn-prf(salt=xyz...)                            ; Anonymous RP
webauthn-prf(rpid=example.com,salt=xyz...,label=YubiKey) ; With label
]]></artwork>
          <t>The parameters are:</t>
          <dl>
            <dt>rpid (<bcp14>OPTIONAL</bcp14>):</dt>
            <dd>
              <t>The WebAuthn relying party identifier.  When present, the Decryptor
uses this rpId for the WebAuthn ceremony.  When omitted, selects
anonymous RP mode.</t>
            </dd>
            <dt>salt (<bcp14>REQUIRED</bcp14>):</dt>
            <dd>
              <t>The Base64-encoded PRF salt; must decode to exactly 32 octets.
Generated at encryption time using SafeRandom.</t>
            </dd>
            <dt>label (<bcp14>OPTIONAL</bcp14>):</dt>
            <dd>
              <t>A human-readable display name for this credential (e.g.,
"YubiKey", "Phone").  Not included in the binding step_token;
see <xref target="steps"/>.</t>
            </dd>
          </dl>
          <t>Credential selection is delegated to the authenticator via WebAuthn's
allowCredentials mechanism.  The Decryptor passes all candidate
credential IDs for the rpId; the authenticator selects the matching
credential internally.</t>
          <t>Grammar:</t>
          <artwork><![CDATA[
webauthn-prf-step = "webauthn-prf(" webauthn-params ")"
webauthn-params   = [ "rpid=" rpid "," ] "salt=" salt
                    [ "," "label=" label-value ]
rpid              = 1*( ALPHA / DIGIT / "-" / "." )
salt              = 1*BASE64CHAR    ; 44 chars = 32 octets
label-value       = 1*( ALPHA / DIGIT / "-" )
]]></artwork>
          <dl>
            <dt>Anonymous RP mode:</dt>
            <dd>
              <t>When rpid is omitted from the token, the Decryptor tries each rpId
for which it holds credentials.  Each rpId requires a separate
WebAuthn ceremony (and potentially a user prompt).  Privacy benefit:
hides the relying party from passive observers.  Cost: one ceremony
per candidate rpId.</t>
            </dd>
            <dt>Derivation:</dt>
            <dd>
              <t>The authenticator evaluates the PRF extension with the selected
credential and the decoded salt:
</t>
              <artwork><![CDATA[
prf_salt = decode(salt)      ; 32 octets

prf_output = WebAuthn_PRF(credential, prf_salt)

step_secret = SafeDerive(
    "webauthn-prf", prf_output,
    encryption_parameters, 32)
]]></artwork>
              <t>Inputs: credential (local, selected by authenticator for the rpId),
prf_salt (from token).</t>
            </dd>
            <dt>Encode form:</dt>
            <dd>
              <t>Encode("webauthn-prf", rpid, salt).
rpid is UTF-8; salt is the raw decoded 32 octets.
rpid is always present in the binding form even
when omitted on-wire; when omitted, the Encryptor
or Decryptor uses the rpId from the WebAuthn
ceremony.  Label is not included in binding.</t>
            </dd>
            <dt>Validation:</dt>
            <dd>
              <t>salt must decode to exactly 32 octets.  rpid, when present, must
match the hostname grammar <tt>1*(ALPHA / DIGIT / "-" / ".")</tt>.</t>
            </dd>
          </dl>
          <t>Example LOCK:</t>
          <artwork><![CDATA[
-----BEGIN SAFE CONFIG-----
Lock-Encoding: readable
-----END SAFE CONFIG-----
-----BEGIN SAFE LOCK-----
Step: webauthn-prf(rpid=example.com,salt=xyz...)
Encrypted-CEK:
  Base64-encoded encrypted CEK
-----END SAFE LOCK-----
]]></artwork>
        </section>
        <section anchor="iana-registry-entry">
          <name>IANA Registry Entry</name>
          <table>
            <thead>
              <tr>
                <th align="left">Step Name</th>
                <th align="left">Parameters</th>
                <th align="left">Inputs</th>
                <th align="left">Secret</th>
                <th align="left">Ref</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">webauthn-prf</td>
                <td align="left">rpid=X, salt=X</td>
                <td align="left">Credential, rpId</td>
                <td align="left">32 octets</td>
                <td align="left">(this doc)</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="security-considerations-for-webauthn-prf-step">
          <name>Security Considerations for WebAuthn PRF Step</name>
          <t>The WebAuthn PRF step provides hardware-bound key material (the
authenticator holds the secret), user presence verification (touch
required), phishing resistance (rpid binding), and offline decryption
capability once the PRF output is computed.</t>
          <t>The PRF extension requires WebAuthn Level 3 support in the browser.
Non-discoverable credentials wrap key material in the credential ID;
losing the credential ID means losing access to the encrypted file.
Unlike the Privacy Pass steps, no server-side rate limiting is possible.</t>
          <t>Privacy: rpid in cleartext reveals the relying party to passive
observers.  Anonymous RP mode (rpid omitted) hides this but the rpId
may still be guessable from context.</t>
          <t>Trial bounds: anonymous RP mode requires one WebAuthn ceremony per
candidate rpId.  Decryptors should impose a local bound on the number
of rpIds to try.  Prefer identified mode when privacy is not required.</t>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8y9+XIbWZY39v99ijQrHAVMARRJLaUiSzWmRGrpkihZVG1d
0yMlgSSZTQCJRgIi2ZIcfghH+F9/EX4M/+V5Ez+Jz+8sd8lMUKrp/iY+zrSK
BDLvcu65Z1+Gw6FblstJsZttHO8/PtzNjot8UowH2f7krFqUy/Pp8PGkuCpP
JkV2OHtfTKp5seHyk5NF8V7f2XDjajTLpzTGeJGfLof1ajIp3+ezYZ2fFsOt
bTfKlwWNdr2b1cuxK+eL3Wy5WNXLna2t77Z2XL3MZ+O3+aSa0RDXRe3qab5Y
vv3bqloW9W42q9y83HVZNsyW1Yj/W1eL5aI4reWP6yn/7vLV8rxayJPljN48
2syOdS30YZbJIo/K0UX6ebU4y2fl3/NlWc12s0eL6/myOlvk8/Pr7FE1o+0s
y9lZ9vz5I366mOblhJZVjs6rSV5v2na/KYvl6f9yhm83R9XUuVm1mNKY7wss
6fXjR3fu3bmvv97d3r5nv+7cvmO/3rm/Zb/ev/ed/nrv/m16TX6/v7VtQ9y/
s73lf71tD3+3vXXP/yqjPRsebGJpw/P5RcH/tD+d/y35bJJP5/Xw4vqkWAxH
xWJZnpY4w9rPd3fHP7+g50eni7NhXpyVNf2bj/Hd0bPjN8PjV8P7W1vD2/cP
dhl0y3xxVix3s/Plcl7v3ro1ez+Zr07qzVlZLzfPqve38As+ufW8OMtH17eO
X/FH9bwYlTmenWAhdEwy7HhzPj6VkRWJXxcE+mkxG/NT2Wm1yB5OKjrwR+X8
vFhkL6pxUWfVafZyXiz0wJ8Q6pX1rUfVarbUR7Lek0cv+hnhZfbkxf6jDZ4j
4Bd+FMdebGYHl9XiohRUonlpGYTY3w63t/mTuliURV3OTit7E6ChiyZ7yl6F
TWUKLOfweIo8d+8JzIEQ3317207iu9vf2nHf+c7/evfb+/5Xj1Lf3vU49929
rbvJgVfneTkcna9mF8WY/qDjwdf7h/vd51av5nO6gpv5fD4pgOy3zlbluLhV
F6MVEY3rW/MF3d0Rrs2Qnhnmo1FR18NlNVwROIYEpHxIz47H4+27W6Od7VuX
xUlyjPsYmAjOCHexGGf7i9E5wSLr0ZL63adBl3g3k/eezUabyWns3MFunhx2
7yY/K4aFTEWHsEkD3Xq/nSznzXmR0VPZaUmjh0czOaQbsOPxZvZzPiFyNc7T
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
3muIgdcU22Ox69QoQmS/gCrU7teb9V7+ctxXSYMxoRYWj269ddLMV02+QCtu
s+j7HnJbH24NDEEjahSsBXICJIh8TnIpEGaBxrGPhlEz8qA7L4l0F8JlXrZP
2FAX0xzGNcTQaAU1Jezo8EV0pj7VjMcoRezHQ3MzyXKtAZqY6/YfHj0eaEan
iXMCpY7G47y51QylYbnbU8S5uSVVS2GWUmDrdWbuWteh2lvLKgCZJ5WfB9kG
3zLtSxx6OD9/7KK/9Fn+RDoj9zbitsvcTDl8a8+vb2YcvyvP8h8ZvWBNkuWD
vnQiiKKf9VFdx4MN/VNKLkVffXYN0Xv+2Vfc7Zj/Tab8n692toc79+ld+m1/
uPNQfjsYfnvYmRqzl/3MY8CQQ3z0+NUAIBpgcw6by5LRaYnHr2jEp2/2HyaF
Eds0X0psqfCa1IBudyNxUS+ipG3GLmLIYESTSDVrvKPu/dk401Zm9O1U4qI0
UNOXrgo304vlMaEKnAIFtCNKxI34PA2S6wYV1n/kB67XCOKcThwJ4lH14z8i
k3MMp8jkVjowYIPwXut/cwLtUWxcaII3YNtlX3PITmrXw7Hh063vwL1fFSQd
zJbei26l1Xy/wD2ttWOtcxrlRYlCksQ5UXMj97hjdhzZPQmrpHGmCxe/K14N
Zt52yT9ReYJ4raVqAEgRyUpNk/8CCe/yvKqLaA4XOrvIoH4WMRp/yaCu0xzf
FCAvG1nkzAGsNEPa60VUqfPqMum5Yg4yLsUSKLwLFF7Gaqpk+D70AFchCZyv
S6uzF6JK09Frxgif4yL9YlVHP3yVUu8/ZPulZT9qcQ1nuPVZI27HAQl30oL3
fhWENAmv6jIdJ7zKtXnVJlrHHUfYFLYW4W1kqEKWowkckDIaTgPvcq5JZQJm
YBJ6J4SJ8GtspgER46nmVckukhhq9I4Z0ovszlAYq8AOfeQ6lT08upM8ymp/
1gGYza5CAbwYhdsSwRbhvrd1LXXLwNrMRFh0avZBngZckUjhsebElNNpMS65
wkwCkQmihlgTmV270NInNsNLxK6UBZLUnX2Zl8uQ8tPAJxMlequZIVofeTrd
D6eSeuOt23hLAov43Y018vsGEe8F6aQNIQhRgiGzRKBq2mIhEbeoFtPSooGs
2dIGVJpvhD6q5oERnTonEmMLjlZr1fMu7dYEgiHduJLi8l7DCQ2iB9y68MGd
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
3qejSREttX3NYNAVI6qCUHcSWYSMPGBaMeVKuwMnqW6ewTd3RHdBwrvQojFy
pY5XPJGcnDPjlYY3BXOYwaDO2mauNb4cRYY1Lp123M5an04rCw4ZPEg042jO
bDWfm5Msq3ybHYmljOLWIKkNUbZduFCawRCi4vT1uAIJLfxN+RBF45M21XZF
tYaLIRNiWHASoewel4gZcPGl4bIaKqjl2Mwv0FGKq68dVQh7pOTghw9GKKTY
lZ/Sl8R8KPQxIi1K7SLKos8EOz6nlCY0AiF48pTYE0k/nfkSwIzoLnamBZ8Z
662P+RLs97UUECMuC2WWp+7epZSEBCj+4J2ce08rvmgjAylRE1Sb/qaLF8f+
PZrn8OVjDUP0+g3XTSJ6964zm/Gd281+qi0WW3lFIKr6SaCqGgU25espns2E
IXMpZeSmaGAlilwlcfQWXP/y7cGz14eP3myuW5nypmSBnyX62t/aF+735YtQ
WRdNetgn11S44ghd01sT7tncZcd1jMew3NSTBpIJUUW5Ja5ThM9XUAo5Hrn7
eLDqm+EzcFpXB4K9F03PabkTdVBZMJ+kBC3Euqopcl10a86may+qhCIKUR40
bjft3CL5mteJmzItpfckR91IoFvOnRyQVwOzTB6nvxAqkVZztsin0xz0w1Jf
2G5yvqJX49hBM1pZGWtJWLAOoSLb1VGDUKvv05EE1hBg9SCLmpZJDBYCcVN6
deI4QhrsauElmueCmypXSvRGQE2RDFL8jUXk1iSJiGzFyZzxPS53o5ktmpSL
UsRervmdm3Jmv4fuXvRHVF6Q/ipO3m7Jf7b/wiVi8SuXhv1LR/lwscRmxUmz
LU9nDxw8Kk160H5ovkTbKAS49xs1s9NR1w4V/fSaAwaxyw5SCbVYwELjVUBk
EH8QYON63PQ3DZK7sWre0bkMkhRaXV/MOq1h5Y/aWYm3rpZMUmMhxYqsB1D1
tbfRN46BERod9OMsApUCPzMinLk3jZKk+iuABlGvna4shC/quqkVJP+5vTY3
o8CvuNemZinrzdJozMBWk2CAOIHKNzUJrQvU4xy/qBJ+LbmJnR10XOdpKuFm
K2uuyS+4NtpmaBDdCNdjS51KwrkW7vE11zVfo13zOupatNlsDPXZNUV5QYhs
6xgeJkUC7p+LRTXUtflFCc7kgveo4Zf9veux0Hv0CLG3g+y5Fpd8kG11wVIu
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
v19fPRZPr46fOuP23dn+dHJ917/q7pUuzj5NTzr7F0/e+Xg6Pj0b7ndH7af4
03bx5urj/GPx8sPJnXkIn2lflPY6n4bt472b3Yvz7bPO8N3sZm947l1+2j6+
3Lt4PC99fPw4fHfZ3atdXg5vgqv96KB7sH9zWZx+u7qLrrqXk6fgcLvf/dT5
fj0MS9GofdQZD796x6Wjx5uD2l374PK6W4nal3vD+vndXuv04+/aE9ej/e83
59fF7kHra1C+hDUvPXQPLu+uP3Vgr/RL3dEc/r4Pe6V/3z3wYPpG7kNqq7+w
pJReZFRohOCQxVSiwqGV52CKHGURxVx++SqhYHxgG+zj/V3iQHbLJDyYD2G3
DLvnperx14vS8fldElx9bF2N7srdy/3F1fnlt5PD7XdXn/a+d7/fPF2Wo5MI
d/kHfOmqXTy9HH46G02DTulmfvX1HTS4P48O24PL75fl62L/IL46/n7xdf+u
O/pYvLns38d7pW/n59sn3uX+3ffzYmcWPWVsuVH7sDOefj0ud8rX5VJHvaTf
KQ0/eb/nq881MD49L/6ebQZbeXZzpXdOtujRsvXdVafcf7iuDHfCg3bt46j/
zjvbq02uh/2dsDQ9/zh6HHQvajXo9M7x/vTTxVX0tVO8Ll3fhbVgf7r78Wu7
f7X/7v7sInw8vnp3dDHe/up1Kv3k7CI66ZY7n9og/KLXiKHUrqWLDuFhMpgJ
uPRD/CZ5RYhBj3l2rRu18fuuuuVd/c+//JbQ9gbR5s2gPvo4vq59bU6Prr9V
JvXZ1W37YXMzTzxLCKf3iotLXwJwBzxkXJmwub6Hleg+HH10Hl3VNL6yonXn
ldvfJRb/W+7XrN2KAaiNVB5oThObu7kieU/t63/Shs34+H/AlkUPZrQZHV4+
XY9a32GlZjfnR6W2ubcmcP1Pjr+/u78GAR8dHlsb2XnriqT3NDzoD8NxZxgf
wr8gQ0GNIv0vYxPL64tuufb15txoUidX+4Prcmd4M4omwdV01j0oLdDhUNl+
DMftYvTpphIfDuvHlvJ1cr7dvx61726ubsbBwd3v2cTuYNrDoNy+716VptFB
adgdm8Gw3rd/Fh/0B1d7775fDds7x6AFebC7g/jiXf26GBXDvcdruC2+di+m
5evv7ybBwd7T5ach3BbD8TWcgPbF8LB7MA8uv188XF9GQbg/vfbOrqK749HD
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
V5u+Hq6fk7io5I7gnO4oDZkU3xNK2PM00gy8TaYZ6GOYc28hO8lPHHcljsJe
iJ/TCZt+rgrnYhOuAZXJARu2WbWTmZJ1yYfoKJYnVvQ3/ivhgW193Nte/jcT
aXjr9mjH/rd99vRzP/h697FYC8vXpeF28/bwKvrl7rBRPZ/ejXuX9XGldVAM
erXdg93+BWKm3i2eqk+707vhEC6v/bPD3wF5lNHbFf92do4fpt/j88tfzr8H
va3xXnl4cb3n9Spb983K4/m3k/2fk68fx8dXt7Xti/n29enBff9Dqfhz4/C0
1/r+vjZNbt81e79UDuLxZPd+93R7cTEIzife1sPxrv3vfGfRfxc+Ru3y7H7r
l8PkNLl/93T1uHOzc9Mbtut3k/O92f0rwSKFHOzVAJEuAh67iSbRUzYGXt6P
CfPO48zUTMy7l+mgtnaOtrYPt/th5Xhr52D/6abcWhyPhndb21vZ67D74Gwb
D/5T+vChvv/tpLN7Pvx+8/Xq4vBpK7qp/Pyxd98/GZ1FrU/fer1itzP95e74
+mT//OCs8eHrEfzm6vLbTdW7PPpdYFn/y+6cnxTQvuV58H/9ibHiCpb/4V/p
fhB5vAT5z36H3cP3e8cCv5cnR1Dh7HALrFG1GRFnTqC7KD3auBP8bHcClUaB
cjDifJRx5AJs8WsUb+7s7/itUrOYR5ZMHtjWemO95OdW98r5G7y4d1YolZuU
LKYLnSgrIhI7VYqN2Z3rWekHwydxXmOA/hZTOOaSYyGdWfaMmErj5K4DF2i1
DlZqDcy/eqUHFjDoypVGLepVejUwPgJQ2ktRud6sFZeUj1axAtYZ2CflSq9c
ipqgsMVNMKKtL0zpCxW4Z8NeXAS7M4q6YBZEjWYxrrWKjUYJ/hKAHQ1GUb27
9AW4tivlVqNVDbrFcjcMmsVmqRZWI29PL01ytwdfANurGoCpCk+UwwisyApo
0XEcVEpgeJUbYHWBst8rR0tfaMQtsNyisNiEb4BCEPaCMliidesLU/pCBbSJ
oFKrN7pRN6qXm3GzWQcrohI2I2ijASMDla7SXVbRomoc1EGFDUu1Yq8B9l6p
24NOlVAVhlt/Le04+u2eo1e7jn677+g/x3n0zHGO+tDO7mEOlj2Pu2uN8KTB
rgtLrTjoVnpgWgVhqYl7sgGKYK8ORgQ+ElR7UVytweAjsCOatbgH2nU1AvUX
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
pe/V7pzTFR0Wef8zmEq7X7qjYAdobGXHi/Dq508+O04Da0e/isjg/sclphlc
qxIoHYgYTmRU0l5OW8VlDZcT6DKowiJKoU2bnPav4d5FTVV2XVGlwSlp/bwx
6sImaDD146LJ0Bn45l2VkR8Cj6wpotbuLjAtNqHJr9Wj4Ig324USfS3fXMzU
IycSf8Y9QiqEb3auuRB9zdgyxfBxuXcTPLHU7FF0PVvuDMoVdIdAwGG1IP3+
oJr7ajZZPax2Obsm0+mGQbFwT3g6Z5c+AyhkhffbBV1flmuo3BkhLnxN/BvN
1idIStEmmZNS4xfGtJy9fv2nV1+MdXop1vkUSbx4x3w4dHG25/GgLEcLKZRT
OGvJaaI2v/K+VzVFsmZMAsGy4lSG1bJ95L0SjlEO+75DKTlo87fcpg+/O1Cn
5w2e/PDh7ouX8BkL2C0aHgKncNJ8zTRCd/srmGs6NMinvr+pp5O/T+ablf96
pTbtXN/N6KXyl2/QhbEuNylzQzDrNVMhbunZZSv/DdUiN6R1HiHJ06hZ71DX
rF15E81iuGKaHCESIVNOpOJMJ2WuMk9Wq41a6i0n+cXhl6Vb1mibp+8r6zJ8
U4bMQ6w0w/OmVpvpetj4zUyaRBXOa2ovP+oMzHx5rpkdJiuvYtoCYkAmPqam
d0v0HWmn+8KgScQN1OrPVvpunM+8VpTwYEYLasq9qgxZj81gJ6Ng75MzO5TM
GckKil7wbKUErivnVWbcGbTRk7OjGsvvUP3a0ydy6tQb9FtymErO0QndMJAh
WzK5m2Rh42yzD/oO/GCYPiOSvvsKM2sp1Ca0rN+JdvCgMIRCg5MWbSYr2miU
/hDFCO9MCt8gi4g77hlBSeJ0V/9IfiNiuTDKg8kmFov3bXf1xCLWW5wLTfQ2
n12sNvQL75Bo0VyagnjJnS6NnnqcL9sLk8bAliTJoWZEocTMQ+s1ZYcwFEYc
66ZUI2a7SE8c/+zu8z9/d3v3+Sso/Ct4p0tiROZ0NGf38xXTnNCfVxRTH5t5
ONAIIj7/4GKiO/Uyf3iZCz1ANVleC4XBBquj4UH2/cX7W6HXrfU5bbNIZSmh
I7J5PmivZuTki+L6/v21lKK5dtk6SM4VG1IjivMvLRdhNeA6XE8elFb5faJX
jrcqy/Hk7AIxQYR7kx4zinS3UdfuRLE3h+nX0bkWkbk2PJwGg2cv9F1j8wI+
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

-->

</rfc>
