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

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

<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 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 in order 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 nor 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 <tt>Finalize()</tt> respectively. We follow the specification of <xref target="AEGIS"/> that is current at the time of writing, 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>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 octets (128 bits).</t>
        </li>
        <li>
          <t><tt>P_MAX</tt> (maximum length of the plaintext) is 2<sup>61</sup> octets (2<sup>64</sup> bits).</t>
        </li>
        <li>
          <t><tt>A_MAX</tt> (maximum length of the associated data) is 2<sup>61</sup> octets (2<sup>64</sup> bits).</t>
        </li>
        <li>
          <t><tt>N_MIN</tt> (minimum nonce length) = <tt>N_MAX</tt> (maximum nonce length) = 16 octets (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 octets (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 octets (256 bits).</t>
        </li>
        <li>
          <t><tt>P_MAX</tt> (maximum length of the plaintext) is 2<sup>61</sup> octets (2<sup>64</sup> bits).</t>
        </li>
        <li>
          <t><tt>A_MAX</tt> (maximum length of the associated data) is 2<sup>61</sup> octets (2<sup>64</sup> bits).</t>
        </li>
        <li>
          <t><tt>N_MIN</tt> (minimum nonce length) = <tt>N_MAX</tt> (maximum nonce length) = 32 octets (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 octets (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

Repeat(10,
    for i in 0..D:
        ctx[i] = ZeroPad(Byte(i) || Byte(D - 1), 128)
        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)

Repeat(4,
    for i in 0..D:
        ctx[i] = ZeroPad(Byte(i) || Byte(D - 1), 128)
        V[3,i] = V[3,i] ^ ctx[i]
        V[5,i] = V[5,i] ^ ctx[i]
        Update(k0_v)
        V[3,i] = V[3,i] ^ ctx[i]
        V[5,i] = V[5,i] ^ ctx[i]
        Update(k1_v)
        V[3,i] = V[3,i] ^ ctx[i]
        V[5,i] = V[5,i] ^ ctx[i]
        Update(k0n0_v)
        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.</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 bytes 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>
      <t>AEGIS-256 offers 256-bit message security against plaintext and state recovery, whereas AEGIS-128L offers 128-bit security.</t>
      <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>However, it is NOT fully committing because the authentication tag doesn’t commit to the associated data. As shown in <xref target="IR23"/>, with the ability to also alter <tt>ad</tt>, it is possible to efficiently find multiple keys that will verify the same authenticated ciphertext.</t>
      <t>Protocols mandating a fully committing scheme 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 [RFC6234].</t>
      <t>Under the assumption that the secret key is unknown to the attacker both AEGIS-128L and AEGIS-256 target 128-bit security against forgery attacks regardless of the tag size.</t>
      <t>Both algorithms <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. Failure to do so would immediately reveal the bitwise difference between two messages.</t>
      <t>If tag verification fails, the decrypted message and wrong message authentication tag <bcp14>MUST NOT</bcp14> be given as output. As shown in <xref target="VV18"/>, even a partial leak of the plaintext without verification would facilitate chosen ciphertext attacks.</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, 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, random nonces can be used with no practical limits.</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>
      <t>As shown in <xref target="D23"/>, 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.</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>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="ENP19"/>, <xref target="LIMS21"/>, <xref target="JLD21"/>, <xref target="STSI23"/>, <xref target="IR23"/>, and <xref target="BS23"/>.</t>
    </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 has also assigned the following TLS cipher suites in the TLS Cipher Suite Registry:</t>
      <table>
        <name>AEGIS entries in the TLS Cipher Suite Registry</name>
        <thead>
          <tr>
            <th align="left">Cipher Suite Name</th>
            <th align="left">Value</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>TLS_AEGIS_256_SHA384</tt></td>
            <td align="left">
              <tt>{0x13,0x06}</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>TLS_AEGIS_128L_SHA256</tt></td>
            <td align="left">
              <tt>{0x13,0x07}</tt></td>
          </tr>
        </tbody>
      </table>
      <t>A 128-bit tag length must be used with these cipher suites.</t>
      <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>
      <t>as well as the following identifiers in the TLS Cipher Suite Registry:</t>
      <ul spacing="normal">
        <li>
          <t><tt>TLS_AEGIS_128X2_SHA256</tt></t>
        </li>
        <li>
          <t><tt>TLS_AEGIS_128X4_SHA256</tt></t>
        </li>
        <li>
          <t><tt>TLS_AEGIS_256X2_SHA384</tt></t>
        </li>
        <li>
          <t><tt>TLS_AEGIS_256X4_SHA384</tt></t>
        </li>
      </ul>
    </section>
    <section anchor="quic-and-dtls-13-header-protection">
      <name>QUIC and DTLS 1.3 Header Protection</name>
      <section anchor="dtls-13-record-number-encryption">
        <name>DTLS 1.3 Record Number Encryption</name>
        <t>In DTLS 1.3, record sequence numbers are encrypted as specified in [RFC9147].</t>
        <t>For AEGIS-128L and AEGIS-256, the mask is generated using the AEGIS <tt>Stream</tt> function with:</t>
        <ul spacing="normal">
          <li>
            <t>a 128-bit tag length</t>
          </li>
          <li>
            <t><tt>sn_key</tt>, as defined in Section 4.2.3 of [RFC9147]</t>
          </li>
          <li>
            <t><tt>ciphertext[0..16]</tt>: the first 16 bytes of the DTLS ciphertext</t>
          </li>
          <li>
            <t><tt>nonce_len</tt>: the AEGIS nonce length</t>
          </li>
        </ul>
        <t>The 5-byte mask is computed as follows:</t>
        <artwork><![CDATA[
mask = Stream(5, sn_key, ZeroPad(ciphertext[0..16], nonce_len))
]]></artwork>
      </section>
      <section anchor="quic-header-protection">
        <name>QUIC Header Protection</name>
        <t>In QUIC, parts of the QUIC packet headers are encrypted as specified in [RFC9001].</t>
        <t>For AEGIS-128L and AEGIS-256, the mask is generated using the AEGIS <tt>Encrypt</tt> function with:</t>
        <ul spacing="normal">
          <li>
            <t>a 128-bit tag length</t>
          </li>
          <li>
            <t><tt>hp_key</tt>, as defined in Section 5.4 of [RFC9001]</t>
          </li>
          <li>
            <t><tt>sample</tt>: the 16 bytes QUIC ciphertext sample</t>
          </li>
          <li>
            <t><tt>nonce_len</tt>: the AEGIS nonce length</t>
          </li>
        </ul>
        <t>The mask is computed as follows:</t>
        <artwork><![CDATA[
mask = Encrypt("", "", hp_key, ZeroPad(sample, nonce_len))
]]></artwork>
      </section>
    </section>
  </middle>
  <back>
    <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>
      </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="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 1658?>

<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
        b38f43d5a5ee062

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 that 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:
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
YOfGGFsgOvIAd3t/O4f3ph7qtOvH9+bq8Y0dhM2yvd+zix7fEIdjov8G7sUP
cGbwL8ya3zCRJL1I+EVKL4ilNkj4piUh4B1VtiIJ+SakP6nQiqr9Rkw2KQzj
+VHAn8DyUdkeoNcj8sMqbpC/taoj3L0bc+8kv35L8t+ApKMp2JquHkf9NFOg
324KqNQe0/z25M2l0/Bmaxo8ONmejSFqGU2Kf7Frbi5dbDnR82um56brMeNJ
nI8hAYepOMC0MXltucEqEa2u4vt3Pm8tcNXzFrjeZBbfzIce7nDuCKXOCRO+
Qjuvttt5M27Hs4Mr3DvIb+ajiW9h58a032Cla8ALbekR/uNTOs2O/eBdyGvo
A4393h0xrk2j0Pdra7/H7vBgv0lgOIydH7fd6D4aM9FbRGNWLa/c4g0Wg17f
pmnlhyOq3u5wYNbBQIpM3Ha+AFp40QZ/KaR8N/iwW5/xJ7zJmWAcw3zrGDWi
H3HLssepA//Bxn8fdkHhQVW3turint8aVkc/sp7F+uDLYK2Dqt5a6qCHbqVj
4xRBu9DR1G8uX+ZIfslljmGIvQ+l/7bMcSldflvm+G2Z47dljt+WOX7hZQ7C
Rh4hvZNljo36flvm+G2Z47dljl9cxfy6lzneVkdtL3N0vudqVNslix787rdF
j59r0SP5xRc9kpsserxE4Zd9mIEpwJwyx4t5/8KvUjgmcisl5DLOQ7dK8pJc
x3m7VCL8Uknol0pCvzCStCVRovWA4z3MlPeBX4a3B3+I4R+usdFrbvH25C0W
TX7YegmfI77xckk/72q8WHIp+Hu71Y7kbVY7kna146dc7Lh0neNHrVy881WK
HfkHrlmlSC5fpbh8dcLzWtetd7ECsbPrV69AbPf9ze6+71552Iiw7g5600yJ
UdCpD6C2dGAUzAsFAM1/C775SZYIdtLn6iWCbfpcO/bdCwTXLAxcSSOO3GtP
lyHB3u/4ffL+xO+vJC/5V8P4fBuZp0i8o/lWHL4Pvw++fTPfiLb/Fmj/BQPt
0Y8NtL+zKPsPDbD72Pqgpp1h9Wc+UQtnomlACcomQslm+uQhdG3ElOeXf9tn
n3NVUwaDPisNkfYLPilI2Vcad2SvnuvpmnItDbINEAaxFUB1bTk1B8UvLzwQ
Ot7MisTpJPrDQP2pkoPBEYcvN9OL0YmTBUs05VYeZtLhQfYJxcgkq5fgCfMK
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

-->

</rfc>
