<?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-00" 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-00"/>
    <author initials="N." surname="Sullivan" fullname="Nick Sullivan">
      <organization>Cryptography Consulting LLC</organization>
      <address>
        <email>nicholas.sullivan+ietf@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="02"/>
    <abstract>
      <?line 77?>

<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 no single factor suffices.  The format is
designed for large, writable files: it supports streaming
decryption, random-access reads at block granularity, and
selective re-encryption of modified blocks without re-keying.
Recipient privacy modes allow locks to omit identifying metadata.
SAFE accommodates post-quantum key encapsulation without format
changes, provides algorithm agility through IANA registries, and
defines a mandatory-to-implement profile for interoperability.</t>
    </abstract>
  </front>
  <middle>
    <?line 91?>

<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
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
HPKE steps to omit key identifiers, preventing passive
observers from linking files to recipients.  A
mandatory-to-implement profile ensures interoperability.</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>
    </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">S/MIME</th>
            <th align="center">SFrame</th>
            <th align="center">Age</th>
            <th align="center">TLS</th>
            <th align="center">MLS</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">-</td>
            <td align="center">X</td>
            <td align="center">-</td>
            <td align="center">-</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">-</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">P</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">-</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">P</td>
            <td align="center">-</td>
            <td align="center">-</td>
            <td align="center">-</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">-</td>
            <td align="center">X</td>
            <td align="center">-</td>
            <td align="center">X</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">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">-</td>
            <td align="center">X</td>
            <td align="center">X</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">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"/>) and OpenPGP (<xref target="RFC9580"/>) wrap a content-encryption
key per recipient and support streaming, but neither defines
fixed-size blocks for random access or selective rewrite.  Both
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.</t>
      <t>TLS <xref target="RFC8446"/> provides streaming authenticated encryption of
point-to-point channels with strong algorithm agility and mandatory
cipher suites, but operates on sequential records with no random
access, multi-recipient, or stored-object semantics.</t>
      <t>MLS <xref target="RFC9420"/> provides group key agreement and per-message
encryption for multiple recipients.  Messages are individually
encrypted, not stored as a single encrypted object with block-level
access.</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 random nonces
(<xref target="per-block-nonces"/>) so that individual blocks can be re-encrypted
without re-wrapping the CEK.</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>Derive payload_key from CEK (<xref target="payload-schedule"/>).</t>
        </li>
        <li>
          <t>Split plaintext into blocks; encrypt each with a per-block nonce.</t>
        </li>
        <li>
          <t>Write the file: optional CONFIG, LOCK blocks, and payload.</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>Verify the commitment prefix.</t>
        </li>
        <li>
          <t>Derive payload_key from CEK (<xref target="payload-schedule"/>).</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 and the encryption_parameters
(the AEAD, Block-Size, and Hash; <xref target="encryption-parameters"/>),
providing domain separation: the same CEK with different
configurations produces different ciphertext.</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.  Integers serialized in binary are unsigned
and in network byte order.  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).  LabeledDerive labels are
ASCII (e.g., commit, kek); the protocol prefix SAFE-v1 is added
automatically.</t>
      <t>ABNF follows <xref target="RFC5234"/>.</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">Byte 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-byte 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>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 <xref target="RFC4648"/> Section 4. 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>
        <t>All multi-octet integers in binary (block index, nonce construction) use
network byte order (big-endian).</t>
      </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>MTI (Mandatory To Implement):</dt>
          <dd>
            <t>In algorithm tables, "Yes" means implementations <bcp14>MUST</bcp14> support
the algorithm; "No" means support is <bcp14>OPTIONAL</bcp14>.</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">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">MTI</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">Yes</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">No</td>
              </tr>
              <tr>
                <td align="left">AES-256-GCM-SIV</td>
                <td align="left">aes-256-gcm-siv</td>
                <td align="left">32</td>
                <td align="left">12</td>
                <td align="left">Yes</td>
                <td align="left">No</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">No</td>
              </tr>
              <tr>
                <td align="left">AEGIS-256X2</td>
                <td align="left">aegis-256x2</td>
                <td align="left">32</td>
                <td align="left">32</td>
                <td align="left">No</td>
                <td align="left">No</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"/>).  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 commitment prefix
<tt>LabeledDerive("commit", CEK, encryption_parameters, 32)</tt>
that binds the ciphertext to the CEK and the negotiated
algorithm parameters (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>
                <th align="left">MTI</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>
                <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>
                <td align="left">No</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>
                <td align="left">No</td>
              </tr>
            </tbody>
          </table>
          <t>HPKE KEM IDs are defined in <xref target="RFC9180"/> Section 7.1 and the IANA HPKE
KEM Identifiers registry.</t>
          <t>Conforming implementations <bcp14>MUST</bcp14> support X25519.  All other KEMs
are <bcp14>OPTIONAL</bcp14>.  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>MTI algorithms and defaults are listed in the summary tables
above.  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="labeled-derive">
          <name>LabeledDerive</name>
          <t>LabeledDerive 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[
LabeledDerive(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 (XOF):</t>
          <artwork><![CDATA[
LabeledDerive(label, ikm, info, L):
    return Derive(
        Encode("SAFE-v1", label, ...ikm,
               I2OSP(L, 2), ...info), L)
]]></artwork>
        </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>aead_id, block_size, and hash_id are the ASCII string forms of
the AEAD, Block-Size, and Hash parameters respectively.
LabeledDerive splices this list via <tt>...encryption_parameters</tt>
and applies lp16 framing to each element (<xref target="labeled-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>LabeledDerive 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>
        <artwork><![CDATA[
Step line: Step: pass(kdf=argon2id, salt=AQEB...)
                 |___|_____________________________|
                   |                |
              step type     step parameters
                "pass"      kdf, salt, ...
                   |                |
                   v                v
             step_secret    binding step_token
           (32 octets)      Encode("pass", kdf, salt)
                   \               /
                    v             v
              LabeledDerive("kek_step",
                [agg, step_secret],
                binding_step_token, 32)
]]></artwork>
        <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>LabeledDerive("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>
                <th align="left">MTI</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>
                <td align="left">Yes</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>
                <td align="left">No</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 <xref target="RFC9106"/> Section 3.1.</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"/>).</t>
            </dd>
            <dt>id (<bcp14>OPTIONAL</bcp14>):</dt>
            <dd>
              <t>The key identifier computed as
LabeledDerive("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 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
LabeledDerive("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>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="")
step_secret  = ctx.Export(exporter_context, L=32)

;; Decryptor
ctx          = SetupBaseR(kemct, skR, info="")
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="")
step_secret  = ctx.Export(exporter_context, L=32)

;; Decryptor
ctx          = SetupAuthR(kemct, skR, pkS, info="")
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 LabeledDerive 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>
                  <th align="left">MTI</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">x25519</td>
                  <td align="left">0x0020</td>
                  <td align="left">0x0001</td>
                  <td align="left">(0x0020, 0x0001, 0xFFFF)</td>
                  <td align="left">
                    <xref target="RFC8410"/></td>
                  <td align="left">Yes</td>
                </tr>
                <tr>
                  <td align="left">p-256</td>
                  <td align="left">0x0010</td>
                  <td align="left">0x0001</td>
                  <td align="left">(0x0010, 0x0001, 0xFFFF)</td>
                  <td align="left">
                    <xref target="RFC5480"/></td>
                  <td align="left">No</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>
                  <td align="left">No</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 <xref target="RFC9180"/> Section 5.3.</t>
            <ul spacing="normal">
              <li>
                <t>DHKEM-based KEMs (x25519, p-256) use HKDF-SHA256
(KDF ID 0x0001) per <xref target="RFC9180"/>, regardless of SAFE's Hash
parameter.  Implementations using these KEMs require a SHA-256
implementation for HPKE operations.</t>
              </li>
              <li>
                <t>ML-KEM-768 uses the KDF selected by the Hash parameter per
<xref target="I-D.ietf-hpke-pq"/>: HKDF-SHA256 (KDF ID 0x0001) when
Hash=sha-256, TurboSHAKE256 (KDF ID 0x0013) when
Hash=turboshake256.  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) DER
encoding rather than raw key bytes.  This ensures key identifiers are
consistent with certificate fingerprint practices and include the
algorithm 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( LabeledDerive("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 = LabeledDerive("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.  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 LabeledDerive
(<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, and (for NMR AEADs)
nonce base from the CEK and encryption parameters.</t>
        <t>The following diagram shows the two independent chains:</t>
        <artwork><![CDATA[
+-> KEK chain (per lock)
|     agg = LabeledDerive("kek_init", "",
|               encryption_parameters, 32)
|     agg = LabeledDerive("kek_step",
|               [agg, secret],
|               step_token, 32)
|     ...
|     derived_kek = LabeledDerive("kek", agg,
|               encryption_parameters, Nk)
|     Encrypted-CEK = AEAD.Seal(derived_kek, nonce,
|                               "", CEK)
|
+-> Payload chain (lock-independent)
      commitment  = LabeledDerive("commit",
                      CEK, encryption_parameters,
                      32)
      payload_key = LabeledDerive("payload_key",
                      CEK, encryption_parameters,
                      Nk)
      nonce_base  = LabeledDerive("nonce_base",
                      CEK, encryption_parameters,
                      Nn)
                    // only if NMR suite
]]></artwork>
        <t>Payload encryption is performed once under CEK 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 = LabeledDerive("kek_init", "",
          encryption_parameters, 32)

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

derived_kek = LabeledDerive("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 = LabeledDerive("kek_init", "",
          encryption_parameters, 32)

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

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

derived_kek = LabeledDerive("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 derived_kek already depends on encryption_parameters (via
kek_init and the final kek derivation) and all step_tokens (via
kek_step chaining), so no additional AAD is needed.</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,
and (for NMR AEADs) nonce base from the CEK using
LabeledDerive.</t>
          <artwork><![CDATA[
commitment  = LabeledDerive("commit", CEK,
                  encryption_parameters, 32)
payload_key = LabeledDerive("payload_key", CEK,
                  encryption_parameters, Nk)
]]></artwork>
          <t>For NMR AEADs (NMR=Yes in <xref target="aead-summary"/>), the payload
schedule also derives nonce_base:</t>
          <artwork><![CDATA[
nonce_base  = LabeledDerive("nonce_base", CEK,
                  encryption_parameters, Nn)
]]></artwork>
          <t>For non-NMR AEADs, nonce_base is not derived.</t>
          <t>The commitment prefix is always 32 octets for all AEADs.
Decryptors <bcp14>MUST</bcp14> verify the commitment before decrypting
any block (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
LabeledDerive outputs, causing AEAD verification to
fail on every block.  This binding provides implicit
integrity assurance that the decryptor is using the
correct encryption parameters.</t>
        </section>
        <section anchor="per-block-nonces">
          <name>Per-block Nonces</name>
          <t>Each block is encrypted with a unique nonce.  The nonce size Nn is
determined by the AEAD algorithm (see <xref target="iana-aead"/>).  Encryptors <bcp14>MUST</bcp14>
ensure nonce uniqueness within a CEK's lifetime.</t>
          <t>The per-block encryption produces:</t>
          <artwork><![CDATA[
(ciphertext_i, tag_i) = AEAD.Seal(key   = payload_key,
                                   nonce = nonce_i,
                                   aad   = aad_i,
                                   pt    = plaintext_block_i)
]]></artwork>
          <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 pad(uint64(i))
]]></artwork>
          <t>where pad() zero-extends uint64(i) to Nn octets (XOR applied to
the last 8 octets of nonce_base).  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="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:
  nonce_i  = SafeRandom(Nn, "SAFE-NONCE")
  (ct, tag) = AEAD.Seal(payload_key, nonce_i,
                         data_aad(i, is_final),
                         new_plaintext)
  Update stored nonce_i and tag_i
]]></artwork>
          <t>For NMR AEADs (derived nonce):</t>
          <artwork><![CDATA[
Rewriting block i:
  nonce_i  = nonce_base XOR pad(uint64(i))
  (ct, tag) = AEAD.Seal(payload_key, nonce_i,
                         data_aad(i, is_final),
                         new_plaintext)
  Update stored tag_i only
]]></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="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.  It 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 is the concatenation of an optional config header
(<xref target="safe-config"/>), one or more LOCK blocks (<xref target="safe-lock"/>), and
exactly one data block (<xref target="payload-layouts"/>).  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 | aegis-256 | aegis-256x2
Block-Size: 16384 | 65536
Hash: sha-256 | turboshake256
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.
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 conformant 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 unknown field names.</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 (bytes 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:</t>
          <dl>
            <dt>65536 (default):</dt>
            <dd>
              <t>Larger chunks amortize per-chunk 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 chunks reduce the cost of partial updates.  Re-encrypting
a modified chunk requires reading and rewriting only that chunk;
at 16384 bytes 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 sender 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 a cryptographically
secure random number generator.</t>
        <t>Decryptors <bcp14>MUST</bcp14> skip LOCK blocks containing unknown KEM identifiers
or unknown step types, and attempt other LOCKs (if available).</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 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 bytes (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 LabeledDerive("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; raw bytes follow 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[
[commitment] [eb_0] [eb_1] [eb_2] ...

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 commitment prefix is always present (32 octets for SHA-256).</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>The payload begins with a 32-octet commitment derived per
<xref target="payload-schedule"/>.  Decryptors <bcp14>MUST</bcp14> verify the commitment before
decryption.  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, C_final = Nn + 16
(nonce plus AEAD tag); for AEADs with Nn = 12, the minimum
payload is 60 octets (32-octet commitment + 28-octet encrypted
block).  For NMR AEADs, C_final = 16 (AEAD tag only).</t>
          <t>Decryptors <bcp14>MUST</bcp14> reject payloads with unexpected structure: incorrect
commitment length, trailing bytes after the final block, or block
boundaries that do not align with the expected sizes.</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: commitment, block
count N, first ciphertext index D, and per-block metadata (nonces and
tags).  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>
          <artwork><![CDATA[
+-------------+------------+---+---+-------------------+
| CONFIG+LOCK | commitment | N | D | metadata...       |
+------------------------------------------------------+
| ...metadata (continued)            | padding         |
+------------------------------------------------------+
| padding (optional append growth)                     |
+------------------------------------------------------+
| ct0                                                  |
+------------------------------------------------------+
| ct1                                                  |
+------------------------------------------------------+
| ...                                                  |
+------------------------------------------------------+
]]></artwork>
          <t>Per-block metadata entry:</t>
          <artwork><![CDATA[
Non-NMR AEADs:    +-------+------+  Nn + 16 octets
                  | nonce | tag  |
                  +-------+------+

NMR AEADs:        +------+  16 octets
                  | tag  |
                  +------+
]]></artwork>
          <t>The binary portion immediately follows the text headers:</t>
          <ul spacing="normal">
            <li>
              <t>commitment (32 bytes)</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 bytes</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>
          <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-byte commitment, N, and D.</t>
              </li>
              <li>
                <t>Read N metadata entries, each meta_len bytes.</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 bytes (or fewer for the final
block) at offset (D + i) x B.</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 unknown AEAD identifier in the SAFE config.</t>
          </li>
          <li>
            <t>Fail if they encounter an unknown Data-Encoding or Lock-Encoding
value in the SAFE config.</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 unknown field names.</t>
          </li>
          <li>
            <t>Fail if the payload has unexpected structure (wrong commitment
length, trailing bytes, 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 mandatory-to-implement AEAD, ensuring the
widest recipient support.</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>AEGIS-256 is not mandatory-to-implement.  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>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>SAFE provides:</t>
      <dl>
        <dt>Confidentiality:</dt>
        <dd>
          <t>IND-CCA2 security for the payload, assuming IND-CCA2-secure AEAD.</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.</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
LabeledDerive chaining.  Payload keys inherit suite binding from
their own LabeledDerive 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 does not protect against
modification or deletion 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.</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>
        </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, 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 LabeledDerive 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"/>). 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; security equals the weakest step.
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)
immediately after use.
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, and KDF
operations.  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>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.</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>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 nonce base repeat, producing identical 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 nonce bases repeat across files.  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
LabeledDerive("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 4 petabytes at
the default Block-Size of 65536 octets) provides a conservative margin
while supporting files far larger than current storage systems.</t>
        <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 LabeledDerive 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>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 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).</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>LabeledDerive("commit", CEK, encryption_parameters, 32)</tt>
per <xref target="payload-schedule"/>.  Recipients verify that the
derived commitment equals the prefix before block
decryption.  This binds the ciphertext to both the CEK
and the negotiated algorithm parameters (via
encryption_parameters in info), providing
2^128 key-commitment security and
preventing cross-algorithm commitment collisions.  The
security relies on collision resistance of LabeledDerive:
the Encode() framing ensures unambiguous parsing of all
inputs, so distinct (encryption_parameters, CEK) pairs
cannot produce the same commitment.</t>
      </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 additive: 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>
      </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 that operate in constrained environments <bcp14>MAY</bcp14> reject
encryption_parameters containing algorithms outside a locally
configured allowlist.</t>
        <t>The symmetric components of SAFE (HPKE export-only key schedules,
LabeledDerive-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>DHKEM-based KEMs (x25519, p-256) internally use HKDF-SHA256
regardless of the Hash parameter; this is an HPKE design
property, not a SAFE limitation.  A deployment using only ML-KEM-768
with Hash=turboshake256 eliminates all SHA-256 dependencies.</t>
      </section>
    </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, that identifiers are at most 255
octets of lowercase ASCII, and that the algorithm is 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">MTI</th>
              <th align="left">Reference</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">Yes</td>
              <td align="left">
                <xref target="NIST-SP-800-38D"/></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">No</td>
              <td align="left">
                <xref target="RFC8439"/></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">No</td>
              <td align="left">
                <xref target="RFC8452"/></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">No</td>
              <td align="left">
                <xref target="I-D.irtf-cfrg-aegis-aead"/></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">No</td>
              <td align="left">
                <xref target="I-D.irtf-cfrg-aegis-aead"/></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.  Conforming implementations <bcp14>MUST</bcp14> support aes-256-gcm
(MTI=Yes).  All other AEADs are <bcp14>OPTIONAL</bcp14>.</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">MTI</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">Yes</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">No</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">No</td>
            </tr>
          </tbody>
        </table>
        <t>HPKE KEM IDs are defined in the IANA HPKE KEM Identifiers registry
established by <xref target="RFC9180"/>.  Conforming implementations <bcp14>MUST</bcp14> support
x25519 (MTI=Yes).  All other KEMs are <bcp14>OPTIONAL</bcp14>.</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 are at most 255 octets of lowercase
ASCII, that the underlying KDF provides at least 128-bit security,
and that the entry references a KDF registered in the HPKE KDF
Identifiers registry (<xref target="RFC9180"/> Section 7.2).</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 Class column
determines which LabeledDerive instantiation is used (see
<xref target="hash-function"/>).</t>
        <t>The CONFIG field name remains "Hash" for wire compatibility.</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="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">sha-256</td>
              <td align="left">0x0001</td>
              <td align="left">two-stage</td>
              <td align="left">
                <xref target="RFC5869"/></td>
            </tr>
            <tr>
              <td align="left">turboshake256</td>
              <td align="left">TBD</td>
              <td align="left">single-stage</td>
              <td align="left">
                <xref target="I-D.ietf-hpke-pq"/></td>
            </tr>
          </tbody>
        </table>
      </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>Initial entries:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Step Name</th>
              <th align="left">Algorithms</th>
              <th align="left">Secret Length</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">pass</td>
              <td align="left">argon2id, pbkdf2</td>
              <td align="left">32 octets</td>
              <td align="left">
                <xref target="passphrase-step"/></td>
            </tr>
            <tr>
              <td align="left">hpke</td>
              <td align="left">(see kem values)</td>
              <td align="left">32 octets</td>
              <td align="left">
                <xref target="hpke-step"/></td>
            </tr>
          </tbody>
        </table>
        <t>The pass step requires: user passphrase and the <tt>salt</tt>
parameter from the pass(...) step token as inputs.  The
algorithm variant (argon2id or
pbkdf2) is specified in the step token's <tt>kdf</tt> parameter.
pass(kdf=argon2id, ...) is MTI; pass(kdf=pbkdf2, ...) is <bcp14>OPTIONAL</bcp14> for
environments where policy prohibits Argon2id.</t>
        <t>The hpke step requires: recipient private key, <tt>kemct</tt>, and the
step token itself as inputs.  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(...)
without auth is MTI; 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, 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.</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>
            </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>
            </tr>
            <tr>
              <td align="left">Block-Size</td>
              <td align="left">16384, 65536</td>
              <td align="left">
                <xref target="safe-config"/></td>
            </tr>
            <tr>
              <td align="left">Hash</td>
              <td align="left">SAFE KDF Identifiers registry</td>
              <td align="left">
                <xref target="iana-hash"/></td>
            </tr>
            <tr>
              <td align="left">Lock-Encoding</td>
              <td align="left">armored (MTI), readable (optional)</td>
              <td align="left">
                <xref target="safe-lock"/></td>
            </tr>
            <tr>
              <td align="left">Data-Encoding</td>
              <td align="left">armored (MTI), binary, binary-linear (optional)</td>
              <td align="left">
                <xref target="data-encoding"/></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.</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>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>
            </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>
            </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>
            </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>
            </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>IETF CFRG WG (cfrg@ietf.org)</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="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="4" month="November" year="2025"/>
            <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 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-02"/>
        </reference>
        <reference anchor="I-D.ietf-hpke-pq">
          <front>
            <title>Post-Quantum and Post-Quantum/Traditional Hybrid Algorithms for HPKE</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="Deirdre Connolly" initials="D." surname="Connolly">
              <organization>Selkie Cryptography</organization>
            </author>
            <date day="6" month="November" year="2025"/>
            <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-03"/>
        </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="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="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="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="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="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="RFC9420">
          <front>
            <title>The Messaging Layer Security (MLS) Protocol</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="B. Beurdouche" initials="B." surname="Beurdouche"/>
            <author fullname="R. Robert" initials="R." surname="Robert"/>
            <author fullname="J. Millican" initials="J." surname="Millican"/>
            <author fullname="E. Omara" initials="E." surname="Omara"/>
            <author fullname="K. Cohn-Gordon" initials="K." surname="Cohn-Gordon"/>
            <date month="July" year="2023"/>
            <abstract>
              <t>Messaging applications are increasingly making use of end-to-end security mechanisms to ensure that messages are only accessible to the communicating endpoints, and not to any servers involved in delivering messages. Establishing keys to provide such protections is challenging for group chat settings, in which more than two clients need to agree on a key but may not be online at the same time. In this document, we specify a key establishment protocol that provides efficient asynchronous group key establishment with forward secrecy (FS) and post-compromise security (PCS) for groups in size ranging from two to thousands.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9420"/>
          <seriesInfo name="DOI" value="10.17487/RFC9420"/>
        </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="AGE" target="https://age-encryption.org/v1">
          <front>
            <title>The age file encryption format</title>
            <author initials="F." surname="Valsorda">
              <organization/>
            </author>
            <date year="2024"/>
          </front>
        </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>
      </references>
    </references>
    <?line 2603?>

<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 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
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
-----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>
        </ol>
        <t>Encryptors <bcp14>MUST NOT</bcp14> reuse a CEK across multiple files; each SAFE
encoding requires a fresh CEK.  Reusing a CEK weakens unlinkability:
an adversary observing multiple files encrypted with the same CEK can
determine they share the same content encryption key by comparing
derived payload keys or nonces.</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 and encryption_parameters 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 pad(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. For non-NMR AEADs: emits nonce_i ||
   AEAD.Seal(payload_key, nonce_i, aad, block).  For NMR
   AEADs: emits AEAD.Seal(payload_key, 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>Decryptors <bcp14>MUST</bcp14> reject Encrypted-CEK values that do not decode to
exactly Nn octets (wrap nonce) plus a ciphertext whose plaintext
length is exactly 32 octets, where Nn is the AEAD nonce size from
<xref target="iana-aead"/>.</t>
        <t>To decrypt content, the decryptor derives payload_key from the CEK and
encryption_parameters per <xref target="payload-schedule"/>.  For NMR AEADs, the
decryptor also derives nonce_base and computes nonce_i = nonce_base
XOR pad(uint64(i)) for each block.  For non-NMR AEADs, the decryptor
reads each nonce from the stored metadata.  Each block
is decrypted using 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="random-generation">
      <name>Random Generation</name>
      <t>This appendix defines SafeRandom, the random generation function used
for all encryptor-generated random values in SAFE.</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
LabeledDerive.</t>
        <artwork><![CDATA[
hedge_key = LabeledDerive("SAFE-HEDGE", sk, "", 32)

SafeRandom(n, label):
    return LabeledDerive(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, 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 anchor="nonce-constructions">
      <name>Nonce Constructions</name>
      <t>This appendix describes two nonce constructions for 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>Where uint64(i) is the block index in network byte order (see
<xref target="notation"/>).  The XOR is applied to the last eight octets of <tt>base</tt>,
with the remaining leading octets 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>
        <artwork><![CDATA[
nonce_i = LabeledDerive("nonce",
    [SafeRandom(Nn, "SAFE-NONCE"),
     payload_key],
    [...encryption_parameters,
     Encode("SAFE-NONCE", I2OSP(i, 8),
        LabeledDerive("SAFE-NONCE",
            plaintext_i,
            encryption_parameters, 32))],
    Nn)
]]></artwork>
        <t>Under RNG state duplication, this construction produces different
nonces when plaintext differs, limiting exposure to leaking equality
of identical blocks at the same index.  The two-pass cost is the
trade-off for this property.</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>
        </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 commitment prefix is always
32 octets.  The encrypted block region is
len_bin_ciphertext = len_bin_total - 32.  Let
B = Block-Size and Nn = AEAD nonce length.  Define:</t>
      <artwork><![CDATA[
C          = Nn + B + 16
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 < Nn + 16:
    reject as malformed
else:
    N       = N_nonfinal + 1
    C_final = rem
L_final  = C_final - Nn - 16
]]></artwork>
      <t>A decryptor decrypting block index i computes byte offsets
relative to the start of the encrypted block region
(after any commitment):</t>
      <artwork><![CDATA[
block_byte_start = i * C
block_byte_len   = C if i < N - 1 else C_final
byte_start       = 32 + 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>Parses <tt>nonce_i = encrypted_block[0:Nn]</tt> and
<tt>ciphertext_i = encrypted_block[Nn:]</tt></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>AEAD-opens ciphertext_i under payload_key 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
derives payload_key from the CEK and encryption_parameters, 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 + 32 + 8 + i × (Nn + 16).  See <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>Consider Block-Size=16384, Nn=12
(AES-256-GCM nonce size), 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 + 16412 + 16412 + 5028 = 37884 octets
Base64 len   = ceil(37884 / 3) * 4 = 50512 characters
]]></artwork>
        <t>To decrypt block i=0, compute byte and character offsets:</t>
        <artwork><![CDATA[
byte_start  = 32 + (0 * C) = 32
byte_len    = C = 16412
char_start  = floor(byte_start / 3) * 4 = 40
char_end    = ceil((byte_start + byte_len) / 3) * 4 = 21928
skip        = byte_start mod 3 = 2
]]></artwork>
        <t>Extract <tt>S_b64[40:21928]</tt>, Base64-decode, skip first 2 bytes of decoded
output, then take 16412 bytes as the encrypted block. Parse the first
12 bytes as the nonce, AEAD-open the remaining bytes under payload_key
with the extracted nonce and block AAD.</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 LabeledDerive.</t>
            </li>
            <li>
              <t>Block AAD includes the block index and finality flag, preventing
reordering, splicing, truncation, and extension within a file.</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 bytes per
block) for flexibility in payload modification.</t>
        </section>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <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
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
    LabeledDerive("kek_init", "",
    encryption_parameters, 32)
agg_step:         596a483b938ad11da3369007f1b7f073502101879eb257f0f4b22c0758fdee21
    LabeledDerive("kek_step",
    [agg, secret], token, 32)
derived_kek:      bfedcafd41d9da3c1c77f73358b973a4ececfbc212ae558eed0dfba709cdc24e
    LabeledDerive("kek", agg,
    encryption_parameters, 32)

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

## Payload Schedule
commitment:       4a3a59d10a797e3fd0ea54ab2ca4e9b6d2ba6116475981fc2b7c1ec88c8bfacc
    LabeledDerive("commit", CEK,
    encryption_parameters, 32)
payload_key:      3888f12793448b662f9b2b85c5e3e9f9256d08cc6cbe29699038808accd2aa7a
    LabeledDerive("payload_key", CEK,
    encryption_parameters, 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:   c6d28185d04caa07e012e4dd30e6be6337c9e04493504427888ee386
encrypted_block:  030303030303030303030303c6d28185
                  d04caa07e012e4dd30e6be6337c9e044
                  93504427888ee386

## Complete SAFE Object
SAFE DATA = commitment (32) + encrypted_block (40)
= 72 octets, 96 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-----
SjpZ0Qp5fj/Q6lSrLKTpttK6YRZHWYH8K3weyIyL+swDAwMDAwMDAwMDAwPG0oGF
0EyqB+AS5N0w5r5jN8ngRJNQRCeIjuOG
-----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-----
SjpZ0Qp5fj/Q6lSrLKTpttK6YRZHWYH8K3weyIyL+swDAwMDAwMDAwMDAwPG0oGF
0EyqB+AS5N0w5r5jN8ngRJNQRCeIjuOG
-----END SAFE DATA-----
]]></artwork>
    </section>
    <section anchor="derive-vectors">
      <name>LabeledDerive Test Vectors</name>
      <t>This appendix is informative.  These vectors validate the
LabeledDerive function in isolation, independent of the
SAFE protocol.  Inputs are deliberately short for
readability.  See <xref target="labeled-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 = LabeledDerive(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 = LabeledDerive(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 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 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 <bcp14>MUST</bcp14> be known to the client.</t>
            </dd>
            <dt>salt (<bcp14>REQUIRED</bcp14>):</dt>
            <dd>
              <t>Base64-encoded salt. <bcp14>MUST</bcp14> 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 = LabeledDerive("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
LabeledDerive("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 = LabeledDerive("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>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.  <bcp14>MUST</bcp14> 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 = LabeledDerive(
    "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 <bcp14>MUST</bcp14> decode to exactly 32 octets.  rpid, when present, <bcp14>MUST</bcp14>
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 <bcp14>SHOULD</bcp14> 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:
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
if/NfTyb9w9f3nrdl9xV9+K1NW2Ob47ns9542HXr+dubu/ll6/j21WpP59Or
m/DYnTRfg7uDXL97vbrOdc4vx/oivKZ5m6+37sLmRb1/dNs+uGmFZ4t+PWxb
nbuDi0799qWdv365Ds86br3c6YR9p3vsN9zGcb+Tm//RHftdtzN7dU4Ohu5d
660Xenl/0jxtTcNH6yJ/+tJvlMfNRqfnFv1mpx5W2uN67er6h2iiNzl+67d7
ObdRe3QKHdjz/LPb6Ix7dy2glWHenazg92OgleE3t2HB8k2iF0lS/2BLKanC
6IowVZspWUWkWpv9t+IoC1bM5QifYgraE7fLbrgfYgeCWmZeYxUCtYRuO1+6
eLzNX7THS6d7XetOxgW3c/zUbXf+uDw5OOve1d/ct/5rp+Bf+kjl53hTt5m7
6oR3N5O508r3V93HMxjweOWfNEedt06hlxs2gu7F2+3j8didXOf6neG3oJ7/
o90+uLQ6x+O3dq618F8TSG7SPGlN548XhVahV8i35E3qnnx4Z/3IU98bYHrV
zv0ImQEpL/pdRTnJrEfx1rNuqzB87hXDQ6/RLF9PhmfWTb0864XDQy8/b19P
XkbubbkMkz68OJ7f3Xb9x1aul++NvbJzPD+6fmwOu8dn325uvZeL7tnp7fTg
0WoVh8ubW//SLbTumsD8/M+woRjVkqDDtowJmFmciyucCxluAyo7CpkJ+BLT
/AdE3TpV/+uF31r57cjf648qk+tpr/xYnZ/2/ijOKovuQ/N5by9DTQqxvvYT
gksJAZABzwkiE4jrzSv637zJdeTSTUPjLRtGj9zy8ENs8f9Lek2iVgwf7MZS
wVIKlCYamkaQBabrfxHBJjz8v4BkCRRszz/pvPYmtTfYqUW/fZpvark1A/E/
u3g7+9YDBu+fXBiEHLmrS9x77jWGoTdthcEJ/AEeCmoU6X8JRCxuf3IL5cd+
W2tSl93jUa/QCvsTf+Z05wu3kX9C70Lx4MWbNnP+Xb8YnISVC0P5umwfDHuT
5rjf7U+dxvhHiDj6Ms3QKTS/ud383G/kQ3eqX4b1vuOboDEcdetnb92weXgB
WpAF1O0Et2eVXs7PefWXHkiLR/d2Xui9nc2cRv21cxeCtAinPTgBzdvwxG2s
nM7b7XOv4zve8bxn3XT98cXk+bl32zwIxvn5xV2/f5E/W/brzYMESbLGgKNg
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

-->

</rfc>
