<?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.4 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-aegis-aead-09" 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-09"/>
    <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="December" day="05"/>
    <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 the <tt>Finalize()</tt> function. We follow the specification of <xref target="AEGIS"/>, which can be found in the References section of this document.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words “<bcp14>MUST</bcp14>”, “<bcp14>MUST NOT</bcp14>”, “<bcp14>REQUIRED</bcp14>”, “<bcp14>SHALL</bcp14>”, “<bcp14>SHALL
NOT</bcp14>”, “<bcp14>SHOULD</bcp14>”, “<bcp14>SHOULD NOT</bcp14>”, “<bcp14>RECOMMENDED</bcp14>”, “<bcp14>NOT RECOMMENDED</bcp14>”,
“<bcp14>MAY</bcp14>”, and “<bcp14>OPTIONAL</bcp14>” in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

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

ct = {}

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

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

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

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

msg = {}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Repeat(7, Update(t, t))

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

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

ct = {}

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

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

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

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

msg = {}

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

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

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

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

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

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

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

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

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

Update(xi)

ci = xi ^ z

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

xi = ci ^ z

Update(xi)

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

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

xn = Truncate(out, |cn|)

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

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

Repeat(7, Update(t))

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

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

ct = {}

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

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

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

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

msg = {}

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

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

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

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

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

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

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

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 <xref target="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>For the same <tt>(key, nonce, ad, msg)</tt> tuple, a different degree of parallelism in AEGIS-128X and AEGIS-256X can produce a different <tt>ct</tt> and <tt>tag</tt>. Furthermore, different <tt>ad</tt> with the same <tt>(key, nonce, msg)</tt> can produce a different <tt>ct</tt> and <tt>tag</tt> with all variants. However, as the <tt>ad</tt> and <tt>msg</tt> are absorbed into the state identically in that order, this does not necessarily hold when the <tt>msg</tt> changes.</t>
      <t>Each variant can be used as a MAC by calling the <tt>Encrypt()</tt> function with the message as the <tt>ad</tt> and leaving <tt>msg</tt> empty, resulting in just a tag. However, they <bcp14>MUST NOT</bcp14> be used as a hash function; if the key is known, inputs generating state collisions can easily be crafted. Similarly, as opposed to hash-based MACs, tags <bcp14>MUST NOT</bcp14> be used for key derivation as there is no proof they are uniformly random.</t>
      <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 is requested to update the references of these entries to refer to the final version of this document.</t>
      <t>IANA is also requested to register the following identifiers in the AEAD Algorithms Registry:</t>
      <ul spacing="normal">
        <li>
          <t><tt>AEAD_AEGIS128X2</tt></t>
        </li>
        <li>
          <t><tt>AEAD_AEGIS128X4</tt></t>
        </li>
        <li>
          <t><tt>AEAD_AEGIS256X2</tt></t>
        </li>
        <li>
          <t><tt>AEAD_AEGIS256X4</tt></t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="FIPS-AES" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197.pdf">
          <front>
            <title>Advanced encryption standard (AES)</title>
            <author>
              <organization abbrev="NIST">National Institute of Standards and Technology</organization>
              <address>
                <postal>
                  <country>US</country>
                  <city>Gaithersburg</city>
                </postal>
              </address>
            </author>
            <date month="November" year="2001"/>
          </front>
          <seriesInfo name="NIST Federal Information Processing Standards Publications" value="197"/>
          <seriesInfo name="DOI" value="10.6028/NIST.FIPS.197"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC5116">
          <front>
            <title>An Interface and Algorithms for Authenticated Encryption</title>
            <author fullname="D. McGrew" initials="D." surname="McGrew"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>This document defines algorithms for Authenticated Encryption with Associated Data (AEAD), and defines a uniform interface and a registry for such algorithms. The interface and registry can be used as an application-independent set of cryptoalgorithm suites. This approach provides advantages in efficiency and security, and promotes the reuse of crypto implementations. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5116"/>
          <seriesInfo name="DOI" value="10.17487/RFC5116"/>
        </reference>
        <reference anchor="RFC6234">
          <front>
            <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="May" year="2011"/>
            <abstract>
              <t>Federal Information Processing Standard, FIPS</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6234"/>
          <seriesInfo name="DOI" value="10.17487/RFC6234"/>
        </reference>
      </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 1611?>

<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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
mNIVKlmJTtmreo8Y524rGu71WJQAOzfG2ALRkQe42/vbObw39VCn3Ty+N9eP
b+wgbJbt/Z5d9PiaOBwT/TdwL36AM4N/Ydb8mokk6UXCL1J6QSy1QcI3LQkB
76iyFUnI1yH9SYVWVO3XYrJJYRjPDwP+BJaPyvYAvR6RH1Zxg/ytVR3h7t2Y
eyf59VuS/xYkHU3B1nT1OOrHmQL9dlNApfaY5ncnb66chjdb0+DByfZsDFHL
aFL8i11zc+U6y6me3zA9t12KGU/ifAwJOEzFAaaNyWvLDRaIaGEV37/zeWuB
q563wPU2s/hmPvRwh3NHKHVOmPAV2nm13c6bcTueHVzh3kF+Mx9NfAs7N6b9
FotcA15oS4/wH5/waXbsJe9CXkMfaOz37ohxbRqFvl9bWz12hwf7/QHDYez8
uO1G99GYid4iGrNqeeUO760Y9PouTSs/HFH1bocDsw4GUmTirvMF0MKXbeyX
Asr3g990SzP+dDg5E4xjmG8do0b0I25Z9iR14D/Y+O83XVB4UNWdrbq453eG
1dGPrGexPvgyWOagqrdWOeihW+TYOIHQrnE09ZurVziSn3OFYxBh7yPp/91X
OK4iyq8rHL+ucPy6wvHrCsfPu8JBsMiDo3eywrFR368rHL+ucPy6wvGzq5hf
9grH2+qo7RWOzu1cjWq7Yr2D3/263vFTrXckP/t6R3Kb9Y6XKPyyjzAwBZhT
5ngx71/4BQrHRG6RhLzFeegWSF6S1zhvV0mEXyUJ/SpJ6NdEkrYkSrTOb7yH
mfLu78vw7uAPMfzDNTZ6zS3enbzFesn3Wyrh48e3Xinp512N10muBH9vt9CR
vM1CR9IudPyY6xxXLnH8oEWLd75AsSNtwQ0LFMnVCxRXL0x4Xuu69S4WH3Z2
/frFh+2+v9nd992LDhvB1d3xbpopMYo39bHTlg6MgnmNAKD5b8HXP8rqwE76
XL86sE2fG8e+e23ghjWBa2nEQXvt6TIk2Psduk/en9D9teQl/2oYmm+D8hSE
dzTfCsH3kffBt2/mG4H2X2PsP2OMPfqhMfZ3FmD/vrF1H1Yf1LQzov7c53cJ
gARsA0pQEhLKUdPnHKHbJqY8v/zbPvucq5oSH/TJbIi0n/P5QEra0riDevVc
T9eUommQpIAwiK0AqmvLGT0ofnnpgdDJZjIlzkLRHwHqz5IcDA42fLGZlYzO
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
Af8/U2/H+3/6AAA=

-->

</rfc>
