<?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.23 (Ruby 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-aegis-aead-16" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.26.0 -->
  <front>
    <title>The AEGIS Family of Authenticated Encryption Algorithms</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-aegis-aead-16"/>
    <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="February" day="17"/>
    <workgroup>Crypto Forum</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 295?>

<t>This document describes the AEGIS-128L, AEGIS-256, AEGIS-128X, and AEGIS-256X AES-based authenticated encryption algorithms designed for high-performance applications.</t>
      <t>The document is a product of the Crypto Forum Research Group (CFRG). It is not an IETF product and is not a standard.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/cfrg/draft-irtf-cfrg-aegis-aead"/>.</t>
    </note>
  </front>
  <middle>
    <?line 302?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes the AEGIS family of Authenticated Encryption with Associated Data (AEAD) algorithms <xref target="AEGIS"/>, which were chosen for high-performance applications in the CAESAR (Competition for Authenticated Encryption: Security, Applicability, and Robustness) competition.</t>
      <t>Among the finalists, AEGIS-128 was chosen as the winner for this category. However, AEGIS-128L, another finalist, offers enhanced performance and a stronger security margin <xref target="ENP20"/> <xref target="JLD22"/> <xref target="LIMS21"/> <xref target="STSI23"/>.
Additionally, AEGIS-256, which also reached the final round, provides 256-bit security and supports higher usage limits.</t>
      <t>Therefore, this document specifies the following variants:</t>
      <ul spacing="normal">
        <li>
          <t>AEGIS-128L, which has a 128-bit key, a 128-bit nonce, a 1024-bit state, a 128- or 256-bit authentication tag, and processes 256-bit input blocks.</t>
        </li>
        <li>
          <t>AEGIS-256, which has a 256-bit key, a 256-bit nonce, a 768-bit state, a 128- or 256-bit authentication tag, and processes 128-bit input blocks.</t>
        </li>
        <li>
          <t>AEGIS-128X, which is a mode based on AEGIS-128L, specialized for CPUs with large vector registers and vector AES instructions.</t>
        </li>
        <li>
          <t>AEGIS-256X, which is a mode based on AEGIS-256, specialized for CPUs with large vector registers and vector AES instructions.</t>
        </li>
      </ul>
      <t>All variants are inverse-free and constructed from the AES encryption round function <xref target="FIPS-AES"/>.</t>
      <t>The AEGIS cipher family offers performance that significantly exceeds AES-GCM on CPUs with AES instructions. Similarly, software implementations not using AES instructions can also be faster, although to a lesser extent.</t>
      <t>Unlike with AES-GCM, nonces can be safely chosen at random with no practical limit when using AEGIS-256 and AEGIS-256X. AEGIS-128L and AEGIS-128X also allow for more messages to be safely encrypted when using random nonces.</t>
      <t>With some existing AEAD schemes, such as AES-GCM, an attacker can generate a ciphertext that successfully decrypts under multiple different keys (a partitioning oracle attack) <xref target="LGR21"/>. This ability to craft a (ciphertext, authentication tag) pair that verifies under multiple keys significantly reduces the number of required interactions with the oracle to perform an exhaustive search, making it practical if the key space is small. For example, with password-based encryption, an attacker can guess a large number of passwords at a time by recursively submitting such a ciphertext to an oracle, which speeds up a password search by reducing it to a binary search.</t>
      <t>With AEGIS, finding distinct (key, nonce) pairs that successfully decrypt a given (associated data, ciphertext, authentication tag) tuple is believed to have a complexity that depends on the tag size. A 128-bit tag provides 64-bit committing security, which is generally acceptable for interactive protocols. With a 256-bit tag, finding a collision becomes impractical.</t>
      <t>Unlike most other AES-based AEAD constructions, leaking a state does not leak the key or previous states.</t>
      <t>Finally, an AEGIS key is not required after the initialization function, and there is no key schedule. Thus, ephemeral keys can be erased from memory before any data has been encrypted or decrypted, mitigating cold boot attacks.</t>
      <t>Note that an earlier version of Hongjun Wu and Bart Preneel’s paper introducing AEGIS specified AEGIS-128L and AEGIS-256 with a different <tt>Finalize</tt> function. We follow the specification of <xref target="AEGIS"/>, which can be found in the References section of this document.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words “<bcp14>MUST</bcp14>”, “<bcp14>MUST NOT</bcp14>”, “<bcp14>REQUIRED</bcp14>”, “<bcp14>SHALL</bcp14>”, “<bcp14>SHALL
NOT</bcp14>”, “<bcp14>SHOULD</bcp14>”, “<bcp14>SHOULD NOT</bcp14>”, “<bcp14>RECOMMENDED</bcp14>”, “<bcp14>NOT RECOMMENDED</bcp14>”,
“<bcp14>MAY</bcp14>”, and “<bcp14>OPTIONAL</bcp14>” in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>Throughout this document, “byte” is used interchangeably with “octet” and refers to an 8-bit sequence.</t>
      <t>Primitives:</t>
      <ul spacing="normal">
        <li>
          <t><tt>{}</tt>: an empty bit array.</t>
        </li>
        <li>
          <t><tt>|x|</tt>: the length of <tt>x</tt> in bits.</t>
        </li>
        <li>
          <t><tt>a ^ b</tt>: the bitwise exclusive OR operation between <tt>a</tt> and <tt>b</tt>.</t>
        </li>
        <li>
          <t><tt>a &amp; b</tt>: the bitwise AND operation between <tt>a</tt> and <tt>b</tt>.</t>
        </li>
        <li>
          <t><tt>a || b</tt>: the concatenation of <tt>a</tt> and <tt>b</tt>.</t>
        </li>
        <li>
          <t><tt>a mod b</tt>: the remainder of the Euclidean division between <tt>a</tt> as the dividend and <tt>b</tt> as the divisor.</t>
        </li>
        <li>
          <t><tt>LE64(x)</tt>: returns the little-endian encoding of unsigned 64-bit integer <tt>x</tt>.</t>
        </li>
        <li>
          <t><tt>ZeroPad(x, n)</tt>: returns <tt>x</tt> after appending zeros until its length is a multiple of <tt>n</tt> bits. No padding is added if the length of <tt>x</tt> is already a multiple of <tt>n</tt>, including when <tt>x</tt> is empty.</t>
        </li>
        <li>
          <t><tt>Truncate(x, n)</tt>: returns the first <tt>n</tt> bits of <tt>x</tt>.</t>
        </li>
        <li>
          <t><tt>Split(x, n)</tt>: returns <tt>x</tt> split into <tt>n</tt>-bit blocks, ignoring partial blocks.</t>
        </li>
        <li>
          <t><tt>Tail(x, n)</tt>: returns the last <tt>n</tt> bits of <tt>x</tt>.</t>
        </li>
        <li>
          <t><tt>AESRound(in, rk)</tt>: a single round of the AES encryption round function, which is the composition of the <tt>SubBytes</tt>, <tt>ShiftRows</tt>, <tt>MixColums</tt>, and <tt>AddRoundKey</tt> transformations, as defined in Section 5 of <xref target="FIPS-AES"/>. Here, <tt>in</tt> is the 128-bit AES input state, and <tt>rk</tt> is the 128-bit round key.</t>
        </li>
        <li>
          <t><tt>Repeat(n, F)</tt>: <tt>n</tt> sequential evaluations of the function <tt>F</tt>.</t>
        </li>
        <li>
          <t><tt>CtEq(a, b)</tt>: compares <tt>a</tt> and <tt>b</tt> in constant-time, returning <tt>True</tt> for an exact match and <tt>False</tt> otherwise.</t>
        </li>
      </ul>
      <t>AEGIS internal functions:</t>
      <ul spacing="normal">
        <li>
          <t><tt>Update(M0, M1)</tt> or <tt>Update(M)</tt>: the state update function.</t>
        </li>
        <li>
          <t><tt>Init(key, nonce)</tt>: the initialization function.</t>
        </li>
        <li>
          <t><tt>Absorb(ai)</tt>: the input block absorption function.</t>
        </li>
        <li>
          <t><tt>Enc(xi)</tt>: the input block encryption function.</t>
        </li>
        <li>
          <t><tt>Dec(ci)</tt>: the input block decryption function.</t>
        </li>
        <li>
          <t><tt>DecPartial(cn)</tt>: the input block decryption function for the last ciphertext bits when they do not fill an entire block.</t>
        </li>
        <li>
          <t><tt>Finalize(ad_len_bits, msg_len_bits)</tt>: the authentication tag generation function.</t>
        </li>
      </ul>
      <t>Input blocks are 256 bits for AEGIS-128L and 128 bits for AEGIS-256.</t>
      <t>AES blocks:</t>
      <ul spacing="normal">
        <li>
          <t><tt>Si</tt>: the <tt>i</tt>-th AES block of the current state.</t>
        </li>
        <li>
          <t><tt>S'i</tt>: the <tt>i</tt>-th AES block of the next state.</t>
        </li>
        <li>
          <t><tt>{Si, ...Sj}</tt>: the vector of the <tt>i</tt>-th AES block of the current state to the <tt>j</tt>-th block of the current state.</t>
        </li>
        <li>
          <t><tt>C0</tt>: an AES block built from the following bytes in hexadecimal format: <tt>{ 0x00, 0x01, 0x01, 0x02, 0x03, 0x05, 0x08, 0x0d, 0x15, 0x22, 0x37, 0x59, 0x90, 0xe9, 0x79, 0x62 }</tt>.</t>
        </li>
        <li>
          <t><tt>C1</tt>: an AES block built from the following bytes in hexadecimal format: <tt>{ 0xdb, 0x3d, 0x18, 0x55, 0x6d, 0xc2, 0x2f, 0xf1, 0x20, 0x11, 0x31, 0x42, 0x73, 0xb5, 0x28, 0xdd }</tt>.</t>
        </li>
      </ul>
      <t>AES blocks are always 128 bits in length.</t>
      <t>Input and output values:</t>
      <ul spacing="normal">
        <li>
          <t><tt>key</tt>: the encryption key (128 bits for AEGIS-128L, 256 bits for AEGIS-256).</t>
        </li>
        <li>
          <t><tt>nonce</tt>: the public nonce (128 bits for AEGIS-128L, 256 bits for AEGIS-256).</t>
        </li>
        <li>
          <t><tt>ad</tt>: the associated data.</t>
        </li>
        <li>
          <t><tt>msg</tt>: the plaintext.</t>
        </li>
        <li>
          <t><tt>ct</tt>: the ciphertext.</t>
        </li>
        <li>
          <t><tt>tag</tt>: the authentication tag (128 or 256 bits).</t>
        </li>
      </ul>
    </section>
    <section anchor="the-aegis-128l-algorithm">
      <name>The AEGIS-128L Algorithm</name>
      <t>AEGIS-128L has a 1024-bit state, made of eight 128-bit blocks <tt>{S0, ...S7}</tt>.</t>
      <t>The parameters for this algorithm, whose meaning is defined in <xref section="4" sectionFormat="comma" target="RFC5116"/>, are:</t>
      <ul spacing="normal">
        <li>
          <t><tt>K_LEN</tt> (key length) is 16 bytes (128 bits).</t>
        </li>
        <li>
          <t><tt>P_MAX</tt> (maximum length of the plaintext) is 2<sup>61</sup> - 1 bytes (2<sup>64</sup> - 8 bits).</t>
        </li>
        <li>
          <t><tt>A_MAX</tt> (maximum length of the associated data) is 2<sup>61</sup> - 1 bytes (2<sup>64</sup> - 8 bits).</t>
        </li>
        <li>
          <t><tt>N_MIN</tt> (minimum nonce length) = <tt>N_MAX</tt> (maximum nonce length) = 16 bytes (128 bits).</t>
        </li>
        <li>
          <t><tt>C_MAX</tt> (maximum ciphertext length) = <tt>P_MAX</tt> + tag length = (2<sup>61</sup> - 1) + 16 or 32 bytes (in bits: (2<sup>64</sup> - 8) + 128 or 256 bits).</t>
        </li>
      </ul>
      <t>Distinct associated data inputs, as described in <xref section="3" sectionFormat="comma" target="RFC5116"/>, <bcp14>MUST</bcp14> be unambiguously encoded as a single input.
It is up to the application to create a structure in the associated data input if needed.</t>
      <section anchor="authenticated-encryption">
        <name>Authenticated Encryption</name>
        <artwork><![CDATA[
Encrypt(msg, ad, key, nonce)
]]></artwork>
        <t>The <tt>Encrypt</tt> function encrypts a message and returns the ciphertext along with an authentication tag that verifies the authenticity of the message and associated data, if provided.</t>
        <t>Security:</t>
        <ul spacing="normal">
          <li>
            <t>For a given key, the nonce <bcp14>MUST NOT</bcp14> be reused under any circumstances; doing so allows an attacker to recover the internal state.</t>
          </li>
          <li>
            <t>The key <bcp14>MUST</bcp14> be randomly chosen from a uniform distribution.</t>
          </li>
        </ul>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>msg</tt>: the message to be encrypted (length <bcp14>MUST</bcp14> be less than or equal to <tt>P_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than or equal to <tt>A_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ct</tt>: the ciphertext.</t>
          </li>
          <li>
            <t><tt>tag</tt>: the authentication tag.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

ct = {}

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

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

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

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

msg = {}

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

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

for ci in ct_blocks:
    msg = msg || Dec(ci)

if cn is not empty:
    msg = msg || DecPartial(cn)

expected_tag = Finalize(|ad|, |msg|)

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

S0  = S'0
S1  = S'1
S2  = S'2
S3  = S'3
S4  = S'4
S5  = S'5
S6  = S'6
S7  = S'7
]]></artwork>
      </section>
      <section anchor="the-init-function">
        <name>The Init Function</name>
        <artwork><![CDATA[
Init(key, nonce)
]]></artwork>
        <t>The <tt>Init</tt> function constructs the initial state <tt>{S0, ...S7}</tt> using the given <tt>key</tt> and <tt>nonce</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Defines:</t>
        <ul spacing="normal">
          <li>
            <t><tt>{S0, ...S7}</tt>: the initial state.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
S0 = key ^ nonce
S1 = C1
S2 = C0
S3 = C1
S4 = key ^ nonce
S5 = key ^ C0
S6 = key ^ C1
S7 = key ^ C0

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

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

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

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

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

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

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

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

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

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

return xn
]]></artwork>
      </section>
      <section anchor="the-finalize-function">
        <name>The Finalize Function</name>
        <artwork><![CDATA[
Finalize(ad_len_bits, msg_len_bits)
]]></artwork>
        <t>The <tt>Finalize</tt> function computes a 128- or 256-bit tag that authenticates the message and associated data.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ad_len_bits</tt>: the length of the associated data in bits.</t>
          </li>
          <li>
            <t><tt>msg_len_bits</tt>: the length of the message in bits.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>tag</tt>: the authentication tag.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
t = S2 ^ (LE64(ad_len_bits) || LE64(msg_len_bits))

Repeat(7, Update(t, t))

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

return tag
]]></artwork>
      </section>
    </section>
    <section anchor="the-aegis-256-algorithm">
      <name>The AEGIS-256 Algorithm</name>
      <t>AEGIS-256 has a 768-bit state, made of six 128-bit blocks <tt>{S0, ...S5}</tt>.</t>
      <t>The parameters for this algorithm, whose meaning is defined in <xref section="4" sectionFormat="comma" target="RFC5116"/>, are:</t>
      <ul spacing="normal">
        <li>
          <t><tt>K_LEN</tt> (key length) is 32 bytes (256 bits).</t>
        </li>
        <li>
          <t><tt>P_MAX</tt> (maximum length of the plaintext) is 2<sup>61</sup> - 1 bytes (2<sup>64</sup> - 8 bits).</t>
        </li>
        <li>
          <t><tt>A_MAX</tt> (maximum length of the associated data) is 2<sup>61</sup> - 1 bytes (2<sup>64</sup> - 8 bits).</t>
        </li>
        <li>
          <t><tt>N_MIN</tt> (minimum nonce length) = <tt>N_MAX</tt> (maximum nonce length) = 32 bytes (256 bits).</t>
        </li>
        <li>
          <t><tt>C_MAX</tt> (maximum ciphertext length) = <tt>P_MAX</tt> + tag length = (2<sup>61</sup> - 1) + 16 or 32 bytes (in bits: (2<sup>64</sup> - 8) + 128 or 256 bits).</t>
        </li>
      </ul>
      <t>Distinct associated data inputs, as described in <xref section="3" sectionFormat="comma" target="RFC5116"/>, <bcp14>MUST</bcp14> be unambiguously encoded as a single input.
It is up to the application to create a structure in the associated data input if needed.</t>
      <section anchor="authenticated-encryption-1">
        <name>Authenticated Encryption</name>
        <artwork><![CDATA[
Encrypt(msg, ad, key, nonce)
]]></artwork>
        <t>The <tt>Encrypt</tt> function encrypts a message and returns the ciphertext along with an authentication tag that verifies the authenticity of the message and associated data, if provided.</t>
        <t>Security:</t>
        <ul spacing="normal">
          <li>
            <t>For a given key, the nonce <bcp14>MUST NOT</bcp14> be reused under any circumstances; doing so allows an attacker to recover the internal state.</t>
          </li>
          <li>
            <t>The key <bcp14>MUST</bcp14> be randomly chosen from a uniform distribution.</t>
          </li>
        </ul>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>msg</tt>: the message to be encrypted (length <bcp14>MUST</bcp14> be less than or equal to <tt>P_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than or equal to <tt>A_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ct</tt>: the ciphertext.</t>
          </li>
          <li>
            <t><tt>tag</tt>: the authentication tag.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

ct = {}

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

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

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

return ct and tag
]]></artwork>
      </section>
      <section anchor="authenticated-decryption-1">
        <name>Authenticated Decryption</name>
        <artwork><![CDATA[
Decrypt(ct, tag, ad, key, nonce)
]]></artwork>
        <t>The <tt>Decrypt</tt> function decrypts a ciphertext, verifies that the authentication tag is correct, and returns the message on success or an error if tag verification failed.</t>
        <t>Security:</t>
        <ul spacing="normal">
          <li>
            <t>If tag verification fails, the decrypted message and wrong authentication tag <bcp14>MUST NOT</bcp14> be given as output. The decrypted message <bcp14>MUST</bcp14> be overwritten with zeros before the function returns.</t>
          </li>
          <li>
            <t>The comparison of the input <tt>tag</tt> with the <tt>expected_tag</tt> <bcp14>MUST</bcp14> be done in constant time.</t>
          </li>
        </ul>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ct</tt>: the ciphertext to decrypt (length <bcp14>MUST</bcp14> be less than or equal to <tt>C_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>tag</tt>: the authentication tag.</t>
          </li>
          <li>
            <t><tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than or equal to <tt>A_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t>Either the decrypted message <tt>msg</tt> or an error indicating that the authentication tag is invalid for the given inputs.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

msg = {}

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

ct_blocks = Split(ZeroPad(ct, 128), 128)
cn = Tail(ct, |ct| mod 128)

for ci in ct_blocks:
    msg = msg || Dec(ci)

if cn is not empty:
    msg = msg || DecPartial(cn)

expected_tag = Finalize(|ad|, |msg|)

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

S0  = S'0
S1  = S'1
S2  = S'2
S3  = S'3
S4  = S'4
S5  = S'5
]]></artwork>
      </section>
      <section anchor="the-init-function-1">
        <name>The Init Function</name>
        <artwork><![CDATA[
Init(key, nonce)
]]></artwork>
        <t>The <tt>Init</tt> function constructs the initial state <tt>{S0, ...S5}</tt> using the given <tt>key</tt> and <tt>nonce</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Defines:</t>
        <ul spacing="normal">
          <li>
            <t><tt>{S0, ...S5}</tt>: the initial state.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
k0, k1 = Split(key, 128)
n0, n1 = Split(nonce, 128)

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

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

Update(xi)

ci = xi ^ z

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

xi = ci ^ z

Update(xi)

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

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

xn = Truncate(out, |cn|)

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

return xn
]]></artwork>
      </section>
      <section anchor="the-finalize-function-1">
        <name>The Finalize Function</name>
        <artwork><![CDATA[
Finalize(ad_len_bits, msg_len_bits)
]]></artwork>
        <t>The <tt>Finalize</tt> function computes a 128- or 256-bit tag that authenticates the message and associated data.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ad_len_bits</tt>: the length of the associated data in bits.</t>
          </li>
          <li>
            <t><tt>msg_len_bits</tt>: the length of the message in bits.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>tag</tt>: the authentication tag.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
t = S3 ^ (LE64(ad_len_bits) || LE64(msg_len_bits))

Repeat(7, Update(t))

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

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

ct = {}

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

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

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

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

msg = {}

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

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

for ci in ct_blocks:
    msg = msg || Dec(ci)

if cn is not empty:
    msg = msg || DecPartial(cn)

expected_tag = Finalize(|ad|, |msg|)

if CtEq(tag, expected_tag) is False:
    erase msg
    erase expected_tag
    return "verification failed" error
else:
    return msg
]]></artwork>
      </section>
      <section anchor="aegis-128x">
        <name>AEGIS-128X</name>
        <section anchor="the-update-function-2">
          <name>The Update Function</name>
          <artwork><![CDATA[
Update(M0, M1)
]]></artwork>
          <t>The AEGIS-128X <tt>Update</tt> function is similar to the AEGIS-128L <tt>Update</tt> function but absorbs <tt>R</tt> (= <tt>256 * D</tt>) bits at once. <tt>M0</tt> and <tt>M1</tt> are <tt>128 * D</tt> bits instead of 128 bits but are split into 128-bit blocks, each of them updating a different AEGIS-128L state.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
m0 = Split(M0, 128)
m1 = Split(M1, 128)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Repeat(7, Update(t, t))

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

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

return tag
]]></artwork>
        </section>
      </section>
      <section anchor="aegis-256x">
        <name>AEGIS-256X</name>
        <section anchor="the-update-function-3">
          <name>The Update Function</name>
          <artwork><![CDATA[
Update(M)
]]></artwork>
          <t>The AEGIS-256X <tt>Update</tt> function is similar to the AEGIS-256 <tt>Update</tt> function but absorbs <tt>R</tt> (<tt>128 * D</tt>) bits at once. <tt>M</tt> is <tt>128 * D</tt> bits instead of 128 bits and is split into 128-bit blocks, each of them updating a different AEGIS-256 state.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
m = Split(M, 128)

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

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

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

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

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

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

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

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

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

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

Update(xi)

ci = xi ^ z

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

xi = ci ^ z

Update(xi)

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

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

xn = Truncate(out, |cn|)

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

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

Repeat(7, Update(t))

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

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

return tag
]]></artwork>
        </section>
      </section>
      <section anchor="implementation-considerations">
        <name>Implementation Considerations</name>
        <t>AEGIS-128X and AEGIS-256X with a degree of <tt>1</tt> are identical to AEGIS-128L and AEGIS-256, respectively. This property can be used to reduce the size of a generic implementation.</t>
        <t>In AEGIS-128X, <tt>V</tt> can be represented as eight 256-bit registers (when <tt>D = 2</tt>) or eight 512-bit registers (when <tt>D = 4</tt>). In AEGIS-256X, <tt>V</tt> can be represented as six 256-bit registers (when <tt>D = 2</tt>) or six 512-bit registers (when <tt>D = 4</tt>). With this representation, loops over <tt>0..D</tt> in the above pseudocode can be replaced by vector instructions.</t>
      </section>
      <section anchor="operational-considerations">
        <name>Operational Considerations</name>
        <t>The AEGIS parallel modes are specialized and can only improve performance on specific CPUs.</t>
        <t>The degrees of parallelism implementations are encouraged to support are <tt>2</tt> (for CPUs with 256-bit registers) and <tt>4</tt> (for CPUs with 512-bit registers). The resulting algorithms are called <tt>AEGIS-128X2</tt>, <tt>AEGIS-128X4</tt>, <tt>AEGIS-256X2</tt>, and <tt>AEGIS-256X4</tt>.</t>
        <t>The following table summarizes how many bits are processed in parallel (rate), the memory requirements (state size), and the minimum vector register size a CPU should support for optimal performance.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Algorithm</th>
              <th align="right">Rate (bits)</th>
              <th align="center">Optimal Register Size</th>
              <th align="right">State Size (bits)</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">AEGIS-128L</td>
              <td align="right">256</td>
              <td align="center">128 bits</td>
              <td align="right">1024</td>
            </tr>
            <tr>
              <td align="left">AEGIS-128X2</td>
              <td align="right">512</td>
              <td align="center">256 bits</td>
              <td align="right">2048</td>
            </tr>
            <tr>
              <td align="left">AEGIS-128X4</td>
              <td align="right">1024</td>
              <td align="center">512 bits</td>
              <td align="right">4096</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256</td>
              <td align="right">128</td>
              <td align="center">128 bits</td>
              <td align="right">768</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256X2</td>
              <td align="right">256</td>
              <td align="center">256 bits</td>
              <td align="right">1536</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256X4</td>
              <td align="right">512</td>
              <td align="center">512 bits</td>
              <td align="right">3072</td>
            </tr>
          </tbody>
        </table>
        <t>Note that architectures with smaller vector registers but with many registers and large pipelines may still benefit from the parallel modes.</t>
        <t>Protocols <bcp14>SHOULD</bcp14> opt for a parallel mode only when all the involved parties agree on a specific variant. AEGIS-128L and AEGIS-256 <bcp14>SHOULD</bcp14> remain the default choices.</t>
        <t>Implementations <bcp14>MAY</bcp14> choose not to include the parallel AEGIS modes.</t>
      </section>
    </section>
    <section anchor="encoding-ct-tag-tuples">
      <name>Encoding (ct, tag) Tuples</name>
      <t>Applications <bcp14>MAY</bcp14> keep the ciphertext and the authentication tag in distinct structures or encode both as a single string.</t>
      <t>In the latter case, the tag <bcp14>MUST</bcp14> immediately follow the ciphertext:</t>
      <artwork><![CDATA[
combined_ct = ct || tag
]]></artwork>
    </section>
    <section anchor="aegis-as-a-stream-cipher">
      <name>AEGIS as a Stream Cipher</name>
      <t>All AEGIS variants can also be used as stream ciphers.</t>
      <artwork><![CDATA[
Stream(len, key, nonce)
]]></artwork>
      <t>The <tt>Stream</tt> function expands a key and an optional nonce into a variable-length keystream.</t>
      <t>Inputs:</t>
      <ul spacing="normal">
        <li>
          <t><tt>len</tt>: the length of the keystream to generate in bits.</t>
        </li>
        <li>
          <t><tt>key</tt>: the AEGIS key.</t>
        </li>
        <li>
          <t><tt>nonce</tt>: the AEGIS nonce. If unspecified, it is set to <tt>N_MAX</tt> zero bytes.</t>
        </li>
      </ul>
      <t>Outputs:</t>
      <ul spacing="normal">
        <li>
          <t><tt>stream</tt>: the keystream.</t>
        </li>
      </ul>
      <t>Steps:</t>
      <artwork><![CDATA[
if len == 0:
    return {}
else:
    stream, tag = Encrypt(ZeroPad({ 0 }, len), {}, key, nonce)
    return stream
]]></artwork>
      <t>This is equivalent to encrypting a <tt>len</tt> all-zero bits message without associated data and discarding the authentication tag.</t>
      <t>Instead of relying on the generic <tt>Encrypt</tt> function, implementations can omit the <tt>Finalize</tt> function.</t>
      <t>After initialization, the <tt>Update</tt> function is called with constant parameters, allowing further optimizations.</t>
    </section>
    <section anchor="aegis-as-a-message-authentication-code">
      <name>AEGIS as a Message Authentication Code</name>
      <t>All AEGIS variants can be used to construct a Message Authentication Code (MAC).</t>
      <t>For all the variants, the <tt>Mac</tt> function takes a key, a nonce, and data as input and produces a 128- or 256-bit tag as output.</t>
      <artwork><![CDATA[
Mac(data, key, nonce)
]]></artwork>
      <t>Security:</t>
      <ul spacing="normal">
        <li>
          <t>This is the only function that allows the reuse of <tt>(key, nonce)</tt> pairs with different inputs.</t>
        </li>
        <li>
          <t>AEGIS-based MAC functions <bcp14>MUST NOT</bcp14> be used as hash functions: if the key is known, inputs causing state collisions can easily be crafted.</t>
        </li>
        <li>
          <t>Unlike hash-based MACs, tags <bcp14>MUST NOT</bcp14> be used for key derivation as there is no guarantee that they are uniformly random.</t>
        </li>
      </ul>
      <t>Inputs:</t>
      <ul spacing="normal">
        <li>
          <t><tt>data</tt>: the input data to authenticate (length <bcp14>MUST</bcp14> be less than or equal to <tt>A_MAX</tt>).</t>
        </li>
        <li>
          <t><tt>key</tt>: the secret key.</t>
        </li>
        <li>
          <t><tt>nonce</tt>: the public nonce.</t>
        </li>
      </ul>
      <t>Outputs:</t>
      <ul spacing="normal">
        <li>
          <t><tt>tag</tt>: the authentication tag.</t>
        </li>
      </ul>
      <section anchor="aegismac-128l">
        <name>AEGISMAC-128L</name>
        <t>AEGISMAC-128L refers to the <tt>Mac</tt> function based on the building blocks of AEGIS-128L.</t>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)
data_blocks = Split(ZeroPad(data, 256), 256)
for di in data_blocks:
    Absorb(di)
tag = Finalize(|data|, tag_len_bits)
return tag
]]></artwork>
      </section>
      <section anchor="aegismac-256">
        <name>AEGISMAC-256</name>
        <t>AEGISMAC-256 refers to the <tt>Mac</tt> function based on the building blocks of AEGIS-256.</t>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)
data_blocks = Split(ZeroPad(data, 128), 128)
for di in data_blocks:
    Absorb(di)
tag = Finalize(|data|, tag_len_bits)
return tag
]]></artwork>
      </section>
      <section anchor="aegismac-128x">
        <name>AEGISMAC-128X</name>
        <t>AEGISMAC-128X is based on the building blocks of AEGIS-128X but replaces the <tt>Finalize</tt> function with a dedicated <tt>FinalizeMac</tt> function.</t>
        <section anchor="the-mac-function">
          <name>The Mac Function</name>
          <t>Steps:</t>
          <artwork><![CDATA[
Init(key, nonce)
data_blocks = Split(ZeroPad(data, R), R)
for di in data_blocks:
    Absorb(di)
tag = FinalizeMac(|data|)
return tag
]]></artwork>
        </section>
        <section anchor="the-finalizemac-function">
          <name>The FinalizeMac Function</name>
          <artwork><![CDATA[
FinalizeMac(data_len_bits)
]]></artwork>
          <t>The <tt>FinalizeMac</tt> function computes a 128- or 256-bit tag that authenticates the input data.</t>
          <t>It finalizes all the instances, absorbs the resulting tags into the first state, and computes the final tag using that single state, as done in AEGIS-128L.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
t = {}
u = LE64(data_len_bits) || LE64(tag_len_bits)
for i in 0..D:
    t = t || (V[2,i] ^ u)

Repeat(7, Update(t, t))

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

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

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

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

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

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

Repeat(7, Update(t))

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

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

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

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

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

return tag
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t><em>This note is to be removed before publishing as an RFC.</em></t>
      <t>Multiple implementations of the schemes described in this document have been developed and verified for interoperability.</t>
      <t>A comprehensive list of known implementations and integrations can be found at <eref target="https://github.com/cfrg/draft-irtf-cfrg-aegis-aead"/>, which includes reference implementations closely aligned with the pseudocode provided in this document.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="usage-guidelines">
        <name>Usage Guidelines</name>
        <section anchor="key-and-nonce-selection">
          <name>Key and Nonce Selection</name>
          <t>All AEGIS variants <bcp14>MUST</bcp14> be used in a nonce-respecting setting: for a given <tt>key</tt>, a <tt>nonce</tt> <bcp14>MUST</bcp14> only be used once, even with different <tt>tag</tt> lengths. Failure to do so would immediately reveal the bitwise difference between two messages.</t>
          <t>Every key <bcp14>MUST</bcp14> be randomly chosen from a uniform distribution.</t>
          <t>The nonce <bcp14>MAY</bcp14> be public or predictable. It can be a counter, the output of a permutation, or a generator with a long period.</t>
          <t>With AEGIS-128L and AEGIS-128X, random nonces can safely encrypt up to 2<sup>48</sup> messages using the same key with negligible (~2<sup>-33</sup>, to align with NIST guidelines) collision probability.</t>
          <t>With AEGIS-256 and AEGIS-256X, random nonces can be used with no practical limits.</t>
        </section>
        <section anchor="committing-security">
          <name>Committing Security</name>
          <t>An authentication tag may verify under multiple keys, nonces, or associated data, but AEGIS is assumed to be key committing in the receiver-binding game. This mitigates common attacks when used with low-entropy keys such as passwords. Finding distinct keys and/or nonces that successfully verify the same <tt>(ad, ct, tag)</tt> tuple is expected to require ~2<sup>64</sup> attempts with a 128-bit authentication tag and ~2<sup>128</sup> attempts with a 256-bit tag.</t>
          <t>AEGIS is fully committing in the restricted setting where an adversary cannot control the associated data. As shown in <xref target="IR23"/>, with the ability to alter the associated data, it is possible to efficiently find multiple keys that will verify the same authenticated ciphertext.</t>
          <t>Protocols mandating a fully committing scheme without that restriction can provide the associated data as input to a cryptographic hash function and use the output as the <tt>ad</tt> parameter of the <tt>Encrypt</tt> and <tt>Decrypt</tt> functions. The selected hash function must ensure a minimum of 128-bit collision and preimage resistance. An instance of such a function is SHA-256 <xref target="RFC6234"/>.</t>
          <t>Alternatively, the associated data can be fed into a collision-resistant KDF, such as HKDF <xref target="RFC5869"/>, via the <tt>info</tt> input to derive the <tt>key</tt> parameter. The <tt>ad</tt> parameter can then be left empty. Note that the <tt>salt</tt> input <bcp14>MUST NOT</bcp14> be used since large salts get hashed, which affects commitment. Furthermore, this requires values concatenated to form the <tt>info</tt> input to be unambiguously encoded, like by appending their lengths.</t>
        </section>
        <section anchor="multi-user-security">
          <name>Multi-User Security</name>
          <t>AEGIS nonces match the size of the key. AEGIS-128L and AEGIS-128X feature 128-bit nonces, offering an extra 32 bits compared to the commonly used AEADs in IETF protocols at the time of writing. The AEGIS-256 and AEGIS-256X variants provide even larger nonces. With 192 random bits, 64 bits remain available to optionally encode additional information.</t>
          <t>In all these variants, unused nonce bits can encode a key identifier, enhancing multi-user security. If every key has a unique identifier, multi-target attacks do not provide any advantage over single-target attacks.</t>
        </section>
      </section>
      <section anchor="implementation-security">
        <name>Implementation Security</name>
        <t>If tag verification fails, the unverified plaintext and computed authentication tag <bcp14>MUST NOT</bcp14> be released. As shown in <xref target="VV18"/>, even a partial leak of the plaintext without verification facilitates chosen ciphertext attacks.</t>
        <t>The security of AEGIS against timing and physical attacks is limited by the implementation of the underlying <tt>AESRound</tt> function. Failure to implement <tt>AESRound</tt> in a fashion safe against timing and physical attacks, such as differential power analysis, timing analysis, or fault injection attacks, may lead to leakage of secret key material or state information. The exact mitigations required for timing and physical attacks depend on the threat model in question.</t>
        <t>Regardless of the variant, the <tt>key</tt> and <tt>nonce</tt> are only required by the <tt>Init</tt> function; other functions only depend on the resulting state. Therefore, implementations can overwrite ephemeral keys with zeros right after the last <tt>Update</tt> call of the initialization function.</t>
      </section>
      <section anchor="security-guarantees">
        <name>Security Guarantees</name>
        <t>AEGIS-256 offers 256-bit security against plaintext and state recovery, whereas AEGIS-128L offers 128-bit security.</t>
        <t>Under the assumption that the secret key is unknown to the attacker, all AEGIS variants offer at least 128-bit security against forgery attacks.</t>
        <t>Encrypting the same message with the same key and nonce but different associated data generates distinct ciphertexts that do not reveal any additional information about the message.
However, <tt>(key, nonce)</tt> pairs <bcp14>MUST NOT</bcp14> be reused, even if the associated data differs.</t>
        <t>AEGIS has been shown to have reforgeability resilience in <xref target="FLLW17"/>. Without the ability to set the associated data, a successful forgery does not increase the probability of subsequent forgeries.</t>
        <t>AEGIS-128X and AEGIS-256X share the same security properties and requirements as AEGIS-128L and AEGIS-256, respectively. In particular, the security level and usage limits remain the same <xref target="D23"/>.</t>
        <t>AEGIS is considered secure against guess-and-determine attacks aimed at recovering the state from observed ciphertexts.</t>
        <t>This resilience extends to quantum adversaries operating within the Q1 model, where the attacker has access to a quantum computer but is restricted to classical (non-quantum) communications with the systems under attack. In this model, quantum attacks offer no practical advantage in decrypting previously recorded ciphertexts or in recovering the encryption key.</t>
        <t>This document extends the original specification by introducing optional support for 256-bit authentication tags, which are constructed similarly to the 128-bit tags.
As shown in <xref target="SSI24"/>, with 256-bit tags, all AEGIS variants achieve more than 128-bit security against forgery by differential attacks.</t>
        <t>Security analyses of AEGIS can be found in <xref target="AEGIS"/>, <xref target="M14"/>, <xref target="FLLW17"/>, <xref target="ENP20"/>, <xref target="LIMS21"/>, <xref target="JLD22"/>, <xref target="STSI23"/>, <xref target="IR23"/>, <xref target="BS23"/>, <xref target="AIKRS24"/>, and <xref target="SSI24"/>.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA has assigned the following identifiers in the AEAD Algorithms Registry:</t>
      <table>
        <name>AEGIS entries in the AEAD Algorithms Registry</name>
        <thead>
          <tr>
            <th align="left">Algorithm Name</th>
            <th align="left">ID</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>AEAD_AEGIS128L</tt></td>
            <td align="left">
              <tt>32</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>AEAD_AEGIS256</tt></td>
            <td align="left">
              <tt>33</tt></td>
          </tr>
        </tbody>
      </table>
      <t>IANA is requested to update the references of these entries to refer to the final version of this document.</t>
      <t>IANA is also requested to register the following entries in the AEAD Algorithms Registry:</t>
      <table>
        <name>Missing 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_AEGIS128X2</tt></td>
            <td align="left"> </td>
          </tr>
          <tr>
            <td align="left">
              <tt>AEAD_AEGIS128X4</tt></td>
            <td align="left"> </td>
          </tr>
          <tr>
            <td align="left">
              <tt>AEAD_AEGIS256X2</tt></td>
            <td align="left"> </td>
          </tr>
          <tr>
            <td align="left">
              <tt>AEAD_AEGIS256X4</tt></td>
            <td align="left"> </td>
          </tr>
        </tbody>
      </table>
      <t>The identifier is left to be assigned by the IANA expert.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="FIPS-AES" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197.pdf">
          <front>
            <title>Advanced encryption standard (AES)</title>
            <author>
              <organization abbrev="NIST">National Institute of Standards and Technology</organization>
              <address>
                <postal>
                  <country>US</country>
                  <city>Gaithersburg</city>
                </postal>
              </address>
            </author>
            <date month="November" year="2001"/>
          </front>
          <seriesInfo name="NIST Federal Information Processing Standards Publications" value="197"/>
          <seriesInfo name="DOI" value="10.6028/NIST.FIPS.197"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC5116">
          <front>
            <title>An Interface and Algorithms for Authenticated Encryption</title>
            <author fullname="D. McGrew" initials="D." surname="McGrew"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>This document defines algorithms for Authenticated Encryption with Associated Data (AEAD), and defines a uniform interface and a registry for such algorithms. The interface and registry can be used as an application-independent set of cryptoalgorithm suites. This approach provides advantages in efficiency and security, and promotes the reuse of crypto implementations. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5116"/>
          <seriesInfo name="DOI" value="10.17487/RFC5116"/>
        </reference>
        <reference anchor="RFC6234">
          <front>
            <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="May" year="2011"/>
            <abstract>
              <t>Federal Information Processing Standard, FIPS</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6234"/>
          <seriesInfo name="DOI" value="10.17487/RFC6234"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="AEGIS" target="https://competitions.cr.yp.to/round3/aegisv11.pdf">
          <front>
            <title>AEGIS: A Fast Authenticated Encryption Algorithm (v1.1)</title>
            <author initials="H." surname="Wu" fullname="Hongjun Wu">
              <organization>Nanyang Technological University</organization>
            </author>
            <author initials="B." surname="Preneel" fullname="Bart Preneel">
              <organization>KU Leuven</organization>
            </author>
            <date year="2016"/>
          </front>
        </reference>
        <reference anchor="AIKRS24">
          <front>
            <title>Differential fault attack on AES-based encryption schemes: application to B5G/6G ciphers—Rocca, Rocca-S and AEGIS</title>
            <author initials="R." surname="Anand" fullname="Ravi Anand">
              <organization>Indraprastha Institute of Information Technology Delhi; University of Hyogo</organization>
            </author>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="A. K." surname="Kundu" fullname="Anup Kumar Kundu">
              <organization>Indian Statistical Institute Kolkata</organization>
            </author>
            <author initials="M." surname="Rahman" fullname="Mostafizar Rahman">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="S." surname="Suryawanshi" fullname="Sahiba Suryawanshi">
              <organization>University of Hyogo; Indian Institute of Technology Bhilai</organization>
            </author>
            <date year="2024"/>
          </front>
          <seriesInfo name="DOI" value="10.1007/s13389-024-00360-6"/>
          <refcontent>Journal of Cryptographic Engineering, 2024</refcontent>
        </reference>
        <reference anchor="BS23" target="https://eprint.iacr.org/2023/1306">
          <front>
            <title>Single-query Quantum Hidden Shift Attacks</title>
            <author initials="X." surname="Bonnetain" fullname="Xavier Bonnetain">
              <organization>Université de Lorraine, CNRS, Inria, LORIA</organization>
            </author>
            <author initials="A." surname="Schrottenloher" fullname="André Schrottenloher">
              <organization>Université de Rennes, CNRS, Inria, IRISA</organization>
            </author>
            <date year="2023"/>
          </front>
          <refcontent>Cryptology ePrint Archive, Paper 2023/1306</refcontent>
        </reference>
        <reference anchor="D23" target="https://eprint.iacr.org/2023/523">
          <front>
            <title>Adding more parallelism to the AEGIS authenticated encryption algorithms</title>
            <author initials="F." surname="Denis" fullname="Frank Denis">
              <organization>Fastly Inc.</organization>
            </author>
            <date year="2023"/>
          </front>
          <refcontent>Cryptology ePrint Archive, Paper 2023/523</refcontent>
        </reference>
        <reference anchor="ENP20">
          <front>
            <title>Analyzing the Linear Keystream Biases in AEGIS</title>
            <author initials="M." surname="Eichlseder" fullname="Maria Eichlseder">
              <organization>Graz University of Technology</organization>
            </author>
            <author initials="M." surname="Nageler" fullname="Marcel Nageler">
              <organization>Graz University of Technology</organization>
            </author>
            <author initials="R." surname="Primas" fullname="Robert Primas">
              <organization>Graz University of Technology</organization>
            </author>
            <date year="2020"/>
          </front>
          <seriesInfo name="DOI" value="10.13154/tosc.v2019.i4.348-368"/>
          <refcontent>IACR Transactions on Symmetric Cryptology, 2019(4), pp. 348–368</refcontent>
        </reference>
        <reference anchor="FLLW17" target="https://eprint.iacr.org/2017/332">
          <front>
            <title>Reforgeability of Authenticated Encryption Schemes</title>
            <author initials="C." surname="Forler" fullname="Christian Forler">
              <organization>Beuth Hochschule für Technik Berlin</organization>
            </author>
            <author initials="E." surname="List" fullname="Eik List">
              <organization>Bauhaus-Universität Weimar</organization>
            </author>
            <author initials="S." surname="Lucks" fullname="Stefan Lucks">
              <organization>Bauhaus-Universität Weimar</organization>
            </author>
            <author initials="J." surname="Wenzel" fullname="Jakob Wenzel">
              <organization>Bauhaus-Universität Weimar</organization>
            </author>
            <date year="2017"/>
          </front>
          <refcontent>Cryptology ePrint Archive, Paper 2017/332</refcontent>
        </reference>
        <reference anchor="IR23" target="https://eprint.iacr.org/2023/1495">
          <front>
            <title>Key Committing Security Analysis of AEGIS</title>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="M." surname="Rahman" fullname="Mostafizar Rahman">
              <organization>University of Hyogo</organization>
            </author>
            <date year="2023"/>
          </front>
          <refcontent>Cryptology ePrint Archive, Paper 2023/1495</refcontent>
        </reference>
        <reference anchor="JLD22">
          <front>
            <title>Guess-and-Determine Attacks on AEGIS</title>
            <author initials="L." surname="Jiao" fullname="Lin Jiao">
              <organization>State Key Laboratory of Cryptology</organization>
            </author>
            <author initials="Y." surname="Li" fullname="Yongqiang Li">
              <organization>State Key Laboratory of Information Security, Institute of Information Engineering, Chinese Academy of Sciences; School of Cyber Security, University of Chinese Academy of Sciences</organization>
            </author>
            <author initials="S." surname="Du" fullname="Shaoyu Du">
              <organization>State Key Laboratory of Cryptology</organization>
            </author>
            <date year="2022"/>
          </front>
          <seriesInfo name="DOI" value="10.1093/comjnl/bxab059"/>
          <refcontent>The Computer Journal, vol 65, 2022(8), pp. 2221–2230</refcontent>
        </reference>
        <reference anchor="LGR21" target="https://www.usenix.org/conference/usenixsecurity21/presentation/len">
          <front>
            <title>Partitioning Oracle Attacks</title>
            <author initials="J." surname="Len" fullname="Julia Len">
              <organization>Cornell Tech</organization>
            </author>
            <author initials="P." surname="Grubbs" fullname="Paul Grubbs">
              <organization>Cornell Tech</organization>
            </author>
            <author initials="T." surname="Ristenpart" fullname="Thomas Ristenpart">
              <organization>Cornell Tech</organization>
            </author>
            <date year="2021"/>
          </front>
          <refcontent>30th USENIX Security Symposium (USENIX Security 21), pp. 195–212</refcontent>
        </reference>
        <reference anchor="LIMS21">
          <front>
            <title>Weak Keys in Reduced AEGIS and Tiaoxin</title>
            <author initials="F." surname="Liu" fullname="Fukang Liu">
              <organization>East China Normal University; University of Hyogo</organization>
            </author>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo; National Institute of Information and Communications Technology; PRESTO, Japan Science and Technology Agency</organization>
            </author>
            <author initials="W." surname="Meier" fullname="Willi Meier">
              <organization>University of Applied Sciences and Arts Northwestern Switzerland</organization>
            </author>
            <author initials="K." surname="Sakamoto" fullname="Kosei Sakamoto">
              <organization>University of Hyogo</organization>
            </author>
            <date year="2021"/>
          </front>
          <seriesInfo name="DOI" value="10.46586/tosc.v2021.i2.104-139"/>
          <refcontent>IACR Transactions on Symmetric Cryptology, 2021(2), pp. 104–139</refcontent>
        </reference>
        <reference anchor="M14">
          <front>
            <title>Linear Biases in AEGIS Keystream</title>
            <author initials="B." surname="Minaud" fullname="Brice Minaud">
              <organization>ANSSI</organization>
            </author>
            <date year="2014"/>
          </front>
          <seriesInfo name="DOI" value="10.1007/978-3-319-13051-4_18"/>
          <refcontent>Selected Areas in Cryptography. SAC 2014. Lecture Notes in Computer Science, vol 8781, pp. 290–305</refcontent>
        </reference>
        <reference anchor="SSI24">
          <front>
            <title>Bit-Wise Analysis for Forgery Attacks on AES-Based AEAD Schemes</title>
            <author initials="T." surname="Shiraya" fullname="Takuro Shiraya">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="K." surname="Sakamoto" fullname="Kosei Sakamoto">
              <organization>Mitsubishi Electric Corporation</organization>
            </author>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo</organization>
            </author>
            <date year="2024"/>
          </front>
          <seriesInfo name="DOI" value="10.1007/978-981-97-7737-2_1"/>
          <refcontent>Advances in Information and Computer Security. IWSEC 2024. Lecture Notes in Computer Science, vol 14977</refcontent>
        </reference>
        <reference anchor="STSI23">
          <front>
            <title>MILP-based security evaluation for AEGIS/Tiaoxin-346/Rocca</title>
            <author initials="T." surname="Shiraya" fullname="Takuro Shiraya">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="N." surname="Takeuchi" fullname="Nobuyuki Takeuchi">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="K." surname="Sakamoto" fullname="Kosei Sakamoto">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo; National Institute of Information and Communications Technology</organization>
            </author>
            <date year="2023"/>
          </front>
          <seriesInfo name="DOI" value="10.1049/ise2.12109"/>
          <refcontent>IET Information Security, vol 17, 2023(3), pp. 458-467</refcontent>
        </reference>
        <reference anchor="TEST-VECTORS" target="https://github.com/cfrg/draft-irtf-cfrg-aegis-aead/tree/8e289c40/test-vectors">
          <front>
            <title>AEGIS Test Vectors</title>
            <author>
              <organization/>
            </author>
            <date year="2025"/>
          </front>
          <refcontent>commit 8e289c40</refcontent>
        </reference>
        <reference anchor="VV18">
          <front>
            <title>Can Caesar Beat Galois?</title>
            <author initials="S." surname="Vaudenay" fullname="Serge Vaudenay">
              <organization>EPFL</organization>
            </author>
            <author initials="D." surname="Vizár" fullname="Damian Vizár">
              <organization>EPFL</organization>
            </author>
            <date year="2018"/>
          </front>
          <seriesInfo name="DOI" value="10.1007/978-3-319-93387-0_25"/>
          <refcontent>Applied Cryptography and Network Security. ACNS 2018. Lecture Notes in Computer Science, vol 10892, pp. 476–494</refcontent>
        </reference>
      </references>
    </references>
    <?line 1933?>

<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    : 73110d21a920608fd77b580f1e442808
        7a7365cb153b4eeca6b62e1a70f7f9a8
        d1f31f17da4c3acfacb2517f2f5e1575
        8c35532e33751a964d18d29a599d2dc0
        7f9378339b9d8c9fa03d30a4d7837cc8
        eb8b99bcbba2d11cd1a0f994af2b8f94
        7ef18473bd519e5283736758480abc99
        0e79d4ccab93dde9

tag128: 94a3bd44ad3381e36335014620ee638e

tag256: 0392c62b17ddb00c172a010b5a327d0f
        97317b6fbaee31ef741f004d7adc1e81
]]></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    : bec109547f8316d598b3b7d947ad4c0e
        f5b98e217cffa0d858ad49ae34109a95
        abc5b5fada820c4d6ae2fca0f5e2444e
        52a04a1edb7bec71408de3e199500521
        94506be3ba6a4de51a15a577ea0e4c14
        f7539a13e751a555f48d0f49fecffb22
        0525e60d381e2efa803b09b7164ba59f
        dc66656affd51e06

tag128: ec44b512d713f745547be345bcc66b6c

tag256: ba3168ecd7f7120c5e204a7e0d616e39
        5675ddfe00e4e5490a5ba93bb1a70555
]]></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 and Daniel Bleichenbacher for catching a broken test vector, and Daniel Bleichenbacher for many helpful suggestions.</t>
        </li>
        <li>
          <t>Soatok Dreamseeker for his early review of the draft and for suggesting the addition of negative test vectors.</t>
        </li>
        <li>
          <t>John Preuß Mattsson for his review of the draft and for suggesting how AEGIS should be used in the context of DTLS and QUIC.</t>
        </li>
        <li>
          <t>Bart Mennink and Charlotte Lefevre, as well as Takanori Isobe and Mostafizar Rahman, for investigating the committing security of the schemes specified in this document.</t>
        </li>
        <li>
          <t>Scott Fluhrer for his review of the draft as a member of the CFRG Crypto Review Panel.</t>
        </li>
        <li>
          <t>Yawning Angel, Chris Barber, and Neil Madden for their review of the draft.</t>
        </li>
        <li>
          <t>Gilles Van Assche for reviewing the draft and providing insightful comments on the implications of nonce reuse in AEGIS-128X and AEGIS-256X.</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
8k4Xeq6dpu1PRrPlcmj/HuZsuAp05JQ8Id33vG1k1NK1G0fe7wpS5R81HksM
OKENZ/rT/WclpSS4WJ1tKEq9M0WvGSwQXn0g6Y5FHPDGGv/ccBVnFx+5RbwR
Q6zfbpdHO3Pf/+hBwBWGf1WzTQ832HfAm1H7S7zBrV/1ULZvm37+BbVOrl9a
qsPL+rqqxRsPg5m/Drlf14xm8BXLSC2uGB//krVf+UHWLD34cMfK1+8G0ZUb
etJbTjRHZm7uRBNdb+BDd27xtgd9sh3I3uk2+6uF3oHX3C0GbDrNvX/8pu5x
6yS27vEH7h3f2Cv+IPzYn9M37ReKPhDX9CelqF3pz/rMtZEv22awjR1aMZy8
gYMbD2rqHiaDmijD7UXI7pjwfukeu6nh3D+dj57v6C99zm14l9Q146vjf+ip
8GXnbem5Lz/MmQv69vwvXKBNoXt3nm78to5u0hZILnV0iSBX2qN31Iz4eZrh
CftZxjMXP09cgC3iG4cFWjN3bXLku3b+ubtv6Ptf0tnvLndYyPXwQLMDRpug
Z4ff8gapkO/aDWe6vKEX/vPR5eZJjz+LM9wS6yf7wj8f5TbzGY/eJptx7JV+
KA7pMO/pV+uPRlf5ox+OM/rr8UEvcT2vGNaNPM5Ho3v/KJuqqU2bMXZVXl97
L1KXVnXil1DpyhJ39xqUxWWJfeN0Pp/d49MXL9qUsrVPKHOXxjnYTVLI6T58
1n6tNy4u5Jzecb7TVyddito46cydsL2VPRfccpeK3AfxJBxe2vnHJbdy4oYl
4xO6WHdwK+WVTdNBFDdpmMpd3+zXztMZptUxMfaC6WJx3vBu0OCEWO6k2+df
Lui6s8auzYLylQb9nCrtMqR2ZyqCZ75otYhLvxsxTBeJGOf8NX7JvM97ZcVG
Gyvp5ia6PI07NLjnknbj+nu0OJnTZxU6hms2Evm27q+k5igVa71Up46L/MWy
bplfngS3xjeFbk3HbectxlsltybktnMVB5q5v7CYWtPUS7pJpWNLSTet9H/G
/Z/EObK7eqV7FLdnk/S3Cbgb7Jr1bKaWbEPOFq+CGZ0x4OItS9ul4HA2azcf
tyj98Paez0vn29r8NXFEP7CX821J1G53t8IF7aEdGwmvTiIVkYeygtfT7gZf
VnaU80y3HAwmFgP5oT+7BXrqh+CI9956awP2ct8ctU0cUxM/BMfcLf6jLYua
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
pgdUdXdJBR8mDtGtHZYnEi/NmJABx383qb95D48jdhdV7khNfijUPy9xtUnm
Th3ARtUUBTBrRpRdPvFwi0ery3dsR+zcnaXtUyzt4KTZVuG2SpQ+OpiMgdrx
8SMZd9GFQcSj2amelT6rwf3BzN10B+t3rYbGKEcQptfYnTVz8MX2a8Lj4Dh3
lJ9TR7///omI3S+toqLfHzx9JkP36+NHT46lcL//4fF9Kd2vx88x1sj93sZU
vv/+k+P2t8NHnx8dO2KQbHe04dD3o8Onh1thb37IItC0FwyMNhH1oL873pu8
qn5/TuO34SwpmXS4b+cpKRDakPHoPv0z2d5V4zfa8LsTqvVbphBpthO8O4nk
yeY7zO5JwO8ievf9XaC11dR+/JGjOUX4SAtc09OPfvQD9z40JNtJtTuhw0Mo
Hw9vARxtlfXVcwCvst0mabf4S0qow9zjdYe2MU7uH7XYbZMak/2GA9lNck/z
XST3NN9B8m+I2LystuNdfMk7txnt8neD7/qpelI3HC1/4ykj7N7zIzs/FILx
d8G1/OthM5OcQq5LmgAacwmZ5UvC6fT2r3ivT7O1Z47euX1AbuGVZ6x32NHL
Pxx/8TRwgIgM2vffP39w/Hz/qwf3nn9xdEyIo1XqrsyeO0bebTxxdW7s9eQK
2/cUVIXy6QMvZ/BWoOd5w5v1W2naPFznng0HxOkEPIp9P4oJuhwEd4MwDEUo
wyiMwyRMwyzMwyJUYRnq0IQ2rCaT5QsuKEIhhBSRiEUiUpGJXBRCiVJoYYQV
KEhwCgUzlZWxTdIoz3KZxKnKdRhnmYrKXERVHG0f//x4g/YUSvKnV109Broa
Dy0WZWbTsJSx1nkWWZUXsdU6zAohwrhQEV+ch3JRFJY2zKsoicKwUkrasirQ
29DILE6TnK/VoxGUpUlKI0t8XWVlUSYi0ZVMq9JmWZJqvnQP5XSUKFSUJGgy
1VGep1YntpB5lWemFDlfyUf9s6XWqtI2z7Qq4ziNilTHURQnhdQFSEcX9qFc
kps8spGoICNRJjCmSqdlKZNMiDgNxeQ4dVOBCsoktSqSUud5kuZKZOh/UqK2
xNjJccbl0jjMRV5VZZIZHValljaTyhZoOLNRoSaTJ46AYRTZtMiSsohzkeZZ
YWNZUJVhkSRKhZMnjoCV1qJAa3EKihdZnorSpDYvVJUqlSRVu5vDTd7dSTtB
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

-->

</rfc>
