<?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.21 (Ruby 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-aegis-aead-14" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.25.0 -->
  <front>
    <title>The AEGIS Family of Authenticated Encryption Algorithms</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-aegis-aead-14"/>
    <author initials="F." surname="Denis" fullname="Frank Denis">
      <organization>Fastly Inc.</organization>
      <address>
        <email>fde@00f.net</email>
      </address>
    </author>
    <author initials="S." surname="Lucas" fullname="Samuel Lucas">
      <organization>Individual Contributor</organization>
      <address>
        <email>samuel-lucas6@pm.me</email>
      </address>
    </author>
    <date year="2024" month="December" day="12"/>
    <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="ENP19"/> <xref target="JLD21"/> <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 that of 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>In AEGIS, finding distinct (key, nonce) pairs that successfully decrypt a given (associated data, ciphertext, authentication tag) tuple is believed to have a complexity that depends on the tag size. A 128-bit tag provides 64-bit committing security, which is generally acceptable for interactive protocols. With a 256-bit tag, finding a collision becomes impractical.</t>
      <t>Unlike most other AES-based AEAD constructions, leaking a state does not leak the key 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 sporting differences with regards to the computation of the authentication tag and the number of state updates in the <tt>Finalize()</tt> function. We follow the specification of <xref target="AEGIS"/>, which can be found in the References section of this document.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words “<bcp14>MUST</bcp14>”, “<bcp14>MUST NOT</bcp14>”, “<bcp14>REQUIRED</bcp14>”, “<bcp14>SHALL</bcp14>”, “<bcp14>SHALL
NOT</bcp14>”, “<bcp14>SHOULD</bcp14>”, “<bcp14>SHOULD NOT</bcp14>”, “<bcp14>RECOMMENDED</bcp14>”, “<bcp14>NOT RECOMMENDED</bcp14>”,
“<bcp14>MAY</bcp14>”, and “<bcp14>OPTIONAL</bcp14>” in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

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

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

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

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

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

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

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

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

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

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

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

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

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

Repeat(7, Update(t, t))

if tag_length_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> bytes (2<sup>64</sup> bits).</t>
        </li>
        <li>
          <t><tt>N_MIN</tt> (minimum nonce length) = <tt>N_MAX</tt> (maximum nonce length) = 32 bytes (256 bits).</t>
        </li>
        <li>
          <t><tt>C_MAX</tt> (maximum ciphertext length) = <tt>P_MAX</tt> + tag length = (2<sup>61</sup> - 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"/> shall be unambiguously encoded as a single input.
It is up to the application to create a structure in the associated data input if needed.</t>
      <section anchor="authenticated-encryption-1">
        <name>Authenticated Encryption</name>
        <artwork><![CDATA[
Encrypt(msg, ad, key, nonce)
]]></artwork>
        <t>The <tt>Encrypt</tt> function encrypts a message and returns the ciphertext along with an authentication tag that verifies the authenticity of the message and associated data, if provided.</t>
        <t>Security:</t>
        <ul spacing="normal">
          <li>
            <t>For a given key, the nonce <bcp14>MUST NOT</bcp14> be reused under any circumstances; doing so allows an attacker to recover the internal state.</t>
          </li>
          <li>
            <t>The key <bcp14>MUST</bcp14> be randomly chosen from a uniform distribution.</t>
          </li>
        </ul>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>msg</tt>: the message to be encrypted (length <bcp14>MUST</bcp14> be less than 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 message authentication tag <bcp14>MUST NOT</bcp14> be given as output. The decrypted message <bcp14>MUST</bcp14> be overwritten with zeros before being returned.</t>
          </li>
          <li>
            <t>The comparison of the input <tt>tag</tt> with the <tt>expected_tag</tt> <bcp14>MUST</bcp14> be done in constant time.</t>
          </li>
        </ul>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ct</tt>: the ciphertext to be decrypted (length <bcp14>MUST</bcp14> be less than 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
    return "verification failed" error
else:
    return msg
]]></artwork>
      </section>
      <section anchor="the-init-function-1">
        <name>The Init Function</name>
        <artwork><![CDATA[
Init(key, nonce)
]]></artwork>
        <t>The <tt>Init</tt> function constructs the initial state <tt>{S0, ...S5}</tt> using the given <tt>key</tt> and <tt>nonce</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Defines:</t>
        <ul spacing="normal">
          <li>
            <t><tt>{S0, ...S5}</tt>: the initial state.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
k0, k1 = Split(key, 128)
n0, n1 = Split(nonce, 128)

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

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

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

Update(xi)

ci = xi ^ z

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

xi = ci ^ z

Update(xi)

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

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

xn = Truncate(out, |cn|)

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

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

Repeat(7, Update(t))

if tag_length_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-256, <tt>j</tt> is in the <tt>[0..6)</tt> range.</t>
          </li>
          <li>
            <t><tt>V'[j,i]</tt>: the <tt>j</tt>-th AES block of the next <tt>i</tt>-th state.</t>
          </li>
          <li>
            <t><tt>ctx[i]</tt>: the <tt>i</tt>-th context separator. This is a 128-bit mask, made of a byte representing the state index, followed by a byte representing the highest index and 112 all-zero bits.</t>
          </li>
          <li>
            <t><tt>Byte(x)</tt>: the value <tt>x</tt> encoded as 8 bits.</t>
          </li>
        </ul>
      </section>
      <section anchor="authenticated-encryption-2">
        <name>Authenticated Encryption</name>
        <artwork><![CDATA[
Encrypt(msg, ad, key, nonce)
]]></artwork>
        <t>The <tt>Encrypt</tt> function of AEGIS-128X resembles that of AEGIS-128L, and similarly, the <tt>Encrypt</tt> function of AEGIS-256X mirrors that of AEGIS-256, but processes <tt>R</tt>-bit input blocks per update.</t>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

ct = {}

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

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

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

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

msg = {}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Repeat(7, Update(t, t))

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

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

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

Update(xi)

ci = xi ^ z

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

xi = ci ^ z

Update(xi)

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

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

xn = Truncate(out, |cn|)

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

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

Repeat(7, Update(t))

if tag_length_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. 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 sizes a CPU should support for optimal performance.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Algorithm</th>
              <th align="right">Rate (bits)</th>
              <th align="center">Optimal Register Size</th>
              <th align="right">State Size (bits)</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">AEGIS-128L</td>
              <td align="right">256</td>
              <td align="center">128 bits</td>
              <td align="right">1024</td>
            </tr>
            <tr>
              <td align="left">AEGIS-128X2</td>
              <td align="right">512</td>
              <td align="center">256 bits</td>
              <td align="right">2048</td>
            </tr>
            <tr>
              <td align="left">AEGIS-128X4</td>
              <td align="right">1024</td>
              <td align="center">512 bits</td>
              <td align="right">4096</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256</td>
              <td align="right">128</td>
              <td align="center">128 bits</td>
              <td align="right">768</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256X2</td>
              <td align="right">256</td>
              <td align="center">256 bits</td>
              <td align="right">1536</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256X4</td>
              <td align="right">512</td>
              <td align="center">512 bits</td>
              <td align="right">3072</td>
            </tr>
          </tbody>
        </table>
        <t>Note that architectures with smaller vector registers but with many registers and large pipelines may still benefit from the parallel modes.</t>
        <t>Protocols <bcp14>SHOULD</bcp14> opt for a parallel mode only when all the involved parties agree on a specific variant. AEGIS-128L and AEGIS-256 <bcp14>SHOULD</bcp14> remain the default choices.</t>
        <t>Implementations <bcp14>MAY</bcp14> choose not to include the parallel AEGIS modes.</t>
      </section>
    </section>
    <section anchor="encoding-ct-tag-tuples">
      <name>Encoding (ct, tag) Tuples</name>
      <t>Applications <bcp14>MAY</bcp14> keep the ciphertext and the authentication tag in distinct structures or encode both as a single string.</t>
      <t>In the latter case, the tag <bcp14>MUST</bcp14> immediately follow the ciphertext:</t>
      <artwork><![CDATA[
combined_ct = ct || tag
]]></artwork>
    </section>
    <section anchor="aegis-as-a-stream-cipher">
      <name>AEGIS as a Stream Cipher</name>
      <t>All AEGIS variants can also be used as stream ciphers.</t>
      <artwork><![CDATA[
Stream(len, key, nonce)
]]></artwork>
      <t>The <tt>Stream</tt> function expands a key and an optional nonce into a variable-length, secure keystream.</t>
      <t>Inputs:</t>
      <ul spacing="normal">
        <li>
          <t><tt>len</tt>: the length of the keystream to generate in bits.</t>
        </li>
        <li>
          <t><tt>key</tt>: the AEGIS key.</t>
        </li>
        <li>
          <t><tt>nonce</tt>: the nonce. If unspecified, it is set to <tt>N_MAX</tt> zero bytes.</t>
        </li>
      </ul>
      <t>Outputs:</t>
      <ul spacing="normal">
        <li>
          <t><tt>stream</tt>: the keystream.</t>
        </li>
      </ul>
      <t>Steps:</t>
      <artwork><![CDATA[
stream, tag = Encrypt(ZeroPad({}, len), {}, key, nonce)

return stream
]]></artwork>
      <t>This is equivalent to encrypting a <tt>len</tt> all-zero bits message without associated data, and discarding the authentication tag.</t>
      <t>Instead of relying on the generic <tt>Encrypt</tt> function, implementations can skip the finalization step.</t>
      <t>After initialization, the <tt>Update</tt> function is called with constant parameters, allowing further optimizations.</t>
    </section>
    <section anchor="aegis-as-a-message-authentication-code">
      <name>AEGIS as a Message Authentication Code</name>
      <t>All AEGIS variants can be used to construct a 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_length_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_length_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_length_bits)
for i in 0..D:
    t = t || (V[2,i] ^ u)

Repeat(7, Update(t, t))

tags = {}
if tag_length_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):
        Absorb(ZeroPad(v, R))

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

if tag_length_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
]]></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_length_bits)
for i in 0..D:
    t = t || (V[3,i] ^ u)

Repeat(7, Update(t))

tags = {}
if tag_length_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_length_bits)
    t = ZeroPad(V[3,0] ^ u, R)
    Repeat(7, Update(t))

if tag_length_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
]]></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="key-commitment">
          <name>Key Commitment</name>
          <t>An authentication tag may verify under multiple keys, nonces, or associated data, but AEGIS is assumed to be key committing in the receiver-binding game, preventing common attacks when used with low-entropy keys such as passwords. Finding distinct keys and/or nonces that successfully verify the same <tt>(ad, ct, tag)</tt> tuple is expected to require ~2<sup>64</sup> attempts with a 128-bit authentication tag and ~2<sup>128</sup> attempts with a 256-bit tag.</t>
          <t>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 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. The AEGIS-256 and AEGIS-256X variants provide even larger nonces. With 192 random bits, 64 bits remain available to optionally encode additional information.</t>
          <t>In all these variants, unused nonce bits can encode a key identifier, enhancing multi-user security. If every key has a unique identifier, multi-target attacks don’t provide any advantage over single-target attacks.</t>
        </section>
      </section>
      <section anchor="implementation-security">
        <name>Implementation Security</name>
        <t>If tag verification fails, the unverified plaintext and the computed message authentication tag <bcp14>MUST NOT</bcp14> be released. As shown in <xref target="VV18"/>, even a partial leak of the plaintext without verification would facilitate chosen ciphertext attacks.</t>
        <t>The security of AEGIS against timing and physical attacks is limited by the implementation of the underlying <tt>AESRound()</tt> function. Failure to implement <tt>AESRound()</tt> in a fashion safe against timing and physical attacks, such as differential power analysis, timing analysis, or fault injection attacks, may lead to leakage of secret key material or state information. The exact mitigations required for timing and physical attacks also depend on the threat model in question.</t>
        <t>Regardless of the variant, the <tt>key</tt> and <tt>nonce</tt> are only required by the <tt>Init</tt> function; other functions only depend on the resulting state. Therefore, implementations can overwrite ephemeral keys with zeros right after the last <tt>Update</tt> call of the initialization function.</t>
      </section>
      <section anchor="security-guarantees">
        <name>Security Guarantees</name>
        <t>AEGIS-256 offers 256-bit message security against plaintext and state recovery, whereas AEGIS-128L offers 128-bit security.</t>
        <t>Under the assumption that the secret key is unknown to the attacker, all AEGIS variants 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="ENP19"/>, <xref target="LIMS21"/>, <xref target="JLD21"/>, <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 identifiers in the AEAD Algorithms Registry:</t>
      <ul spacing="normal">
        <li>
          <t><tt>AEAD_AEGIS128X2</tt></t>
        </li>
        <li>
          <t><tt>AEAD_AEGIS128X4</tt></t>
        </li>
        <li>
          <t><tt>AEAD_AEGIS256X2</tt></t>
        </li>
        <li>
          <t><tt>AEAD_AEGIS256X4</tt></t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references 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="ENP19">
          <front>
            <title>Analyzing the Linear Keystream Biases in AEGIS</title>
            <author initials="M." surname="Eichlseder" fullname="Maria Eichlseder">
              <organization>Graz University of Technology</organization>
            </author>
            <author initials="M." surname="Nageler" fullname="Marcel Nageler">
              <organization>Graz University of Technology</organization>
            </author>
            <author initials="R." surname="Primas" fullname="Robert Primas">
              <organization>Graz University of Technology</organization>
            </author>
            <date year="2020"/>
          </front>
          <seriesInfo name="DOI" value="10.13154/tosc.v2019.i4.348-368"/>
          <refcontent>IACR Transactions on Symmetric Cryptology, 2019(4), pp. 348–368</refcontent>
        </reference>
        <reference anchor="FLLW17" target="https://eprint.iacr.org/2017/332">
          <front>
            <title>Reforgeability of Authenticated Encryption Schemes</title>
            <author initials="C." surname="Forler" fullname="Christian Forler">
              <organization>Beuth Hochschule für Technik Berlin</organization>
            </author>
            <author initials="E." surname="List" fullname="Eik List">
              <organization>Bauhaus-Universität Weimar</organization>
            </author>
            <author initials="S." surname="Lucks" fullname="Stefan Lucks">
              <organization>Bauhaus-Universität Weimar</organization>
            </author>
            <author initials="J." surname="Wenzel" fullname="Jakob Wenzel">
              <organization>Bauhaus-Universität Weimar</organization>
            </author>
            <date year="2017"/>
          </front>
          <refcontent>Cryptology ePrint Archive, Paper 2017/332</refcontent>
        </reference>
        <reference anchor="IR23" target="https://eprint.iacr.org/2023/1495">
          <front>
            <title>Key Committing Security Analysis of AEGIS</title>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="M." surname="Rahman" fullname="Mostafizar Rahman">
              <organization>University of Hyogo</organization>
            </author>
            <date year="2023"/>
          </front>
          <refcontent>Cryptology ePrint Archive, Paper 2023/1495</refcontent>
        </reference>
        <reference anchor="JLD21">
          <front>
            <title>Guess-and-Determine Attacks on AEGIS</title>
            <author initials="L." surname="Jiao" fullname="Lin Jiao">
              <organization>State Key Laboratory of Cryptology</organization>
            </author>
            <author initials="Y." surname="Li" fullname="Yongqiang Li">
              <organization>State Key Laboratory of Information Security, Institute of Information Engineering, Chinese Academy of Sciences; School of Cyber Security, University of Chinese Academy of Sciences</organization>
            </author>
            <author initials="S." surname="Du" fullname="Shaoyu Du">
              <organization>State Key Laboratory of Cryptology</organization>
            </author>
            <date year="2021"/>
          </front>
          <seriesInfo name="DOI" value="10.1093/comjnl/bxab059"/>
          <refcontent>The Computer Journal, vol 65, 2022(8), pp. 2221–2230</refcontent>
        </reference>
        <reference anchor="LGR21" target="https://www.usenix.org/conference/usenixsecurity21/presentation/len">
          <front>
            <title>Partitioning Oracle Attacks</title>
            <author initials="J." surname="Len" fullname="Julia Len">
              <organization>Cornell Tech</organization>
            </author>
            <author initials="P." surname="Grubbs" fullname="Paul Grubbs">
              <organization>Cornell Tech</organization>
            </author>
            <author initials="T." surname="Ristenpart" fullname="Thomas Ristenpart">
              <organization>Cornell Tech</organization>
            </author>
            <date year="2021"/>
          </front>
          <refcontent>30th USENIX Security Symposium (USENIX Security 21), pp. 195–212</refcontent>
        </reference>
        <reference anchor="LIMS21">
          <front>
            <title>Weak Keys in Reduced AEGIS and Tiaoxin</title>
            <author initials="F." surname="Liu" fullname="Fukang Liu">
              <organization>East China Normal University; University of Hyogo</organization>
            </author>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo; National Institute of Information and Communications Technology; PRESTO, Japan Science and Technology Agency</organization>
            </author>
            <author initials="W." surname="Meier" fullname="Willi Meier">
              <organization>University of Applied Sciences and Arts Northwestern Switzerland</organization>
            </author>
            <author initials="K." surname="Sakamoto" fullname="Kosei Sakamoto">
              <organization>University of Hyogo</organization>
            </author>
            <date year="2021"/>
          </front>
          <seriesInfo name="DOI" value="10.46586/tosc.v2021.i2.104-139"/>
          <refcontent>IACR Transactions on Symmetric Cryptology, 2021(2), pp. 104–139</refcontent>
        </reference>
        <reference anchor="M14">
          <front>
            <title>Linear Biases in AEGIS Keystream</title>
            <author initials="B." surname="Minaud" fullname="Brice Minaud">
              <organization>ANSSI</organization>
            </author>
            <date year="2014"/>
          </front>
          <seriesInfo name="DOI" value="10.1007/978-3-319-13051-4_18"/>
          <refcontent>Selected Areas in Cryptography. SAC 2014. Lecture Notes in Computer Science, vol 8781, pp. 290–305</refcontent>
        </reference>
        <reference anchor="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/398299b8/test-vectors">
          <front>
            <title>AEGIS Test Vectors</title>
            <author>
              <organization/>
            </author>
            <date year="2024"/>
          </front>
          <refcontent>commit 398299b8</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 1918?>

<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 : 7aa41edfd57a95c1108d83c63b8d4d01

tags256: 22cdcf558d0338b6ad8fbba4da7307d3
         0bd685fff23dc9d41f598c2a7ea44055

tag256 : 55b6449929cd2b01d04786e57698b3dd
         fb5cbf6e421bbd022637a33d60f40294
]]></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 : 46a194ea4337bb32c2186a99e312f3a7

tags256: d595732bdf230a1441978414cd8cfa39
         ecef6ad0ee1e65ae530006ca5d5f4481
         f9ec5edfa64e9c3d76d3a5eda9fe5bd1
         fb9d842373f7c90bedb8bfe383740b23
         1264a15143eb8c3d9f17754099f147e3
         401c83c0d5afc70fd0d68bfd17f9280f

tag256 : ea884072699569532fb68ae9fb2653c9
         ffef3e974333d3a17d77be02453cc12f
]]></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 authenticated encryption algorithm 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>John Preuß Mattsson for his review of the draft, and for suggesting how AEGIS should be used in the context of DTLS and QUIC.</t>
        </li>
        <li>
          <t>Bart Mennink and Charlotte Lefevre as well as Takanori Isobe and Mostafizar Rahman for investigating the commitment security of the schemes specified in this document.</t>
        </li>
        <li>
          <t>Scott Fluhrer for his review of the draft as a member of the CFRG Crypto 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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
W7hzp1/PBxPfwM7RtN9hPa3HC03pAf7jfVD1lhz5NnDW94eGXvKWSNnYKHT9
2sgq2R5k7FIR+sPY+nHTjfajIRO9Qexm1fDKPU7j6PV6h6aVHw6outPiwLSF
gRTH2LG+AFr41vaVi3sff0zkdXvd2I9gCMMsa3k0pB9Rw60nicX93ui/37VR
5V5V9zbq4k7f61dHP9KOu7ooTW8xhareWEuhh3YpZbSpollJqavX16+jxL/k
OkoXse+F4n8l6yjbG3mH6yfXEee39ZPf1k9+Wz/5bf3kV7R+QjDKgal3sn4y
qu+39ZPf1k9+Wz/5bf3kZ1w/eVONtrl+0jq1q0Ft16ym8LvfVlN+rtWU+Bdf
TYnvspryEoVfdvELpgBzyhwv5t0Lt/xhmcguwZBDOvft8stLckznzRqMcGsw
vluD8d2KS9yURInGtY52MVPOuX7p7/T+EP0/bGOD19zizuQNVmN+2kIMb6i+
8zpMN+9yuApzLYR8s2WU+E2WUeJmGeV9rqJcu4DyVksi73z5Y8thD7csf8TX
L39cv+zheK3t1rtY2tja9ZuXNjb7/np737cvaYxCt9uj6TRTYhDS6iKzDR0Y
M/MKBCD2X73v3svaw1b63Lz2sEmfW8e+feXhlhWHG2nESwLK0aVPsA97YSD+
cBYGbiQveWP9wH8T8qcQv6X5RoC/i+v3vn09H4Xxf4vg/4IR/PBtI/jvInz/
UyP3Lmjfq2lrvP65u4jEAwgwNYhAJ6rQSTbdASp0Q9mUp5Z/22M3dFXRcQ7d
kTdE1a94jyOdQFPbzYbVXE3X2gzPsoEJNCXwdGX4eBIKgF45DHQyPsmHz9bo
tjF1+2H2e5szvhkfCkd7ZRYszHQWfP/EIjrWqHcMHFlj+RLsQOetrjjQwIxU
D7vMvvwVBXtpfzupKTnjoysuoMoovCH7MdDaKisq2x6gVEAVNKfuDA5nsYf5
uIM3al4uWFFIkE5+uHTnrNXni+WqPSrn1pE3V8uMt1S2e3SvPXmhmrvoJ7wZ
otqKD09xB7W055cMMD5o80X/5KNXld48A2q3d1SO/aolBsrZCHtXojGxUwlH
o5Fspvio3l0bmnVbee2YG7xsTYr7YHTmFKk+ywgNuXgliRmksKzYv55Hm7Ol
Me58kkYX9sYWdK23+5DbAUp3vuSqS5TqMbGtMxbBuE4OWbcHVnTz4mpdyqq2
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
xjFgtL+vzaAS++mKBr9qralezH+/aslDqUu980EvOSeP4iCjz/a3Zfh27HPL
BSTreeu2tDeGtak7LjKj73oVyRLKj+J8Y8v01VciI23BMy5tChTBISPbcwO7
xhvdP+ixhdWlVGTReOnZouB+vlFLDquHnevRxBY9eSZJmdLtI5bnMeLzq5qB
WTMDEH7GaN2BnEOnqOktQzGbnHHa7qna6YUd+45BW8WwLHssJdQTZ2UA/96l
h50ybl0SouTF4hVfJiWnKE4z29TQPAC2smli1fxv7hqxtkaCmFNKOUFfaUrc
cbTdajZpHUwG2lks27MWO8FisTevAXJh2FbVmXMfnRZ1V4zcQHTOnNKGFGMT
IF6d03VknIxGQuxBfGonxMfmTC41r8u7yXCSvNuzNv29zXwo73x61XXITe1o
R3UTIeqSJfirYce6oKY7l/MFIbeSbce2HJzmth0Q6IKQzRLjZhDVu3pnyVno
smwQGp9X3mbhUOZNd+tOP11nGOTunO1PmwSJun/5ISv7usWqjUS3ctIw31AL
2Nl2d47Ribw0XHBf//xWW3FjXFpNOJl8yQ6LAx/r2UWX4jLMluCL6eY2DNLc
TuduPOPEorHjzy1SCIS0zWqj5XYomJYz0sSdZnjUpXG1oLWfuTV0KokAzipQ
CLyNAYyhVJMiV3dOTaeXHF52R8i7YIDV7dvMFGXwr1cuh5s7tj/5DNJ9SbTY
mgW0ebecU7TV9oPN7Tja45zZRnE0yypsTAAHuJirz0zjQxAknFY2TkQq/fGT
J1+LFGCTTXbT5Z7HwRl+2/wN2fPs2inSC2OPUAT1iMFcbmrniFv8W9SQYZoC
+111y6nUo4OzWwbpn6DNF3/1suSHzD3Mvu2fTs27QtiSqTVAzG7D07aFKUUG
nY9BzGU9/37eLvfo++8fks/W9xqVC5Wxd8jpmw07n0EJ1nuoc08TaIZCNZ0O
rci3Z2eJRXV4Mi7HihYg3vJy4JdZY8mIt51dPkZdc1T172uIG9yUxiklerkt
Zu6eRTeWfxNWVTv9MJBgi4HsFWrsZjS1OnCxZOGyfWjcYkrxgxa0ZoKOg9hz
H+0wEgWeapKPO6G9quGU1821itw4TxEjete7dkCOalaRDEI0HeKq2msk+KBv
SG5lQT2ReKmHhPQ45Dum/viKI0vsNpDckppcUFgBXvpqksGtNoCpqigAoNeM
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
7E/+fxUgjApDLgEA

-->

</rfc>
