<?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.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-denis-ipcrypt-14" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="IP Address Encryption and Obfuscation">Methods for IP Address Encryption and Obfuscation</title>
    <seriesInfo name="Internet-Draft" value="draft-denis-ipcrypt-14"/>
    <author initials="C." surname="Barber" fullname="Christopher Barber">
      <organization>Trim</organization>
      <address>
        <email>cbarbernash@gmail.com</email>
      </address>
    </author>
    <author initials="F." surname="Denis" fullname="Frank Denis">
      <organization>Fastly Inc.</organization>
      <address>
        <email>fde@00f.net</email>
      </address>
    </author>
    <date year="2026"/>
    <keyword>privacy</keyword>
    <keyword>format-preserving encryption</keyword>
    <keyword>prefix-preserving encryption</keyword>
    <keyword>tweakable block cipher</keyword>
    <abstract>
      <?line 153?>

<t>This document specifies secure, efficient methods for Internet Protocol (IP) address encryption and obfuscation in privacy-preserving storage, logging, and analytics. Unlike truncation, which destroys data irreversibly, these methods are reversible with the encryption key while providing strong privacy guarantees.</t>
      <t>Four modes are defined: <tt>ipcrypt-deterministic</tt> (format-preserving, IP-address output), <tt>ipcrypt-pfx</tt> (prefix-preserving, native address size), <tt>ipcrypt-nd</tt> and <tt>ipcrypt-ndx</tt> (non-deterministic with random tweaks). All support high-performance processing at network speeds and produce interoperable results across implementations.</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 159?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Internet Protocol (IP) addresses are personally identifiable information requiring protection, yet common anonymization approaches have fundamental limitations. Truncation (zeroing parts of addresses) irreversibly destroys data while providing variable privacy levels; a /24 mask may obscure one user or thousands depending on network allocation. Hashing produces non-reversible outputs unsuitable for operational tasks such as abuse investigation. Ad-hoc encryption schemes often lack rigorous security analysis and have limited interoperability.</t>
      <t>This document addresses these deficiencies by specifying secure, efficient, and interoperable methods for IP address encryption and obfuscation.</t>
      <t>This specification addresses concerns raised in <xref target="RFC7624"/> regarding confidentiality when sharing data with third parties. Unlike existing practices that obscure addresses, these methods provide well-defined security properties, which are discussed throughout this document and summarized in <xref target="security-considerations"/>.</t>
      <section anchor="use-cases-and-motivations">
        <name>Use Cases and Motivations</name>
        <t>Organizations handling IP addresses require mechanisms to protect user privacy while maintaining operational capabilities. Generic encryption systems expand data unpredictably, lack compatibility with network tools, and are not designed for high-volume processing. The specialized methods in this specification address these requirements:</t>
        <ul spacing="normal">
          <li>
            <t>Efficiency and Compactness: All variants operate on 128 bits, achieving single-block encryption speed required for network-rate processing. Non-deterministic variants add only 8-16 bytes of tweak overhead.</t>
          </li>
          <li>
            <t>High Usage Limits: Non-deterministic variants safely handle massive volumes: approximately 4 billion operations for <tt>ipcrypt-nd</tt> and 18 quintillion for <tt>ipcrypt-ndx</tt> per key, without degrading security. Generic encryption often requires complex key rotation schemes at lower thresholds.</t>
          </li>
          <li>
            <t>Format Preservation: The <tt>ipcrypt-deterministic</tt> and <tt>ipcrypt-pfx</tt> variants produce valid IP addresses rather than arbitrary ciphertext, enabling encrypted addresses to pass through existing network infrastructure, monitoring tools, and databases without modification. The <tt>ipcrypt-pfx</tt> variant uniquely preserves network prefix relationships while maintaining the original address type and size, enabling network-level analytics while protecting individual address identity (see <xref target="format-preservation-and-limitations"/>).</t>
          </li>
          <li>
            <t>Interoperability: All conforming implementations produce identical results, enabling data exchange between different systems, vendors, and programming languages.</t>
          </li>
        </ul>
        <t>These specialized encryption methods enable several use cases:</t>
        <ul spacing="normal">
          <li>
            <t>Privacy Protection: Prevents exposure of sensitive user information to third parties in logs, analytics data, and network measurements (<xref target="RFC6973"/>). The key holder retains decryption capability.</t>
          </li>
          <li>
            <t>Correlation Attack Resistance: Non-deterministic variants leverage random tweaks to hide patterns and enhance confidentiality (see <xref target="non-deterministic-encryption"/>).</t>
          </li>
          <li>
            <t>Privacy-Preserving Analytics: Encrypted IP addresses can be used directly for counting unique clients, rate limiting, or deduplication without revealing original values. This addresses the anonymization requirements for DNS query data sharing outlined in <xref target="RSSAC040"/>. The <tt>ipcrypt-pfx</tt> variant preserves network prefixes for network-level analytics, while other methods scramble network hierarchy.</t>
          </li>
          <li>
            <t>Third-Party Integration: Encrypted IP addresses can serve as privacy-preserving identifiers when interacting with untrusted services, cloud providers, or external platforms.</t>
          </li>
        </ul>
        <t>The following examples demonstrate how the same IP addresses transform under each method:</t>
        <ul spacing="normal">
          <li>
            <t>Format-preserving: Valid IP addresses, same input always produces same output:</t>
          </li>
        </ul>
        <artwork><![CDATA[
192.168.1.1   -> d1e9:518:d5bc:4487:51c6:c51f:44ed:e9f6
192.168.1.254 -> fd7e:f70f:44d7:cdb2:2992:95a1:e692:7696
192.168.1.254 -> fd7e:f70f:44d7:cdb2:2992:95a1:e692:7696  # Repeated
]]></artwork>
        <ul spacing="normal">
          <li>
            <t>Prefix-preserving: Maintains network structure, same prefix when IPs share prefix:</t>
          </li>
        </ul>
        <artwork><![CDATA[
192.168.1.1   -> 251.81.131.124
192.168.1.254 -> 251.81.131.159       # Prefix is preserved
172.16.69.42  -> 165.228.146.177
]]></artwork>
        <ul spacing="normal">
          <li>
            <t>Non-deterministic: Larger output, different each time:</t>
          </li>
        </ul>
        <artwork><![CDATA[
192.168.1.1   -> f0ea0bbd...03aa9fcb
192.168.1.254 -> 620b58d8...2ff8086f
192.168.1.254 -> 35fc2338...25abed5d  # Same input, different outputs
]]></artwork>
        <t>These methods achieve optimal efficiency for their security goals: each variant uses the minimum ciphertext expansion and fewest cryptographic operations needed for its properties (format preservation, prefix preservation, or correlation resistance). <xref target="IPCRYPT"/>.</t>
        <t>For implementation guidelines, see <xref target="implementation-details"/>.</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>IP Address: An IPv4 or IPv6 address as defined in <xref target="RFC4291"/>.</t>
        </li>
        <li>
          <t>IPv4-mapped IPv6 Address: An IPv6 address format (<tt>::FFFF:a.b.c.d</tt>) used to represent IPv4 addresses within the IPv6 address space, enabling uniform processing of both address types.</t>
        </li>
        <li>
          <t>16-Byte Representation: A fixed-length representation used for both IPv4 (via IPv4-mapped IPv6) and IPv6 addresses.</t>
        </li>
        <li>
          <t>Block Cipher: A deterministic cryptographic algorithm that encrypts fixed-size blocks of data (128 bits with AES) using a secret key.</t>
        </li>
        <li>
          <t>Permutation: A bijective function where each distinct input maps to a unique output, ensuring reversibility.</t>
        </li>
        <li>
          <t>Pseudorandom Function (PRF): A deterministic function that produces output computationally indistinguishable from random values.</t>
        </li>
        <li>
          <t>Tweakable Block Cipher (TBC): A block cipher that accepts an additional non-secret parameter (tweak) along with the key and plaintext, allowing domain separation without changing keys <xref target="LRW2002"/>.</t>
        </li>
        <li>
          <t>Exclusive OR (XOR): A bitwise operation whose output is 1 when its two input bits differ and 0 otherwise.</t>
        </li>
        <li>
          <t>Tweak: A non-secret, additional input to a tweakable block cipher that further randomizes the output.</t>
        </li>
        <li>
          <t>Deterministic Encryption: Encryption that always produces the same ciphertext for a given input and key.</t>
        </li>
        <li>
          <t>Non-Deterministic Encryption: Encryption that produces different ciphertexts for the same input due to the inclusion of a randomly sampled tweak.</t>
        </li>
        <li>
          <t>Prefix-Preserving Encryption: An encryption mode where IP addresses from the same network produce ciphertexts that share a common encrypted prefix, maintaining network relationships while obscuring actual network identities.</t>
        </li>
        <li>
          <t>Birthday Bound: The point at which collisions become statistically likely in a random sampling process, approximately 2<sup>(n/2)</sup> operations for n-bit values.</t>
        </li>
        <li>
          <t>(Input, Tweak) Collision: 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 used by <tt>ipcrypt-deterministic</tt>, <tt>ipcrypt-nd</tt>, and <tt>ipcrypt-ndx</tt>. The <tt>ipcrypt-pfx</tt> method differs by maintaining native address sizes—4 bytes for IPv4 and 16 bytes for IPv6—to preserve network structure (see <xref target="prefix-preserving-encryption"/>).</t>
      <section anchor="converting-to-a-16-byte-representation">
        <name>Converting to a 16-Byte Representation</name>
        <section anchor="ipv6-addresses">
          <name>IPv6 Addresses</name>
          <t>IPv6 addresses (128 bits) are converted directly using network byte order 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>
          <t>Note on representation equivalence: For all <tt>ipcrypt</tt> variants, encrypting an IPv4 address and encrypting its IPv4-mapped IPv6 form (<tt>::FFFF:a.b.c.d</tt>) produce the same encrypted output.</t>
          <t>This behavior is intentional: in the intended use cases, IP addresses function as identifiers, and producing a single encrypted identifier for the same endpoint across representations avoids ambiguity.</t>
        </section>
      </section>
      <section anchor="converting-from-a-16-byte-representation-to-an-ip-address">
        <name>Converting from a 16-Byte Representation to an IP Address</name>
        <t>Conversion algorithm:</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 0x00 followed by 0xFF, 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>
      </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>128-bit Block Cipher Construction:
          </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>128-bit Tweakable Block Cipher (TBC) Construction:
          </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 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>SKINNY (see <xref target="SKINNY"/>)</t>
        </li>
        <li>
          <t>DEOXYS-TBC (see <xref target="DEOXYS-TBC"/>)</t>
        </li>
        <li>
          <t>KIASU-BC (see <xref target="implementing-kiasu-bc"/> for implementation details)</t>
        </li>
        <li>
          <t>AES-XTS (see <xref target="ipcrypt-ndx"/> for usage)</t>
        </li>
      </ul>
      <t>Implementers MUST choose a cipher that 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, producing the same ciphertext for the same input and key.</t>
      <t>Deterministic encryption is appropriate when:</t>
      <ul spacing="normal">
        <li>
          <t>Duplicate IP addresses need to be detected in encrypted form (e.g., for rate limiting)</t>
        </li>
        <li>
          <t>Storage space is critical (produces only 16 bytes output)</t>
        </li>
        <li>
          <t>Format preservation is required (output remains a valid IP address)</t>
        </li>
        <li>
          <t>Correlation of the same address across records is acceptable</t>
        </li>
      </ul>
      <t>All instantiations (<tt>ipcrypt-deterministic</tt>, <tt>ipcrypt-pfx</tt>, <tt>ipcrypt-nd</tt>, and <tt>ipcrypt-ndx</tt>) are invertible. For non-deterministic modes, the tweak must be preserved along with the ciphertext to enable decryption.</t>
      <t>Implementation details are provided in <xref target="implementation-details"/>.</t>
      <section anchor="ipcrypt-deterministic">
        <name>ipcrypt-deterministic</name>
        <t>The <tt>ipcrypt-deterministic</tt> instantiation employs AES-128 in a single-block operation. The key MUST be 16 bytes (128 bits). As AES-128 is a permutation, each distinct input maps to a unique ciphertext, producing a valid IP address representation.</t>
        <t>Test vectors are provided in <xref target="ipcrypt-deterministic-test-vectors"/>.</t>
        <artwork><![CDATA[
      +---------------------+
      |      IP Address     |
      |    (IPv4 or IPv6)   |
      +---------------------+
                 |
                 v
      +---------------------+
      | Convert to 16 Bytes |
      +---------------------+
                 |
                 v
      +---------------------+
      |   AES-128 Encrypt   |
      |   (Single Block)    |
      +---------------------+
                 |
                 v
      +---------------------+
      |    16-Byte Output   |
      +---------------------+
                 |
                 v
      +---------------------+
      | Convert to IP Format|
      +---------------------+
]]></artwork>
      </section>
      <section anchor="format-preservation-and-limitations">
        <name>Format Preservation and Limitations</name>
        <section anchor="network-hierarchy-preservation">
          <name>Network Hierarchy Preservation</name>
          <t>Most encryption methods in this specification scramble network hierarchy, with the notable exception of <tt>ipcrypt-pfx</tt>:</t>
          <ul spacing="normal">
            <li>
              <t><tt>ipcrypt-deterministic</tt>, <tt>ipcrypt-nd</tt>, and <tt>ipcrypt-ndx</tt>: These methods completely scramble IPv4 and IPv6 prefixes in the encrypted output. Addresses from the same subnet appear unrelated after encryption, and geographic or topological proximity cannot be inferred.</t>
            </li>
            <li>
              <t><tt>ipcrypt-pfx</tt>: This method preserves network prefix relationships in the encrypted output. Addresses from the same subnet share a common encrypted prefix, enabling network-level analytics while protecting the actual network identity. The encrypted prefixes themselves are cryptographically transformed and unrecognizable without the key.</t>
            </li>
          </ul>
        </section>
        <section anchor="format-preservation-without-prefix-preservation">
          <name>Format Preservation Without Prefix Preservation</name>
          <t>For methods other than <tt>ipcrypt-pfx</tt>, IPv4 addresses are typically encrypted as IPv6 addresses.</t>
          <t>IPv4 format preservation without prefix preservation (maintaining IPv4 addresses as IPv4 in deterministic or non-deterministic modes) is not specified in this document and is generally discouraged due to the limited 32-bit address space, which significantly reduces encryption security.</t>
          <t>If IPv4 format preservation is absolutely required despite the security limitations, implementers SHOULD implement a format-preserving encryption (FPE) mode <xref target="BRW2005"/>, such as the FF1 algorithm specified in <xref target="NIST-SP-800-38G"/> or FAST <xref target="FAST"/>.</t>
        </section>
        <section anchor="preserving-metadata-for-analytics">
          <name>Preserving Metadata for Analytics</name>
          <t>Organizations requiring network metadata for analytics have two options:</t>
          <ol spacing="normal" type="1"><li>
              <t>Use <tt>ipcrypt-pfx</tt> to preserve network structure within the encrypted addresses, enabling network-level analysis while keeping actual network identities encrypted.</t>
            </li>
            <li>
              <t>For non-prefix-preserving modes (<tt>ipcrypt-deterministic</tt>, <tt>ipcrypt-nd</tt>, <tt>ipcrypt-ndx</tt>), extract and store metadata (geographic location, autonomous system number (ASN), network classification) as separate fields before encryption.</t>
            </li>
          </ol>
          <t>Both approaches provide advantages over IP address truncation, which provides inconsistent protection and irreversibly destroys data.</t>
          <t>When auxiliary information such as AS number and geographical location is required, it SHOULD be stored as metadata at the time of logging. Performing these mappings later may yield different results as network allocations and routing information change over time. This recommendation applies to all encryption modes: even with <tt>ipcrypt-pfx</tt>, the preserved network structure does not retain these additional attributes.</t>
        </section>
      </section>
    </section>
    <section anchor="prefix-preserving-encryption">
      <name>Prefix-Preserving Encryption</name>
      <t>Prefix-preserving encryption maintains network structure in encrypted IP addresses. Addresses from the same network produce encrypted addresses that share a common prefix, enabling privacy-preserving network analytics while preventing identification of specific networks or users.</t>
      <t>Unlike standard encryption that completely scrambles addresses, prefix-preserving encryption enables network operators to:</t>
      <ul spacing="normal">
        <li>
          <t>Detect traffic patterns from common networks without knowing which specific networks</t>
        </li>
        <li>
          <t>Perform network-level rate limiting on encrypted addresses</t>
        </li>
        <li>
          <t>Implement distributed denial-of-service (DDoS) mitigation while preserving user privacy</t>
        </li>
        <li>
          <t>Analyze network topology without accessing raw IP addresses</t>
        </li>
      </ul>
      <t>This mode balances privacy with analytical capability: individual addresses remain encrypted and network identities are cryptographically transformed, but network relationships remain visible through shared encrypted prefixes.</t>
      <section anchor="prefix-preserving-construction">
        <name>Prefix-Preserving Construction</name>
        <t>The encryption process achieves prefix preservation through a bit-by-bit transformation that maintains consistency across addresses with shared prefixes. For any two IP addresses sharing the first N bits, their encrypted forms also share the first N bits. This property holds recursively for all prefix lengths.</t>
        <t>The algorithm operates as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>Process each bit position sequentially from most significant to least significant</t>
          </li>
          <li>
            <t>For each bit position, extract the prefix (all bits processed so far) from the original IP address</t>
          </li>
          <li>
            <t>Apply a pseudorandom function (PRF) that takes the padded prefix as input to generate a cipher bit</t>
          </li>
          <li>
            <t>XOR the cipher bit with the original bit at the current position to produce the encrypted bit</t>
          </li>
          <li>
            <t>The encrypted bit depends deterministically on the prefix from the original IP, ensuring identical prefixes always produce identical encrypted prefixes</t>
          </li>
        </ol>
        <t>This construction ensures:</t>
        <ul spacing="normal">
          <li>
            <t>Identical prefixes always produce identical transformations for subsequent bits</t>
          </li>
          <li>
            <t>Different prefixes produce cryptographically distinct transformations</t>
          </li>
          <li>
            <t>The transformation is deterministic yet cryptographically secure</t>
          </li>
          <li>
            <t>Network relationships are preserved while actual network identities remain encrypted</t>
          </li>
        </ul>
        <t>The algorithm maintains native address sizes: IPv4 addresses remain 4 bytes (32 bits) and IPv6 addresses remain 16 bytes (128 bits).</t>
      </section>
      <section anchor="concrete-instantiation-ipcrypt-pfx">
        <name>Concrete Instantiation: ipcrypt-pfx</name>
        <t>The <tt>ipcrypt-pfx</tt> instantiation implements prefix-preserving encryption using a pseudorandom function based on the XOR of two independently keyed AES-128 encryptions.</t>
        <section anchor="encryption-process">
          <name>Encryption Process</name>
          <t>The encryption uses a pseudorandom function based on the XOR of two independently keyed AES-128 encryptions. The 32-byte key is split into two independent 16-byte AES-128 keys (<tt>K1</tt> and <tt>K2</tt>).</t>
          <t>For each bit position (processing from the most significant bit (MSB) to the least significant bit (LSB)):</t>
          <ol spacing="normal" type="1"><li>
              <t>Prefix Padding: The prefix (all bits processed so far from the original IP address) is padded to 128 bits using the format <tt>zeros || 1 || prefix_bits</tt>, where:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The prefix bits are extracted from the most significant bits of the original IP address</t>
                </li>
                <li>
                  <t>A single <tt>1</tt> bit serves as a delimiter at position <tt>prefix_len_bits</tt></t>
                </li>
                <li>
                  <t>The prefix bits are placed immediately after the delimiter, from high to low positions</t>
                </li>
                <li>
                  <t>For an empty prefix (processing the first bit), this produces a block with only a single <tt>1</tt> bit at position 0</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Pseudorandom Function Computation: The padded prefix is encrypted independently with both <tt>K1</tt> and <tt>K2</tt>, producing two 128-bit outputs (<tt>e1</tt> and <tt>e2</tt>). The final PRF output is computed as <tt>e = e1 ⊕ e2</tt>.</t>
            </li>
            <li>
              <t>Bit Encryption: The least significant bit is extracted from the PRF output as the cipher bit, which is then XORed with the original bit at the current position to produce the encrypted bit.</t>
            </li>
          </ol>
          <t>Complete pseudocode implementation is provided in <xref target="prefix-preserving-encryption-ipcrypt-pfx"/>.</t>
        </section>
        <section anchor="key-requirements">
          <name>Key Requirements</name>
          <t>The two 16-byte halves of the 32-byte key (<tt>K1</tt> and <tt>K2</tt>) MUST NOT be identical. Using identical values for <tt>K1</tt> and <tt>K2</tt> (e.g., repeating the same 16 bytes twice) causes the XOR operation to cancel out, returning the original IP address unchanged.</t>
          <t>When the 32-byte key is randomly sampled from a uniform distribution, the probability that <tt>K1 = K2</tt> is statistically negligible.</t>
        </section>
        <section anchor="security-properties">
          <name>Security Properties</name>
          <t>The <tt>ipcrypt-pfx</tt> construction improves upon earlier designs such as CRYPTO-Pan through enhanced cryptographic security:</t>
          <ul spacing="normal">
            <li>
              <t>Sum-of-Permutations: The XOR of two independently keyed AES-128 permutations provides 128-bit PRF security <xref target="SUM-OF-PRPS"/><xref target="PATARIN-2008"/><xref target="PATARIN-H-COEFFICIENTS"/>, with distinguishing advantage growing on the order of q/2<sup>128</sup> for q queries. This construction ensures robust security even for massive-scale deployments.</t>
            </li>
            <li>
              <t>Prefix-based context isolation: shift-and-append updates make each bit depend on the full prefix history and ensure fresh PRF input each round.</t>
            </li>
            <li>
              <t>Fixed network-order representation and explicit bit indexing avoid endianness pitfalls.</t>
            </li>
          </ul>
          <t>Note: Prefix-preserving encryption intentionally reveals network structure to enable analytics. Organizations requiring complete address obfuscation should use non-prefix-preserving modes.</t>
        </section>
        <section anchor="implementation-considerations">
          <name>Implementation Considerations</name>
          <t>Key implementation characteristics:</t>
          <ul spacing="normal">
            <li>
              <t>Computational Requirements:
              </t>
              <ul spacing="normal">
                <li>
                  <t>IPv4: 64 AES-128 operations per address (2 encryptions × 32 bits)</t>
                </li>
                <li>
                  <t>IPv6: 256 AES-128 operations per address (2 encryptions × 128 bits)</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Performance Optimizations:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Caching encrypted prefix values (<tt>e1</tt> and <tt>e2</tt>) significantly improves performance for addresses sharing common prefixes</t>
                </li>
                <li>
                  <t>The encryption algorithm is inherently parallelizable since AES computations for different bit positions are independent</t>
                </li>
                <li>
                  <t>The padded prefix computation can be optimized by maintaining state across iterations: instead of recomputing the padded prefix from scratch for each bit position, implementations can shift the previous padded prefix left by one bit and insert the next input bit.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="non-deterministic-encryption">
      <name>Non-Deterministic Encryption</name>
      <t>Non-deterministic encryption enhances privacy by ensuring that the same IP address produces different ciphertexts each time it is encrypted, preventing correlation attacks that plague deterministic schemes. This is achieved through tweakable block ciphers that incorporate random values called tweaks.</t>
      <t>Non-deterministic encryption is appropriate when:</t>
      <ul spacing="normal">
        <li>
          <t>Preventing correlation of the same IP address across records is critical</t>
        </li>
        <li>
          <t>Storage can accommodate the additional tweak data (8-16 bytes)</t>
        </li>
        <li>
          <t>Stronger privacy guarantees than deterministic encryption provides are required</t>
        </li>
        <li>
          <t>Processing the same address multiple times without revealing repetition patterns</t>
        </li>
      </ul>
      <t>Implementation details are provided in <xref target="implementation-details"/>.</t>
      <section anchor="encryption-process-1">
        <name>Encryption Process</name>
        <t>Encryption process for non-deterministic modes:</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, enabling its use for decryption.</t>
      </section>
      <section anchor="decryption-process">
        <name>Decryption Process</name>
        <t>Decryption process:</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, occasional collisions may occur according to birthday bounds. 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. The usage limits apply per cryptographic key; rotating keys extends 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 text representation, the binary output MUST be encoded (e.g., hexadecimal or Base64). Implementations SHOULD document their chosen encoding method.</t>
      </section>
      <section anchor="concrete-instantiations">
        <name>Concrete Instantiations</name>
        <t>This document defines two concrete instantiations:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ipcrypt-nd</tt>: 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><tt>ipcrypt-ndx</tt>: Uses the AES-XTS tweakable block cipher with a 16-byte (128-bit) tweak. See <xref target="IEEE-P1619"/> for background.</t>
          </li>
        </ul>
        <t>In both cases, if a tweak is generated randomly, it MUST be uniformly random. Reusing the same randomly generated tweak on different inputs is acceptable from a confidentiality standpoint.</t>
        <t>Test vectors are provided in <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. Implementation details are provided in <xref target="implementing-kiasu-bc"/>. 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 after about 2<sup>32</sup> operations (approximately 4 billion). An <tt>(input, tweak)</tt> collision indicates repetition without revealing the input’s value.</t>
          <t>These collision bounds apply per cryptographic key. Regular key rotation can extend secure usage beyond these bounds. The effective security is determined by the underlying block cipher’s strength.</t>
          <t>Test vectors are provided in <xref target="ipcrypt-nd-test-vectors"/>.</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, the construction is equivalent to AES-XEX, and identical to AES-XTS at block index 0, where the tweak is not multiplied by the primitive element α.</t>
          <t>For single-block AES-XTS, independent sampling of a 16-byte tweak results in an expected collision after about 2<sup>64</sup> operations (approximately 18 quintillion).</t>
          <t>Similar to <tt>ipcrypt-nd</tt>, collisions reveal repetition without compromising the input value. These limits are per key, and regular key rotation extends secure usage. The effective security is governed by AES-128 strength (approximately 2<sup>128</sup> operations).</t>
        </section>
        <section anchor="comparison-of-modes">
          <name>Comparison of Modes</name>
          <t>Mode selection depends on specific privacy requirements and operational constraints:</t>
          <ul spacing="normal">
            <li>
              <t>Deterministic (<tt>ipcrypt-deterministic</tt>):
              </t>
              <ul spacing="normal">
                <li>
                  <t>Output size: 16 bytes (most compact)</t>
                </li>
                <li>
                  <t>Privacy: Same IP always produces same ciphertext (allows correlation)</t>
                </li>
                <li>
                  <t>Use case: When duplicate identification is needed or when format preservation is critical</t>
                </li>
                <li>
                  <t>Performance: Fastest (single AES operation)</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Prefix-Preserving (<tt>ipcrypt-pfx</tt>):
              </t>
              <ul spacing="normal">
                <li>
                  <t>Output size: 4 bytes for IPv4, 16 bytes for IPv6 (maintains native sizes)</t>
                </li>
                <li>
                  <t>Privacy: Preserves network prefix relationships while encrypting actual network identities</t>
                </li>
                <li>
                  <t>Use case: Network analytics, traffic pattern analysis, subnet monitoring, DDoS mitigation</t>
                </li>
                <li>
                  <t>Performance: Bit-by-bit processing (64 AES operations for IPv4, 256 for IPv6), fully parallelizable</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Non-Deterministic <tt>ipcrypt-nd</tt> (KIASU-BC):
              </t>
              <ul spacing="normal">
                <li>
                  <t>Output size: 24 bytes (16-byte ciphertext + 8-byte tweak)</t>
                </li>
                <li>
                  <t>Privacy: Same IP produces different ciphertexts (prevents most correlation)</t>
                </li>
                <li>
                  <t>Use case: General privacy protection with reasonable storage overhead</t>
                </li>
                <li>
                  <t>Collision resistance: Approximately 4 billion operations per key</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Non-Deterministic <tt>ipcrypt-ndx</tt> (AES-XTS):
              </t>
              <ul spacing="normal">
                <li>
                  <t>Output size: 32 bytes (16-byte ciphertext + 16-byte tweak)</t>
                </li>
                <li>
                  <t>Privacy: Same IP produces different ciphertexts (prevents correlation)</t>
                </li>
                <li>
                  <t>Use case: Maximum privacy protection when storage permits</t>
                </li>
                <li>
                  <t>Collision resistance: Approximately 18 quintillion operations per key</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="alternatives-to-random-tweaks">
        <name>Alternatives to Random Tweaks</name>
        <t>While this specification recommends uniformly random tweaks for non-deterministic encryption, alternative approaches may be considered:</t>
        <ul spacing="normal">
          <li>
            <t>Monotonic Counter: A counter could be used as a tweak, but this is difficult to maintain in distributed systems. If the counter is not encrypted and the tweakable block cipher is not secure against related-tweak attacks, this could enable correlation attacks.</t>
          </li>
          <li>
            <t>Universally unique identifiers (UUIDs), such as UUIDv6 or UUIDv7, could be used as tweaks; however, these would reveal the original timestamp of the logged IP addresses, which may not be desirable from a privacy perspective.</t>
          </li>
        </ul>
        <t>Although the birthday bound presents considerations with random tweaks, random tweaks remain the recommended approach for practical deployments.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The methods specified in this document provide strong confidentiality guarantees but explicitly do not provide integrity protection:</t>
      <t>These methods provide protection against:</t>
      <ul spacing="normal">
        <li>
          <t>Unauthorized parties learning the original IP addresses (without the key)</t>
        </li>
        <li>
          <t>Statistical analysis revealing patterns in network traffic (non-deterministic modes)</t>
        </li>
        <li>
          <t>Brute-force attacks on the address space (128-bit security level)</t>
        </li>
      </ul>
      <t>These methods do not provide protection against:</t>
      <ul spacing="normal">
        <li>
          <t>Active attackers modifying, reordering, or removing encrypted addresses</t>
        </li>
        <li>
          <t>Authorized key holders decrypting addresses (by design)</t>
        </li>
        <li>
          <t>Traffic analysis based on volume and timing (metadata)</t>
        </li>
      </ul>
      <t>Applications requiring integrity protection must additionally employ authentication mechanisms such as HMAC, authenticated encryption modes, or digital signatures over the encrypted data.</t>
      <section anchor="deterministic-mode-security">
        <name>Deterministic Mode Security</name>
        <t>A permutation ensures distinct inputs yield distinct outputs. Repeated inputs result in identical ciphertexts, revealing repetition.</t>
        <t>This makes deterministic encryption suitable for applications where format preservation is required and linkability 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. An <tt>(input, tweak)</tt> collision reveals only that the same input was processed with that tweak, not the input’s value.</t>
        <t>Security is determined by the underlying block cipher (≈2<sup>128</sup> 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 anchor="key-derivation-for-multiple-variants">
        <name>Key Derivation for Multiple Variants</name>
        <t>When using multiple encryption variants within the same deployment, implementations MUST derive separate keys for each variant to prevent cross-mode correlations. The RECOMMENDED approach uses the HMAC-based key derivation function (HKDF) <xref target="RFC5869"/> to derive per-variant subkeys from a single root key. The pseudorandom key (PRK) is used as follows:</t>
        <ul spacing="normal">
          <li>
            <t><tt>K_deterministic = HKDF-Expand(PRK, "ipcrypt-deterministic", 16)</tt></t>
          </li>
          <li>
            <t><tt>K_pfx = HKDF-Expand(PRK, "ipcrypt-pfx", 32)</tt></t>
          </li>
          <li>
            <t><tt>K_nd = HKDF-Expand(PRK, "ipcrypt-nd", 16)</tt></t>
          </li>
          <li>
            <t><tt>K_ndx = HKDF-Expand(PRK, "ipcrypt-ndx", 32)</tt></t>
          </li>
        </ul>
        <t>Where:</t>
        <ul spacing="normal">
          <li>
            <t><tt>PRK = HKDF-Extract(salt, K_root)</tt> is a pseudorandom key derived from the root key</t>
          </li>
          <li>
            <t><tt>K_root</tt> is a uniformly random root key</t>
          </li>
          <li>
            <t><tt>salt</tt> is either empty or a fixed random value for the application</t>
          </li>
          <li>
            <t>The strings <tt>"ipcrypt-deterministic"</tt>, etc. are used as the <tt>info</tt> parameter for domain separation</t>
          </li>
          <li>
            <t>The third parameter specifies the output length in bytes (16 for single AES keys, 32 for <tt>ipcrypt-pfx</tt> and <tt>ipcrypt-ndx</tt>)</t>
          </li>
        </ul>
        <t>This ensures that:</t>
        <ol spacing="normal" type="1"><li>
            <t>Using the same root key across different variants does not enable cross-variant attacks</t>
          </li>
          <li>
            <t>Key management is simplified by requiring only a single root key</t>
          </li>
          <li>
            <t>Each variant operates with cryptographically independent keys</t>
          </li>
        </ol>
      </section>
      <section anchor="key-management-considerations">
        <name>Key Management Considerations</name>
        <t>Implementers MUST ensure:</t>
        <ol spacing="normal" type="1"><li>
            <t>Keys are generated using cryptographically secure random number generators (see <xref target="RFC4086"/>)</t>
          </li>
          <li>
            <t>Keys are stored securely and access-controlled appropriately for the deployment environment</t>
          </li>
          <li>
            <t>Key rotation policies are established based on usage volume and security requirements</t>
          </li>
          <li>
            <t>Key compromise procedures are defined and tested</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="implementation-details">
      <name>Implementation Details</name>
      <t>This section provides pseudocode and implementation guidance for the operations described in this document.</t>
      <t>In the pseudocode throughout this document, the notation “for i from x to y” indicates iteration starting at x (inclusive) and ending before y (exclusive). For example, “for i from 0 to 4” processes values 0, 1, 2, and 3, but not 4.</t>
      <section anchor="diagrams">
        <name>Visual Diagrams</name>
        <t>The following diagrams illustrate the processes described in this specification.</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
   [AES-128 Single-Block Encrypt]
                |
                v
       16-Byte Ciphertext
                |
                v
     [Convert to IP Format]
                |
                v
       Encrypted IP Address
]]></artwork>
        </section>
        <section anchor="prefix-preserving-encryption-flow-ipcrypt-pfx">
          <name>Prefix-Preserving Encryption Flow (ipcrypt-pfx)</name>
          <artwork><![CDATA[
            IP Address
                |
                v
       [Convert to 16 Bytes]
                |
                v
  [Split 32-byte key into K1, K2]
                |
                v
  [For each bit position (MSB to LSB):
  - Pad current prefix to 128 bits:
    zeros || 1 || prefix_bits
  - e1 = AES(K1, padded_prefix)
  - e2 = AES(K2, padded_prefix)
  - e = e1 ⊕ e2
  - Extract LSB from e as cipher_bit
  - XOR cipher_bit with original bit
  - Set result bit in encrypted output
  - Add original bit to prefix for next iteration]
                |
                v
       Encrypted IP Address
  (4 bytes for IPv4, 16 bytes for IPv6)
]]></artwork>
        </section>
        <section anchor="non-deterministic-encryption-flow-ipcrypt-nd">
          <name>Non-Deterministic Encryption Flow (ipcrypt-nd)</name>
          <artwork><![CDATA[
              IP Address
                  |
                  v
       [Convert to 16 Bytes]
                  |
                  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="non-deterministic-encryption-flow-ipcrypt-ndx">
          <name>Non-Deterministic Encryption Flow (ipcrypt-ndx)</name>
          <artwork><![CDATA[
              IP Address
                  |
                  v
       [Convert to 16 Bytes]
                  |
                  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="ipv4-address-conversion">
        <name>IPv4 Address Conversion</name>
        <t>See <xref target="ipv4-address-conversion-diagram"/> for a diagram of this process.</t>
        <sourcecode type="pseudocode"><![CDATA[
function ipv4_to_16_bytes(ipv4_address):
    // Parse the IPv4 address into 4 octets
    octets = parseIPv4(ipv4_address)  // Returns 4 octets
    // 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 octet in octets:
         bytes16.append(octet)
    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 ipv6_to_16_bytes(ipv6_address):
    // Parse the IPv6 address into eight 16-bit words.
    words = parseIPv6(ipv6_address)
    // Expands shorthand notation and returns eight 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 <tt>{0x20, 0x01, 0x0d, 0xb8, ..., 0x34}</tt>.</t>
      </section>
      <section anchor="conversion-from-a-16-byte-array-to-an-ip-address-string">
        <name>Conversion from a 16-Byte Array to an IP Address String</name>
        <t>This function converts a 16-byte array back to an IP address string. For IPv6 addresses, the output conforms to <xref target="RFC5952"/>. Implementers SHOULD use existing IP address formatting functions from standard libraries.</t>
        <sourcecode type="pseudocode"><![CDATA[
function bytes_16_to_ip(bytes16):
    if length(bytes16) != 16:
         raise Error("Invalid byte array")

    // Check for the IPv4-mapped prefix
    // When an IPv4-mapped IPv6 address (::ffff:x.x.x.x) is
    // detected, convert it back to IPv4 format. This is expected
    // because IPv4 addresses are represented as IPv4-mapped IPv6
    // addresses for uniform processing.
    ipv4_mapped_prefix = [
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF
    ]
    if bytes16[0..12] == ipv4_mapped_prefix:
         // Convert the 4 last bytes to an IPv4 address
         ipv4_parts = []
         for i from 12 to 16:
             ipv4_parts.append(integer_to_string(bytes16[i]))
         ipv4_address = join(ipv4_parts, ".")
         return ipv4_address
    else:
         // Convert the 16 bytes to a canonical IPv6 address
         words = []
         for i from 0 to 8:
             word = (bytes16[i*2] << 8) | bytes16[i*2+1]
             words.append(word)

         // Find longest run of consecutive zeros for compression
         best_run_start = -1
         best_run_length = 0
         run_start = -1

         for i from 0 to 8:
             if words[i] == 0:
                 if run_start == -1:
                     run_start = i
             else:
                 if run_start != -1:
                     run_length = i - run_start
                     if run_length > best_run_length:
                         best_run_start = run_start
                         best_run_length = run_length
                     run_start = -1

         // Check final run
         if run_start != -1:
             run_length = 8 - run_start
             if run_length > best_run_length:
                 best_run_start = run_start
                 best_run_length = run_length

         // Build IPv6 string with zero compression
         parts = []
         i = 0
         while i < 8:
             if best_run_length >= 2 and i == best_run_start:
                 // Insert :: for compressed zeros
                 parts.append("" if i == 0 else ":")
                 parts.append("")
                 i += best_run_length
             else:
                 parts.append(format_hex(words[i]))
                 i += 1

         return join(parts, ":")
]]></sourcecode>
      </section>
      <section anchor="deterministic-encryption-ipcrypt-deterministic">
        <name>Deterministic Encryption (ipcrypt-deterministic)</name>
        <section anchor="encryption">
          <name>Encryption</name>
          <sourcecode type="pseudocode"><![CDATA[
function ipcrypt_deterministic_encrypt(ip_address, key):
    // The key MUST be exactly 16 bytes (128 bits) in length
    if length(key) != 16:
        raise Error("Key must be 16 bytes")

    bytes16 = convert_to_16_bytes(ip_address)
    ciphertext = AES128_encrypt(key, bytes16)
    encrypted_ip = bytes_16_to_ip(ciphertext)
    return encrypted_ip
]]></sourcecode>
        </section>
        <section anchor="decryption">
          <name>Decryption</name>
          <sourcecode type="pseudocode"><![CDATA[
function ipcrypt_deterministic_decrypt(encrypted_ip, key):
    if length(key) != 16:
        raise Error("Key must be 16 bytes")

    bytes16 = convert_to_16_bytes(encrypted_ip)
    plaintext = AES128_decrypt(key, bytes16)
    original_ip = bytes_16_to_ip(plaintext)
    return original_ip
]]></sourcecode>
        </section>
      </section>
      <section anchor="prefix-preserving-encryption-ipcrypt-pfx">
        <name>Prefix-Preserving Encryption (ipcrypt-pfx)</name>
        <section anchor="encryption-1">
          <name>Encryption</name>
          <sourcecode type="pseudocode"><![CDATA[
function ipcrypt_pfx_encrypt(ip_address, key):
    // The key MUST be exactly 32 bytes (256 bits)
    if length(key) != 32:
        raise Error("Key must be 32 bytes")

    // Convert IP to 16-byte representation
    bytes16 = convert_to_16_bytes(ip_address)

    // Split the key into two AES-128 keys
    // IMPORTANT: K1 and K2 MUST be different
    K1 = key[0:16]
    K2 = key[16:32]

    // Initialize encrypted result with zeros
    encrypted = [0] * 16

    // For IPv4, start at bit 96, where the address starts.
    // The first 12 bytes already contain the IPv4-mapped prefix.
    // This provides domain separation from the first 32 bits of
    // an IPv6 address.
    if is_ipv4_mapped(bytes16):
        prefix_start = 96
        // Set up the IPv4-mapped IPv6 prefix
        encrypted[10] = 0xFF
        encrypted[11] = 0xFF
    else:
        prefix_start = 0

    // Initialize padded_prefix for the starting prefix length
    padded_prefix = pad_prefix(bytes16, prefix_start)

    // Process each bit position sequentially
    // prefix_len_bits is the number of bits processed from the MSB.
    // Its range is [prefix_start, 128), excluding 128.
    for prefix_len_bits from prefix_start to 128:
        // Compute pseudorandom function with dual AES encryption
        e1 = AES128_encrypt(K1, padded_prefix)
        e2 = AES128_encrypt(K2, padded_prefix)
        e = e1 ⊕ e2
        // The PRF output is the least significant bit of e.
        cipher_bit = get_bit(e, 0)

        // Encrypt the current bit, processing from MSB to LSB.
        // For IPv6, prefix_len_bits=0 encrypts bit 127;
        // prefix_len_bits=1 encrypts bit 126, etc.
        // For IPv4, prefix_len_bits=96 encrypts bit 31;
        // prefix_len_bits=97 encrypts bit 30, etc.
        bit_pos = 127 - prefix_len_bits
        original_bit = get_bit(bytes16, bit_pos)
        set_bit(encrypted, bit_pos, cipher_bit ^ original_bit)

        // Prepare padded_prefix for next iteration
        // Shift left by 1 bit and insert the next bit from bytes16
        padded_prefix = shift_left_one_bit(padded_prefix)
        set_bit(padded_prefix, 0, original_bit)

    // Convert back to IP format
    return bytes_16_to_ip(encrypted)
]]></sourcecode>
        </section>
        <section anchor="decryption-1">
          <name>Decryption</name>
          <sourcecode type="pseudocode"><![CDATA[
function ipcrypt_pfx_decrypt(encrypted_ip, key):
    // The key MUST be exactly 32 bytes (256 bits)
    if length(key) != 32:
        raise Error("Key must be 32 bytes")

    // Convert encrypted IP to 16-byte representation
    encrypted_bytes = convert_to_16_bytes(encrypted_ip)

    // Split the key into two AES-128 keys
    K1 = key[0:16]
    K2 = key[16:32]

    // Initialize decrypted result with zeros
    decrypted = [0] * 16

    // For IPv4, start at bit 96, where the address starts.
    if is_ipv4_mapped(encrypted_bytes):
        prefix_start = 96
        // Set up the IPv4-mapped IPv6 prefix
        decrypted[10] = 0xFF
        decrypted[11] = 0xFF
    else:
        prefix_start = 0

    // Initialize padded_prefix for the starting prefix length
    padded_prefix = pad_prefix(decrypted, prefix_start)

    // Process each bit position sequentially
    // prefix_len_bits is the number of bits processed from the MSB.
    // Its range is [prefix_start, 128), excluding 128.
    for prefix_len_bits from prefix_start to 128:
        // Compute pseudorandom function with dual AES encryption
        e1 = AES128_encrypt(K1, padded_prefix)
        e2 = AES128_encrypt(K2, padded_prefix)
        // e matches encryption because the prefix is the same.
        e = e1 ⊕ e2
        // The PRF output is the least significant bit of e.
        cipher_bit = get_bit(e, 0)

        // Decrypt the current bit, processing from MSB to LSB.
        // For IPv6, prefix_len_bits=0 decrypts bit 127;
        // prefix_len_bits=1 decrypts bit 126, etc.
        // For IPv4, prefix_len_bits=96 decrypts bit 31;
        // prefix_len_bits=97 decrypts bit 30, etc.
        bit_pos = 127 - prefix_len_bits
        encrypted_bit = get_bit(encrypted_bytes, bit_pos)
        original_bit = cipher_bit ^ encrypted_bit
        set_bit(decrypted, bit_pos, original_bit)

        // Prepare padded_prefix for next iteration
        // Shift left by 1 bit and insert the next bit from decrypted
        padded_prefix = shift_left_one_bit(padded_prefix)
        set_bit(padded_prefix, 0, original_bit)

    // Convert back to IP format
    return bytes_16_to_ip(decrypted)
]]></sourcecode>
        </section>
        <section anchor="helper-functions">
          <name>Helper Functions</name>
          <t>The following helper functions are used in the <tt>ipcrypt-pfx</tt> implementation:</t>
          <sourcecode type="pseudocode"><![CDATA[
function is_ipv4_mapped(bytes16):
    // Return true for the IPv4-mapped IPv6 prefix
    // (::ffff:0:0/96).
    ipv4_mapped_prefix = [
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF
    ]
    return bytes16[0..12] == ipv4_mapped_prefix

function get_bit(data, position):
    // Extract a bit from a 16-byte IPv6 address in network byte
    // order.
    // position: 0 = LSB of byte 15, 127 = MSB of byte 0
    // Example: position 127 refers to bit 7 (MSB) of data[0]
    // Example: position 0 refers to bit 0 (LSB) of data[15]
    byte_index = 15 - (position / 8)
    bit_index = position % 8
    return (data[byte_index] >> bit_index) & 1

function set_bit(data, position, value):
    // Set a bit in a 16-byte IPv6 address in network byte order.
    // position: 0 = LSB of byte 15, 127 = MSB of byte 0
    byte_index = 15 - (position / 8)
    bit_index = position % 8
    data[byte_index] |= ((value & 1) << bit_index)

function pad_prefix(data, prefix_len_bits):
    // Specialized for the only two cases used: 0 and 96
    // For prefix_len_bits=0, return a block with only bit 0 set
    // (position 0 = LSB of byte 15).
    // For prefix_len_bits=96, return the IPv4-mapped prefix with
    // the separator at position 96.

    if prefix_len_bits == 0:
        // For IPv6 addresses starting from bit 0
        padded_prefix = [0] * 16
        // Set bit 0 (the LSB of byte 15).
        padded_prefix[15] = 0x01
        return padded_prefix

    else if prefix_len_bits == 96:
        // All IPv4 addresses share the same IPv4-mapped prefix
        // (00...00 ffff), so always return the same value.
        padded_prefix = [0] * 16
        // Set the separator at position 96 (bit 0 of byte 3).
        padded_prefix[3] = 0x01
        padded_prefix[14] = 0xFF  // IPv4-mapped prefix
        padded_prefix[15] = 0xFF  // IPv4-mapped prefix
        return padded_prefix

    else:
        raise Error(
            "pad_prefix only supports prefix_len_bits of 0 or 96"
        )

function shift_left_one_bit(data):
    // Shift a 16-byte array one bit to the left
    // Discard the most significant bit and shift in a zero from
    // the right.
    result = [0] * 16
    carry = 0

    // Process from the least significant byte (byte 15) to the
    // most significant byte (byte 0).
    for i from 15 down to 0:
        // Shift the byte left by 1 with the previous carry.
        result[i] = ((data[i] << 1) | carry) & 0xFF
        // Extract the bit that will be carried to the next byte
        carry = (data[i] >> 7) & 1

    return result
]]></sourcecode>
        </section>
      </section>
      <section anchor="non-deterministic-encryption-using-kiasu-bc-ipcrypt-nd">
        <name>Non-Deterministic Encryption using KIASU-BC (ipcrypt-nd)</name>
        <section anchor="encryption-2">
          <name>Encryption</name>
          <sourcecode type="pseudocode"><![CDATA[
function ipcrypt_nd_encrypt(ip_address, key):
    if length(key) != 16:
        raise Error("Key must be 16 bytes")

    // Step 1: Generate random tweak (8 bytes)
    tweak = random_bytes(8)  // MUST be uniformly random

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

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

    // Step 4: Concatenate tweak and ciphertext
    // 8 bytes || 16 bytes = 24 bytes total
    result = concatenate(tweak, ciphertext)
    return result
]]></sourcecode>
        </section>
        <section anchor="decryption-2">
          <name>Decryption</name>
          <sourcecode type="pseudocode"><![CDATA[
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 = bytes_16_to_ip(bytes16)
    return ip_address
]]></sourcecode>
        </section>
      </section>
      <section anchor="non-deterministic-encryption-using-aes-xts-ipcrypt-ndx">
        <name>Non-Deterministic Encryption using AES-XTS (ipcrypt-ndx)</name>
        <section anchor="encryption-3">
          <name>Encryption</name>
          <sourcecode type="pseudocode"><![CDATA[
function ipcrypt_ndx_encrypt(ip_address, key):
    if length(key) != 32:
        raise Error("Key must be 32 bytes (two AES-128 keys)")

    // Step 1: Generate random tweak (16 bytes)
    tweak = random_bytes(16)  // MUST be uniformly random

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

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

    // Step 4: Concatenate tweak and ciphertext
    // 16 bytes || 16 bytes = 32 bytes total
    result = concatenate(tweak, ciphertext)
    return result
]]></sourcecode>
        </section>
        <section anchor="decryption-3">
          <name>Decryption</name>
          <sourcecode type="pseudocode"><![CDATA[
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 = bytes_16_to_ip(bytes16)
    return ip_address
]]></sourcecode>
        </section>
        <section anchor="helper-functions-for-aes-xts">
          <name>Helper Functions for AES-XTS</name>
          <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_encrypt(K1, block ⊕ ET) ⊕ ET
    return AES128_encrypt(K1, block ⊕ ET) ⊕ ET

function AES_XTS_decrypt(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)

    // Decrypt the block: AES128_decrypt(K1, block ⊕ ET) ⊕ ET
    return AES128_decrypt(K1, block ⊕ ET) ⊕ ET
]]></sourcecode>
        </section>
      </section>
      <section anchor="implementing-kiasu-bc">
        <name>KIASU-BC Implementation Guide</name>
        <t>This section provides a guide for implementing the KIASU-BC tweakable block cipher used in <tt>ipcrypt-nd</tt>.</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.</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>SubBytes: Apply the AES S-box to each byte of the state</t>
            </li>
            <li>
              <t>ShiftRows: Rotate each row of the state matrix</t>
            </li>
            <li>
              <t>MixColumns: Mix the columns of the state matrix (except in the final round)</t>
            </li>
            <li>
              <t>AddRoundKey: XOR the state with the round key and padded tweak</t>
            </li>
          </ol>
          <t>Details about these operations are provided in <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>Key Expansion:
              </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>Tweak Processing:
              </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>Encryption Process:
              </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, 4):
        padded[i*4]   = tweak[i*2]
        padded[i*4+1] = tweak[i*2+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)
        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>
          <t>Key and tweak sizes for each variant:</t>
          <ul spacing="normal">
            <li>
              <t><tt>ipcrypt-deterministic</tt>: Key: 16 bytes (128 bits), no tweak, Output: 16 bytes</t>
            </li>
            <li>
              <t><tt>ipcrypt-pfx</tt>: Key: 32 bytes (256 bits, split into two independent AES-128 keys), no external tweak (uses prefix as cryptographic context), Output: 4 bytes for IPv4, 16 bytes for IPv6</t>
            </li>
            <li>
              <t><tt>ipcrypt-nd</tt>: Key: 16 bytes (128 bits), Tweak: 8 bytes (64 bits), Output: 24 bytes</t>
            </li>
            <li>
              <t><tt>ipcrypt-ndx</tt>: Key: 32 bytes (256 bits, split into two AES-128 keys), Tweak: 16 bytes (128 bits), Output: 32 bytes</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="FIPS-197">
          <front>
            <title>Advanced Encryption Standard (AES)</title>
            <author>
              <organization>NIST</organization>
            </author>
            <date year="2023" month="May"/>
          </front>
          <seriesInfo name="NIST FIPS" value="197"/>
          <seriesInfo name="DOI" value="10.6028/NIST.FIPS.197-upd1"/>
        </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="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="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="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>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
        <reference anchor="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="RFC5952">
          <front>
            <title>A Recommendation for IPv6 Address Text Representation</title>
            <author fullname="S. Kawamura" initials="S." surname="Kawamura"/>
            <author fullname="M. Kawashima" initials="M." surname="Kawashima"/>
            <date month="August" year="2010"/>
            <abstract>
              <t>As IPv6 deployment increases, there will be a dramatic increase in the need to use IPv6 addresses in text. While the IPv6 address architecture in Section 2.2 of RFC 4291 describes a flexible model for text representation of an IPv6 address, this flexibility has been causing problems for operators, system engineers, and users. This document defines a canonical textual representation format. It does not define a format for internal storage, such as within an application or database. It is expected that the canonical format will be followed by humans and systems when representing IPv6 addresses as text, but all implementations must accept and be able to handle any legitimate RFC 4291 format. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5952"/>
          <seriesInfo name="DOI" value="10.17487/RFC5952"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="IPCRYPT" target="https://eprint.iacr.org/2025/1689">
          <front>
            <title>IPCrypt: Optimal, Practical Encryption of IP Addresses for Privacy and Measurement</title>
            <author initials="F." surname="Denis">
              <organization/>
            </author>
            <date year="2025" month="January" day="09"/>
          </front>
          <seriesInfo name="Cryptology ePrint Archive" value="Paper 2025/1689"/>
        </reference>
        <reference anchor="FAST" target="https://eprint.iacr.org/2021/1171.pdf">
          <front>
            <title>FAST: Format-Preserving Encryption via Shortened AES Tweakable Block Cipher</title>
            <author initials="F." surname="Betul Durak">
              <organization/>
            </author>
            <author initials="H." surname="Horst">
              <organization/>
            </author>
            <author initials="S." surname="Vaudenay">
              <organization/>
            </author>
            <date year="2021" month="September" day="14"/>
          </front>
          <seriesInfo name="Cryptology ePrint Archive" value="Paper 2021/1171"/>
        </reference>
        <reference anchor="SUM-OF-PRPS" target="https://link.springer.com/content/pdf/10.1007/3-540-45539-6_34.pdf">
          <front>
            <title>The Sum of PRPs Is a Secure PRF</title>
            <author initials="S." surname="Lucks">
              <organization/>
            </author>
            <date year="2000" month="May" day="14"/>
          </front>
          <refcontent>EUROCRYPT 2000, LNCS 1807, pp. 470-484</refcontent>
        </reference>
        <reference anchor="PATARIN-2008" target="https://link.springer.com/chapter/10.1007/978-3-540-85093-9_22">
          <front>
            <title>A Proof of Security in O(2^n) for the Xor of Two Random Permutations</title>
            <author initials="J." surname="Patarin">
              <organization/>
            </author>
            <date year="2008"/>
          </front>
          <refcontent>ICITS 2008, LNCS 5155, pp. 232-248</refcontent>
        </reference>
        <reference anchor="PATARIN-H-COEFFICIENTS" target="https://link.springer.com/chapter/10.1007/978-3-642-04159-4_21">
          <front>
            <title>The 'Coefficients H' Technique</title>
            <author initials="J." surname="Patarin">
              <organization/>
            </author>
            <date year="2009"/>
          </front>
          <refcontent>SAC 2008, LNCS 5381, pp. 328-345</refcontent>
        </reference>
        <reference anchor="DEOXYS-TBC" target="https://thomaspeyrin.github.io/web/assets/docs/papers/Jean-etal-JoC2021.pdf">
          <front>
            <title>The Deoxys AEAD Family</title>
            <author initials="J." surname="Jean">
              <organization/>
            </author>
            <author initials="I." surname="Nikolić">
              <organization/>
            </author>
            <author initials="T." surname="Peyrin">
              <organization/>
            </author>
            <author initials="Y." surname="Seurin">
              <organization/>
            </author>
            <date year="2021" month="June" day="10"/>
          </front>
          <refcontent>Journal of Cryptology 34, 31 (2021)</refcontent>
        </reference>
        <reference anchor="SKINNY" target="https://eprint.iacr.org/2016/660.pdf">
          <front>
            <title>The SKINNY Family of Block Ciphers and its Low-Latency Variant MANTIS</title>
            <author initials="C." surname="Beierle">
              <organization/>
            </author>
            <author initials="J." surname="Jean">
              <organization/>
            </author>
            <author initials="S." surname="Koelbl">
              <organization/>
            </author>
            <author initials="G." surname="Leander">
              <organization/>
            </author>
            <author initials="A." surname="Moradi">
              <organization/>
            </author>
            <author initials="T." surname="Peyrin">
              <organization/>
            </author>
            <author initials="Y." surname="Sasaki">
              <organization/>
            </author>
            <author initials="P." surname="Sasdrich">
              <organization/>
            </author>
            <author initials="S." surname="Meng Sim">
              <organization/>
            </author>
            <date year="2016" month="August" day="14"/>
          </front>
          <refcontent>CRYPTO 2016, LNCS 9815, pp. 123-153</refcontent>
        </reference>
        <reference anchor="LRW2002" target="https://people.csail.mit.edu/rivest/pubs/LRW02.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" month="August" day="18"/>
          </front>
          <refcontent>CRYPTO 2002, LNCS 2442, pp. 31-46</refcontent>
        </reference>
        <reference anchor="BRW2005" target="https://www.cs.ucdavis.edu/~rogaway/papers/subset.pdf">
          <front>
            <title>Format-Preserving Encryption</title>
            <author initials="J." surname="Black">
              <organization/>
            </author>
            <author initials="P." surname="Rogaway">
              <organization/>
            </author>
            <date year="2002" month="February" day="08"/>
          </front>
          <refcontent>CT-RSA 2002, LNCS 2271, pp. 114-130</refcontent>
        </reference>
        <reference anchor="KIASU-BC" target="https://eprint.iacr.org/2014/831.pdf">
          <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" month="December"/>
          </front>
          <refcontent>ASIACRYPT 2014, LNCS 8874, pp. 274-288</refcontent>
        </reference>
        <reference anchor="IEEE-P1619" target="https://ieeexplore.ieee.org/document/4493450">
          <front>
            <title>IEEE Standard for Cryptographic Protection of Data on Block-Oriented Storage Devices</title>
            <author initials="" surname="IEEE">
              <organization/>
            </author>
            <date year="2008" month="March" day="04"/>
          </front>
          <seriesInfo name="IEEE" value="1619-2007"/>
        </reference>
        <reference anchor="RSSAC040" target="https://www.icann.org/en/system/files/files/rssac-040-07aug18-en.pdf">
          <front>
            <title>RSSAC040: Recommendations on Anonymization Processes for Source IP Addresses Submitted for Future Analysis</title>
            <author initials="" surname="ICANN RSSAC">
              <organization/>
            </author>
            <date year="2018" month="August" day="07"/>
          </front>
          <seriesInfo name="ICANN RSSAC" value="RSSAC040"/>
        </reference>
      </references>
    </references>
    <?line 1336?>

<section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This appendix provides test vectors for the ipcrypt variants. Each test vector includes the key, input IP address, and encrypted output. Non-deterministic variants include the tweak value.</t>
      <t>Implementations MUST verify their correctness against these test vectors before deployment.</t>
      <section anchor="ipcrypt-deterministic-test-vectors">
        <name>ipcrypt-deterministic Test Vectors</name>
        <sourcecode type="test-vectors"><![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
]]></sourcecode>
      </section>
      <section anchor="ipcrypt-pfx-test-vectors">
        <name>ipcrypt-pfx Test Vectors</name>
        <t>The following test vectors demonstrate the prefix-preserving property of ipcrypt-pfx. Addresses from the same network produce encrypted addresses that share a common encrypted prefix.</t>
        <section anchor="basic-test-vectors">
          <name>Basic Test Vectors</name>
          <sourcecode type="test-vectors"><![CDATA[
# Test vector 1 (IPv4)
Key:          0123456789abcdeffedcba9876543210
              1032547698badcfeefcdab8967452301
Input IP:     0.0.0.0
Encrypted IP: 151.82.155.134

# Test vector 2 (IPv4)
Key:          0123456789abcdeffedcba9876543210
              1032547698badcfeefcdab8967452301
Input IP:     255.255.255.255
Encrypted IP: 94.185.169.89

# Test vector 3 (IPv4)
Key:          0123456789abcdeffedcba9876543210
              1032547698badcfeefcdab8967452301
Input IP:     192.0.2.1
Encrypted IP: 100.115.72.131

# Test vector 4 (IPv6)
Key:          0123456789abcdeffedcba9876543210
              1032547698badcfeefcdab8967452301
Input IP:     2001:db8::1
Encrypted IP: c180:5dd4:2587:3524:30ab:fa65:6ab6:f88
]]></sourcecode>
        </section>
        <section anchor="prefix-preserving-test-vectors">
          <name>Prefix-Preserving Test Vectors</name>
          <t>These test vectors demonstrate the prefix-preserving property. Addresses from the same network share common encrypted prefixes at the corresponding prefix length.</t>
          <sourcecode type="test-vectors"><![CDATA[
# IPv4 addresses from same /24 network (10.0.0.0/24)
Key:          2b7e151628aed2a6abf7158809cf4f3c
              a9f5ba40db214c3798f2e1c23456789a
Input IP:     10.0.0.47
Encrypted IP: 19.214.210.244

Key:          2b7e151628aed2a6abf7158809cf4f3c
              a9f5ba40db214c3798f2e1c23456789a
Input IP:     10.0.0.129
Encrypted IP: 19.214.210.80

Key:          2b7e151628aed2a6abf7158809cf4f3c
              a9f5ba40db214c3798f2e1c23456789a
Input IP:     10.0.0.234
Encrypted IP: 19.214.210.30

# IPv4 addresses from same /16 but different /24 networks
Key:          2b7e151628aed2a6abf7158809cf4f3c
              a9f5ba40db214c3798f2e1c23456789a
Input IP:     172.16.5.193
Encrypted IP: 210.78.229.136

Key:          2b7e151628aed2a6abf7158809cf4f3c
              a9f5ba40db214c3798f2e1c23456789a
Input IP:     172.16.97.42
Encrypted IP: 210.78.179.241

Key:          2b7e151628aed2a6abf7158809cf4f3c
              a9f5ba40db214c3798f2e1c23456789a
Input IP:     172.16.248.177
Encrypted IP: 210.78.121.215

# IPv6 addresses from same /64 network (2001:db8::/64)
Key:          2b7e151628aed2a6abf7158809cf4f3c
              a9f5ba40db214c3798f2e1c23456789a
Input IP:     2001:db8::a5c9:4e2f:bb91:5a7d
Encrypted IP: 7cec:702c:1243:f70:1956:125:b9bd:1aba

Key:          2b7e151628aed2a6abf7158809cf4f3c
              a9f5ba40db214c3798f2e1c23456789a
Input IP:     2001:db8::7234:d8f1:3c6e:9a52
Encrypted IP: 7cec:702c:1243:f70:a3ef:c8e:95c1:cd0d

Key:          2b7e151628aed2a6abf7158809cf4f3c
              a9f5ba40db214c3798f2e1c23456789a
Input IP:     2001:db8::f1e0:937b:26d4:8c1a
Encrypted IP: 7cec:702c:1243:f70:443c:c8e:6a62:b64d

# IPv6 addresses from same /32 but different /48 networks
Key:          2b7e151628aed2a6abf7158809cf4f3c
              a9f5ba40db214c3798f2e1c23456789a
Input IP:     2001:db8:3a5c:0:e7d1:4b9f:2c8a:f673
Encrypted IP: 7cec:702c:3503:bef:e616:96bd:be33:a9b9

Key:          2b7e151628aed2a6abf7158809cf4f3c
              a9f5ba40db214c3798f2e1c23456789a
Input IP:     2001:db8:9f27:0:b4e2:7a3d:5f91:c8e6
Encrypted IP: 7cec:702c:a504:b74e:194a:3d90:b047:2d1a

Key:          2b7e151628aed2a6abf7158809cf4f3c
              a9f5ba40db214c3798f2e1c23456789a
Input IP:     2001:db8:d8b4:0:193c:a5e7:8b2f:46d1
Encrypted IP: 7cec:702c:f840:aa67:1b8:e84f:ac9d:77fb
]]></sourcecode>
        </section>
      </section>
      <section anchor="ipcrypt-nd-test-vectors">
        <name>ipcrypt-nd Test Vectors</name>
        <sourcecode type="test-vectors"><![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
]]></sourcecode>
      </section>
      <section anchor="ipcrypt-ndx-test-vectors">
        <name>ipcrypt-ndx Test Vectors</name>
        <sourcecode type="test-vectors"><![CDATA[
# Test vector 1
Key:          0123456789abcdeffedcba9876543210
              1032547698badcfeefcdab8967452301
Input IP:     0.0.0.0
Tweak:        21bd1834bc088cd2b4ecbe30b70898d7
Output:       21bd1834bc088cd2b4ecbe30b70898d7
              82db0d4125fdace61db35b8339f20ee5

# Test vector 2
Key:          1032547698badcfeefcdab8967452301
              0123456789abcdeffedcba9876543210
Input IP:     192.0.2.1
Tweak:        08e0c289bff23b7cb4ecbe30b70898d7
Output:       08e0c289bff23b7cb4ecbe30b70898d7
              766a533392a69edf1ad0d3ce362ba98a

# Test vector 3
Key:          2b7e151628aed2a6abf7158809cf4f3c
              3c4fcf098815f7aba6d2ae2816157e2b
Input IP:     2001:db8::1
Tweak:        21bd1834bc088cd2b4ecbe30b70898d7
Output:       21bd1834bc088cd2b4ecbe30b70898d7
              6089c7e05ae30c2d10ca149870a263e4
]]></sourcecode>
        <t>For non-deterministic variants, the tweak values shown are examples. Tweaks MUST be uniformly random for each encryption operation.</t>
      </section>
    </section>
    <section numbered="false" anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document does not require any IANA actions.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>We would like to thank the members of the Internet Engineering Task Force (IETF) and the cryptographic community for their helpful comments on this work. <contact fullname="Tobias Fiebig"/> conducted a detailed review of this document. Additional valuable feedback was provided by <contact fullname="Eliot Lear"/>. Assistance with implementation aspects was kindly provided by <contact fullname="Wu Tingfeng"/>.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
MhV+oIcedLuSW7z1eLZjb4DZyXcwbfvfNOMB0FzAOf5t+I5hNj7j8btp/yyM
5+6n5jzByGU9hoHs5z0cofnxmY8+9L9D3lP1vZmmXbDinSe7F43RFnZt7trQ
Gd8TSoO4UhwdlTj0AoYR8zHAcCPypYuACplgMzCYbK47aWLHF3zw5Xl9GEG1
q62bnFYe1YUq2L7HGMHL85b6rwvYxz5ShWAdTvzbgqAbxvAhqPf2BRB88BEt
M43OXWoH89st9qB0msF4l2fs6gUTU78X9vK6Tz7qvg/tiHabVKtmJW9vMNdQ
3jYaZhLdjV4Lydm9c7MbtXUp3bLBtX32Ck7u/qSvEHBu0tYcH9lQ6YJhepJ5
VOk6T1wll/2qO77Z9+6voPY17oXd2lHPLUHL11tVtzPPt2uhOkasYuDRdKM0
XobNq3O+0vchc3QSA204YMAD8PqbFXYoOkYjkFvTasatpZ5+hMa6ofWG9gFz
6ae7yggx8/15T5wH4jwU531xPhDnQ3E+Eufjbxtaj2CoRGYoN1vhB9TP9Jj6
GR/mn53WK+/oaM70zaWwKnM8uHSDN+oODHO1sgW6qZHz+66rU9jOsFawoO7X
i3t9V4c468xyap3BUWtyA881oMFohvMg8/4d9p2DRdJllApzbr2hGHxdZ3d4
Cq+zuyPs+oS3VL7GzhxUCEkf1D1CzYnkaqOjOKoOA7fewu5Qh2lK0AFNM6L+
GXaCOszG7sYKTUkIN3RrKL7QgnsyO22cqnemHJ+cAlFOx95912fJlUy32Jle
p7sU6hPdl0+vy5yC1n6xJC9eFhyECphyM85S0LdF0wheABJXYDdENOEgg3qg
RNnujnXXJ2BIeBo2MdWbwI2b6cU4kLYQqr3SFjWTQjc145ph3p/gTigr3dRb
04iRWd7eHO7hoa8LXjVlBQJWIzN9Ne31jmoh2Camwno8Jun2mwIEuVGv02jm
wZWgLf2FOLB27jzM7MV/eiV8Z0ItqM0p8jHRyzALSL+EZ0Bn/JrvKAo6U2WN
dQxlm981ueoPLDXqT9x3N/nl5Ve2Su/EbgJNlzAf//5HvY1NWGbEJVwrR4Hd
i+1NDzFTbe2RtsM4d4d/0bNMK2LLxypcJ9gQN/JwR3/FXS0i4UsAZ4z6oOTD
ZW8qEB0l7TR7bTFws6vomffZP6LnAx6l2ahSsmbILyk3ygzRdZOeo93RM0n1
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
rTgHIM3lEhffbfxfzD1qx6r5AAA=

-->

</rfc>
