<?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.18 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-aegis-aead-11" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.22.0 -->
  <front>
    <title>The AEGIS Family of Authenticated Encryption Algorithms</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-aegis-aead-11"/>
    <author initials="F." surname="Denis" fullname="Frank Denis">
      <organization>Fastly Inc.</organization>
      <address>
        <email>fde@00f.net</email>
      </address>
    </author>
    <author initials="S." surname="Lucas" fullname="Samuel Lucas">
      <organization>Individual Contributor</organization>
      <address>
        <email>samuel-lucas6@pm.me</email>
      </address>
    </author>
    <date year="2024" month="July" day="21"/>
    <workgroup>Crypto Forum</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 241?>

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

<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 as additional finalists for high-performance applications in the Competition for Authenticated Encryption: Security, Applicability, and Robustness (CAESAR). Whilst AEGIS-128 was selected as a winner for this use case, AEGIS-128L has a better security margin alongside improved performance and AEGIS-256 uses a 256-bit key <xref target="LIMS21"/>. All variants of AEGIS are inverse-free and constructed from the AES encryption round function <xref target="FIPS-AES"/>. This document specifies:</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>The AEGIS cipher family offers performance that significantly exceeds that of AES-GCM with hardware support for parallelizable AES block encryption <xref target="AEGIS"/>. Similarly, software implementations can also be faster, although to a lesser extent.</t>
      <t>Unlike with AES-GCM, nonces can be safely chosen at random with no practical limit when using AEGIS-256 and AEGIS-256X. AEGIS-128L and AEGIS-128X also allow for more messages to be safely encrypted when using random nonces.</t>
      <t>With some existing AEAD schemes, such as AES-GCM, an attacker can generate a ciphertext that successfully decrypts under multiple different keys (a partitioning oracle attack) <xref target="LGR21"/>. This ability to craft a (ciphertext, authentication tag) pair that verifies under multiple keys significantly reduces the number of required interactions with the oracle to perform an exhaustive search, making it practical if the key space is small. For example, with password-based encryption, an attacker can guess a large number of passwords at a time by recursively submitting such a ciphertext to an oracle, which speeds up a password search by reducing it to a binary search.</t>
      <t>In AEGIS, finding distinct (key, nonce) pairs that successfully decrypt a given (associated data, ciphertext, authentication tag) tuple is believed to have a complexity that depends on the tag size. A 128-bit tag provides 64-bit committing security, which is generally acceptable for interactive protocols. With a 256-bit tag, finding a collision becomes impractical.</t>
      <t>Unlike most other AES-based AEAD constructions, leaking a state does not leak the key or previous states.</t>
      <t>Finally, an AEGIS key is not required after the setup phase, and there is no key schedule. Thus, ephemeral keys can be erased from memory before any data has been encrypted or decrypted, mitigating cold boot attacks.</t>
      <t>Note that an earlier version of Hongjun Wu and Bart Preneel’s paper introducing AEGIS specified AEGIS-128L and AEGIS-256 sporting differences with regards to the computation of the authentication tag and the number of rounds in the <tt>Finalize()</tt> function. We follow the specification of <xref target="AEGIS"/>, which can be found in the References section of this document.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words “<bcp14>MUST</bcp14>”, “<bcp14>MUST NOT</bcp14>”, “<bcp14>REQUIRED</bcp14>”, “<bcp14>SHALL</bcp14>”, “<bcp14>SHALL
NOT</bcp14>”, “<bcp14>SHOULD</bcp14>”, “<bcp14>SHOULD NOT</bcp14>”, “<bcp14>RECOMMENDED</bcp14>”, “<bcp14>NOT RECOMMENDED</bcp14>”,
“<bcp14>MAY</bcp14>”, and “<bcp14>OPTIONAL</bcp14>” in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

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

ct = {}

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

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

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

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

msg = {}

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

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

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

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

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

if CtEq(tag, expected_tag) is False:
    erase msg
    return "verification failed" error
else:
    return msg
]]></artwork>
      </section>
      <section anchor="the-init-function">
        <name>The Init Function</name>
        <artwork><![CDATA[
Init(key, nonce)
]]></artwork>
        <t>The <tt>Init</tt> function constructs the initial state <tt>{S0, ...S7}</tt> using the given <tt>key</tt> and <tt>nonce</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Defines:</t>
        <ul spacing="normal">
          <li>
            <t><tt>{S0, ...S7}</tt>: the initial state.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
S0 = key ^ nonce
S1 = C1
S2 = C0
S3 = C1
S4 = key ^ nonce
S5 = key ^ C0
S6 = key ^ C1
S7 = key ^ C0

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

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

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

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

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

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

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

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

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

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

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

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

Repeat(7, Update(t, t))

if tag_length == 16: # 128 bits
    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> bytes (2<sup>64</sup> bits).</t>
        </li>
        <li>
          <t><tt>A_MAX</tt> (maximum length of the associated data) is 2<sup>61</sup> bytes (2<sup>64</sup> bits).</t>
        </li>
        <li>
          <t><tt>N_MIN</tt> (minimum nonce length) = <tt>N_MAX</tt> (maximum nonce length) = 32 bytes (256 bits).</t>
        </li>
        <li>
          <t><tt>C_MAX</tt> (maximum ciphertext length) = <tt>P_MAX</tt> + tag length = 2<sup>61</sup> + 16 or 32 bytes (2<sup>64</sup> + 128 or 256 bits).</t>
        </li>
      </ul>
      <t>Distinct associated data inputs, as described in <xref section="3" sectionFormat="comma" target="RFC5116"/> shall be unambiguously encoded as a single input.
It is up to the application to create a structure in the associated data input if needed.</t>
      <section anchor="authenticated-encryption-1">
        <name>Authenticated Encryption</name>
        <artwork><![CDATA[
Encrypt(msg, ad, key, nonce)
]]></artwork>
        <t>The <tt>Encrypt</tt> function encrypts a message and returns the ciphertext along with an authentication tag that verifies the authenticity of the message and associated data, if provided.</t>
        <t>Security:</t>
        <ul spacing="normal">
          <li>
            <t>For a given key, the nonce <bcp14>MUST NOT</bcp14> be reused under any circumstances; doing so allows an attacker to recover the internal state.</t>
          </li>
          <li>
            <t>The key <bcp14>MUST</bcp14> be randomly chosen from a uniform distribution.</t>
          </li>
        </ul>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>msg</tt>: the message to be encrypted (length <bcp14>MUST</bcp14> be less than <tt>P_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than <tt>A_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ct</tt>: the ciphertext.</t>
          </li>
          <li>
            <t><tt>tag</tt>: the authentication tag.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

ct = {}

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

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

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

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

msg = {}

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

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

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

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

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

if CtEq(tag, expected_tag) is False:
    erase msg
    return "verification failed" error
else:
    return msg
]]></artwork>
      </section>
      <section anchor="the-init-function-1">
        <name>The Init Function</name>
        <artwork><![CDATA[
Init(key, nonce)
]]></artwork>
        <t>The <tt>Init</tt> function constructs the initial state <tt>{S0, ...S5}</tt> using the given <tt>key</tt> and <tt>nonce</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Defines:</t>
        <ul spacing="normal">
          <li>
            <t><tt>{S0, ...S5}</tt>: the initial state.</t>
          </li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
k0, k1 = Split(key, 128)
n0, n1 = Split(nonce, 128)

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

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

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

Update(xi)

ci = xi ^ z

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

xi = ci ^ z

Update(xi)

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

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

xn = Truncate(out, |cn|)

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

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

Repeat(7, Update(t))

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

ct = {}

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

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

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

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

msg = {}

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

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

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

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

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

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

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

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

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

    Update(nonce_v, key_v)
)
]]></artwork>
        </section>
        <section anchor="the-update-function-2">
          <name>The Update Function</name>
          <artwork><![CDATA[
Update(M0, M1)
]]></artwork>
          <t>The AEGIS-128X <tt>Update</tt> function is similar to the AEGIS-128L <tt>Update</tt> function, but absorbs <tt>R</tt> (<tt>2 * 128 * D</tt>) bits at once. <tt>M0</tt> and <tt>M1</tt> are <tt>128 * D</tt> bits instead of 128 bits but are split into 128-bit blocks, each of them updating a different AEGIS-128L state.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
m0 = Split(M0, 128)
m1 = Split(M1, 128)

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

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

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

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

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

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

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

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

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

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

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

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

Repeat(7, Update(t, t))

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

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

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

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

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

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

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

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

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

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

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

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

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

Update(xi)

ci = xi ^ z

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

xi = ci ^ z

Update(xi)

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

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

xn = Truncate(out, |cn|)

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

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

Repeat(7, Update(t))

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

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

return tag
]]></artwork>
        </section>
      </section>
      <section anchor="implementation-considerations">
        <name>Implementation Considerations</name>
        <t>AEGIS-128X and AEGIS-256X with a degree of <tt>1</tt> are identical to AEGIS-128L and AEGIS-256. This property can be used to reduce the code size of a generic implementation.</t>
        <t>In AEGIS-128X, <tt>V</tt> can be represented as eight 256-bit registers (when <tt>D = 2</tt>) or eight 512-bit registers (when <tt>D = 4</tt>). In AEGIS-256X, <tt>V</tt> can be represented as six 256-bit registers (when <tt>D = 2</tt>) or six 512-bit registers (when <tt>D = 4</tt>). With this representation, loops over <tt>0..D</tt> in the above pseudocode can be replaced by vector instructions.</t>
      </section>
      <section anchor="operational-considerations">
        <name>Operational Considerations</name>
        <t>The AEGIS parallel modes are specialized and can only improve performance on specific CPUs.</t>
        <t>The degrees of parallelism implementations are encouraged to support are <tt>2</tt> (for CPUs with 256-bit registers) and <tt>4</tt> (for CPUs with 512-bit registers). The resulting algorithms are called <tt>AEGIS-128X2</tt>, <tt>AEGIS-128X4</tt>, <tt>AEGIS-256X2</tt>, and <tt>AEGIS-256X4</tt>.</t>
        <t>The following table summarizes how many bits are processed in parallel (rate), the memory requirements (state size), and the minimum vector register sizes a CPU should support for optimal performance.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Algorithm</th>
              <th align="right">Rate (bits)</th>
              <th align="center">Optimal Register Size</th>
              <th align="right">State Size (bits)</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">AEGIS-128L</td>
              <td align="right">256</td>
              <td align="center">128 bits</td>
              <td align="right">1024</td>
            </tr>
            <tr>
              <td align="left">AEGIS-128X2</td>
              <td align="right">512</td>
              <td align="center">256 bits</td>
              <td align="right">2048</td>
            </tr>
            <tr>
              <td align="left">AEGIS-128X4</td>
              <td align="right">1024</td>
              <td align="center">512 bits</td>
              <td align="right">4096</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256</td>
              <td align="right">128</td>
              <td align="center">128 bits</td>
              <td align="right">768</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256X2</td>
              <td align="right">256</td>
              <td align="center">256 bits</td>
              <td align="right">1536</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256X4</td>
              <td align="right">512</td>
              <td align="center">512 bits</td>
              <td align="right">3072</td>
            </tr>
          </tbody>
        </table>
        <t>Note that architectures with smaller vector registers but with many registers and large pipelines may still benefit from the parallel modes.</t>
        <t>Protocols <bcp14>SHOULD</bcp14> opt for a parallel mode only when all the involved parties agree on a specific variant. AEGIS-128L and AEGIS-256 <bcp14>SHOULD</bcp14> remain the default choices.</t>
        <t>Implementations <bcp14>MAY</bcp14> choose not to include the parallel AEGIS modes.</t>
      </section>
    </section>
    <section anchor="encoding-ct-tag-tuples">
      <name>Encoding (ct, tag) Tuples</name>
      <t>Applications <bcp14>MAY</bcp14> keep the ciphertext and the authentication tag in distinct structures or encode both as a single string.</t>
      <t>In the latter case, the tag <bcp14>MUST</bcp14> immediately follow the ciphertext:</t>
      <artwork><![CDATA[
combined_ct = ct || tag
]]></artwork>
    </section>
    <section anchor="aegis-as-a-stream-cipher">
      <name>AEGIS as a Stream Cipher</name>
      <t>All AEGIS variants can also be used as stream ciphers.</t>
      <artwork><![CDATA[
Stream(len, key, nonce)
]]></artwork>
      <t>The <tt>Stream</tt> function expands a key and an optional nonce into a variable-length, secure keystream.</t>
      <t>Inputs:</t>
      <ul spacing="normal">
        <li>
          <t><tt>len</tt>: the length of the keystream to generate in bits.</t>
        </li>
        <li>
          <t><tt>key</tt>: the AEGIS key.</t>
        </li>
        <li>
          <t><tt>nonce</tt>: the nonce. If unspecified, it is set to <tt>N_MAX</tt> zero bytes.</t>
        </li>
      </ul>
      <t>Outputs:</t>
      <ul spacing="normal">
        <li>
          <t><tt>stream</tt>: the keystream.</t>
        </li>
      </ul>
      <t>Steps:</t>
      <artwork><![CDATA[
stream, tag = Encrypt(ZeroPad({}, len), {}, key, nonce)

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

<section anchor="test-vectors">
      <name>Test Vectors</name>
      <section anchor="aesround-test-vector">
        <name>AESRound Test Vector</name>
        <artwork><![CDATA[
in   : 000102030405060708090a0b0c0d0e0f

rk   : 101112131415161718191a1b1c1d1e1f

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

M0   : 033e6975b94816879e42917650955aa0
M1   : 033e6975b94816879e42917650955aa0

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

nonce : 10000200000000000000000000000000

ad    :

msg   : 00000000000000000000000000000000

ct    : c1c0e58bd913006feba00f4b3cc3594e

tag128: abe0ece80c24868a226a35d16bdae37a

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

nonce : 10000200000000000000000000000000

ad    :

msg   :

ct    :

tag128: c2b879a67def9d74e6c14f708bbcc9b4

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

ct    : 79d94593d8c2119d7e8fd9b8fc77845c
        5c077a05b2528b6ac54b563aed8efe84

tag128: cc6f3372f6aa1bb82388d695c3962d9a

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f
        20212223242526272829

msg   : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f
        3031323334353637

ct    : b31052ad1cca4e291abcf2df3502e6bd
        b1bfd6db36798be3607b1f94d34478aa
        7ede7f7a990fec10

tag128: 7542a745733014f9474417b337399507

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

nonce : 10010000000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc78

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050608

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 6c04b3dba849b2701effbe32c7f0fab8

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    :

msg   : 00000000000000000000000000000000

ct    : 754fc3d8c973246dcc6d741412a4b236

tag128: 3fe91994768b332ed7f570a19ec5896e

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    :

msg   :

ct    :

tag128: e3def978a0f054afd1e761d7553afba3

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

ct    : f373079ed84b2709faee373584585d60
        accd191db310ef5d8b11833df9dec711

tag128: 8d86f91ee606e9ff26a01b64ccbdd91d

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f
        20212223242526272829

msg   : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f
        3031323334353637

ct    : 57754a7d09963e7c787583a2e7b859bb
        24fa1e04d49fd550b2511a358e3bca25
        2a9b1b8b30cc4a67

tag128: ab8a7d53fd0e98d727accca94925e128

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

nonce : 10010000000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358459

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050608

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215653

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

nonce : 101112131415161718191a1b1c1d1e1f

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

nonce : 101112131415161718191a1b1c1d1e1f

ad    :

msg   :

ct    :

tag128: 63117dc57756e402819a82e13eca8379

tag256: b92c71fdbd358b8a4de70b27631ace90
        cffd9b9cfba82028412bac41b4f53759
]]></artwork>
        </section>
        <section anchor="test-vector-2-2">
          <name>Test Vector 2</name>
          <artwork><![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
]]></artwork>
        </section>
      </section>
      <section anchor="aegis-128x4-test-vectors">
        <name>AEGIS-128X4 Test Vectors</name>
        <section anchor="initial-state-1">
          <name>Initial State</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f

nonce : 101112131415161718191a1b1c1d1e1f

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

nonce : 101112131415161718191a1b1c1d1e1f

ad    :

msg   :

ct    :

tag128: 5bef762d0947c00455b97bb3af30dfa3

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

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

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

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ad    :

msg   :

ct    :

tag128: 62cdbab084c83dacdb945bb446f049c8

tag256: 25d7e799b49a80354c3f881ac2f1027f
        471a5d293052bd9997abd3ae84014bb7
]]></artwork>
        </section>
        <section anchor="test-vector-2-4">
          <name>Test Vector 2</name>
          <artwork><![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
]]></artwork>
        </section>
      </section>
      <section anchor="aegis-256x4-test-vectors">
        <name>AEGIS-256X4 Test Vectors</name>
        <section anchor="initial-state-3">
          <name>Initial State</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

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

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ad    :

msg   :

ct    :

tag128: 3b7fee6cee7bf17888ad11ed2397beb4

tag256: 6093a1a8aab20ec635dc1ca71745b01b
        5bec4fc444c9ffbebd710d4a34d20eaf
]]></artwork>
        </section>
        <section anchor="test-vector-2-5">
          <name>Test Vector 2</name>
          <artwork><![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
]]></artwork>
        </section>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The AEGIS authenticated encryption algorithm was invented by Hongjun Wu and Bart Preneel.</t>
      <t>The round function leverages the AES permutation invented by Joan Daemen and Vincent Rijmen. They also authored the Pelican MAC, which partly motivated the design of the AEGIS MAC.</t>
      <t>We would like to thank the following individuals for their contributions:</t>
      <ul spacing="normal">
        <li>
          <t>Eric Lagergren and Daniel Bleichenbacher for catching a broken test vector and Daniel Bleichenbacher for many helpful suggestions.</t>
        </li>
        <li>
          <t>John Preuß Mattsson for his review of the draft, and for suggesting how AEGIS should be used in the context of DTLS and QUIC.</t>
        </li>
        <li>
          <t>Bart Mennink and Charlotte Lefevre as well as Takanori Isobe and Mostafizar Rahman for investigating the commitment security of the schemes specified in this document.</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAG28nGYAA+296XYcx7Uu+L+eIlte65j0AcCMnJM+OudCHCzIJMUDUIPb
yxYiIyKBFKuy4MoqktDgdX/e//0A3f2zX6PP3/sU/ST97R2RYxUGSpRM+UrL
BoHMyBh27OHbOyJ27O/vz9bVem7uex+8ODfe4aM/HJ14j+Wiml96y9I73KzP
Tb2ulFwb7T2q1eryYl0ta+9wfrZcVevzRfPBTC9VLReoQq9kud6vVutyX5Wr
s31pzqoGP6XeF2JGdeCjy/teVZfL2ay6WN331qtNsw58P/eD2Utz+Xq50ve9
o3ptVrVZ7z+kCmd4+PJstdxc3PceUPtL7/FytVnMmk2xqJoG3XlxeYHmj45f
PJ7NmrWs9Vdyvqzx6NI0s2YhV+uv/rZZrk1jn1xU970/r5dqz2uWq/XKlA1+
u1zQL3+ZzSTGvFzdn3n7Mw//2aE9Xsn6pffQ1FXDT5erM1lX30giBt7KZg2C
HdXqgN+ahazm971Sm//m++UBhjKu7UQuNmbuPdkouau6o1pXryq9kXPvwbJe
r6pis16uhjU3XMH+nCpI/tvF4mBhQFCQdbVAHa/M/RlK82Te58/aObaPvEPu
8S1m17vzShyIux9wJa9MvUElDw4fnRweo2eLC4N6Ud42IVdnZn3fO1+vL5r7
9+6p/n1zoFYHlxcH6+U9TGOtw3vMGa+EOLjQJX/dEZ3/23f/emAVzNnHB94X
m+6RJeHHy/rs6009fAEi3veeyfpS1mfeC6PO6+V8eYbRzb3PahBl1VTry90t
fHTgPV+Z2pj5pJmPwDtbr7ihP37mPTEb0IQfa5Dwvhf4IiHKf3QShGPCn1T1
2dzs/21jVpfef25kvd4svI8rrU3tnZxXJSZjvZbqZWNJvVL4xjI7hnDpmeer
qkaZlTrHQPa85/LCrNBcEN4ToZ98sHMGzAV9dFBJUB9dvtcVv5niXx54Hy1r
8K2s6glFvpSvKrS9/Zqp0hH6v/4fTxvvyXK1Qhn0+MGz45M9cPaqknvek0+P
jw53t3x44J2o89VyvTb1fHluVpPmD2u9Qt1XlNnVh2ODnjaTHhwdH50cjmYu
CGnmHk4n7lBrTJ23WK6MdyFXcj4386pZeNBC605hypEgmV6Q5EBNvuW8xkH4
FtOK0jfP6uODgQbrSTrVbR0hp2ptTKpHz56LfEKsWs4vvyF6EW2eYOLlyvuj
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

-->

</rfc>
