<?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.5 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-aegis-aead-10" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.19.1 -->
  <front>
    <title>The AEGIS Family of Authenticated Encryption Algorithms</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-aegis-aead-10"/>
    <author initials="F." surname="Denis" fullname="Frank Denis">
      <organization>Fastly Inc.</organization>
      <address>
        <email>fde@00f.net</email>
      </address>
    </author>
    <author initials="S." surname="Lucas" fullname="Samuel Lucas">
      <organization>Individual Contributor</organization>
      <address>
        <email>samuel-lucas6@pm.me</email>
      </address>
    </author>
    <date year="2024" month="January" day="20"/>
    <workgroup>Crypto Forum</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 241?>

<t>This document describes the AEGIS-128L, AEGIS-256, AEGIS-128X, and AEGIS-256X AES-based authenticated encryption algorithms designed for high-performance applications.</t>
      <t>The document is a product of the Crypto Forum Research Group (CFRG). It is not an IETF product and is not a standard.</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/cfrg/draft-irtf-cfrg-aegis-aead"/>.</t>
    </note>
  </front>
  <middle>
    <?line 248?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes the AEGIS family of authenticated encryption with associated data (AEAD) algorithms <xref target="AEGIS"/>, which were chosen as additional finalists for high-performance applications in the Competition for Authenticated Encryption: Security, Applicability, and Robustness (CAESAR). Whilst AEGIS-128 was selected as a winner for this use case, AEGIS-128L has a better security margin alongside improved performance and AEGIS-256 uses a 256-bit key <xref target="LIMS21"/>. All variants of AEGIS are inverse-free and constructed from the AES encryption round function <xref target="FIPS-AES"/>. This document specifies:</t>
      <ul spacing="normal">
        <li>
          <t>AEGIS-128L, which has a 128-bit key, a 128-bit nonce, a 1024-bit state, a 128- or 256-bit authentication tag, and processes 256-bit input blocks.</t>
        </li>
        <li>
          <t>AEGIS-256, which has a 256-bit key, a 256-bit nonce, a 768-bit state, a 128- or 256-bit authentication tag, and processes 128-bit input blocks.</t>
        </li>
        <li>
          <t>AEGIS-128X, which is a mode based on AEGIS-128L, specialized for CPUs with large vector registers and vector AES instructions.</t>
        </li>
        <li>
          <t>AEGIS-256X, which is a mode based on AEGIS-256, specialized for CPUs with large vector registers and vector AES instructions.</t>
        </li>
      </ul>
      <t>The AEGIS cipher family offers performance that significantly exceeds that of AES-GCM with hardware support for parallelizable AES block encryption <xref target="AEGIS"/>. Similarly, software implementations can also be faster, although to a lesser extent.</t>
      <t>Unlike with AES-GCM, nonces can be safely chosen at random with no practical limit when using AEGIS-256 and AEGIS-256X. AEGIS-128L and AEGIS-128X also allow for more messages to be safely encrypted when using random nonces.</t>
      <t>With some existing AEAD schemes, such as AES-GCM, an attacker can generate a ciphertext that successfully decrypts under multiple different keys (a partitioning oracle attack) <xref target="LGR21"/>. This ability to craft a (ciphertext, authentication tag) pair that verifies under multiple keys significantly reduces the number of required interactions with the oracle in order to perform an exhaustive search, making it practical if the key space is small. For example, with password-based encryption, an attacker can guess a large number of passwords at a time by recursively submitting such a ciphertext to an oracle, which speeds up a password search by reducing it to a binary search.</t>
      <t>In AEGIS, finding distinct (key, nonce) pairs that successfully decrypt a given (associated data, ciphertext, authentication tag) tuple is believed to have a complexity that depends on the tag size. A 128-bit tag provides 64-bit committing security, which is generally acceptable for interactive protocols. With a 256-bit tag, finding a collision becomes impractical.</t>
      <t>Unlike most other AES-based AEAD constructions, leaking a state does not leak the key nor previous states.</t>
      <t>Finally, an AEGIS key is not required after the setup phase, and there is no key schedule. Thus, ephemeral keys can be erased from memory before any data has been encrypted or decrypted, mitigating cold boot attacks.</t>
      <t>Note that an earlier version of Hongjun Wu and Bart Preneel’s paper introducing AEGIS specified AEGIS-128L and AEGIS-256 sporting differences with regards to the computation of the authentication tag and the number of rounds in the <tt>Finalize()</tt> function. We follow the specification of <xref target="AEGIS"/>, which can be found in the References section of this document.</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>Primitives:</t>
      <ul spacing="normal">
        <li>
          <t><tt>{}</tt>: an empty bit array.</t>
        </li>
        <li>
          <t><tt>|x|</tt>: the length of <tt>x</tt> in bits.</t>
        </li>
        <li>
          <t><tt>a ^ b</tt>: the bitwise exclusive OR operation between <tt>a</tt> and <tt>b</tt>.</t>
        </li>
        <li>
          <t><tt>a &amp; b</tt>: the bitwise AND 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>
        <li>
          <t><tt>LE64(x)</tt>: the little-endian encoding of unsigned 64-bit integer <tt>x</tt>.</t>
        </li>
        <li>
          <t><tt>ZeroPad(x, n)</tt>: padding operation. Trailing zeros are concatenated to <tt>x</tt> until the total length is a multiple of <tt>n</tt> bits.</t>
        </li>
        <li>
          <t><tt>Truncate(x, n)</tt>: truncation operation. The first <tt>n</tt> bits of <tt>x</tt> are kept.</t>
        </li>
        <li>
          <t><tt>Split(x, n)</tt>: splitting operation. <tt>x</tt> is split into <tt>n</tt>-bit blocks, ignoring partial blocks.</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>AESRound(in, rk)</tt>: a single round of the AES encryption round function, which is the composition of the <tt>SubBytes</tt>, <tt>ShiftRows</tt>, <tt>MixColums</tt> and <tt>AddRoundKey</tt> transformations, as defined in section 5 of <xref target="FIPS-AES"/>. Here, <tt>in</tt> is the 128-bit AES input state, and <tt>rk</tt> is the 128-bit round key.</t>
        </li>
        <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, <tt>False</tt> otherwise.</t>
        </li>
      </ul>
      <t>AEGIS internal functions:</t>
      <ul spacing="normal">
        <li>
          <t><tt>Update(M0, M1)</tt> or <tt>Update(M)</tt>: the state update function.</t>
        </li>
        <li>
          <t><tt>Init(key, nonce)</tt>: the initialization function.</t>
        </li>
        <li>
          <t><tt>Absorb(ai)</tt>: the input block absorption function.</t>
        </li>
        <li>
          <t><tt>Enc(xi)</tt>: the input block encryption function.</t>
        </li>
        <li>
          <t><tt>Dec(ci)</tt>: the input block decryption function.</t>
        </li>
        <li>
          <t><tt>DecPartial(cn)</tt>: the input block decryption function for the last ciphertext bits when they do not fill an entire block.</t>
        </li>
        <li>
          <t><tt>Finalize(ad_len_bits, msg_len_bits)</tt>: the authentication tag generation function.</t>
        </li>
      </ul>
      <t>Input blocks are 256 bits for AEGIS-128L and 128 bits for AEGIS-256.</t>
      <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>{ 0x00, 0x01, 0x01, 0x02, 0x03, 0x05, 0x08, 0x0d, 0x15, 0x22, 0x37, 0x59, 0x90, 0xe9, 0x79, 0x62 }</tt>.</t>
        </li>
        <li>
          <t><tt>C1</tt>: an AES block built from the following bytes in hexadecimal format: <tt>{ 0xdb, 0x3d, 0x18, 0x55, 0x6d, 0xc2, 0x2f, 0xf1, 0x20, 0x11, 0x31, 0x42, 0x73, 0xb5, 0x28, 0xdd }</tt>.</t>
        </li>
      </ul>
      <t>AES blocks are always 128 bits in length.</t>
      <t>Input and output values:</t>
      <ul spacing="normal">
        <li>
          <t><tt>key</tt>: the encryption key (128 bits for AEGIS-128L, 256 bits for AEGIS-256).</t>
        </li>
        <li>
          <t><tt>nonce</tt>: the public nonce (128 bits for AEGIS-128L, 256 bits for AEGIS-256).</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 or 256 bits).</t>
        </li>
      </ul>
    </section>
    <section anchor="the-aegis-128l-algorithm">
      <name>The AEGIS-128L Algorithm</name>
      <t>AEGIS-128L has a 1024-bit state, made of eight 128-bit blocks <tt>{S0, ...S7}</tt>.</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 16 bytes (128 bits).</t>
        </li>
        <li>
          <t><tt>P_MAX</tt> (maximum length of the plaintext) is 2<sup>61</sup> bytes (2<sup>64</sup> bits).</t>
        </li>
        <li>
          <t><tt>A_MAX</tt> (maximum length of the associated data) is 2<sup>61</sup> bytes (2<sup>64</sup> 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> + 16 or 32 bytes (2<sup>64</sup> + 128 or 256 bits).</t>
        </li>
      </ul>
      <t>Distinct associated data inputs, as described in <xref section="3" sectionFormat="comma" target="RFC5116"/> shall 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 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 <tt>P_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than <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, 256), 256)
for ai in ad_blocks:
    Absorb(ai)

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

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

return ct and tag
]]></artwork>
      </section>
      <section anchor="authenticated-decryption">
        <name>Authenticated Decryption</name>
        <artwork><![CDATA[
Decrypt(ct, tag, ad, key, nonce)
]]></artwork>
        <t>The <tt>Decrypt</tt> function decrypts a ciphertext, verifies that the authentication tag is correct, and returns the message on success or an error if tag verification failed.</t>
        <t>Security:</t>
        <ul spacing="normal">
          <li>
            <t>If tag verification fails, the decrypted message and wrong message authentication tag <bcp14>MUST NOT</bcp14> be given as output. The decrypted message <bcp14>MUST</bcp14> be overwritten with zeros.</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 be decrypted (length <bcp14>MUST</bcp14> be less than <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 <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, 256), 256)
for ai in ad_blocks:
    Absorb(ai)

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

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
    return "verification failed" error
else:
    return msg
]]></artwork>
      </section>
      <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, ...S7}</tt> using the given <tt>key</tt> and <tt>nonce</tt>.</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, ...S7}</tt>: the initial state.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
S0 = key ^ nonce
S1 = C1
S2 = C0
S3 = C1
S4 = key ^ nonce
S5 = key ^ C0
S6 = key ^ C1
S7 = key ^ C0

Repeat(10, Update(nonce, key))
]]></artwork>
      </section>
      <section anchor="the-update-function">
        <name>The Update Function</name>
        <artwork><![CDATA[
Update(M0, M1)
]]></artwork>
        <t>The <tt>Update</tt> function is the core of the AEGIS-128L algorithm.
It updates the state <tt>{S0, ...S7}</tt> using two 128-bit values.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>M0</tt>: the first 128-bit block to be absorbed.</t>
          </li>
          <li>
            <t><tt>M1</tt>: the second 128-bit block to be absorbed.</t>
          </li>
        </ul>
        <t>Modifies:</t>
        <ul spacing="normal">
          <li>
            <t><tt>{S0, ...S7}</tt>: the state.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
S'0 = AESRound(S7, S0 ^ M0)
S'1 = AESRound(S0, S1)
S'2 = AESRound(S1, S2)
S'3 = AESRound(S2, S3)
S'4 = AESRound(S3, S4 ^ M1)
S'5 = AESRound(S4, S5)
S'6 = AESRound(S5, S6)
S'7 = AESRound(S6, S7)

S0  = S'0
S1  = S'1
S2  = S'2
S3  = S'3
S4  = S'4
S5  = S'5
S6  = S'6
S7  = S'7
]]></artwork>
      </section>
      <section anchor="the-absorb-function">
        <name>The Absorb Function</name>
        <artwork><![CDATA[
Absorb(ai)
]]></artwork>
        <t>The <tt>Absorb</tt> function absorbs a 256-bit input block <tt>ai</tt> into the state <tt>{S0, ...S7}</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ai</tt>: the 256-bit input block.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
t0, t1 = Split(ai, 128)
Update(t0, t1)
]]></artwork>
      </section>
      <section anchor="the-enc-function">
        <name>The Enc Function</name>
        <artwork><![CDATA[
Enc(xi)
]]></artwork>
        <t>The <tt>Enc</tt> function encrypts a 256-bit input block <tt>xi</tt> using the state <tt>{S0, ...S7}</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>xi</tt>: the 256-bit input block.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ci</tt>: the 256-bit encrypted block.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
z0 = S6 ^ S1 ^ (S2 & S3)
z1 = S2 ^ S5 ^ (S6 & S7)

t0, t1 = Split(xi, 128)
out0 = t0 ^ z0
out1 = t1 ^ z1

Update(t0, t1)
ci = out0 || out1

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 256-bit input block <tt>ci</tt> using the state <tt>{S0, ...S7}</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ci</tt>: the 256-bit encrypted block.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>xi</tt>: the 256-bit decrypted block.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
z0 = S6 ^ S1 ^ (S2 & S3)
z1 = S2 ^ S5 ^ (S6 & S7)

t0, t1 = Split(ci, 128)
out0 = t0 ^ z0
out1 = t1 ^ z1

Update(out0, out1)
xi = out0 || out1

return xi
]]></artwork>
      </section>
      <section anchor="the-decpartial-function">
        <name>The DecPartial Function</name>
        <artwork><![CDATA[
DecPartial(cn)
]]></artwork>
        <t>The <tt>DecPartial</tt> function decrypts the last ciphertext bits <tt>cn</tt> using the state <tt>{S0, ...S7}</tt> when they do not fill an entire block.</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>xn</tt>: the decryption of <tt>cn</tt>.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
z0 = S6 ^ S1 ^ (S2 & S3)
z1 = S2 ^ S5 ^ (S6 & S7)

t0, t1 = Split(ZeroPad(cn, 256), 128)
out0 = t0 ^ z0
out1 = t1 ^ z1

xn = Truncate(out0 || out1, |cn|)

v0, v1 = Split(ZeroPad(xn, 256), 128)
Update(v0, v1)

return xn
]]></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 computes a 128- or 256-bit tag that authenticates the message and associated data.</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 = S2 ^ (LE64(ad_len_bits) || LE64(msg_len_bits))

Repeat(7, Update(t, t))

if tag_length == 16: # 128 bits
    tag = S0 ^ S1 ^ S2 ^ S3 ^ S4 ^ S5 ^ S6
else:                # 256 bits
    tag = (S0 ^ S1 ^ S2 ^ S3) || (S4 ^ S5 ^ S6 ^ S7)

return tag
]]></artwork>
      </section>
    </section>
    <section anchor="the-aegis-256-algorithm">
      <name>The AEGIS-256 Algorithm</name>
      <t>AEGIS-256 has a 768-bit state, made of six 128-bit blocks <tt>{S0, ...S5}</tt>.</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> bytes (2<sup>64</sup> bits).</t>
        </li>
        <li>
          <t><tt>A_MAX</tt> (maximum length of the associated data) is 2<sup>61</sup> bytes (2<sup>64</sup> bits).</t>
        </li>
        <li>
          <t><tt>N_MIN</tt> (minimum nonce length) = <tt>N_MAX</tt> (maximum nonce length) = 32 bytes (256 bits).</t>
        </li>
        <li>
          <t><tt>C_MAX</tt> (maximum ciphertext length) = <tt>P_MAX</tt> + tag length = 2<sup>61</sup> + 16 or 32 bytes (2<sup>64</sup> + 128 or 256 bits).</t>
        </li>
      </ul>
      <t>Distinct associated data inputs, as described in <xref section="3" sectionFormat="comma" target="RFC5116"/> shall 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 anchor="authenticated-encryption-1">
        <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 <tt>P_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than <tt>A_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ct</tt>: the ciphertext.</t>
          </li>
          <li>
            <t><tt>tag</tt>: the authentication tag.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

ct = {}

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

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

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

return ct and tag
]]></artwork>
      </section>
      <section anchor="authenticated-decryption-1">
        <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 failed.</t>
        <t>Security:</t>
        <ul spacing="normal">
          <li>
            <t>If tag verification fails, the decrypted message and wrong message authentication tag <bcp14>MUST NOT</bcp14> be given as output. The decrypted message <bcp14>MUST</bcp14> be overwritten with zeros.</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 be decrypted (length <bcp14>MUST</bcp14> be less than <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 <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(ZeroPad(ct, 128), 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
    return "verification failed" error
else:
    return msg
]]></artwork>
      </section>
      <section anchor="the-init-function-1">
        <name>The Init Function</name>
        <artwork><![CDATA[
Init(key, nonce)
]]></artwork>
        <t>The <tt>Init</tt> function constructs the initial state <tt>{S0, ...S5}</tt> using the given <tt>key</tt> and <tt>nonce</tt>.</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, ...S5}</tt>: the initial state.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
k0, k1 = Split(key, 128)
n0, n1 = Split(nonce, 128)

S0 = k0 ^ n0
S1 = k1 ^ n1
S2 = C1
S3 = C0
S4 = k0 ^ C0
S5 = k1 ^ C1

Repeat(4,
  Update(k0)
  Update(k1)
  Update(k0 ^ n0)
  Update(k1 ^ n1)
)
]]></artwork>
      </section>
      <section anchor="the-update-function-1">
        <name>The Update Function</name>
        <artwork><![CDATA[
Update(M)
]]></artwork>
        <t>The <tt>Update</tt> function is the core of the AEGIS-256 algorithm.
It updates the state <tt>{S0, ...S5}</tt> using a 128-bit value.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>msg</tt>: the block to be absorbed.</t>
          </li>
        </ul>
        <t>Modifies:</t>
        <ul spacing="normal">
          <li>
            <t><tt>{S0, ...S5}</tt>: the state.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
S'0 = AESRound(S5, S0 ^ M)
S'1 = AESRound(S0, S1)
S'2 = AESRound(S1, S2)
S'3 = AESRound(S2, S3)
S'4 = AESRound(S3, S4)
S'5 = AESRound(S4, S5)

S0  = S'0
S1  = S'1
S2  = S'2
S3  = S'3
S4  = S'4
S5  = S'5
]]></artwork>
      </section>
      <section anchor="the-absorb-function-1">
        <name>The Absorb Function</name>
        <artwork><![CDATA[
Absorb(ai)
]]></artwork>
        <t>The <tt>Absorb</tt> function absorbs a 128-bit input block <tt>ai</tt> into the state <tt>{S0, ...S5}</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ai</tt>: the input block.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Update(ai)
]]></artwork>
      </section>
      <section anchor="the-enc-function-1">
        <name>The Enc Function</name>
        <artwork><![CDATA[
Enc(xi)
]]></artwork>
        <t>The <tt>Enc</tt> function encrypts a 128-bit input block <tt>xi</tt> using the state <tt>{S0, ...S5}</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>xi</tt>: the input block.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ci</tt>: the encrypted input block.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
z = S1 ^ S4 ^ S5 ^ (S2 & S3)

Update(xi)

ci = xi ^ z

return ci
]]></artwork>
      </section>
      <section anchor="the-dec-function-1">
        <name>The Dec Function</name>
        <artwork><![CDATA[
Dec(ci)
]]></artwork>
        <t>The <tt>Dec</tt> function decrypts a 128-bit input block <tt>ci</tt> using the state <tt>{S0, ...S5}</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ci</tt>: the encrypted input block.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>xi</tt>: the decrypted block.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
z = S1 ^ S4 ^ S5 ^ (S2 & S3)

xi = ci ^ z

Update(xi)

return xi
]]></artwork>
      </section>
      <section anchor="the-decpartial-function-1">
        <name>The DecPartial Function</name>
        <artwork><![CDATA[
DecPartial(cn)
]]></artwork>
        <t>The <tt>DecPartial</tt> function decrypts the last ciphertext bits <tt>cn</tt> using the state <tt>{S0, ...S5}</tt> when they do not fill an entire block.</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>xn</tt>: the decryption of <tt>cn</tt>.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
z = S1 ^ S4 ^ S5 ^ (S2 & S3)

t = ZeroPad(cn, 128)
out = t ^ z

xn = Truncate(out, |cn|)

v = ZeroPad(xn, 128)
Update(v)

return xn
]]></artwork>
      </section>
      <section anchor="the-finalize-function-1">
        <name>The Finalize Function</name>
        <artwork><![CDATA[
Finalize(ad_len_bits, msg_len_bits)
]]></artwork>
        <t>The <tt>Finalize</tt> function computes a 128- or 256-bit tag that authenticates the message and associated data.</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 = S3 ^ (LE64(ad_len_bits) || LE64(msg_len_bits))

Repeat(7, Update(t))

if tag_length == 16: # 128 bits
    tag = S0 ^ S1 ^ S2 ^ S3 ^ S4 ^ S5
else:                # 256 bits
    tag = (S0 ^ S1 ^ S2) || (S3 ^ S4 ^ S5)

return tag
]]></artwork>
      </section>
    </section>
    <section anchor="parallel-modes">
      <name>Parallel Modes</name>
      <t>Some CPUs, such as Intel and Intel-compatible CPUs with the VAES extensions, include instructions to efficiently apply the AES round function to a vector of AES blocks.</t>
      <t>AEGIS-128X and AEGIS-256X are optional, specialized modes designed to take advantage of these instructions. They share the same properties as the ciphers they are based on but can be significantly faster on these platforms, even for short messages.</t>
      <t>AEGIS-128X and AEGIS-256X are parallel evaluations of multiple AEGIS-128L and AEGIS-256 instances respectively, with distinct initial states. On CPUs with wide vector registers, different states can be stored in different 128-bit lanes of the same vector register, allowing parallel updates using vector instructions.</t>
      <t>The modes are parameterized by the parallelism degree. With 256-bit registers, 2 parallel operations can be applied to 128-bit AES blocks. With 512-bit registers, the number of instances can be raised to 4.</t>
      <t>The state of a parallel mode is represented as a vector of AEGIS-128L or AEGIS-256 states.</t>
      <section anchor="additional-conventions-and-definitions">
        <name>Additional Conventions and Definitions</name>
        <ul spacing="normal">
          <li>
            <t><tt>D</tt>: the degree of parallelism.</t>
          </li>
          <li>
            <t><tt>R</tt>: the absorption and output rate of the mode. With AEGIS-128X, the rate is <tt>2 * 128 * D</tt> bits. With AEGIS-256X, the rate is <tt>128 * D</tt> bits.</t>
          </li>
          <li>
            <t><tt>V[j,i]</tt>: the <tt>j</tt>-th AES block of the <tt>i</tt>-th state. <tt>i</tt> is in the <tt>[0..D)</tt> range. For AEGIS-128X, <tt>j</tt> is in the <tt>[0..8)</tt> range, while for AEGIS-256, <tt>j</tt> is in the <tt>[0..6)</tt> range.</t>
          </li>
          <li>
            <t><tt>V'[j,i]</tt>: the <tt>j</tt>-th AES block of the next <tt>i</tt>-th state.</t>
          </li>
          <li>
            <t><tt>ctx[i]</tt>: the <tt>i</tt>-th context separator. This is a 128-bit mask, made of a byte representing the state index, followed by a byte representing the highest index and 112 all-zero bits.</t>
          </li>
          <li>
            <t><tt>Byte(x)</tt>: the value <tt>x</tt> encoded as 8 bits.</t>
          </li>
        </ul>
      </section>
      <section anchor="authenticated-encryption-2">
        <name>Authenticated Encryption</name>
        <artwork><![CDATA[
Encrypt(msg, ad, key, nonce)
]]></artwork>
        <t>The <tt>Encrypt</tt> function of AEGIS-128X resembles that of AEGIS-128L, and similarly, the <tt>Encrypt</tt> function of AEGIS-256X mirrors that of AEGIS-256, but processes <tt>R</tt>-bit input blocks per update.</t>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

ct = {}

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

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

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

return ct and tag
]]></artwork>
      </section>
      <section anchor="authenticated-decryption-2">
        <name>Authenticated Decryption</name>
        <artwork><![CDATA[
Decrypt(ct, tag, ad, key, nonce)
]]></artwork>
        <t>The <tt>Decrypt</tt> function of AEGIS-128X resembles that of AEGIS-128L, and similarly, the <tt>Decrypt</tt> function of AEGIS-256X mirrors that of AEGIS-256, but processes <tt>R</tt>-bit input blocks per update.</t>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

msg = {}

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

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

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
    return "verification failed" error
else:
    return msg
]]></artwork>
      </section>
      <section anchor="aegis-128x">
        <name>AEGIS-128X</name>
        <section anchor="the-init-function-2">
          <name>The Init Function</name>
          <artwork><![CDATA[
Init(key, nonce)
]]></artwork>
          <t>The <tt>Init</tt> function initializes a vector of <tt>D</tt> AEGIS-128L states with the same <tt>key</tt> and <tt>nonce</tt> but a different context <tt>ctx[i]</tt>. The context is added to the state before every update.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
for i in 0..D:
    V[0,i] = key ^ nonce
    V[1,i] = C1
    V[2,i] = C0
    V[3,i] = C1
    V[4,i] = key ^ nonce
    V[5,i] = key ^ C0
    V[6,i] = key ^ C1
    V[7,i] = key ^ C0

nonce_v = {}
key_v = {}
for i in 0..D:
    nonce_v = nonce_v || nonce
    key_v = key_v || key

Repeat(10,
    for i in 0..D:
        ctx[i] = ZeroPad(Byte(i) || Byte(D - 1), 128)
        V[3,i] = V[3,i] ^ ctx[i]
        V[7,i] = V[7,i] ^ ctx[i]

    Update(nonce_v, key_v)
)
]]></artwork>
        </section>
        <section anchor="the-update-function-2">
          <name>The Update Function</name>
          <artwork><![CDATA[
Update(M0, M1)
]]></artwork>
          <t>The AEGIS-128X <tt>Update</tt> function is similar to the AEGIS-128L <tt>Update</tt> function, but absorbs <tt>R</tt> (<tt>2 * 128 * D</tt>) bits at once. <tt>M0</tt> and <tt>M1</tt> are <tt>128 * D</tt> bits instead of 128 bits but are split into 128-bit blocks, each of them updating a different AEGIS-128L state.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
m0 = Split(M0, 128)
m1 = Split(M1, 128)

for i in 0..D:
    V'[0,i] = AESRound(V[7,i], V[0,i] ^ m0[i])
    V'[1,i] = AESRound(V[0,i], V[1,i])
    V'[2,i] = AESRound(V[1,i], V[2,i])
    V'[3,i] = AESRound(V[2,i], V[3,i])
    V'[4,i] = AESRound(V[3,i], V[4,i] ^ m1[i])
    V'[5,i] = AESRound(V[4,i], V[5,i])
    V'[6,i] = AESRound(V[5,i], V[6,i])
    V'[7,i] = AESRound(V[6,i], V[7,i])

    V[0,i]  = V'[0,i]
    V[1,i]  = V'[1,i]
    V[2,i]  = V'[2,i]
    V[3,i]  = V'[3,i]
    V[4,i]  = V'[4,i]
    V[5,i]  = V'[5,i]
    V[6,i]  = V'[6,i]
    V[7,i]  = V'[7,i]
]]></artwork>
        </section>
        <section anchor="the-absorb-function-2">
          <name>The Absorb Function</name>
          <artwork><![CDATA[
Absorb(ai)
]]></artwork>
          <t>The <tt>Absorb</tt> function is similar to the AEGIS-128L <tt>Absorb</tt> function, but absorbs <tt>R</tt> bits instead of 256 bits.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
t0, t1 = Split(ai, R)
Update(t0, t1)
]]></artwork>
        </section>
        <section anchor="the-enc-function-2">
          <name>The Enc Function</name>
          <artwork><![CDATA[
Enc(xi)
]]></artwork>
          <t>The <tt>Enc</tt> function is similar to the AEGIS-128L <tt>Enc</tt> function, but encrypts <tt>R</tt> bits instead of 256 bits.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
z0 = {}
z1 = {}
for i in 0..D:
    z0 = z0 || (V[6,i] ^ V[1,i] ^ (V[2,i] & V[3,i]))
    z1 = z1 || (V[2,i] ^ V[5,i] ^ (V[6,i] & V[7,i]))

t0, t1 = Split(xi, R)
out0 = t0 ^ z0
out1 = t1 ^ z1

Update(t0, t1)
ci = out0 || out1

return ci
]]></artwork>
        </section>
        <section anchor="the-dec-function-2">
          <name>The Dec Function</name>
          <artwork><![CDATA[
Dec(ci)
]]></artwork>
          <t>The <tt>Dec</tt> function is similar to the AEGIS-128L <tt>Dec</tt> function, but decrypts <tt>R</tt> bits instead of 256 bits.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
z0 = {}
z1 = {}
for i in 0..D:
    z0 = z0 || (V[6,i] ^ V[1,i] ^ (V[2,i] & V[3,i]))
    z1 = z1 || (V[2,i] ^ V[5,i] ^ (V[6,i] & V[7,i]))

t0, t1 = Split(ci, R)
out0 = t0 ^ z0
out1 = t1 ^ z1

Update(out0, out1)
xi = out0 || out1

return xi
]]></artwork>
        </section>
        <section anchor="the-decpartial-function-2">
          <name>The DecPartial Function</name>
          <artwork><![CDATA[
DecPartial(cn)
]]></artwork>
          <t>The <tt>DecPartial</tt> function is similar to the AEGIS-128L <tt>DecPartial</tt> function, but decrypts up to <tt>R</tt> bits instead of 256 bits.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
z0 = {}
z1 = {}
for i in 0..D:
    z0 = z0 || (V[6,i] ^ V[1,i] ^ (V[2,i] & V[3,i]))
    z1 = z1 || (V[2,i] ^ V[5,i] ^ (V[6,i] & V[7,i]))

t0, t1 = Split(ZeroPad(cn, R), 128 * D)
out0 = t0 ^ z0
out1 = t1 ^ z1

xn = Truncate(out0 || out1, |cn|)

v0, v1 = Split(ZeroPad(xn, R), 128 * D)
Update(v0, v1)

return xn
]]></artwork>
        </section>
        <section anchor="the-finalize-function-2">
          <name>The Finalize Function</name>
          <artwork><![CDATA[
Finalize(ad_len_bits, msg_len_bits)
]]></artwork>
          <t>The <tt>Finalize</tt> function finalizes every AEGIS-128L instance and combines the resulting authentication tags using the bitwise exclusive OR operation.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
t = {}
u = LE64(ad_len_bits) || LE64(msg_len_bits)
for i in 0..D:
    t = t || (V[2,i] ^ u)

Repeat(7, Update(t, t))

if tag_length == 16: # 128 bits
    tag = ZeroPad({}, 128)
    for i in 0..D:
        tag = tag ^ V[0,i] ^ V[1,i] ^ V[2,i] ^ V[3,i] ^ V[4,i] ^ V[5,i] ^ V[6,i]

else:                # 256 bits
    tag0 = ZeroPad({}, 128)
    tag1 = ZeroPad({}, 128)
    for i in 0..D:
        tag0 = tag0 ^ V[0,i] ^ V[1,i] ^ V[2,i] ^ V[3,i]
        tag1 = tag1 ^ V[4,i] ^ V[5,i] ^ V[6,i] ^ V[7,i]
    tag = tag0 || tag1

return tag
]]></artwork>
        </section>
      </section>
      <section anchor="aegis-256x">
        <name>AEGIS-256X</name>
        <section anchor="the-init-function-3">
          <name>The Init Function</name>
          <artwork><![CDATA[
Init(key, nonce)
]]></artwork>
          <t>The <tt>Init</tt> function initializes a vector of <tt>D</tt> AEGIS-256 states with the same <tt>key</tt> and <tt>nonce</tt> but a different context <tt>ctx[i]</tt>. The context is added to the state before every update.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
k0, k1 = Split(key, 128)
n0, n1 = Split(nonce, 128)

for i in 0..D:
    V[0,i] = k0 ^ n0
    V[1,i] = k1 ^ n1
    V[2,i] = C1
    V[3,i] = C0
    V[4,i] = k0 ^ C0
    V[5,i] = k1 ^ C1

k0_v, k1_v = {}, {}
k0n0_v, k1n1_v = {}, {}
for i in 0..D:
    k0_v = k0_v || k0
    k1_v = k1_v || k1
    k0n0_v = k0n0_v || (k0 ^ n0)
    k1n1_v = k1n1_v || (k1 ^ n1)

Repeat(4,
    for i in 0..D:
        ctx[i] = ZeroPad(Byte(i) || Byte(D - 1), 128)
        V[3,i] = V[3,i] ^ ctx[i]
        V[5,i] = V[5,i] ^ ctx[i]
        Update(k0_v)
        V[3,i] = V[3,i] ^ ctx[i]
        V[5,i] = V[5,i] ^ ctx[i]
        Update(k1_v)
        V[3,i] = V[3,i] ^ ctx[i]
        V[5,i] = V[5,i] ^ ctx[i]
        Update(k0n0_v)
        V[3,i] = V[3,i] ^ ctx[i]
        V[5,i] = V[5,i] ^ ctx[i]
        Update(k1n1_v)
)
]]></artwork>
        </section>
        <section anchor="the-update-function-3">
          <name>The Update Function</name>
          <artwork><![CDATA[
Update(M)
]]></artwork>
          <t>The AEGIS-256X <tt>Update</tt> function is similar to the AEGIS-256 <tt>Update</tt> function, but absorbs <tt>R</tt> (<tt>128 * D</tt>) bits at once. <tt>M</tt> is <tt>128 * D</tt> bits instead of 128 bits and is split into 128-bit blocks, each of them updating a different AEGIS-256 state.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
m = Split(M, 128)

for i in 0..D:
    V'[0,i] = AESRound(V[5,i], V[0,i] ^ m[i])
    V'[1,i] = AESRound(V[0,i], V[1,i])
    V'[2,i] = AESRound(V[1,i], V[2,i])
    V'[3,i] = AESRound(V[2,i], V[3,i])
    V'[4,i] = AESRound(V[3,i], V[4,i])
    V'[5,i] = AESRound(V[4,i], V[5,i])

    V[0,i]  = V'[0,i]
    V[1,i]  = V'[1,i]
    V[2,i]  = V'[2,i]
    V[3,i]  = V'[3,i]
    V[4,i]  = V'[4,i]
    V[5,i]  = V'[5,i]
]]></artwork>
        </section>
        <section anchor="the-absorb-function-3">
          <name>The Absorb Function</name>
          <artwork><![CDATA[
Absorb(ai)
]]></artwork>
          <t>The <tt>Absorb</tt> function is similar to the AEGIS-256 <tt>Absorb</tt> function, but absorbs <tt>R</tt> bits instead of 128 bits.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
Update(ai)
]]></artwork>
        </section>
        <section anchor="the-enc-function-3">
          <name>The Enc Function</name>
          <artwork><![CDATA[
Enc(xi)
]]></artwork>
          <t>The <tt>Enc</tt> function is similar to the AEGIS-256 <tt>Enc</tt> function, but encrypts <tt>R</tt> bits instead of 128 bits.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
z = {}
for i in 0..D:
    z = z || (V[1,i] ^ V[4,i] ^ V[5,i] ^ (V[2,i] & V[3,i]))

Update(xi)

ci = xi ^ z

return ci
]]></artwork>
        </section>
        <section anchor="the-dec-function-3">
          <name>The Dec Function</name>
          <artwork><![CDATA[
Dec(ci)
]]></artwork>
          <t>The <tt>Dec</tt> function is similar to the AEGIS-256 <tt>Dec</tt> function, but decrypts <tt>R</tt> bits instead of 128 bits.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
z = {}
for i in 0..D:
    z = z || (V[1,i] ^ V[4,i] ^ V[5,i] ^ (V[2,i] & V[3,i]))

xi = ci ^ z

Update(xi)

return xi
]]></artwork>
        </section>
        <section anchor="the-decpartial-function-3">
          <name>The DecPartial Function</name>
          <artwork><![CDATA[
DecPartial(cn)
]]></artwork>
          <t>The <tt>DecPartial</tt> function is similar to the AEGIS-256 <tt>DecPartial</tt> function, but decrypts up to <tt>R</tt> bits instead of 128 bits.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
z = {}
for i in 0..D:
    z = z || (V[1,i] ^ V[4,i] ^ V[5,i] ^ (V[2,i] & V[3,i]))

t = ZeroPad(cn, R)
out = t ^ z

xn = Truncate(out, |cn|)

v = ZeroPad(xn, 128 * D)
Update(v)

return xn
]]></artwork>
        </section>
        <section anchor="the-finalize-function-3">
          <name>The Finalize Function</name>
          <artwork><![CDATA[
Finalize(ad_len_bits, msg_len_bits)
]]></artwork>
          <t>The <tt>Finalize</tt> function finalizes every AEGIS-256 instance and combines the resulting authentication tags using the bitwise exclusive OR operation.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
t = {}
u = LE64(ad_len_bits) || LE64(msg_len_bits)
for i in 0..D:
    t = t || (V[3,i] ^ u)

Repeat(7, Update(t))

if tag_length == 16: # 128 bits
    tag = ZeroPad({}, 128)
    for i in 0..D:
        tag = tag ^ V[0,i] ^ V[1,i] ^ V[2,i] ^ V[3,i] ^ V[4,i] ^ V[5,i]

else:                # 256 bits
    tag0 = ZeroPad({}, 128)
    tag1 = ZeroPad({}, 128)
    for i in 0..D:
        tag0 = tag0 ^ V[0,i] ^ V[1,i] ^ V[2,i]
        tag1 = tag1 ^ V[3,i] ^ V[4,i] ^ V[5,i]
    tag = tag0 || tag1

return tag
]]></artwork>
        </section>
      </section>
      <section anchor="implementation-considerations">
        <name>Implementation Considerations</name>
        <t>AEGIS-128X and AEGIS-256X with a degree of <tt>1</tt> are identical to AEGIS-128L and AEGIS-256. This property can be used to reduce the code size of a generic implementation.</t>
        <t>In AEGIS-128X, <tt>V</tt> can be represented as eight 256-bit registers (when <tt>D = 2</tt>) or eight 512-bit registers (when <tt>D = 4</tt>). In AEGIS-256X, <tt>V</tt> can be represented as six 256-bit registers (when <tt>D = 2</tt>) or six 512-bit registers (when <tt>D = 4</tt>). With this representation, loops over <tt>0..D</tt> in the above pseudocode can be replaced by vector instructions.</t>
      </section>
      <section anchor="operational-considerations">
        <name>Operational Considerations</name>
        <t>The AEGIS parallel modes are specialized and can only improve performance on specific CPUs.</t>
        <t>The degrees of parallelism implementations are encouraged to support are <tt>2</tt> (for CPUs with 256-bit registers) and <tt>4</tt> (for CPUs with 512-bit registers). The resulting algorithms are called <tt>AEGIS-128X2</tt>, <tt>AEGIS-128X4</tt>, <tt>AEGIS-256X2</tt>, and <tt>AEGIS-256X4</tt>.</t>
        <t>The following table summarizes how many bits are processed in parallel (rate), the memory requirements (state size), and the minimum vector register sizes a CPU should support for optimal performance.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Algorithm</th>
              <th align="right">Rate (bits)</th>
              <th align="center">Optimal Register Size</th>
              <th align="right">State Size (bits)</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">AEGIS-128L</td>
              <td align="right">256</td>
              <td align="center">128 bits</td>
              <td align="right">1024</td>
            </tr>
            <tr>
              <td align="left">AEGIS-128X2</td>
              <td align="right">512</td>
              <td align="center">256 bits</td>
              <td align="right">2048</td>
            </tr>
            <tr>
              <td align="left">AEGIS-128X4</td>
              <td align="right">1024</td>
              <td align="center">512 bits</td>
              <td align="right">4096</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256</td>
              <td align="right">128</td>
              <td align="center">128 bits</td>
              <td align="right">768</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256X2</td>
              <td align="right">256</td>
              <td align="center">256 bits</td>
              <td align="right">1536</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256X4</td>
              <td align="right">512</td>
              <td align="center">512 bits</td>
              <td align="right">3072</td>
            </tr>
          </tbody>
        </table>
        <t>Note that architectures with smaller vector registers but with many registers and large pipelines may still benefit from the parallel modes.</t>
        <t>Protocols <bcp14>SHOULD</bcp14> opt for a parallel mode only when all the involved parties agree on a specific variant. AEGIS-128L and AEGIS-256 <bcp14>SHOULD</bcp14> remain the default choices.</t>
        <t>Implementations <bcp14>MAY</bcp14> choose not to include the parallel AEGIS modes.</t>
      </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="aegis-as-a-stream-cipher">
      <name>AEGIS as a Stream Cipher</name>
      <t>All AEGIS variants can also be used as stream ciphers.</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, secure keystream.</t>
      <t>Inputs:</t>
      <ul spacing="normal">
        <li>
          <t><tt>len</tt>: the length of the keystream to generate in bits.</t>
        </li>
        <li>
          <t><tt>key</tt>: the AEGIS key.</t>
        </li>
        <li>
          <t><tt>nonce</tt>: the 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[
stream, tag = Encrypt(ZeroPad({}, len), {}, key, nonce)

return stream
]]></artwork>
      <t>This is equivalent to encrypting a <tt>len</tt> all-zero bits message without associated data, and discarding the authentication tag.</t>
      <t>Instead of relying on the generic <tt>Encrypt</tt> function, implementations can skip the finalization step.</t>
      <t>After initialization, the <tt>Update</tt> function is called with constant parameters, allowing further optimizations.</t>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t><em>This note is to be removed before publishing as an RFC.</em></t>
      <t>Multiple implementations of the schemes described in this document have been developed and verified for interoperability.</t>
      <t>A comprehensive list of known implementations and integrations can be found at <eref target="https://github.com/cfrg/draft-irtf-cfrg-aegis-aead"/>, which includes reference implementations closely aligned with the pseudocode provided in this document.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="usage-guidelines">
        <name>Usage Guidelines</name>
        <section anchor="key-and-nonce-selection">
          <name>Key and Nonce Selection</name>
          <t>All AEGIS variants <bcp14>MUST</bcp14> be used in a nonce-respecting setting: for a given <tt>key</tt>, a <tt>nonce</tt> <bcp14>MUST</bcp14> only be used once. Failure to do so would immediately reveal the bitwise difference between two messages.</t>
          <t>Every key <bcp14>MUST</bcp14> be randomly chosen from a uniform distribution.</t>
          <t>The nonce <bcp14>MAY</bcp14> be public or predictable. It can be a counter, the output of a permutation, or a generator with a long period.</t>
          <t>With AEGIS-128L and AEGIS-128X, random nonces can safely encrypt up to 2<sup>48</sup> messages using the same key with negligible (~ 2<sup>-33</sup>, to align with NIST guidelines) collision probability.</t>
          <t>With AEGIS-256 and AEGIS-256X, random nonces can be used with no practical limits.</t>
        </section>
        <section anchor="key-commitment">
          <name>Key Commitment</name>
          <t>An authentication tag may verify under multiple keys, nonces, or associated data, but AEGIS is assumed to be key committing in the receiver-binding game, preventing common attacks when used with low-entropy keys such as passwords. Finding distinct keys and/or nonces that successfully verify the same <tt>(ad, ct, tag)</tt> tuple is expected to require ~2<sup>64</sup> attempts with a 128-bit authentication tag and ~2<sup>128</sup> attempts with a 256-bit tag.</t>
          <t>It is fully committing in the restricted setting where an adversary cannot control the associated data. As shown in <xref target="IR23"/>, with the ability to alter the associated data, it is possible to efficiently find multiple keys that will verify the same authenticated ciphertext.</t>
          <t>Protocols mandating a fully committing scheme without that restriction can provide the associated data as input to a cryptographic hash function and use the output as the <tt>ad</tt> parameter of the <tt>Encrypt</tt> and <tt>Decrypt</tt> functions. The selected hash function must ensure a minimum of 128-bit preimage resistance. An instance of such a function is SHA-256 <xref target="RFC6234"/>.</t>
        </section>
        <section anchor="multi-user-security">
          <name>Multi-User Security</name>
          <t>AEGIS nonces match the size of the key. AEGIS-128L and AEGIS-128X feature 128-bit nonces, offering an extra 32 bits compared to the commonly used AEADs in IETF protocols. The AEGIS-256 and AEGIS-256X variants provide even larger nonces. With 192 random bits, 64 bits remain available to optionally encode additional information.</t>
          <t>In all these variants, unused nonce bits can encode a key identifier, enhancing multi-user security. If every key has a unique identifier, multi-target attacks don’t provide any advantage over single-target attacks.</t>
        </section>
        <section anchor="other-uses-of-aegis">
          <name>Other Uses of AEGIS</name>
          <t>All variants can be used as a MAC by calling the <tt>Encrypt()</tt> function with the message as the <tt>ad</tt> and leaving <tt>msg</tt> empty, resulting in just a tag. However, they <bcp14>MUST NOT</bcp14> be used as a hash function; if the key is known, inputs generating state collisions can easily be crafted. Similarly, as opposed to hash-based MACs, tags <bcp14>MUST NOT</bcp14> be used for key derivation as there is no proof they are uniformly random.</t>
        </section>
      </section>
      <section anchor="implementation-security">
        <name>Implementation Security</name>
        <t>If tag verification fails, the unverified plaintext and the computed message authentication tag <bcp14>MUST NOT</bcp14> be released. As shown in <xref target="VV18"/>, even a partial leak of the plaintext without verification would facilitate chosen ciphertext attacks.</t>
        <t>The security of AEGIS against timing and physical attacks is limited by the implementation of the underlying <tt>AESRound()</tt> function. Failure to implement <tt>AESRound()</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 also depend on the threat model in question.</t>
        <t>Regardless of the variant, the <tt>key</tt> and <tt>nonce</tt> are only required by the <tt>Init</tt> function; other functions only depend on the resulting state. Therefore, implementations can overwrite ephemeral keys with zeros right after the last <tt>Update</tt> call of the initialization function.</t>
      </section>
      <section anchor="security-guarantees">
        <name>Security Guarantees</name>
        <t>AEGIS-256 offers 256-bit message security against plaintext and state recovery, whereas AEGIS-128L offers 128-bit security.</t>
        <t>Under the assumption that the secret key is unknown to the attacker, all AEGIS variants target 128-bit security against forgery attacks regardless of the tag size.</t>
        <t>Encrypting the same message with the same key and nonce but different associated data generates distinct ciphertexts that do not reveal any additional information about the message.</t>
        <t>AEGIS has been shown to have reforgeability resilience in <xref target="FLLW17"/>. Without the ability to set the associated data, a successful forgery does not increase the probability of subsequent forgeries.</t>
        <t>AEGIS-128X and AEGIS-256X share the same security properties and requirements as AEGIS-128L and AEGIS-256 respectively. In particular, the security level and usage limits remain the same <xref target="D23"/>.</t>
        <t>AEGIS is considered secure against guess-and-determine attacks aimed at recovering the state from observed ciphertexts. This resilience extends to quantum adversaries in the Q1 model, wherein quantum attacks do not confer any practical advantage for decrypting previously recorded ciphertexts or achieving key recovery.</t>
        <t>Security analyses of AEGIS can be found in <xref target="AEGIS"/>, <xref target="M14"/>, <xref target="FLLW17"/>, <xref target="ENP19"/>, <xref target="LIMS21"/>, <xref target="JLD21"/>, <xref target="STSI23"/>, <xref target="IR23"/>, and <xref target="BS23"/>.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA has assigned the following identifiers in the AEAD Algorithms Registry:</t>
      <table>
        <name>AEGIS entries in the AEAD Algorithms Registry</name>
        <thead>
          <tr>
            <th align="left">Algorithm Name</th>
            <th align="left">ID</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>AEAD_AEGIS128L</tt></td>
            <td align="left">
              <tt>32</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>AEAD_AEGIS256</tt></td>
            <td align="left">
              <tt>33</tt></td>
          </tr>
        </tbody>
      </table>
      <t>IANA is requested to update the references of these entries to refer to the final version of this document.</t>
      <t>IANA is also requested to register the following identifiers in the AEAD Algorithms Registry:</t>
      <ul spacing="normal">
        <li>
          <t><tt>AEAD_AEGIS128X2</tt></t>
        </li>
        <li>
          <t><tt>AEAD_AEGIS128X4</tt></t>
        </li>
        <li>
          <t><tt>AEAD_AEGIS256X2</tt></t>
        </li>
        <li>
          <t><tt>AEAD_AEGIS256X4</tt></t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="FIPS-AES" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197.pdf">
          <front>
            <title>Advanced encryption standard (AES)</title>
            <author>
              <organization abbrev="NIST">National Institute of Standards and Technology</organization>
              <address>
                <postal>
                  <country>US</country>
                  <city>Gaithersburg</city>
                </postal>
              </address>
            </author>
            <date month="November" year="2001"/>
          </front>
          <seriesInfo name="NIST Federal Information Processing Standards Publications" value="197"/>
          <seriesInfo name="DOI" value="10.6028/NIST.FIPS.197"/>
        </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>
        <reference anchor="RFC6234">
          <front>
            <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="May" year="2011"/>
            <abstract>
              <t>Federal Information Processing Standard, FIPS</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6234"/>
          <seriesInfo name="DOI" value="10.17487/RFC6234"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="AEGIS" target="https://competitions.cr.yp.to/round3/aegisv11.pdf">
          <front>
            <title>AEGIS: A Fast Authenticated Encryption Algorithm (v1.1)</title>
            <author initials="H." surname="Wu" fullname="Hongjun Wu">
              <organization>Nanyang Technological University</organization>
            </author>
            <author initials="B." surname="Preneel" fullname="Bart Preneel">
              <organization>KU Leuven</organization>
            </author>
            <date year="2016"/>
          </front>
        </reference>
        <reference anchor="BS23" target="https://eprint.iacr.org/2023/1306">
          <front>
            <title>Single-query Quantum Hidden Shift Attacks</title>
            <author initials="X." surname="Bonnetain" fullname="Xavier Bonnetain">
              <organization>Université de Lorraine, CNRS, Inria, LORIA</organization>
            </author>
            <author initials="A." surname="Schrottenloher" fullname="André Schrottenloher">
              <organization>Université de Rennes, CNRS, Inria, IRISA</organization>
            </author>
            <date year="2023"/>
          </front>
          <refcontent>Cryptology ePrint Archive, Paper 2023/1306</refcontent>
        </reference>
        <reference anchor="D23" target="https://eprint.iacr.org/2023/523">
          <front>
            <title>Adding more parallelism to the AEGIS authenticated encryption algorithms</title>
            <author initials="F." surname="Denis" fullname="Frank Denis">
              <organization>Fastly Inc.</organization>
            </author>
            <date year="2023"/>
          </front>
          <refcontent>Cryptology ePrint Archive, Paper 2023/523</refcontent>
        </reference>
        <reference anchor="ENP19">
          <front>
            <title>Analyzing the Linear Keystream Biases in AEGIS</title>
            <author initials="M." surname="Eichlseder" fullname="Maria Eichlseder">
              <organization>Graz University of Technology</organization>
            </author>
            <author initials="M." surname="Nageler" fullname="Marcel Nageler">
              <organization>Graz University of Technology</organization>
            </author>
            <author initials="R." surname="Primas" fullname="Robert Primas">
              <organization>Graz University of Technology</organization>
            </author>
            <date year="2020"/>
          </front>
          <seriesInfo name="DOI" value="10.13154/tosc.v2019.i4.348-368"/>
          <refcontent>IACR Transactions on Symmetric Cryptology, 2019(4), pp. 348–368</refcontent>
        </reference>
        <reference anchor="FLLW17" target="https://eprint.iacr.org/2017/332">
          <front>
            <title>Reforgeability of Authenticated Encryption Schemes</title>
            <author initials="C." surname="Forler" fullname="Christian Forler">
              <organization>Beuth Hochschule für Technik Berlin</organization>
            </author>
            <author initials="E." surname="List" fullname="Eik List">
              <organization>Bauhaus-Universität Weimar</organization>
            </author>
            <author initials="S." surname="Lucks" fullname="Stefan Lucks">
              <organization>Bauhaus-Universität Weimar</organization>
            </author>
            <author initials="J." surname="Wenzel" fullname="Jakob Wenzel">
              <organization>Bauhaus-Universität Weimar</organization>
            </author>
            <date year="2017"/>
          </front>
          <refcontent>Cryptology ePrint Archive, Paper 2017/332</refcontent>
        </reference>
        <reference anchor="IR23" target="https://eprint.iacr.org/2023/1495">
          <front>
            <title>Key Committing Security Analysis of AEGIS</title>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="M." surname="Rahman" fullname="Mostafizar Rahman">
              <organization>University of Hyogo</organization>
            </author>
            <date year="2023"/>
          </front>
          <refcontent>Cryptology ePrint Archive, Paper 2023/1495</refcontent>
        </reference>
        <reference anchor="JLD21">
          <front>
            <title>Guess-and-Determine Attacks on AEGIS</title>
            <author initials="L." surname="Jiao" fullname="Lin Jiao">
              <organization>State Key Laboratory of Cryptology</organization>
            </author>
            <author initials="Y." surname="Li" fullname="Yongqiang Li">
              <organization>State Key Laboratory of Information Security, Institute of Information Engineering, Chinese Academy of Sciences; School of Cyber Security, University of Chinese Academy of Sciences</organization>
            </author>
            <author initials="S." surname="Du" fullname="Shaoyu Du">
              <organization>State Key Laboratory of Cryptology</organization>
            </author>
            <date year="2021"/>
          </front>
          <seriesInfo name="DOI" value="10.1093/comjnl/bxab059"/>
          <refcontent>The Computer Journal, vol 65, 2022(8), pp. 2221–2230</refcontent>
        </reference>
        <reference anchor="LGR21" target="https://www.usenix.org/conference/usenixsecurity21/presentation/len">
          <front>
            <title>Partitioning Oracle Attacks</title>
            <author initials="J." surname="Len" fullname="Julia Len">
              <organization>Cornell Tech</organization>
            </author>
            <author initials="P." surname="Grubbs" fullname="Paul Grubbs">
              <organization>Cornell Tech</organization>
            </author>
            <author initials="T." surname="Ristenpart" fullname="Thomas Ristenpart">
              <organization>Cornell Tech</organization>
            </author>
            <date year="2021"/>
          </front>
          <refcontent>30th USENIX Security Symposium (USENIX Security 21), pp. 195–212</refcontent>
        </reference>
        <reference anchor="LIMS21">
          <front>
            <title>Weak Keys in Reduced AEGIS and Tiaoxin</title>
            <author initials="F." surname="Liu" fullname="Fukang Liu">
              <organization>East China Normal University; University of Hyogo</organization>
            </author>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo; National Institute of Information and Communications Technology; PRESTO, Japan Science and Technology Agency</organization>
            </author>
            <author initials="W." surname="Meier" fullname="Willi Meier">
              <organization>University of Applied Sciences and Arts Northwestern Switzerland</organization>
            </author>
            <author initials="K." surname="Sakamoto" fullname="Kosei Sakamoto">
              <organization>University of Hyogo</organization>
            </author>
            <date year="2021"/>
          </front>
          <seriesInfo name="DOI" value="10.46586/tosc.v2021.i2.104-139"/>
          <refcontent>IACR Transactions on Symmetric Cryptology, 2021(2), pp. 104–139</refcontent>
        </reference>
        <reference anchor="M14">
          <front>
            <title>Linear Biases in AEGIS Keystream</title>
            <author initials="B." surname="Minaud" fullname="Brice Minaud">
              <organization>ANSSI</organization>
            </author>
            <date year="2014"/>
          </front>
          <seriesInfo name="DOI" value="10.1007/978-3-319-13051-4_18"/>
          <refcontent>Selected Areas in Cryptography. SAC 2014. Lecture Notes in Computer Science, vol 8781, pp. 290–305</refcontent>
        </reference>
        <reference anchor="STSI23">
          <front>
            <title>MILP-based security evaluation for AEGIS/Tiaoxin-346/Rocca</title>
            <author initials="T." surname="Shiraya" fullname="Takuro Shiraya">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="N." surname="Takeuchi" fullname="Nobuyuki Takeuchi">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="K." surname="Sakamoto" fullname="Kosei Sakamoto">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo; National Institute of Information and Communications Technology</organization>
            </author>
            <date year="2023"/>
          </front>
          <seriesInfo name="DOI" value="10.1049/ise2.12109"/>
          <refcontent>IET Information Security, vol 17, 2023(3), pp. 458-467</refcontent>
        </reference>
        <reference anchor="VV18">
          <front>
            <title>Can Caesar Beat Galois?</title>
            <author initials="S." surname="Vaudenay" fullname="Serge Vaudenay">
              <organization>EPFL</organization>
            </author>
            <author initials="D." surname="Vizár" fullname="Damian Vizár">
              <organization>EPFL</organization>
            </author>
            <date year="2018"/>
          </front>
          <seriesInfo name="DOI" value="10.1007/978-3-319-93387-0_25"/>
          <refcontent>Applied Cryptography and Network Security. ACNS 2018. Lecture Notes in Computer Science, vol 10892, pp. 476–494</refcontent>
        </reference>
      </references>
    </references>
    <?line 1654?>

<section anchor="test-vectors">
      <name>Test Vectors</name>
      <section anchor="aesround-test-vector">
        <name>AESRound Test Vector</name>
        <artwork><![CDATA[
in   : 000102030405060708090a0b0c0d0e0f

rk   : 101112131415161718191a1b1c1d1e1f

out  : 7a7b4e5638782546a8c0477a3b813f43
]]></artwork>
      </section>
      <section anchor="aegis-128l-test-vectors">
        <name>AEGIS-128L Test Vectors</name>
        <section anchor="update-test-vector">
          <name>Update Test Vector</name>
          <artwork><![CDATA[
S0   : 9b7e60b24cc873ea894ecc07911049a3
S1   : 330be08f35300faa2ebf9a7b0d274658
S2   : 7bbd5bd2b049f7b9b515cf26fbe7756c
S3   : c35a00f55ea86c3886ec5e928f87db18
S4   : 9ebccafce87cab446396c4334592c91f
S5   : 58d83e31f256371e60fc6bb257114601
S6   : 1639b56ea322c88568a176585bc915de
S7   : 640818ffb57dc0fbc2e72ae93457e39a

M0   : 033e6975b94816879e42917650955aa0
M1   : 033e6975b94816879e42917650955aa0

After Update:
S0   : 596ab773e4433ca0127c73f60536769d
S1   : 790394041a3d26ab697bde865014652d
S2   : 38cf49e4b65248acd533041b64dd0611
S3   : 16d8e58748f437bfff1797f780337cee
S4   : 69761320f7dd738b281cc9f335ac2f5a
S5   : a21746bb193a569e331e1aa985d0d729
S6   : 09d714e6fcf9177a8ed1cde7e3d259a6
S7   : 61279ba73167f0ab76f0a11bf203bdff
]]></artwork>
        </section>
        <section anchor="test-vector-1">
          <name>Test Vector 1</name>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000

nonce : 10000200000000000000000000000000

ad    :

msg   : 00000000000000000000000000000000

ct    : c1c0e58bd913006feba00f4b3cc3594e

tag128: abe0ece80c24868a226a35d16bdae37a

tag256: 25835bfbb21632176cf03840687cb968
        cace4617af1bd0f7d064c639a5c79ee4
]]></artwork>
        </section>
        <section anchor="test-vector-2">
          <name>Test Vector 2</name>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000

nonce : 10000200000000000000000000000000

ad    :

msg   :

ct    :

tag128: c2b879a67def9d74e6c14f708bbcc9b4

tag256: 1360dc9db8ae42455f6e5b6a9d488ea4
        f2184c4e12120249335c4ee84bafe25d
]]></artwork>
        </section>
        <section anchor="test-vector-3">
          <name>Test Vector 3</name>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

ct    : 79d94593d8c2119d7e8fd9b8fc77845c
        5c077a05b2528b6ac54b563aed8efe84

tag128: cc6f3372f6aa1bb82388d695c3962d9a

tag256: 022cb796fe7e0ae1197525ff67e30948
        4cfbab6528ddef89f17d74ef8ecd82b3
]]></artwork>
        </section>
        <section anchor="test-vector-4">
          <name>Test Vector 4</name>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

tag256: 86f1b80bfb463aba711d15405d094baf
        4a55a15dbfec81a76f35ed0b9c8b04ac
]]></artwork>
        </section>
        <section anchor="test-vector-5">
          <name>Test Vector 5</name>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000

nonce : 10000200000000000000000000000000

ad    : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f
        20212223242526272829

msg   : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f
        3031323334353637

ct    : b31052ad1cca4e291abcf2df3502e6bd
        b1bfd6db36798be3607b1f94d34478aa
        7ede7f7a990fec10

tag128: 7542a745733014f9474417b337399507

tag256: b91e2947a33da8bee89b6794e647baf0
        fc835ff574aca3fc27c33be0db2aff98
]]></artwork>
        </section>
        <section anchor="test-vector-6">
          <name>Test Vector 6</name>
          <t>This test <bcp14>MUST</bcp14> return a “verification failed” error.</t>
          <artwork><![CDATA[
key   : 10000200000000000000000000000000

nonce : 10010000000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

tag256: 86f1b80bfb463aba711d15405d094baf
        4a55a15dbfec81a76f35ed0b9c8b04ac
]]></artwork>
        </section>
        <section anchor="test-vector-7">
          <name>Test Vector 7</name>
          <t>This test <bcp14>MUST</bcp14> return a “verification failed” error.</t>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc78

tag128: 5c04b3dba849b2701effbe32c7f0fab7

tag256: 86f1b80bfb463aba711d15405d094baf
        4a55a15dbfec81a76f35ed0b9c8b04ac
]]></artwork>
        </section>
        <section anchor="test-vector-8">
          <name>Test Vector 8</name>
          <t>This test <bcp14>MUST</bcp14> return a “verification failed” error.</t>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000

nonce : 10000200000000000000000000000000

ad    : 0001020304050608

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

tag256: 86f1b80bfb463aba711d15405d094baf
        4a55a15dbfec81a76f35ed0b9c8b04ac
]]></artwork>
        </section>
        <section anchor="test-vector-9">
          <name>Test Vector 9</name>
          <t>This test <bcp14>MUST</bcp14> return a “verification failed” error.</t>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 6c04b3dba849b2701effbe32c7f0fab8

tag256: 86f1b80bfb463aba711d15405d094baf
        4a55a15dbfec81a76f35ed0b9c8b04ad
]]></artwork>
        </section>
      </section>
      <section anchor="aegis-256-test-vectors">
        <name>AEGIS-256 Test Vectors</name>
        <section anchor="update-test-vector-1">
          <name>Update Test Vector</name>
          <artwork><![CDATA[
S0   : 1fa1207ed76c86f2c4bb40e8b395b43e
S1   : b44c375e6c1e1978db64bcd12e9e332f
S2   : 0dab84bfa9f0226432ff630f233d4e5b
S3   : d7ef65c9b93e8ee60c75161407b066e7
S4   : a760bb3da073fbd92bdc24734b1f56fb
S5   : a828a18d6a964497ac6e7e53c5f55c73

M    : b165617ed04ab738afb2612c6d18a1ec

After Update:
S0   : e6bc643bae82dfa3d991b1b323839dcd
S1   : 648578232ba0f2f0a3677f617dc052c3
S2   : ea788e0e572044a46059212dd007a789
S3   : 2f1498ae19b80da13fba698f088a8590
S4   : a54c2ee95e8c2a2c3dae2ec743ae6b86
S5   : a3240fceb68e32d5d114df1b5363ab67
]]></artwork>
        </section>
        <section anchor="test-vector-1-1">
          <name>Test Vector 1</name>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000
        00000000000000000000000000000000

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    :

msg   : 00000000000000000000000000000000

ct    : 754fc3d8c973246dcc6d741412a4b236

tag128: 3fe91994768b332ed7f570a19ec5896e

tag256: 1181a1d18091082bf0266f66297d167d
        2e68b845f61a3b0527d31fc7b7b89f13
]]></artwork>
        </section>
        <section anchor="test-vector-2-1">
          <name>Test Vector 2</name>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000
        00000000000000000000000000000000

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    :

msg   :

ct    :

tag128: e3def978a0f054afd1e761d7553afba3

tag256: 6a348c930adbd654896e1666aad67de9
        89ea75ebaa2b82fb588977b1ffec864a
]]></artwork>
        </section>
        <section anchor="test-vector-3-1">
          <name>Test Vector 3</name>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000
        00000000000000000000000000000000

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

ct    : f373079ed84b2709faee373584585d60
        accd191db310ef5d8b11833df9dec711

tag128: 8d86f91ee606e9ff26a01b64ccbdd91d

tag256: b7d28d0c3c0ebd409fd22b4416050307
        3a547412da0854bfb9723020dab8da1a
]]></artwork>
        </section>
        <section anchor="test-vector-4-1">
          <name>Test Vector 4</name>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000
        00000000000000000000000000000000

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

tag256: 8c1cc703c81281bee3f6d9966e14948b
        4a175b2efbdc31e61a98b4465235c2d9
]]></artwork>
        </section>
        <section anchor="test-vector-5-1">
          <name>Test Vector 5</name>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000
        00000000000000000000000000000000

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f
        20212223242526272829

msg   : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f
        3031323334353637

ct    : 57754a7d09963e7c787583a2e7b859bb
        24fa1e04d49fd550b2511a358e3bca25
        2a9b1b8b30cc4a67

tag128: ab8a7d53fd0e98d727accca94925e128

tag256: a3aca270c006094d71c20e6910b5161c
        0826df233d08919a566ec2c05990f734
]]></artwork>
        </section>
        <section anchor="test-vector-6-1">
          <name>Test Vector 6</name>
          <t>This test <bcp14>MUST</bcp14> return a “verification failed” error.</t>
          <artwork><![CDATA[
key   : 10000200000000000000000000000000
        00000000000000000000000000000000

nonce : 10010000000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

tag256: 8c1cc703c81281bee3f6d9966e14948b
        4a175b2efbdc31e61a98b4465235c2d9
]]></artwork>
        </section>
        <section anchor="test-vector-7-1">
          <name>Test Vector 7</name>
          <t>This test <bcp14>MUST</bcp14> return a “verification failed” error.</t>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000
        00000000000000000000000000000000

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358459

tag128: c60b9c2d33ceb058f96e6dd03c215652

tag256: 8c1cc703c81281bee3f6d9966e14948b
        4a175b2efbdc31e61a98b4465235c2d9
]]></artwork>
        </section>
        <section anchor="test-vector-8-1">
          <name>Test Vector 8</name>
          <t>This test <bcp14>MUST</bcp14> return a “verification failed” error.</t>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000
        00000000000000000000000000000000

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050608

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

tag256: 8c1cc703c81281bee3f6d9966e14948b
        4a175b2efbdc31e61a98b4465235c2d9
]]></artwork>
        </section>
        <section anchor="test-vector-9-1">
          <name>Test Vector 9</name>
          <t>This test <bcp14>MUST</bcp14> return a “verification failed” error.</t>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000
        00000000000000000000000000000000

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215653

tag256: 8c1cc703c81281bee3f6d9966e14948b
        4a175b2efbdc31e61a98b4465235c2da
]]></artwork>
        </section>
      </section>
      <section anchor="aegis-128x2-test-vectors">
        <name>AEGIS-128X2 Test Vectors</name>
        <section anchor="initial-state">
          <name>Initial State</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f

nonce : 101112131415161718191a1b1c1d1e1f

ctx[0]: 00010000000000000000000000000000
ctx[1]: 01010000000000000000000000000000
]]></artwork>
          <t>After initialization:</t>
          <artwork><![CDATA[
V[0,0]: a4fc1ad9a72942fb88bd2cabbba6509a
V[0,1]: 80a40e392fc71084209b6c3319bdc6cc

V[1,0]: 380f435cf801763b1f0c2a2f7212052d
V[1,1]: 73796607b59b1b650ee91c152af1f18a

V[2,0]: 6ee1de433ea877fa33bc0782abff2dcb
V[2,1]: b9fab2ab496e16d1facaffd5453cbf14

V[3,0]: 85f94b0d4263bfa86fdf45a603d8b6ac
V[3,1]: 90356c8cadbaa2c969001da02e3feca0

V[4,0]: 09bd69ad3730174bcd2ce9a27cd1357e
V[4,1]: e610b45125796a4fcf1708cef5c4f718

V[5,0]: fcdeb0cf0a87bf442fc82383ddb0f6d6
V[5,1]: 61ad32a4694d6f3cca313a2d3f4687aa

V[6,0]: 571c207988659e2cdfbdaae77f4f37e3
V[6,1]: 32e6094e217573bf91fb28c145a3efa8

V[7,0]: ca549badf8faa58222412478598651cf
V[7,1]: 3407279a54ce76d2e2e8a90ec5d108eb
]]></artwork>
        </section>
        <section anchor="test-vector-1-2">
          <name>Test Vector 1</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f

nonce : 101112131415161718191a1b1c1d1e1f

ad    :

msg   :

ct    :

tag128: 63117dc57756e402819a82e13eca8379

tag256: b92c71fdbd358b8a4de70b27631ace90
        cffd9b9cfba82028412bac41b4f53759
]]></artwork>
        </section>
        <section anchor="test-vector-2-2">
          <name>Test Vector 2</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f

nonce : 101112131415161718191a1b1c1d1e1f

ad    : 0102030401020304

msg   : 04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        0405060704050607

ct    : 5795544301997f93621b278809d6331b
        3bfa6f18e90db12c4aa35965b5e98c5f
        c6fb4e54bcb6111842c20637252eff74
        7cb3a8f85b37de80919a589fe0f24872
        bc926360696739e05520647e390989e1
        eb5fd42f99678a0276a498f8c454761c
        9d6aacb647ad56be62b29c22cd4b5761
        b38f43d5a5ee062

tag128: 1aebc200804f405cab637f2adebb6d77

tag256: c471876f9b4978c44f2ae1ce770cdb11
        a094ee3feca64e7afcd48bfe52c60eca
]]></artwork>
        </section>
      </section>
      <section anchor="aegis-128x4-test-vectors">
        <name>AEGIS-128X4 Test Vectors</name>
        <section anchor="initial-state-1">
          <name>Initial State</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f

nonce : 101112131415161718191a1b1c1d1e1f

ctx[0]: 00030000000000000000000000000000
ctx[1]: 01030000000000000000000000000000
ctx[2]: 02030000000000000000000000000000
ctx[3]: 03030000000000000000000000000000
]]></artwork>
          <t>After initialization:</t>
          <artwork><![CDATA[
V[0,0]: 924eb07635003a37e6c6575ba8ce1929
V[0,1]: c8b6a5d91475445e936d48e794be0ce2
V[0,2]: fcd37d050e24084befe3bbb219d64760
V[0,3]: 2e9f58cfb893a8800220242c373a8b18

V[1,0]: 1a1f60c4fab64e5471dc72edfcf6fe6b
V[1,1]: c1e525ebea2d6375a9edd045dce96381
V[1,2]: 97a3e25abd228a44d4a14a6d3fe9185c
V[1,3]: c2d4cf7f4287a98744645674265d4ca8

V[2,0]: 7bb50c534f6ec4780530ff1cce8a16e8
V[2,1]: 7b08d57557da0b5ef7b5f7d98b0ba189
V[2,2]: 6bfcac34ddb68404821a4d665303cb0f
V[2,3]: d95626f6dfad1aed7467622c38529932

V[3,0]: af339fd2d50ee45fc47665c647cf6586
V[3,1]: d0669b39d140f0e118a4a511efe2f95a
V[3,2]: 7a94330f35c194fadda2a87e42cdeccc
V[3,3]: 233b640d1f4d56e2757e72c1a9d8ecb1

V[4,0]: 9f93737d699ba05c11e94f2b201bef5e
V[4,1]: 61caf387cf7cfd3f8300ac7680ccfd76
V[4,2]: 5825a671ecef03b7a9c98a601ae32115
V[4,3]: 87a1fe4d558161a8f4c38731f3223032

V[5,0]: 7a5aca78d636c05bbc702b2980196ab6
V[5,1]: 915d868408495d07eb527789f282c575
V[5,2]: d0947bfbc1d3309cdffc9be1503aea62
V[5,3]: 8834ea57a15b9fbdc0245464a4b8cbef

V[6,0]: e46f4cf71a95ac45b6f0823e3aba1a86
V[6,1]: 8c4ecef682fc44a8eba911b3fc7d99f9
V[6,2]: a4fb61e2c928a2ca760b8772f2ea5f2e
V[6,3]: 3d34ea89da73caa3016c280500a155a3

V[7,0]: 85075f0080e9d618e7eb40f57c32d9f7
V[7,1]: d2ab2b320c6e93b155a3787cb83e5281
V[7,2]: 0b3af0250ae36831a1b072e499929bcb
V[7,3]: 5cce4d00329d69f1aae36aa541347512
]]></artwork>
        </section>
        <section anchor="test-vector-1-3">
          <name>Test Vector 1</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f

nonce : 101112131415161718191a1b1c1d1e1f

ad    :

msg   :

ct    :

tag128: 5bef762d0947c00455b97bb3af30dfa3

tag256: a4b25437f4be93cfa856a2f27e4416b4
        2cac79fd4698f2cdbe6af25673e10a68
]]></artwork>
        </section>
        <section anchor="test-vector-2-3">
          <name>Test Vector 2</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f

nonce : 101112131415161718191a1b1c1d1e1f

ad    : 0102030401020304

msg   : 04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        0405060704050607

ct    : e836118562f4479c9d35c17356a83311
        4c21f9aa39e4dda5e5c87f4152a00fce
        9a7c38f832eafe8b1c12f8a7cf12a81a
        1ad8a9c24ba9dedfbdaa586ffea67ddc
        801ea97d9ab4a872f42d0e352e2713da
        cd609f9442c17517c5a29daf3e2a3fac
        4ff6b1380c4e46df7b086af6ce6bc1ed
        594b8dd64aed2a7e

tag128: 0e56ab94e2e85db80f9d54010caabfb4

tag256: 69abf0f64a137dd6e122478d777e98bc
        422823006cf57f5ee822dd78397230b2
]]></artwork>
        </section>
      </section>
      <section anchor="aegis-256x2-test-vectors">
        <name>AEGIS-256X2 Test Vectors</name>
        <section anchor="initial-state-2">
          <name>Initial State</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ctx[0]: 00010000000000000000000000000000
ctx[1]: 01010000000000000000000000000000
]]></artwork>
          <t>After initialization:</t>
          <artwork><![CDATA[
V[0,0]: eca2bf4538442e8712d4972595744039
V[0,1]: 201405efa9264f07911db58101903087

V[1,0]: 3e536a998799408a97f3479a6f779d48
V[1,1]: 0d79a7d822a5d215f78c3bf2feb33ae1

V[2,0]: cf8c63d6f2b4563cdd9231107c85950e
V[2,1]: 78d17ed7d8d563ff11bd202c76864839

V[3,0]: d7e0707e6bfbbad913bc94b6993a9fa0
V[3,1]: 097e4b1bff40d4c19cb29dfd125d62f2

V[4,0]: a373cf6d537dd66bc0ef0f2f9285359f
V[4,1]: c0d0ae0c48f9df3faaf0e7be7768c326

V[5,0]: 9f76560dcae1efacabdcce446ae283bc
V[5,1]: bd52a6b9c8f976a26ec1409df19e8bfe
]]></artwork>
        </section>
        <section anchor="test-vector-1-4">
          <name>Test Vector 1</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ad    :

msg   :

ct    :

tag128: 62cdbab084c83dacdb945bb446f049c8

tag256: 25d7e799b49a80354c3f881ac2f1027f
        471a5d293052bd9997abd3ae84014bb7
]]></artwork>
        </section>
        <section anchor="test-vector-2-4">
          <name>Test Vector 2</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ad    : 0102030401020304

msg   : 04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        0405060704050607

ct    : 73110d21a920608fd77b580f1e442808
        7a7365cb153b4eeca6b62e1a70f7f9a8
        d1f31f17da4c3acfacb2517f2f5e1575
        8c35532e33751a964d18d29a599d2dc0
        7f9378339b9d8c9fa03d30a4d7837cc8
        eb8b99bcbba2d11cd1a0f994af2b8f94
        7ef18473bd519e5283736758480abc99
        0e79d4ccab93dde9

tag128: 94a3bd44ad3381e36335014620ee638e

tag256: 0392c62b17ddb00c172a010b5a327d0f
        97317b6fbaee31ef741f004d7adc1e81
]]></artwork>
        </section>
      </section>
      <section anchor="aegis-256x4-test-vectors">
        <name>AEGIS-256X4 Test Vectors</name>
        <section anchor="initial-state-3">
          <name>Initial State</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ctx[0]: 00030000000000000000000000000000
ctx[1]: 01030000000000000000000000000000
ctx[2]: 02030000000000000000000000000000
ctx[3]: 03030000000000000000000000000000
]]></artwork>
          <t>After initialization:</t>
          <artwork><![CDATA[
V[0,0]: 482a86e8436cd2361063a4b2702769b9
V[0,1]: d95a2be81c9245b22996f68eea0122f9
V[0,2]: 0c2a3b348b1a5e256c6751377318c41e
V[0,3]: f64436a21653fe7cf2e0829a177db383

V[1,0]: e705e8866267717d96092e58e78b574c
V[1,1]: d1dd412142df9806cc267af2fe1d830e
V[1,2]: 30e7dfd3c9941b8394e95bdf5bac99d9
V[1,3]: 9f27186f8a4fab86820689822c3c74d2

V[2,0]: e1aa6af5d9e31dde8d94a48a0810fa89
V[2,1]: 63555cdf0d98f18fb75b029ad80786c0
V[2,2]: a3ee0e4a3429a9539e4fcec385475608
V[2,3]: 28ea527d31ef61df498dc107fe02df99

V[3,0]: 37f06808410c8f3954525ae44584d3be
V[3,1]: 8fcc23bca2fe2209f93d34e2da35b33d
V[3,2]: 33156347df89eaa69ab11096362daccf
V[3,3]: bbe58d9dbe8c5b0469be5a87086db5d4

V[4,0]: d1c9eb37fecbc5ada7b351fa4f501f32
V[4,1]: 0b9b803283c1538628b507c8f6432434
V[4,2]: bfb8b6d4f87cce28825c7e92f54b8728
V[4,3]: 8917bb5b09c32f900c6a5a1d63c46264

V[5,0]: 4f6110c2ef0c3c687e90c1e5532ddf8e
V[5,1]: 031bd85d99f64684d23728a0453c72a1
V[5,2]: 10bc7ec34d4119b5bdeb6c7dfc458247
V[5,3]: 591ece530aeaa5c9867220156f5c25e3
]]></artwork>
        </section>
        <section anchor="test-vector-1-5">
          <name>Test Vector 1</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ad    :

msg   :

ct    :

tag128: 3b7fee6cee7bf17888ad11ed2397beb4

tag256: 6093a1a8aab20ec635dc1ca71745b01b
        5bec4fc444c9ffbebd710d4a34d20eaf
]]></artwork>
        </section>
        <section anchor="test-vector-2-5">
          <name>Test Vector 2</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ad    : 0102030401020304

msg   : 04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        0405060704050607

ct    : bec109547f8316d598b3b7d947ad4c0e
        f5b98e217cffa0d858ad49ae34109a95
        abc5b5fada820c4d6ae2fca0f5e2444e
        52a04a1edb7bec71408de3e199500521
        94506be3ba6a4de51a15a577ea0e4c14
        f7539a13e751a555f48d0f49fecffb22
        0525e60d381e2efa803b09b7164ba59f
        dc66656affd51e06

tag128: ec44b512d713f745547be345bcc66b6c

tag256: ba3168ecd7f7120c5e204a7e0d616e39
        5675ddfe00e4e5490a5ba93bb1a70555
]]></artwork>
        </section>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The AEGIS authenticated encryption algorithm was invented by Hongjun Wu and Bart Preneel.</t>
      <t>The round function leverages the AES permutation invented by Joan Daemen and Vincent Rijmen. They also authored the Pelican MAC that partly motivated the design of the AEGIS MAC.</t>
      <t>We would like to thank the following individuals for their contributions:</t>
      <ul spacing="normal">
        <li>
          <t>Eric Lagergren and Daniel Bleichenbacher for catching a broken test vector and Daniel Bleichenbacher for many helpful suggestions.</t>
        </li>
        <li>
          <t>John Preuß Mattsson for his review of the draft, and for suggesting how AEGIS should be used in the context of DTLS and QUIC.</t>
        </li>
        <li>
          <t>Bart Mennink and Charlotte Lefevre as well as Takanori Isobe and Mostafizar Rahman for investigating the commitment security of the schemes specified in this document.</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
PNAfAUmJnujFlcaIOEKueV0TzGPi98jxj97z40cnLz7dAzi4kHVrVCwbu1Le
4RmeXmFhvzjwnppqA559Uc1m1eTNlmEcXlzMKkhPa8245cPlqiHqrs5fm4by
Ud7J62r1DTAb3m7vxZ8Qu4J288Vq6k/+tGhMtfnydk6XVeCpiMby76KrSUzV
R1sDyT9BwKAIXB/iBZe1wn62lBfnl+j04QOCVREZGLVaI9J9RskyLth6aUcb
66WzNBPOPec+BWB+fLNz9tN7eYqIaz8UOXTCj8V+9JW4Rfj1IZgLUV/rCVE/
hNqa6Ssm6eGzk5OjMWaMiIgnL06Opqjx6dGT5/sFiKi91jx75pWcra3kQoYt
Ze85i7IfRsm944VScmhbHr24wj8TuUTKJiW8GzqTEsXZfpSkN9Msyu9VjYEZ
CQBubgUpT86rpbyUmyq9Xi42Xr4dqHx2QPWYNfDxpPpni2J9uX5Zbb5/uxbe
rQK9r/ZuC6T+/HORjcXyAQzhA2kaUnEjV95Hcraomv8YyFxrtYa6zA0/MytK
mXdCeOAdPnh2QkqQ3VrDhZ/lgRPWNIGKR3n0liqeh2GW7vtfBbeIhYAUP4cW
m1peTphzYgCxNl9aN/j88ZPt9T1EfdU3//V/Tx3CQzmnYH3yblxZZzKynZ39
/X1PFjCogAw7Oy/OEUTqhVrPgdw8bRq1rApQsUsE7osge7Lnfg/iZK9//OWe
9Srtqy/x64mzO7dIH1Jr1VmN12SQzquz831Epyxw7CpJFpykHVBHTd9P9Fl6
F8sFENKK5JR6O5xHAXhq4EnUOWDfYn3h3X3w+PijXagKf1ovVui4BwP3uKuE
BtK+8ni+RS41mmVyzSutZ2Zn53c0jWM/oCmCm4nnld2005UEgQc+92TTLFTF
r8Ar6d09fHT4cHdIrG+/5Rq//37Pe31eYWSvAcM9hDmA3Pjck1pXToVLuI8Z
UGlzM2FJW1YucnUzG9Y9XJHAuj9wA4e2Hpv1sqJwDKPZrBBRNSA5z6mA6F+c
VzOamWnFxnuN7jat/6augwZ1DXWllldEU4QWnoIcDYTtiXfORQuzIs3u/Noc
8UpFYoXgs6m08ao5ePoKNY/GPJRTqp6qwq/7RbXyXiJE+/ZbC8i//x6mBaj9
FeVA61WfYPEkyF3VZDnNfrk0tk6EQ9CkNY+kXC7mjvUnQwbz/JBXrmuWGrT0
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
e+Jql0s/SRHL+ODFU38X78ToHeo7EfQ4GD0WeBzQ43D0OMDjkB5Ho8chHkfU
ANcUj95FeBfT42T0OMbjhB6no8cUdqWwDugvWbbf+ySQ/BuLJP8WkFDybyGJ
Jf8WkTzybzHJIv+WkBzyb+lIxqwdncjYwLj28mUfDuTLMma48HCYmz2V1amd
JblCpiaiI9uc5JbKJixdoZKV6Iy9rPZIcHZb1bCvx6oE2DkZYwtERxHg9uhv
6/DeVEObdvP43lw/vnGAMC3bxz3b6PENSTgY/TdIL35AMr1/YdH8hokU0IuY
XyT0gkRqQsI3LQkB76iyFWnINz79SYVWVO03YmdKYTjPDzz+BJ6PyvYAvRqR
H15xQv7Wq45w93bMvZX86i3JfwuSjliwwa4eR/00LFBvxwIqtcc03915cyUb
3mywwYGTTW4MUcuIKe7FNt5cOc9yquob2HPbqZgxE+sxJOA0FSeYJsxryw0m
iGhiFd+/c761wFXVLXC9DRff1MMId8g7Qqk1YcJXaOfVZjtvxu04cbCF+wD5
TT1ifAs7J2y/xSTXQBba0iP8x1t+mi1rybuU1zAGGse9W3JcU6fQ92tjqcf2
9GC/PmA4jK0ft93oPhoL0VtkY1atrNzltRWDXu8SW/nhiKq7HQ5MOxhImYld
Gwugha/a3C8llO97v+umZtx2cQomGMew3FpBDelH1IrsSWLBvzf573ddUnhQ
1d2Nurjnd4fV0Y+0F7E++TKY5qCqN2Y56KGd5JjsQGjnOJrqzdUzHPEvOcMx
yLD3mfT/1Wc4riLKbzMcv81w/DbD8dsMxy87w0GwyIGjdzLDManvtxmO32Y4
fpvh+MVNzK97huNtbdTmDEcXdq5GtV0x38Hvfpvv+LnmO+JffL4jvs18x0sU
ftlnGJgCLCk1XtT9CzdBYYXITpJQtFj7doLkJUWNdTtLItwsie9mSXw3JxK3
JVGiDX6jPXDKhb8v/d3BH2L4h21s9Jpb3N15i/mSHzZVwtuPbz1T0vNdjudJ
rgR/bzfREb/NREfcTnT8lPMcV05x/KhJi3c+QbHl2IIbJijiqycorp6YcLLW
detdTD5s7fr1kw+bfX+zve/bJx0mydXt+W7ilBjlm/rcaUsHRsE8RwDQ/Dfv
m59kdmArfa6fHdikz41j3z43cMOcwLU04qS9cnQZEuz9Tt3H70/q/lryUnw1
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
deomkuj6DHu1GAzGVWvy3EIct9bwsl0AtnbLv+x1aG5LiTZ8v5VdncMnw1dq
cvneQX+HV7s86fPTblXZeJ2YPQ96Y8Gbd5dXZZ8+BNUCIFS6+4xLbixjG5aM
Tul61sHFiNc2Tcc03KZhKndzs1/Y8Hu4Ek5ayz1bLC4a3mHpnZK8nXZ75YsF
XePVmLVeMGH7fs6ksguati8uhKh82hoQu2JuJCdd7DBepte4+cJ+pSrbNLrA
jS4Pcneejm53pJ2u7ionXn/pFgJaOWsma+827mCk5mjl1Hopz6wotZc+8hxn
gChkfFnlBjt2bQoj2ii5wZBdm78YGOX+2lu+qIV6SZd+dGIZ0J0g/Z9R/ydJ
Dr21t4R0j6L25I7+7Ht7M1uzns/lkt3H+eK1N6d9+jZAWppuxQwvQO34cZdW
C+7uuVXlfCGZu/2M6AfxsgkXUrXd7uIzrz3jYrJGlYtRigj0oYW865keXa9J
y5TpUP4BZzGS7/qjTWChvvOOec+r8zSQL/vNcdvGCWn9d94J94v/aMuipv3+
P2/41338dX9/87/7o1LdM+pTb6NQpv2PrH77Vxd+uv/6Uva1H0Tjmr4MBmUg
ON1f3Vn722sK/Cib1BT1ZWw7g1qvqSny82RQE7U7LEMjuuXo6MyZcU2j0Q3p
dMPoRBxO+jQc3YhON4wu9FOUHd2At1Tn1creqO4Ulm+x5BvxJjfRErDlEqw2
4xtq7XWVF9WFmTHsmstLr1lVfJhJbcpqcB/F2NId0N1b7npEz101Bi2wd9pM
Fi93N6fxTWl2W9mrxYxvf5Zu6b11qzWdeNKaQ3e58xX3txLxXbv27iu3ZLmU
ME90vkZl72Q9mpjMp4d/prd09A8tMIPJbLc3jAZprXs71N9RJGsvumoXFe56
L+gSSwINw5u6qfqXxlxsHIbiDMy2TeR1vyq/O+6FDz6wi2K9YsF3j/dnyNAp
IfWZRQF2Yxbftm3v4qYH3WEF1XxuNG3GoU0K/e2BfcccKna4W381WLw52F7i
7tamLpyslkbOvQdcAwY/a2nV3cU9vBiYEQ5BAfuV21px4Hag8kM6BOCq1Zm2
xHCj45sLSVclSl6lxZuV6m6TiDvdhfNk0vYHzmPf4u49ew2ovY6Wq53sa0Kx
rVuSuvIkK939vMNdTf1W7O7CzY1d2Hb7NZ1Lsa67Kyf36IpWClUNC2J7kJJd
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

-->

</rfc>
