<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-denis-ipcrypt-13" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="ipcrypt">Methods for IP Address Encryption and Obfuscation</title>
    <seriesInfo name="Internet-Draft" value="draft-denis-ipcrypt-13"/>
    <author initials="F." surname="Denis" fullname="Frank Denis">
      <organization>Fastly Inc.</organization>
      <address>
        <email>fde@00f.net</email>
      </address>
    </author>
    <date/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 161?>

<t>This document specifies secure, efficient methods for encrypting IP addresses for 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 167?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>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  # Same output
]]></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 anchor="relationship-to-ietf-work">
        <name>Relationship to IETF Work</name>
        <t><em>This section is to be removed before publishing as an RFC.</em></t>
        <t>This document does not conflict with active IETF working group efforts. While the IETF has produced several RFCs related to privacy (<xref target="RFC6973"/>, <xref target="RFC7258"/>, <xref target="RFC7624"/>), there is no current standardization effort for IP address encryption methods. This specification complements existing IETF privacy guidance by providing implementation methods.</t>
        <t>The AES-based cryptographic primitives used align with IETF cryptographic recommendations, and the document follows IETF formatting and terminology conventions where applicable.</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.</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 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, 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 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 MSB to 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="XTS-AES"/> 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>UUIDs: 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 HKDF (<xref target="RFC5869"/>) to derive per-variant subkeys from a single master key:</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_master)</tt> is a pseudorandom key derived from the master key</t>
          </li>
          <li>
            <t><tt>K_master</tt> is a uniformly random master 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 master key across different variants does not enable cross-variant attacks</t>
          </li>
          <li>
            <t>Key management is simplified by requiring only a single master 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 8 words
    bytes16 = []
    for word in words:
         high_byte = (word >> 8) & 0xFF
         low_byte = word & 0xFF
         bytes16.append(high_byte)
         bytes16.append(low_byte)
    return bytes16
]]></sourcecode>
        <t><em>Example:</em> For <tt>"2001:0db8:85a3:0000:0000:8a2e:0370:7334"</tt>, the output is the corresponding 16-byte sequence <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,
    // it is converted back to IPv4 format. This is expected
    // behavior as IPv4 addresses are internally 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 an IPv6 address with canonical representation
         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

    // If we encrypt an IPv4 address, start where the IPv4 address starts (bit 96)
    // Note the first 12 bytes of bytes16 are already set to the prefix for IPv4 mapping in that case
    // This provides domain separation between an IPv4 address and 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
    // Note: prefix_len_bits represents how many bits from the MSB have been processed
    // Range is [prefix_start, 128), i.e., up to but not including 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
        // Output of the pseudorandom function is the least significant bit of e
        cipher_bit = get_bit(e, 0)

        // Encrypt the current bit position (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

    // If we decrypt an IPv4 address, start where the IPv4 address starts (bit 96)
    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
    // Note: prefix_len_bits represents how many bits from the MSB have been processed
    // Range is [prefix_start, 128), i.e., up to but not including 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 is expected to be the same as during encryption since the prefix is the same
        e = e1 ⊕ e2
        // Output of the pseudorandom function is the least significant bit of e
        cipher_bit = get_bit(e, 0)

        // Decrypt the current bit position (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):
    // Returns true if the 16-byte array has 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 bit at position from 16-byte array representing an 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 bit at position in 16-byte array representing an 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: Returns a block with only bit 0 set (position 0 = LSB of byte 15)
    // For prefix_len_bits=96: Returns the IPv4-mapped prefix with separator at position 96

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

    else if prefix_len_bits == 96:
        // For IPv4 addresses, always returns the same value since all IPv4 addresses
        // share the same IPv4-mapped prefix (00...00 ffff)
        padded_prefix = [0] * 16
        padded_prefix[3] = 0x01   // Set separator bit at position 96 (bit 0 of byte 3)
        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
    // The most significant bit is lost, and a zero bit is shifted in from the right
    result = [0] * 16
    carry = 0

    // Process from least significant byte (byte 15) to most significant byte (byte 0)
    for i from 15 down to 0:
        // Current byte shifted left by 1, with carry from previous byte
        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
    result = concatenate(tweak, ciphertext)  // 8 bytes || 16 bytes = 24 bytes total
    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
    result = concatenate(tweak, ciphertext)  // 16 bytes || 16 bytes = 32 bytes total
    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>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t><em>This section is to be removed before publishing as an RFC.</em></t>
      <t>This section records the status of known implementations of the protocol defined by this specification at the time of posting of this Internet-Draft, and is based on a proposal described in <xref target="RFC7942"/>.</t>
      <t>Multiple independent, interoperable implementations have been developed and include Awk, C, D, Dart, Elixir, Go, Java, JavaScript, Kotlin, Lua, PHP, Python, Ruby, Rust, Swift, and Zig.</t>
      <t>A comprehensive list of implementations and their test results is available at: https://ipcrypt-std.github.io/implementations/</t>
      <t>All implementations pass the common test vectors specified in this document, demonstrating interoperability across programming languages.</t>
    </section>
    <section anchor="licensing">
      <name>Licensing</name>
      <t><em>This section is to be removed before publishing as an RFC.</em></t>
      <t>Implementations of the ipcrypt methods are freely available under permissive open source licenses (MIT, BSD, or Apache 2.0) at the repository listed in the Implementation Status section.</t>
      <t>There are no known patent claims on these methods.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="FIPS-197" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197.pdf">
          <front>
            <title>Advanced Encryption Standard (AES)</title>
            <author initials="" surname="NIST">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date year="2001" month="November" day="26"/>
          </front>
          <seriesInfo name="FIPS" value="PUB 197"/>
        </reference>
        <reference anchor="NIST-SP-800-38G" target="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38G.pdf">
          <front>
            <title>Recommendation for Block Cipher Modes of Operation: Methods for Format-Preserving Encryption</title>
            <author initials="" surname="NIST">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date year="2016" month="March"/>
          </front>
          <seriesInfo name="NIST" value="SP 800-38G"/>
        </reference>
        <reference anchor="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="RFC7258">
          <front>
            <title>Pervasive Monitoring Is an Attack</title>
            <author fullname="S. Farrell" initials="S." surname="Farrell"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="May" year="2014"/>
            <abstract>
              <t>Pervasive monitoring is a technical attack that should be mitigated in the design of IETF protocols, where possible.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="188"/>
          <seriesInfo name="RFC" value="7258"/>
          <seriesInfo name="DOI" value="10.17487/RFC7258"/>
        </reference>
        <reference anchor="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>
        <reference anchor="RFC7942">
          <front>
            <title>Improving Awareness of Running Code: The Implementation Status Section</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <date month="July" year="2016"/>
            <abstract>
              <t>This document describes a simple process that allows authors of Internet-Drafts to record the status of known implementations by including an Implementation Status section. This will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.</t>
              <t>This process is not mandatory. Authors of Internet-Drafts are encouraged to consider using the process for their documents, and working groups are invited to think about applying the process to all of their protocol specifications. This document obsoletes RFC 6982, advancing it to a Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="205"/>
          <seriesInfo name="RFC" value="7942"/>
          <seriesInfo name="DOI" value="10.17487/RFC7942"/>
        </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="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="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>
          <seriesInfo name="EUROCRYPT 2000, LNCS 1807, pp. 470–484" value=""/>
        </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>
          <seriesInfo name="ICITS 2008, LNCS 5155, pp. 232–248" value=""/>
        </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>
          <seriesInfo name="SAC 2008, LNCS 5381, pp. 328–345" value=""/>
        </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>
          <seriesInfo name="Journal of Cryptology 34, 31 (2021)" value=""/>
        </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>
          <seriesInfo name="CRYPTO 2016, LNCS 9815, pp. 123–153" value=""/>
        </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>
          <seriesInfo name="CRYPTO 2002, LNCS 2442, pp. 31–46" value=""/>
        </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>
          <seriesInfo name="CT-RSA 2002, LNCS 2271, pp. 114–130" value=""/>
        </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>
          <seriesInfo name="ASIACRYPT 2014, LNCS 8874, pp. 274–288" value=""/>
        </reference>
        <reference anchor="XTS-AES" target="https://ieeexplore.ieee.org/document/4493450">
          <front>
            <title>The XTS-AES Mode for Disk Encryption</title>
            <author>
              <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 1344?>

<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:          0123456789abcdeffedcba98765432101032547698badcfeefcdab8967452301
Input IP:     0.0.0.0
Encrypted IP: 151.82.155.134

# Test vector 2 (IPv4)
Key:          0123456789abcdeffedcba98765432101032547698badcfeefcdab8967452301
Input IP:     255.255.255.255
Encrypted IP: 94.185.169.89

# Test vector 3 (IPv4)
Key:          0123456789abcdeffedcba98765432101032547698badcfeefcdab8967452301
Input IP:     192.0.2.1
Encrypted IP: 100.115.72.131

# Test vector 4 (IPv6)
Key:          0123456789abcdeffedcba98765432101032547698badcfeefcdab8967452301
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:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
Input IP:     10.0.0.47
Encrypted IP: 19.214.210.244

Key:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
Input IP:     10.0.0.129
Encrypted IP: 19.214.210.80

Key:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
Input IP:     10.0.0.234
Encrypted IP: 19.214.210.30

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

Key:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
Input IP:     172.16.97.42
Encrypted IP: 210.78.179.241

Key:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
Input IP:     172.16.248.177
Encrypted IP: 210.78.121.215

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

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

Key:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
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:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
Input IP:     2001:db8:3a5c:0:e7d1:4b9f:2c8a:f673
Encrypted IP: 7cec:702c:3503:bef:e616:96bd:be33:a9b9

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

Key:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
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:          0123456789abcdeffedcba98765432101032547698badcfeefcdab8967452301
Input IP:     0.0.0.0
Tweak:        21bd1834bc088cd2b4ecbe30b70898d7
Output:       21bd1834bc088cd2b4ecbe30b70898d782db0d4125fdace61db35b8339f20ee5

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

# Test vector 3
Key:          2b7e151628aed2a6abf7158809cf4f3c3c4fcf098815f7aba6d2ae2816157e2b
Input IP:     2001:db8::1
Tweak:        21bd1834bc088cd2b4ecbe30b70898d7
Output:       21bd1834bc088cd2b4ecbe30b70898d76089c7e05ae30c2d10ca149870a263e4
]]></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 IETF and the cryptographic community for their helpful comments on this work. Tobias Fiebig conducted a detailed review of this draft. Additional valuable feedback was provided by Eliot Lear. Assistance with implementation aspects was kindly provided by Wu Tingfeng.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
2Gn9fwFs8T1erf4AAA==

-->

</rfc>
