<?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.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-pham-cfrg-hiae-07" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="HiAE">The HiAE Authenticated Encryption Algorithm</title>
    <seriesInfo name="Internet-Draft" value="draft-pham-cfrg-hiae-07"/>
    <author initials="F." surname="Denis" fullname="Frank Denis">
      <organization>Fastly Inc.</organization>
      <address>
        <email>fde@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="2026" month="November" day="01"/>
    <keyword>AEAD</keyword>
    <keyword>AES</keyword>
    <keyword>stream cipher</keyword>
    <keyword>Message Authentication Code (MAC)</keyword>
    <abstract>
      <?line 171?>

<t>This document describes HiAE, a high-throughput authenticated encryption with associated data (AEAD) algorithm.
It targets next-generation wireless systems (6G) and high-speed data transmission applications.
This document also specifies its use as a stream cipher and a message authentication code (MAC).</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 177?>

<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>
    </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” 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>{ 0 }</tt>: a single zero byte (8 zero bits).</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 obtained when dividing <tt>a</tt> (the dividend) by <tt>b</tt> (the divisor) using Euclidean division.</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>Zeros(n)</tt>: returns an <tt>n</tt>-bit array containing only zero bits.</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>. <tt>Tail(x, 0)</tt> returns <tt>{}</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 the Test Vectors section.  </t>
          <t>
While Intel AES-NI and ARM NEON provide instructions with similar purposes (such as <tt>_mm_aesenc_si128</tt> on Intel and <tt>vaesmcq_u8(vaeseq_u8(...))</tt> on ARM), these instructions are not directly interchangeable at the API and code-generation levels. The architectural differences in how AES round functions are exposed and optimized require platform-specific implementation strategies, as detailed in the Implementation Considerations section.</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 <tt>F</tt>.</t>
        </li>
        <li>
          <t><tt>CtEq(a, b)</tt>: compares <tt>a</tt> and <tt>b</tt> in constant time. Returns <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>
        <li>
          <t><tt>ZERO</tt>: an AES block of all zeros (128 zero bits).</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, as defined in <xref section="4" sectionFormat="of" 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, including the tag) is <tt>P_MAX</tt> + 16 bytes. In bits, this limit is (2<sup>64</sup> - 8) + 128.</t>
          </li>
        </ul>
        <t>Distinct associated data inputs, as described in <xref section="3" sectionFormat="of" 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>
        <sourcecode type="pseudocode"><![CDATA[
Encrypt(msg, ad, key, nonce)
]]></sourcecode>
        <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>
        <sourcecode type="pseudocode"><![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 mi in msg_blocks:
    ct = ct || Enc(mi)

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

return (ct, tag)
]]></sourcecode>
      </section>
      <section anchor="authenticated-decryption">
        <name>Authenticated Decryption</name>
        <sourcecode type="pseudocode"><![CDATA[
Decrypt(ct, tag, ad, key, nonce)
]]></sourcecode>
        <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>P_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>
        <sourcecode type="pseudocode"><![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
]]></sourcecode>
      </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>
          <sourcecode type="pseudocode"><![CDATA[
Rol()
]]></sourcecode>
          <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>
          <sourcecode type="pseudocode"><![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
]]></sourcecode>
        </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>
            <sourcecode type="pseudocode"><![CDATA[
Update(xi)
]]></sourcecode>
            <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>
            <sourcecode type="pseudocode"><![CDATA[
  t = AESL(S0 ^ S1) ^ xi
 S0 = AESL(S13) ^ t
 S3 =  S3 ^ xi
S13 = S13 ^ xi

Rol()
]]></sourcecode>
          </section>
          <section anchor="the-updateenc-function">
            <name>The UpdateEnc Function</name>
            <sourcecode type="pseudocode"><![CDATA[
UpdateEnc(mi)
]]></sourcecode>
            <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>
            <sourcecode type="pseudocode"><![CDATA[
  t = AESL(S0 ^ S1) ^ mi
 ci = t ^ S9
 S0 = AESL(S13) ^ t
 S3 =  S3 ^ mi
S13 = S13 ^ mi

Rol()

return ci
]]></sourcecode>
          </section>
          <section anchor="the-updatedec-function">
            <name>The UpdateDec Function</name>
            <sourcecode type="pseudocode"><![CDATA[
UpdateDec(ci)
]]></sourcecode>
            <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>
            <sourcecode type="pseudocode"><![CDATA[
  t = ci ^ S9
 mi = AESL(S0 ^ S1) ^ t
 S0 = AESL(S13) ^ t
 S3 =  S3 ^ mi
S13 = S13 ^ mi

Rol()

return mi
]]></sourcecode>
          </section>
          <section anchor="the-diffuse-function">
            <name>The Diffuse Function</name>
            <sourcecode type="pseudocode"><![CDATA[
Diffuse(x0, x1)
]]></sourcecode>
            <t>The <tt>Diffuse</tt> function ensures full state mixing by performing 32 consecutive update operations, alternating between two input values. 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>x0</tt>: a 128-bit input value for even-numbered updates (updates 0, 2, 4, ..., 30).</t>
              </li>
              <li>
                <t><tt>x1</tt>: a 128-bit input value for odd-numbered updates (updates 1, 3, 5, ..., 31).</t>
              </li>
            </ul>
            <t>Modifies:</t>
            <ul spacing="normal">
              <li>
                <t><tt>{S0, ...S15}</tt>: the state.</t>
              </li>
            </ul>
            <t>Steps:</t>
            <sourcecode type="pseudocode"><![CDATA[
Repeat(16,
  Update(x0)
  Update(x1)
)
]]></sourcecode>
          </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>
          <sourcecode type="pseudocode"><![CDATA[
Init(key, nonce)
]]></sourcecode>
          <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>
          <sourcecode type="pseudocode"><![CDATA[
k0, k1 = Split(key, 128)

 S0 = C0
 S1 = k0
 S2 = C0
 S3 = nonce
 S4 = ZERO
 S5 = k0
 S6 = ZERO
 S7 = C1
 S8 = k1
 S9 = ZERO
S10 = nonce ^ k1
S11 = C0
S12 = C1
S13 = k1
S14 = ZERO
S15 = C0 ^ C1

Diffuse(k0, k1)
]]></sourcecode>
        </section>
        <section anchor="the-absorb-function">
          <name>The Absorb Function</name>
          <sourcecode type="pseudocode"><![CDATA[
Absorb(ai)
]]></sourcecode>
          <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>
          <sourcecode type="pseudocode"><![CDATA[
Update(ai)
]]></sourcecode>
        </section>
        <section anchor="the-enc-function">
          <name>The Enc Function</name>
          <sourcecode type="pseudocode"><![CDATA[
Enc(mi)
]]></sourcecode>
          <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>
          <sourcecode type="pseudocode"><![CDATA[
ci = UpdateEnc(mi)
return ci
]]></sourcecode>
        </section>
        <section anchor="the-dec-function">
          <name>The Dec Function</name>
          <sourcecode type="pseudocode"><![CDATA[
Dec(ci)
]]></sourcecode>
          <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>
          <sourcecode type="pseudocode"><![CDATA[
mi = UpdateDec(ci)
return mi
]]></sourcecode>
        </section>
        <section anchor="the-decpartial-function">
          <name>The DecPartial Function</name>
          <sourcecode type="pseudocode"><![CDATA[
DecPartial(cn)
]]></sourcecode>
          <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>: a non-empty final ciphertext block shorter than 128 bits.</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>
          <sourcecode type="pseudocode"><![CDATA[
# Step 1: Recover the keystream that would encrypt a full zero block
ks = AESL(S0 ^ S1) ^ ZeroPad(cn, 128) ^ 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
]]></sourcecode>
        </section>
        <section anchor="the-finalize-function">
          <name>The Finalize Function</name>
          <sourcecode type="pseudocode"><![CDATA[
Finalize(ad_len_bits, msg_len_bits)
]]></sourcecode>
          <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>
          <sourcecode type="pseudocode"><![CDATA[
t = LE64(ad_len_bits) || LE64(msg_len_bits)
Diffuse(t, t)

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

return tag
]]></sourcecode>
        </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>
      <sourcecode type="pseudocode"><![CDATA[
combined_ct = ct || tag
]]></sourcecode>
      <t>The length of <tt>combined_ct</tt> <bcp14>MUST</bcp14> be less than or equal to <tt>C_MAX</tt>.</t>
    </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>
        <sourcecode type="pseudocode"><![CDATA[
Stream(len, key, nonce)
]]></sourcecode>
        <t>The <tt>Stream</tt> function expands a key and an optional nonce into a variable-length keystream.</t>
        <t>Security:</t>
        <ul spacing="normal">
          <li>
            <t>When the nonce is fixed (including when using the default all-zeros nonce), a distinct key <bcp14>MUST</bcp14> be used for each invocation to maintain security.</t>
          </li>
        </ul>
        <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>
        <sourcecode type="pseudocode"><![CDATA[
if nonce is unspecified:
    nonce = Zeros(128)

if len == 0:
    return {}
else:
    stream, tag = Encrypt(Zeros(len), {}, key, nonce)
    return stream
]]></sourcecode>
        <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>
        <t>Note: Implementations of the <tt>Encrypt</tt> and <tt>Decrypt</tt> functions are not required to support MAC-only mode. This is an optional feature that can be implemented separately.</t>
        <sourcecode type="pseudocode"><![CDATA[
Mac(data, key, nonce)
]]></sourcecode>
        <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>
        <sourcecode type="pseudocode"><![CDATA[
Init(key, nonce)

data_blocks = Split(ZeroPad(data, 128), 128)
for di in data_blocks:
    Absorb(di)

tag = Finalize(|data|, 0)

return tag
]]></sourcecode>
      </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>Usage constraints:</t>
        <ul spacing="normal">
          <li>
            <t>Tag truncation is not allowed. Implementations <bcp14>MUST</bcp14> use the full 128-bit authentication tag.</t>
          </li>
          <li>
            <t>A single key <bcp14>MUST NOT</bcp14> be used to protect more than 2<sup>64</sup> messages.</t>
          </li>
          <li>
            <t>When HiAE is used for encryption, a nonce <bcp14>MUST</bcp14> only be used once for a given key.</t>
          </li>
        </ul>
        <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>A known statistical attack can distinguish HiAE’s output from random data, but requires an impractical amount of known plaintext and ciphertext.
This result does not establish a key-recovery or forgery attack.</t>
        <t>Finally, HiAE is assumed to be secure against key-committing attacks at the birthday bound security level (64 bits), but it is not secure in the context-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 oracles, 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: The attack described in <xref target="classic-setting"/> requires an impractical amount of data.</t>
          </li>
          <li>
            <t>Key-Committing Attacks: Secure in the FROB, CMT-1, and CMT-2 models at the birthday bound security level.</t>
          </li>
          <li>
            <t>Context-Committing Attacks: Security is not claimed in the CMT-3 model.</t>
          </li>
        </ol>
        <t>The original 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>
          <sourcecode type="pseudocode"><![CDATA[
  t = S0
 S0 = S1
 S1 = S2
 ...
S15 = t
]]></sourcecode>
          <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 fixed array positions</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>
            <sourcecode type="pseudocode"><![CDATA[
Update(xi)
  t = AESL(S0 ^ S1) ^ xi
 S0 = AESL(S13) ^ t
 S3 =  S3 ^ xi
S13 = S13 ^ xi
Rol()
]]></sourcecode>
            <t>ARM-optimized implementation:</t>
            <sourcecode type="pseudocode"><![CDATA[
Update_ARM(xi)
  t = XAESL(S0, S1) ^ xi
 S0 = AESL(S13) ^ t
 S3 = S3 ^ xi
S13 = S13 ^ xi
Rol()
]]></sourcecode>
          </section>
          <section anchor="arm-optimized-updateenc-function">
            <name>ARM-Optimized UpdateEnc Function</name>
            <t>Original implementation:</t>
            <sourcecode type="pseudocode"><![CDATA[
UpdateEnc(mi)
  t = AESL(S0 ^ S1) ^ mi
 ci = t ^ S9
 S0 = AESL(S13) ^ t
 S3 =  S3 ^ mi
S13 = S13 ^ mi
Rol()
return ci
]]></sourcecode>
            <t>ARM-optimized implementation:</t>
            <sourcecode type="pseudocode"><![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
]]></sourcecode>
          </section>
          <section anchor="arm-optimized-updatedec-function">
            <name>ARM-Optimized UpdateDec Function</name>
            <t>Original implementation:</t>
            <sourcecode type="pseudocode"><![CDATA[
UpdateDec(ci)
  t = ci ^ S9
 mi = AESL(S0 ^ S1) ^ t
 S0 = AESL(S13) ^ t
 S3 =  S3 ^ mi
S13 = S13 ^ mi
Rol()
return mi
]]></sourcecode>
            <t>ARM-optimized implementation:</t>
            <sourcecode type="pseudocode"><![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
]]></sourcecode>
          </section>
          <section anchor="arm-optimized-decpartial-function">
            <name>ARM-Optimized DecPartial Function</name>
            <t>Original implementation:</t>
            <sourcecode type="pseudocode"><![CDATA[
DecPartial(cn)
ks = AESL(S0 ^ S1) ^ ZeroPad(cn, 128) ^ S9
ci = cn || Tail(ks, 128 - |cn|)
mi = UpdateDec(ci)
mn = Truncate(mi, |cn|)
return mn
]]></sourcecode>
            <t>ARM-optimized implementation:</t>
            <sourcecode type="pseudocode"><![CDATA[
DecPartial_ARM(cn)
ks = XOR3(XAESL(S0, S1), ZeroPad(cn, 128), S9)
ci = cn || Tail(ks, 128 - |cn|)
mi = UpdateDec_ARM(ci)
mn = Truncate(mi, |cn|)
return mn
]]></sourcecode>
          </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>
            <sourcecode type="pseudocode"><![CDATA[
Update(xi)
  t = AESL(S0 ^ S1) ^ xi
 S0 = AESL(S13) ^ t
 S3 =  S3 ^ xi
S13 = S13 ^ xi
Rol()
]]></sourcecode>
            <t>Intel-optimized implementation:</t>
            <sourcecode type="pseudocode"><![CDATA[
Update_Intel(xi)
  t = AESLX(S0 ^ S1, xi)
 S0 = AESLX(S13, t)
 S3 =  S3 ^ xi
S13 = S13 ^ xi
Rol()
]]></sourcecode>
          </section>
          <section anchor="intel-optimized-updateenc-function">
            <name>Intel-Optimized UpdateEnc Function</name>
            <t>Original implementation:</t>
            <sourcecode type="pseudocode"><![CDATA[
UpdateEnc(mi)
  t = AESL(S0 ^ S1) ^ mi
 ci = t ^ S9
 S0 = AESL(S13) ^ t
 S3 =  S3 ^ mi
S13 = S13 ^ mi
Rol()
return ci
]]></sourcecode>
            <t>Intel-optimized implementation:</t>
            <sourcecode type="pseudocode"><![CDATA[
UpdateEnc_Intel(mi)
 ci = AESLX(S0 ^ S1, mi ^ S9)
  t = ci ^ S9
 S0 = AESLX(S13, t)
 S3 =  S3 ^ mi
S13 = S13 ^ mi
Rol()
return ci
]]></sourcecode>
          </section>
          <section anchor="intel-optimized-updatedec-function">
            <name>Intel-Optimized UpdateDec Function</name>
            <t>Original implementation:</t>
            <sourcecode type="pseudocode"><![CDATA[
UpdateDec(ci)
  t = ci ^ S9
 mi = AESL(S0 ^ S1) ^ t
 S0 = AESL(S13) ^ t
 S3 =  S3 ^ mi
S13 = S13 ^ mi
Rol()
return mi
]]></sourcecode>
            <t>Intel-optimized implementation:</t>
            <sourcecode type="pseudocode"><![CDATA[
UpdateDec_Intel(ci)
  t = ci ^ S9
 mi = AESLX(S0 ^ S1, t)
 S0 = AESLX(S13, t)
 S3 =  S3 ^ mi
S13 = S13 ^ mi
Rol()
return mi
]]></sourcecode>
          </section>
          <section anchor="intel-optimized-decpartial-function">
            <name>Intel-Optimized DecPartial Function</name>
            <t>Original implementation:</t>
            <sourcecode type="pseudocode"><![CDATA[
DecPartial(cn)
ks = AESL(S0 ^ S1) ^ ZeroPad(cn, 128) ^ S9
ci = cn || Tail(ks, 128 - |cn|)
mi = UpdateDec(ci)
mn = Truncate(mi, |cn|)
return mn
]]></sourcecode>
            <t>Intel-optimized implementation:</t>
            <sourcecode type="pseudocode"><![CDATA[
DecPartial_Intel(cn)
ks = AESLX(S0 ^ S1, ZeroPad(cn, 128) ^ S9)
ci = cn || Tail(ks, 128 - |cn|)
mi = UpdateDec_Intel(ci)
mn = Truncate(mi, |cn|)
return mn
]]></sourcecode>
          </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 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://doi.org/10.6028/NIST.FIPS.197-upd1">
          <front>
            <title>Advanced Encryption Standard (AES)</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2023" month="May"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/NIST.FIPS.197-upd1"/>
          <refcontent>Federal Information Processing Standards Publication 197, Update 1</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="5" month="October" 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-18"/>
        </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>Computer Security – ESORICS 2023</refcontent>
        </reference>
        <reference anchor="SNOW-V">
          <front>
            <title>A new SNOW stream cipher called SNOW-V</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="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="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/1235</refcontent>
        </reference>
      </references>
    </references>
    <?line 1166?>

<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   : a25049aa37deea054de461d10ce7840b
]]></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    : af9bd1865daa6fc351652589abf70bff

tag   : ed9e2edc8241c3184fc08972bd8e9952
]]></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   : 7e19c04f68f5af633bf67529cfb5e5f4
]]></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    : cf9f118ccc3ae98998ddaae1a5d1f9a1
        69e4ca3e732baf7178cdd9a353057166
        8fe403e77111eac3da34bf2f25719cea
        09445cc58197b1c6ac490626724e7372
        707cfb60cdba8262f0e33a1ef8adda1f
        2e390a80c58e5c055d9be9bbccdc06ad
        af74f1dcaa372204bf42e5e0e0ac5943
        7a353978298837023f79fac6daa1fe8f
        6bcaaaf060ae2e37ed7b7da0577a7643
        5f0403b8e277b6bc2ea99682f2d0d577
        77fec6d901e0d8fc7cf46bb97336812a
        2d8cfd39053993288cce2c077fce0c6c
        00e99cf919281b261acf86b058164f10
        1d9c24e8f40b4fa0ed60955eeeb4e33f
        f1087519c13db8e287199a7df7e94b0d
        368da9ccf3d2ecebfa46f860348f8e3c

tag   : 4f42c3042cba3973153673156309dd69
]]></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    : 522e4cd9b0881809d80e149bb4ed8b8a
        dd70b7257afca6c2bc38e4da11e290cf
        cabd9dd1d4ed8c514482f444f903e42e
        c21a7a605ee37f95a504ec667fabec40
        66eb4521cdaf9c4eb7b62d659ab0a936
        3b145f1120c1b2e589ab9cb893d01be0
        d22182fc7de4932f1e8652b50e4a0d48
        c49a8a1232b201e2e535cd95c15cf0ee
        389b75e372653579c72c4dd1906fd81c
        2b9fc2483fab8b4df5a09d59753b5bd4
        1334be2e5085e349b6e5aac0c555a0a8
        3e94eab974052131f8d451c9d85389a3
        6126f93464e6f93119c6b1bf15b4c0a9
        e6c9beb52e82c846c472f87c15ac49e9
        9d59248ba7e6b97ca04327769d6b8c1f
        751d95dba709fb335183c21476836ea1
        ab

tag   : 61bac11505dd8bbf55e7fbb7489de7b0
]]></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    : 2ba49be54eb675efe446fd597721d4cd
        ca6e01f1a51728a859d8f206d13cdb08
        ba4f0fe78fbbd6885964ed54e9beceed
        1ff306642c4761e67efa7a2620e57128
        15b5e9f066b42e879cd62e7adc2821e5
        08311b88a6ee14bedcbac7ce339994c0
        09bbbadf9444748e4ab9a91acbbc7301
        742dab74aa1be6847ad8e9f08c170359
        b87e0ccd480812aaaf847aff03c2e858
        1c55848c2b50f6c6608540fe82627a2c
        0f5ee37fbe9cdeab5f6c9799702bd303
        2bf733e2108d03247cd20edaa2c322e5
        bf086bfecc4ac97b61096f016c57d5d0
        1c24d398cefd5ae8131c1f51f172ce9c
        6d3b8395d396dcbd70b4af790018796b
        31f0b0ad6198f86e5e1f26e9258492

tag   : 221dd1b69afb4e0c149e0a058e471a4a
]]></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    : 1d8d56867870574d1c4ac114620c6a2a
        bb44680fe321dd116601e2c92540f85a
        11c41dcac9814397b8f37b812cd52c93
        2db6ecbaa247c3e14f228bd792334570
        2fc43ad1eb1b8086e2c3c57bb602971c
        29772a35dfb1c45c66f81633e67fdc8d
        8005457ddbe4179312abab981049eb0a
        0a555b9fa01378878d7349111e2446fd
        e89ce64022d032cbf0cf2672e00d7999
        ed8b631c1b9bee547cbe464673464a4b
        80e8f72ad2b91a40fdcee5357980c090
        b34ab5e732e2a7df7613131ee42e42ec
        6ae9b05ac5683ebe

tag   : e93686b266c481196d44536eb51b5f2d
]]></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    : 21

tag   : 3cf9020bd1cc59cc5f2f6ce19f7cbf68
]]></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    : c2e199ac8c23ce6e3778e7fd0b4f8f75
        2badd4b67be0cdc3f6c98ae5f6fb0d25

tag   : 7aea3fbce699ceb1d0737e0483217745
]]></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    : fc7f1142f681399099c5008980e73420
        65b4e62a9b9cb301bdf441d3282b6aa9
        3bd7cd735ef77755b4109f86b7c09083
        8e7b05f08ef4947946155a03ff483095
        152ef3dec8bdddae3990d00d41d5ee6c
        90dcf65dbed4b7ebbe9bb4ef096e1238
        d388bf15faacdb7a68be19dddc8a5b74
        216f4442bfa32d1dfccdc9c4020baec9

tag   : ad0b841c3d145a6ee86dc7b67338f113
]]></sourcecode>
      </section>
      <section anchor="test-vector-11-partial-block-ad-padding-demonstration">
        <name>Test Vector 11 - Partial-block AD (padding demonstration)</name>
        <t>This test vector specifically demonstrates the padding behavior when associated data length is not a multiple of the block size (128 bits). The AD is 13 bytes (104 bits), which requires 3 bytes (24 bits) of zero padding to reach the next block boundary.</t>
        <sourcecode type="test-vectors"><![CDATA[
key   : 11223344556677881122334455667788
        11223344556677881122334455667788

nonce : aabbccddeeff0011aabbccddeeff0011

ad    : 0102030405060708090a0b0c0d
        (13 bytes - padded to 16 bytes with zeros)

msg   : 48656c6c6f576f726c64
        (10 bytes)

ct    : 1fb0e0348c6a3a917133

tag   : 7d292173b55ba02dae56ac1224b7e775
]]></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. The examples use the following test data:</t>
      <ul spacing="normal">
        <li>
          <t>Key: <tt>0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef</tt></t>
        </li>
        <li>
          <t>Nonce: <tt>00112233445566778899aabbccddeeff</tt></t>
        </li>
        <li>
          <t>AD: <tt>48656c6c6f</tt> (5 bytes: “Hello”)</t>
        </li>
        <li>
          <t>Msg: <tt>576f726c64</tt> (5 bytes: “World”)</t>
        </li>
      </ul>
      <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="initialize-function-example">
        <name>Initialize Function Example</name>
        <t>The Initialize function sets up the initial state from the key and nonce.</t>
        <artwork><![CDATA[
Key:   0123456789abcdef0123456789abcdef
       0123456789abcdef0123456789abcdef
Nonce: 00112233445566778899aabbccddeeff

Initial state (before diffusion rounds):
  S0:  3243f6a8885a308d313198a2e0370734
  S1:  0123456789abcdef0123456789abcdef
  S2:  3243f6a8885a308d313198a2e0370734
  S3:  00112233445566778899aabbccddeeff
  S4:  00000000000000000000000000000000
  S5:  0123456789abcdef0123456789abcdef
  S6:  00000000000000000000000000000000
  S7:  4a4093822299f31d0082efa98ec4e6c8
  S8:  0123456789abcdef0123456789abcdef
  S9:  00000000000000000000000000000000
  S10: 01326754cdfeab9889baefdc45762310
  S11: 3243f6a8885a308d313198a2e0370734
  S12: 4a4093822299f31d0082efa98ec4e6c8
  S13: 0123456789abcdef0123456789abcdef
  S14: 00000000000000000000000000000000
  S15: 7803652aaac3c39031b3770b6ef3e1fc

State after Init (after diffusion):
  S0:  2a622bda4d229c9fc4b7d1a25399e321
  S1:  a04980e6407654f2760e59be74c05f9c
  S2:  308859e5787ab6c1705abbaecebfc316
  S3:  04782e5069799e9f3e325836a2ff3bcc
  S4:  007a12163596057152dc58a0f78cef2c
  S5:  7ce304cf04de20f8116cef51eea19e24
  S6:  c554da7a91164fc30e38c76ec038e66a
  S7:  3edcba33d2a5d02a4b598c5ffa003513
  S8:  50db6b4f18b7e282b8918311685abc18
  S9:  4253eebe1b72fec70ac3ec478cf9f2f2
  S10: 6bc09743dc45ba191c18a0d275ef9a8f
  S11: 251524aba97200f5b31eeeecb0f0a1c1
  S12: e1a99d3dd105e14085d6a0200f1d0c35
  S13: a4730f9d0f36ad7c67880342deed5310
  S14: 7d6ca34814e6e065c8cb4fa11ba2f8c4
  S15: 2b545cefe484f2e0ba5fb6359faffeca
]]></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>
        <artwork><![CDATA[
Initial state (after initialization):
  S0:  2a622bda4d229c9fc4b7d1a25399e321
  S1:  a04980e6407654f2760e59be74c05f9c
  S2:  308859e5787ab6c1705abbaecebfc316
  S3:  04782e5069799e9f3e325836a2ff3bcc
  S4:  007a12163596057152dc58a0f78cef2c
  S5:  7ce304cf04de20f8116cef51eea19e24
  S6:  c554da7a91164fc30e38c76ec038e66a
  S7:  3edcba33d2a5d02a4b598c5ffa003513
  S8:  50db6b4f18b7e282b8918311685abc18
  S9:  4253eebe1b72fec70ac3ec478cf9f2f2
  S10: 6bc09743dc45ba191c18a0d275ef9a8f
  S11: 251524aba97200f5b31eeeecb0f0a1c1
  S12: e1a99d3dd105e14085d6a0200f1d0c35
  S13: a4730f9d0f36ad7c67880342deed5310
  S14: 7d6ca34814e6e065c8cb4fa11ba2f8c4
  S15: 2b545cefe484f2e0ba5fb6359faffeca

Input block: 48656c6c6f0000000000000000000000

After applying the Update function:
  S0:  a04980e6407654f2760e59be74c05f9c
  S1:  308859e5787ab6c1705abbaecebfc316
  S2:  4c1d423c06799e9f3e325836a2ff3bcc
  S3:  007a12163596057152dc58a0f78cef2c
  S4:  7ce304cf04de20f8116cef51eea19e24
  S5:  c554da7a91164fc30e38c76ec038e66a
  S6:  3edcba33d2a5d02a4b598c5ffa003513
  S7:  50db6b4f18b7e282b8918311685abc18
  S8:  4253eebe1b72fec70ac3ec478cf9f2f2
  S9:  6bc09743dc45ba191c18a0d275ef9a8f
  S10: 251524aba97200f5b31eeeecb0f0a1c1
  S11: e1a99d3dd105e14085d6a0200f1d0c35
  S12: ec1663f16036ad7c67880342deed5310
  S13: 7d6ca34814e6e065c8cb4fa11ba2f8c4
  S14: 2b545cefe484f2e0ba5fb6359faffeca
  S15: 4672d0d4a6a8fc93fe85701ff61a9e10
]]></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"):
  S0:  a04980e6407654f2760e59be74c05f9c
  S1:  308859e5787ab6c1705abbaecebfc316
  S2:  4c1d423c06799e9f3e325836a2ff3bcc
  S3:  007a12163596057152dc58a0f78cef2c
  S4:  7ce304cf04de20f8116cef51eea19e24
  S5:  c554da7a91164fc30e38c76ec038e66a
  S6:  3edcba33d2a5d02a4b598c5ffa003513
  S7:  50db6b4f18b7e282b8918311685abc18
  S8:  4253eebe1b72fec70ac3ec478cf9f2f2
  S9:  6bc09743dc45ba191c18a0d275ef9a8f
  S10: 251524aba97200f5b31eeeecb0f0a1c1
  S11: e1a99d3dd105e14085d6a0200f1d0c35
  S12: ec1663f16036ad7c67880342deed5310
  S13: 7d6ca34814e6e065c8cb4fa11ba2f8c4
  S14: 2b545cefe484f2e0ba5fb6359faffeca
  S15: 4672d0d4a6a8fc93fe85701ff61a9e10

Message Block: 576f726c640000000000000000000000

Ciphertext Block: 03e5d2157300b718595429195c9278e7

Updated State after Enc:
  S0:  308859e5787ab6c1705abbaecebfc316
  S1:  4c1d423c06799e9f3e325836a2ff3bcc
  S2:  5715607a5196057152dc58a0f78cef2c
  S3:  7ce304cf04de20f8116cef51eea19e24
  S4:  c554da7a91164fc30e38c76ec038e66a
  S5:  3edcba33d2a5d02a4b598c5ffa003513
  S6:  50db6b4f18b7e282b8918311685abc18
  S7:  4253eebe1b72fec70ac3ec478cf9f2f2
  S8:  6bc09743dc45ba191c18a0d275ef9a8f
  S9:  251524aba97200f5b31eeeecb0f0a1c1
  S10: e1a99d3dd105e14085d6a0200f1d0c35
  S11: ec1663f16036ad7c67880342deed5310
  S12: 2a03d12470e6e065c8cb4fa11ba2f8c4
  S13: 2b545cefe484f2e0ba5fb6359faffeca
  S14: 4672d0d4a6a8fc93fe85701ff61a9e10
  S15: 9c56037e72109cee878398424f789257
]]></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 the AD and message):
  S0:  308859e5787ab6c1705abbaecebfc316
  S1:  4c1d423c06799e9f3e325836a2ff3bcc
  S2:  5715607a5196057152dc58a0f78cef2c
  S3:  7ce304cf04de20f8116cef51eea19e24
  S4:  c554da7a91164fc30e38c76ec038e66a
  S5:  3edcba33d2a5d02a4b598c5ffa003513
  S6:  50db6b4f18b7e282b8918311685abc18
  S7:  4253eebe1b72fec70ac3ec478cf9f2f2
  S8:  6bc09743dc45ba191c18a0d275ef9a8f
  S9:  251524aba97200f5b31eeeecb0f0a1c1
  S10: e1a99d3dd105e14085d6a0200f1d0c35
  S11: ec1663f16036ad7c67880342deed5310
  S12: 2a03d12470e6e065c8cb4fa11ba2f8c4
  S13: 2b545cefe484f2e0ba5fb6359faffeca
  S14: 4672d0d4a6a8fc93fe85701ff61a9e10
  S15: 9c56037e72109cee878398424f789257

AD length:  5 bytes (40 bits)
Msg length: 5 bytes (40 bits)

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

Tag = S0 ^ S1 ^ ... ^ S15 = 45178cd06ef0a8bed8e9082fe49ec818
]]></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: 03e5d21573
Tag:        45178cd06ef0a8bed8e9082fe49ec818
]]></artwork>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The HiAE algorithm leverages the AES permutation invented by Joan Daemen and Vincent Rijmen.</t>
      <t>We would like to thank Samuel Lucas for his review of the draft.
We thank Andrei Abramov for reporting a 17-step linear trail and its implications for keystream bias.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+192XrcSHbmPZ8Co74waTNZ2BdOl20WJXWpS5tFVXe1/bnE
ABAg0cqtE5kSWaXy58u5n5u5nGeZF5h38JPMf05EIALIJJnqZTw9X/Vnq5JA
LCdOnP2cCEwmk4N1u57KU+/R22vpfd2ePfHONutrOV+3lVjL2nsyr1a3y3W7
mHtn06vFql1fzx4diLJcyQ/oRT0eHdSLai5mGKVeiWY9WV6L2aRqVleT61bI
iZ8d0FjofHvqdev64KBdrk699WrTrUPfL/zw4L28/bhY1acHnjfxzp6cPdY/
Lvi/3Xolxcyr2uW1XPGTF7LrxJV0YSUIzxe19A5fnJ0fHfzCw4Dvr1aLzfLU
O6clLLyni9VmdtBtylnbdWj/9nYJmJ89efv04KBbi3n9TkwXczy6ld1BNxOr
9bs/bBZr2akny/bU+5f1ojr2usUKIDUdft3O6Me/HhwIgLJYYQUTQOh57Ry9
np54j+W87fiJwtDTlZi/d54uVldi3v7A8OOt6NbTW+/ZvDrht3Im2ump19Ty
H32/OZnL9WD81yfea+DaGf719WYxv7JPh8N/vREfZeuOTFt1suRO/3jNb0+q
xWwwyXNMshKlnDrTPN9UonMfPzTPlDqcLLnDXRNdnHgXm7kzy8X15ofrxaZ/
+tAk3WbeqS7uFAfzxWqGPh/k6QFaP332+mICyjrlnob6z+oPYl4N6f2CSEKs
au8QzY8ecftVhcZPZS1XYoptatTQaPx6tahAlC2Qb/oBQZtyamgzKLJj79tl
DU7wAjVYJ1etRJdmoYDxvMevnp16gX+S+mH+xctnF29PCNwT9J1slnWgQBar
K7k+9a7X62V3+sUX9aI9AWa+eKBbT5/8v4n+LyP11HvJMPKSOqBkAxgXjbMQ
/Nd7K6vr+WK6uLr1DmmOIx6C1nPqhX4YTfwEnG1QorH95tX5+dlkjOy59+10
vRKTr9ura+/tNZj06nq5WRPDT74SHbbhTiF0UV3LmfQwi5f+6hSM1LVXc4bv
2Ww5xav5mtfibNf5YobB5cq7kNUGAuzW+49//+/ek4tXb56dXzDoD21H4PvZ
F0WWT7DIKJgkflLEk/BdEN6LWSbqNyfe2Rzg9U8Vab8RH9rBi1E38MJXoPX3
o24Xm/Ja1FIuB29Hfc9OvHMBBLWLUe+zeQ1BOno56vzNifd0837TXbczMer+
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
d3LwfwDvkfYr8coAAA==

-->

</rfc>
