<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-aegis-aead-17" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.0 -->
  <front>
    <title>The AEGIS Family of Authenticated Encryption Algorithms</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-aegis-aead-17"/>
    <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="2025" month="August" day="10"/>
    <workgroup>Crypto Forum</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 295?>

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

<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 for high-performance applications in the CAESAR (Competition for Authenticated Encryption: Security, Applicability, and Robustness) competition.</t>
      <t>Among the finalists, AEGIS-128 was chosen as the winner for this category. However, AEGIS-128L, another finalist, offers enhanced performance and a stronger security margin <xref target="ENP20"/> <xref target="JLD22"/> <xref target="LIMS21"/> <xref target="STSI23"/>.
Additionally, AEGIS-256, which also reached the final round, provides 256-bit security and supports higher usage limits.</t>
      <t>Therefore, this document specifies the following variants:</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>All variants are inverse-free and constructed from the AES encryption round function <xref target="FIPS-AES"/>.</t>
      <t>The AEGIS cipher family offers performance that significantly exceeds AES-GCM on CPUs with AES instructions. Similarly, software implementations not using AES instructions 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 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>With 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 or previous states.</t>
      <t>Finally, an AEGIS key is not required after the initialization function, 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 with a different <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>: returns the little-endian encoding of unsigned 64-bit integer <tt>x</tt>.</t>
        </li>
        <li>
          <t><tt>ZeroPad(x, n)</tt>: returns <tt>x</tt> after appending zeros until its length is a multiple of <tt>n</tt> bits. No padding is added if the length of <tt>x</tt> is already a multiple of <tt>n</tt>, including when <tt>x</tt> is empty.</t>
        </li>
        <li>
          <t><tt>Truncate(x, n)</tt>: returns the first <tt>n</tt> bits of <tt>x</tt>.</t>
        </li>
        <li>
          <t><tt>Split(x, n)</tt>: returns <tt>x</tt> 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 and <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> - 1 bytes (2<sup>64</sup> - 8 bits).</t>
        </li>
        <li>
          <t><tt>A_MAX</tt> (maximum length of the associated data) is 2<sup>61</sup> - 1 bytes (2<sup>64</sup> - 8 bits).</t>
        </li>
        <li>
          <t><tt>N_MIN</tt> (minimum nonce length) = <tt>N_MAX</tt> (maximum nonce length) = 16 bytes (128 bits).</t>
        </li>
        <li>
          <t><tt>C_MAX</tt> (maximum ciphertext length) = <tt>P_MAX</tt> + tag length = (2<sup>61</sup> - 1) + 16 or 32 bytes (in bits: (2<sup>64</sup> - 8) + 128 or 256 bits).</t>
        </li>
      </ul>
      <t>Distinct associated data inputs, as described in <xref section="3" sectionFormat="comma" target="RFC5116"/>, <bcp14>MUST</bcp14> be unambiguously encoded as a single input.
It is up to the application to create a structure in the associated data input if needed.</t>
      <section anchor="authenticated-encryption">
        <name>Authenticated Encryption</name>
        <artwork><![CDATA[
Encrypt(msg, ad, key, nonce)
]]></artwork>
        <t>The <tt>Encrypt</tt> function encrypts a message and returns the ciphertext along with an authentication tag that verifies the authenticity of the message and associated data, if provided.</t>
        <t>Security:</t>
        <ul spacing="normal">
          <li>
            <t>For a given key, the nonce <bcp14>MUST NOT</bcp14> be reused under any circumstances; doing so allows an attacker to recover the internal state.</t>
          </li>
          <li>
            <t>The key <bcp14>MUST</bcp14> be randomly chosen from a uniform distribution.</t>
          </li>
        </ul>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>msg</tt>: the message to be encrypted (length <bcp14>MUST</bcp14> be less than or equal to <tt>P_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than or equal to <tt>A_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ct</tt>: the ciphertext.</t>
          </li>
          <li>
            <t><tt>tag</tt>: the authentication tag.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

ct = {}

ad_blocks = Split(ZeroPad(ad, 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 authentication tag <bcp14>MUST NOT</bcp14> be given as output. The decrypted message <bcp14>MUST</bcp14> be overwritten with zeros before the function returns.</t>
          </li>
          <li>
            <t>The comparison of the input <tt>tag</tt> with the <tt>expected_tag</tt> <bcp14>MUST</bcp14> be done in constant time.</t>
          </li>
        </ul>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ct</tt>: the ciphertext to decrypt (length <bcp14>MUST</bcp14> be less than or equal to <tt>C_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>tag</tt>: the authentication tag.</t>
          </li>
          <li>
            <t><tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than or equal to <tt>A_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t>Either the decrypted message <tt>msg</tt> or an error indicating that the authentication tag is invalid for the given inputs.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

msg = {}

ad_blocks = Split(ZeroPad(ad, 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
    erase expected_tag
    return "verification failed" error
else:
    return msg
]]></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-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-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 = S1 ^ S6 ^ (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 = S1 ^ S6 ^ (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 = S1 ^ S6 ^ (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_len_bits == 128:
    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> - 1 bytes (2<sup>64</sup> - 8 bits).</t>
        </li>
        <li>
          <t><tt>A_MAX</tt> (maximum length of the associated data) is 2<sup>61</sup> - 1 bytes (2<sup>64</sup> - 8 bits).</t>
        </li>
        <li>
          <t><tt>N_MIN</tt> (minimum nonce length) = <tt>N_MAX</tt> (maximum nonce length) = 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> - 1) + 16 or 32 bytes (in bits: (2<sup>64</sup> - 8) + 128 or 256 bits).</t>
        </li>
      </ul>
      <t>Distinct associated data inputs, as described in <xref section="3" sectionFormat="comma" target="RFC5116"/>, <bcp14>MUST</bcp14> be unambiguously encoded as a single input.
It is up to the application to create a structure in the associated data input if needed.</t>
      <section 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 or equal to <tt>P_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than or equal to <tt>A_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ct</tt>: the ciphertext.</t>
          </li>
          <li>
            <t><tt>tag</tt>: the authentication tag.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

ct = {}

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

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

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

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

msg = {}

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

ct_blocks = Split(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
    erase expected_tag
    return "verification failed" error
else:
    return msg
]]></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 128-bit 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-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-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 128-bit 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 128-bit input block.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ci</tt>: the 128-bit encrypted block.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
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 128-bit encrypted block.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>xi</tt>: the 128-bit 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_len_bits == 128:
    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>256 * 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-256X, <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
    erase expected_tag
    return "verification failed" error
else:
    return msg
]]></artwork>
      </section>
      <section anchor="aegis-128x">
        <name>AEGIS-128X</name>
        <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>256 * 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-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

for i in 0..D:
    ctx[i] = ZeroPad(Byte(i) || Byte(D - 1), 128)

Repeat(10,
    for i in 0..D:
        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-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_len_bits == 128:
    tag = ZeroPad({}, 128)
    for i in 0..D:
        ti = V[0,i] ^ V[1,i] ^ V[2,i] ^ V[3,i] ^ V[4,i] ^ V[5,i] ^ V[6,i]
        tag = tag ^ ti

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

return tag
]]></artwork>
        </section>
      </section>
      <section anchor="aegis-256x">
        <name>AEGIS-256X</name>
        <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-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)

for i in 0..D:
    ctx[i] = ZeroPad(Byte(i) || Byte(D - 1), 128)

Repeat(4,
    for i in 0..D:
        V[3,i] = V[3,i] ^ ctx[i]
        V[5,i] = V[5,i] ^ ctx[i]

    Update(k0_v)
    for i in 0..D:
        V[3,i] = V[3,i] ^ ctx[i]
        V[5,i] = V[5,i] ^ ctx[i]

    Update(k1_v)
    for i in 0..D:
        V[3,i] = V[3,i] ^ ctx[i]
        V[5,i] = V[5,i] ^ ctx[i]

    Update(k0n0_v)
    for i in 0..D:
        V[3,i] = V[3,i] ^ ctx[i]
        V[5,i] = V[5,i] ^ ctx[i]

    Update(k1n1_v)
)
]]></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_len_bits == 128:
    tag = ZeroPad({}, 128)
    for i in 0..D:
        ti = V[0,i] ^ V[1,i] ^ V[2,i] ^ V[3,i] ^ V[4,i] ^ V[5,i]
        tag = tag ^ ti

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

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, respectively. This property can be used to reduce the 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 size 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 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 AEGIS nonce. If unspecified, it is set to <tt>N_MAX</tt> zero bytes.</t>
        </li>
      </ul>
      <t>Outputs:</t>
      <ul spacing="normal">
        <li>
          <t><tt>stream</tt>: the keystream.</t>
        </li>
      </ul>
      <t>Steps:</t>
      <artwork><![CDATA[
if len == 0:
    return {}
else:
    stream, tag = Encrypt(ZeroPad({ 0 }, len), {}, key, nonce)
    return stream
]]></artwork>
      <t>This is equivalent to encrypting a <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 omit the <tt>Finalize</tt> function.</t>
      <t>After initialization, the <tt>Update</tt> function is called with constant parameters, allowing further optimizations.</t>
    </section>
    <section anchor="aegis-as-a-message-authentication-code">
      <name>AEGIS as a Message Authentication Code</name>
      <t>All AEGIS variants can be used to construct a Message Authentication Code (MAC).</t>
      <t>For all the variants, the <tt>Mac</tt> function takes a key, a nonce, and data as input and produces a 128- or 256-bit tag as output.</t>
      <artwork><![CDATA[
Mac(data, key, nonce)
]]></artwork>
      <t>Security:</t>
      <ul spacing="normal">
        <li>
          <t>This is the only function that allows the reuse of <tt>(key, nonce)</tt> pairs with different inputs.</t>
        </li>
        <li>
          <t>AEGIS-based MAC functions <bcp14>MUST NOT</bcp14> be used as hash functions: if the key is known, inputs causing state collisions can easily be crafted.</t>
        </li>
        <li>
          <t>Unlike hash-based MACs, tags <bcp14>MUST NOT</bcp14> be used for key derivation as there is no guarantee that they are uniformly random.</t>
        </li>
      </ul>
      <t>Inputs:</t>
      <ul spacing="normal">
        <li>
          <t><tt>data</tt>: the input data to authenticate (length <bcp14>MUST</bcp14> be less than or equal to <tt>A_MAX</tt>).</t>
        </li>
        <li>
          <t><tt>key</tt>: the secret key.</t>
        </li>
        <li>
          <t><tt>nonce</tt>: the public nonce.</t>
        </li>
      </ul>
      <t>Outputs:</t>
      <ul spacing="normal">
        <li>
          <t><tt>tag</tt>: the authentication tag.</t>
        </li>
      </ul>
      <section anchor="aegismac-128l">
        <name>AEGISMAC-128L</name>
        <t>AEGISMAC-128L refers to the <tt>Mac</tt> function based on the building blocks of AEGIS-128L.</t>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)
data_blocks = Split(ZeroPad(data, 256), 256)
for di in data_blocks:
    Absorb(di)
tag = Finalize(|data|, tag_len_bits)
return tag
]]></artwork>
      </section>
      <section anchor="aegismac-256">
        <name>AEGISMAC-256</name>
        <t>AEGISMAC-256 refers to the <tt>Mac</tt> function based on the building blocks of AEGIS-256.</t>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)
data_blocks = Split(ZeroPad(data, 128), 128)
for di in data_blocks:
    Absorb(di)
tag = Finalize(|data|, tag_len_bits)
return tag
]]></artwork>
      </section>
      <section anchor="aegismac-128x">
        <name>AEGISMAC-128X</name>
        <t>AEGISMAC-128X is based on the building blocks of AEGIS-128X but replaces the <tt>Finalize</tt> function with a dedicated <tt>FinalizeMac</tt> function.</t>
        <section anchor="the-mac-function">
          <name>The Mac Function</name>
          <t>Steps:</t>
          <artwork><![CDATA[
Init(key, nonce)
data_blocks = Split(ZeroPad(data, R), R)
for di in data_blocks:
    Absorb(di)
tag = FinalizeMac(|data|)
return tag
]]></artwork>
        </section>
        <section anchor="the-finalizemac-function">
          <name>The FinalizeMac Function</name>
          <artwork><![CDATA[
FinalizeMac(data_len_bits)
]]></artwork>
          <t>The <tt>FinalizeMac</tt> function computes a 128- or 256-bit tag that authenticates the input data.</t>
          <t>It finalizes all the instances, absorbs the resulting tags into the first state, and computes the final tag using that single state, as done in AEGIS-128L.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
t = {}
u = LE64(data_len_bits) || LE64(tag_len_bits)
for i in 0..D:
    t = t || (V[2,i] ^ u)

Repeat(7, Update(t, t))

tags = {}
if tag_len_bits == 128:
    for i in 0..D: # tag from state 0 is included
        ti = V[0,i] ^ V[1,i] ^ V[2,i] ^ V[3,i] ^ V[4,i] ^ V[5,i] ^ V[6,i]
        tags = tags || ti

else:              # 256 bits
    for i in 1..D: # tag from state 0 is skipped
        ti0 = V[0,i] ^ V[1,i] ^ V[2,i] ^ V[3,i]
        ti1 = V[4,i] ^ V[5,i] ^ V[6,i] ^ V[7,i]
        tags = tags || (ti0 || ti1)

if D > 1:
    # Absorb tags into state 0; other states are not used anymore
    for v in Split(tags, 256):
        x0, x1 = Split(v, 128)
        Absorb(ZeroPad(x0, R / 2) || ZeroPad(x1, R / 2))

    u = LE64(D) || LE64(tag_len_bits)
    t = ZeroPad(V[2,0] ^ u, R)
    Repeat(7, Update(t, t))

if tag_len_bits == 128:
    tag = V[0,0] ^ V[1,0] ^ V[2,0] ^ V[3,0] ^ V[4,0] ^ V[5,0] ^ V[6,0]
else:            # 256 bits
    t0 = V[0,0] ^ V[1,0] ^ V[2,0] ^ V[3,0]
    t1 = V[4,0] ^ V[5,0] ^ V[6,0] ^ V[7,0]
    tag = t0 || t1

return tag
]]></artwork>
        </section>
      </section>
      <section anchor="aegismac-256x">
        <name>AEGISMAC-256X</name>
        <t>AEGISMAC-256X is based on the building blocks of AEGIS-256X but replaces the <tt>Finalize</tt> function with a dedicated <tt>FinalizeMac</tt> function.</t>
        <section anchor="the-mac-function-1">
          <name>The Mac Function</name>
          <t>Steps:</t>
          <artwork><![CDATA[
Init(key, nonce)
data_blocks = Split(ZeroPad(data, R), R)
for di in data_blocks:
    Absorb(di)
tag = FinalizeMac(|data|)
return tag
]]></artwork>
        </section>
        <section anchor="the-finalizemac-function-1">
          <name>The FinalizeMac Function</name>
          <artwork><![CDATA[
FinalizeMac(data_len_bits)
]]></artwork>
          <t>The <tt>FinalizeMac</tt> function computes a 128- or 256-bit tag that authenticates the input data.</t>
          <t>It finalizes all the instances, absorbs the resulting tags into the first state, and computes the final tag using that single state, as done in AEGIS-256.</t>
          <artwork><![CDATA[
t = {}
u = LE64(data_len_bits) || LE64(tag_len_bits)
for i in 0..D:
    t = t || (V[3,i] ^ u)

Repeat(7, Update(t))

tags = {}
if tag_len_bits == 128:
    for i in 1..D: # tag from state 0 is skipped
        ti = V[0,i] ^ V[1,i] ^ V[2,i] ^ V[3,i] ^ V[4,i] ^ V[5,i]
        tags = tags || ti

else:              # 256 bits
    for i in 1..D: # tag from state 0 is skipped
        ti0 = V[0,i] ^ V[1,i] ^ V[2,i]
        ti1 = V[3,i] ^ V[4,i] ^ V[5,i]
        tags = tags || (ti0 || ti1)

if D > 1:
    # Absorb tags into state 0; other states are not used anymore
    for v in Split(tags, 128):
        Absorb(ZeroPad(v, R))

    u = LE64(D) || LE64(tag_len_bits)
    t = ZeroPad(V[3,0] ^ u, R)
    Repeat(7, Update(t))

if tag_len_bits == 128:
    tag = V[0,0] ^ V[1,0] ^ V[2,0] ^ V[3,0] ^ V[4,0] ^ V[5,0]
else:            # 256 bits
    t0 = V[0,0] ^ V[1,0] ^ V[2,0]
    t1 = V[3,0] ^ V[4,0] ^ V[5,0]
    tag = t0 || t1

return tag
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t><em>This note is to be removed before publishing as an RFC.</em></t>
      <t>Multiple implementations of the schemes described in this document have been developed and verified for interoperability.</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, even with different <tt>tag</tt> lengths. 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="committing-security">
          <name>Committing Security</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. This mitigates 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>AEGIS 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 collision and preimage resistance. An instance of such a function is SHA-256 <xref target="RFC6234"/>.</t>
          <t>Alternatively, the associated data can be fed into a collision-resistant KDF, such as HKDF <xref target="RFC5869"/>, via the <tt>info</tt> input to derive the <tt>key</tt> parameter. The <tt>ad</tt> parameter can then be left empty. Note that the <tt>salt</tt> input <bcp14>MUST NOT</bcp14> be used since large salts get hashed, which affects commitment. Furthermore, this requires values concatenated to form the <tt>info</tt> input to be unambiguously encoded, like by appending their lengths.</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 at the time of writing. 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 do not provide any advantage over single-target attacks.</t>
        </section>
      </section>
      <section anchor="implementation-security">
        <name>Implementation Security</name>
        <t>If tag verification fails, the unverified plaintext and computed authentication tag <bcp14>MUST NOT</bcp14> be released. As shown in <xref target="VV18"/>, even a partial leak of the plaintext without verification facilitates 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 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 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 offer at least 128-bit security against forgery attacks.</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.
However, <tt>(key, nonce)</tt> pairs <bcp14>MUST NOT</bcp14> be reused, even if the associated data differs.</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.</t>
        <t>This resilience extends to quantum adversaries operating within the Q1 model, where the attacker has access to a quantum computer but is restricted to classical (non-quantum) communications with the systems under attack. In this model, quantum attacks offer no practical advantage in decrypting previously recorded ciphertexts or in recovering the encryption key.</t>
        <t>This document extends the original specification by introducing optional support for 256-bit authentication tags, which are constructed similarly to the 128-bit tags.
As shown in <xref target="SSI24"/>, with 256-bit tags, all AEGIS variants achieve more than 128-bit security against forgery by differential attacks.</t>
        <t>Security analyses of AEGIS can be found in <xref target="AEGIS"/>, <xref target="M14"/>, <xref target="FLLW17"/>, <xref target="ENP20"/>, <xref target="LIMS21"/>, <xref target="JLD22"/>, <xref target="STSI23"/>, <xref target="IR23"/>, <xref target="BS23"/>, <xref target="AIKRS24"/>, and <xref target="SSI24"/>.</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>
          <tr>
            <td align="left">
              <tt>AEAD_AEGIS128X2</tt></td>
            <td align="left">
              <tt>34</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>AEAD_AEGIS128X4</tt></td>
            <td align="left">
              <tt>35</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>AEAD_AEGIS256X2</tt></td>
            <td align="left">
              <tt>36</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>AEAD_AEGIS256X4</tt></td>
            <td align="left">
              <tt>37</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>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="FIPS-AES" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197.pdf">
          <front>
            <title>Advanced encryption standard (AES)</title>
            <author>
              <organization 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>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </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="AIKRS24">
          <front>
            <title>Differential fault attack on AES-based encryption schemes: application to B5G/6G ciphers—Rocca, Rocca-S and AEGIS</title>
            <author initials="R." surname="Anand" fullname="Ravi Anand">
              <organization>Indraprastha Institute of Information Technology Delhi; University of Hyogo</organization>
            </author>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="A. K." surname="Kundu" fullname="Anup Kumar Kundu">
              <organization>Indian Statistical Institute Kolkata</organization>
            </author>
            <author initials="M." surname="Rahman" fullname="Mostafizar Rahman">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="S." surname="Suryawanshi" fullname="Sahiba Suryawanshi">
              <organization>University of Hyogo; Indian Institute of Technology Bhilai</organization>
            </author>
            <date year="2024"/>
          </front>
          <seriesInfo name="DOI" value="10.1007/s13389-024-00360-6"/>
          <refcontent>Journal of Cryptographic Engineering, 2024</refcontent>
        </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="ENP20">
          <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="JLD22">
          <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="2022"/>
          </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="SSI24">
          <front>
            <title>Bit-Wise Analysis for Forgery Attacks on AES-Based AEAD Schemes</title>
            <author initials="T." surname="Shiraya" fullname="Takuro Shiraya">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="K." surname="Sakamoto" fullname="Kosei Sakamoto">
              <organization>Mitsubishi Electric Corporation</organization>
            </author>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo</organization>
            </author>
            <date year="2024"/>
          </front>
          <seriesInfo name="DOI" value="10.1007/978-981-97-7737-2_1"/>
          <refcontent>Advances in Information and Computer Security. IWSEC 2024. Lecture Notes in Computer Science, vol 14977</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="TEST-VECTORS" target="https://github.com/cfrg/draft-irtf-cfrg-aegis-aead/tree/8e289c40/test-vectors">
          <front>
            <title>AEGIS Test Vectors</title>
            <author>
              <organization/>
            </author>
            <date year="2025"/>
          </front>
          <refcontent>commit 8e289c40</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 1925?>

<section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>The following test vectors are also available in JSON format at <xref target="TEST-VECTORS"/>. In this format, byte strings are represented as JSON strings containing their hexadecimal encoding.</t>
      <section anchor="aesround-test-vector">
        <name>AESRound Test Vector</name>
        <sourcecode type="test-vectors"><![CDATA[
in   : 000102030405060708090a0b0c0d0e0f

rk   : 101112131415161718191a1b1c1d1e1f

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

M0   : 033e6975b94816879e42917650955aa0
M1   : fcc1968a46b7e97861bd6e89af6aa55f

After Update:

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

nonce : 10000200000000000000000000000000

ad    :

msg   : 00000000000000000000000000000000

ct    : c1c0e58bd913006feba00f4b3cc3594e

tag128: abe0ece80c24868a226a35d16bdae37a

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

nonce : 10000200000000000000000000000000

ad    :

msg   :

ct    :

tag128: c2b879a67def9d74e6c14f708bbcc9b4

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

ct    : 79d94593d8c2119d7e8fd9b8fc77845c
        5c077a05b2528b6ac54b563aed8efe84

tag128: cc6f3372f6aa1bb82388d695c3962d9a

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f
        20212223242526272829

msg   : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f
        3031323334353637

ct    : b31052ad1cca4e291abcf2df3502e6bd
        b1bfd6db36798be3607b1f94d34478aa
        7ede7f7a990fec10

tag128: 7542a745733014f9474417b337399507

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

nonce : 10010000000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc78

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050608

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 6c04b3dba849b2701effbe32c7f0fab8

tag256: 86f1b80bfb463aba711d15405d094baf
        4a55a15dbfec81a76f35ed0b9c8b04ad
]]></sourcecode>
        </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>
          <sourcecode type="test-vectors"><![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
]]></sourcecode>
        </section>
        <section anchor="test-vector-1-1">
          <name>Test Vector 1</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 10010000000000000000000000000000
        00000000000000000000000000000000

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    :

msg   : 00000000000000000000000000000000

ct    : 754fc3d8c973246dcc6d741412a4b236

tag128: 3fe91994768b332ed7f570a19ec5896e

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    :

msg   :

ct    :

tag128: e3def978a0f054afd1e761d7553afba3

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

ct    : f373079ed84b2709faee373584585d60
        accd191db310ef5d8b11833df9dec711

tag128: 8d86f91ee606e9ff26a01b64ccbdd91d

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f
        20212223242526272829

msg   : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f
        3031323334353637

ct    : 57754a7d09963e7c787583a2e7b859bb
        24fa1e04d49fd550b2511a358e3bca25
        2a9b1b8b30cc4a67

tag128: ab8a7d53fd0e98d727accca94925e128

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

nonce : 10010000000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358459

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050608

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215653

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

nonce : 101112131415161718191a1b1c1d1e1f

ctx[0]: 00010000000000000000000000000000
ctx[1]: 01010000000000000000000000000000
]]></sourcecode>
          <t>After initialization:</t>
          <sourcecode type="test-vectors"><![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
]]></sourcecode>
        </section>
        <section anchor="test-vector-1-2">
          <name>Test Vector 1</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f

nonce : 101112131415161718191a1b1c1d1e1f

ad    :

msg   :

ct    :

tag128: 63117dc57756e402819a82e13eca8379

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

nonce : 101112131415161718191a1b1c1d1e1f

ad    : 0102030401020304

msg   : 04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        0405060704050607

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

tag128: 1aebc200804f405cab637f2adebb6d77

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

nonce : 101112131415161718191a1b1c1d1e1f

ctx[0]: 00030000000000000000000000000000
ctx[1]: 01030000000000000000000000000000
ctx[2]: 02030000000000000000000000000000
ctx[3]: 03030000000000000000000000000000
]]></sourcecode>
          <t>After initialization:</t>
          <sourcecode type="test-vectors"><![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
]]></sourcecode>
        </section>
        <section anchor="test-vector-1-3">
          <name>Test Vector 1</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f

nonce : 101112131415161718191a1b1c1d1e1f

ad    :

msg   :

ct    :

tag128: 5bef762d0947c00455b97bb3af30dfa3

tag256: a4b25437f4be93cfa856a2f27e4416b4
        2cac79fd4698f2cdbe6af25673e10a68
]]></sourcecode>
        </section>
        <section anchor="test-vector-2-3">
          <name>Test Vector 2</name>
          <sourcecode type="test-vectors"><![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
]]></sourcecode>
        </section>
      </section>
      <section anchor="aegis-256x2-test-vectors">
        <name>AEGIS-256X2 Test Vectors</name>
        <section anchor="initial-state-2">
          <name>Initial State</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ctx[0]: 00010000000000000000000000000000
ctx[1]: 01010000000000000000000000000000
]]></sourcecode>
          <t>After initialization:</t>
          <sourcecode type="test-vectors"><![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
]]></sourcecode>
        </section>
        <section anchor="test-vector-1-4">
          <name>Test Vector 1</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ad    :

msg   :

ct    :

tag128: 62cdbab084c83dacdb945bb446f049c8

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

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ad    : 0102030401020304

msg   : 04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        0405060704050607

ct    : 72120c2ea8236180d67859001f472907
        7b7064c414384fe3a7b52f1571f4f8a7
        d0f01e18db4f3bc0adb150702e5d147a
        8d36522132761b994c1bd395589e2ccf
        0790dfe2a3d12d61cd666b2859827739
        db4037dd3124c78424459376f6cac08e
        1a7223a2a43e398ce6385cd654a19f48
        1cba3b8f25910b42

tag128: 635d391828520bf1512763f0c8f5cdbd

tag256: b5668d3317159e9cc5d46e4803c3a76a
        d63bb42b3f47956d94f30db8cb366ad7
]]></sourcecode>
        </section>
      </section>
      <section anchor="aegis-256x4-test-vectors">
        <name>AEGIS-256X4 Test Vectors</name>
        <section anchor="initial-state-3">
          <name>Initial State</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ctx[0]: 00030000000000000000000000000000
ctx[1]: 01030000000000000000000000000000
ctx[2]: 02030000000000000000000000000000
ctx[3]: 03030000000000000000000000000000
]]></sourcecode>
          <t>After initialization:</t>
          <sourcecode type="test-vectors"><![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
]]></sourcecode>
        </section>
        <section anchor="test-vector-1-5">
          <name>Test Vector 1</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ad    :

msg   :

ct    :

tag128: 3b7fee6cee7bf17888ad11ed2397beb4

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

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ad    : 0102030401020304

msg   : 04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        0405060704050607

ct    : bfc2085b7e8017da99b0b6d646ae4d01
        f4ba8f2e7dfca1d759ae48a135139b9a
        aac6b4f5db810d426be1fdaff4e14541
        53a34b11da78ed7e418ee2ee9853042e
        95536aecbb694cea1b16a478eb0d4d1b
        f6509b1ce652a45af58e0e46ffccfa2d
        0426e702391d2ff5813808b81748a490
        dd656465fed61f09

tag128: b63b611b13975e2f3dc3cb6c2397bfcd

tag256: 7847eace74409ee56c8f4cf63a9c2841
        ce7c8bd567d7c0ca514c879a190b978c
]]></sourcecode>
        </section>
      </section>
      <section anchor="aegismac-test-vectors">
        <name>AEGISMAC Test Vectors</name>
        <section anchor="aegismac-128l-test-vector">
          <name>AEGISMAC-128L Test Vector</name>
          <sourcecode type="test-vectors"><![CDATA[
key    : 10010000000000000000000000000000

nonce  : 10000200000000000000000000000000

data   : 000102030405060708090a0b0c0d0e0f
         101112131415161718191a1b1c1d1e1f
         202122

tag128 : d3f09b2842ad301687d6902c921d7818

tag256 : 9490e7c89d420c9f37417fa625eb38e8
         cad53c5cbec55285e8499ea48377f2a3
]]></sourcecode>
        </section>
        <section anchor="aegismac-128x2-test-vector">
          <name>AEGISMAC-128X2 Test Vector</name>
          <sourcecode type="test-vectors"><![CDATA[
key    : 10010000000000000000000000000000

nonce  : 10000200000000000000000000000000

data   : 000102030405060708090a0b0c0d0e0f
         101112131415161718191a1b1c1d1e1f
         202122

tags128: 9f5f69928fa481fa86e8a51e072a9b29
         eeaa77a356f796b427f6a54f52ae0e20

tag128 : 6873ee34e6b5c59143b6d35c5e4f2c6e

tags256: 22cdcf558d0338b6ad8fbba4da7307d3
         0bd685fff23dc9d41f598c2a7ea44055

tag256 : afcba3fc2d63c8d6c7f2d63f3ec8fbbb
         af022e15ac120e78ffa7755abccd959c
]]></sourcecode>
        </section>
        <section anchor="aegismac-128x4-test-vector">
          <name>AEGISMAC-128X4 Test Vector</name>
          <sourcecode type="test-vectors"><![CDATA[
key    : 10010000000000000000000000000000

nonce  : 10000200000000000000000000000000

data   : 000102030405060708090a0b0c0d0e0f
         101112131415161718191a1b1c1d1e1f
         202122

tags128: 7fecd913a7cb0011b6c4c88e0c6f8578
         19a98fbeaf21d1092c32953fff82c8a9
         c7b5e6625a5765d04af26cf22adc1282
         4c8cf3b4dbb85f379e13b04a8d06bca7

tag128 : c45a98fd9ab8956ce616eb008cfe4e53

tags256: d595732bdf230a1441978414cd8cfa39
         ecef6ad0ee1e65ae530006ca5d5f4481
         f9ec5edfa64e9c3d76d3a5eda9fe5bd1
         fb9d842373f7c90bedb8bfe383740b23
         1264a15143eb8c3d9f17754099f147e3
         401c83c0d5afc70fd0d68bfd17f9280f

tag256 : 26fdc76f41b1da7aec7779f6e964beae
         8904e662f05aca8345ae3befb357412a
]]></sourcecode>
        </section>
        <section anchor="aegismac-256-test-vector">
          <name>AEGISMAC-256 Test Vector</name>
          <sourcecode type="test-vectors"><![CDATA[
key    : 10010000000000000000000000000000
         00000000000000000000000000000000

nonce  : 10000200000000000000000000000000
         00000000000000000000000000000000

data   : 000102030405060708090a0b0c0d0e0f
         101112131415161718191a1b1c1d1e1f
         202122

tag128 : c08e20cfc56f27195a46c9cef5c162d4

tag256 : a5c906ede3d69545c11e20afa360b221
         f936e946ed2dba3d7c75ad6dc2784126
]]></sourcecode>
        </section>
        <section anchor="aegismac-256x2-test-vector">
          <name>AEGISMAC-256X2 Test Vector</name>
          <sourcecode type="test-vectors"><![CDATA[
key    : 10010000000000000000000000000000
         00000000000000000000000000000000

nonce  : 10000200000000000000000000000000
         00000000000000000000000000000000

data   : 000102030405060708090a0b0c0d0e0f
         101112131415161718191a1b1c1d1e1f
         202122

tags128: db8852ea2c03f22b0d0694ea4e88e4b1

tag128 : fb319cb6dd728a764606fb14d37f2a5e

tags256: b4d124976b34b2aa8bc3fa0b55396cf7
         fb83f4ef5ba607681cddf5ba3e925727

tag256 : 0844b20ed5147ceae89c7a160263afd4
         b1382d6b154ecf560ce8a342cb6a8fd1
]]></sourcecode>
        </section>
        <section anchor="aegismac-256x4-test-vector">
          <name>AEGISMAC-256X4 Test Vector</name>
          <sourcecode type="test-vectors"><![CDATA[
key    : 10010000000000000000000000000000
         00000000000000000000000000000000

nonce  : 10000200000000000000000000000000
         00000000000000000000000000000000

data   : 000102030405060708090a0b0c0d0e0f
         101112131415161718191a1b1c1d1e1f
         202122

tags128: 702d595e74962d073a0d68c883d80deb
         41ab207e43b16659d556d7467218a9ec
         113406e7cb56e0f6b63c95c88421dfee

tag128 : a51f9bc5beae60cce77f0dbc60761edd

tags256: a46ebcd10939b42012a3f9b6147172af
         3b74aec5d0070e8d6a81498ccbcdb41a
         d57cd7a50fa8621dfea2e81cd941def5
         57094251a24527a4d97fc4c825368180
         3973129d07cc20811a8b3c34574f6ce0
         10165dd0e856e797f70731e78e32f764

tag256 : b36a16ef07c36d75a91f437502f24f54
         5b8dfa88648ed116943c29fead3bf10c
]]></sourcecode>
        </section>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The AEGIS family of authenticated encryption algorithms was invented by Hongjun Wu and Bart Preneel.</t>
      <t>The state update function leverages the AES permutation invented by Joan Daemen and Vincent Rijmen. They also authored the Pelican MAC, which 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, Daniel Bleichenbacher, and Conrad Ludgate for catching invalid test vectors, and Daniel Bleichenbacher for many helpful suggestions.</t>
        </li>
        <li>
          <t>Soatok Dreamseeker for his early review of the draft and for suggesting the addition of negative test vectors.</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 committing security of the schemes specified in this document.</t>
        </li>
        <li>
          <t>Scott Fluhrer for his review of the draft as a member of the CFRG Crypto Review Panel.</t>
        </li>
        <li>
          <t>Yawning Angel, Chris Barber, and Neil Madden for their review of the draft.</t>
        </li>
        <li>
          <t>Gilles Van Assche for reviewing the draft and providing insightful comments on the implications of nonce reuse in AEGIS-128X and AEGIS-256X.</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
73Sh59pp2v5kNFsuh/bvYc6Gq0BHTskT0n3P20ZGLV27ceT9riBV/lHjscSA
E9pwpj/df1ZSSoKL1dmGotQ7U/SawQLh1QeS7ljEAW+s8c8NV3F28ZFbxBsx
xPrtdnm0M/f9jx4EXGH4VzXb9HCDfQe8GbW/xBvc+lUPZfu26edfUOvk+qWl
Orysr6tavPEwmPnrkPt1zWgGX7GM1OKK8fEvWfuVH2TN0oMPd6x8/W4QXbmh
J73lRHNk5uZONNH1Bj505xZve9An24HsnW6zv1roHXjN3WLAptPc+8dv6h63
TmLrHn/g3vGNveIPwo/9OX3TfqHoA3FNf1KK2pX+rM9cG/mybQbb2KEVw8kb
OLjxoKbuYTKoiTLcXoTsjgnvl+6xmxrO/dP56PmO/tLn3IZ3SV0zvjr+h54K
X3belp778sOcuaBvz//CBdoUunfn6cZv6+gmbYHkUkeXCHKlPXpHzYifpxme
sJ9lPHPx88QF2CK+cVigNXPXJke+a+efu/uGvv8lnf3ucoeFXA8PNDtgtAl6
dvgtb5AK+a7dcKbLG3rhPx9dbp70+LM4wy2xfrIv/PNRbjOf8ehtshnHXumH
4pAO855+tf5odJU/+uE4o78eH/QS1/OKYd3I43w0uvePsqma2rQZY1fl9bX3
InVpVSd+CZWuLHF3r0FZXJbYN07n89k9Pn3xok0pW/uEMndpnIPdJIWc7sNn
7dd64+JCzukd5zt9ddKlqI2TztwJ21vZc8Etd6nIfRBPwuGlnX9ccisnblgy
PqGLdQe3Ul7ZNB1EcZOGqdz1zX7tPJ1hWh0TYy+YLhbnDe8GDU6I5U66ff7l
gq47a+zaLChfadDPqdIuQ2p3piJ45otWi7j0uxHDdJGIcc5f45fM+7xXVmy0
sZJubqLL07hDg3suaTeuv0eLkzl9VqFjuGYjkW/r/kpqjlKx1kt16rjIXyzr
lvnlSXBrfFPo1nTcdt5ivFVya0JuO1dxoJn7C4upNU29pJtUOraUdNNK/2fc
/0mcI7urV7pHcXs2SX+bgLvBrlnPZmrJNuRs8SqY0RkDLt6ytF0KDmezdvNx
i9IPb+/5vHS+rc1fE0f0A3s535ZE7XZ3K1zQHtqxkfDqJFIReSgreD3tbvBl
ZUc5z3TLwWBiMZAf+rNboKd+CI547623NmAv981R28QxNfFDcMzd4j/asqhp
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
dOnuBqOgUrN6yvcSjK8+G5z5rvoTql/x7WQv3eHM5UXw2WJ++tf1PPh6zQeJ
f6KWq+DZ0s6tnbYX1vDJ/f7g6u6mL7pXYMk3IrpzsI+HNzWOWvjDQs2D+4qu
NeAmvqJbsear4Kj+Kx7xjSUX/hhq9H+x9CeTP7PTmk5WhxppD4+nSw4w0tli
Vb90N1+hnLF0nHl7I4kjCb6h2xOtvxGTr7rik7TV/MXmsedzU7+szRodcHfC
8KHUfOOdv9GSLuHeDx4sax08xoCXp6DOHgY0r+00+GRq0TM7LxV+Lt1h7PcW
86UyweO1OWWSLeg2sZU+c829VNPajM7hdl/trJA/ntEtHWd2ek4XVTTr01N3
90xzgG4dL9Rq8SK4v7Rq1lj7wn9CmxotH6tPtwXYVy15+HJWbo5KtXX5SwLa
i0Co8Nye8l1to45Sg39YnM2JQdb/8X8FT9Rq1TS0PdI3ecPGzhav/EQ1ZzxB
g4tU3d1e7uIX1HP/+eNjruLfvnx0j9pnBn1i5/MaU8nUPsM4FysQ+rGt7Mul
u3/7lZ1O6d/n6oWag/eDR82CLhrFB08W4Oiq/k4tgyN1BuLu+UtzX1L3TlVH
j+GVgINLm4Y39fo7EnbeQYvJ0ehX8HC6PlsO5mUnkej2rZklKW9f3Ht49Glw
jy8PDI7cJ8/UnKRyP/ijesUnqB/OT+k2iXtnS9QLypQtCz619RTTY4ydD7h6
R8tU26f1dIqxfAVhO2xoZPyJK9zSop9Ld+mX4+WGbgoiriRS8a0l/loiunqo
uxqD2InNMd8K09+KvuOmlIPJ/w8QQx4sBi8BAA==

-->

</rfc>
