<?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.19 (Ruby 3.1.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-aegis-aead-01" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.3 -->
  <front>
    <title>The AEGIS family of authenticated encryption algorithms</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-aegis-aead-01"/>
    <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="2023" month="January" day="30"/>
    <workgroup>Crypto Forum</workgroup>
    <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.
This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</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 has assigned the following identifiers in the AEAD Algorithms Registry:</t>
      <table>
        <name>AEGIS entries in the AEAD Algorithms Registry</name>
        <thead>
          <tr>
            <th align="left">Algorithm Name</th>
            <th align="left">ID</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>AEAD_AEGIS128L</tt></td>
            <td align="left">
              <tt>32</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>AEAD_AEGIS256</tt></td>
            <td align="left">
              <tt>33</tt></td>
          </tr>
        </tbody>
      </table>
      <t>IANA has also assigned the following TLS cipher suites in the TLS Cipher Suite Registry:</t>
      <table>
        <name>AEGIS entries in the TLS Cipher Suite Registry</name>
        <thead>
          <tr>
            <th align="left">Cipher Suite Name</th>
            <th align="left">Value</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>TLS_AEGIS_256_SHA384</tt></td>
            <td align="left">
              <tt>{0x13,0x06}</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>TLS_AEGIS_128L_SHA256</tt></td>
            <td align="left">
              <tt>{0x13,0x07}</tt></td>
          </tr>
        </tbody>
      </table>
      <t>IANA is requested to update the references of these entries to refer to the final version of this document.</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:
H4sIAAAAAAAAA+1923bbRrrmPZ8C415rR5oWaZwP6s6eZiQ5VmLZHtHp7Mxe
u80CUCARkQADgJbkQ6+53df7BWbupl9j8ibzJPP9VQUQgEhJdhx3ei8na8lk
nes//18BxeFwOKjSasEPtQcv5lwbn3x9OtEStkwX11qeaGxdzXlWpRGreKzx
LCquV1WaZxpbzPIirebL8sEgzqOMLTFEXLCkGqZFlQyjpJgNGZ+lJf6yeKgb
AxoDna4PtTRL8sEgXRWHWlWsy8rU9UA3Bxf8+jIv4kPtNKt4kfFqeEwDDlB4
MSvy9epQO6L5c+1RXqyXg3IdLtOyxHJeXK8w/en5i0eDQVmxLH7JFnmGomte
DsolK6qXP63zipeyZJUeav9a5dGBVuZFVfCkxKfrJX34t8GA9pwXhwNtONDw
n9zao4JlF9oxz9JSlObFjGXpa0bEQC0rKxDsNItGopYvWbo41JKY/0nXkxG2
0huNhWmunWRFGuXaOc9e59okyqs8S7cMfprF6as0XrOFdpRnVZGG6yovOvPQ
cH/iZclH0bw704Qt13yhPVlHbNvC7x67FAMMFzSA+6fVcrTkYB0YWCwxxit+
OEBrITaHolstTbJIG2NxZbVVcrS9V8bI2H8gur3i2RrdjsYnk/G5FuXLFcdI
aC8HZcWMV4favKpW5eHDh636chQVo+vVqMofQkSy2HoopO6VYYxWcSJ6NwwV
/w3VvxrEEPLweKR9v26KJNEe59nsx3XWrgDZDrWnLLtm2Ux7waN5li/yGfRi
oX2XgQxFmVbX22f4aqQ9L3jG+aI3zVeQyxtVYqJvv9Oe8DVoIopjKM6hZuqG
O9SDoeEQxb95cmwaXYp/vYYEDCH8w2MO/VmmGfS5qlh0UWqgu2CIJHYRKXU/
Ah3XaKt9k6+LjC1kdcmLlJfE45pmx89ODzVDHxl6YBHxf8wWD8MrFupOcDeF
n4y0b1KW9zb/JM26xWLjkwp71b7l19oTFuYFgzAKOyT1HhS/PtC+4umPaTbb
PtkPI4zcm+oHsPOnlBjXqrp1utNavkG3CY/WkFdMfJqVoDXo1W9yks1AbFAt
mx1oR3N8LkH6iMV8KYabRCkUgJd/wKd5ni/Ejq5D0H0z+EaKRO3uQbbvezLS
jvtiPJmz/HrdLv8gGtfiZxpD3RmaJonfk9OzSV/+vufsgoYtsSIYtXgdwWVI
hwKh1F6A2Vdp1pLA0/HRufYChrVkkVBlEtPJ9XLJYYiiznpo9j1z/0BbrUYQ
RPv//c//MKzgwVbjwFdgRDVKGQwDNvyQ+j40fO8O2bZdx3cfVnkZjV5Rl1Fq
Qt7tIea5W8Yfkdj16f9ofSGFrseAE7KIxGGmPSUZapuQP/QE4fF1Psu3z/li
pJ2Wech7s75gmBUWtlcpZt4y9h9g1Yj4WMVO+Sb2wVQs1xkFAoJTjQnEip+f
n0xePDvQvmErltVyKnnetNLGM5TusJDfj7QznvKit5Pv08Ui7dVs2cZ4tVqk
ELVaQcTM46IqibrV/JKXFE1ok8u0es2LBWq3r+LbEbzlBVvCD/cW8m1e8vRm
5S6S9rRG6MvX5311eQ7rLzwY9Ex7VrBo0Zjrlo5YejXXvpucPD39l8ZYkI6s
8jJdw4X2q0yjVpLAgZKYhrldSS4vL0frEuHMldCRKM8SXhD5HsrSUg0I1VkV
sERZJRj/cKF80q3a8A20QbXbEPGb9SJlnXJBv6Mckd5iIURl+2jPR9rXxToM
y96Az9l60a+555BQnfMUYpGtwIS+/szzJSu31W8fvMvok6fPjaAXCUG3rl8T
lxFLk9/jrBB2EpEnW2pfpazkwmb2PfR72Ucj2LMV6y3bB+st17/TnVuGYzcm
zwhGqT1C5yG63s3ks5F2kkbzRcnjG5p7xgrweku1IOHXBXvd05uNodg52VM2
44ttM0WIb/uVHzrPOcVq6ZL1Ze0cplQEa526e87SSIiONGhoCTk5Oh8bfldO
jmA8jxgvIR1fcVZpXyOHScv/RnMjR0I4UAovLSNkNI5TGhjmbsaw9grWjszu
OV+XJGtkBB+ns7l2zComAr0Fv6L13bQxtQGVAjUr2Gp+Lfo/5RXlXo11GWnj
o6cTEjafNDyq1gXHtJUU3yaYVIb4QHuFUMfQ/cCUcml7LuTSDuy7w0zdexh4
EERQKxgGluV7Q/2l6dwtlYiD/szWMc/YdY+FEw4LeLNS8PDnf49ymN/n+eK6
It6lP6259ujnv8U//61gqIiht2xdsgwh9cnzR0+2z32MudPXP//vvoweI50G
b3t1Hz5xkw/4JElnaWbYXUlSNqZnWTY2p8X7CdQmotx+jArJxpYUwCOOj2gm
+9789j3fkOw2A53MkO68J7sNdDGG9kvDv2d4Z/gPzcC8WzaQiIFYEIB+HgZr
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
OJWBAAA=

-->

</rfc>
