<?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.7) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-pham-cfrg-hiae-04" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="HiAE">The HiAE Authenticated Encryption Algorithm</title>
    <seriesInfo name="Internet-Draft" value="draft-pham-cfrg-hiae-04"/>
    <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="November" day="13"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 167?>

<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 171?>

<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” 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>{ 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 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 the Test Vectors section.  </t>
          <t><strong>Implementation Note</strong>: While Intel AES-NI and ARM NEON provide instructions with similar parameters and descriptions (such as <tt>_mm_aesenc_si128</tt> on Intel and <tt>vaesmcq_u8(vaeseq_u8(...))</tt> on ARM), these instructions are not functionally equivalent. The architectural differences in how AES round functions are implemented require platform-specific optimization 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 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 bytes ((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 mi in msg_blocks:
    ct = ct || Enc(mi)

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

return (ct, 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(x0, x1)
]]></artwork>
            <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>
            <artwork><![CDATA[
Repeat(16,
  Update(x0)
  Update(x1)
)
]]></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 = k0
 S2 = C0
 S3 = nonce
 S4 = ZeroPad({ 0 }, 128)
 S5 = k0
 S6 = ZeroPad({ 0 }, 128)
 S7 = C1
 S8 = k1
 S9 = ZeroPad({ 0 }, 128)
S10 = nonce ^ k1
S11 = C0
S12 = C1
S13 = k1
S14 = ZeroPad({ 0 }, 128)
S15 = C0 ^ C1

Diffuse(k0, 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, 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
]]></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, 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>Security:</t>
        <ul spacing="normal">
          <li>
            <t>When the nonce is fixed (including when using the default all-zeros nonce), a unique 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>
        <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>Tag truncation is not allowed. Implementations <bcp14>MUST</bcp14> use the full 128-bit authentication tag.</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 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: At least 150-bit security against statistical attacks.</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 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, 128) ^ 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, 128), 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, 128) ^ 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, 128) ^ 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 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 1143?>

<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>
    <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="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:  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 all 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
Msg length: 5 bytes

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>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+1923obSXLmPZ6iVnMx5JhA1/nAnbbNpqRpuXWyqPb0rD+3
mFWVRZYFoDAoQCK71f58ufd7s5f7LPsC+w5+kv0jMrMqqwCS0EzP2t6v+5uh
gEIeIiPjHJFZ0+l0sqk3c3nqPHp7LZ2v67Mnztl2cy2Xm7oQG1k6T5bF+na1
qZulcza/atb15nrxaCLyfC0/oBf1eDQpm2IpFhilXItqM11di8W0qNZX0+ta
yKkbTmgsdL49ddpNOZnUq/Wps1lv243vupnrT97L24/Nujx1ni03cr2Um+lj
GmnyKweP31+tm+3q1DknQBrnabPeLibtNl/UbQu43t6uMPOzJ2+fTibtRizL
d2LeLPHoVraTdiHWm3d/3DYb2aonq/rU+cdNU5w4bbPerGXV4tPtgj7802Qi
sPhmfTpxphMH/9VL9Ho6cx7LZd3yE7XOp2uxfG89bdZXYln/IAhP+FW0m/kt
1lLM+Fe5EPX81KnKv3XdaobVDYZ/PXNeA2HW6K+vt83yqn86HP3rrfgoa3tg
wvdsxZ3+9pp/nRXNYjDJc0yyFrmcW9M83xaitR8/NM+cOsxW3OGuiS5mzsV2
ac1ycb394brZdk8fmqTdLlvVxZ5ismzWC/T5IE8naP302euL6dmTi1PuaUj4
rPwglsWQaC+IIsS6dI7Q/PgRt18XaPxUlnIt5tilSg2Nxq/XTSFBVEC+6QcE
bfM5MQM18LLkxPl2VYKcHU8N1sp1LdGlahQwjvP41bNTx3NnseunX7x8dvF2
RuDO0He6XZWeAlmsr+Tm1LnebFbt6RdflE09A2a+eKBbR57831T/y0g9dV4y
jLykFijZAsamshaCf523srheNvPm6tY5ojmOeQhaz6nju34wdSOwp0GJxvab
V+fnZ9MxspfOt/PNWky/rq+unbfX4NGr69V24wDP069Ei224U5JcFNdyIR3M
4sS/OwUftfXVkuF7tljN8dNyw2uxtuu8WWBwuXYuZLGFFLp1/u1f/4fz5OLV
m2fnFwz6Q9vhuW7yRZakUywy8KaRG2Xh1H/n+fdilon6zcw5WwK87qki7Tfi
Qz34YdQNvPAVaP39qNvFNr8WpZSrwa+jvmcz51wAQXUz6n22LNdSjH4cdf5m
5jzdvt+21/VCjLp/I37YXtel3GkwGuLtzHnWNrkcdX8r3guwYj34cXfZ39S3
zaLZjGG/uK5b8X47/nnUH/L2eb0ddQW4AmzZ/zDq9IcZ6J9gG/X7wxYqY/DL
Lq4u8PMeaL9pWlmPfxz1fjkjlMhtcV2Per9s8u3t9n09/L3jtBBfL16++v30
H0Zs5SzlR/4FqhIbvXCKenUNui/EfA4uUn0sxnh2dv7GeQt91IqCeKZ1iMFu
Fwu5WdeFVprE8CeY1suOguMHGSXwovCLTdMWsw/UZVYHM28aHsAnUGVP3pfi
ej7CxWsBWN6Pf2Oh9QRAti1AfiNbKdbF9Z3k+HfNNRaJpmOSvG4W0GO7P/P4
z7eQKt8uIcrWLaTGncz2QtzUi+bDmNnm8gbsDfSPf/8c4P9u5vwBxDsa++9I
zQye3zOmoRsvw1eSsC+fDemGDKe587AGdF6CvEhBrLeaXC7k5tFenfTx48dZ
TcOSBv6iaPBxufmiFAtoq+KLj9f1Rk5XYiXXXwg97VR2005bPe0U9DytrQmn
Lcw77jdbldXDRAVx8rutXO/s+8W1uB3/whhUqDhv1qtmzWpkiEEXX8lsHeKP
nzhnDmmzqa3NHrSGWY2dr5u2nb6eiw2pTudJVdVFDWzc2iqsY0VHvl4Ds84Z
theUeQIGATpILERfBEmyfzvkivrMalGs2VQwrR/G4NfQJVjECH9fi+XwMSNP
GWTaDjcGxeuNnJ04zzfl7E7uRL8dCn8rmtHzP30K20ruZxhbyn/eHKC034/1
DsxX0jvW84PH72R9pCluej4X67rSxuQu/YHlYQMzS8LGkQDKebZpeRLIoNJ5
0ZRyTkQ6GIeMPDyoF2RxbTaieN9+NtF5fhB9BtVR81/I7j8+2U2m06kjcshe
2AaTyVuYXw5k95YMbKeUbbGuc9kybZ44wrkm2bfpZZ8YyL5etjuik30lm+74
lYTgUt5spldyKZXYdT7WazmHPwX/ut3IRescxb87ZjOfZ2pXEh0BrnA2ZL9o
f94Rq5VxuNqZWsOiLsu5nEx+RUtfN6VSJbQi6cgPzXxrGKGbEl42hQ5aZ9N8
JOUX/w4rnGPXWjJ+sS7nat18JBVcgumWcI/Qu5g325Isow91IZ3VuvmAxmvl
OZ0/fuk0K1pas25PnLX84xZztQ4jpblai9U1zK0OM/hBrEQ+Zx8MbEsGCM22
Xa7WEqoSeMXiLWRDn6Ix8f8G/6em2DaistY4PFdbATRtpGzBWNv1mjaREQmo
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
7B7kurVnsCpjErk5VCbINCkAA3Y2IbNehLkFI9gdyymxcZCOLlYgJbsmqVu4
WY+ePICGiygsKH2O/MQQ6QHzLP3PEugCatqFC4AND2QurewKnDBoDz+GXEvh
VkBiQjLAawPVRSD+vZI5tRJVh5rp+6M3vR1uBcDcUSxoaNX3YhmcUmQwzwNl
nlPCJo/KRFCCyt+foLLDr77XoyEoIF99NwcXFFGG/1ew/wvpgUexo3G6Fw0Z
0PD2Y2NOnh6ChZC1DeWZIk7QeVBNmYUHK5x6Px6sNB3UUAbUcpoO6skXhBOI
Qkg2UE+fCXG07uiVTKdblArqfWzSRb3S2klL9SRt5af2paV6xN8V2TDfezH9
UMM+fA4cZZkosNkBOBBGVQKSqkqKm4J/eoEOY7gk9ZLkMD3KIiCLKxWECayn
9CMrPQYxHVQ5RsvA1Dm2IAlgAMLlh6ZKwmgvGXiuo0o61DV3h5CBMjDiPML+
BBz9dAdWSq8vxf1WSk8GUZVxYhH6F4PCfod9EsE+CciezyklacigFDI3acN9
u/eLU/tzNexItSpgG8A8giTx4LS4oK7IdVPIcwjv0LfiZRHxMFiYgl/wWPKy
ghFWBvCIIPqsOE8AdVlAJcG3S5IEmiqE1U8ZhYQ0RNrr2pTCLeCgVMJ4CZMs
jD0KQgVVBap2s55LvMiXVVBKUFpZgkYIzhI6DNPDY7FSGXhcVHEEDQqmSmTO
aZ5QVvA6pOdbieoySFMKUVVCwJcE+aY5OBaDg0QjeF89g3oxhRnh8YgAzFBW
lDTKipAkspBFZtVVgLtTqgMovTAifzCFgwKtAE8pBYYDczWXqXalu+DNZ+fJ
jaDaof4wN13ze2MdcN7IFXWgf6nojBp3b+zoKwsH703ry5HkmmqRIAb0YVWh
7kq5xkBAar0Q85n9mhGqrzJnWjvACPpv5O0pERdQGUawzjKRw1GsPvf75CUJ
BuJhO7Oxk/ioJmePaTonTOMIfivUqHMUqZT+qfPoazmfN4+OJy/aK2oVJTEM
EzQK7Ua/pzuSHlnvrqUXw+3Dun5nXP82BlWUZd2ESydUraordU+Iejm1OlOs
nvAtc/pOOCrb+oo08Knz8GL15XOmQxwkGURuVsEKq/KEXA04IVUIrw2aVwTd
krp3w8g7FmY16JbX0n1Z29We96nwgfPhG1M+a/MN5/xsRDAxVKkukTjSVb39
Cx7V6xOP6bqlCxcgBn4IPSrSFA5A4KYl2Z1QqrB6gwRKk3j7wjs9aCUX/oHj
BYfsMNqFpwcJ8YvoQPjiA8dL0A6GvJsFqe/7Gaw8GBBuCrEq4C0XZJyRcLxI
D5w3O3BeDxsCLwVORxQWZUUJBaAFkhOOA3yd2A881c47PWzfsCGHrMMLTg9a
hxceZEpceNiQJHWDOKJIGzy9IHMDL4dd58KAgaHkVQXdCMkvBOJLGPiNR0fq
c0erPZH6Ivb9vBTgZz+DqwDLKik94VOynrxZQ6QCzh9UMZy4JI7gjCaxKyM4
aUlYQHVyYEwRqUtxTxnBZRYwiT04ziA9wUn1IvDijkjDJKXsT0yBPcoaYLIo
DeBVV1UAUu2JNBEelF8QZTFVckR+WUQpTLuEYnQcNGQipVinGxaVG5bSh88N
Hxy/R3D0hJfBHzVEWkRRWAr4Fx4VFRSBKwP4CnC13SCVMddZMZEGHEIN4IqJ
qHR9cgSyFD4P/AA3iLzAEGnkwlGHNe2lZFjCBEkzj2KxMYgnL7zUEGkIjEq4
lV6e+JUsEhebBzrBKqqMqk8MkcY5jJMkDIgsc4AOXxirLX2KUJP5a4jUj4AK
uLYiS3yY/lFOPq2URe5S3WbhGSKVnshg9Zal50bSC900KmPhUhdynoLIEKkI
kwD2culW2AMyvCE2XNhdkBhlZJgDG0J+mAjgB4PEpRtHcC2oBsPzcgr5FaEh
Uj+PwqigqHoKapEwUqIqp12sBFX39uHM0cG9ocr4dvgaVipLNy9g3znHoFSg
qdE270oxl6L2ikXzwvDWvl8Y4heG+HdmCG2n5crs6m3NO5SBvqebrt3srlsb
sUtH04fQqncgrRJNU3lq6AeFG99Nq8GBtBoeSKvRgbQaH0iryYG0mh5Iq0TT
B9GqeyCtegfSKtF04cVxUHmxew+tBgfSangArWqahktAZYGhgLVUFVlQyTRK
XK+qYgAuvb6EwT5mPJTw9Ms9L0czF+rb4vzCFuPWFUZnjztn7BfK/4Xy/30p
f2JeZKDd6D4scJc8P+/fnKP7uBwC9yIoIjdPPBBoFPqZl1HijOK4E33St3Rs
gx8c1bugB5C1dyBZE/kTJccg7ci7m6yDA8k6PJCsowPJOj6QrJMDyTo9kKyJ
/A8ia/dAsvYOJGtsiC/coPT8MHHvIevgQLIODyBrTf5ZATIIEpn4npsVUqZJ
GmRp6IcghMyPkk7w77wmbSj9u5/tt4/SIcy9rz9TV+bfpwLoklaoAetVZse/
8MIvvPDvywsTUKR6bQjtigoJU7S4e2ieTZ6rdwVI8+I17Qv46VBX7DzosgTD
/45CV73sYOeBeq2F/T652Wym3gSHp2HEx2fcWGLH0lxSWtNNQRxhJovU6zO9
5+bE85M+Hr0vUH9QHNYC/NCYrcowHRa8Hwfwu7j9a5OMPB3E7ruQvaWYbZVM
GOwHPgRj/xc61jHFk8EAAA==

-->

</rfc>
