<?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-06" 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-06"/>
    <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 from third parties without key access, addressing data minimization concerns raised in <xref target="RFC6973"/>.</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 when sharing data with third parties. 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-and-limitations"/>).</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 to third parties in logs, analytics data, and network measurements (<xref target="RFC6973"/>). Note that protection is specifically against parties without key access; the key holder retains full decryption capability.</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 the original values to third-party processors. Note that network hierarchy and geographic relationships are not preserved.</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-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><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-and-limitations">
        <name>Format Preservation and Limitations</name>
        <section anchor="network-hierarchy-preservation">
          <name>Network Hierarchy Preservation</name>
          <t>The encryption methods described in this specification do not preserve network hierarchy or prefix relationships.</t>
          <ul spacing="normal">
            <li>
              <t>IPv4 and IPv6 prefixes are completely scrambled in the encrypted output</t>
            </li>
            <li>
              <t>Addresses from the same subnet will not appear related after encryption</t>
            </li>
            <li>
              <t>Geographic or topological proximity cannot be inferred from encrypted addresses</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 use one of the following approaches:
- A 32-bit block cipher
- A Format-Preserving Encryption (FPE) mode as specified in <xref target="NIST-SP-800-38G"/></t>
        </section>
      </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="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>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:</t>
          <ul spacing="normal">
            <li>
              <t><tt>ipcrypt-deterministic</tt>: Key: 16 bytes (128 bits), no tweak</t>
            </li>
            <li>
              <t><tt>ipcrypt-nd</tt>: Key: 16 bytes (128 bits), Tweak: 8 bytes (64 bits)</t>
            </li>
            <li>
              <t><tt>ipcrypt-ndx</tt>: Key: 32 bytes (256 bits, two AES-128 keys), Tweak: 16 bytes (128 bits)</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 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 independent, 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="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="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 811?>

<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. Special thanks to Tobias Fiebig for his thorough review of this draft.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
