<?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-pham-cfrg-hiae-02" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.0 -->
  <front>
    <title abbrev="HiAE">The HiAE Authenticated Encryption Algorithm</title>
    <seriesInfo name="Internet-Draft" value="draft-pham-cfrg-hiae-02"/>
    <author initials="F." surname="Denis" fullname="Frank Denis">
      <organization>Fastly Inc.</organization>
      <address>
        <email>fd@00f.net</email>
      </address>
    </author>
    <author initials="P." surname="Pham" fullname="Phuong Pham">
      <organization>Huawei</organization>
      <address>
        <email>pham.phuong@huawei.com</email>
      </address>
    </author>
    <author initials="L." surname="Prabel" fullname="Lucas Prabel">
      <organization>Huawei</organization>
      <address>
        <email>lucas.prabel@huawei.com</email>
      </address>
    </author>
    <author initials="S." surname="Sun" fullname="Shuzhou Sun">
      <organization>Huawei</organization>
      <address>
        <email>sunshuzhou@huawei.com</email>
      </address>
    </author>
    <date year="2025" month="July" day="21"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 168?>

<t>This document describes HiAE, a high-throughput authenticated encryption algorithm designed for next-generation wireless systems (6G) and high-speed data transmission applications.</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/hiae-aead/draft-pham-hiae"/>.</t>
    </note>
  </front>
  <middle>
    <?line 172?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The evolution of wireless networks toward 6G, alongside the growing demands of cloud service providers and CDN operators, requires cryptographic algorithms capable of delivering unprecedented throughput while maintaining strong security guarantees. Current high-performance authenticated encryption schemes achieve impressive speeds by leveraging platform-specific SIMD instructions, particularly AES-NI on x86 architectures <xref target="AES-NI"/>. Notable examples include AEGIS <xref target="I-D.irtf-cfrg-aegis-aead"/>, SNOW-V <xref target="SNOW-V"/>, and Rocca-S <xref target="ROCCA-S"/>.</t>
      <t>While these platform-specific optimizations deliver high performance on their target architectures, they create a significant performance disparity across different hardware platforms. These algorithms excel on x86 processors equipped with AES-NI but exhibit substantially degraded performance on ARM architectures that implement SIMD functionality through NEON instructions. This inconsistency poses a critical challenge for modern network deployments where ARM processors dominate mobile devices, edge computing nodes, and increasingly, data center environments.</t>
      <t>The architectural differences between x86 and ARM extend beyond instruction set variations. They encompass fundamental distinctions in how AES round functions are implemented in hardware, pipeline structures, and memory subsystems. These differences mean that algorithms optimized for one architecture may inadvertently create bottlenecks on another, resulting in unpredictable performance characteristics across heterogeneous deployments.</t>
      <t>The transition to 6G networks amplifies these challenges. Next-generation wireless systems will rely heavily on software-defined networking (SDN) and cloud radio access networks (Cloud RAN), requiring cryptographic algorithms that perform consistently across diverse hardware platforms. The stringent latency requirements and massive data rates anticipated for 6G, potentially exceeding 1 Tbps, demand encryption schemes that can leverage the full capabilities of both x86 and ARM architectures without compromise.</t>
      <t>This document presents HiAE (High-throughput Authenticated Encryption), an authenticated encryption algorithm explicitly designed to address these cross-platform performance challenges. Through careful algorithmic design, HiAE delivers high performance on both x86 and ARM architectures by efficiently utilizing the capabilities of each platform without being overly dependent on architecture-specific features.</t>
      <t>The remainder of this document is organized as follows: Section 2 establishes notation and conventions. Section 3 provides the complete specification of the HiAE algorithm, including its three operational modes. Sections 4–6 detail the specific use cases as an AEAD cipher, stream cipher, and MAC. Section 7 analyzes security considerations, while Section 8 discusses implementation aspects. The appendix provides comprehensive test vectors for validation.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words “<bcp14>MUST</bcp14>”, “<bcp14>MUST NOT</bcp14>”, “<bcp14>REQUIRED</bcp14>”, “<bcp14>SHALL</bcp14>”, “<bcp14>SHALL
NOT</bcp14>”, “<bcp14>SHOULD</bcp14>”, “<bcp14>SHOULD NOT</bcp14>”, “<bcp14>RECOMMENDED</bcp14>”, “<bcp14>NOT RECOMMENDED</bcp14>”,
“<bcp14>MAY</bcp14>”, and “<bcp14>OPTIONAL</bcp14>” in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>Throughout this document, “byte” is used interchangeably with “octet” and refers to an 8-bit sequence.</t>
      <t>Basic operations:</t>
      <ul spacing="normal">
        <li>
          <t><tt>{}</tt>: an empty bit array.</t>
        </li>
        <li>
          <t><tt>|x|</tt>: the length of <tt>x</tt> in bits.</t>
        </li>
        <li>
          <t><tt>a ^ b</tt>: the bitwise exclusive OR operation between <tt>a</tt> and <tt>b</tt>.</t>
        </li>
        <li>
          <t><tt>a || b</tt>: the concatenation of <tt>a</tt> and <tt>b</tt>.</t>
        </li>
        <li>
          <t><tt>a mod b</tt>: the remainder of the Euclidean division between <tt>a</tt> as the dividend and <tt>b</tt> as the divisor.</t>
        </li>
      </ul>
      <t>Data manipulation:</t>
      <ul spacing="normal">
        <li>
          <t><tt>LE64(x)</tt>: returns the little-endian encoding of unsigned 64-bit integer <tt>x</tt>.</t>
        </li>
        <li>
          <t><tt>ZeroPad(x, n)</tt>: returns <tt>x</tt> after appending zeros until its length is a multiple of <tt>n</tt> bits. No padding is added if the length of <tt>x</tt> is already a multiple of <tt>n</tt>, including when <tt>x</tt> is empty.</t>
        </li>
        <li>
          <t><tt>Truncate(x, n)</tt>: returns the first <tt>n</tt> bits of <tt>x</tt>.</t>
        </li>
        <li>
          <t><tt>Tail(x, n)</tt>: returns the last <tt>n</tt> bits of <tt>x</tt>.</t>
        </li>
        <li>
          <t><tt>Split(x, n)</tt>: returns <tt>x</tt> split into <tt>n</tt>-bit blocks, ignoring partial blocks.</t>
        </li>
      </ul>
      <t>Cryptographic operations:</t>
      <ul spacing="normal">
        <li>
          <t><tt>AESL(x)</tt>: A single AES round function without key addition. Given a 128-bit AES state <tt>x</tt>, this function applies the following AES transformations in sequence:
          </t>
          <ol spacing="normal" type="1"><li>
              <t>SubBytes: Apply the AES S-box to each byte</t>
            </li>
            <li>
              <t>ShiftRows: Cyclically shift the rows of the state</t>
            </li>
            <li>
              <t>MixColumns: Mix the columns of the state</t>
            </li>
          </ol>
          <t>
Formally: <tt>AESL(x) = MixColumns(ShiftRows(SubBytes(x)))</tt>  </t>
          <t>
These transformations are as specified in Section 5 of <xref target="FIPS-AES"/>. This is NOT the full AES encryption algorithm. It is a single round without the AddRoundKey operation (equivalent to using a zero round key). A test vector for this function is provided in Appendix B.</t>
        </li>
      </ul>
      <t>Control flow and comparison:</t>
      <ul spacing="normal">
        <li>
          <t><tt>Repeat(n, F)</tt>: <tt>n</tt> sequential evaluations of the function <tt>F</tt>.</t>
        </li>
        <li>
          <t><tt>CtEq(a, b)</tt>: compares <tt>a</tt> and <tt>b</tt> in constant-time, returning <tt>True</tt> for an exact match and <tt>False</tt> otherwise.</t>
        </li>
      </ul>
      <t>AES blocks:</t>
      <ul spacing="normal">
        <li>
          <t><tt>Si</tt>: the <tt>i</tt>-th AES block of the current state.</t>
        </li>
        <li>
          <t><tt>S'i</tt>: the <tt>i</tt>-th AES block of the next state.</t>
        </li>
        <li>
          <t><tt>{Si, ...Sj}</tt>: the vector of the <tt>i</tt>-th AES block of the current state to the <tt>j</tt>-th block of the current state.</t>
        </li>
        <li>
          <t><tt>C0</tt>: an AES block built from the following bytes in hexadecimal format: <tt>{ 0x32, 0x43, 0xf6, 0xa8, 0x88, 0x5a, 0x30, 0x8d, 0x31, 0x31, 0x98, 0xa2, 0xe0, 0x37, 0x07, 0x34 }</tt>.</t>
        </li>
        <li>
          <t><tt>C1</tt>: an AES block built from the following bytes in hexadecimal format: <tt>{ 0x4a, 0x40, 0x93, 0x82, 0x22, 0x99, 0xf3, 0x1d, 0x00, 0x82, 0xef, 0xa9, 0x8e, 0xc4, 0xe6, 0xc8 }</tt>.</t>
        </li>
      </ul>
      <t>The constants C0 and C1 are domain separation constants derived from the fractional parts of π and e, respectively.</t>
      <t>Input and output values:</t>
      <ul spacing="normal">
        <li>
          <t><tt>key</tt>: the encryption key (256 bits).</t>
        </li>
        <li>
          <t><tt>nonce</tt>: the public nonce (128 bits).</t>
        </li>
        <li>
          <t><tt>ad</tt>: the associated data.</t>
        </li>
        <li>
          <t><tt>msg</tt>: the plaintext.</t>
        </li>
        <li>
          <t><tt>ct</tt>: the ciphertext.</t>
        </li>
        <li>
          <t><tt>tag</tt>: the authentication tag (128 bits).</t>
        </li>
      </ul>
    </section>
    <section anchor="the-hiae-algorithm">
      <name>The HiAE Algorithm</name>
      <t>This section provides the complete specification of HiAE. The algorithm operates on a 2048-bit internal state organized as sixteen 128-bit blocks, combining AES round functions with an efficient update mechanism to achieve both high security and cross-platform performance.</t>
      <section anchor="algorithm-parameters">
        <name>Algorithm Parameters</name>
        <t>HiAE maintains a 2048-bit state organized as sixteen 128-bit blocks denoted <tt>{S0, S1, S2, ..., S15}</tt>. Each block Si represents a 128-bit AES state that can be processed independently by AES round functions. This large state size provides security margins while enabling efficient parallel processing on modern architectures.</t>
        <t>The parameters for this algorithm, whose meaning is defined in <xref section="4" sectionFormat="comma" target="RFC5116"/>, are:</t>
        <ul spacing="normal">
          <li>
            <t><tt>K_LEN</tt> (key length) is 32 bytes (256 bits).</t>
          </li>
          <li>
            <t><tt>P_MAX</tt> (maximum length of the plaintext) is 2<sup>61</sup> - 1 bytes (2<sup>64</sup> - 8 bits).</t>
          </li>
          <li>
            <t><tt>A_MAX</tt> (maximum length of the associated data) is 2<sup>61</sup> - 1 bytes (2<sup>64</sup> - 8 bits).</t>
          </li>
          <li>
            <t><tt>N_MIN</tt> (minimum nonce length) = <tt>N_MAX</tt> (maximum nonce length) = 16 bytes (128 bits).</t>
          </li>
          <li>
            <t><tt>C_MAX</tt> (maximum ciphertext length) = <tt>P_MAX</tt> + tag length = (2<sup>61</sup> - 1) + 16 or 32 bytes (in bits: (2<sup>64</sup> - 8) + 128 bits).</t>
          </li>
        </ul>
        <t>Distinct associated data inputs, as described in <xref section="3" sectionFormat="comma" target="RFC5116"/>, <bcp14>MUST</bcp14> be unambiguously encoded as a single input.
It is up to the application to create a structure in the associated data input if needed.</t>
      </section>
      <section anchor="authenticated-encryption">
        <name>Authenticated Encryption</name>
        <artwork><![CDATA[
Encrypt(msg, ad, key, nonce)
]]></artwork>
        <t>The <tt>Encrypt</tt> function encrypts a message and returns the ciphertext along with an authentication tag that verifies the authenticity of the message and associated data, if provided.</t>
        <t>Security:</t>
        <ul spacing="normal">
          <li>
            <t>For a given key, the nonce <bcp14>MUST NOT</bcp14> be reused under any circumstances; doing so allows an attacker to recover the internal state.</t>
          </li>
          <li>
            <t>The key <bcp14>MUST</bcp14> be randomly chosen from a uniform distribution.</t>
          </li>
        </ul>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>msg</tt>: the message to be encrypted (length <bcp14>MUST</bcp14> be less than or equal to <tt>P_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than or equal to <tt>A_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ct</tt>: the ciphertext.</t>
          </li>
          <li>
            <t><tt>tag</tt>: the authentication tag.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

ct = {}

ad_blocks = Split(ZeroPad(ad, 128), 128)
for ai in ad_blocks:
    Absorb(ai)

msg_blocks = Split(ZeroPad(msg, 128), 128)
for xi in msg_blocks:
    ct = ct || Enc(xi)

tag = Finalize(|ad|, |msg|)
ct = Truncate(ct, |msg|)

return ct and tag
]]></artwork>
      </section>
      <section anchor="authenticated-decryption">
        <name>Authenticated Decryption</name>
        <artwork><![CDATA[
Decrypt(ct, tag, ad, key, nonce)
]]></artwork>
        <t>The <tt>Decrypt</tt> function decrypts a ciphertext, verifies that the authentication tag is correct, and returns the message on success or an error if tag verification fails.</t>
        <t>Security:</t>
        <ul spacing="normal">
          <li>
            <t>If tag verification fails, the decrypted message and incorrect authentication tag <bcp14>MUST NOT</bcp14> be given as output. The decrypted message <bcp14>MUST</bcp14> be overwritten with zeros before the function returns.</t>
          </li>
          <li>
            <t>The comparison of the input <tt>tag</tt> with the <tt>expected_tag</tt> <bcp14>MUST</bcp14> be done in constant time.</t>
          </li>
        </ul>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ct</tt>: the ciphertext to decrypt (length <bcp14>MUST</bcp14> be less than or equal to <tt>C_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>tag</tt>: the authentication tag.</t>
          </li>
          <li>
            <t><tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than or equal to <tt>A_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t>Either the decrypted message <tt>msg</tt> or an error indicating that the authentication tag is invalid for the given inputs.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

msg = {}

ad_blocks = Split(ZeroPad(ad, 128), 128)
for ai in ad_blocks:
    Absorb(ai)

ct_blocks = Split(ct, 128)
cn = Tail(ct, |ct| mod 128)

for ci in ct_blocks:
    msg = msg || Dec(ci)

if cn is not empty:
    msg = msg || DecPartial(cn)

expected_tag = Finalize(|ad|, |msg|)

if CtEq(tag, expected_tag) is False:
    erase msg
    erase expected_tag
    return "verification failed" error
else:
    return msg
]]></artwork>
      </section>
      <section anchor="core-functions">
        <name>Core Functions</name>
        <t>The following sections describe the fundamental operations that form the building blocks of HiAE. These functions manipulate the 2048-bit state to provide confusion, diffusion, and the absorption of input data.</t>
        <section anchor="the-state-rotation-function">
          <name>The State Rotation Function</name>
          <artwork><![CDATA[
Rol()
]]></artwork>
          <t>The <tt>Rol</tt> function provides diffusion by rotating the sixteen 128-bit blocks of the state one position to the left. This ensures that local changes propagate throughout the entire state over multiple rounds.</t>
          <t>Modifies:</t>
          <ul spacing="normal">
            <li>
              <t><tt>{S0, ...S15}</tt>: the state.</t>
            </li>
          </ul>
          <t>Steps:</t>
          <artwork><![CDATA[
  t = S0
 S0 = S1
 S1 = S2
 S2 = S3
 S3 = S4
 S4 = S5
 S5 = S6
 S6 = S7
 S7 = S8
 S8 = S9
 S9 = S10
S10 = S11
S11 = S12
S12 = S13
S13 = S14
S14 = S15
S15 = t
]]></artwork>
        </section>
        <section anchor="the-state-update-functions">
          <name>The State Update Functions</name>
          <t>The state update functions form the cryptographic core of HiAE. They combine the AESL transformation with XOR operations and state rotation to achieve both security and efficiency.</t>
          <section anchor="the-update-function">
            <name>The Update Function</name>
            <artwork><![CDATA[
Update(xi)
]]></artwork>
            <t>The <tt>Update</tt> function is the core of the HiAE algorithm.
It updates the state <tt>{S0, ...S15}</tt> using a 128-bit value.</t>
            <t>Inputs:</t>
            <ul spacing="normal">
              <li>
                <t><tt>xi</tt>: the 128-bit block to be absorbed.</t>
              </li>
            </ul>
            <t>Modifies:</t>
            <ul spacing="normal">
              <li>
                <t><tt>{S0, ...S15}</tt>: the state.</t>
              </li>
            </ul>
            <t>Steps:</t>
            <artwork><![CDATA[
  t = AESL(S0 ^ S1) ^ xi
 S0 = AESL(S13) ^ t
 S3 =  S3 ^ xi
S13 = S13 ^ xi

Rol()
]]></artwork>
          </section>
          <section anchor="the-updateenc-function">
            <name>The UpdateEnc Function</name>
            <artwork><![CDATA[
UpdateEnc(mi)
]]></artwork>
            <t>The <tt>UpdateEnc</tt> function extends the basic <tt>Update</tt> function to provide encryption. It absorbs a plaintext block while simultaneously generating the corresponding ciphertext block through an additional XOR with state block S9.</t>
            <t>Inputs:</t>
            <ul spacing="normal">
              <li>
                <t><tt>mi</tt>: a 128-bit block to be encrypted.</t>
              </li>
            </ul>
            <t>Outputs:</t>
            <ul spacing="normal">
              <li>
                <t><tt>ci</tt>: the encrypted 128-bit block.</t>
              </li>
            </ul>
            <t>Modifies:</t>
            <ul spacing="normal">
              <li>
                <t><tt>{S0, ...S15}</tt>: the state.</t>
              </li>
            </ul>
            <t>Steps:</t>
            <artwork><![CDATA[
  t = AESL(S0 ^ S1) ^ mi
 ci = t ^ S9
 S0 = AESL(S13) ^ t
 S3 =  S3 ^ mi
S13 = S13 ^ mi

Rol()

return ci
]]></artwork>
          </section>
          <section anchor="the-updatedec-function">
            <name>The UpdateDec Function</name>
            <artwork><![CDATA[
UpdateDec(ci)
]]></artwork>
            <t>The <tt>UpdateDec</tt> function provides the inverse operation of <tt>UpdateEnc</tt>. It processes a ciphertext block to recover the plaintext while maintaining the same state update pattern, ensuring that encryption and decryption produce identical internal states.</t>
            <t>Inputs:</t>
            <ul spacing="normal">
              <li>
                <t><tt>ci</tt>: a 128-bit block to be decrypted.</t>
              </li>
            </ul>
            <t>Outputs:</t>
            <ul spacing="normal">
              <li>
                <t><tt>mi</tt>: the decrypted 128-bit block.</t>
              </li>
            </ul>
            <t>Modifies:</t>
            <ul spacing="normal">
              <li>
                <t><tt>{S0, ...S15}</tt>: the state.</t>
              </li>
            </ul>
            <t>Steps:</t>
            <artwork><![CDATA[
  t = ci ^ S9
 mi = AESL(S0 ^ S1) ^ t
 S0 = AESL(S13) ^ t
 S3 =  S3 ^ mi
S13 = S13 ^ mi

Rol()

return mi
]]></artwork>
          </section>
          <section anchor="the-diffuse-function">
            <name>The Diffuse Function</name>
            <artwork><![CDATA[
Diffuse(x)
]]></artwork>
            <t>The <tt>Diffuse</tt> function ensures full state mixing by performing 32 consecutive update operations. This function is critical for security during initialization and finalization phases, guaranteeing that every bit of the key and nonce influences the entire state, and that the authentication tag depends on all state bits.</t>
            <t>Inputs:</t>
            <ul spacing="normal">
              <li>
                <t><tt>x</tt>: a 128-bit input value.</t>
              </li>
            </ul>
            <t>Modifies:</t>
            <ul spacing="normal">
              <li>
                <t><tt>{S0, ...S15}</tt>: the state.</t>
              </li>
            </ul>
            <t>Steps:</t>
            <artwork><![CDATA[
Repeat(32,
  Update(x)
)
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="initialization-and-processing-functions">
        <name>Initialization and Processing Functions</name>
        <t>The following functions implement the high-level operations of HiAE: initialization, data absorption, encryption/decryption, and finalization.</t>
        <section anchor="the-init-function">
          <name>The Init Function</name>
          <artwork><![CDATA[
Init(key, nonce)
]]></artwork>
          <t>The <tt>Init</tt> function constructs the initial state <tt>{S0, ...S15}</tt> from the encryption key and nonce. The initialization process carefully distributes key material across the state and applies the Diffuse function to ensure all state bits are cryptographically mixed before processing begins.</t>
          <t>Inputs:</t>
          <ul spacing="normal">
            <li>
              <t><tt>key</tt>: the encryption key.</t>
            </li>
            <li>
              <t><tt>nonce</tt>: the public nonce.</t>
            </li>
          </ul>
          <t>Defines:</t>
          <ul spacing="normal">
            <li>
              <t><tt>{S0, ...S15}</tt>: the initial state.</t>
            </li>
          </ul>
          <t>Steps:</t>
          <artwork><![CDATA[
k0, k1 = Split(key, 128)

 S0 = C0
 S1 = k1
 S2 = nonce
 S3 = C0
 S4 = ZeroPad({ 0 }, 128)
 S5 = nonce ^ k0
 S6 = ZeroPad({ 0 }, 128)
 S7 = C1
 S8 = nonce ^ k1
 S9 = ZeroPad({ 0 }, 128)
S10 = k1
S11 = C0
S12 = C1
S13 = k1
S14 = ZeroPad({ 0 }, 128)
S15 = C0 ^ C1

Diffuse(C0)

 S9 =  S9 ^ k0
S13 = S13 ^ k1
]]></artwork>
        </section>
        <section anchor="the-absorb-function">
          <name>The Absorb Function</name>
          <artwork><![CDATA[
Absorb(ai)
]]></artwork>
          <t>The <tt>Absorb</tt> function processes associated data by incorporating 128-bit blocks into the internal state. This function is used exclusively for authenticated data that should influence the authentication tag but not produce ciphertext output.</t>
          <t>Inputs:</t>
          <ul spacing="normal">
            <li>
              <t><tt>ai</tt>: the 128-bit input block.</t>
            </li>
          </ul>
          <t>Steps:</t>
          <artwork><![CDATA[
Update(ai)
]]></artwork>
        </section>
        <section anchor="the-enc-function">
          <name>The Enc Function</name>
          <artwork><![CDATA[
Enc(mi)
]]></artwork>
          <t>The <tt>Enc</tt> function encrypts a single 128-bit plaintext block. It serves as a simple wrapper around <tt>UpdateEnc</tt>, providing a clean interface for the block-by-block encryption process.</t>
          <t>Inputs:</t>
          <ul spacing="normal">
            <li>
              <t><tt>mi</tt>: the 128-bit input block.</t>
            </li>
          </ul>
          <t>Outputs:</t>
          <ul spacing="normal">
            <li>
              <t><tt>ci</tt>: the 128-bit encrypted block.</t>
            </li>
          </ul>
          <t>Steps:</t>
          <artwork><![CDATA[
ci = UpdateEnc(mi)
return ci
]]></artwork>
        </section>
        <section anchor="the-dec-function">
          <name>The Dec Function</name>
          <artwork><![CDATA[
Dec(ci)
]]></artwork>
          <t>The <tt>Dec</tt> function decrypts a single 128-bit ciphertext block. Like <tt>Enc</tt>, it provides a clean interface by wrapping the <tt>UpdateDec</tt> function.</t>
          <t>Inputs:</t>
          <ul spacing="normal">
            <li>
              <t><tt>ci</tt>: the 128-bit encrypted block.</t>
            </li>
          </ul>
          <t>Outputs:</t>
          <ul spacing="normal">
            <li>
              <t><tt>mi</tt>: the 128-bit decrypted block.</t>
            </li>
          </ul>
          <t>Steps:</t>
          <artwork><![CDATA[
mi = UpdateDec(ci)
return mi
]]></artwork>
        </section>
        <section anchor="the-decpartial-function">
          <name>The DecPartial Function</name>
          <artwork><![CDATA[
DecPartial(cn)
]]></artwork>
          <t>The <tt>DecPartial</tt> function handles the special case of decrypting a partial block at the end of a ciphertext. This function carefully reconstructs the keystream to decrypt blocks smaller than 128 bits while maintaining the same state evolution as encryption.</t>
          <t>Inputs:</t>
          <ul spacing="normal">
            <li>
              <t><tt>cn</tt>: the encrypted input.</t>
            </li>
          </ul>
          <t>Outputs:</t>
          <ul spacing="normal">
            <li>
              <t><tt>mn</tt>: the decryption of <tt>cn</tt>.</t>
            </li>
          </ul>
          <t>Steps:</t>
          <artwork><![CDATA[
# Step 1: Recover the keystream that would encrypt a full zero block
ks = AESL(S0 ^ S1) ^ ZeroPad(cn) ^ S9

# Step 2: Construct a full 128-bit ciphertext block
# by appending the appropriate keystream bits
ci = cn || Tail(ks, 128 - |cn|)

# Step 3: Decrypt the full block using standard UpdateDec
mi = UpdateDec(ci)

# Step 4: Extract only the decrypted bytes corresponding to the partial input
mn = Truncate(mi, |cn|)

return mn
]]></artwork>
        </section>
        <section anchor="the-finalize-function">
          <name>The Finalize Function</name>
          <artwork><![CDATA[
Finalize(ad_len_bits, msg_len_bits)
]]></artwork>
          <t>The <tt>Finalize</tt> function completes the authentication process by generating a 128-bit tag. It incorporates the lengths of both the associated data and message (each encoded as 8 bytes in little-endian format), applies the Diffuse function for final mixing, and combines all state blocks to produce the authentication tag.</t>
          <t>Inputs:</t>
          <ul spacing="normal">
            <li>
              <t><tt>ad_len_bits</tt>: the length of the associated data in bits.</t>
            </li>
            <li>
              <t><tt>msg_len_bits</tt>: the length of the message in bits.</t>
            </li>
          </ul>
          <t>Outputs:</t>
          <ul spacing="normal">
            <li>
              <t><tt>tag</tt>: the authentication tag.</t>
            </li>
          </ul>
          <t>Steps:</t>
          <artwork><![CDATA[
t = (LE64(ad_len_bits) || LE64(msg_len_bits))
Diffuse(t)

tag = S0 ^ S1 ^ S2 ^ S3 ^ S4 ^ S5 ^ S6 ^ S7 ^
      S8 ^ S9 ^ S10 ^ S11 ^ S12 ^ S13 ^ S14 ^ S15

return tag
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="encoding-ct-tag-tuples">
      <name>Encoding (ct, tag) Tuples</name>
      <t>Applications <bcp14>MAY</bcp14> keep the ciphertext and the authentication tag in distinct structures or encode both as a single string.</t>
      <t>In the latter case, the tag <bcp14>MUST</bcp14> immediately follow the ciphertext:</t>
      <artwork><![CDATA[
combined_ct = ct || tag
]]></artwork>
    </section>
    <section anchor="alternative-operating-modes">
      <name>Alternative Operating Modes</name>
      <t>While HiAE is primarily designed as an authenticated encryption algorithm, its flexible structure allows it to operate in two additional modes: as a stream cipher for keystream generation and as a message authentication code (MAC) for data authentication without encryption.</t>
      <section anchor="hiae-as-a-stream-cipher">
        <name>HiAE as a Stream Cipher</name>
        <t>The stream cipher mode of HiAE generates a keystream by encrypting an all-zero message.</t>
        <artwork><![CDATA[
Stream(len, key, nonce)
]]></artwork>
        <t>The <tt>Stream</tt> function expands a key and an optional nonce into a variable-length keystream.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>len</tt>: the length of the keystream to generate in bits.</t>
          </li>
          <li>
            <t><tt>key</tt>: the HiAE key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the HiAE nonce. If unspecified, it is set to <tt>N_MAX</tt> zero bytes.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>stream</tt>: the keystream.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
if len == 0:
    return {}
else:
    stream, tag = Encrypt(ZeroPad({ 0 }, len), {}, key, nonce)
    return stream
]]></artwork>
        <t>This is equivalent to encrypting a message of <tt>len</tt> zero bits without associated data and discarding the authentication tag.</t>
        <t>Instead of relying on the generic <tt>Encrypt</tt> function, implementations can omit the <tt>Finalize</tt> function.</t>
        <t>After initialization, the <tt>Update</tt> function is called with constant parameters, allowing further optimizations.</t>
      </section>
      <section anchor="hiae-as-a-message-authentication-code">
        <name>HiAE as a Message Authentication Code</name>
        <t>In MAC mode, HiAE processes input data without generating ciphertext, producing only an authentication tag. This mode is useful when data authenticity is required without confidentiality.</t>
        <artwork><![CDATA[
Mac(data, key, nonce)
]]></artwork>
        <t>Security:</t>
        <ul spacing="normal">
          <li>
            <t>This is the only function that allows the reuse of <tt>(key, nonce)</tt> pairs with different inputs.</t>
          </li>
          <li>
            <t>HiAE-based MAC functions <bcp14>MUST NOT</bcp14> be used as hash functions: if the key is known, inputs causing state collisions can easily be crafted.</t>
          </li>
          <li>
            <t>Unlike hash-based MACs, tags <bcp14>MUST NOT</bcp14> be used for key derivation as there is no guarantee that they are uniformly random.</t>
          </li>
        </ul>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>data</tt>: the input data to authenticate (length <bcp14>MUST</bcp14> be less than or equal to <tt>A_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>key</tt>: the secret key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>tag</tt>: the authentication tag.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)
data_blocks = Split(ZeroPad(data, 128), 128)
for di in data_blocks:
    Absorb(di)
tag = Finalize(|data|, 0)
return tag
]]></artwork>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="classic-setting">
        <name>Classic Setting</name>
        <t>HiAE provides 256-bit security against key recovery and state recovery attacks, along with 128-bit security for integrity against forgery attempts.</t>
        <t>It is important to note that the encryption security assumes the attacker cannot successfully forge messages through repeated trials <xref target="HiAE-Clarification"/>.</t>
        <t>Regarding keystream bias attacks, analysis shows that at least 150-bit security is guaranteed by HiAE.</t>
        <t>Finally, HiAE is assumed to be secure against key-committing attacks, but it has not been proven to be secure in the everything-committing setting.</t>
      </section>
      <section anchor="quantum-setting">
        <name>Quantum Setting</name>
        <t>HiAE targets a security strength of 128 bits against key recovery attacks and forgery attacks in the quantum setting. Security is not claimed against online superposition queries to cryptographic oracle attacks, as such attacks are highly impractical in real-world applications.</t>
      </section>
      <section anchor="attack-considerations">
        <name>Attack Considerations</name>
        <t>HiAE is assumed to be secure against the following attacks:</t>
        <ol spacing="normal" type="1"><li>
            <t>Key-Recovery Attack: 256-bit security against key recovery attacks.</t>
          </li>
          <li>
            <t>Differential Attack: 256-bit security against differential attacks in the initialization phase.</t>
          </li>
          <li>
            <t>Forgery Attack: 128-bit security against forgery attacks.</t>
          </li>
          <li>
            <t>Integral Attack: Secure against integral attacks.</t>
          </li>
          <li>
            <t>State-Recovery Attack:
            </t>
            <ul spacing="normal">
              <li>
                <t>Guess-and-Determine Attack: The time complexity of the guess-and-determine attack cannot be lower than 2<sup>256</sup>.</t>
              </li>
              <li>
                <t>Algebraic Attack: The system of equations to recover HiAE states cannot be solved with time complexity lower than 2<sup>256</sup>.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Linear Bias: At least 150-bit security against statistical attacks.</t>
          </li>
          <li>
            <t>Key-Committing Attacks: Secure in the FROB, CMT1, and CMT2 models.</t>
          </li>
          <li>
            <t>Everything-Committing Attacks: Security is not claimed in the CMT3 model.</t>
          </li>
        </ol>
        <t>The details of the cryptanalysis can be found in the paper <xref target="HiAE"/>.</t>
      </section>
    </section>
    <section anchor="implementation-considerations">
      <name>Implementation Considerations</name>
      <t>HiAE is designed to balance the performance of XOR and AES instructions across both ARM and x86 architectures while being optimized to push performance to its limits. The algorithm’s XAXX structure enables platform-specific optimizations by exploiting the fundamental differences in how ARM and Intel processors implement AES round functions.</t>
      <section anchor="state-rotation-optimization">
        <name>State Rotation Optimization</name>
        <t>Instead of performing physical rotations with the <tt>Rol()</tt> function, implementations can use a cycling index (offset) approach to avoid copying the entire 2048-bit state on every rotation. This optimization provides significant performance improvements across all platforms.</t>
        <section anchor="cycling-index-approach">
          <name>Cycling Index Approach</name>
          <t>The standard <tt>Rol()</tt> function requires copying all sixteen 128-bit blocks:</t>
          <artwork><![CDATA[
  t = S0
 S0 = S1
 S1 = S2
 ...
S15 = t
]]></artwork>
          <t>This approach copies 2048 bits of data on every rotation. An optimized implementation can instead:</t>
          <ol spacing="normal" type="1"><li>
              <t>Keep the state blocks in a fixed array position</t>
            </li>
            <li>
              <t>Maintain an <tt>offset</tt> variable tracking the logical position of S0</t>
            </li>
            <li>
              <t>Map logical state block Si to physical position <tt>(i + offset) mod 16</tt></t>
            </li>
            <li>
              <t>Replace the entire <tt>Rol()</tt> operation with: <tt>offset = (offset + 1) mod 16</tt></t>
            </li>
          </ol>
        </section>
        <section anchor="state-access-pattern">
          <name>State Access Pattern</name>
          <t>With this optimization, the logical-to-physical state block mapping becomes:</t>
          <ul spacing="normal">
            <li>
              <t>Logical <tt>S0</tt> maps to physical position <tt>offset mod 16</tt></t>
            </li>
            <li>
              <t>Logical <tt>S3</tt> maps to physical position <tt>(3 + offset) mod 16</tt></t>
            </li>
            <li>
              <t>Logical <tt>S9</tt> maps to physical position <tt>(9 + offset) mod 16</tt></t>
            </li>
            <li>
              <t>Logical <tt>S13</tt> maps to physical position <tt>(13 + offset) mod 16</tt></t>
            </li>
          </ul>
          <t>This approach is mathematically equivalent to the specification but eliminates the expensive memory operations associated with state rotation. Since <tt>Rol()</tt> is called in every <tt>Update()</tt>, <tt>UpdateEnc()</tt>, and <tt>UpdateDec()</tt> operation, this optimization provides substantial performance benefits during encryption and decryption operations.</t>
        </section>
        <section anchor="batch-processing-optimization">
          <name>Batch Processing Optimization</name>
          <t>Since the offset cycles back to zero every 16 operations (<tt>offset mod 16</tt>), implementations may benefit from processing data in batches of 16 blocks. After processing 16 consecutive input blocks, the logical state mapping returns to its original configuration, which can simplify implementation and potentially enable further optimizations such as loop unrolling or vectorization of the batch processing logic.</t>
          <t>When the offset is aligned to zero at the start of a batch, implementations can hardcode the specific offset values for each operation within the unrolled batch processing function, eliminating the need for modular arithmetic during the inner loop and providing additional performance benefits.</t>
        </section>
      </section>
      <section anchor="platform-specific-optimizations">
        <name>Platform-Specific Optimizations</name>
        <t>The key to HiAE’s cross-platform efficiency lies in understanding how different architectures implement AES operations.</t>
        <t>The following optimizations leverage architectural differences between ARM and Intel processors to maximize HiAE’s performance while maintaining cryptographic correctness.</t>
        <section anchor="arm-neon-optimizations">
          <name>ARM NEON Optimizations</name>
          <t>ARM processors with NEON SIMD extensions can efficiently compute <tt>AESL(x^y)</tt> and (with SHA3 extensions) three-way XOR operations. For convenience, the following additional primitives can be defined:</t>
          <ul spacing="normal">
            <li>
              <t><tt>XAESL(x,y)</tt>: Computes <tt>AESL(x^y)</tt> in a single fused operation (assembly instruction <tt>AESE ∘ AESMC</tt>, or equivalently C intrinsic <tt>vaesmcq_u8(vaeseq_u8(x,y))</tt>)</t>
            </li>
            <li>
              <t><tt>XOR3(x,y,z)</tt>: Computes <tt>x^y^z</tt> in a single three-way XOR instruction (assembly instruction <tt>EOR3</tt>, or equivalently C intrinsic <tt>veor3q_u8(x,y,z)</tt>)</t>
            </li>
          </ul>
          <section anchor="arm-optimized-update-function">
            <name>ARM-Optimized Update Function</name>
            <t>Original implementation:</t>
            <artwork><![CDATA[
Update(xi)
  t = AESL(S0 ^ S1) ^ xi
 S0 = AESL(S13) ^ t
 S3 =  S3 ^ xi
S13 = S13 ^ xi
Rol()
]]></artwork>
            <t>ARM-optimized implementation:</t>
            <artwork><![CDATA[
Update_ARM(xi)
  t = XAESL(S0, S1) ^ xi
 S0 = AESL(S13) ^ t
 S3 = S3 ^ xi
S13 = S13 ^ xi
Rol()
]]></artwork>
          </section>
          <section anchor="arm-optimized-updateenc-function">
            <name>ARM-Optimized UpdateEnc Function</name>
            <t>Original implementation:</t>
            <artwork><![CDATA[
UpdateEnc(mi)
  t = AESL(S0 ^ S1) ^ mi
 ci = t ^ S9
 S0 = AESL(S13) ^ t
 S3 =  S3 ^ mi
S13 = S13 ^ mi
Rol()
return ci
]]></artwork>
            <t>ARM-optimized implementation:</t>
            <artwork><![CDATA[
UpdateEnc_ARM(mi)
  t = XAESL(S0, S1) ^ mi
 ci = t ^ S9
 S0 = AESL(S13) ^ t
 S3 = S3 ^ mi
S13 = S13 ^ mi
Rol()
return ci
]]></artwork>
          </section>
          <section anchor="arm-optimized-decpartial-function">
            <name>ARM-Optimized DecPartial Function</name>
            <t>Original implementation:</t>
            <artwork><![CDATA[
DecPartial(cn)
ks = AESL(S0 ^ S1) ^ ZeroPad(cn) ^ S9
ci = cn || Tail(ks, 128 - |cn|)
mi = UpdateDec(ci)
mn = Truncate(mi, |cn|)
return mn
]]></artwork>
            <t>ARM-optimized implementation:</t>
            <artwork><![CDATA[
DecPartial_ARM(cn)
ks = XOR3(XAESL(S0, S1), ZeroPad(cn), S9)
ci = cn || Tail(ks, 128 - |cn|)
mi = UpdateDec_ARM(ci)
mn = Truncate(mi, |cn|)
return mn
]]></artwork>
          </section>
          <section anchor="arm-optimized-updatedec-function">
            <name>ARM-Optimized UpdateDec Function</name>
            <t>Original implementation:</t>
            <artwork><![CDATA[
UpdateDec(ci)
  t = ci ^ S9
 mi = AESL(S0 ^ S1) ^ t
 S0 = AESL(S13) ^ t
 S3 =  S3 ^ mi
S13 = S13 ^ mi
Rol()
return mi
]]></artwork>
            <t>ARM-optimized implementation:</t>
            <artwork><![CDATA[
UpdateDec_ARM(ci)
  t = ci ^ S9
 mi = XAESL(S0, S1) ^ t
 S0 = AESL(S13) ^ t
 S3 =  S3 ^ mi
S13 = S13 ^ mi
Rol()
return mi
]]></artwork>
          </section>
        </section>
        <section anchor="intel-aes-ni-optimizations">
          <name>Intel AES-NI Optimizations</name>
          <t>Intel processors with AES-NI can efficiently compute <tt>AESL(y)^z</tt> patterns. We can define the following additional function:</t>
          <ul spacing="normal">
            <li>
              <t><tt>AESLX(y,z)</tt>: Computes <tt>AESL(y) ^ z</tt> using a single instruction (assembly instruction <tt>AESENC</tt>, or equivalently C intrinsic <tt>_mm_aesenc_si128(y, z)</tt>)</t>
            </li>
          </ul>
          <section anchor="intel-optimized-update-function">
            <name>Intel-Optimized Update Function</name>
            <t>Original implementation:</t>
            <artwork><![CDATA[
Update(xi)
  t = AESL(S0 ^ S1) ^ xi
 S0 = AESL(S13) ^ t
 S3 =  S3 ^ xi
S13 = S13 ^ xi
Rol()
]]></artwork>
            <t>Intel-optimized implementation:</t>
            <artwork><![CDATA[
Update_Intel(xi)
  t = AESL(S0 ^ S1) ^ xi
 S0 = AESLX(S13, t)
 S3 =  S3 ^ xi
S13 = S13 ^ xi
Rol()
]]></artwork>
          </section>
          <section anchor="intel-optimized-updateenc-function">
            <name>Intel-Optimized UpdateEnc Function</name>
            <t>Original implementation:</t>
            <artwork><![CDATA[
UpdateEnc(mi)
  t = AESL(S0 ^ S1) ^ mi
 ci = t ^ S9
 S0 = AESL(S13) ^ t
 S3 =  S3 ^ mi
S13 = S13 ^ mi
Rol()
return ci
]]></artwork>
            <t>Intel-optimized implementation:</t>
            <artwork><![CDATA[
UpdateEnc_Intel(mi)
  t = AESL(S0 ^ S1) ^ mi
 ci = t ^ S9
 S0 = AESLX(S13, t)
 S3 =  S3 ^ mi
S13 = S13 ^ mi
Rol()
return ci
]]></artwork>
          </section>
          <section anchor="intel-optimized-decpartial-function">
            <name>Intel-Optimized DecPartial Function</name>
            <t>Original implementation:</t>
            <artwork><![CDATA[
DecPartial(cn)
ks = AESL(S0 ^ S1) ^ ZeroPad(cn) ^ S9
ci = cn || Tail(ks, 128 - |cn|)
mi = UpdateDec(ci)
mn = Truncate(mi, |cn|)
return mn
]]></artwork>
            <t>Intel-optimized implementation:</t>
            <artwork><![CDATA[
DecPartial_Intel(cn)
ks = AESL(S0 ^ S1) ^ ZeroPad(cn) ^ S9
ci = cn || Tail(ks, 128 - |cn|)
mi = UpdateDec_Intel(ci)
mn = Truncate(mi, |cn|)
return mn
]]></artwork>
          </section>
          <section anchor="intel-optimized-updatedec-function">
            <name>Intel-Optimized UpdateDec Function</name>
            <t>Original implementation:</t>
            <artwork><![CDATA[
UpdateDec(ci)
  t = ci ^ S9
 mi = AESL(S0 ^ S1) ^ t
 S0 = AESL(S13) ^ t
 S3 =  S3 ^ mi
S13 = S13 ^ mi
Rol()
return mi
]]></artwork>
            <t>Intel-optimized implementation:</t>
            <artwork><![CDATA[
UpdateDec_Intel(ci)
  t = ci ^ S9
 mi = AESL(S0 ^ S1) ^ t
 S0 = AESLX(S13, t)
 S3 =  S3 ^ mi
S13 = S13 ^ mi
Rol()
return mi
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="decryption-performance">
        <name>Decryption Performance</name>
        <t>It is expected that HiAE decryption will be slower than encryption due to inherent data dependencies in the algorithm. While encryption can process keystream generation and state updates in parallel, decryption must first recover the plaintext before performing any state updates. This sequential dependency chain is a consequence of HiAE’s design, which incorporates plaintext into the internal state to provide strong authentication properties.</t>
      </section>
      <section anchor="security-considerations-for-implementations">
        <name>Security Considerations for Implementations</name>
        <t>The security of HiAE against timing and physical attacks is limited by the implementation of the underlying <tt>AESL</tt> function. Failure to implement <tt>AESL</tt> in a fashion safe against timing and physical attacks, such as differential power analysis, timing analysis, or fault injection attacks, may lead to leakage of secret key material or state information. The exact mitigations required for timing and physical attacks depend on the threat model in question.</t>
        <t>When implementing the platform-specific optimizations described above, care must be taken to ensure that:</t>
        <ul spacing="normal">
          <li>
            <t>All operations complete in constant time</t>
          </li>
          <li>
            <t>No secret-dependent memory accesses occur</t>
          </li>
          <li>
            <t>The optimization does not introduce timing variations based on input data</t>
          </li>
        </ul>
      </section>
      <section anchor="validation">
        <name>Validation</name>
        <t>A complete list of known implementations and integrations is available at <eref target="https://github.com/hiae-aead/draft-pham-hiae"/>, including reference implementations. A comprehensive comparison of HiAE’s performance with other high-throughput authenticated encryption schemes on ARM and x86 architectures is also provided, demonstrating the effectiveness of these platform-specific optimizations.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA is requested to register the following entry in the AEAD Algorithms Registry:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Algorithm Name</th>
            <th align="left">ID</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>AEAD_HIAE</tt></td>
            <td align="left"> </td>
          </tr>
        </tbody>
      </table>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="FIPS-AES" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197.pdf">
          <front>
            <title>Advanced encryption standard (AES)</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2001" month="November"/>
          </front>
          <refcontent>Federal Information Processing Standards Publication 197</refcontent>
        </reference>
        <reference anchor="I-D.irtf-cfrg-aegis-aead">
          <front>
            <title>The AEGIS Family of Authenticated Encryption Algorithms</title>
            <author fullname="Frank Denis" initials="F." surname="Denis">
              <organization>Fastly Inc.</organization>
            </author>
            <author fullname="Samuel Lucas" initials="S." surname="Lucas">
              <organization>Individual Contributor</organization>
            </author>
            <date day="17" month="February" year="2025"/>
            <abstract>
              <t>   This document describes the AEGIS-128L, AEGIS-256, AEGIS-128X, and
   AEGIS-256X AES-based authenticated encryption algorithms designed for
   high-performance applications.

   The document is a product of the Crypto Forum Research Group (CFRG).
   It is not an IETF product and is not a standard.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Source for this draft and an issue tracker can be found at
   https://github.com/cfrg/draft-irtf-cfrg-aegis-aead.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-aegis-aead-16"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. 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="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </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="RFC5116">
          <front>
            <title>An Interface and Algorithms for Authenticated Encryption</title>
            <author fullname="D. McGrew" initials="D." surname="McGrew"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>This document defines algorithms for Authenticated Encryption with Associated Data (AEAD), and defines a uniform interface and a registry for such algorithms. The interface and registry can be used as an application-independent set of cryptoalgorithm suites. This approach provides advantages in efficiency and security, and promotes the reuse of crypto implementations. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5116"/>
          <seriesInfo name="DOI" value="10.17487/RFC5116"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="ROCCA-S">
          <front>
            <title>An Ultra-High Throughput AES-Based Authenticated Encryption Scheme for 6G: Design and Implementation</title>
            <author initials="R." surname="Anand" fullname="Ravi Anand">
              <organization/>
            </author>
            <author initials="S." surname="Banik" fullname="Subhadeep Banik">
              <organization/>
            </author>
            <author initials="A." surname="Caforio" fullname="Andrea Caforio">
              <organization/>
            </author>
            <author initials="K." surname="Fukushima" fullname="Kazuhide Fukushima">
              <organization/>
            </author>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization/>
            </author>
            <author initials="S." surname="Kiyomoto" fullname="Shisaku Kiyomoto">
              <organization/>
            </author>
            <author initials="F." surname="Liu" fullname="Fukang Liu">
              <organization/>
            </author>
            <author initials="Y." surname="Nakano" fullname="Yuto Nakano">
              <organization/>
            </author>
            <author initials="K." surname="Sakamoto" fullname="Kosei Sakamoto">
              <organization/>
            </author>
            <author initials="N." surname="Takeuchi" fullname="Nobuyuki Takeuchi">
              <organization/>
            </author>
            <date year="2024"/>
          </front>
          <seriesInfo name="DOI" value="10.1007/978-3-031-50594-2_12"/>
          <refcontent>Cryptology and Network Security (CANS 2023)</refcontent>
        </reference>
        <reference anchor="SNOW-V">
          <front>
            <title>SNOW-V: an AES-based Stream Cipher for 5G and 6G Communication Systems</title>
            <author initials="P." surname="Ekdahl" fullname="Patrik Ekdahl">
              <organization>Ericsson Research</organization>
            </author>
            <author initials="T." surname="Johansson" fullname="Thomas Johansson">
              <organization>Lund University</organization>
            </author>
            <author initials="A." surname="Maximov" fullname="Alexander Maximov">
              <organization>Ericsson Research</organization>
            </author>
            <author initials="J." surname="Yang" fullname="Jing Yang">
              <organization>Ericsson Research</organization>
            </author>
            <date year="2019"/>
          </front>
          <seriesInfo name="DOI" value="10.13154/tosc.v2019.i3.1-42"/>
          <refcontent>IACR Transactions on Symmetric Cryptology, 2019(3)</refcontent>
        </reference>
        <reference anchor="AES-NI" target="https://www.intel.com/content/dam/doc/white-paper/advanced-encryption-standard-new-instructions-set-paper.pdf">
          <front>
            <title>Intel Advanced Encryption Standard (AES) New Instructions Set</title>
            <author initials="S." surname="Gueron" fullname="Shay Gueron">
              <organization>Intel Corporation</organization>
            </author>
            <date year="2010"/>
          </front>
        </reference>
        <reference anchor="HiAE" target="https://eprint.iacr.org/2025/377">
          <front>
            <title>HiAE: A High-Throughput Authenticated Encryption Algorithm for Cross-Platform Efficiency</title>
            <author initials="H." surname="Chen" fullname="Han Chen">
              <organization>Huawei International Pte., Ltd.</organization>
            </author>
            <author initials="T." surname="Huang" fullname="Tao Huang">
              <organization>Huawei International Pte., Ltd.</organization>
            </author>
            <author initials="P." surname="Pham" fullname="Phuong Pham">
              <organization>Huawei International Pte., Ltd.</organization>
            </author>
            <author initials="S." surname="Wu" fullname="Shuang Wu">
              <organization>Huawei International Pte., Ltd.</organization>
            </author>
            <date year="2025"/>
          </front>
          <refcontent>Cryptology ePrint Archive, Paper 2025/377</refcontent>
        </reference>
        <reference anchor="NIST-LWC" target="https://csrc.nist.gov/projects/lightweight-cryptography">
          <front>
            <title>NIST Lightweight Cryptography (LWC)</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2025"/>
          </front>
        </reference>
        <reference anchor="HiAE-Clarification" target="https://eprint.iacr.org/2025/1235">
          <front>
            <title>HiAE Remains Secure in Its Intended Model: A Clarification of Claimed Attacks</title>
            <author initials="P." surname="Pham" fullname="Phuong Pham">
              <organization>Huawei International Pte., Ltd.</organization>
            </author>
            <author initials="L." surname="Prabel" fullname="Lucas Prabel">
              <organization>Huawei International Pte., Ltd.</organization>
            </author>
            <author initials="S." surname="Wu" fullname="Shuang Wu">
              <organization>Huawei International Pte., Ltd.</organization>
            </author>
            <date year="2025"/>
          </front>
          <refcontent>Cryptology ePrint Archive, Paper 2025/1235</refcontent>
        </reference>
      </references>
    </references>
    <?line 1138?>

<section anchor="test-vectors">
      <name>Test Vectors</name>
      <section anchor="test-vector-1-empty-plaintext-no-ad">
        <name>Test Vector 1 - Empty plaintext, no AD</name>
        <sourcecode type="test-vectors"><![CDATA[
key   : 4b7a9c3ef8d2165a0b3e5f8c9d4a7b1e
        2c5f8a9d3b6e4c7f0a1d2e5b8c9f4a7d

nonce : a5b8c2d9e3f4a7b1c8d5e9f2a3b6c7d8

ad    :

msg   :

ct    :

tag   : e3b7c5993e804d7e1f95905fe8fa1d74
]]></sourcecode>
      </section>
      <section anchor="test-vector-2-single-block-plaintext-no-ad">
        <name>Test Vector 2 - Single block plaintext, no AD</name>
        <sourcecode type="test-vectors"><![CDATA[
key   : 2f8e4d7c3b9a5e1f8d2c6b4a9f3e7d5c
        1b8a6f4e3d2c9b5a8f7e6d4c3b2a1f9e

nonce : 7c3e9f5a1d8b4c6f2e9a5d7b3f8c1e4a

ad    :

msg   : 55f00fcc339669aa55f00fcc339669aa

ct    : 66fc201d96ace3ca550326964c2fa950

tag   : 2e4d9b3bf320283de63ea5547454878d
]]></sourcecode>
      </section>
      <section anchor="test-vector-3-empty-plaintext-with-ad">
        <name>Test Vector 3 - Empty plaintext with AD</name>
        <sourcecode type="test-vectors"><![CDATA[
key   : 9f3e7d5c4b8a2f1e9d8c7b6a5f4e3d2c
        1b0a9f8e7d6c5b4a3f2e1d0c9b8a7f6e

nonce : 3d8c7f2a5b9e4c1f8a6d3b7e5c2f9a4d

ad    : 394a5b6c7d8e9fb0c1d2e3f405162738
        495a6b7c8d9eafc0d1e2f30415263748

msg   :

ct    :

tag   : 531a4d1ed47bda55d01cc510512099e4
]]></sourcecode>
      </section>
      <section anchor="test-vector-4-rate-aligned-plaintext-256-bytes">
        <name>Test Vector 4 - Rate-aligned plaintext (256 bytes)</name>
        <sourcecode type="test-vectors"><![CDATA[
key   : 6c8f2d5a9e3b7f4c1d8a5e9f3c7b2d6a
        4f8e1c9b5d3a7e2f4c8b6d9a1e5f3c7d

nonce : 9a5c7e3f1b8d4a6c2e9f5b7d3a8c1e6f

ad    :

msg   : ffffffffffffffffffffffffffffffff
        ffffffffffffffffffffffffffffffff
        ffffffffffffffffffffffffffffffff
        ffffffffffffffffffffffffffffffff
        ffffffffffffffffffffffffffffffff
        ffffffffffffffffffffffffffffffff
        ffffffffffffffffffffffffffffffff
        ffffffffffffffffffffffffffffffff
        ffffffffffffffffffffffffffffffff
        ffffffffffffffffffffffffffffffff
        ffffffffffffffffffffffffffffffff
        ffffffffffffffffffffffffffffffff
        ffffffffffffffffffffffffffffffff
        ffffffffffffffffffffffffffffffff
        ffffffffffffffffffffffffffffffff
        ffffffffffffffffffffffffffffffff

ct    : 2e28f49c20d1a90a5bce3bc85f6eab2f
        e0d3ee31c293f368ee20e485ec732c90
        45633aa4d53e271b1f583f4f0b208487
        6e4b0d2b2f633433e43c48386155d03d
        00dbf10c07a66159e1bec7859839263a
        c12e77045c6d718ddf5907297818e4ae
        0b4ed7b890f57fa585e4a5940525aa2f
        62e4b6748fa4cd86b75f69eff9dfd4df
        9b0861ae7d52541ff892aa41d41d55a9
        a62f4e4fefb718ee13faca582d73c1d1
        f51592c25c64b0a79d2f24181362dfbb
        352ac20e1b07be892a05b394eb6b2a9d
        473c49e6b63e754311fdbb6c476503f0
        a3570482ece70856ae6e6f8d5aa19cc2
        7b5bce24ee028e197ed9891b0a54bf02
        328cb80ceefc44b11043d784594226ab

tag   : f330ae219d6739aba556fe94776b486b
]]></sourcecode>
      </section>
      <section anchor="test-vector-5-rate-1-byte-plaintext">
        <name>Test Vector 5 - Rate + 1 byte plaintext</name>
        <sourcecode type="test-vectors"><![CDATA[
key   : 3e9d6c5b4a8f7e2d1c9b8a7f6e5d4c3b
        2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d

nonce : 6f2e8a5c9b3d7f1e4a8c5b9d3f7e2a6c

ad    : 6778899aabbccddeef00112233445566

msg   : cc339669aa55f00fcc339669aa55f00f
        cc339669aa55f00fcc339669aa55f00f
        cc339669aa55f00fcc339669aa55f00f
        cc339669aa55f00fcc339669aa55f00f
        cc339669aa55f00fcc339669aa55f00f
        cc339669aa55f00fcc339669aa55f00f
        cc339669aa55f00fcc339669aa55f00f
        cc339669aa55f00fcc339669aa55f00f
        cc339669aa55f00fcc339669aa55f00f
        cc339669aa55f00fcc339669aa55f00f
        cc339669aa55f00fcc339669aa55f00f
        cc339669aa55f00fcc339669aa55f00f
        cc339669aa55f00fcc339669aa55f00f
        cc339669aa55f00fcc339669aa55f00f
        cc339669aa55f00fcc339669aa55f00f
        cc339669aa55f00fcc339669aa55f00f
        cc

ct    : 5d2d2c7f1ff780687c65ed69c08805c2
        69652b55f5d1ef005f25300d1f644b57
        e500d5b0d75f9b025fee04cfdf422c6c
        3c472e6967ac60f69ff730d4d308faed
        beac375ae88da8ab78d26e496a5226b5
        ffd7834a2f76ecc495a444ffa3db60d8
        ec3fb75c0fcaa74966e1caec294c8eb7
        a4895aa2b1e3976eb6bed2f975ff218d
        c98f86f7c95996f03842cee71c6c1bc5
        f7b64374e101b32927ed95432e88f8e3
        8835f1981325dbcec412a4254e964c22
        cf82688ee5e471c23a3537de7e51c288
        92e32c565aa86ab708c70cf01f0d0ee9
        781251759893d55e60e0d70014cb3afb
        45e0821ba6e82e0f490ff2efef2f62c5
        7332c68c11e6ed71ef730b62c3e05edf
        f6

tag   : 1122dc5bedc7cad4e196f7227b7102f3
]]></sourcecode>
      </section>
      <section anchor="test-vector-6-rate-1-byte-plaintext">
        <name>Test Vector 6 - Rate - 1 byte plaintext</name>
        <sourcecode type="test-vectors"><![CDATA[
key   : 8a7f6e5d4c3b2a1f0e9d8c7b6a5f4e3d
        2c1b0a9f8e7d6c5b4a3f2e1d0c9b8a7f

nonce : 4d8b2f6a9c3e7f5d1b8a4c6e9f3d5b7a

ad    :

msg   : 00000000000000000000000000000000
        00000000000000000000000000000000
        00000000000000000000000000000000
        00000000000000000000000000000000
        00000000000000000000000000000000
        00000000000000000000000000000000
        00000000000000000000000000000000
        00000000000000000000000000000000
        00000000000000000000000000000000
        00000000000000000000000000000000
        00000000000000000000000000000000
        00000000000000000000000000000000
        00000000000000000000000000000000
        00000000000000000000000000000000
        00000000000000000000000000000000
        000000000000000000000000000000

ct    : 322970ad70b2af87676d57dd0b27866d
        8c4f0e251b5162b93672de1ab7aaf20c
        d91e7751a31e19762aeea4f3811657a3
        06787ff4ebc06957c1f45b7fd284ef87
        f3a902922999895ff26fddbd5986eac5
        ef856f6ae270136315c698ec7fe5a618
        8aa1847c00a3a870044e8d37e22b1bca
        b3e493d8ae984c7646f2536032a40910
        b6c0f317b916d5789189268c00ef4493
        bcb5fb0135974fa9bec299d473fdbf76
        f44107ec56b5941404fd4b3352576c31
        3169662f1664bd5bccf210a710aa6665
        fb3ec4fa3b4c648411fd09d4cada31b8
        947fdd486de45a4e4a33c151364e23be
        6b3fc14f0855b0518e733d5ea9051165
        25286bb2d6a46ac8ef73144e2046f9

tag   : 7eb4461a035fe51eaf4a1829605e6227
]]></sourcecode>
      </section>
      <section anchor="test-vector-7-medium-plaintext-with-ad">
        <name>Test Vector 7 - Medium plaintext with AD</name>
        <sourcecode type="test-vectors"><![CDATA[
key   : 5d9c3b7a8f2e6d4c1b9a8f7e6d5c4b3a
        2f1e0d9c8b7a6f5e4d3c2b1a0f9e8d7c

nonce : 8c5a7d3f9b1e6c4a2f8d5b9e3c7a1f6d

ad    : 95a6b7c8d9eafb0c1d2e3f5061728394
        a5b6c7d8e9fa0b1c2d3e4f60718293a4
        b5c6d7e8f90a1b2c3d4e5f708192a3b4
        c5d6e7f8091a2b3c4d5e6f8091a2b3c4

msg   : 32e14453e7a776781d4c4e2c3b23bca2
        441ee4213bc3df25021b5106c22c98e8
        a7b310142252c8dcff70a91d55cdc910
        3c1eccd9b5309ef21793a664e0d4b63c
        83530dcd1a6ad0feda6ff19153e9ee62
        0325c1cb979d7b32e54f41da3af1c169
        a24c47c1f6673e115f0cb73e8c507f15
        eedf155261962f2d175c9ba3832f4933
        fb330d28ad6aae787f12788706f45c92
        e72aea146959d2d4fa01869f7d072a7b
        f43b2e75265e1a000dde451b64658919
        e93143d2781955fb4ca2a38076ac9eb4
        9adc2b92b05f0ec7

ct    : ca3b18f0ffb25e4e1a6108abedcfc931
        841804c22a132a701d2f0b5eb845a380
        8028e9e1e0978795776c57a0415971cf
        e87abc72171a24fd11f3c331d1efe306
        e4ca1d8ede6e79cbd531020502d38026
        20d9453ffdd5633fe98ff1d12b057edd
        bd4d99ee6cabf4c8d2c9b4c7ee0d219b
        3b4145e3c63acde6c45f6d65e08dd06e
        f9dd2dde090f1f7579a5657720f348ae
        5761a8df321f20ad711a2c703b1c3f20
        0e4004da409daaa138f3c20f8f77c89c
        b6f46df671f25c75a6a7838a5d792d18
        a59c202fab564f0f

tag   : 74ba4c28296f09101db59c37c4759bcf
]]></sourcecode>
      </section>
      <section anchor="test-vector-8-single-byte-plaintext">
        <name>Test Vector 8 - Single byte plaintext</name>
        <sourcecode type="test-vectors"><![CDATA[
key   : 7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f2e
        1d0c9b8a7f6e5d4c3b2a1f0e9d8c7b6a

nonce : 2e7c9f5d3b8a4c6f1e9b5d7a3f8c2e4a

ad    :

msg   : ff

ct    : 51

tag   : 588535eb70c53ba5cce0d215194cb1c9
]]></sourcecode>
      </section>
      <section anchor="test-vector-9-two-blocks-plaintext">
        <name>Test Vector 9 - Two blocks plaintext</name>
        <sourcecode type="test-vectors"><![CDATA[
key   : 4c8b7a9f3e5d2c6b1a8f9e7d6c5b4a3f
        2e1d0c9b8a7f6e5d4c3b2a1f0e9d8c7b

nonce : 7e3c9a5f1d8b4e6c2a9f5d7b3e8c1a4f

ad    : c3d4e5f60718293a4b5c6d7e8fa0b1c2
        d3e4f5061728394a5b6c7d8e9fb0c1d2
        e3f405162738495a6b7c8d9eafc0d1e2

msg   : aa55f00fcc339669aa55f00fcc339669
        aa55f00fcc339669aa55f00fcc339669

ct    : 03694107097ff7ea0b1eac408fabb60a
        cd89df4d0288fa9063309e5e323bf78f

tag   : 2a3144f369a893c3d756f262067e5e59
]]></sourcecode>
      </section>
      <section anchor="test-vector-10-all-zeros-plaintext">
        <name>Test Vector 10 - All zeros plaintext</name>
        <sourcecode type="test-vectors"><![CDATA[
key   : 9e8d7c6b5a4f3e2d1c0b9a8f7e6d5c4b
        3a2f1e0d9c8b7a6f5e4d3c2b1a0f9e8d

nonce : 5f9d3b7e2c8a4f6d1b9e5c7a3d8f2b6e

ad    : daebfc0d1e2f405162738495a6b7c8d9

msg   : 00000000000000000000000000000000
        00000000000000000000000000000000
        00000000000000000000000000000000
        00000000000000000000000000000000
        00000000000000000000000000000000
        00000000000000000000000000000000
        00000000000000000000000000000000
        00000000000000000000000000000000

ct    : eef78d00c4de4c557d5c769e499af7b9
        8e5ad36cdaf1ff775a8629d82751e97e
        8f98caa0773fe81ee40266f0d52ddbbe
        f621504863bf39552682b29748f8c244
        5c176cd63865732141edc59073cff90e
        5996a23a763f8dd058a6a91ada1d8f83
        2f5e600b39f799a698228b68d20cd189
        e5e423b253a44c78060435050698ccae

tag   : 59970b0b35a7822f3b88b63396c2da98
]]></sourcecode>
      </section>
    </section>
    <section anchor="function-by-function-example">
      <name>Function-by-Function Example</name>
      <t>This appendix provides step-by-step examples of HiAE internal functions for implementers. All values are in hexadecimal.</t>
      <section anchor="initial-values-for-example">
        <name>Initial Values for Example</name>
        <artwork><![CDATA[
Key:   0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
Nonce: 00112233445566778899aabbccddeeff
AD:    48656c6c6f (5 bytes: "Hello")
Msg:   576f726c64 (5 bytes: "World")
]]></artwork>
      </section>
      <section anchor="aesl-function-example">
        <name>AESL Function Example</name>
        <t>The AESL function performs a single AES encryption round with a zero round key.</t>
        <artwork><![CDATA[
Input Block:  00112233445566778899aabbccddeeff

Output Block: 6379e6d9f467fb76ad063cf4d2eb8aa3
]]></artwork>
      </section>
      <section anchor="update-function-example">
        <name>Update Function Example</name>
        <t>The Update function modifies the internal state with an input block.</t>
        <section anchor="example-update">
          <name>Example: Update</name>
          <artwork><![CDATA[
Initial state: (16 AES blocks after initialization)
  S0:  7cc0a8cc3b5f3fbce67c59a0c8e64f23
  S1:  0123456789abcdef0123456789abcdef
  S2:  00112233445566778899aabbccddeeff
  S3:  7cc0a8cc3b5f3fbce67c59a0c8e64f23
  S4:  00000000000000000000000000000000
  S5:  01224466ccfeaa88899abcfe01224466
  S6:  00000000000000000000000000000000
  S7:  d3d0e4c0f95c1d6b3e3dc8c7a6f90001
  S8:  00112233ccddeeff00112233ccddeeff
  S9:  00000000000000000000000000000000
  S10: 0123456789abcdef0123456789abcdef
  S11: 7cc0a8cc3b5f3fbce67c59a0c8e64f23
  S12: d3d0e4c0f95c1d6b3e3dc8c7a6f90001
  S13: 0123456789abcdef0123456789abcdef
  S14: 00000000000000000000000000000000
  S15: af104c0cc2f3228758410ff26f1f4e22

Input block: 48656c6c0000000000000000000000000

After applying the Update function:
  S0:  8a5b7f2c4d9e1a3f6b8c2d5e9f3a7b4c
  S3:  344582a03b5f3fbce67c59a0c8e64f23
  S13: 494608236b9ae1a30123456789abcdef
  (other blocks unchanged)
]]></artwork>
        </section>
      </section>
      <section anchor="initialize-function-example">
        <name>Initialize Function Example</name>
        <t>The Initialize function sets up the initial state from key and nonce.</t>
        <artwork><![CDATA[
Key:   0123456789abcdef0123456789abcdef
       0123456789abcdef0123456789abcdef
Nonce: 00112233445566778899aabbccddeeff

Initial State (before diffusion rounds):
  S0:  7cc0a8cc3b5f3fbce67c59a0c8e64f23
  S1:  0123456789abcdef0123456789abcdef
  S2:  00112233445566778899aabbccddeeff
  S3:  7cc0a8cc3b5f3fbce67c59a0c8e64f23
  S4:  00000000000000000000000000000000
  S5:  01224466ccfeaa88899abcfe01224466
  S6:  00000000000000000000000000000000
  S7:  d3d0e4c0f95c1d6b3e3dc8c7a6f90001
  S8:  00112233ccddeeff00112233ccddeeff
  S9:  00000000000000000000000000000000
  S10: 0123456789abcdef0123456789abcdef
  S11: 7cc0a8cc3b5f3fbce67c59a0c8e64f23
  S12: d3d0e4c0f95c1d6b3e3dc8c7a6f90001
  S13: 0123456789abcdef0123456789abcdef
  S14: 00000000000000000000000000000000
  S15: af104c0cc2f3228758410ff26f1f4e22

After diffusion and final XORs:
  S0:  3f8a2b5c9d4e7a1b6c2d9e5f3a8b4c7d
  S1:  e2c8d5f6a3b7914e7d8c2b6a5f9e3d4c
  S2:  7a4b6e9d2c5f8b3a1d4e7c9b6a5f3e2d
  S3:  d5f8c2b6a9e3b7d14c5a8f2e6d9b3c7a
  S4:  1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e
  S5:  a8b7c6d5e4f3029184736251a0b9c8d7
  S6:  5e6d7c8b9a0f1e2d3c4b5a6978879695
  S7:  c2d3e4f506172839a4b5c6d7e8f90102
  S8:  9a8b7c6d5e4f30214132243546576879
  S9:  0123456789abcdef0123456789abcdef
  S10: 7b8c9d0e1f2a3b4c5d6e7f8091a2b3c4
  S11: e5f607182930a4b5c6d7e8f901234567
  S12: 3c4d5e6f708192a3b4c5d6e7f8091a2b
  S13: ccddeeff00112233445566778899aabb
  S14: a7b8c9d0e1f20314253647589a6b7c8d
  S15: 2a3b4c5d6e7f809102143526a7b8c9d0
]]></artwork>
      </section>
      <section anchor="enc-function-example">
        <name>Enc Function Example</name>
        <t>The Enc function encrypts a single message block.</t>
        <artwork><![CDATA[
State: (after processing AD "Hello")
Message Block: 576f726c640000000000000000000000

Ciphertext Block: 8b3a5f2c9d4e7a1b6c2d9e5f3a8b4c7d

Updated State:
  S0:  modified based on updateEnc
  S3:  XORed with message block
  S13: XORed with message block
]]></artwork>
      </section>
      <section anchor="finalize-function-example">
        <name>Finalize Function Example</name>
        <t>The Finalize function produces the authentication tag.</t>
        <artwork><![CDATA[
State: (after processing all AD and message)
AD length:  5 bytes
Msg length: 5 bytes

Length encoding block: 2800000000000000 2800000000000000
                      (40 bits)        (40 bits)

After diffusion rounds with length block:

Tag = S0 ^ S1 ^ ... ^ S15 = c4d8f3a2b5e9617d4c8a2f5b3e9d7a16
]]></artwork>
      </section>
      <section anchor="complete-encryption-example">
        <name>Complete Encryption Example</name>
        <artwork><![CDATA[
Key:       0123456789abcdef0123456789abcdef
           0123456789abcdef0123456789abcdef
Nonce:     00112233445566778899aabbccddeeff
AD:        48656c6c6f ("Hello")
Plaintext: 576f726c64 ("World")

Ciphertext: 8b3a5f2c9d
Tag:        c4d8f3a2b5e9617d4c8a2f5b3e9d7a16
]]></artwork>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+1923bcSHble34FRv3QpM2kcL9wumyzKKlKLt0sqtzV4+US
A0CARCtvlciUyCqVlx/nfV7mcb5lfmD+wV8y+5yIQASQSZHqrvZyr1VlN4UE
AnE5cS77nDgRmE6nk027mckT78GbK+l93Z4+9k63myu52LSV2Mjae7yo1jer
TbtceKezy+W63VzNH0xEWa7le7xFbzyY1MtqIeaopV6LZjNdXYn5tGrWl9Or
VsipH06oLrx8c+J1m3oyaVfrE2+z3nab0PcLPH8nbz4s1/WJ93SxkeuF3Ewf
UU2T33i4/e5yvdyuTrwz6sjSe7Jcb+eTblvO265Dv97crNDy08dvnkwm3UYs
6rditlzg1o3sJt1crDdvf9guN7JTd1btifcvm2V15HXL9WYtmw5XN3O6+NfJ
RGDwy/XJxJtOPPzXLvDWk2PvkVy0Hd9R43yyFot3zt3l+lIs2h8F0QlPRbeZ
3WAs1TE/lXPRzk68pv4H32+OMbpB9a+OvVcgmFP7q6vtcnFp7w5r/3orPsjW
rZjofbzil/7hip8eV8v5oJFnaGQtSjlzmnm2rUTn3r6rnRm9cLziF25r6PzY
O98unFbOr7Y/Xi23/d27Gum2i0694jYxWSzXc7zzXp5MUPrJ01fn09PH5yf8
pmHh0/q9WFRgWmmZljlCrGvvAMUPH3D5dYXCT2Qt12KGWWpU1Sj8ar2sJJgK
xD/X74FA23JGwkAFgiJTVWzE+lJuTryrzWbVnTx8uHg/W23L7hgMsTm+XL5/
SBd05yF19eGLp+dvjunqGDUcr+qGK+mZjf+b6n+ZRCfeC26RO9hhgNuN9JaN
0y38672R1dViOVte3ngH1MQhV1FD2E48SFYwDQIImxmgpt3rl2dnp9Mx6Rbe
t7PNWky/bi+vvDdXkLjLq9V244Fq0y9FB6LeqhfOqys5lx5a8dKvTiAVXXu5
4P49na9meLTY8Fgc4itR5o5TuRdyQ3LunctqCw2D0ZydvjjHEMJIT1kn1y3q
xVAMuR69fHriBf5x4PvZwyLLp9HUj4Jp4idFPA3fBuEnScy8+vrYO12g/f6u
4tjX4n07eDB6DSz+JVj43ei18215JWopV4Ono3dPj70zAUq1y9Hbp4t6LcXo
4ejlb469J9t32+6qnYvR69+IH7dXbS13CoyqeHPsPe2WpRy9/ka8E5CwdvBw
d9jftDfL+XIz7vv5VduJd9vx49H7UKPP2u3oVXRXQNrsg9FLfziGIFDfRu/9
YQtLMHiyS6tzPN7T22+WnWzHD0dvvzgmkshtddWO3n6xLLc323ft8LkRuTDG
z/MXL38//eehfOl74HaWqJIl6hzmR8y9s3Z1JdcsP8lXLA/pV97Zcj7fLoze
Ob/pNnLeORL09PTstfcGZqgTFRXpPC42n8vNuq08K2BH6FZQHNxDkKIgiR9u
ll11/J5eOW6j42Aa30OOYMEev6vF1WxEq1cCfXk3fsba7TE62XXo8mvZSbGu
rm5l139cXmGQKDpm2avlHOZr9zHX/2wLMn67gM5bd1Aotwrjc3Hdzpfvx8I4
k9eYB0zK+PnndP4fj70/gLlHdf8jWZfB/U/UafgqKPCTGOfF0yFfEV6aeb3h
c7XywPBBxX5gS7LeanY5l5v9puzDhw/HLVVLhvdhtcTlYvOwFvOHgHkPP1y1
GzldiZVcPxS62am1t1Njb6cL+WHaOg1OO6A6fu9O+2fUzVdbud6Z9/MrcTN+
whRUpDhbrlfLNUvNkII+fhJaHdKP73inHpm9qWv27gTBLK9n62XXTV/NxIZs
rPe4adqqBTVu9ts6+WoNynqnmF5w5hEEBOQgtZE8jLJbkIVc0TvHrajWxxjn
Q1P6bgp+DVuDQYzo9zVU0OA2E0/hMA2/DfJ4tZHHR96zTX18q3TivR0OfyOW
o/t/ehMuOLYtjAHyn9cGOO33Y7sE1Ep2ybl/7/p7W5DgJ6Gy6bPfnw25ju7C
5l1ebVAb/mp1fbkWqyuAH5Q/3M8MVbeuLMZcrZd/lNWmezizVU0rp6r/DJTJ
wyQxmp7NxLpttMnaFTNoNiB81jxAeRK0955uOqYlVG3tPV/WckayOKiHuoMb
7ZwQ6GYjqnfdZ8tWEEbJZwgXFb+X0fuLc+bQa7Ot7Hhu/1UFYDKdTj1RwgoA
pUwmbwAUPViRLfkEXi27at2WsmP2OfKEd0VaeGO1sBhoYcerE70WrtnbwFNS
xwt5vZleyoVUBsD70K7lDA4dHHzGT95B+tUh8zS31K0kXkR3hbchJKUDCp5Y
rYzH1x2rMczbup7JyeQ3NPT1slZGjUYkPfl+OdsaXu2bXCifpvM2yw9khtOv
MMIZmKMjmI5xeZfr5QcCAzXkYgFZw9vVbLmtCaO9byvpQb7fo/BaieHZoxfe
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

-->

</rfc>
