<?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-09" 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-09"/>
    <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 153?>

<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. The methods enable data analysis while protecting user privacy from third parties without key access, 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 (4 bytes for IPv4, 16 bytes for IPv6); 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 161?>

<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 that are unsuitable for operational tasks such as abuse investigation. Ad-hoc encryption schemes often lack rigorous security analysis and have limited interoperability between systems.</t>
      <t>This document addresses these deficiencies by specifying secure, efficient, and interoperable methods for IP address encryption and obfuscation. The objective is to enable network operators, researchers, and privacy advocates to share or analyze data while protecting sensitive address information through cryptographically sound techniques.</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 mathematically provable 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 present challenges for IP addresses: such systems expand data unpredictably, lack compatibility with network tools, and operate at reduced speeds for high-volume processing. The specialized methods in this specification address these requirements through cryptographic techniques designed for IP addresses:</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 versus potentially hundreds of bytes with generic encryption. This characteristic enables processing addresses in real-time rather than requiring batch operations.</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: This specification ensures that encrypted IP addresses can be exchanged between different systems, vendors, and programming languages. All conforming implementations produce identical results, enabling data exchange between systems and avoiding vendor lock-in.</t>
          </li>
        </ul>
        <t>These specialized encryption methods enable several use cases:</t>
        <ul spacing="normal">
          <li>
            <t>Privacy Protection: They prevent the exposure of sensitive user information to third parties in logs, analytics data, and network measurements (<xref target="RFC6973"/>). Protection is specifically against parties without key access; the key holder retains decryption capability.</t>
          </li>
          <li>
            <t>Correlation Attack Resistance: While deterministic encryption can reveal repeated inputs, the 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 operations such as counting unique clients, rate limiting, or deduplication—without revealing the original values to third-party processors. This approach addresses the anonymization requirements for DNS query data sharing outlined in <xref target="RSSAC040"/>, enabling research while protecting source IP privacy. The <tt>ipcrypt-pfx</tt> variant specifically preserves network prefixes for network-level analytics, while other methods completely scramble network hierarchy. Organizations requiring geographic or ASN metadata with non-prefix-preserving modes SHOULD extract and store such data separately (e.g., country, ASN) rather than utilizing IP address truncation, which provides inconsistent privacy protection and irreversibly destroys information.</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>For implementation guidelines and practical examples, 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 cryptographic primitives used (AES, format-preserving encryption) 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>16-Byte Representation: A fixed-length representation used for both IPv4 (via IPv4-mapped IPv6) and IPv6 addresses.</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>(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. This conversion is used by <tt>ipcrypt-deterministic</tt>, <tt>ipcrypt-nd</tt>, and <tt>ipcrypt-ndx</tt> to operate a 128-bit cipher on both IPv4 and IPv6 addresses. 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 are natively 128 bits and are converted directly using network byte order (big-endian) as specified in <xref target="RFC4291"/>.</t>
          <t><em>Example:</em></t>
          <artwork><![CDATA[
IPv6 Address:           2001:0db8:85a3:0000:0000:8a2e:0370:7334
16-Byte Representation: [20 01 0d b8 85 a3 00 00 00 00 8a 2e 03 70 73 34]
]]></artwork>
        </section>
        <section anchor="ipv4-addresses">
          <name>IPv4 Addresses</name>
          <t>IPv4 addresses (32 bits) are mapped using the IPv4-mapped IPv6 format as specified in <xref target="RFC4291"/>:</t>
          <artwork><![CDATA[
IPv4 Address:           192.0.2.1
16-Byte Representation: [00 00 00 00 00 00 00 00 00 00 FF FF C0 00 02 01]
]]></artwork>
        </section>
      </section>
      <section anchor="converting-from-a-16-byte-representation-to-an-ip-address">
        <name>Converting from a 16-Byte Representation to an IP Address</name>
        <t>The conversion algorithm is as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>Examine the first 12 bytes of the 16-byte representation</t>
          </li>
          <li>
            <t>If they match the IPv4-mapped prefix (10 bytes of 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-BC (see <xref target="DEOXYS-BC"/>)</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 meets the required security properties and provides robust resistance against related-tweak and other cryptographic attacks.</t>
    </section>
    <section anchor="deterministic-encryption">
      <name>Deterministic Encryption</name>
      <t>Deterministic encryption applies a 128-bit block cipher directly to the 16-byte representation of an IP address. The defining characteristic is that the same IP address consistently encrypts to the same ciphertext when using the same 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 documented in this specification (<tt>ipcrypt-deterministic</tt>, <tt>ipcrypt-pfx</tt>, <tt>ipcrypt-nd</tt>, and <tt>ipcrypt-ndx</tt>) are invertible, allowing encrypted IP addresses to be decrypted to their original values using the same key. For non-deterministic modes, the tweak must be preserved along with the ciphertext to enable decryption.</t>
      <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 exactly 16 bytes (128 bits) in length. As AES-128 is a permutation, each distinct 16-byte input maps to a unique 16-byte ciphertext, preserving the IP address format.</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
      +---------------------+
      |   AES128 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-for-ipv4">
          <name>Format Preservation for IPv4</name>
          <t>The methods specified in this document typically result in IPv4 addresses being encrypted as IPv6 addresses.</t>
          <t>IPv4 format preservation (maintaining IPv4 addresses as IPv4 rather than mapping them to IPv6) 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 (e.g., storing only /24 or /48 prefixes), which provides inconsistent protection and irreversibly destroys data.</t>
          <t>Recommended approach:
1. Extract metadata (geographic location, ASN, network type) from the original IP address
2. Store this information as separate fields alongside the encrypted IP address
3. Apply appropriate privacy-preserving aggregation to the metadata itself</t>
          <t>Example storage schema:
~~~
{
  “encrypted_ip”: “bde9:6789:d353:824c:d7c6:f58a:6bd2:26eb”,
  “country”: “US”,
  “asn”: 15169,
  “network_type”: “cloud_provider”
}
~~~</t>
          <t>This approach ensures consistent privacy protection through encryption while preserving analytical capabilities.</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-encryption-algorithm">
        <name>Prefix-Preserving Encryption Algorithm</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="pseudorandom-function-construction">
          <name>Pseudorandom Function Construction</name>
          <t>The pseudorandom function requires a 32-byte key split into two independent 16-byte AES-128 keys (<tt>K1</tt> and <tt>K2</tt>). For each bit position, the algorithm performs:</t>
          <ol spacing="normal" type="1"><li>
              <t>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>Dual Encryption: 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>).</t>
            </li>
            <li>
              <t>XOR Combination: The final PRF output is computed as <tt>e = e1 ⊕ e2</tt>.</t>
            </li>
          </ol>
        </section>
        <section anchor="bit-encryption-process">
          <name>Bit Encryption Process</name>
          <t>For each bit position (processing from MSB to LSB):</t>
          <ol spacing="normal" type="1"><li>
              <t>Pad the prefix (bits processed so far from the original IP) to 128 bits</t>
            </li>
            <li>
              <t>Compute the PRF output using the padded prefix: <tt>e = AES(K1, padded_prefix) ⊕ AES(K2, padded_prefix)</tt></t>
            </li>
            <li>
              <t>Extract the least significant bit from the PRF output as the 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>
          </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>CRITICAL: The two 16-byte halves of the 32-byte key (K1 and K2) MUST NOT be identical. Using identical values for K1 and K2 (e.g., repeating the same 16 bytes twice) causes the XOR operation to cancel out, returning the original IP address unchanged.</t>
        </section>
        <section anchor="security-properties">
          <name>Security Properties</name>
          <t>The <tt>ipcrypt-pfx</tt> construction improves upon earlier designs like 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^78 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 (e1 and e2) 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">
        <name>Encryption Process</name>
        <t>The encryption process for non-deterministic modes consists of the following steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Generate a random tweak using a cryptographically secure random number generator</t>
          </li>
          <li>
            <t>Convert the IP address to its 16-byte representation</t>
          </li>
          <li>
            <t>Encrypt the 16-byte representation using the key and the tweak</t>
          </li>
          <li>
            <t>Concatenate the tweak with the encrypted output to form the final ciphertext</t>
          </li>
        </ol>
        <t>The tweak is not considered secret and is included in the ciphertext, enabling its use for decryption.</t>
      </section>
      <section anchor="decryption-process">
        <name>Decryption Process</name>
        <t>The decryption process consists of the following steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Split the ciphertext into the tweak and the encrypted IP</t>
          </li>
          <li>
            <t>Decrypt the encrypted IP using the key and the tweak</t>
          </li>
          <li>
            <t>Convert the resulting 16-byte representation back to an IP address</t>
          </li>
        </ol>
        <t>Although the tweak is generated uniformly at random, occasional collisions may occur according to birthday bounds. Such collisions are benign when they occur with different inputs. An <tt>(input, tweak)</tt> collision reveals that the same input was encrypted with the same tweak but does not disclose the input’s value. The usage limits discussed below apply per cryptographic key; rotating keys can extend secure usage beyond these bounds.</t>
      </section>
      <section anchor="output-format-and-encoding">
        <name>Output Format and Encoding</name>
        <t>The output of non-deterministic encryption is binary data. For applications that require text representation (e.g., logging, JSON encoding, or text-based protocols), the binary output MUST be encoded. Common encoding options include hexadecimal and Base64. The choice of encoding is application-specific and outside the scope of this specification. However, implementations SHOULD document their chosen encoding method clearly.</t>
      </section>
      <section anchor="concrete-instantiations">
        <name>Concrete Instantiations</name>
        <t>This document defines two concrete instantiations:</t>
        <ul spacing="normal">
          <li>
            <t><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 for a specific tweak value after about 2^(64/2) = 2^32 operations (approximately 4 billion operations). If an <tt>(input, tweak)</tt> collision occurs, it indicates that the same input was processed with that tweak without revealing the input’s value.</t>
          <t>These collision bounds apply per cryptographic key. 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 AES-XTS encryption of a single block, the computation avoids the sequential tweak calculations required in full XTS mode. Independent sampling of a 16-byte tweak results in an expected collision after about 2^(128/2) = 2^64 operations (approximately 18 quintillion operations).</t>
          <t>Similar to <tt>ipcrypt-nd</tt>, an <tt>(input, tweak)</tt> collision reveals repetition without compromising the input value. These limits are per key, and regular key rotation further extends secure usage. The effective security is governed by the strength of AES-128 (approximately 2^128 operations).</t>
        </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)</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. This distinction is significant for secure deployment:</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. While outside this specification’s scope, implementers should evaluate whether their threat model requires such additional protections.</t>
      <section anchor="deterministic-mode-security">
        <name>Deterministic Mode Security</name>
        <t>A permutation ensures distinct inputs yield distinct outputs. However, repeated inputs result in identical ciphertexts, thereby revealing repetition.</t>
        <t>This property renders deterministic encryption suitable for applications where format preservation is required and linkability of repeated inputs is acceptable.</t>
      </section>
      <section anchor="non-deterministic-mode-security">
        <name>Non-Deterministic Mode Security</name>
        <t>The inclusion of a random tweak ensures that encrypting the same input generally produces different outputs. In cases where an <tt>(input, tweak)</tt> collision occurs, an attacker learns only that the same input was processed with that tweak, not the value of the input itself.</t>
        <t>Security is determined by the underlying block cipher (≈2^128 for AES-128) on a per-key basis. Key rotation is recommended to extend secure usage beyond the per-key collision bounds.</t>
      </section>
      <section anchor="implementation-security">
        <name>Implementation Security</name>
        <t>Implementations MUST ensure that:</t>
        <ol spacing="normal" type="1"><li>
            <t>Keys are generated using a cryptographically secure random number generator</t>
          </li>
          <li>
            <t>Tweak values are uniformly random for non-deterministic modes</t>
          </li>
          <li>
            <t>Side-channel attacks are mitigated through constant-time operations</t>
          </li>
          <li>
            <t>Error handling does not leak sensitive information</t>
          </li>
        </ol>
      </section>
      <section anchor="key-management-considerations">
        <name>Key Management Considerations</name>
        <t>This specification focuses on the cryptographic transformations and does not mandate specific key management practices. However, 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 detailed pseudocode and implementation guidance for the key 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 key 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>A diagram of this conversion process is provided in <xref target="ipv4-address-conversion-diagram"/>.</t>
        <sourcecode type="pseudocode"><![CDATA[
function ipv4_to_16_bytes(ipv4_address):
    // Split the IPv4 address into its octets
    parts = ipv4_address.split(".")
    if length(parts) != 4:
         raise Error("Invalid IPv4 address")
    // Create a 16-byte array with the IPv4-mapped prefix
    bytes16 = [0x00] * 10         // 10 bytes of 0x00
    bytes16.append(0xFF)          // 11th byte: 0xFF
    bytes16.append(0xFF)          // 12th byte: 0xFF
    // Append each octet (converted to an 8-bit integer)
    for part in parts:
         bytes16.append(int(part))
    return bytes16
]]></sourcecode>
        <t><em>Example:</em> For <tt>"192.0.2.1"</tt>, the function returns</t>
        <artwork><![CDATA[
[00, 00, 00, 00, 00, 00, 00, 00, 00, 00, FF, FF, C0, 00, 02, 01]
]]></artwork>
      </section>
      <section anchor="ipv6-address-conversion">
        <name>IPv6 Address Conversion</name>
        <sourcecode type="pseudocode"><![CDATA[
function 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.</t>
      </section>
      <section anchor="conversion-from-a-16-byte-array-to-an-ip-address">
        <name>Conversion from a 16-Byte Array to an IP Address</name>
        <sourcecode type="pseudocode"><![CDATA[
function 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
         words = []
         for i from 0 to 16 step 2:
             word = (bytes16[i] << 8) | bytes16[i+1]
             // Format words without leading zeros for canonical IPv6 representation
             words.append(format_hex_no_leading_zeros(word))
         ipv6_address = join(words, ":")
         return ipv6_address
]]></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 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(encrypted_ip):
        prefix_start = 96
    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, get_bit(bytes16, 127 - prefix_len_bits))

    // Convert back to IP format
    // If the input was an IPv4 address, return an IPv4 address built from the last 32 bits of the encrypted block
    // If the input was an IPv6 address, return an IPv6 address built from the entire encrypted block
    if is_ipv4(ip_address):
        return bytes_4_to_ip(encrypted[12:16])
    else:
        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(encrypted_ip):
        prefix_start = 96
    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)
        set_bit(decrypted, bit_pos, cipher_bit ^ encrypted_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, get_bit(decrypted, 127 - prefix_len_bits))

    // Convert back to IP format
    // If the input was an IPv4 address, return an IPv4 address built from the last 32 bits of the decrypted block
    // If the input was an IPv6 address, return an IPv6 address built from the entire decrypted block
    if is_ipv4(encrypted_ip):
        return bytes_4_to_ip(decrypted[12:16])
    else:
        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(ip_address):
    // Check if the IP address is IPv4 based on its byte length
    // IPv4 addresses are 4 bytes, IPv6 addresses are 16 bytes
    return length(ip_address) == 4

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 detailed guide for implementing the KIASU-BC tweakable block cipher used in <tt>ipcrypt-nd</tt>. KIASU-BC is based on AES-128 with modifications to incorporate a tweak.</t>
        <section anchor="overview">
          <name>Overview</name>
          <t>KIASU-BC extends AES-128 by incorporating an 8-byte tweak into each round. The tweak is padded to 16 bytes and XORed with the round key at each round of the cipher. This construction is used in the <tt>ipcrypt-nd</tt> instantiation.</t>
        </section>
        <section anchor="tweak-padding">
          <name>Tweak Padding</name>
          <t>The 8-byte tweak is padded to 16 bytes using the following method:</t>
          <ol spacing="normal" type="1"><li>
              <t>Split the 8-byte tweak into four 2-byte pairs</t>
            </li>
            <li>
              <t>Place each 2-byte pair at the start of each 4-byte group</t>
            </li>
            <li>
              <t>Fill the remaining 2 bytes of each group with zeros</t>
            </li>
          </ol>
          <t>Example:</t>
          <artwork><![CDATA[
8-byte tweak:    [T0 T1 T2 T3 T4 T5 T6 T7]
16-byte padded:  [T0 T1 00 00 T2 T3 00 00 T4 T5 00 00 T6 T7 00 00]
]]></artwork>
        </section>
        <section anchor="round-structure">
          <name>Round Structure</name>
          <t>Each round of KIASU-BC consists of the following standard AES operations:</t>
          <ol spacing="normal" type="1"><li>
              <t>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, 8, 2):
        padded[i*2] = tweak[i]
        padded[i*2+1] = tweak[i+1]
    return padded

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

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

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

    // Main rounds
    for round in range(1, 10):
        state = sub_bytes(state)
        state = shift_rows(state)
        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"/>. The description of implementations in this section is intended to assist draft document reviewers in judging whether the specification is suitable for publication.</t>
      <t>The listing of any individual implementation does not imply endorsement. The information presented has not been independently verified. This list is not intended as a catalog of available implementations or their features.</t>
      <t>Multiple independent, interoperable implementations of the schemes described in this document have been developed:</t>
      <ul spacing="normal">
        <li>
          <t>Awk</t>
        </li>
        <li>
          <t>C</t>
        </li>
        <li>
          <t>D</t>
        </li>
        <li>
          <t>Dart (pub.dev package)</t>
        </li>
        <li>
          <t>Elixir (hex package)</t>
        </li>
        <li>
          <t>Go</t>
        </li>
        <li>
          <t>Java (maven package)</t>
        </li>
        <li>
          <t>JavaScript/TypeScript (npm package)</t>
        </li>
        <li>
          <t>Kotlin</t>
        </li>
        <li>
          <t>PHP (Composer package)</t>
        </li>
        <li>
          <t>Python reference</t>
        </li>
        <li>
          <t>Ruby (rubygems package)</t>
        </li>
        <li>
          <t>Rust (cargo package)</t>
        </li>
        <li>
          <t>Swift</t>
        </li>
        <li>
          <t>Zig</t>
        </li>
      </ul>
      <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="FAST" target="https://eprint.iacr.org/2021/1171">
          <front>
            <title>FAST: Format-Preserving Encryption via Shortened AES Tweakable Block Cipher</title>
            <author initials="Y." surname="Doh">
              <organization/>
            </author>
            <author initials="J." surname="Ha">
              <organization/>
            </author>
            <author initials="J." surname="Kim">
              <organization/>
            </author>
            <date year="2021" month="September" day="12"/>
          </front>
          <seriesInfo name="Cryptology ePrint Archive" value="Report 2021/1171"/>
        </reference>
        <reference anchor="IEEE-P1619" target="https://standards.ieee.org/ieee/1619/2041/">
          <front>
            <title>IEEE Standard for Cryptographic Protection of Data on Block-Oriented Storage Devices</title>
            <author initials="" surname="IEEE">
              <organization/>
            </author>
            <date year="2007" month="December" day="18"/>
          </front>
          <seriesInfo name="IEEE" value="1619-2007"/>
        </reference>
        <reference anchor="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="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="SUM-OF-PRPS" target="https://link.springer.com/chapter/10.1007/3-540-45539-6_34">
          <front>
            <title>The Sum of PRPs Is a Secure PRF</title>
            <author initials="S." surname="Lucks">
              <organization/>
            </author>
            <date year="2000"/>
          </front>
          <seriesInfo name="EUROCRYPT" value="2000"/>
        </reference>
        <reference anchor="REVISITING-SUM" target="https://eprint.iacr.org/2021/840">
          <front>
            <title>Revisiting the Indifferentiability of the Sum of Permutations</title>
            <author initials="A." surname="Bhattacharjee">
              <organization/>
            </author>
            <author initials="A." surname="Dutta">
              <organization/>
            </author>
            <author initials="E." surname="List">
              <organization/>
            </author>
            <author initials="M." surname="Nandi">
              <organization/>
            </author>
            <date year="2021"/>
          </front>
          <seriesInfo name="CRYPTO" value="2021"/>
        </reference>
        <reference anchor="DEOXYS-BC" target="https://eprint.iacr.org/2014/427">
          <front>
            <title>Deoxys-BC: A Highly Secure Tweakable Block Cipher</title>
            <author initials="J." surname="Jean">
              <organization/>
            </author>
            <author initials="I." surname="Nikolić">
              <organization/>
            </author>
            <author initials="T." surname="Peyrin">
              <organization/>
            </author>
            <date year="2014"/>
          </front>
          <seriesInfo name="Cryptology ePrint Archive" value="Paper 2014/427"/>
        </reference>
        <reference anchor="SKINNY" target="https://eprint.iacr.org/2016/660">
          <front>
            <title>The SKINNY Family of Block Ciphers and its Low-Latency Variant MANTIS</title>
            <author initials="C." surname="Beierle">
              <organization/>
            </author>
            <author initials="A." surname="Biryukov">
              <organization/>
            </author>
            <author initials="L." surname="Perrin">
              <organization/>
            </author>
            <author initials="A." surname="Udovenko">
              <organization/>
            </author>
            <author initials="V." surname="Velichkov">
              <organization/>
            </author>
            <author initials="Q." surname="Wang">
              <organization/>
            </author>
            <date year="2016"/>
          </front>
          <seriesInfo name="CRYPTO" value="2016"/>
        </reference>
        <reference anchor="LRW2002" target="https://www.cs.berkeley.edu/~daw/papers/tweak-crypto02.pdf">
          <front>
            <title>Tweakable Block Ciphers</title>
            <author initials="M." surname="Liskov">
              <organization/>
            </author>
            <author initials="R." surname="Rivest">
              <organization/>
            </author>
            <author initials="D." surname="Wagner">
              <organization/>
            </author>
            <date year="2002"/>
          </front>
          <seriesInfo name="Fast Software Encryption" value="2002"/>
        </reference>
        <reference anchor="BRW2005" target="https://www.cs.ucdavis.edu/~rogaway/papers/subset.pdf">
          <front>
            <title>Format-Preserving Encryption</title>
            <author initials="M." surname="Bellare">
              <organization/>
            </author>
            <author initials="P." surname="Rogaway">
              <organization/>
            </author>
            <author initials="D." surname="Wagner">
              <organization/>
            </author>
            <date year="2005"/>
          </front>
          <seriesInfo name="CRYPTO" value="2005"/>
        </reference>
        <reference anchor="KIASU-BC" target="https://eprint.iacr.org/2014/831">
          <front>
            <title>Tweaks and Keys for Block Ciphers: the TWEAKEY Framework</title>
            <author initials="J." surname="Jean">
              <organization/>
            </author>
            <author initials="I." surname="Nikolić">
              <organization/>
            </author>
            <author initials="T." surname="Peyrin">
              <organization/>
            </author>
            <date year="2014"/>
          </front>
          <seriesInfo name="Cryptology ePrint Archive" value="Paper 2014/831"/>
        </reference>
        <reference anchor="XTS-AES">
          <front>
            <title>The XTS-AES Mode for Disk Encryption</title>
            <author initials="J." surname="Black">
              <organization/>
            </author>
            <author initials="E." surname="Dawson">
              <organization/>
            </author>
            <author initials="S." surname="Gueron">
              <organization/>
            </author>
            <author initials="P." surname="Rogaway">
              <organization/>
            </author>
            <date year="2010"/>
          </front>
          <seriesInfo name="IEEE" value="1619-2007"/>
        </reference>
        <reference anchor="IPCRYPT2" target="https://github.com/jedisct1/ipcrypt2">
          <front>
            <title>ipcrypt2: IP address encryption/obfuscation tool</title>
            <author initials="F." surname="Denis">
              <organization/>
            </author>
            <date year="2025"/>
          </front>
        </reference>
        <reference anchor="RSSAC040" target="https://www.icann.org/en/system/files/files/rssac-040-09mar21-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="2021" month="March" day="09"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 1279?>

<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. For non-deterministic variants (<tt>ipcrypt-nd</tt> and <tt>ipcrypt-ndx</tt>), the tweak value is also included.</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 correctness and prefix-preserving property of ipcrypt-pfx. Addresses from the same network produce encrypted addresses that share a common encrypted prefix, enabling network-level analysis while keeping actual network identities cryptographically protected.</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, while the encrypted prefixes themselves are cryptographically transformed and unrecognizable without the key.</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::e7d1:4b9f:2c8a:f673
Encrypted IP: 7cec:702c:3503:bef:e616:96bd:be33:a9b9

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

Key:          2b7e151628aed2a6abf7158809cf4f3ca9f5ba40db214c3798f2e1c23456789a
Input IP:     2001:db8:d8b4::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 (<tt>ipcrypt-nd</tt> and <tt>ipcrypt-ndx</tt>), 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>The contributions and comments from members of the IETF and the cryptographic community have contributed to this specification. Tobias Fiebig provided a thorough review of this draft.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
rkpf6ZgpKoKS22477A/VHvnKMVtDPDvUNCPg7CGmrzhml7G3QlDR2UlDDMoL
V2iyoAGBQp9InJxA8HYEStNWpQv823/+H2ojGZIlFgVMfMecl5Ctg/t/r+Qz
0KuU48padk2sgkntKFLkl35zDkJRpNJTpzR/mM4K3TqsOCtX6g8/WGSsDKMK
K0c7UKXCu4+fOyhex9OlZlvDjNtyCglJNsUFWAiTipCFwMls+w50uBTnDjNz
VXujx1wJrVrClw/P3+DAgbGIEOnKnqY1ZcOcf/v23avnwEXICctiBWSgYGRh
QAvYRlZgmqJ71W0zAqWgicO3Wo6Y3oHGEv/FNTgsX6uyjLQ/rNKjajwubEVX
ukIs5kZUc0EId0oIhyLpSmX47CEY2kCkiAqfqPIMYQyWLE0y5gNGGwIrwmCX
4cD0ToiGX7hKdpFaHsondMbeIXsA6tgC88JJZ+SsTAsSybvawTuIypmUamSo
wnviLsAnMVOMmIj7HvKTIF5p2/DM0imQEk9eXBx7vwNUajR+wZLZMG24vUCT
ZQ1aOsrbJe78FhOE2NeDzpmNB0y/+4uidyRKyAWUE6cDDpEzUAJ2VdBHEX8J
P0H/2qJvJElzYAHMqClPAp+6DrQsjrQghE9mrB2h5Zxo1HBkUFt5CgbjmfUb
+Q1axNVTcppsEg8UYlYgZEaLYjI8qT0uGUmi3SqlhsmWGZRWLmlNJjYQRyQO
Fvd2GMHdd/UJUhkKpiIMtCaJnjFrxwS//f7olgd8+Uq6pWky7oipG2FieY+b
oXd2maxA68/4Zf4UrYweJMnF8UnYeNRCiBndEqyBr6OsAPaFqOhdmId5bSju
MUMz8568fnd+8aTN//XevKWfz17867uTsxfP8efzbw9fvdI/qCeYW5mfzJtH
b1+/fvHmOb8MV73CpdeHf3jCa33y9vTi5O2bw1dPtD1vXDGwCKYJovYtRhIi
pAJgO2EaL1jKPDs69fojiW6z/hTdVMgipMths7qXv+aorAFQQPjge8GKPCag
QJNtAeh0ndxuPAQdbX61f4jVE94UErgAVeYQ9gYg6O9JazTBQB/0BvL8e9Ld
rxGcVrQ0UhMXMhrM+8hDOhjMeIbBjDMh3TaSkx56KN/ACBCbK0Cu1LnN+ImE
tEgQ8/CzTcwJxJ86a4RCxDEHmrs9HXQSdjgNCD+C4gp4FMCeQkKx9DWRsoa7
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
6FUjG6sF5iDhR+grEzdlAhdiBtBygiBnNJbkBhi7t64HthodLrLjiQw7bXU/
FglD1c2PcLqAVtKQ1X19f3P+9g1+geZC3SnwrQ57YjEUD+b9KuPmCerbcrI6
5xrfBisV1W+Zc5dw31Cp90ri9+yCMQQB2j+TEe9MeJ2A+SytKX6dha5aW0fH
dKnqBPBKpVhkIajfTOzFDM+u921yi3kkZZ1NJlmZtDgKx8E0AFZmDjJpMVyh
6Xy/z2GelfphWMVtNU2I3cTRTfTBx/Qndh7oaqKaWiYZ//VmzD2akxH67Fqq
8vqcqofUILJ0SIrRrvvVO/uzqvxo71c1z2pKV2Hhs7KDvPwqcjLs+LFBR8aJ
rHOmplawK0tVreWyMVWu3kZVUiFasdisS5Vljnqiy9zNUPW1Zk5ViSolLfZp
oiSIbYJd9B+dtr+JCrn6hLNOMVc5mf8bq3gCnm6qvWuBqm+u/1Bw+WB/QDcU
s/uJMOjzdTW3zk02q9V+4IGKVuXASldtJaaJUSytefB+hUZRiYpYZyQ25oKx
mkVtDWrGupeJWcizt1wvZaQP92vQzIXfIJEhgwLBAhXbwR8BPgdgaT+FH4cD
2+JvPtzTsUUVwcFeMUgSNCOEx/wN2Z63RiYab7aUifiY1uXKDbmKPRU459x8
nGXVPhGIxHa1WwWp2xnycyQhOxaACLklkPaQWQFZtuhxxvCGAJZLbTktrIU1
ZHnKZTxfTo8lcrujRjrI+VxyuyvTWyn2ufuJeKdLLsPBXnLRw3wmuaDGoObp
NAE10SeaNAt82/VCjQ1lzxOdDaI+H6zC3crxD/IeLHerFR4oQhZXF8/B0mFT
h2ILy5GNF6n2q5JqC6QJoFS0ORntoc1CF1WbQBuNc1ALEb9BBy7WbDxGfbUM
XkWDuobZIUNLIc20Mirb0Msa7A024a2gNtXLhikuc0huH3ldYfquRVyKhBD2
yodZANXgj65jsyVphnoOp3HGSEMnKGLZDeaei5XuxaLd1pqxKq+E08XPdGRW
1gl63tGfl+lUQKMI1+VUt9hfKnVszJjwrXQHikCH3CmZ/beyn6LvnSsHTaGv
T7GmtxlwAyzLx8MjvZPtObHZJPYl1QW7hYTLmKt20a5O2WiqqR7QDiGap/He
+nRiFHK7pqRSdLRq0LWsqIKVRdd0IkNVYHrEkRCmoEMnp1BSSgGWp4+r6+FE
Ges4ktqcmQKA3xSzXNvFDFGd099WxUCmf2+7mLdZBvAzkx5oRZibHC0o9mdm
WGEIQJ+c0ajs7+Qoakanq9gKrR81y4zb+6Wj0dSg8QPu2aZ0wmaeJIlaZGaf
16oqJZtkSyoCPC9jYaWdq67eHLmwmKPpx3r4cOtryQEfBCXIYC2vK0CpZWc1
KB1Z82NhuQeMrwNY7W5dCUY6qkDCDkOhmG/wWNDVSjEDP2DUhyvqMsm9AkGm
SUVZnn/26ZvAut/Jkw6bTtzZAcstVVfGUtWkbhiYldt/yE641V5Xp8DQfN2u
PEGf1EJYfkQSA6+TTZIDLWNPmR3WSGFvspB/xP+uIt3qljKEZAeTheqcF/M2
xiGWuwEoFEOj9jAwtzReUIaKOvhDtu/Rn5DeTTd1WjvgKvqMyOI1ls41vTM4
9CGzgngRMvJaESGhsPG7dyfPM5//A3JAlnrhr8ClAeL007RVhgjvyq+8a+UM
YbX8lp6TPZCdLARy6uegoCkfKvqLCsUOqpwHt0zWgGJeQWob0xrzRYo4hLvd
LfgwC9F96azKNApIzGa+YyNZu4BzMs+Rnavl+iB51JVqoQoqyiq5Jy2EYm06
uaIYer54XFWlKpnKKApT8iJYsRjEStBoQVGIMYoaJQQ99X5MnWplcxbJLWTw
S2UzSFXBzg6iHFrGNrMwX5l5xZNL7FIrxk2isncbPgaO4qqqUTc6vvZlqSCT
LRSrcjAK4MeZyqbUzpikuqYjNkcLKWnerAnX4LDPUqDTDqwWW9LI2KHMjXDq
OrVxZZVbYrlHqwiSAvRrIHPIGjV/EWOL1PD/nvSKVFBDOeU9pda5hepZq47k
0EDYtDo3Pc6dAyuai3uZqYNLv5Dg0dDUybLyvBLiSTF1tm+qKjFY76HtHjap
G1V4xl1ETLARu91QMw46H5Dzo/g5c0yM4kLfvj48atvPCbe9PTcsoVyAK+x3
Sugb5JRaQ7WFbjCF3dssgoyvtyiK0BmAzt9C/azMPBFoZ8lwbc7lxujixaMr
AjqzAct/VLYvr8PEWQ1UMhWAsjGSDB7FMwDIdjqTThnS6UfS30h+KHNVplda
PupCH3qrQNukp1laiOxovLivDLuqc5Z0vUiKDDEtJr/bRc726VxOWIHbf9bY
LNreRwzEk7StE66LK3JcrgzYsqJXAO7FdU03U+ksqDpKwnEKs9VtCsUrdDu9
Fycbdk2rBsaPctkFG80bmGHK9kmf7b1r6yao7IGU0le2W6WKT3RUfInjzGv+
23/7r2zUL6UPCH5ucVM7QJAO8iPgKTEA4aXtc4gzR55igthef58erOhd5O0u
uJXNNp8UAjTk9ee9JQhx3JbO7EVniRXy/BGR+Avj7s3kGXUFjXZPAgHGdM+B
MjvIDTdYVC5FEjXZZFPTSlQh5wZIaz6ByGjtGJd/kaZ4/JQ6nEsHNFc4PXOK
h1V6TMDEjXoNEuGKaxPLuktJeV+CwpIJLTVdN2+xNIdOu1FTWWMxaC6MR+cj
9bfUH9fnqFUF3XSPOt7QB/byc3cyU93yqD1pbzbBhnwD6wNUSa8wdsWhea67
xPPUQGWjXCArxUcW03FBgFKoYPI3Mah3+DPuvUMm2wQ1OolFqDxTz3wkSyWn
mVAsaW2liFp5ziMe2Op/SOwiIh5nnVoq269nVE10XDi8zFJvbW+GnbXq6vKV
7kYZLF4DiK6x4CwFuxP0QmQvVFBitVSngwRzUONvxWplN2UwGb0cYjBR96IO
za2eXfbwXEadPn1TkxFU6AJtn6sK91GRNTnqlItSPmJBZ0eqxA3LoHbavBdn
eyIL8MwX6o70UyfKyK8+oRaQbCTdIeTun1gxH522iADlvGaQD3deUwrBG9GS
J8tQiFo2dMCzOO7UfVluxK0B2s73evi90RMtgzLF/Xptr9/2Bux9HrZ1S+4R
8+3fxhn66Z7HAR6thDsSyR9liMSk2agbHmDbDv25Mtnoo7i3PlsGrRu6Lzc2
tpp/q3lQsOZm1JGY3DG9fTtyFj/YbdKsP5wLbNoUlx6ob5xV6J+l/7wNc4HH
w9ldi3+KcT3TAOwwTYN7v/FA7+TvZffk7yv7J9f35PSOYQfL8LIaKD+8Cj37
9xVd3b577ADvVVSCO691uDeunOmjR7Ehd2Ty1h79tr0E3frss77unDWjgKj3
YW/dO+4F0Lxx4Lf+HnbmPSfO2TU2lDWH9U4vB48epaa0yynlIr9sEJnqJI4n
WBVafGB9bcUijSD6tRVZfH+g7pfKsvi+XbHW4D7PXKgFs2SWSicGsZaN36WH
sArGXJJFflbpFT10LnJl4y0o7F9KwKTHDvE4TbtsizsiUbY6nSyFqYtKaPx4
9PQed1K4QeO9eeouGm+iCizei8fVnPIzcXnfIO91hq/0kM+YYZBp8HlD4Wg6
68Y09q5lWw+M5T2Ke+1dm53vy7YOkIgZ7LOnNBg5jSidff0yfKhia39nCKE2
4QsxQqVb/D+JECAIahDiTmNEnRKHfjOppen0TetwBpXPXaolfUjjk61xjV7e
0NX9+Oplnlz2J5fEzpp0QRXJszw5OLCywwtHKsgU/YQ0PXoaHeUZyAh7oC51
C2g+6T6hHvuY5ci9WJr0dMv7p6feyDdgpZPO2QfQfHKyUQ2zzZflODCzIzpT
wEqYCVAjNJnR5WMm6E1aLJDDU+89HjTxnfcLr9/T34dxi0dR2G91cbhN1KSz
KDznrT6WQt5j9SHefORLg/JLcPmQnmetgODrNc2BLpwIzy59cl2LlEFCUR0A
KmIGAdcCa2Em8B7Bv8VvcgGueohx1Zz0QgbUhyfaPnjyQR67ZfpE4OsZMy/Q
x9veY/7ikR7490hdA6XDPtrEPlrGoZR6fJ4U8XlSxufTIJVJ8YWjPNCbF19d
cxML1FOwMqlLr/G5bE8RqpnA19yxadwXdCY7edxTrDGKjI3LOUwEI2/GgxUx
8Tu9g3gbd5Aes3YQXRq0MHi8SQ/9y794s5b37w3m0B+QKeoxeqp4v4AJethW
7SNqxM/AlUce/6MwyaT6cagZlNxsm7BNr4ibE+1CYR+kxFmr7rk3ZBZWHHdT
gzW0DsQZwJx425TLkuhimJW6juyqP3mIXxluBNxKs6trAXabcq7UMCd4jtKn
5Ak2zklEupTW95fwx7/r0v9ayveNeYFtNUosG04orqFqaKx+raaQUGUVqpcX
4jq4iTHykZXa1qby/D9VPS2j1Lo1rpqzGqvQgoeO7WDHsuWNYzIjucFvS7tD
Mem296X/qoODvlMbKnfyfa/b7Q++854+rfistb+4cVat0ojPGlLpqMWThsx7
NKgSiO8tXcLyP/UHrJlZn3Nftdg1snnEUczQ2FwpfHwff9dqFT6q0OSp96ck
3jTNaG1PS2HPomT7JbopVvIopEoImCYPavWT8uoVw6xZeE9qpFiE5g0Kyyeu
9dSzluj98z8jp/te7138y35BO4NJyoIi/rSKw69EQFyEDWOcQognKVP4kKZe
qCwszUTvAdPM5bW4u9wkl3LcSxqX2HFhHybFfaDBYAv86i3Qz2v5V2s2NCtT
P1tscNhdPWsFJT1y6bx+Kc1tGFzNpE0ZDFpwXlx/wfkSBTaKAxZZqMNB0d2v
DvBQAyseasSlZGsFaa/lMT1tpbk9lWca6DVSZrFi6YzzVmdYeL4gFcxYjgy0
X7I9il+4AzLzoWkPa+/BVwGj/XFe7HaFKWIOHNVMy3BUvplKMOqRHChar2jc
3+sNdByB3qdvHt1P57MpBF76crowmZeYG6taZlRt43DwiG1Uw9kahWTLoObk
pgNQBUd7POWUrT7t1sTiPbuvmxbwr0/fnl0cvrnwrSZBChg6rYCefokOSHj3
fc/vT5iDvxzIS4DLw8F3egInm5gSxv5ip8JIByFZeMR5XdolbYHsuYkZZ+nd
6iGK4rrNYSXrSFfHxqWbGTXN8uYTbXdiixlZBV48CVEBmgKtIledqi0PJX1A
9fmPVRPhIBMGnWKrCVCUUCafbKxNCqvIb4XREE1HBZlywJOSTVr0yV8FIQ04
GGeXKPldgjd4KH3HDJ+nsPwK1aDwTK9q8xw3sjmnV0XznPas0olgv4A2l/pF
aQRt58MGZx/XstXeRV+NpDrlGeLJMEMUY/r3DEjdcAz98tSuf4G7oNNX1LBn
2KYKder39iTb6Kdvtb24K7ptb0dnz6ugIpcEk6kzmBlDvjAx+r4DcHb+m90g
hsAt2qrbOXJFOkYuMYvf8Eg9gooP2KKyMlQgHx9UPF4VOZCPF6IHetZvdcG3
CSEX5y5Nw+pmcFgprQe0Ig1PvSuR409NAUaARBT5Ubt/hIqqPLq3nj3QsQwC
lHDpac8ckIcj9wfTdumZfvEZwG6Rh92KL4zKX5hP3NeH/fIX5tPCM73CF+Di
JawaoAUz9DrFAfRzWk67oNVEKccxwMkU8E3vG/lM296lPzoju7sECsCWysFK
XMSN9NjvnFP3IdViqF/bYEi3EVSuDM3WChyI2hld4oCXyUbQkmpQXK3Yud3G
dIIStCph3SrLdmO3S6vdEmwmH+62fOitaqtXEhSLXbyyGiiSPWuJCzf5VJ/p
uueTk5pPTuo+KXu3VX3FEkyWWmKpR5b36XIk9Uo90Pv+ABWLVoWscl7UGql+
s/VF+jvqhw9p7X8XGqLTmmW/rmjWwXN7jJnwuVrjl+mB5tjIaj3Q3K/VA+Uj
P4Ee+I+pQWkQ/X8d6h9Sh4L5CdthKw9UNS3JwGLgxnV2Ljt1I7TsEKlM4Rt/
p9qZ3VbqZ9POJDHs1c4Kz3yudua8XqOduc98qXZmsW0Xti4736OmWbyhWk1z
PvE30NP0BL+KpmaB4+9aVzNS7+fU1aq+8rAIrNTW9FCfra3pNy1t7Vuxwkpf
dbZBVkzAveb7ilXJygadc106ysHJifbrNcA6JVUH+uKlVCRMiFkG03QWPO4i
qWGW8OaIWTHiJpPQ2sVoGt5T/l3bpyrVR2t2GOgaNcwCNJoHedDWfNUsQmX2
FXvvc+DKSbjQ8p7PICvG1XVVI71CFYLqI2pU3+sB9WISofShef0xk91TYuzq
as/MjuPNZl74MBAodTtNaNZTyqFs4cu4SNAI69/uFd7tec1X9rv98XfakXqJ
bXqR2/THwBWaeowDb8aojNxTPaPv/jtvZm8Qwf29Ge47jObrFzGq37c2K6vc
rDanq1upOqK8X3Tcyd9yt348yEqg+v6p12xyVRjAqYXhQQM6C2y24suQK7Bw
K8lJhKxuR1rD5rI17FhHRXDIM3DlKKKkLi+lf0mz8L0zme1RPtiCsQt9w00L
+4rgbO0bfz4xH6hOJZAnc7HTOHEPB5lLmwj4U1E/BhbRc3RhpT3ZzbKV3cGu
E1xNrTjWRljlA0hUaPPc9fq12Mt0WAKMRUjOkA0tSmqWN59UrW9kV//IBjip
BWBSrRnfWJfGg2fc9+xRzZFlsutxaXuavV632+31PMzjaH0p/IYGfAp+ZsuL
kARltMm4p4A5rPnw+/6IBz4+1uKoIlOlfj8ffm//3tW4Ogw1MyXJsw6y0j5j
2h4WaM0nT2xuUKEcUl24YQKkkBbTCVWPcnWEMrxv+3WqDvVBSb+C61w/FJCL
Ql2nWciGYErHSjHtTEoHcmwUtj6Emdw77gFlptMQFWYXNVVTJENtPkrTNI/0
TPqgSkwZe1FyS+d0uAzhSNlilJEll6JVeHlSPE9XGdvc/x1fsLYfV4mJHcjI
ib1zkkcfkzzo9VJem6WScKuMnENntzEeAiXorZgNYmM52B9VQNTfA4E7lYLW
wkmemw5E783f5gpNneXuZvZ/Zqh5Ez0Qaf6Jov+I55h10/dNO2+nhLw5U33U
8XG+9lQ+Ip1/M854rOtF6n5o4P+scWr8xNDX4RzeEt1ymtpN0+7b2SC0Y5fP
jtx8ENUpR6UzOJ8Y+W6/cN0UO3STzzUBW10Im3JkK4uEBpaApnIdlUPztNAb
tB41P8tRDdil/NR2u3HHS63Qgp24pVbgesVOC3AbR8wr73v+7DuWsBSNnlkW
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
On8J+QAA

-->

</rfc>
