<?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-03" category="info" 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-03"/>
    <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 117?>

<t>This document specifies methods for encrypting and obfuscating IP addresses, providing both deterministic format-preserving and non-deterministic constructions. These methods address privacy concerns raised in <xref target="RFC6973"/> and <xref target="RFC7258"/> regarding pervasive monitoring and data collection.</t>
      <t>The methods apply uniformly to both IPv4 and IPv6 addresses by converting them into a 16-byte representation. Two generic constructions are defined—one using a 128-bit block cipher and the other using a 128-bit tweakable block cipher—along with three concrete instantiations:</t>
      <ul spacing="normal">
        <li>
          <t><strong><tt>ipcrypt-deterministic</tt>:</strong> Deterministic encryption using AES-128 as a single-block operation.</t>
        </li>
        <li>
          <t><strong><tt>ipcrypt-nd</tt>:</strong> Non-deterministic encryption using the KIASU-BC tweakable block cipher with an 8-byte tweak.</t>
        </li>
        <li>
          <t><strong><tt>ipcrypt-ndx</tt>:</strong> Non-deterministic encryption using the AES-XTS tweakable block cipher with a 16-byte tweak.</t>
        </li>
      </ul>
      <t>Deterministic mode produces a 16-byte ciphertext enabling format preservation. Non-deterministic modes prepend a randomly sampled tweak to produce larger ciphertexts that resist correlation attacks. When generated, tweaks MUST be uniformly random as specified in <xref target="RFC4086"/>.</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 129?>

<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>The main motivations include:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Privacy Protection:</strong> Encrypting IP addresses prevents the disclosure of user-specific information when data is logged or measured, as discussed in <xref target="RFC6973"/>.</t>
          </li>
          <li>
            <t><strong>Format Preservation:</strong> Ensuring that the encrypted output remains a valid IP address allows network devices to process the data without modification. See <xref target="format-preservation"/> for details.</t>
          </li>
          <li>
            <t><strong>Mitigation of Correlation Attacks:</strong> Deterministic encryption reveals repeated inputs; non-deterministic modes use a random tweak to obscure linkability while keeping the underlying input confidential. See <xref target="non-deterministic-encryption"/> for implementation details.</t>
          </li>
          <li>
            <t><strong>Privacy-Preserving Analytics:</strong> Many common operations like counting unique clients or implementing rate limiting can be performed using encrypted IP addresses without ever accessing the original values. This enables privacy-preserving analytics while maintaining functionality.</t>
          </li>
          <li>
            <t><strong>Third-Party Service Integration:</strong> IP addresses are private information that should not be sent in cleartext to potentially untrusted third-party services or cloud providers. Using encrypted IP addresses as keys or identifiers allows integration with external services while protecting user privacy.</t>
          </li>
        </ul>
        <t>For implementation examples, see <xref target="pseudocode-and-examples"/>.</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="pseudocode-and-examples"/>.</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="pseudocode-and-examples"/>.</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>
    <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>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t><em>This note is to be removed before publishing as an RFC.</em></t>
      <t>Multiple implementations of the schemes described in this document have been developed and verified for interoperability. A comprehensive list of known implementations and integrations can be found at https://github.com/ipcrypt-std/draft-denis-ipcrypt, which includes reference implementations closely aligned with the pseudocode provided in this document.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document does not require any IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="FIPS-197" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197.pdf">
          <front>
            <title>Advanced Encryption Standard (AES)</title>
            <author initials="" surname="NIST">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date year="2001" month="November" day="26"/>
          </front>
          <seriesInfo name="FIPS" value="PUB 197"/>
        </reference>
        <reference anchor="NIST-SP-800-38G" target="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38G.pdf">
          <front>
            <title>Recommendation for Block Cipher Modes of Operation: Methods for Format-Preserving Encryption</title>
            <author initials="" surname="NIST">
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date year="2016" month="March"/>
          </front>
          <seriesInfo name="NIST" value="SP 800-38G"/>
        </reference>
        <reference anchor="RFC6973">
          <front>
            <title>Privacy Considerations for Internet Protocols</title>
            <author fullname="A. Cooper" initials="A." surname="Cooper"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="B. Aboba" initials="B." surname="Aboba"/>
            <author fullname="J. Peterson" initials="J." surname="Peterson"/>
            <author fullname="J. Morris" initials="J." surname="Morris"/>
            <author fullname="M. Hansen" initials="M." surname="Hansen"/>
            <author fullname="R. Smith" initials="R." surname="Smith"/>
            <date month="July" year="2013"/>
            <abstract>
              <t>This document offers guidance for developing privacy considerations for inclusion in protocol specifications. It aims to make designers, implementers, and users of Internet protocols aware of privacy-related design choices. It suggests that whether any individual RFC warrants a specific privacy considerations section will depend on the document's content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6973"/>
          <seriesInfo name="DOI" value="10.17487/RFC6973"/>
        </reference>
        <reference anchor="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="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="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>
      </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="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="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 375?>

<section anchor="diagrams">
      <name>Diagrams</name>
      <t>This appendix provides visual representations of the key operations described in this document. For implementation details, see <xref target="pseudocode-and-examples"/>.</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="pseudocode-and-examples">
      <name>Pseudocode and Examples</name>
      <t>This appendix provides detailed pseudocode for key operations described in this document. For a visual representation of these operations, see <xref target="diagrams"/>.</t>
      <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>
    <section anchor="implementing-kiasu-bc">
      <name>Implementing KIASU-BC</name>
      <t>This appendix provides a detailed guide for implementing the KIASU-BC tweakable block cipher. 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>
      </section>
    </section>
    <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>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 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 randomly generated for each encryption operation.</t>
        <t>Implementations SHOULD verify their correctness against these test vectors before deployment.</t>
      </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 anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author gratefully acknowledges the contributions and insightful comments from members of the IETF independent stream community and the broader cryptographic community that have helped shape this specification.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA91925LbRpbgO78iR4rYJdUkiwSvRY8mtlQqtattSTWqkt0d
CnU5ASRJtECADYB1adsd87Yz+7YRu3+0X9JfsueSCSRAgFWy3d6elS8igbyc
PPdz8mSy1+u1siAL1UI8ea2ydeynYhkn4vxCnPh+otJUnEVecr/NgjgSMvLF
W3e5Sz2J35+0pOsm6gb6Bltq9KTlx14kNzCcn8hl1vNVFKQ9/bY3GLWgp1rF
yf1CBNEybgXbZCGyZJdmzmBwPHBan9T9bZz4C3EeZSqJVNZ7iQO15A6ASxYt
IXqCJ3jyKpHRJ/ESZ3gCz4WIk5WMgr8QbPhepll4DwN5fX6vNjIIF2Lpq/82
GCz7MHjLB3CgqTNwJk9asJBRK81gldcyjCN4ca/SVrqRSXb9512cqZSfbIOF
+JDFXlekcZIlapnCp/sNfvjYakVxsgEQbhQC++r84rI3PJ4tCACD6RP/Rkae
8m3cXuK8MvFF++TsssMAF4vGPz1AGUDw5vzySj+hJcMTWrEMYakpTLHLlIiX
+YApke1KeesoDuPVPfXldQPOh73hsOdM6WGqkkClSBczJYK/EBfvXwhYAy9B
JiuVLcQ6y7bp4ugougm3OzftAxGy/iq+OcIP+OQI+x4hsH381IcB+lt/CYPg
s97lRW8+GPRG89+WUfNOefFmowBywgry4osw9j6J02C7Vol4HfsqxeW93apE
U9pm3FeE/d4FsK5KboJoZeH410LqcIqcXo9RnGghLi+EXv1nIvVyq7xAhhc7
NwxYCFPG8eVFX49IWG7hnBYfvjx7+/s/XPZenJax/VLFd/cpPhYn4stgtQZ5
uVTeLlHi6lbJT9INVQn/B1D4u774nZJR+eF5X7wJPsVh8H/+e/nFVV9cqPsk
iMqYGzeg7RRJSJgW6gJ6ZeIk8da4OHEhgROo79HYqWdStcUu/UB6SR+Ie2Q1
vvzq/M2bP5SxcrVW+rl4JTcB4AQob2OBqR9kqfg6vu19DcBH3r34RiaBBMhe
n7y5Or88gKnTvnihApWEqvz8BJ4Hyf3uU3xTfvE1IisxyLLbv/fjGxV9issv
vumLbxQwyHpvpH/ti29ltKqwaxPS3/3h4uqt1eQReJ0eTacDaPz1u29BuzgV
xNbyVHoAVa/74usg3VvGu754B8RPs/Ljl7i6VaSSso5zmrQbGAhxGS+zWwkM
X+gJq1N1xbe3t30v7bsq+aRCdd9X/u7or768PdoiF6ZHGa6wRwPFA0crvPOz
s7PexXA6PC6jA58Xeh+1F7P5KpHbdeCJiwRsjkd6EBjwpcykgI+Eut5bWAxY
SB/6x4lcKbCDN4GnDuESpysjZtYbOr3hvAE92H4hEOwetq3FR2r0YT9QShET
4Icj7AXsMB4eQbcXxAuT8uJ/oqJ+jbIThkCw8vML4Ih4JW/l/aNYYvIgy+sm
DQyw83x5E6RM/4QnNjyQgqJWmab9V+cnl+/39C4JAmuRr9R9umfmAPAMlNDV
t2cnX52BFkrA4wG36NM/tvqdj4aPV7/c+PdXlz3wd/b1r35B9p7Q8xLUwONY
BDDxIpTep/LTsz5I0G0aVzB02Re/3amk+rjCTjmCBo+WlfML4qWKBtSesLNA
D1tqD1vlqzqKC+9aZHEcHljmqz77viUAnXquXQXZeuf2wbU6+pPyg9TLhkcG
lFar1+sJ6aZZIr2s1bpaB6kAN34HXlgmUnQ4lrBasbG8LAMxSC3ycA41fC/W
pcAt3ibxTeDjczfO1sJX4NRvAnRnQL+xh9LbFioAB4viqFdu54GXAzECacK0
L4A9UpWDY5AIPHYjwQpDYw8Ch1QkMkhBPwaR+P77f3r36nR6PBv9+CNNwQ9m
zmQODxK1AgWGswMj38gUuFps4igAvWpA8lH1enEYsjbuI5IsCLZbcBF2UYDr
gU9ZzIs9v7gZU3f4MC2QIlwC8kYlhC+Q8w0ACZ0k8E/PvQdHM1GEkygjRoAV
38ZipUCJVZEh0HD5ahlEyv/bv/0viFnELiWoxdCZ99wgEy6pFY+9Z4QGFQuA
B9+qTbPcPNudYFyMhlbiFpgIeidKEZIToBFyIliALGBXdAG8JJ49+87EeyUy
frd49gw41iZswfgaFpB4MElzIWFlAp+EqsewxMbd75eniHwa980e0+yNjes2
2rhhqbxEGYk504Fa7U149zkz4opAlx2eMCe8nrBVRtMGdSBIkr8DA2+15jEy
dZfB3DA2zskyJbRMaf7Zh3VDYRS02kKoBUNCKO3HyLyp3GxDEBuCBFlZzytC
VCmJNWcK64OZYCIYEjgiSVTIiktmGahfkNRv1ypixgX15Hd50FS8fn95JVxl
iQxPj2Q3+sYS3PFgPv3xxz7rqU3g++A3t55igoBAwykfp7WQHqqczbD1LfhY
tvKiLiTIOe9BNLgD1YMdjbopIxrVQuz+CdUEaBGACBBIpFEiUhlacD1YnIBy
xK4S7KjCL/ag0r+JMVFC/dM1CnmMwivD+78o1ka36yAkpiAPEQgP6iINaFqj
EfMQUGssAIcgKFbYqCtnU2dcUo3Qchn4CiU9DLJ7bInYXEqPwuJCc6a75EYF
4KDByIyPFONJ7APAblHpcfyelbU46jGwS7sU4QAlE+9W63gHOqlEV0RSutts
INL6i4HXjN9DzQgwMqlS4pinT8V7mOVU4mqx8+sYUMQNtBKXMMimeApjeuHO
V1qVXWiKFK44yv5ZYf5KHAPMANEYSQYvJ4xTjKVhucA3SU+zpWeTBigJQkI0
hZWCi7WChQG1N0piX5AakIoCNRVz1mcw2ZkWFxYzMpwwBGsimdnsj1Pssu0O
xRcxgFrlBijr226JDMP4Ns0Z1+cAQ+sED1vQMokbQY0htUCt4Pq0NFyCpfj+
+7KVp1fAWihcoJJkEKZ6Da+Be1e5JJ5a+uSE9clB+4GYl2GKplOhsgFEwfLS
L2rcCdZ9JMhG8eTaLnZTyn6ALgVtHRCvs6h9UmprlPouAjYL7/ErTVMSD7Pu
vYl7BbgaAQHq2o2x8xV8aNazI6QT1AAwEqHitYzQkdhsEGFGQwEHBZ/QPu8i
Yk9QsX/ewfcwIL6058TXqJehxyagbx5YPlDLMBbSDHDIZqzgmRKzG5oD4kE3
ecgQBj/gOa0C1JbAUztFLluQakWYe2plv08vTCMbeRJwEZFF20UeK18ghsYN
jJf4vQuZZJivSpAxKWG8SnLeL8GK6oWmJZelkD2SixSWEaLfmeHq0e1CKfNC
0M1kW5HhQfqJuOToUb6a1BRCsSUoUoaCUAxiv/O16wu6vQ866AAeQbw/YQyI
tCEWAruV5NIXFKtiZwEgApUNuM1n3DMFqGsMlgFhr/Y5Td2Rmce8NfHqNlU7
ULIgGD0QiJ55zTpUXBEPc56TlCbAi6YE9PYTtOVPuvy3ePOWPr87+9f35+/O
XuLnyy9Pvv46/2BaXH759v3XL4tPRc/Tt69fn715yZ3hqag8en3yhydsLJ+8
vbg6f/vm5OsnbI1KdgLojW64IvwlW/RVfVKkKvWSwGVF+uL0QgzHWp/OhzM0
eaiNefw4Cu/1V+Dpe3TzgSOwH5AGZGUbZKBwSD0DB91GAuy4IkNbb7y6bDFj
pCsJCmCVjRJFA5F26DGY0Man2IRBhj6JOKKg3ZkioOBVUQRguUzO8RCJh6OA
t/gCvcV3paCCRhTL4E75vVBFK+CsctSBXOQXPhBN3b4JJH3qbRAbHNl0amIc
npmyHDwRKMO//dv/BFMNlOhiu0D7U6w/KfppcJFJRpe7hEIW1tdg/Nn4sBHj
2cqmwcrmWQbbiLwMIbJPC58axwLPt+RS49KlWIFTE2kocZ3A+jwd+tSfM2U+
F1jIJXAKcKntSxv/lKDg6fwdMTE+Jack1aaxyVtnuNrn2LnL+fsO2NEwDNKc
4KkHWjgJYmRslJHyjEFqKSkd7ukGPAMrcmNrc6+Ce99Ky/y68AA1av76v6Zs
DUijWNuLpxQKp4UTn+qUpxFVpo6XN9vz05F5gDLLBCOI5hgax7ZGCdCzQaMl
EwrZ2YQqKxzW/AdtD4Xz7GWeWgE9R/LA7jVih42f8ggnZoRWq5IgQO0V0dYN
kBjDYRe3GnBqfKNzB4BjP0gAV2iSyL4YR42WD9oZYG+7wQrcDj+QUacputKq
onV9xlp/cd1q/fWvf23ZQC4wqYS7hYuB784X84kcLQbwh/83l45aDEazwWI2
Go1bDQpHfHAGYjAUA2COuZhPhByJwaD4dy6Fo8RgJGYDMRuJ0fgjgWEQNq4g
bGwhrD1yCEcdQpDWTUUMXtVYJkg+hJBFjoRxCQnDY6c/6Dv9YfMy7UXt//vq
Ff57yl8dQEi+TJuJCmaumYM53hIitsoWc8twBT5Ytt4gm8tUWx3Mzwz7AukM
5oLNUZBA8D50iGlMXNYgQy2nL86XbAwBfd56D7nQGiyKaA8HxXiDO1goz49q
4R4evHrVpf93KKPZ461+tNE0YIi7MmM9ACaCtN0rwlowqRnwP3jXXrABGwJ6
hgEc9cVbNBO3EM3Wjj2cVsed2uN64ONEvTW4P3tDg9L6rc7AndoZOKO0dGRn
HHm0x6CZ7LxdaWunlMVjsoCl1oqntOFtzwY6nFf1XoeCjQmoNvt1zfFHhwfi
XXSkVJRn3HLykxnmdkY35Bm6LGE9T5k6GGSzM4hy7KXU7/iJ9tWL087hpe3H
bfvLOxxi6SWeQGiyRf2Jtrtr/Az28SSE2WABVoqbohRxKLgBD782RXVbSmlx
t3cKg0ktO4W1RJwWxp7jUWBdQDYaRojcwCXYAKdWkyut1jcUisdbdgmX1ait
0VXSuYsuWV+yIjARhXfoI8TareStbXAHNBb5O+KL3ChTKVA0yB+ZNiaNWjSx
4et9CmS667newSiXR9LpUWugIs2qu++QPh3Q+WYYjI4o3PDWcUxRvO0pbpTS
CZhE/XkHFtKvzUBxuo0iNPBaYhfpzalMzFwJucKsCD4Kkc49JiiFBeSHlqXZ
JDxRSzT5hNWkrp2IBJ8/4MxuXdI+N/PaGazXzuQZRpZn1BcnYVhJ0OfBCMtY
tq+62g3J+66wU+4sPaWcONvegC0YcmavKeDVaQZQsfqtC8jTiwuSavLAsuMk
WuiAY5VPU2KHw6yyFOtMA6oreyej5O4XmVoNGKdNa4JnzcCPip2filp0ssFu
QHWZZkLBcDEEK0bzBlHz3ogw0blJsQM0xDq54Wsbf7KDA3Hk1xeXATJ9PkNF
p3cpx3OPWUiQby/LOZD9fjD+7ISbbNP+/kRXWMke9hpyu8vOmEY1gJiJG2B3
SpCXVUJZ02PLnm5JuEYvijdIf9Or+/Mb/fYHvWNbhCD01H7btgPtjvX28MjW
nx/2H908EjrtBSJGgWoviGq/5vwC+QDZQOuuKnbal+wlkEHv2G9/Hehyp/gt
Z7D/n1EHOIjz7g/Nb/z7miw9WuTzstNt6SRXrTA3b3Yl913trgBjYWQd3AyI
+YxPVvGRbRcaEwW5n0xDBGk1UVbxjjGvhQqStjNorJqNxm6hKQsbrTdltBr3
7j1QW7cy/ITf2iZdABrKKinA3HVo7UgUq859dXBYXUwQK7+DLt3IIbOpfbSS
6qIszqFiI9F+dXHW4U3W/YiwUqyqM6KHkj/i+6cH/dJW6+DWcYi6Fjye9EBG
LF6pzNo9tjcx2Db+LItlLeWCN3rYXFlAmg2gZbMdZsqnWR5UFpnPNFNbHfT8
VnvS1a0YU5pQ8rMo/Z5yeapuHe02LiBCO+RxgtFHLqJlOwMSi2mUhtgWQkej
7w74WIUvgkbWVFMQyK0xzYzbthEuqPBCcm9jb/MNQEIx0pE4+jyF8DPOeYTA
hAwsS+zSYkxLZaj5nqVvtmWLUXTeS28mVOITzpDned6S3/MUPdl6Pija5Xzw
KFpfgpebVd0uqnwpcGVQaruOSFMNy967gxQZlXkBCLkLScE0UNf4oSU3utU6
CXGja7W2wASU5jGgFSNKo4JA7XieTDnF7ZkUbAqu0j2+2dGGWcxb60iFIMnW
Prxz413kg+d+ufPWdj90rV0VBSu9XUw5GB6IuKsaZvZxt+C7dsCpYIK5810x
4H4G10oCYxr3YBaYoss8jtXb3Kom00veKIVvHITa+9iuAgbRpVPbvYAKaPkF
RGUZl5TR9hhGDbj3FflGBfDIrrqPmeoAg8Yfsa92D7TRRc4AAY8R5czGWgaB
Yw+mGoDULogmur8yk6xeKWDT5femCoZiTUE8XWGrtuqv+l3a2ofJu+J3l2/f
4AwECxko7NVzZUp2Pc5ANUN8zIGMnlsDm7v12Fv5yN+0/2tGy3MGWiMIO5eF
KHgBk0zHTBkInwMu38i7B6m9tqJegQJf4CvQPswMHsQcLOzVCLIvvoxv0YZ1
K1YoFXqvL9+l43gPwABcFTBwSQjvv4b3eXqd683OS+FstezHzrs9skRN14+9
T/U+w2dWiLWnY/Q8Osb48ta/GaRa51BbSJZP/XmlYm2dK6hMretm9cyo0VYJ
CgXg8VxvZHiSSjODpfEwyurMbC6VfMtqHqxPSa9SYJ5vShVDNafBkNEoL0fr
1NnuapERFZdvY6wdfjg6BEemHBLqSk8L3fsx41MrQIfWbUO4DjhxxfMfK+E6
8EwlRt/9QuzzsO/WkGjTpWesJQC5jkmgZ6BEw64x0KQiltUKR5IV7bf4VT6z
fIlW6x17XbTt2DDWfaBCOh4F2hr0Ao5Y2B3eU83VCvcgYyHkMsM6Ehf3zZ0/
AmKOnI54Dh9Hjl3e0gb9lMR3oNAy3B2DZQYweKkEpkPbFPKgASTbmXLsE/mB
LrZrsIbayymsocws1y6mKiq0p0YcqvudXLBcTM5W6pDx60PcX7F/iVrtQtSI
3bL909k0No0IogrDWqNIHKJADrk4MU+KogLVxo83aCoVTjb/wqLSLOGk0U8Q
yT2Ju6PTjqj1yhJ3ty9yd40y9zP1ZllwRs5BwSlX6j5ecBBVBk7LuaAh9a4L
Ad3Vm92brQ5ghbyJA1+77uBksHY008vQ24VaMvJ0NwQByx0wAc6FoRiIA1AT
C32pNNaW3cpy2EOmrbB6+a0IKaDSSOl0fEBKh3MBsGFUvyeq4F7rBEc1v/wY
/xXzB1mQF0fFO2tfpSSNlkea5t4oVYXBenhfCORFyxiFEone+ctLT1jC0pL0
HRKqVXyDB5hzkTKCg4g3mdYKnpw/4sMyekhiwM3byiRImWXoDGyrpuilKXnf
4d21i/0Scmb8L/IMuUnHko/fUFPZUP/Cc1SdK8umorNjgeCMbRBMxF+2Jl8c
YAJTh1IFT7RrYpaOXZACTqcpTDxr5PEHzYxhnf7+qkFX5XqtsmrMVO2vuiyH
X4h0t93GCaxlHayQ9zTP5ZNzgWcBwmPX0SiIxWJaT/kEMHLxaamimlWyXmXl
HMoSXHAQjTjEWQi+sitHp2hiIoDeddOVjVjTyTmKjZImmiptF7EyonoWSnyg
DvRyu4fVl1yXmagNSJzfFf6OIxj8nCjdkeIsPCKBuUYZZjSYi4CBI6rL5rF6
AoItCJ4b4zszfarDprr9LeoA4OmCUq6Jhka0G8VGH2fdAScCfvS+W+qtwa0T
qDN0kiOz5wPTiikBTsx++frktIT/Lm9uwxxrma7zilmd/NzSYXFSammwAlsF
rKRxjnnUx4V1vKdcyu/qullYoqQDtFxZV5T2VVa4Ud5agqrYsOItzNUyr11F
rtUbrxWi4PYoVWwpDHt1espWfXRO0DAuGBU7Cazz1mmxgaU1BfmqxVOWydSK
YKuqhQ0ksiQzt1dK2fHeY6Lce8shLEyUOYShd6GxiOaTSptrONJdoMOjasqB
i/dqMvAiKPwApphdyA6ErS6oFIcxXvdz2xXcXjUVJGovwmCb+MFK61c8aw4T
UXJrSiNzUkDQSvGqXvPjvHppziCBMGEaIUq5mvezHfxuXsPIQYpOb+pqySxV
4RKQdvlTXGnR/tt//Dsb/KV2DuFzhwtxgD96KK+uBOezj2eEC3+ESKwvyaCy
jgfSYvlg1QCEyX1eDjcLMp9XsjeUCtA7QIghTurS8WWUZysf+jNy91dFRMjD
7hXgHNhywITvJQhmDxVNpEJTl8FVgXy8pDhdxBoU4oleFmws25piJv8sSWAe
GMYnIc6znSGCVxy1ss4SUFlrBZfw9w7M5jWJPXQ3R8Jos46sFXyEERTr6HRN
iCMd/+7Vaf+61XqNGWsYdC+XZqqNyGxU6trLtfBreYPsgIeMQCmFMe2jAWuA
gmO7RDU6qNIJBawrwAayJ63WuNgb9JlTSpZ+irDWvQoObUQURxXyIo8lchrm
xWtOIht/Kc38o5rbgrp4sAFsnk5lIteTcvD2kUEJaLLrYN/spHWx02Xcjn0E
cUHyyZuTGnenlFw0PGB8ATx/Q/2kPpnMJxQx50aFQIEEbIC1+/6prz/+qMfE
zczID+6KCqSbIN2xK2tljnMqo/RavlozsX+B3T+74tUqzjbLoTD9ZtzT7k6v
KDrt6VX+aJdi0HALq2q2aRce99/fggebYZnt6UBgeSzWx4rB4T55NcBJksj7
ReuB6tsfdP3tD/UVuI17uq/C+La0Lr24vAL34RIDU2EgPtRUeHx89AAfTOzI
ZRg9rqvUoD5+GAtzp8We46N7f6irg/is2c9s59lg0dDhDR0XOUgN0S7irc4+
aQ4Sp7YC5HMJdGiQD/m+ts6YzhnVZN4+bygcLc8qF+W0jQR/YCzxKLofXJu9
y832+ocfrME+GyRnXKrnKdH1JzLE3T8+Rxgq/ESWMMnE/y85YuQ0ccSdYQlx
UZh22tvVZgzsU5OBazS+bCBx87UYE52izzS7st6KF4fdi7GMLc4dg8PGl/PH
UujmeYRunfjQIUyRgj9so3XBZLHglkkaEAxX8XBKTN7Gga71QHxeQxwdWaUc
laMZusgmJktOrTFBk4rnwh6on2L/9pP+E6rRxxQAV6K2qXVH/NNzMV4UHELX
E7BP3n5yHhV1YWZmPQ5AdkrnEqyMmkS/oPAI92voqCfl/EGyn4sPeGDlo3gm
hoN8fhi3eqTF7tVnlmrTmRZR6jWEabHVgg68PLKTs98JHp9Qe6Ek+MSEX9Eu
joJx1QoXj5MfrhJGCfIxIhV5lpBrobUCCfQj/He4Z6KyXRKZRix2xRkx4vjv
nuSO3ZPv9PlWw0bcPWU9DF5ZVzzmPzwahP+dmmdOt+Sg2YfSSgLSzMzTEjNP
95n5Qia6fKVyHghD62C15npnQCwdee5TNz79/BxRmirsVh6bxj2720raMFjH
Sbbmq43Mpg5tNhCCxJwHq7Lhx5x8+BrJR80s8mFu+Jp4/LloU6N/+Rcx74j/
UrAN/QHbaJpRq+r7Chvkw3Yam5gRP4NRHnl40LBRsSHH+2EJoHUbRz5Xb4Er
QAsy2VH7DCbvM5ePz1FsUHNqroFpXvBKruLzi7ZeleaWQlGZ56iqhtOHdFWh
iUBT5apqrcBzNwd/GxQTzKin+jBYDEExPTcq6hmoJOQj81q/RNqWnw/z5xaY
pI6Nbv5gWWjKBjAChw75O5NF2VYXXQ0/pFliEPIh+NjpVKYxEvVc/CkOonbR
vytyEyAsTrI70UsV6vN8/McIXwPYA4aaSg+FUwGeJADkpQBX/PM/o9T8kCMs
+M3w436nfLGc8SGBA/jvnlSWO60ulzpDy0X9SvP2Dweh7drdvU4jH+vm16Xm
1zojC4OZmbvo6RT68CedIamIBw5YFY2SZGBK0xzPMQMb2Si0oDZwtgbPdSw1
tSpJn+tzC/kCaVvXyCnzkYk5r4MttLflvBiopNTsHq2HMKsLY9t2Jxu3f3/0
2DPzOrYhXqVSwo8Bcx8/5ujVPnryYUrYsdrbkVpzaTynhvNwdi+EP8TFkf8A
6/5C6EX3FjXHcFFUp5f2N9pz7sCo4GfPdRMyi2l7zh5AU/VceSJnkZcpg3Gi
CLO2RP0zRKM0/miRl7Yz/vNKaaqS3hMjIs/1i9OyIOn9kJxfSlOMF+Xa97yW
2ytHlHr/7LldONPWI1sSSANrLGMomWue55XCNpsZeewaIQXGMSxvn0gr6TxD
cQ5s9urT8/WU6tJt8hddwE7PP9Kgr+hwvV5HnQKyOs0Xzph7vaMbudjR0V2r
7GKq4ZvIWXBJTsuS0GuMl7VFlWcMT5qqeKsknk2dZejqPCabNkXjz9ETJsex
n9ip0xPQ+hpa13MtnVWrCV8Rd5rEsVjL8EYT6qthV3zlwMooUr2GZqRUciTZ
Z0UqpzxS5eHOGwy2tPL31PHsat9KfeWYnczawQnyhe7U5g3Ev/2P/w1DAYDD
jv5s47o6/lAvXzfNuxAhHtS5d5+tdEfOI5RuXmbXRsSblDYWOnYer4eNfBxQ
xOih/+fVxAdZ+ldTxLn2LWvicqXkIzXx3a+tiodTWxfnGvWwMga/YeT8HbSx
oec/mDIu9q1L3tn3T+uLzRvzqLLIpK52gU6ilm6ueESJfL9ogEdv6FAMa3dS
EaRm7Wsm+WBf5MXJNtYnCc0tungI6AbPe6rbVisf1dRxmhHde6t7TQ2iTgRh
2o1PUljXhGA1D+CSE3DF5TJA/t+/fWdvRFNP5o3MGssYCLN0c0lVXtmFM+zS
4mRf8xkEXi9n3y+wCsuccyqvpRbg4iRHcXCPj+FUT+7tI2YZ7xKhixq3EqQM
yzguQrwYltZpvRKm+ibDhCQW0GEDXQaKx1S2WMHxKghDfV7PiJ51PRF1obaM
3L+oJAaRNOkmTjfaUNKtTR+uBuJqKK4ccTUSV2NxNRFXU3E1+9gyGp6xssib
8nYxd9CfqZv+jJ35c5GbfEcUvSTS7RIFQJXonDPgocOS+rcg8Ob7YrfA3A90
uXNJtukqN6oj1OXv4rLnxnfCsCkXmC4NrjPFd/JcroNl9g6vgYL+7zAVqQwr
3paa4+1OSXCHxMBrWe9O43C3ifjSUZB3zsjRo7puoq3usKIsvyOYDrYSGjpY
WvPs2YnvE67AIcAxQVSsQepEBu9q0VxLWpW2Q3RZg65Gb9phMT/AZHZY0Am5
9NbK3+Et0ibVkeon5qIsA09ODeOeYFG8jOg+PSIK18IFVJNPvmTKLbjQBGVs
WCyERMNiCt2hoirslZryIFABSI2r/Mau0gC2gjDAWDgusFJb8IUHdDWDYeOz
fIHmRibOY5eOReduc2l59lUtNifbGNZD7iGhsK7Eq1qP8aYWDJoDA6ptXxGV
lK+9UQe8caOnNFxWQi/fqFoGxkI5S8D+efgCGr4qtxbrOUGZYjQhHq8zE/EI
yMkJnwca9vTvw8BjI+r5dyO75kEhluaJPbcuga9O2anMibtabVs+Hz//o2aj
2wRYM1fYjkWv0HzWziuo/x3+FkWW3/xoV76ntipdNAYwQOVrAoid2sK7pNsx
FyX2Ma94t3khyibBaqMfYAKeNgin+RZNgOIHEcVKtQddMe8Kp1MEQdztQ/AM
XMrnPNyH4GPN698MrQYmCa2dNm5l+dTkjl27Xm1wUKTrqgu3JLhbwkK3WLfp
3IQY+5ICE7KyjrC0tYU34ohr0hDPtXosIuoCBdfGga8Sr1WsgcWMBqSHbDOe
V2A2T2HY63zyNj3tWtAgGf9YmryY6jXeC8+CmVOZOTunNATWw4FFZzNrunN1
9ElPOvsNUJgAsNvGFpvg7lqb2KYmD62NPjav71Uh9a0HgT8M+GMhGjahW7M4
uyo6JLnCc4Xf8MFBiERK5wgbAxD7MCJXzZMrib9YcsM/zkbqQ/vQ2hZbnYpa
U5216epS7yLc6lZiT30DccONZPms7ZLjvn95mn1rGZea060daZzf7QHuy1d2
aClSugWZfo0Hl6GnWrR6TfeKLdD5WdRt42CZu5bXXinEONSFb3fO07Tt6Zjf
lIe4M2MUGR9nMqWWXbGX+8lHrZmx+Ta1KrM84sIwjhM0m2niD1sEaP5nMHRG
48l0Nj+WrufjIT/fc+XxfDadjEfOcNA617zBfQZ9+qdlFzYuhOur4wWOsfBH
k9Fi7oy9hT/zpovlZC4XU9d3Fs5Uua0KLE4FluFg5EzGs+nx3JW+t1Rq6fnS
nR9PZ+OJMxoMK7A4k0nf+q8Ck1Qw67GznC6UdEaLydwbLcbzpb+Yu/PFbKzm
i/HEn1dBGlVActyZGk6GU2eO48mpdJez4WQ+Hxx7y/Fy5FVAKkqAy8AMfddf
eEP3eLFcLoeL2WQ+Xcz8gQtIc8cLNZuqxXg2m+VRlnVcv4Hs1WPHf0daX+UR
Jj2dq4HnzI/d5dIZuTOvZQxn/Wt3ND6W0l+qkeup5WTqOENvNB97M88Zzlzw
Ln5ZnigIUIbaGbr+cD4au95gPvd8pwJ19bWaqOFSTSbL4wlgR01Hx0splTM5
HsuBB8v5hdmG6kawbGRRhdsdK89Vo4E7G8yP5/6sAnf19WQykt78eDb2h+7Y
mQyUXHpjdyDlcDkfeMfTGga7a+awu1+exT6TnPUsWKXWA0h6qPnc8d2BPx46
k6UvPTUFYR1N3PkIiO4MlJr8XBb9TLFrYuE9yTq86oeaz6ZTORnBIoE9j5W/
HEp/4I88NZo6CJz8uSw+8sZLbzk4ns+Hk+VMunIKrZQzH06Hk5ly3EeLwC9M
7Sn85c3UYCLhoef4QxDo4RioMZDOdKTGLCK/tKdjfj4DD2mZWl0697fF3yMM
8Oxr5XfDam6ayd0g+3KF4ifj9g6z6auI6AzUvbmICKvMvCyiH9XQx1A5rVTy
K3V+wFd4LWt+gOgkpJ9lwVNhlJHWVd5XDPn3T6X1vpfFPV4D3yuM+uNb+hGX
mgt587N+7JTqm6b3jsVpFNWfjiuQUrmiEe8jy29otEDkY+OAT2UuTHodR3EW
R3T9+Q478+9JePwF/+ajwJSLkvnlhXwINdNnjfF8Z+DhxhNgyPzGD91jDnAm
ATTFE973aaY2qblrPp9CX4JXuN6ly95qLsPm9vrMYcOFznxAsGvKqXER+hbg
uh+0Y1S8f3/+kpKh9EG0zcls/HozxTPX9GnW2ccKU+kLsTYHjJm/bqmdvs6A
yh/NHch4NBHios3WZFr1D4SVf2WTD8ohMfWZcwhhgsS+Win/uTqg+pYvq+hX
brYrX0LHlwDrH4jjXFaJ07o2N5Z50PykGOfwi5OqSK9NnGZGsPGIuGazLoyy
VInJHroob1kifQWPmampYwL46d3GSejTzHQwmKXPw2OJofJXyNn6pgL+1VSB
RxIVXogCwVPerPhVEeY76xBjiiW/0F4w5PjbLIjDjcLTqnnG+/zs6hVeHVTc
q4I34m+oEwhnVtxF6MIK/b1Lfop2dNqYDmmuVYjVn+labutUQb/1fwHR1qsR
roEAAA==

-->

</rfc>
