<?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-15" 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-15"/>
    <author initials="F." surname="Denis" fullname="Frank Denis">
      <organization>Fastly Inc.</organization>
      <address>
        <email>fde@00f.net</email>
      </address>
    </author>
    <author initials="S." surname="Lucas" fullname="Samuel Lucas">
      <organization>Individual Contributor</organization>
      <address>
        <email>samuel-lucas6@pm.me</email>
      </address>
    </author>
    <date year="2025" month="January" day="10"/>
    <workgroup>Crypto Forum</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 295?>

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

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

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

ct = {}

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

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

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

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

msg = {}

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

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

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

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

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

if CtEq(tag, expected_tag) is False:
    erase msg
    erase expected_tag
    return "verification failed" error
else:
    return msg
]]></artwork>
      </section>
      <section anchor="the-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 = S1 ^ S6 ^ (S2 & S3)
z1 = S2 ^ S5 ^ (S6 & S7)

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

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

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

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

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

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

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

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

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

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

Repeat(7, Update(t, t))

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

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

ct = {}

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

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

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

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

msg = {}

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

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

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

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

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

if CtEq(tag, expected_tag) is False:
    erase msg
    erase expected_tag
    return "verification failed" error
else:
    return msg
]]></artwork>
      </section>
      <section anchor="the-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 128-bit block to be absorbed.</t>
          </li>
        </ul>
        <t>Modifies:</t>
        <ul spacing="normal">
          <li>
            <t><tt>{S0, ...S5}</tt>: the state.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
S'0 = AESRound(S5, S0 ^ M)
S'1 = AESRound(S0, S1)
S'2 = AESRound(S1, S2)
S'3 = AESRound(S2, S3)
S'4 = AESRound(S3, S4)
S'5 = AESRound(S4, S5)

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

Update(xi)

ci = xi ^ z

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

xi = ci ^ z

Update(xi)

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

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

xn = Truncate(out, |cn|)

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

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

Repeat(7, Update(t))

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

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

ct = {}

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

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

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

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

msg = {}

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

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

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

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

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

if CtEq(tag, expected_tag) is False:
    erase msg
    erase expected_tag
    return "verification failed" error
else:
    return msg
]]></artwork>
      </section>
      <section anchor="aegis-128x">
        <name>AEGIS-128X</name>
        <section anchor="the-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_len_bits == 128:
    tag = ZeroPad({}, 128)
    for i in 0..D:
        ti = V[0,i] ^ V[1,i] ^ V[2,i] ^ V[3,i] ^ V[4,i] ^ V[5,i] ^ V[6,i]
        tag = tag ^ ti

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

return tag
]]></artwork>
        </section>
      </section>
      <section anchor="aegis-256x">
        <name>AEGIS-256X</name>
        <section anchor="the-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_len_bits == 128:
    tag = ZeroPad({}, 128)
    for i in 0..D:
        ti = V[0,i] ^ V[1,i] ^ V[2,i] ^ V[3,i] ^ V[4,i] ^ V[5,i]
        tag = tag ^ ti

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

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

Repeat(7, Update(t, t))

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

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

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

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

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

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

Repeat(7, Update(t))

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

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

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

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

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

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

<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 family of authenticated encryption algorithms was invented by Hongjun Wu and Bart Preneel.</t>
      <t>The state update function leverages the AES permutation invented by Joan Daemen and Vincent Rijmen. They also authored the Pelican MAC, which partly motivated the design of the AEGIS MAC.</t>
      <t>We would like to thank the following individuals for their contributions:</t>
      <ul spacing="normal">
        <li>
          <t>Eric Lagergren and Daniel Bleichenbacher for catching a broken test vector, and Daniel Bleichenbacher for many helpful suggestions.</t>
        </li>
        <li>
          <t>Soatok Dreamseeker for his early review of the draft and for suggesting the addition of negative test vectors.</t>
        </li>
        <li>
          <t>John Preuß Mattsson for his review of the draft and for suggesting how AEGIS should be used in the context of DTLS and QUIC.</t>
        </li>
        <li>
          <t>Bart Mennink and Charlotte Lefevre, as well as Takanori Isobe and Mostafizar Rahman, for investigating the committing security of the schemes specified in this document.</t>
        </li>
        <li>
          <t>Scott Fluhrer for his review of the draft as a member of the CFRG Crypto Review Panel.</t>
        </li>
        <li>
          <t>Yawning Angel, Chris Barber, and Neil Madden for their review of the draft.</t>
        </li>
        <li>
          <t>Gilles Van Assche for reviewing the draft and providing insightful comments on the implications of nonce reuse in AEGIS-128X and AEGIS-256X.</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
ccy3JtywveS9S6QNw6Rx1Lwjc7bpFPp+ba1I2Z107FeoDIex8+O2G91HYyF6
g1zOqpWVW7wEZNDr28RWfjii6u0OB2YdDKS8xm0XIqCFrmzw8cdEW79vjWML
xi9OaFlAI/oRt6J6nDrQHwz++12XXh5Uc2urHu7trWFV9CPrxapP1wymVajq
rVkVeugmVTY2R7RzKk39+vIZleQXnVHpc/eDpPxvMyrjApcR6bcZld9mVH6b
UfltRuVXNKNCQMrDqXcyo7JR328zKr/NqPw2o/LbjMrPMaPypqZse0ali2dX
o9oumV/hd7/Nr/zC8yvJLz6/ktxkfuUFCr/oMxpMARagOV7M+xd+QsTJlpuU
oUh1HroJmRcUsc7bWRnhZ2VCPysT+jmYpC2JEm2wHe+BUz7cfhHeHvwhhn+4
xkavucXbkzeYn/lpUzO8c/rGMzM939V4XuZSSPnTJliSN5lgSdoJlvc5v3Lp
1MpbTZa884mRHac6XDMxklw+MbKjsg1WeNnruvcuJj92DuHqyY/tMby+egy7
Jz/astdMfnQJ3LhP1rZZ3JYijK55tgJg/K/Bd+9lnmInpa6ep9im1A1Gv3ue
oi1/zTzFldTiiQTtKTQk3Yc9nZB8ONMJV5KXIrjhdEE7UUATA47mW9MC/WzA
4NvX843k/295/18w7x+9bd7/rZP+PyXf71P9g1p2Zvmf+WtIAiAD22D0dK4K
nWfTH6NC95NNmaf82z5HrauajnToD74hcn7F+yTpHJrG7Vd0W0ft+EQb+EVb
AWzXlg8poWzphQdIx5vn+PAJG/02qH4/zcFgc8c3m0fC0V6bxbk7Mmt8XhEd
ajQ4BI5ctHoBOaDTVleclWAJasZd5gTARdCcKR/PN2rGx1ecw4ZRLkQNE6aN
s1JUtjs+qYQNaM/eGR3R4o708YdvNDzHsKL8IZ3+8NKfstacLZar7sCca0fe
XiyzuSuz29h76ekL9dynSmnnJZFtxWeo+PNaukNMRhEAiPPF8ACkV7XZPgJq
b3Cig/uqowbKuXx8X6J1dFOFMKTVaSb5Rr17LpHr9wO7Qbdo2jkT/8HGkVNk
9JwktPTiCSiWkNLJ4vB2HmNPl9b6Q0paKzgYm+xb73a2dwNU/njJVb+waiDF
rs5EyM06OcHdnXPTMaatdanqxlUa+/E4l4myqu8NH+GFSGRp/QHx7fzFUKM6
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
SE1xKMw/T3G1S8WdOYCPqikLYNaMKLtVwcONGq0t37GpsAt3lrZfKGkH58W2
Brc1ovTRwWQM1I6PH8m4yy4MMh7NTvOs9FkN6Q9m7r46eL9rLTRGOYIwvcXu
vJmDL7afEx4nx7mj/Jw6+v33T0TsfmkNFf3+4OkzGbpfHz96ciyF+/2Pj+9L
6X49fo6xRu73Nqfy/fefHLe/HT76/OjYEYN0u6MNp74fHT493Ep780NWgaa9
JmC0FagH/d0h3RRV9btsGr+ZZklLQoe7b56SAaFtFY/u0z+T7b0xfrsMvzuh
Wr9lCpFlO8G7k0iebL4Dd08CfhfRu+/vAq2tpvbjjxzNKcNHVuCann70ox+4
j6Gh2U6r3akxHkL5fHgL4GjDq6+eE3iV7bY6u8lfMkId5h7PO7SN8RL9UYvd
Zqcx2W84kN0k9zTfRXJP8x0k/4aIzdNqO97Fl7xzW8oufzf4rmfVk7rhbPkb
s4ywey+PHPxQCsZf+9XKr4fNTHJKuS6JATTmEjrLV33TGexf8Y6dZmvnG71z
u3ncxCtzrA/Y0cs/Hn/xNHCAiBza998/f3D8fP+rB/eef3F0TIijNequzJ47
DN5tH3F1buzY5Arb95RUhfHpEy9niFZg53nbmvUbYtrVtC48Gw6IlxPwKPb9
KCbochDcDcIwFKEMozAOkzANszAPi1CFZahDE9qwmkyWL7igCIUQUkQiFolI
RSZyUQglSqGFEVagIMEpFMxUVsY2SaM8y2USpyrXYZxlKipzEVVxtH2I8+MN
2lMqyZ8ac/UY6BY0tFiUmU3DUsZa51lkVV7EVuswK4QI40JFfEcaykVRWNow
r6IkCsNKKWnLqkBvQyOzOE1yvkGNRlCWJimNLPF1lZVFmYhEVzKtSptlSar5
fjWU01GiUFGSoMlUR3meWp3YQuZVnplS5Hz7GvXPllqrSts806qM4zQqUh1H
UZwUUhcgHd3NhnJJbvLIRqKCjkSZwJgqnZalTDIh4jQUk+PUsQIVlElqVSSl
zvMkzZXI0P+kRG2JsZPjjMulcZiLvKrKJDM6rEotbSaVLdBwZqNCTSZPHAHD
KLJpkSVlEecizbPCxrKgKsMiSZQKJ08cASutRYHW4hQUL7I8FaVJbV6oKlUq
Sap2T4Zj3t1Jy6CkSFWZgTUxRq1VKGSms6hKwyRKs7QwLYOyIoyKOIyFiozE
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
xC8BAA==

-->

</rfc>
