<?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.6.15 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-aegis-aead-00" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.13.1 -->
  <front>
    <title>The AEGIS family of authenticated encryption algorithms</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-aegis-aead-00"/>
    <author initials="F." surname="Denis" fullname="Frank Denis">
      <organization>Fastly Inc.</organization>
      <address>
        <email>fde@00f.net</email>
      </address>
    </author>
    <author initials="F. E. R." surname="Scotoni" fullname="Fabio Enrico Renzo Scotoni">
      <organization>Individual Contributor</organization>
      <address>
        <email>fabio@esse.ch</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="2022" month="August" day="05"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document describes AEGIS-128L and AEGIS-256, two AES-based authenticated encryption algorithms designed for high-performance applications.</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/jedisct1/draft-aegis-aead"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes the AEGIS-128L and AEGIS-256 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>AEGIS-128L, which has a 128-bit key, a 128-bit nonce, a 1024-bit state, a 128-bit authentication tag, and processes 256-bit input blocks.</li>
        <li>AEGIS-256, which has a 256-bit key, a 256-bit nonce, a 768-bit state, a 128-bit authentication tag, and processes 128-bit input blocks.</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. AEGIS-128L also allows 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>A key-committing AEAD scheme is more resistant against partitioning oracle attacks than non-committing AEAD schemes, making it significantly harder to find multiple keys that are valid for a given authentication tag. As of the time of writing, no research has been published claiming that AEGIS is not a key-committing AEAD scheme.</t>
      <t>Finally, unlike most other AES-based AEAD constructions, such as Rocca and Tiaoxin, leaking the state does not leak the key.</t>
      <t>Note that an earlier version of Hongjun Wu and Bart Preneel's paper introducing AEGIS specified AEGIS-128L and AEGIS-256 sporting differences with regards to the computation of the authentication tag and the number of rounds in <tt>Finalize()</tt> respectively. We follow the specification of <xref target="AEGIS"/> that is current at the time of writing, which can be found in the References section of this document.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <t>Primitives:</t>
      <ul spacing="normal">
        <li>
          <tt>|x|</tt>: the length of <tt>x</tt> in bits.</li>
        <li>
          <tt>a ^ b</tt>: the bitwise exclusive OR operation between <tt>a</tt> and <tt>b</tt>.</li>
        <li>
          <tt>a &amp; b</tt>: the bitwise AND operation between <tt>a</tt> and <tt>b</tt>.</li>
        <li>
          <tt>a || b</tt>: the concatenation of <tt>a</tt> and <tt>b</tt>.</li>
        <li>
          <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.</li>
        <li>
          <tt>LE64(x)</tt>: the little-endian encoding of 64-bit integer <tt>x</tt>.</li>
        <li>
          <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.</li>
        <li>
          <tt>Truncate(x, n)</tt>: truncation operation. The first <tt>n</tt> bits of <tt>x</tt> are kept.</li>
        <li>
          <tt>Split(x, n)</tt>: splitting operation. <tt>x</tt> is split into <tt>n</tt>-bit blocks, ignoring partial blocks.</li>
        <li>
          <tt>Tail(x, n)</tt>: returns the last <tt>n</tt> bits of <tt>x</tt>.</li>
        <li>
          <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.</li>
        <li>
          <tt>Repeat(n, F)</tt>: <tt>n</tt> sequential evaluations of the function <tt>F</tt>.</li>
        <li>
          <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.</li>
      </ul>
      <t>AEGIS internal functions:</t>
      <ul spacing="normal">
        <li>
          <tt>Update(M0, M1)</tt>: the state update function.</li>
        <li>
          <tt>Init(key, nonce)</tt>: the initialization function.</li>
        <li>
          <tt>Enc(xi)</tt>: the input block encryption function.</li>
        <li>
          <tt>Dec(ci)</tt>: the input block decryption function.</li>
        <li>
          <tt>DecPartial(cn)</tt>: the input block decryption function for the last ciphertext bits when they do not fill an entire block.</li>
        <li>
          <tt>Finalize(ad_len, msg_len)</tt>: the authentication tag generation function.</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>
          <tt>Si</tt>: the <tt>i</tt>-th AES block of the current state.</li>
        <li>
          <tt>S'i</tt>: the <tt>i</tt>-th AES block of the next state.</li>
        <li>
          <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.</li>
        <li>
          <tt>C0</tt>: the constant <tt>0x000101020305080d1522375990e97962</tt> as an AES block.</li>
        <li>
          <tt>C1</tt>: the constant <tt>0xdb3d18556dc22ff12011314273b528dd</tt> as an AES block.</li>
      </ul>
      <t>AES blocks are always 128 bits in length.</t>
      <t>Input and output values:</t>
      <ul spacing="normal">
        <li>
          <tt>key</tt>: the encryption key (128 bits for AEGIS-128L, 256 bits for AEGIS-256).</li>
        <li>
          <tt>nonce</tt>: the public nonce (128 bits for AEGIS-128L, 256 bits for AEGIS-256).</li>
        <li>
          <tt>ad</tt>: the associated data.</li>
        <li>
          <tt>msg</tt>: the plaintext.</li>
        <li>
          <tt>ct</tt>: the ciphertext.</li>
        <li>
          <tt>tag</tt>: the authentication tag (128 bits).</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>
          <tt>K_LEN</tt> (key length) is 16 octets (128 bits).</li>
        <li>
          <tt>P_MAX</tt> (maximum length of the plaintext) is 2<sup>61</sup> octets (2<sup>64</sup> bits).</li>
        <li>
          <tt>A_MAX</tt> (maximum length of the associated data) is 2<sup>61</sup> octets (2<sup>64</sup> bits).</li>
        <li>
          <tt>N_MIN</tt> (minimum nonce length) = <tt>N_MAX</tt> (maximum nonce length) = 16 octets (128 bits).</li>
        <li>
          <tt>C_MAX</tt> (maximum ciphertext length) = <tt>P_MAX</tt> + tag length = 2<sup>61</sup> + 16 octets (2<sup>64</sup> + 128 bits).</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>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.</li>
          <li>The key <bcp14>MUST</bcp14> be randomly chosen from a uniform distribution.</li>
        </ul>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>msg</tt>: the message to be encrypted (length <bcp14>MUST</bcp14> be less than <tt>P_MAX</tt>).</li>
          <li>
            <tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than <tt>A_MAX</tt>).</li>
          <li>
            <tt>key</tt>: the encryption key.</li>
          <li>
            <tt>nonce</tt>: the public nonce.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ct</tt>: the ciphertext.</li>
          <li>
            <tt>tag</tt>: the authentication tag.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

ct = {}

ad_blocks = Split(ZeroPad(ad, 256), 256)
for xi in ad_blocks:
    Enc(xi)

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>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.</li>
          <li>The comparison of the input <tt>tag</tt> with the <tt>expected_tag</tt> <bcp14>MUST</bcp14> be done in constant time.</li>
        </ul>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ct</tt>: the ciphertext to be decrypted (length <bcp14>MUST</bcp14> be less than <tt>C_MAX</tt>).</li>
          <li>
            <tt>tag</tt>: the authentication tag.</li>
          <li>
            <tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than <tt>A_MAX</tt>).</li>
          <li>
            <tt>key</tt>: the encryption key.</li>
          <li>
            <tt>nonce</tt>: the public nonce.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>Either the decrypted message <tt>msg</tt>, or an error indicating that the authentication tag is invalid for the given inputs.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

msg = {}

ad_blocks = Split(ZeroPad(ad, 256), 256)
for xi in ad_blocks:
    Enc(xi)

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>
            <tt>key</tt>: the encryption key.</li>
          <li>
            <tt>nonce</tt>: the nonce.</li>
        </ul>
        <t>Defines:</t>
        <ul spacing="normal">
          <li>
            <tt>{S0, ...S7}</tt>: the initial state.</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>
            <tt>M0</tt>: the first 128-bit block to be absorbed.</li>
          <li>
            <tt>M1</tt>: the second 128-bit block to be absorbed.</li>
        </ul>
        <t>Modifies:</t>
        <ul spacing="normal">
          <li>
            <tt>{S0, ...S7}</tt>: the state.</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-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>
            <tt>xi</tt>: the 256-bit input block.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ci</tt>: the 256-bit encrypted block.</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>
            <tt>ci</tt>: the 256-bit encrypted block.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>xi</tt>: the 256-bit decrypted block.</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>
            <tt>cn</tt>: the encrypted input.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>xn</tt>: the decryption of <tt>cn</tt>.</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, msg_len)
]]></artwork>
        <t>The <tt>Finalize</tt> function computes a 128-bit tag that authenticates the message and associated data.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ad_len</tt>: the length of the associated data in bits.</li>
          <li>
            <tt>msg_len</tt>: the length of the message in bits.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>tag</tt>: the authentication tag.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
t = S2 ^ (LE64(ad_len) || LE64(msg_len))

Repeat(7, Update(t, t))

tag = S0 ^ S1 ^ S2 ^ S3 ^ S4 ^ S5 ^ S6

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>
          <tt>K_LEN</tt> (key length) is 32 octets (256 bits).</li>
        <li>
          <tt>P_MAX</tt> (maximum length of the plaintext) is 2<sup>61</sup> octets (2<sup>64</sup> bits).</li>
        <li>
          <tt>A_MAX</tt> (maximum length of the associated data) is 2<sup>61</sup> octets (2<sup>64</sup> bits).</li>
        <li>
          <tt>N_MIN</tt> (minimum nonce length) = <tt>N_MAX</tt> (maximum nonce length) = 32 octets (256 bits).</li>
        <li>
          <tt>C_MAX</tt> (maximum ciphertext length) = <tt>P_MAX</tt> + tag length = 2<sup>61</sup> + 16 octets (2<sup>64</sup> + 128 bits).</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>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.</li>
          <li>The key <bcp14>MUST</bcp14> be randomly chosen from a uniform distribution.</li>
        </ul>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>msg</tt>: the message to be encrypted (length <bcp14>MUST</bcp14> be less than <tt>P_MAX</tt>).</li>
          <li>
            <tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than <tt>A_MAX</tt>).</li>
          <li>
            <tt>key</tt>: the encryption key.</li>
          <li>
            <tt>nonce</tt>: the public nonce.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ct</tt>: the ciphertext.</li>
          <li>
            <tt>tag</tt>: the authentication tag.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

ct = {}

ad_blocks = Split(ZeroPad(ad, 128), 128)
for xi in ad_blocks:
    Enc(xi)

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>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.</li>
          <li>The comparison of the input <tt>tag</tt> with the <tt>expected_tag</tt> <bcp14>MUST</bcp14> be done in constant time.</li>
        </ul>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ct</tt>: the ciphertext to be decrypted (length <bcp14>MUST</bcp14> be less than <tt>C_MAX</tt>).</li>
          <li>
            <tt>tag</tt>: the authentication tag.</li>
          <li>
            <tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than <tt>A_MAX</tt>).</li>
          <li>
            <tt>key</tt>: the encryption key.</li>
          <li>
            <tt>nonce</tt>: the public nonce.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>Either the decrypted message <tt>msg</tt>, or an error indicating that the authentication tag is invalid for the given inputs.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

msg = {}

ad_blocks = Split(ZeroPad(ad, 128), 128)
for xi in ad_blocks:
    Enc(xi)

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>
            <tt>key</tt>: the encryption key.</li>
          <li>
            <tt>nonce</tt>: the nonce.</li>
        </ul>
        <t>Defines:</t>
        <ul spacing="normal">
          <li>
            <tt>{S0, ...S5}</tt>: the initial state.</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>
            <tt>msg</tt>: the block to be absorbed.</li>
        </ul>
        <t>Modifies:</t>
        <ul spacing="normal">
          <li>
            <tt>{S0, ...S5}</tt>: the state.</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-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>
            <tt>xi</tt>: the input block.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ci</tt>: the encrypted input block.</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>
            <tt>ci</tt>: the encrypted input block.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>xi</tt>: the decrypted block.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
z = S1 ^ S4 ^ S5 ^ (S2 & S3)

xi = ci ^ z

Update(xi)

return xi
]]></artwork>
        <t>It returns the 128-bit block <tt>out</tt>.</t>
      </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>
            <tt>cn</tt>: the encrypted input.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>xn</tt>: the decryption of <tt>cn</tt>.</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, msg_len)
]]></artwork>
        <t>The <tt>Finalize</tt> function computes a 128-bit tag that authenticates the message and associated data.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ad_len</tt>: the length of the associated data in bits.</li>
          <li>
            <tt>msg_len</tt>: the length of the message in bits.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>tag</tt>: the authentication tag.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
t = S3 ^ (LE64(ad_len) || LE64(msg_len))

Repeat(7, Update(t))

tag = S0 ^ S1 ^ S2 ^ S3 ^ S4 ^ S5

return tag
]]></artwork>
      </section>
    </section>
    <section anchor="encoding-ct-tag-tuples">
      <name>Encoding (ct, tag) Tuples</name>
      <t>Applications <bcp14>MAY</bcp14> keep the ciphertext and the 128-bit 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="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. Both have a 128-bit authentication tag, which implies that a given tag may verify under multiple keys. However, assuming AEGIS is key-committing, finding equivalent keys is expected to be significantly more difficult than for authentication schemes based on polynomial evaluation, such as GCM and Poly1305.</t>
      <t>Under the assumption that the secret key is unknown to the attacker and the tag is not truncated, both AEGIS-128L and AEGIS-256 target 128-bit security against forgery attacks.</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 the analysis of the (robustness of CAESAR candidates beyond their guarantees)<xref target="CRA18"/>, 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 collision probability.</t>
      <t>With AEGIS-256, random nonces can be used with no practical limits.</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>Security analyses of AEGIS can be found in Chapter 4 of <xref target="AEGIS"/>, in <xref target="Min14"/>, in <xref target="ENP19"/>, in <xref target="LIMS21"/>, and in <xref target="JLD21"/>.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA is requested to assign entries for <tt>AEAD_AEGIS128L</tt> and <tt>AEAD_AEGIS256</tt> in the AEAD Registry with this document as reference.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <date month="January" year="2008"/>
            <abstract>
              <t>This document defines algorithms for Authenticated Encryption with Associated Data (AEAD), and defines a uniform interface and a registry for such algorithms.  The interface and registry can be used as an application-independent set of cryptoalgorithm suites.  This approach provides advantages in efficiency and security, and promotes the reuse of crypto implementations.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5116"/>
          <seriesInfo name="DOI" value="10.17487/RFC5116"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="AEGIS" target="https://competitions.cr.yp.to/round3/aegisv11.pdf">
          <front>
            <title>AEGIS: A fast 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" month="September" day="15"/>
          </front>
        </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, Beijing</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, Beijing</organization>
            </author>
            <date year="2021" month="May" day="22"/>
          </front>
          <seriesInfo name="DOI" value="10.1093/comjnl/bxab059"/>
          <refcontent>The Computer Journal</refcontent>
        </reference>
        <reference anchor="LIMS21" target="https://eprint.iacr.org/2021/187">
          <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="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="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" month="January" day="31"/>
          </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="CRA18">
          <front>
            <title>Can Caesar Beat Galois? Robustness of CAESAR Candidates against Nonce Reusing and High Data Complexity Attacks</title>
            <author initials="S." surname="Vaudenay" fullname="Serge Vaudenay">
              <organization>École Polytechnique Fédérale de Lausanne EPFL</organization>
            </author>
            <author initials="D." surname="Vizár" fullname="Damian Vizár">
              <organization>École Polytechnique Fédérale de Lausanne 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>
        <reference anchor="Min14" target="https://eprint.iacr.org/2018/292">
          <front>
            <title>Linear Biases in AEGIS Keystream</title>
            <author initials="B." surname="Minaud" fullname="Brice Minaud">
              <organization>Agence nationale de la sécurité des systèmes d'information 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>
      </references>
    </references>
    <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

tag  : abe0ece80c24868a226a35d16bdae37a
]]></artwork>
        </section>
        <section anchor="test-vector-2">
          <name>Test Vector 2</name>
          <artwork><![CDATA[
key  : 10010000000000000000000000000000

nonce: 10000200000000000000000000000000

ad   :

msg  :

ct   :

tag  : c2b879a67def9d74e6c14f708bbcc9b4
]]></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

tag  : cc6f3372f6aa1bb82388d695c3962d9a
]]></artwork>
        </section>
        <section anchor="test-vector-4">
          <name>Test Vector 4</name>
          <artwork><![CDATA[
key  : 10010000000000000000000000000000

nonce: 10000200000000000000000000000000

ad   : 0001020304050607

msg  : 000102030405060708090a0b0c0d

ct   : 79d94593d8c2119d7e8fd9b8fc77

tag  : 5c04b3dba849b2701effbe32c7f0fab7
]]></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

tag  : 7542a745733014f9474417b337399507
]]></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

tag  : 5c04b3dba849b2701effbe32c7f0fab7
]]></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

tag  : 5c04b3dba849b2701effbe32c7f0fab7
]]></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

tag  : 5c04b3dba849b2701effbe32c7f0fab7
]]></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

tag  : 6c04b3dba849b2701effbe32c7f0fab8
]]></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

tag  : 3fe91994768b332ed7f570a19ec5896e
]]></artwork>
        </section>
        <section anchor="test-vector-2-1">
          <name>Test Vector 2</name>
          <artwork><![CDATA[
key  : 10010000000000000000000000000000
       00000000000000000000000000000000

nonce: 10000200000000000000000000000000
       00000000000000000000000000000000

ad   :

msg  :

ct   :

tag  : e3def978a0f054afd1e761d7553afba3
]]></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

tag  : 8d86f91ee606e9ff26a01b64ccbdd91d
]]></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

tag  : c60b9c2d33ceb058f96e6dd03c215652
]]></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

tag  : ab8a7d53fd0e98d727accca94925e128
]]></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

tag  : c60b9c2d33ceb058f96e6dd03c215652
]]></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

tag  : c60b9c2d33ceb058f96e6dd03c215652
]]></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

tag  : c60b9c2d33ceb058f96e6dd03c215652
]]></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

tag  : d60b9c2d33ceb058f96e6dd03c215653
]]></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 Eric Lagergren and Daniel Bleichenbacher for catching a broken test vector and Daniel Bleichenbacher for many helpful suggestions.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
MaxStbpGzCiJInNGlSI7BiJ1SVudKvZjIatq6ewlONHRh49YVoWSyEzcnBvf
gXh4Si51i2JcdUH3CYMSaTBDFZRaI+4sNlsnndddfCnrvB9fzibL+LPrRtZn
O/g8zbPmFBk+fTnJrw7K2XJeawXdT1Oe0Vfy+gzsFkXdQTrKHaXkvZXDa72+
pyJLW+9S8vwF3BWo58VZO6u2sqOVqOquLQ9p2OriRke1Rg7q4NSphINstrDW
J8QlYmaN5JjiCoQgkQ0tdaGll9xV4mdPFK8PmqPvt8SOEdP9xCMoR923TFoS
ZyRIw3YpDu5oIZK4SRflmcq3KLVG9owErqGk+uwJXDWucYpDLoMSSpUv8dM5
BM3oyWhv9vWCMLGtE3PHOLFa41RpzZIvdTfwzI8RLbe42Oa6qr2BgyilAcog
BrccFcnWVb7q2VXTfS0a3HEoE1Q2m+7QldWmO14oI9hKigfeqLEebRK9rJ4t
gwtJiocIvZzbZTmiIbuqBmWQIstjdwmQSF/NKIrO63P60E5jQ0KlC8nhMkbH
PaCB3QWlcjwZxsOGyR6hWGvXqIAmcWuAQAt4kut5nOVnu6p81zzR2tlmXSx0
5Z0+ue+egvi0uuGHSb5jjMfjyXdv9Y2vYY9lF0QeNHSbk559x53vmeOBuQpw
qhI6M69M07Twv206pmeGZmp5tu0EXhSZMgoi3+a4JIrVRBQpawOpNHZSK/Q8
P01sO8ss27Qsx3LtwIk9O0zTDaR6rGfxidmluK5XkoJNq1DTyZrTr2VDH8lr
tBkG7EvPqGchlJlubZC6guc2qAqatnl9bKmaIBdViTLe9yQn0laxh4gxX4Tu
tyOhaCvInrg9aVoed3bG7bCG282km982J+8d8qasYL9FprWL60O06wjkXKQc
0mV+Pm06t65lBfU1lfoGb880wkeo25ye3qpXkHAHhVOQK2sCowQ75HwQilSa
7VmWv0NQNa+GMm6ohBLvV6+eHj07M8iNaoXYJhKWb5RJI8H0/rrR/8Wrk/1/
Qf+5uMrny3kv7RzwmYnYf6yXi3/2rT8+pn87grrZ1c0r2vt30l6T8HuN8OzV
yTGtFgU8j6BUr133p9xhMIX1Drfy5WDtxp4L75HX3Ps9a5Re3qfrq/h9f5S1
pfze6KvhIUOHiLjr+yUcbdq8pFeKbVIHB+pQT6m8Qh23LMQ8zs+X5bJWUGaZ
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

-->

</rfc>
