<?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-02" 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-02"/>
    <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 124?>

<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 136?>

<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.</t>
      <t>This work addresses concerns raised in <xref target="RFC7624"/> regarding confidentiality in the face of pervasive surveillance. 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> (see <xref target="SKINNY"/>)</t>
        </li>
        <li>
          <t><strong>DEOXYS-BC</strong> (see <xref target="DEOXYS-BC"/>)</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="ipcrypt-deterministic">
        <name>ipcrypt-deterministic</name>
        <t>The <tt>ipcrypt-deterministic</tt> 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>
        <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 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. 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="concrete-instantiations">
        <name>Concrete Instantiations</name>
        <t>This document defines two concrete 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 anchor="ipcrypt-nd">
          <name>ipcrypt-nd (KIASU‑BC)</name>
          <t>The <tt>ipcrypt-nd</tt> instantiation uses the KIASU‑BC tweakable block cipher with an 8‑byte (64‑bit) tweak. The output is 24 bytes total, consisting of an 8‑byte tweak concatenated with a 16‑byte ciphertext.</t>
          <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. 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.</t>
          <t>These collision bounds apply per cryptographic key. By rotating keys regularly, secure usage can be extended well beyond these bounds. Ultimately, the effective security is determined by the underlying block cipher’s strength (≈2^128 for AES‑128).</t>
        </section>
        <section anchor="ipcrypt-ndx">
          <name>ipcrypt-ndx (AES‑XTS)</name>
          <t>The <tt>ipcrypt-ndx</tt> instantiation uses the AES‑XTS tweakable block cipher with a 16‑byte (128‑bit) tweak. The output is 32 bytes total, consisting of a 16‑byte tweak concatenated with a 16‑byte ciphertext.</t>
          <t>Since only a single block is encrypted, only the first tweak needs to be computed, avoiding the need for a full key schedule. 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. These limits are per key, and regular key rotation further extends secure usage. The effective security is governed by the strength of AES‑128 (approximately 2^128 operations).</t>
          <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>
        <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>
        </ul>
        <section anchor="deterministic-mode-security">
          <name>Deterministic Mode Security</name>
          <t>A permutation ensures distinct inputs yield distinct outputs. However, repeated inputs result in identical ciphertexts, thereby revealing repetition.</t>
          <t>This property makes deterministic encryption suitable for applications where format preservation is required, but linkability of repeated inputs is acceptable.</t>
        </section>
        <section anchor="non-deterministic-mode-security">
          <name>Non-Deterministic Mode Security</name>
          <t>The inclusion of a random tweak ensures that encrypting the same input generally produces different outputs. 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.</t>
          <t>Security is determined by the underlying block cipher (≈2^128 for AES‑128) on a per-key basis. Key rotation is recommended to extend secure usage beyond the per-key collision bounds.</t>
        </section>
        <section anchor="implementation-security">
          <name>Implementation Security</name>
          <t>Implementations MUST ensure that:</t>
          <ol spacing="normal" type="1"><li>
              <t>Keys are generated using a cryptographically secure random number generator</t>
            </li>
            <li>
              <t>Tweak values are uniformly random for non-deterministic modes</t>
            </li>
            <li>
              <t>Side-channel attacks are mitigated through constant-time operations</t>
            </li>
            <li>
              <t>Error handling does not leak sensitive information</t>
            </li>
          </ol>
        </section>
      </section>
    </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="DEOXYS-BC" target="https://eprint.iacr.org/2014/427">
          <front>
            <title>Deoxys-BC: A Highly Secure Tweakable Block Cipher</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/427"/>
        </reference>
        <reference anchor="SKINNY" target="https://eprint.iacr.org/2016/660">
          <front>
            <title>The SKINNY Family of Block Ciphers and its Low-Latency Variant MANTIS</title>
            <author initials="C." surname="Beierle">
              <organization/>
            </author>
            <author initials="A." surname="Biryukov">
              <organization/>
            </author>
            <author initials="L." surname="Perrin">
              <organization/>
            </author>
            <author initials="A." surname="Udovenko">
              <organization/>
            </author>
            <author initials="V." surname="Velichkov">
              <organization/>
            </author>
            <author initials="Q." surname="Wang">
              <organization/>
            </author>
            <date year="2016"/>
          </front>
          <seriesInfo name="CRYPTO" value="2016"/>
        </reference>
        <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 408?>

<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="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="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 tweaked 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="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="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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

-->

</rfc>
