<?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.27 (Ruby 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-denis-ipcrypt-01" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="ipcrypt">Methods for IP Address Encryption and Obfuscation</title>
    <seriesInfo name="Internet-Draft" value="draft-denis-ipcrypt-01"/>
    <author initials="F." surname="Denis" fullname="Frank Denis">
      <organization>Fastly Inc.</organization>
      <address>
        <email>fde@00f.net</email>
      </address>
    </author>
    <date year="2025"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 99?>

<t>This document specifies methods for encrypting and obfuscating IP addresses, providing both deterministic format‑preserving and non‑deterministic constructions. These methods address privacy concerns raised in <xref target="RFC6973"/> and <xref target="RFC7258"/> regarding pervasive monitoring and data collection.</t>
      <t>The methods apply uniformly to both IPv4 and IPv6 addresses by converting them into a 16‑byte representation. Two generic constructions are defined—one using a 128‑bit block cipher and the other using a 128‑bit tweakable block cipher—along with three concrete instantiations:</t>
      <ul spacing="normal">
        <li>
          <t><strong><tt>ipcrypt-deterministic</tt>:</strong> Deterministic encryption using AES128 (applied as a single‑block operation).</t>
        </li>
        <li>
          <t><strong><tt>ipcrypt-nd</tt>:</strong> Non‑deterministic encryption using the KIASU‑BC tweakable block cipher with an 8‑byte tweak.</t>
        </li>
        <li>
          <t><strong><tt>ipcrypt-ndx</tt>:</strong> Non‑deterministic encryption using the AES‑XTS tweakable block cipher with a 16‑byte tweak.</t>
        </li>
      </ul>
      <t>Deterministic mode produces a 16‑byte ciphertext (enabling format preservation), while non‑deterministic modes prepend a randomly sampled tweak (which MUST be uniformly random when generated, as specified in <xref target="RFC4086"/>) to produce larger ciphertexts that resist correlation attacks.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/jedisct1/draft-denis-ipcrypt"/>.</t>
    </note>
  </front>
  <middle>
    <?line 111?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies methods for the encryption and obfuscation of IP addresses for both operational use and privacy preservation. The objective is to enable network operators, researchers, and privacy advocates to share or analyze data while protecting sensitive address information, addressing concerns raised in <xref target="RFC7624"/> regarding confidentiality in the face of pervasive surveillance.</t>
      <t>For a detailed discussion of the security properties of these methods, see <xref target="security-considerations"/>.</t>
      <section anchor="use-cases-and-motivations">
        <name>Use Cases and Motivations</name>
        <t>The main motivations include:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Privacy Protection:</strong> Encrypting IP addresses prevents the disclosure of user-specific information when data is logged or measured, as discussed in <xref target="RFC6973"/>.</t>
          </li>
          <li>
            <t><strong>Format Preservation:</strong> Ensuring that the encrypted output remains a valid IP address allows network devices to process the data without modification. See <xref target="format-preservation"/> for details.</t>
          </li>
          <li>
            <t><strong>Mitigation of Correlation Attacks:</strong> Deterministic encryption reveals repeated inputs; non‑deterministic modes use a random tweak to obscure linkability while keeping the underlying input confidential. See <xref target="non-deterministic-encryption"/> for implementation details.</t>
          </li>
          <li>
            <t><strong>Privacy-Preserving Analytics:</strong> Many common operations like counting unique clients or implementing rate limiting can be performed using encrypted IP addresses without ever accessing the original values. This enables privacy-preserving analytics while maintaining functionality.</t>
          </li>
          <li>
            <t><strong>Third-Party Service Integration:</strong> IP addresses are private information that should not be sent in cleartext to potentially untrusted third-party services or cloud providers. Using encrypted IP addresses as keys or identifiers allows integration with external services while protecting user privacy.</t>
          </li>
        </ul>
        <t>For implementation examples, see <xref target="pseudocode-and-examples"/>.</t>
      </section>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in BCP 14 <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
      <t>Throughout this document, the following terms and conventions apply:</t>
      <ul spacing="normal">
        <li>
          <t><strong>IP Address:</strong> An IPv4 or IPv6 address as defined in <xref target="RFC4291"/>.</t>
        </li>
        <li>
          <t><strong>16‑Byte Representation:</strong> A fixed-length representation used for both IPv4 (via IPv4‑mapped IPv6) and IPv6 addresses.</t>
        </li>
        <li>
          <t><strong>Tweak:</strong> A non‑secret, additional input to a tweakable block cipher that further randomizes the output.</t>
        </li>
        <li>
          <t><strong>Deterministic Encryption:</strong> Encryption that always produces the same ciphertext for a given input and key.</t>
        </li>
        <li>
          <t><strong>Non‑Deterministic Encryption:</strong> Encryption that produces different ciphertexts for the same input due to the inclusion of a randomly sampled tweak.</t>
        </li>
        <li>
          <t><strong>(Input, Tweak) Collision:</strong> A scenario where the same input is encrypted with the same tweak; this reveals that the input was repeated but not the input’s value.</t>
        </li>
      </ul>
    </section>
    <section anchor="ip-address-conversion">
      <name>IP Address Conversion</name>
      <t>This section describes the conversion of IP addresses to and from a 16‑byte representation. This conversion is necessary to operate a 128‑bit cipher on both IPv4 and IPv6 addresses.</t>
      <section anchor="converting-to-a-16byte-representation">
        <name>Converting to a 16‑Byte Representation</name>
        <section anchor="ipv6-addresses">
          <name>IPv6 Addresses</name>
          <t>IPv6 addresses are natively 128 bits and are converted directly using network‑byte order (big‑endian) as specified in <xref target="RFC4291"/>.</t>
          <t><em>Example:</em></t>
          <artwork><![CDATA[
IPv6 Address:    2001:0db8:85a3:0000:0000:8a2e:0370:7334
16-Byte Representation: [20 01 0d b8 85 a3 00 00 00 00 8a 2e 03 70 73 34]
]]></artwork>
        </section>
        <section anchor="ipv4-addresses">
          <name>IPv4 Addresses</name>
          <t>IPv4 addresses (32 bits) are mapped using the IPv4‑mapped IPv6 format as specified in <xref target="RFC4291"/>:</t>
          <artwork><![CDATA[
IPv4 Address:    192.0.2.1
16-Byte Representation: [00 00 00 00 00 00 00 00 00 00 FF FF C0 00 02 01]
]]></artwork>
        </section>
      </section>
      <section anchor="converting-from-a-16byte-representation-to-an-ip-address">
        <name>Converting from a 16‑Byte Representation to an IP Address</name>
        <t>The conversion algorithm is as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>Examine the first 12 bytes of the 16-byte representation</t>
          </li>
          <li>
            <t>If they match the IPv4‑mapped prefix (10 bytes of <tt>0x00</tt> followed by <tt>0xFF</tt><tt>, </tt>0xFF``):
            </t>
            <ul spacing="normal">
              <li>
                <t>Interpret the last 4 bytes as an IPv4 address in dotted‑decimal notation</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Otherwise:
            </t>
            <ul spacing="normal">
              <li>
                <t>Interpret the 16 bytes as an IPv6 address in colon‑hexadecimal notation</t>
              </li>
            </ul>
          </li>
        </ol>
        <t>(For additional illustration, see <xref target="diagrams"/>)</t>
      </section>
    </section>
    <section anchor="generic-constructions">
      <name>Generic Constructions</name>
      <t>This specification defines two generic cryptographic constructions:</t>
      <ol spacing="normal" type="1"><li>
          <t><strong>128-bit Block Cipher Construction:</strong>
          </t>
          <ul spacing="normal">
            <li>
              <t>Used in deterministic encryption (see <xref target="deterministic-encryption"/>)</t>
            </li>
            <li>
              <t>Operates on a single 16-byte block</t>
            </li>
            <li>
              <t>Example: AES‑128 treated as a permutation</t>
            </li>
          </ul>
        </li>
        <li>
          <t><strong>128-bit Tweakable Block Cipher (TBC) Construction:</strong>
          </t>
          <ul spacing="normal">
            <li>
              <t>Used in non‑deterministic encryption (see <xref target="non-deterministic-encryption"/>)</t>
            </li>
            <li>
              <t>Accepts a key, a tweak, and a message</t>
            </li>
            <li>
              <t>The tweak is typically randomly sampled (and MUST be uniformly random when generated)</t>
            </li>
            <li>
              <t>Reuse of the same tweak on different inputs does not compromise confidentiality</t>
            </li>
          </ul>
        </li>
      </ol>
      <t>Valid options for implementing a tweakable block cipher include, but are not limited to:</t>
      <ul spacing="normal">
        <li>
          <t><strong>SKINNY</strong></t>
        </li>
        <li>
          <t><strong>DEOXYS-BC</strong></t>
        </li>
        <li>
          <t><strong>KIASU-BC</strong> (see <xref target="implementing-kiasu-bc"/> for implementation details)</t>
        </li>
        <li>
          <t><strong>AES-XTS</strong> (see <xref target="ipcrypt-ndx"/> for usage)</t>
        </li>
      </ul>
      <t>Implementers MUST choose a cipher that meets the required security properties and provides robust resistance against related-tweak and other cryptographic attacks.</t>
    </section>
    <section anchor="deterministic-encryption">
      <name>Deterministic Encryption</name>
      <t>Deterministic encryption applies a 128‑bit block cipher directly to the 16‑byte representation of an IP address. For implementation details, see <xref target="pseudocode-and-examples"/>.</t>
      <ul empty="true">
        <li>
          <t><strong>Note:</strong>
All instantiations documented in this specification (<tt>ipcrypt-deterministic</tt>, <tt>ipcrypt-nd</tt>, and <tt>ipcrypt-ndx</tt>)
are invertible - encrypted IP addresses can be decrypted back to their original values using the same key.
For non-deterministic modes, the tweak must be preserved along with the ciphertext to enable decryption.</t>
        </li>
      </ul>
      <section anchor="specific-instantiation-ipcrypt-deterministic">
        <name>Specific Instantiation: ipcrypt-deterministic</name>
        <t>This instantiation employs AES128 in a single‑block operation. Since AES128 is a permutation, every distinct 16‑byte input maps to a unique 16‑byte ciphertext, preserving the IP address format.</t>
        <t>For test vectors, see <xref target="ipcrypt-deterministic-test-vectors"/>.</t>
        <section anchor="operation-flow-diagram">
          <name>Operation Flow Diagram</name>
          <artwork><![CDATA[
      +---------------------+
      |      IP Address     |
      |    (IPv4 or IPv6)   |
      +---------------------+
                 |
                 v
      +---------------------+
      | Convert to 16 Bytes |
      +---------------------+
                 |
                 v
      +---------------------+
      |   AES128 Encrypt    |
      |   (Single Block)    |
      +---------------------+
                 |
                 v
      +---------------------+
      |    16-Byte Output   |
      +---------------------+
                 |
                 v
      +---------------------+
      | Convert to IP Format|
      +---------------------+
]]></artwork>
        </section>
      </section>
      <section anchor="format-preservation">
        <name>Format Preservation</name>
        <ul spacing="normal">
          <li>
            <t>If the 16‑byte ciphertext begins with an IPv4‑mapped prefix, it <strong>MUST</strong> be rendered as a dotted‑decimal IPv4 address.</t>
          </li>
          <li>
            <t>Otherwise, it is interpreted as an IPv6 address.</t>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <t><strong>Note:</strong>
To ensure IPv4 format preservation, implementers <strong>MUST</strong> consider using cycle‑walking, a 32-bit random permutation, or an FPE mode if required.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="non-deterministic-encryption">
      <name>Non‑Deterministic Encryption</name>
      <t>Non‑deterministic encryption leverages a tweakable block cipher together with a random tweak. For implementation details, see <xref target="pseudocode-and-examples"/>.</t>
      <section anchor="encryption-process">
        <name>Encryption Process</name>
        <t>The encryption process for non-deterministic modes consists of the following steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Generate a random tweak using a cryptographically secure random number generator</t>
          </li>
          <li>
            <t>Convert the IP address to its 16-byte representation</t>
          </li>
          <li>
            <t>Encrypt the 16-byte representation using the key and the tweak</t>
          </li>
          <li>
            <t>Concatenate the tweak with the encrypted output to form the final ciphertext</t>
          </li>
        </ol>
        <t>The tweak is not considered secret and is included in the ciphertext. This allows the same tweak to be used for decryption.</t>
      </section>
      <section anchor="decryption-process">
        <name>Decryption Process</name>
        <t>The decryption process consists of the following steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Split the ciphertext into the tweak and the encrypted IP</t>
          </li>
          <li>
            <t>Decrypt the encrypted IP using the key and the tweak</t>
          </li>
          <li>
            <t>Convert the resulting 16-byte representation back to an IP address</t>
          </li>
        </ol>
        <t>Although the tweak is generated uniformly at random (and thus may occasionally collide per birthday bounds), such collisions are benign when they occur with different inputs. An <tt>(input, tweak)</tt> collision reveals that the same input was encrypted with the same tweak but does not disclose the input’s value.</t>
        <t>The usage limits discussed below apply per cryptographic key; rotating keys can extend secure usage beyond these bounds.</t>
      </section>
      <section anchor="output-format-and-encoding">
        <name>Output Format and Encoding</name>
        <t>The output of non-deterministic encryption is binary data.</t>
        <t>For applications that require text representation (e.g., logging, JSON encoding, or text-based protocols), the binary output MUST be encoded. Common encoding options include hexadecimal and Base64.</t>
        <t>The choice of encoding is application-specific and outside the scope of this specification. However, implementations SHOULD document their chosen encoding method clearly.</t>
      </section>
      <section anchor="ipcrypt-nd-and-ipcrypt-ndx">
        <name>ipcrypt-nd and ipcrypt-ndx</name>
        <t>This document defines two instantiations:</t>
        <ul spacing="normal">
          <li>
            <t><strong><tt>ipcrypt-nd</tt>:</strong> Uses the KIASU‑BC tweakable block cipher with an 8‑byte (64‑bit) tweak.
See <xref target="KIASU-BC"/> for details.</t>
          </li>
          <li>
            <t><strong><tt>ipcrypt-ndx</tt>:</strong> Uses the AES‑XTS tweakable block cipher with a 16‑byte (128‑bit) tweak.
See <xref target="XTS-AES"/> for background. Since only a single block is encrypted, only the first tweak
needs to be computed, avoiding the need for a full key schedule.</t>
          </li>
        </ul>
        <t>In both cases, if a tweak is generated randomly, it <strong>MUST be uniformly random</strong>. Reusing the same randomly generated tweak on different inputs is acceptable from a confidentiality standpoint.</t>
        <t>For test vectors, see <xref target="ipcrypt-nd-test-vectors"/> and <xref target="ipcrypt-ndx-test-vectors"/>.</t>
      </section>
      <section anchor="ipcrypt-nd">
        <name>ipcrypt-nd (KIASU‑BC)</name>
        <ul spacing="normal">
          <li>
            <t><strong>Tweak:</strong> 8 bytes (64 bits).</t>
          </li>
          <li>
            <t><strong>Output:</strong> 24 bytes total (8‑byte tweak concatenated with a 16‑byte ciphertext).</t>
          </li>
        </ul>
        <section anchor="usage-considerations">
          <name>Usage Considerations</name>
          <t>Random sampling of an 8‑byte tweak yields an expected collision for a specific tweak value after about 2^(64/2) = 2^32 operations.</t>
          <t>If an <tt>(input, tweak)</tt> collision occurs, it indicates that the same input was processed with that tweak without revealing the input’s value. These collision bounds apply per cryptographic key; by rotating keys regularly, secure usage can be extended well beyond these bounds.</t>
          <t>Ultimately, the effective security is determined by the underlying block cipher’s strength (≈2^128 for AES‑128).</t>
        </section>
      </section>
      <section anchor="ipcrypt-ndx">
        <name>ipcrypt-ndx (AES‑XTS)</name>
        <ul spacing="normal">
          <li>
            <t><strong>Tweak:</strong> 16 bytes (128 bits).</t>
          </li>
          <li>
            <t><strong>Output:</strong> 32 bytes total (16‑byte tweak concatenated with a 16‑byte ciphertext).</t>
          </li>
          <li>
            <t><strong>Optimization:</strong> Since only a single block is encrypted, only the first tweak needs to be
computed, avoiding the need for a full key schedule.</t>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <t><strong>Technical Note:</strong>
For a single block of AES-XTS, the key is split into two halves (K1, K2). The tweak is
first encrypted using AES128 with K2 to produce an encrypted tweak (ET). The IP address
is then encrypted as: AES128(IP ⊕ ET, K1) ⊕ ET (where ⊕ denotes the bitwise XOR operation).
This construction provides the security properties of XTS while only requiring two AES
operations per block.</t>
          </li>
        </ul>
        <sourcecode type="pseudocode"><![CDATA[
function AES_XTS_encrypt(key, tweak, block):
    // Split the key into two halves
    K1, K2 = split_key(key)

    // Encrypt the tweak with the second half of the key
    ET = AES128_encrypt(K2, tweak)

    // Encrypt the block: AES128(block ⊕ ET, K1) ⊕ ET
    return AES128_encrypt(K1, block ⊕ ET) ⊕ ET
]]></sourcecode>
        <section anchor="usage-considerations-1">
          <name>Usage Considerations</name>
          <t>Independent sampling of a 16‑byte tweak results in an expected collision after about 2^(128/2) = 2^64 operations.</t>
          <t>As with ipcrypt-nd, an <tt>(input, tweak)</tt> collision reveals repetition without compromising the input value.</t>
          <t>These limits are per key; regular key rotation further extends secure usage. The effective security is governed by the strength of AES‑128 (approximately 2^128 operations).</t>
        </section>
      </section>
      <section anchor="comparison-of-modes">
        <name>Comparison of Modes</name>
        <ul spacing="normal">
          <li>
            <t><strong>Deterministic (<tt>ipcrypt-deterministic</tt>):</strong>
Produces a 16‑byte output; preserves format but reveals repeated inputs.</t>
          </li>
          <li>
            <t><strong>Non‑Deterministic:</strong>
            </t>
            <ul spacing="normal">
              <li>
                <t><strong><tt>ipcrypt-nd</tt> (KIASU‑BC):</strong> Produces a 24‑byte output using an 8‑byte tweak; <tt>(input, tweak)</tt> collisions reveal repeated inputs (with the same tweak) but not their values.</t>
              </li>
              <li>
                <t><strong><tt>ipcrypt-ndx</tt> (AES‑XTS):</strong> Produces a 32‑byte output using a 16‑byte tweak; supports higher secure operation counts per key. Since only a single block is encrypted, it avoids the need for a full key schedule.</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>For a detailed discussion of the security properties of each mode, see:</t>
      <ul spacing="normal">
        <li>
          <t><xref target="deterministic-encryption"/> for deterministic mode security considerations</t>
        </li>
        <li>
          <t><xref target="ipcrypt-nd"/> and <xref target="ipcrypt-ndx"/> for non-deterministic mode security considerations</t>
        </li>
        <li>
          <t><strong>Deterministic Mode:</strong>
AES‑128’s permutation behavior ensures distinct inputs yield distinct outputs; however, repeated inputs result in identical ciphertexts, thereby revealing repetition.</t>
        </li>
        <li>
          <t><strong>Non‑Deterministic Mode:</strong>
The inclusion of a random tweak ensures that encrypting the same input generally produces different outputs.  </t>
          <t>
In cases where an <tt>(input, tweak)</tt> collision occurs, an attacker learns only that the same input was processed with that tweak, not the value of the input itself. Security is determined by the underlying block cipher (≈2^128 for AES‑128) on a per-key basis.  </t>
          <t>
Key rotation is recommended to extend secure usage beyond the per-key collision bounds.</t>
        </li>
      </ul>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document does not require any IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="FIPS-197" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197.pdf">
          <front>
            <title>Advanced Encryption Standard (AES)</title>
            <author initials="" surname="NIST">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date year="2001" month="November" day="26"/>
          </front>
          <seriesInfo name="FIPS" value="PUB 197"/>
        </reference>
        <reference anchor="NIST-SP-800-38G" target="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38G.pdf">
          <front>
            <title>Recommendation for Block Cipher Modes of Operation: Methods for Format-Preserving Encryption</title>
            <author initials="" surname="NIST">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date year="2016" month="March"/>
          </front>
          <seriesInfo name="NIST" value="SP 800-38G"/>
        </reference>
        <reference anchor="RFC6973">
          <front>
            <title>Privacy Considerations for Internet Protocols</title>
            <author fullname="A. Cooper" initials="A." surname="Cooper"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="B. Aboba" initials="B." surname="Aboba"/>
            <author fullname="J. Peterson" initials="J." surname="Peterson"/>
            <author fullname="J. Morris" initials="J." surname="Morris"/>
            <author fullname="M. Hansen" initials="M." surname="Hansen"/>
            <author fullname="R. Smith" initials="R." surname="Smith"/>
            <date month="July" year="2013"/>
            <abstract>
              <t>This document offers guidance for developing privacy considerations for inclusion in protocol specifications. It aims to make designers, implementers, and users of Internet protocols aware of privacy-related design choices. It suggests that whether any individual RFC warrants a specific privacy considerations section will depend on the document's content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6973"/>
          <seriesInfo name="DOI" value="10.17487/RFC6973"/>
        </reference>
        <reference anchor="RFC7258">
          <front>
            <title>Pervasive Monitoring Is an Attack</title>
            <author fullname="S. Farrell" initials="S." surname="Farrell"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="May" year="2014"/>
            <abstract>
              <t>Pervasive monitoring is a technical attack that should be mitigated in the design of IETF protocols, where possible.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="188"/>
          <seriesInfo name="RFC" value="7258"/>
          <seriesInfo name="DOI" value="10.17487/RFC7258"/>
        </reference>
        <reference anchor="RFC4086">
          <front>
            <title>Randomness Requirements for Security</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="J. Schiller" initials="J." surname="Schiller"/>
            <author fullname="S. Crocker" initials="S." surname="Crocker"/>
            <date month="June" year="2005"/>
            <abstract>
              <t>Security systems are built on strong cryptographic algorithms that foil pattern analysis attempts. However, the security of these systems is dependent on generating secret quantities for passwords, cryptographic keys, and similar quantities. The use of pseudo-random processes to generate secret quantities can result in pseudo-security. A sophisticated attacker may find it easier to reproduce the environment that produced the secret quantities and to search the resulting small set of possibilities than to locate the quantities in the whole of the potential number space.</t>
              <t>Choosing random quantities to foil a resourceful and motivated adversary is surprisingly difficult. This document points out many pitfalls in using poor entropy sources or traditional pseudo-random number generation techniques for generating such quantities. It recommends the use of truly random hardware techniques and shows that the existing hardware on many systems can be used for this purpose. It provides suggestions to ameliorate the problem when a hardware solution is not available, and it gives examples of how large such quantities need to be for some applications. 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="106"/>
          <seriesInfo name="RFC" value="4086"/>
          <seriesInfo name="DOI" value="10.17487/RFC4086"/>
        </reference>
        <reference anchor="RFC7624">
          <front>
            <title>Confidentiality in the Face of Pervasive Surveillance: A Threat Model and Problem Statement</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="B. Schneier" initials="B." surname="Schneier"/>
            <author fullname="C. Jennings" initials="C." surname="Jennings"/>
            <author fullname="T. Hardie" initials="T." surname="Hardie"/>
            <author fullname="B. Trammell" initials="B." surname="Trammell"/>
            <author fullname="C. Huitema" initials="C." surname="Huitema"/>
            <author fullname="D. Borkmann" initials="D." surname="Borkmann"/>
            <date month="August" year="2015"/>
            <abstract>
              <t>Since the initial revelations of pervasive surveillance in 2013, several classes of attacks on Internet communications have been discovered. In this document, we develop a threat model that describes these attacks on Internet confidentiality. We assume an attacker that is interested in undetected, indiscriminate eavesdropping. The threat model is based on published, verified attacks.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7624"/>
          <seriesInfo name="DOI" value="10.17487/RFC7624"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC4291">
          <front>
            <title>IP Version 6 Addressing Architecture</title>
            <author fullname="R. Hinden" initials="R." surname="Hinden"/>
            <author fullname="S. Deering" initials="S." surname="Deering"/>
            <date month="February" year="2006"/>
            <abstract>
              <t>This specification defines the addressing architecture of the IP Version 6 (IPv6) protocol. The document includes the IPv6 addressing model, text representations of IPv6 addresses, definition of IPv6 unicast addresses, anycast addresses, and multicast addresses, and an IPv6 node's required addresses.</t>
              <t>This document obsoletes RFC 3513, "IP Version 6 Addressing Architecture". [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4291"/>
          <seriesInfo name="DOI" value="10.17487/RFC4291"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="LRW2002" target="https://www.cs.berkeley.edu/~daw/papers/tweak-crypto02.pdf">
          <front>
            <title>Tweakable Block Ciphers</title>
            <author initials="M." surname="Liskov">
              <organization/>
            </author>
            <author initials="R." surname="Rivest">
              <organization/>
            </author>
            <author initials="D." surname="Wagner">
              <organization/>
            </author>
            <date year="2002"/>
          </front>
          <seriesInfo name="Fast Software Encryption" value="2002"/>
        </reference>
        <reference anchor="IEEE-P1619" target="https://standards.ieee.org/ieee/1619/2041/">
          <front>
            <title>IEEE Standard for Cryptographic Protection of Data on Block-Oriented Storage Devices</title>
            <author initials="" surname="IEEE">
              <organization/>
            </author>
            <date year="2007" month="December" day="18"/>
          </front>
          <seriesInfo name="IEEE" value="1619-2007"/>
        </reference>
        <reference anchor="BRW2005" target="https://www.cs.ucdavis.edu/~rogaway/papers/subset.pdf">
          <front>
            <title>Format-Preserving Encryption</title>
            <author initials="M." surname="Bellare">
              <organization/>
            </author>
            <author initials="P." surname="Rogaway">
              <organization/>
            </author>
            <author initials="D." surname="Wagner">
              <organization/>
            </author>
            <date year="2005"/>
          </front>
          <seriesInfo name="CRYPTO" value="2005"/>
        </reference>
        <reference anchor="KIASU-BC" target="https://eprint.iacr.org/2014/831">
          <front>
            <title>Tweaks and Keys for Block Ciphers: the TWEAKEY Framework</title>
            <author initials="J." surname="Jean">
              <organization/>
            </author>
            <author initials="I." surname="Nikolić">
              <organization/>
            </author>
            <author initials="T." surname="Peyrin">
              <organization/>
            </author>
            <date year="2014"/>
          </front>
          <seriesInfo name="Cryptology ePrint Archive" value="Paper 2014/831"/>
        </reference>
        <reference anchor="XTS-AES">
          <front>
            <title>The XTS-AES Mode for Disk Encryption</title>
            <author initials="J." surname="Black">
              <organization/>
            </author>
            <author initials="E." surname="Dawson">
              <organization/>
            </author>
            <author initials="S." surname="Gueron">
              <organization/>
            </author>
            <author initials="P." surname="Rogaway">
              <organization/>
            </author>
            <date year="2010"/>
          </front>
          <seriesInfo name="IEEE" value="1619-2007"/>
        </reference>
        <reference anchor="IPCrypt2" target="https://github.com/jedisct1/ipcrypt2">
          <front>
            <title>ipcrypt2: IP address encryption/obfuscation tool</title>
            <author initials="F." surname="Denis">
              <organization/>
            </author>
            <date year="2025"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 384?>

<section anchor="pseudocode-and-examples">
      <name>Pseudocode and Examples</name>
      <t>This appendix provides detailed pseudocode for key operations described in this document. For a visual representation of these operations, see <xref target="diagrams"/>.</t>
      <section anchor="ipv4-address-conversion">
        <name>IPv4 Address Conversion</name>
        <t>For a diagram of this conversion process, see <xref target="ipv4-address-conversion-diagram"/>.</t>
        <sourcecode type="pseudocode"><![CDATA[
function IPv4To16Bytes(ipv4_address):
    // Split the IPv4 address into its octets
    parts = ipv4_address.split(".")
    if length(parts) != 4:
         raise Error("Invalid IPv4 address")
    // Create a 16-byte array with the IPv4-mapped prefix
    bytes16 = [0x00] * 10         // 10 bytes of 0x00
    bytes16.append(0xFF)          // 11th byte: 0xFF
    bytes16.append(0xFF)          // 12th byte: 0xFF
    // Append each octet (converted to an 8-bit integer)
    for part in parts:
         bytes16.append(int(part))
    return bytes16
]]></sourcecode>
        <t><em>Example:</em> For <tt>"192.0.2.1"</tt>, the function returns</t>
        <artwork><![CDATA[
[00, 00, 00, 00, 00, 00, 00, 00, 00, 00, FF, FF, C0, 00, 02, 01]
]]></artwork>
      </section>
      <section anchor="ipv6-address-conversion">
        <name>IPv6 Address Conversion</name>
        <sourcecode type="pseudocode"><![CDATA[
function IPv6To16Bytes(ipv6_address):
    // Parse the IPv6 address into eight 16-bit words.
    words = parseIPv6(ipv6_address)  // Expands shorthand notation and returns 8 words
    bytes16 = []
    for word in words:
         high_byte = (word >> 8) & 0xFF
         low_byte = word & 0xFF
         bytes16.append(high_byte)
         bytes16.append(low_byte)
    return bytes16
]]></sourcecode>
        <t><em>Example:</em> For <tt>"2001:0db8:85a3:0000:0000:8a2e:0370:7334"</tt>, the output is the corresponding 16‑byte sequence.</t>
      </section>
      <section anchor="conversion-from-a-16-byte-array-to-an-ip-address">
        <name>Conversion from a 16-Byte Array to an IP Address</name>
        <sourcecode type="pseudocode"><![CDATA[
function Bytes16ToIP(bytes16):
    if length(bytes16) != 16:
         raise Error("Invalid byte array")
    // Check for the IPv4-mapped prefix
    if bytes16[0:10] == [0x00]*10 and bytes16[10] == 0xFF and bytes16[11] == 0xFF:
         ipv4_parts = []
         for i from 12 to 15:
             ipv4_parts.append(str(bytes16[i]))
         ipv4_address = join(ipv4_parts, ".")
         return ipv4_address
    else:
         words = []
         for i from 0 to 15 step 2:
             word = (bytes16[i] << 8) | bytes16[i+1]
             words.append(format(word, "x"))
         ipv6_address = join(words, ":")
         return ipv6_address
]]></sourcecode>
      </section>
      <section anchor="deterministic-encryption-ipcrypt-deterministic">
        <name>Deterministic Encryption (ipcrypt-deterministic)</name>
        <sourcecode type="pseudocode"><![CDATA[
function ipcrypt_deterministic(ip_address, key):
    bytes16 = convertTo16Bytes(ip_address)
    ciphertext = AES128_encrypt(key, bytes16)
    encrypted_ip = Bytes16ToIP(ciphertext)
    return encrypted_ip
]]></sourcecode>
      </section>
      <section anchor="nondeterministic-encryption-using-kiasubc-ipcrypt-nd">
        <name>Non‑Deterministic Encryption using KIASU‑BC (ipcrypt-nd)</name>
        <sourcecode type="pseudocode"><![CDATA[
function ipcrypt_nd_encrypt(ip_address, key):
    // Step 1: Generate random tweak
    tweak = random_bytes(8)  // MUST be uniformly random

    // Step 2: Convert IP to 16-byte representation
    bytes16 = convertTo16Bytes(ip_address)

    // Step 3: Encrypt using key and tweak
    ciphertext = KIASU_BC_encrypt(key, tweak, bytes16)

    // Step 4: Concatenate tweak and ciphertext
    result = concatenate(tweak, ciphertext)  // 8 bytes || 16 bytes = 24 bytes total
    return result

function ipcrypt_nd_decrypt(ciphertext, key):
    // Step 1: Split ciphertext into tweak and encrypted IP
    tweak = ciphertext[0:8]  // First 8 bytes
    encrypted_ip = ciphertext[8:24]  // Remaining 16 bytes

    // Step 2: Decrypt using key and tweak
    bytes16 = KIASU_BC_decrypt(key, tweak, encrypted_ip)

    // Step 3: Convert back to IP address
    ip_address = Bytes16ToIP(bytes16)
    return ip_address
]]></sourcecode>
      </section>
      <section anchor="nondeterministic-encryption-using-aesxts-ipcrypt-ndx">
        <name>Non‑Deterministic Encryption using AES‑XTS (ipcrypt-ndx)</name>
        <sourcecode type="pseudocode"><![CDATA[
function ipcrypt_ndx_encrypt(ip_address, key):
    // Step 1: Generate random tweak
    tweak = random_bytes(16)  // MUST be uniformly random

    // Step 2: Convert IP to 16-byte representation
    bytes16 = convertTo16Bytes(ip_address)

    // Step 3: Encrypt using key and tweak
    // Since only a single block is encrypted, only the first tweak needs to be computed
    ciphertext = AES_XTS_encrypt(key, tweak, bytes16)

    // Step 4: Concatenate tweak and ciphertext
    result = concatenate(tweak, ciphertext)  // 16 bytes || 16 bytes = 32 bytes total
    return result

function ipcrypt_ndx_decrypt(ciphertext, key):
    // Step 1: Split ciphertext into tweak and encrypted IP
    tweak = ciphertext[0:16]  // First 16 bytes
    encrypted_ip = ciphertext[16:32]  // Remaining 16 bytes

    // Step 2: Decrypt using key and tweak
    bytes16 = AES_XTS_decrypt(key, tweak, encrypted_ip)

    // Step 3: Convert back to IP address
    ip_address = Bytes16ToIP(bytes16)
    return ip_address
]]></sourcecode>
      </section>
    </section>
    <section anchor="diagrams">
      <name>Diagrams</name>
      <t>This appendix provides visual representations of the key operations described in this document. For implementation details, see <xref target="pseudocode-and-examples"/>.</t>
      <section anchor="ipv4-address-conversion-diagram">
        <name>IPv4 Address Conversion Diagram</name>
        <artwork><![CDATA[
       IPv4: 192.0.2.1
           |
           v
  Octets:  C0  00  02  01
           |
           v
   16-Byte Array:
[00 00 00 00 00 00 00 00 00 00 | FF FF | C0 00 02 01]
]]></artwork>
      </section>
      <section anchor="deterministic-encryption-flow">
        <name>Deterministic Encryption Flow</name>
        <artwork><![CDATA[
            IP Address
                |
                v
       [Convert to 16 Bytes]
                |
                v
    [AES128 Single-Block Encrypt]
                |
                v
       16-Byte Ciphertext
                |
                v
     [Convert to IP Format]
                |
                v
       Encrypted IP Address
]]></artwork>
      </section>
      <section anchor="nondeterministic-encryption-flow-ipcrypt-nd">
        <name>Non‑Deterministic Encryption Flow (ipcrypt-nd)</name>
        <artwork><![CDATA[
              IP Address
                  |
                  v
      [Convert to 16 Bytes] ---> 16-Byte Representation
                  |
                  v
    [Generate Random 8-Byte Tweak]
                  |
                  v
       [KIASU-BC Tweakable Encrypt]
                  |
                  v
          16-Byte Ciphertext
                  |
                  v
    [Concatenate Tweak || Ciphertext]
                  |
                  v
       24-Byte Output (ipcrypt-nd)
]]></artwork>
      </section>
      <section anchor="nondeterministic-encryption-flow-ipcrypt-ndx">
        <name>Non‑Deterministic Encryption Flow (ipcrypt-ndx)</name>
        <artwork><![CDATA[
              IP Address
                  |
                  v
      [Convert to 16 Bytes] ---> 16-Byte Representation
                  |
                  v
    [Generate Random 16-Byte Tweak]
                  |
                  v
       [AES-XTS Tweakable Encrypt]
                  |
                  v
          16-Byte Ciphertext
                  |
                  v
    [Concatenate Tweak || Ciphertext]
                  |
                  v
       32-Byte Output (ipcrypt-ndx)
]]></artwork>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This appendix provides test vectors for all three variants of ipcrypt. Each test vector includes the key, input IP address, and encrypted output. For non-deterministic variants (ipcrypt-nd and ipcrypt-ndx), the tweak value is also included.</t>
      <section anchor="ipcrypt-deterministic-test-vectors">
        <name>ipcrypt-deterministic Test Vectors</name>
        <artwork><![CDATA[
# Test vector 1
Key:          0123456789abcdeffedcba9876543210
Input IP:     0.0.0.0
Encrypted IP: bde9:6789:d353:824c:d7c6:f58a:6bd2:26eb

# Test vector 2
Key:          1032547698badcfeefcdab8967452301
Input IP:     255.255.255.255
Encrypted IP: aed2:92f6:ea23:58c3:48fd:8b8:74e8:45d8

# Test vector 3
Key:          2b7e151628aed2a6abf7158809cf4f3c
Input IP:     192.0.2.1
Encrypted IP: 1dbd:c1b9:fff1:7586:7d0b:67b4:e76e:4777
]]></artwork>
      </section>
      <section anchor="ipcrypt-nd-test-vectors">
        <name>ipcrypt-nd Test Vectors</name>
        <artwork><![CDATA[
# Test vector 1
Key:          0123456789abcdeffedcba9876543210
Input IP:     0.0.0.0
Tweak:        08e0c289bff23b7c
Output:       08e0c289bff23b7cb349aadfe3bcef56221c384c7c217b16

# Test vector 2
Key:          1032547698badcfeefcdab8967452301
Input IP:     192.0.2.1
Tweak:        21bd1834bc088cd2
Output:       21bd1834bc088cd2e5e1fe55f95876e639faae2594a0caad

# Test vector 3
Key:          2b7e151628aed2a6abf7158809cf4f3c
Input IP:     2001:db8::1
Tweak:        b4ecbe30b70898d7
Output:       b4ecbe30b70898d7553ac8974d1b4250eafc4b0aa1f80c96
]]></artwork>
      </section>
      <section anchor="ipcrypt-ndx-test-vectors">
        <name>ipcrypt-ndx Test Vectors</name>
        <artwork><![CDATA[
# Test vector 1
Key:          0123456789abcdeffedcba98765432101032547698badcfeefcdab8967452301
Input IP:     0.0.0.0
Tweak:        21bd1834bc088cd2b4ecbe30b70898d7
Output:       21bd1834bc088cd2b4ecbe30b70898d782db0d4125fdace61db35b8339f20ee5

# Test vector 2
Key:          1032547698badcfeefcdab89674523010123456789abcdeffedcba9876543210
Input IP:     192.0.2.1
Tweak:        08e0c289bff23b7cb4ecbe30b70898d7
Output:       08e0c289bff23b7cb4ecbe30b70898d7766a533392a69edf1ad0d3ce362ba98a

# Test vector 3
Key:          2b7e151628aed2a6abf7158809cf4f3c3c4fcf098815f7aba6d2ae2816157e2b
Input IP:     2001:db8::1
Tweak:        21bd1834bc088cd2b4ecbe30b70898d7
Output:       21bd1834bc088cd2b4ecbe30b70898d76089c7e05ae30c2d10ca149870a263e4
]]></artwork>
        <t>Note: For non-deterministic variants (ipcrypt-nd and ipcrypt-ndx), the tweak values shown are examples. In practice, tweaks MUST be randomly generated for each encryption operation.</t>
        <t>Implementations SHOULD verify their correctness against these test vectors before deployment.</t>
      </section>
    </section>
    <section anchor="implementing-kiasu-bc">
      <name>Implementing KIASU-BC</name>
      <t>This appendix provides a detailed guide for implementing the KIASU-BC tweakable block cipher. KIASU-BC is based on AES-128 with modifications to incorporate a tweak. For more information about the security properties of KIASU-BC, see <xref target="KIASU-BC"/>.</t>
      <section anchor="overview">
        <name>Overview</name>
        <t>KIASU-BC extends AES-128 by incorporating an 8-byte tweak into each round. The tweak is padded to 16 bytes and XORed with the round key at each round of the cipher. This construction is used in the <tt>ipcrypt-nd</tt> instantiation.</t>
      </section>
      <section anchor="tweak-padding">
        <name>Tweak Padding</name>
        <t>The 8-byte tweak is padded to 16 bytes using the following method:</t>
        <ol spacing="normal" type="1"><li>
            <t>Split the 8-byte tweak into four 2-byte pairs</t>
          </li>
          <li>
            <t>Place each 2-byte pair at the start of each 4-byte group</t>
          </li>
          <li>
            <t>Fill the remaining 2 bytes of each group with zeros</t>
          </li>
        </ol>
        <t>Example:</t>
        <artwork><![CDATA[
8-byte tweak:    [T0 T1 T2 T3 T4 T5 T6 T7]
16-byte padded:  [T0 T1 00 00 T2 T3 00 00 T4 T5 00 00 T6 T7 00 00]
]]></artwork>
      </section>
      <section anchor="round-structure">
        <name>Round Structure</name>
        <t>Each round of KIASU-BC consists of the following standard AES operations:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>SubBytes:</strong> Apply the AES S-box to each byte of the state</t>
          </li>
          <li>
            <t><strong>ShiftRows:</strong> Rotate each row of the state matrix</t>
          </li>
          <li>
            <t><strong>MixColumns:</strong> Mix the columns of the state matrix (except in the final round)</t>
          </li>
          <li>
            <t><strong>AddRoundKey:</strong> XOR the state with the round key and padded tweak</t>
          </li>
        </ol>
        <t>For details about these operations, see <xref target="FIPS-197"/>.</t>
      </section>
      <section anchor="key-schedule">
        <name>Key Schedule</name>
        <t>The key schedule follows the standard AES-128 key expansion:</t>
        <ol spacing="normal" type="1"><li>
            <t>The initial key is expanded into 11 round keys</t>
          </li>
          <li>
            <t>Each round key is XORed with the padded tweak before use</t>
          </li>
          <li>
            <t>The first round key is used in the initial AddRoundKey operation</t>
          </li>
        </ol>
      </section>
      <section anchor="implementation-steps">
        <name>Implementation Steps</name>
        <ol spacing="normal" type="1"><li>
            <t><strong>Key Expansion:</strong>
            </t>
            <ul spacing="normal">
              <li>
                <t>Expand the 16-byte key into 11 round keys using the standard AES key schedule</t>
              </li>
              <li>
                <t>Each round key is 16 bytes</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Tweak Processing:</strong>
            </t>
            <ul spacing="normal">
              <li>
                <t>Pad the 8-byte tweak to 16 bytes as described above</t>
              </li>
              <li>
                <t>XOR the padded tweak with each round key before use</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Encryption Process:</strong>
            </t>
            <ul spacing="normal">
              <li>
                <t>Perform initial AddRoundKey with the first round key</t>
              </li>
              <li>
                <t>For rounds 1-9:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>SubBytes</t>
                  </li>
                  <li>
                    <t>ShiftRows</t>
                  </li>
                  <li>
                    <t>MixColumns</t>
                  </li>
                  <li>
                    <t>AddRoundKey (with tweaked round key)</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>For round 10 (final round):
                </t>
                <ul spacing="normal">
                  <li>
                    <t>SubBytes</t>
                  </li>
                  <li>
                    <t>ShiftRows</t>
                  </li>
                  <li>
                    <t>AddRoundKey (with tweaked round key)</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
        </ol>
      </section>
      <section anchor="example-implementation">
        <name>Example Implementation</name>
        <t>The following pseudocode illustrates the core operations of KIASU-BC:</t>
        <sourcecode type="pseudocode"><![CDATA[
function pad_tweak(tweak):
    // Input: 8-byte tweak
    // Output: 16-byte padded tweak
    padded = [0] * 16
    for i in range(0, 8, 2):
        padded[i*2] = tweak[i]
        padded[i*2+1] = tweak[i+1]
    return padded

function kiasu_bc_encrypt(key, tweak, plaintext):
    // Input: 16-byte key, 8-byte tweak, 16-byte plaintext
    // Output: 16-byte ciphertext

    // Expand key and pad tweak
    round_keys = expand_key(key)
    padded_tweak = pad_tweak(tweak)

    // Initial round
    state = plaintext
    state = add_round_key(state, round_keys[0] ^ padded_tweak)

    // Main rounds
    for round in range(1, 10):
        state = sub_bytes(state)
        state = shift_rows(state)
        if round < 9:
            state = mix_columns(state)
        state = add_round_key(state, round_keys[round] ^ padded_tweak)

    // Final round
    state = sub_bytes(state)
    state = shift_rows(state)
    state = add_round_key(state, round_keys[10] ^ padded_tweak)

    return state
]]></sourcecode>
      </section>
    </section>
    <section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author gratefully acknowledges the contributions and insightful comments from members of the IETF independent stream community and the broader cryptographic community that have helped shape this specification.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
F0cW7h2+piPCXtFs4a5k0ys1Wv8Pc1b1s7l1AAA=

-->

</rfc>
