<?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-18" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.2 -->
  <front>
    <title>The AEGIS Family of Authenticated Encryption Algorithms</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-aegis-aead-18"/>
    <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="October" day="05"/>
    <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 301?>

<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>MixColumns</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>M</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 that 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/d3ef9984/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 1924?>

<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>
        <li>
          <t>Jane Coffin for taking the time to review the draft on behalf of the IRSG.</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
N5mNN9028k6Xeq6dpu1PRrPlcmj/HuZsuA505JQ8Qd33vG1k1NK1G0fe7xpS
5R81HksMOKENaPrj/WclJSW4aJ1tKE69M0WvGSwRXn0i6Y5lHPDGGv/ccB1n
Fx+5ZbwRQ6zfbpdHO3Pf/+hBwBWGf1WzTQ832HfAm1H7S7zBrV/1ULZvm37+
BbVOrl9cqsPL+rqqxRsPg5m/Drlf14xm8BXLSC2uGB//krVf+UHWLD34cMfa
1+8G8ZUb+tJbbjTHZm7uRhNdt0tvOdGdX7ztQp9sh7J3+c3t1ULvwGvulgM2
nebeP35T97h1Elv3+AP3jm/sFX8QfuzP6Zv2S0UfiGv6k5LUrvRnfe7ayJdt
c9jGDq0YTt7AwY0HNXUPk0FNlOP2ImR3THi/dI/d1HDun85Hz3f0lz7nNrxL
6prx1fE/9FT4svO29NyXH2bNBX17/hcu0CbRvTtPN35bRzdpCySXOrpEkCvt
0TtqRvw8zfCE/SzjmYufJy7AFvGNwwKtmbs2PfJdO//c3Tf0/S/p7HeXOyzk
enig2QGjTdCzw295g2TId+2GM13e0Av/+ehy87THn8UZbon1k33hn49ymxmN
R2+Tzzj2Sj8Uh3SY+fSr9Uejq/zRD8cZ/fX4oJe4nlcM60Ye56PRxX+UT9XU
ps0Zuyqzr70YqUusOvFrqHRnibt8DcristS+cUKfz+/xCYwXbVLZ2qeUuVvj
HOwmKeSEHz5rv9YbNxdyVu844+mrky5JbZx25k7Y3sqfC265W0Xug3gSDi/t
/OOSW1lxw5LxCV2sO7iW8sqm6SCKmzRM5a5v9mvn6QwT65RbDZ8uFucN7wYN
TojlTrp9/uWC7jtr7NosKGNp0M+p0i5HaneuInjmi1aLuAS8EcN0kYhx1l/j
l8z7zFdWbLSxkq5uotvTuEODiy5pN66/SIvTOX1eoWO4ZiOVz6WhbN5iSW1S
RtZ6qU4dK/nrZd1ivzwJbo3vC92ak9vOZYy3Sm7Nym3nLw7Uc39tMbWmqat0
nUrHm5LuW+n/jPs/iX1kd/9K9yhuDyjprxRw99g169lMLdmQnC1eBTM6aMAF
XZa2y8ThpNZuUm5RFuLtPZ+ezne2+cviiH7gMefgkrzd7u6GC9qTOzbyXp1Y
KiIPJQevp909vqzxKPWZrjoYzC4G8kN/gAuU1Q/BEW/A9SYHPOa+OWqbOKYm
fgiOuVv8R1sWNe33/wXDv+7ir7v72//dHZXqnlGfeoWFMu1/pPrbv7qIlv+v
L+VehzIe1/SNHJQB33R/dTcY7K5JhnG+UVPcl3HtDGq9oqY4LNJBTdTusAyN
6Iajo5N1xjWNRjek0zWjE0m00afh6EZ0umZ0UZih7OiOwKU+q1eWTzbx8sqX
fvKdgZuZ4ARxuQiLzfiSYHe953l9bukGNQJ36iJoVrTRp4T9qerBPR9jfXdA
95/52yQDf90b5MBdF7SREd3dXse31bltjy8XU7olk2+VIu3prOyczmxplaK/
o/iSe26J/L5dd/+Yz4OuFPQTnRBSu7trH23ozCeHf6S3dMQRZa5BZ7abJkaD
dDq+HervyKN1l4y12Yq3g+d05ydhiOEV7FT9C2vPt45z8Rpm1z72eZ/q3x1Y
w0c0uGzboFyszkan4NA5J/NThwXcFq/Vii9ubazTeN3xCvVsZg1t66GtD/0N
jn3HPED2ENx8O8gKHWxacdTgLhyvllbNgntcg7tM2r3trpQeXqDMEIcAgfvK
b9g48FuY+SGdSXBZ2qcrMdxG+fpc0d2pijNNeNvTvNt64s+n4eC7cv2B9dj3
e5XoRk+ubmNnFF7v3NTUlSce6e4vHu6L6vcEdxeTbm0Hdm/cbmA6P2M97y7l
3KMbbclltcyG7elQLhH7wu0GGO2jct3xFQ+HM3R14HdgHORuhKOURrg/fZqj
+3LPQ+g2P7uD9EEY/EiXts5v73EIdDg5gypdLe10uQR2srEv1ZQCzrTvyGeC
8zoHU3qca97tHCMFRX7u5jY0mmEIh1ZL0zp+O/eQPep99SV4nW8DdLLR4ujt
ZPC9LTzFeI2u317tdmhpKxBfEji+dsxnFO9alPKoiPVvd2hIf/7aYENNtV6u
6JAMBhO+Yqd6BsL3xJPrcEyDe9ASl4riwNHo9sdfXVVw68nhPTrhiw+B8iq7
rdMP9okahp5oU5cXSgwp8MF+njyexcZnR9OTc76k9tKdjv0ZMI6f0dAtd1rV
looYnU3TMiD1jg1O3zk2me78KRdhAD3YoxtdKOdvh/Zbr9pVk/YskX1vdtwO
M9Cnv95udJBNq/DOVHM2uAFveFE3OvlivnhF/MeVY5ZcWMNB0u7uZTd9VjX1
lC4cdleXu/O3/f3L1Ejfo2bPxUi2ukM2mRqGGwPZdFuAmBTdXcina7AknDfb
Hbji9tP5o7XoZnM+e2tDddK8jK6ve/eHzjRWQ9u88dFX12w5bZeiQTXGFT4Q
0P45uPh1B7N3mww5DLWup6yafL79aOfBdbn/RK7LUv4dz2+c5m84uDL4bJT6
b+rbWzs4qOwPe6NQ1O1LV+Zp/GhrQA1CWe+AGO6Kv7ekxcY5PD8DLVzS/+hP
vuP9pgzwDYNvH3NoLrMqfajJ+I0yXaERrQ/6gC2eD2K1b0nXwcaSN6UpKWdH
1l2EHAeXx30expdbFX9lWHnMdj9tu3yvpEiRrQbx6d4x6Xbktsth46A0a9ju
rBF3W8LgWteuX+4tgVLqTxu2Rq86CO++abozxS5VG5vB6zGpuvD1mK3fQToV
D5WbviqWPW4o+B2Pl51GZ85Ct7eSXSzzfpKrGhfZblwceEdseyu63XVaXNHp
5kV9fj7qc3iTTm8Esm+WPbVjJLf6yLZbTrgf/EsgHNF/164M9+zoO/57dyNv
myRCRpzcXAdL5hezxdJ2FHhJFHAagepxdqaP2r8O94LXfQbHy0Gcf6AUuiUn
lD4K7gTuHITuqWif+mSdjovvX8a5Lau2VRB5Q2ZWVlP0+i0yAGn6wnb6wnb6
wnb6wpbnwnbKwnbKwj9fv2gS3qQFV7TljV0Ned4IR+scjhmuyKvz9vqbsfl+
A4vlovq/mazfTNYbmSwH7t6Xpbp2ofUNzdSbafy3X3X9IIzTlk16s37/AqaI
TM3dy2zNS5L+tzAo0fUG5b1Zk7czIkPbcUn9NzIZm+vitOy0biaTf+Iwynzh
TvBwB1Uu7WxBsXqfDMpud3PGMT0+0Pvo4b2Df5pMnrTH3WxG1doDZfQZnm4c
Cc+rumah11Q+OFMvKefU0glmL+10ce7XUf0JyC6SweeEc6JHWYNfLigox0ps
ac/oICRUgf7xnn0Os2yvmlKmNio53Tg5puKjkKDv/vTnW2erFezTnTunsHPr
8gDV39HV8vSOoRjMfr1cVfv0976i5RT8VOY2Hy+iz1qs2zi/2XJEejPOOF00
FJGHJudjkbpU3sGCdXsw+xaVOCbYhr621qdhwb7kuN6nazzmVR1n1z738fKn
HCM/tlPrzdqOsGF3Hr9fVfURvf02p4FiVXZF/971Cz6DQzQpANjmIHNFHI1r
a3ORQT5qaSPS5k5gdrGi5iB4qOopHdxPRycv6AT5V7zuOlzQWKIaNR1lA7XV
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

-->

</rfc>
