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

<t>IP addresses are personally identifiable information that requires protection, yet common techniques such as truncation destroy data irreversibly while providing inconsistent privacy guarantees, and ad-hoc encryption schemes often lack interoperability and security analysis.</t>
      <t>This document specifies secure, efficient methods for encrypting IP addresses for privacy-preserving storage, logging, and analytics, addressing data minimization concerns raised in <xref target="RFC6973"/>.</t>
      <t>Four concrete instantiations are defined: <tt>ipcrypt-deterministic</tt> provides deterministic, format-preserving encryption with 16-byte outputs; <tt>ipcrypt-pfx</tt> provides deterministic, prefix-preserving encryption that maintains network relationships with native address sizes; while <tt>ipcrypt-nd</tt> and <tt>ipcrypt-ndx</tt> introduce randomness to prevent correlation. All methods are reversible with the encryption key and designed for high-performance processing at network speeds.</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 157?>

<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).</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>
        </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 security beyond the birthday bound <xref target="SUM-OF-PRPS"/>, supporting more than 2<sup>78</sup> distinct IP addresses per key <xref target="REVISITING-SUM"/>. This construction ensures that even with billions of encrypted addresses, security remains robust.</t>
            </li>
            <li>
              <t>Prefix-Based Context Isolation: Each bit depends on the entire prefix history.</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>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-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>
        <t>For high-volume deployments processing billions of IP addresses, regular key rotation (e.g., monthly or quarterly) is RECOMMENDED to stay well within the security bounds discussed in this document.</t>
      </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(block ⊕ ET, K1) ⊕ 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(block ⊕ ET, K1) ⊕ 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, 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="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="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="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="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="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="REVISITING-SUM" target="https://eprint.iacr.org/2023/840.pdf">
          <front>
            <title>Revisiting the Indifferentiability of the Sum of Permutations</title>
            <author initials="A." surname="Gunsing">
              <organization/>
            </author>
            <author initials="R." surname="Bhaumik">
              <organization/>
            </author>
            <author initials="A." surname="Jha">
              <organization/>
            </author>
            <author initials="B." surname="Mennink">
              <organization/>
            </author>
            <author initials="Y." surname="Shen">
              <organization/>
            </author>
            <date year="2023" month="August" day="09"/>
          </front>
          <seriesInfo name="CRYPTO 2023, LNCS 14083, pp. 628–660" 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 1307?>

<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:
H4sIAAAAAAAAA+19aXcbR7bYd/yKetJJHjgDgGjs6DeaE4qSbI7WiPT4TXT8
pEZ3gewnEI3pBriM7TnvW5avSU5+UPJL5pfkLrX2AlKyrZnJiWzLZHd1Lbfu
fm/d6na7rW26XclQPHgptxdZUohllouTN+IoSXJZFOLpOs5vN9s0W4tonYjX
i+WuiCP8/UErWixyeQXfphtq9KCVZPE6uoTukjxabruJXKdFV73tBkELvpTn
WX4binS9zFrpJg/FNt8V20G/P+8PWsVucZkWBfR+druR2CqRGwl/rbetj/L2
OsuTUJystzJfy233CQ7SinYw8TxsCdEVPPiDZ3m0/iie4OgP4LkQWX4erdM/
0bzxfVRsV7fQUdzj9/IySlehWCbyP/T7yx503kpgqtB00B+MH7RgkcNWsQUI
vI9W2Rpe3MqiVVxG+fb9H3fZVhb8ZJOG4t02izuiyPJtLpcF/HR7iT9812qt
s/wSpnAlcbLPTt6cdoP5NKQJ6F04Sq6idSwTF+6nOG6UJ6J99PT0gCdsF41/
ugAomMGrk9Mz9YSWDE9oxdEKllrAELutFNnSdFjQlp7J+GKdrbLzW/qW1w37
EcCGdQcTeljIPJUF7pkeEqcfijffPBawBl5ClJ/LbSgutttNER4erq9Wm92i
6MEmbHvn2dUh/oBPDvHbQ5xsD3/qQQe9TbKETvBZ9/RNd9bvd4ezr3zQvJVx
dnkJyEBrIjx9vMrij+I43VzIXLzMElng8l5vZK522kXqZwT97htAa5lfpetz
B8ZfCqjBpNsfNkAUBwrF6RuhVv+JQD3dyDiNVm92i1XKBFowjE/f9FSPBOUW
juni4REM6wGanuwFl7hKI3EKsNrKNeAqoKU4u5bRx2ixkt6m7IHrs554LLe7
lXiyy6OP/ruve+LrLC+2/tPTnvh9tANeEPlAHQTd/rwbjBrgeoyTpq0Q8k2e
rrfiKI8vcPXiTQSoQj0cBsE0qIW43OA3vTSK8x5s/6FprXD25OnTp903wSSY
+1DE55Z0EQF5Iud5tLlIY/EmB7YREzQBe55E20jAjwS87mtYAzC5BL7P8uhc
Aiu7SmNZ7AEnDufT7wxQrdtvggq2DwVOuwtt6yk4lVLebFZZLnv4Iy0fOPwO
iHB7OBrNh6NxHz48/eZl9/Wz7pu3wBE8EJxdSHG6u8T1wctCnABtiFMZ73IJ
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
yHOBdHUVMmwmFuiisvgrEBq76JyvhRcv0hjBgGb5T8Prck1uha4KKOaqAbSJ
lrmk0s4GilSRnC95KWhLYAnAh8GGj3F7cIZIri9Pzjri8ekTqqB/tMH7UMSg
1z/QyJ5Lyj7I8lvaU2uF1BKyXinfu4fH/nKsAqyob4Nu7a2IQZ5f6tsV7I0J
eNlIt0veUgQiXXj3e7Vb3z/0brVTFM9HzoHRGpeQt8U6B0iDS8mWQhloTltN
J4V2pXVUrXjrsu2U/NdcKqgnqldv62EM8VkHnq4lX1tr/Urm6fJWUQdVWoq3
azrDqG5yYWh5S1T4Y+tdc3WlWsFZhmhto24JziCxhftIb4yCW9AisWH+9IPB
cDSeTGfzaBEneF1cEi+i+Ww6GY+Gg6DfOlFg5W/6PfpH339NYYFQLBI5D7GP
MBmOh+FsMIrDZBpPwuV4FoWTRTIIBxO5aJXmMijNJegPB+PRdDKfLaIkXkq5
jJNoMZtPpqPxYNgPSnMZjMc957/SnCIJo84Hy0koo8EwHM/iYTiaLZNwtpiF
05GchaNxMitPaVia0mAxlcE4mAxm2F80iRbLaTCezfrzeDlaDuPSlGy9Zn8y
QbJIwjhYzDFTNQin49kknCb9BQBtMQrldCLD0XQ6NW5XR+9pQgJ4Vd56347z
0M4ySDdl3zlzTpIOzIhbkgF2jJ6u5yWdgxaUYGUvdaOLH+ouOeFcEU7MijRT
t+14EsoH9DgqShh/Ny6LNmpgB5+I0p+IZvUoD0jRm8FGA+4Fw1EFs7/IzPYT
wHzUC2Ywu8m8N5tX8PyLTLCRHPr9XhCMe1N4NQzKcxvR3Ca/NPCwrB5W1QvL
s4uDWT8cJ8koHIxn03A4HozCYT9ahMtoMg6BBQBfm832lcn2sfisKgXuT453
0x+TVwNxoQtuW1MJ0Dve1aultFKZNq6DhwMfgkmiB28HijzgYXnD7uKd0Xw5
XkSjfrIYBKN4OJ3PlgMZxGaXy8jEI42mZWSa9+B7+A8wbTRqfZFJBIN58yxm
/S8zCXjdPIlhv7V3D9H8gy7tZT3Orha/8PSR7Cc9YE3zYWkBOPPprDcYzIEx
TH5pMPI85tPeaFA/j2AKAB0FX2YegxEOWMZuPZNBANs6Vns6qd/TiUOXlr3B
41+YMu1Y0TiehyM5WIaLxTwIx9E0Ka1nGss4nPYHcRgMRsNwOe2HwXw8gd/G
4WIOWlIQLaJfGOB2vlNoEiYzUMmGMehg82hcxoSa+UZDuQzjGTQfx0EYJ/3k
i813Gch+OB9OF6BPg3yaxUF093xHo2FM851Ek0G4mIyS/WiEzh+fNYxmX4g1
mJUOAZPCPmjGSRCOFvNlOIjBklhOpmWOYdc7HPeHIZhXoZwEk3AOVgf8NhyG
0Xwx/1IbNF8OpjDtBZBAOI2GSTheAhkA7CeN047G/VG4AIME6GAUhcNkDt/3
R9NwkARfjBCSGZghSIlDnJCcgpEENDyaJGXdyM57ORsBKUSTaRhAB3I2WoZR
PE/C6XS5qNgxYIg3mDHr5K9jwJ6Z/AN6OpP9eDCbL5bLwXAxjVvaEVr/ejEc
zaMoWcrhIpbL8WQwCOLhbBRP40EwXWBBgp/V0LVqtD/rQbBIgtlwtIj7s1mc
DEqzLr+WYxks5RhQEtTaiZwM58sokoMxoF0/huX8zLawq2D78wbyiIE0+4tp
fzafJdPSvMuvx+NhFM/m01ESLEaDcV9Gy3i06EdRsJz14/mkBtsarWZ49Qvj
22dal/t39g6I3dV8NkgW/WQEMnaZRDHwx2QxHC9mQ8CAQV/K8U/F10+kwSZ8
rpDZ/lXf1Xw6mUTjISwScHUuk2UQgagexnI4GeDkop+K78N4tIyX/flsFoyX
U1BbJtBKDmbBJBhP5WBxb3r4mXd7Av+Lp7I/juBhDGIEqDsYwW70o8FkKEdM
L89qr2nUrtBO2QdKxfiv13xbIOcRFD19SXhTcriNEjp1I0z+AN+fd/TqqHwN
4/chX5gok0cPltGqkA+0/9jclWzue1RXEQqsBkJ9RZxXS50fxejGXsnknK8q
rO34W33B9Sr9KPkgU7T+SOu/lNjaePFPnp49M/XpynHCy0tY/dZcw5jmdKB+
uVsJvgp0q/znsApUpAB22SKNCvEslYuUbntOdlR7IxJ8VyCVwMGsRhOuSjBK
RQ4BdSkvbQ3fJCtlQlnL6q5UzrZa3GLYCKD0QkY5fFjom+I5JaZ0yWBEV28X
1MXHdJ3wpa6mp2934ixdny8lFlf/vyctfYMW9wAA

-->

</rfc>
