<?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-05" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.0 -->
  <front>
    <title abbrev="ipcrypt">Methods for IP Address Encryption and Obfuscation</title>
    <seriesInfo name="Internet-Draft" value="draft-denis-ipcrypt-05"/>
    <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 118?>

<t>This document specifies methods for encrypting and obfuscating IP addresses for privacy-preserving storage, logging, and analytics. These encrypted addresses enable data analysis while protecting user privacy, addressing concerns raised in <xref target="RFC6973"/> and <xref target="RFC7258"/> regarding pervasive monitoring.</t>
      <t>Three concrete instantiations are defined: <tt>ipcrypt-deterministic</tt> provides deterministic, format-preserving encryption, while <tt>ipcrypt-nd</tt> and <tt>ipcrypt-ndx</tt> introduce randomness to prevent correlation. All methods are reversible with the encryption key.</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 124?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies methods for the encryption and obfuscation of IP addresses for both operational use and privacy preservation. The objective is to enable network operators, researchers, and privacy advocates to share or analyze data while protecting sensitive address information.</t>
      <t>This work addresses concerns raised in <xref target="RFC7624"/> regarding confidentiality in the face of pervasive surveillance. The security properties of these methods 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>IP addresses are personally identifiable information (PII). While generic encryption systems can protect them, the specialized methods described here offer significant advantages with well-defined security guarantees:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Efficiency and Compactness:</strong> All variants operate on exactly 128 bits, providing single-block encryption speed. Non-deterministic variants add only 8-16 bytes of tweak overhead compared to arbitrary expansion in generic encryption systems. This enables processing billions of addresses at network speeds.</t>
          </li>
          <li>
            <t><strong>High Usage Limits:</strong> Non-deterministic variants support extensive operations per key - approximately 4 billion for <tt>ipcrypt-nd</tt> and 18 quintillion for <tt>ipcrypt-ndx</tt> - far exceeding typical cryptographic limits while maintaining compact outputs.</t>
          </li>
          <li>
            <t><strong>Format Preservation (Deterministic):</strong> The <tt>ipcrypt-deterministic</tt> variant produces valid IP addresses, enabling seamless integration with existing network tools that validate IP formats (see <xref target="format-preservation"/>).</t>
          </li>
          <li>
            <t><strong>Interoperability:</strong> By following the recommendations from this specification, implementations can reliably encrypt and decrypt IP addresses in a compatible way across different systems and vendors.</t>
          </li>
        </ul>
        <t>These specialized encryption methods unlock several critical use cases:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Privacy Protection:</strong> They prevent the exposure of sensitive user information in logs, analytics data, and network measurements (<xref target="RFC6973"/>).</t>
          </li>
          <li>
            <t><strong>Correlation Attack Resistance:</strong> 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><strong>Privacy-Preserving Analytics:</strong> Encrypted IP addresses can be used directly for operations such as counting unique clients, rate limiting, or deduplication—without needing to reveal or access the original values.</t>
          </li>
          <li>
            <t><strong>Seamless Third-Party Integration:</strong> Encrypted IPs can act 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 any 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 concrete 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><strong>IP Address:</strong> An IPv4 or IPv6 address as defined in <xref target="RFC4291"/>.</t>
        </li>
        <li>
          <t><strong>16-Byte Representation:</strong> A fixed-length representation used for both IPv4 (via IPv4-mapped IPv6) and IPv6 addresses.</t>
        </li>
        <li>
          <t><strong>Tweak:</strong> A non‑secret, additional input to a tweakable block cipher that further randomizes the output.</t>
        </li>
        <li>
          <t><strong>Deterministic Encryption:</strong> Encryption that always produces the same ciphertext for a given input and key.</t>
        </li>
        <li>
          <t><strong>Non-Deterministic Encryption:</strong> Encryption that produces different ciphertexts for the same input due to the inclusion of a randomly sampled tweak.</t>
        </li>
        <li>
          <t><strong>(Input, Tweak) Collision:</strong> A scenario where the same input is encrypted with the same tweak. This reveals that the input was repeated but not the input’s value.</t>
        </li>
      </ul>
    </section>
    <section anchor="ip-address-conversion">
      <name>IP Address Conversion</name>
      <t>This section describes the conversion of IP addresses to and from a 16-byte representation. This conversion is necessary to operate a 128-bit cipher on both IPv4 and IPv6 addresses.</t>
      <section anchor="converting-to-a-16byte-representation">
        <name>Converting to a 16‑Byte Representation</name>
        <section anchor="ipv6-addresses">
          <name>IPv6 Addresses</name>
          <t>IPv6 addresses are natively 128 bits and are converted directly using network byte order (big-endian) as specified in <xref target="RFC4291"/>.</t>
          <t><em>Example:</em></t>
          <artwork><![CDATA[
IPv6 Address:    2001:0db8:85a3:0000:0000:8a2e:0370:7334
16-Byte Representation: [20 01 0d b8 85 a3 00 00 00 00 8a 2e 03 70 73 34]
]]></artwork>
        </section>
        <section anchor="ipv4-addresses">
          <name>IPv4 Addresses</name>
          <t>IPv4 addresses (32 bits) are mapped using the IPv4-mapped IPv6 format as specified in <xref target="RFC4291"/>:</t>
          <artwork><![CDATA[
IPv4 Address:    192.0.2.1
16-Byte Representation: [00 00 00 00 00 00 00 00 00 00 FF FF C0 00 02 01]
]]></artwork>
        </section>
      </section>
      <section anchor="converting-from-a-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><strong>128-bit Block Cipher Construction:</strong>
          </t>
          <ul spacing="normal">
            <li>
              <t>Used in deterministic encryption (see <xref target="deterministic-encryption"/>)</t>
            </li>
            <li>
              <t>Operates on a single 16-byte block</t>
            </li>
            <li>
              <t>Example: AES-128 treated as a permutation</t>
            </li>
          </ul>
        </li>
        <li>
          <t><strong>128-bit Tweakable Block Cipher (TBC) Construction:</strong>
          </t>
          <ul spacing="normal">
            <li>
              <t>Used in non-deterministic encryption (see <xref target="non-deterministic-encryption"/>)</t>
            </li>
            <li>
              <t>Accepts a key, a tweak, and a message</t>
            </li>
            <li>
              <t>The tweak must be uniformly random when generated</t>
            </li>
            <li>
              <t>Reuse of the same tweak on different inputs does not compromise confidentiality</t>
            </li>
          </ul>
        </li>
      </ol>
      <t>Valid options for implementing a tweakable block cipher include, but are not limited to:</t>
      <ul spacing="normal">
        <li>
          <t><strong>SKINNY</strong> (see <xref target="SKINNY"/>)</t>
        </li>
        <li>
          <t><strong>DEOXYS-BC</strong> (see <xref target="DEOXYS-BC"/>)</t>
        </li>
        <li>
          <t><strong>KIASU-BC</strong> (see <xref target="implementing-kiasu-bc"/> for implementation details)</t>
        </li>
        <li>
          <t><strong>AES-XTS</strong> (see <xref target="ipcrypt-ndx"/> for usage)</t>
        </li>
      </ul>
      <t>Implementers MUST choose a cipher that meets the required security properties and provides robust resistance against related-tweak and other cryptographic attacks.</t>
    </section>
    <section anchor="deterministic-encryption">
      <name>Deterministic Encryption</name>
      <t>Deterministic encryption applies a 128-bit block cipher directly to the 16-byte representation of an IP address. All instantiations documented in this specification (<tt>ipcrypt-deterministic</tt>, <tt>ipcrypt-nd</tt>, and <tt>ipcrypt-ndx</tt>) are invertible - encrypted IP addresses can be decrypted back to their original values using the same key. For non-deterministic modes, the tweak must be preserved along with the ciphertext to enable decryption.</t>
      <t>For implementation details, see <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. Since AES-128 is a permutation, every distinct 16-byte input maps to a unique 16-byte ciphertext, preserving the IP address format.</t>
        <t>For test vectors, see <xref target="ipcrypt-deterministic-test-vectors"/>.</t>
        <artwork><![CDATA[
      +---------------------+
      |      IP Address     |
      |    (IPv4 or IPv6)   |
      +---------------------+
                 |
                 v
      +---------------------+
      | Convert to 16 Bytes |
      +---------------------+
                 |
                 v
      +---------------------+
      |   AES128 Encrypt    |
      |   (Single Block)    |
      +---------------------+
                 |
                 v
      +---------------------+
      |    16-Byte Output   |
      +---------------------+
                 |
                 v
      +---------------------+
      | Convert to IP Format|
      +---------------------+
]]></artwork>
      </section>
      <section anchor="format-preservation">
        <name>Format Preservation</name>
        <ul spacing="normal">
          <li>
            <t>If the 16-byte ciphertext begins with an IPv4-mapped prefix, it MUST be rendered as a dotted-decimal IPv4 address.</t>
          </li>
          <li>
            <t>Otherwise, it is interpreted as an IPv6 address.</t>
          </li>
        </ul>
        <t>To ensure IPv4 format preservation, implementers MUST consider using cycle-walking (repeatedly encrypting until a valid IPv4-mapped address is obtained), a 32-bit random permutation, or a Format-Preserving Encryption (FPE) mode as specified in <xref target="NIST-SP-800-38G"/>.</t>
      </section>
    </section>
    <section anchor="non-deterministic-encryption">
      <name>Non-Deterministic Encryption</name>
      <t>Non-deterministic encryption leverages a tweakable block cipher together with a random tweak. For implementation details, see <xref target="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. This allows the same tweak to be used for decryption.</t>
      </section>
      <section anchor="decryption-process">
        <name>Decryption Process</name>
        <t>The decryption process consists of the following steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Split the ciphertext into the tweak and the encrypted IP</t>
          </li>
          <li>
            <t>Decrypt the encrypted IP using the key and the tweak</t>
          </li>
          <li>
            <t>Convert the resulting 16-byte representation back to an IP address</t>
          </li>
        </ol>
        <t>Although the tweak is generated uniformly at random, 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><strong><tt>ipcrypt-nd</tt>:</strong> Uses the KIASU-BC tweakable block cipher with an 8-byte (64-bit) tweak. See <xref target="KIASU-BC"/> for details.</t>
          </li>
          <li>
            <t><strong><tt>ipcrypt-ndx</tt>:</strong> Uses the AES-XTS tweakable block cipher with a 16-byte (128-bit) tweak. See <xref target="XTS-AES"/> for background.</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>For test vectors, see <xref target="ipcrypt-nd-test-vectors"/> and <xref target="ipcrypt-ndx-test-vectors"/>.</t>
        <section anchor="ipcrypt-nd">
          <name>ipcrypt-nd (KIASU-BC)</name>
          <t>The <tt>ipcrypt-nd</tt> instantiation uses the KIASU-BC tweakable block cipher with an 8-byte (64-bit) tweak. For implementation details, see <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. By rotating keys regularly, secure usage can be extended well beyond these bounds. The effective security is determined by the underlying block cipher’s strength.</t>
          <t>For test vectors, see <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>As with <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>
          <ul spacing="normal">
            <li>
              <t><strong>Deterministic (<tt>ipcrypt-deterministic</tt>):</strong>
Produces a 16-byte output; preserves format but reveals repeated inputs.</t>
            </li>
            <li>
              <t><strong>Non-Deterministic:</strong>
              </t>
              <ul spacing="normal">
                <li>
                  <t><strong><tt>ipcrypt-nd</tt> (KIASU-BC):</strong> Produces a 24-byte output using an 8-byte tweak; <tt>(input, tweak)</tt> collisions reveal repeated inputs (with the same tweak) but not their values. Expected collision after approximately 4 billion operations per key.</t>
                </li>
                <li>
                  <t><strong><tt>ipcrypt-ndx</tt> (AES-XTS):</strong> Produces a 32-byte output using a 16-byte tweak; supports higher secure operation counts per key. Expected collision after 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 the use of uniformly random tweaks for non-deterministic encryption, implementers may consider alternative approaches:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Monotonic Counter:</strong> 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><strong>UUIDs:</strong> 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 is a concern with random tweaks, the use of random tweaks remains the recommended and most practical approach, offering the best tradeoffs for most real-world use cases.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The ipcrypt constructions focus solely on confidentiality and do not provide integrity. This means that IP addresses in an ordered sequence can be partially removed, duplicated, reordered, or blindly altered by an active adversary. Applications that require sequences of encrypted IP addresses that cannot be modified must apply an authentication scheme over the entire sequence, such as an HMAC construction, a keyed hash function, or a public key signature. This is outside the scope of this specification, but implementers should be aware that additional authentication mechanisms are required if protection against active adversaries is needed.</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 makes deterministic encryption suitable for applications where format preservation is required, but linkability of repeated inputs is acceptable.</t>
      </section>
      <section anchor="non-deterministic-mode-security">
        <name>Non-Deterministic Mode Security</name>
        <t>The inclusion of a random tweak ensures that encrypting the same input generally produces different outputs. In cases where an <tt>(input, tweak)</tt> collision occurs, an attacker learns only that the same input was processed with that tweak, not the value of the input itself.</t>
        <t>Security is determined by the underlying block cipher (≈2^128 for AES-128) on a per-key basis. Key rotation is recommended to extend secure usage beyond the per-key collision bounds.</t>
      </section>
      <section anchor="implementation-security">
        <name>Implementation Security</name>
        <t>Implementations MUST ensure that:</t>
        <ol spacing="normal" type="1"><li>
            <t>Keys are generated using a cryptographically secure random number generator</t>
          </li>
          <li>
            <t>Tweak values are uniformly random for non-deterministic modes</t>
          </li>
          <li>
            <t>Side-channel attacks are mitigated through constant-time operations</t>
          </li>
          <li>
            <t>Error handling does not leak sensitive information</t>
          </li>
        </ol>
      </section>
      <section 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>
      <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="nondeterministic-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="nondeterministic-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>For a diagram of this conversion process, see <xref target="ipv4-address-conversion-diagram"/>.</t>
        <sourcecode type="pseudocode"><![CDATA[
function IPv4To16Bytes(ipv4_address):
    // Split the IPv4 address into its octets
    parts = ipv4_address.split(".")
    if length(parts) != 4:
         raise Error("Invalid IPv4 address")
    // Create a 16-byte array with the IPv4-mapped prefix
    bytes16 = [0x00] * 10         // 10 bytes of 0x00
    bytes16.append(0xFF)          // 11th byte: 0xFF
    bytes16.append(0xFF)          // 12th byte: 0xFF
    // Append each octet (converted to an 8-bit integer)
    for part in parts:
         bytes16.append(int(part))
    return bytes16
]]></sourcecode>
        <t><em>Example:</em> For <tt>"192.0.2.1"</tt>, the function returns</t>
        <artwork><![CDATA[
[00, 00, 00, 00, 00, 00, 00, 00, 00, 00, FF, FF, C0, 00, 02, 01]
]]></artwork>
      </section>
      <section anchor="ipv6-address-conversion">
        <name>IPv6 Address Conversion</name>
        <sourcecode type="pseudocode"><![CDATA[
function IPv6To16Bytes(ipv6_address):
    // Parse the IPv6 address into eight 16-bit words.
    words = parseIPv6(ipv6_address)  // Expands shorthand notation and returns 8 words
    bytes16 = []
    for word in words:
         high_byte = (word >> 8) & 0xFF
         low_byte = word & 0xFF
         bytes16.append(high_byte)
         bytes16.append(low_byte)
    return bytes16
]]></sourcecode>
        <t><em>Example:</em> For <tt>"2001:0db8:85a3:0000:0000:8a2e:0370:7334"</tt>, the output is the corresponding 16‑byte sequence.</t>
      </section>
      <section anchor="conversion-from-a-16-byte-array-to-an-ip-address">
        <name>Conversion from a 16-Byte Array to an IP Address</name>
        <sourcecode type="pseudocode"><![CDATA[
function Bytes16ToIP(bytes16):
    if length(bytes16) != 16:
         raise Error("Invalid byte array")

    // Check for the IPv4-mapped prefix
    if bytes16[0:10] == [0x00]*10 and bytes16[10] == 0xFF and bytes16[11] == 0xFF:
         ipv4_parts = []
         for i from 12 to 15:
             ipv4_parts.append(str(bytes16[i]))
         ipv4_address = join(ipv4_parts, ".")
         return ipv4_address
    else:
         words = []
         for i from 0 to 15 step 2:
             word = (bytes16[i] << 8) | bytes16[i+1]
             words.append(format(word, "x"))
         ipv6_address = join(words, ":")
         return ipv6_address
]]></sourcecode>
      </section>
      <section anchor="deterministic-encryption-ipcrypt-deterministic">
        <name>Deterministic Encryption (ipcrypt-deterministic)</name>
        <sourcecode type="pseudocode"><![CDATA[
function ipcrypt_deterministic_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 = convertTo16Bytes(ip_address)
    ciphertext = AES128_encrypt(key, bytes16)
    encrypted_ip = Bytes16ToIP(ciphertext)
    return encrypted_ip

function ipcrypt_deterministic_decrypt(encrypted_ip, key):
    if length(key) != 16:
        raise Error("Key must be 16 bytes")

    bytes16 = convertTo16Bytes(encrypted_ip)
    plaintext = AES128_decrypt(key, bytes16)
    original_ip = Bytes16ToIP(plaintext)
    return original_ip
]]></sourcecode>
      </section>
      <section anchor="non-deterministic-encryption-using-kiasu-bc-ipcrypt-nd">
        <name>Non-Deterministic Encryption using KIASU-BC (ipcrypt-nd)</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 = convertTo16Bytes(ip_address)

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

    // Step 4: Concatenate tweak and ciphertext
    result = concatenate(tweak, ciphertext)  // 8 bytes || 16 bytes = 24 bytes total
    return result

function ipcrypt_nd_decrypt(ciphertext, key):
    // Step 1: Split ciphertext into tweak and encrypted IP
    tweak = ciphertext[0:8]  // First 8 bytes
    encrypted_ip = ciphertext[8:24]  // Remaining 16 bytes

    // Step 2: Decrypt using key and tweak
    bytes16 = KIASU_BC_decrypt(key, tweak, encrypted_ip)

    // Step 3: Convert back to IP address
    ip_address = Bytes16ToIP(bytes16)
    return ip_address
]]></sourcecode>
      </section>
      <section anchor="non-deterministic-encryption-using-aes-xts-ipcrypt-ndx">
        <name>Non-Deterministic Encryption using AES-XTS (ipcrypt-ndx)</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
]]></sourcecode>
        <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 = convertTo16Bytes(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

function ipcrypt_ndx_decrypt(ciphertext, key):
    // Step 1: Split ciphertext into tweak and encrypted IP
    tweak = ciphertext[0:16]  // First 16 bytes
    encrypted_ip = ciphertext[16:32]  // Remaining 16 bytes

    // Step 2: Decrypt using key and tweak
    bytes16 = AES_XTS_decrypt(key, tweak, encrypted_ip)

    // Step 3: Convert back to IP address
    ip_address = Bytes16ToIP(bytes16)
    return ip_address
]]></sourcecode>
      </section>
      <section 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><strong>SubBytes:</strong> Apply the AES S-box to each byte of the state</t>
            </li>
            <li>
              <t><strong>ShiftRows:</strong> Rotate each row of the state matrix</t>
            </li>
            <li>
              <t><strong>MixColumns:</strong> Mix the columns of the state matrix (except in the final round)</t>
            </li>
            <li>
              <t><strong>AddRoundKey:</strong> XOR the state with the round key and padded tweak</t>
            </li>
          </ol>
          <t>For details about these operations, see <xref target="FIPS-197"/>.</t>
        </section>
        <section anchor="key-schedule">
          <name>Key Schedule</name>
          <t>The key schedule follows the standard AES-128 key expansion:</t>
          <ol spacing="normal" type="1"><li>
              <t>The initial key is expanded into 11 round keys</t>
            </li>
            <li>
              <t>Each round key is XORed with the padded tweak before use</t>
            </li>
            <li>
              <t>The first round key is used in the initial AddRoundKey operation</t>
            </li>
          </ol>
        </section>
        <section anchor="implementation-steps">
          <name>Implementation Steps</name>
          <ol spacing="normal" type="1"><li>
              <t><strong>Key Expansion:</strong>
              </t>
              <ul spacing="normal">
                <li>
                  <t>Expand the 16-byte key into 11 round keys using the standard AES key schedule</t>
                </li>
                <li>
                  <t>Each round key is 16 bytes</t>
                </li>
              </ul>
            </li>
            <li>
              <t><strong>Tweak Processing:</strong>
              </t>
              <ul spacing="normal">
                <li>
                  <t>Pad the 8-byte tweak to 16 bytes as described above</t>
                </li>
                <li>
                  <t>XOR the padded tweak with each round key before use</t>
                </li>
              </ul>
            </li>
            <li>
              <t><strong>Encryption Process:</strong>
              </t>
              <ul spacing="normal">
                <li>
                  <t>Perform initial AddRoundKey with the first tweaked round key</t>
                </li>
                <li>
                  <t>For rounds 1-9:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>SubBytes</t>
                    </li>
                    <li>
                      <t>ShiftRows</t>
                    </li>
                    <li>
                      <t>MixColumns</t>
                    </li>
                    <li>
                      <t>AddRoundKey (with tweaked round key)</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>For round 10 (final round):
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>SubBytes</t>
                    </li>
                    <li>
                      <t>ShiftRows</t>
                    </li>
                    <li>
                      <t>AddRoundKey (with tweaked round key)</t>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
          </ol>
        </section>
        <section anchor="example-implementation">
          <name>Example Implementation</name>
          <t>The following pseudocode illustrates the core operations of KIASU-BC:</t>
          <sourcecode type="pseudocode"><![CDATA[
function pad_tweak(tweak):
    // Input: 8-byte tweak
    // Output: 16-byte padded tweak
    padded = [0] * 16
    for i in range(0, 8, 2):
        padded[i*2] = tweak[i]
        padded[i*2+1] = tweak[i+1]
    return padded

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

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

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

    // Main rounds
    for round in range(1, 10):
        state = sub_bytes(state)
        state = shift_rows(state)
        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:
- <tt>ipcrypt-deterministic</tt>: Key: 16 bytes (128 bits), no tweak
- <tt>ipcrypt-nd</tt>: Key: 16 bytes (128 bits), Tweak: 8 bytes (64 bits)
- <tt>ipcrypt-ndx</tt>: Key: 32 bytes (256 bits, two AES-128 keys), Tweak: 16 bytes (128 bits)</t>
        </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 the Independent Submissions Editor in judging whether the specification is suitable for publication.</t>
      <t>Please note that the listing of any individual implementation here does not imply endorsement. Furthermore, no effort has been spent to verify the information presented here that was supplied by contributors. This is not intended as, and must not be construed to be, a catalog of available implementations or their features.</t>
      <t>Multiple interoperable implementations of the schemes described in this document have been developed:</t>
      <ul spacing="normal">
        <li>
          <t>C implementation</t>
        </li>
        <li>
          <t>D implementation</t>
        </li>
        <li>
          <t>Go implementation</t>
        </li>
        <li>
          <t>Java implementation (maven package)</t>
        </li>
        <li>
          <t>JavaScript/TypeScript implementation (npm package)</t>
        </li>
        <li>
          <t>PHP implementation (Composer package)</t>
        </li>
        <li>
          <t>Python reference implementation</t>
        </li>
        <li>
          <t>Rust implementation (cargo package)</t>
        </li>
        <li>
          <t>Zig implementation</t>
        </li>
        <li>
          <t>Dart implementation (pub.dev package)</t>
        </li>
      </ul>
      <t>A comprehensive list of implementations and their test results can be found 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="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="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="RFC7624">
          <front>
            <title>Confidentiality in the Face of Pervasive Surveillance: A Threat Model and Problem Statement</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="B. Schneier" initials="B." surname="Schneier"/>
            <author fullname="C. Jennings" initials="C." surname="Jennings"/>
            <author fullname="T. Hardie" initials="T." surname="Hardie"/>
            <author fullname="B. Trammell" initials="B." surname="Trammell"/>
            <author fullname="C. Huitema" initials="C." surname="Huitema"/>
            <author fullname="D. Borkmann" initials="D." surname="Borkmann"/>
            <date month="August" year="2015"/>
            <abstract>
              <t>Since the initial revelations of pervasive surveillance in 2013, several classes of attacks on Internet communications have been discovered. In this document, we develop a threat model that describes these attacks on Internet confidentiality. We assume an attacker that is interested in undetected, indiscriminate eavesdropping. The threat model is based on published, verified attacks.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7624"/>
          <seriesInfo name="DOI" value="10.17487/RFC7624"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC4291">
          <front>
            <title>IP Version 6 Addressing Architecture</title>
            <author fullname="R. Hinden" initials="R." surname="Hinden"/>
            <author fullname="S. Deering" initials="S." surname="Deering"/>
            <date month="February" year="2006"/>
            <abstract>
              <t>This specification defines the addressing architecture of the IP Version 6 (IPv6) protocol. The document includes the IPv6 addressing model, text representations of IPv6 addresses, definition of IPv6 unicast addresses, anycast addresses, and multicast addresses, and an IPv6 node's required addresses.</t>
              <t>This document obsoletes RFC 3513, "IP Version 6 Addressing Architecture". [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4291"/>
          <seriesInfo name="DOI" value="10.17487/RFC4291"/>
        </reference>
        <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="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>
      </references>
    </references>
    <?line 797?>

<section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This appendix provides test vectors for all three variants of ipcrypt. Each test vector includes the key, input IP address, and encrypted output. For non-deterministic variants (<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>
        <artwork><![CDATA[
# Test vector 1
Key:          0123456789abcdeffedcba9876543210
Input IP:     0.0.0.0
Encrypted IP: bde9:6789:d353:824c:d7c6:f58a:6bd2:26eb

# Test vector 2
Key:          1032547698badcfeefcdab8967452301
Input IP:     255.255.255.255
Encrypted IP: aed2:92f6:ea23:58c3:48fd:8b8:74e8:45d8

# Test vector 3
Key:          2b7e151628aed2a6abf7158809cf4f3c
Input IP:     192.0.2.1
Encrypted IP: 1dbd:c1b9:fff1:7586:7d0b:67b4:e76e:4777
]]></artwork>
      </section>
      <section anchor="ipcrypt-nd-test-vectors">
        <name>ipcrypt-nd Test Vectors</name>
        <artwork><![CDATA[
# Test vector 1
Key:          0123456789abcdeffedcba9876543210
Input IP:     0.0.0.0
Tweak:        08e0c289bff23b7c
Output:       08e0c289bff23b7cb349aadfe3bcef56221c384c7c217b16

# Test vector 2
Key:          1032547698badcfeefcdab8967452301
Input IP:     192.0.2.1
Tweak:        21bd1834bc088cd2
Output:       21bd1834bc088cd2e5e1fe55f95876e639faae2594a0caad

# Test vector 3
Key:          2b7e151628aed2a6abf7158809cf4f3c
Input IP:     2001:db8::1
Tweak:        b4ecbe30b70898d7
Output:       b4ecbe30b70898d7553ac8974d1b4250eafc4b0aa1f80c96
]]></artwork>
      </section>
      <section anchor="ipcrypt-ndx-test-vectors">
        <name>ipcrypt-ndx Test Vectors</name>
        <artwork><![CDATA[
# Test vector 1
Key:          0123456789abcdeffedcba98765432101032547698badcfeefcdab8967452301
Input IP:     0.0.0.0
Tweak:        21bd1834bc088cd2b4ecbe30b70898d7
Output:       21bd1834bc088cd2b4ecbe30b70898d782db0d4125fdace61db35b8339f20ee5

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

# Test vector 3
Key:          2b7e151628aed2a6abf7158809cf4f3c3c4fcf098815f7aba6d2ae2816157e2b
Input IP:     2001:db8::1
Tweak:        21bd1834bc088cd2b4ecbe30b70898d7
Output:       21bd1834bc088cd2b4ecbe30b70898d76089c7e05ae30c2d10ca149870a263e4
]]></artwork>
        <t>For non-deterministic variants (<tt>ipcrypt-nd</tt> and <tt>ipcrypt-ndx</tt>), the tweak values shown are examples. In practice, 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 author gratefully acknowledges the contributions and insightful comments from members of the IETF and the broader cryptographic community that have helped shape this specification.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
756kbuP/AtSgch8fjQAA

-->

</rfc>
