<?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.10 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-denis-aegis-aead-05" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.10 -->
  <front>
    <title>The AEGIS family of authenticated encryption algorithms</title>
    <seriesInfo name="Internet-Draft" value="draft-denis-aegis-aead-05"/>
    <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="June" 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>Pad(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(Pad(ad, 256), 256)
for xi in ad_blocks:
    Enc(xi)

msg_blocks = Split(Pad(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(Pad(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(Pad(cn, 256), 128)
out0 = t0 ^ z0
out1 = t1 ^ z1

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

v0, v1 = Split(Pad(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>M_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(Pad(ad, 128), 128)
for xi in ad_blocks:
    Enc(xi)

msg_blocks = Split(Pad(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(Pad(ad, 128), 128)
for xi in ad_blocks:
    Enc(xi)

ct_blocks = Split(Pad(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 = Pad(ci, 128)
out = t ^ z

xn = Truncate(out, |cn|)

v = Pad(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="http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf">
          <front>
            <title>Advanced Encryption Standard (AES)</title>
            <author>
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date month="November" year="2001"/>
          </front>
          <seriesInfo name="FIPS" value="PUB 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  : 00000000000000000000000000000000

nonce: 00000000000000000000000000000000

ad   :

msg  : 00000000000000000000000000000000

ct   : 41de9000a7b5e40e2d68bb64d99ebb19

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

nonce: 00000000000000000000000000000000

ad   :

msg  :

ct   :

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

msg  :

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

msg  :

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

msg  :

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

msg  :

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  : 00000000000000000000000000000000
       00000000000000000000000000000000

nonce: 00000000000000000000000000000000
       00000000000000000000000000000000

ad   :

msg  : 00000000000000000000000000000000

ct   : b98f03a947807713d75a4fff9fc277a6

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

nonce: 00000000000000000000000000000000
       00000000000000000000000000000000

ad   :

msg  :

ct   :

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

msg  :

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

msg  :

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

msg  :

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

msg  :

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+1963LcRpbm/3oKrDpiTG6TJdwv7PZs0yRl0xYlLUtuj2Ni
WkwACRbMKqAMoERStjrm7/yeF5j9t/0a6zeZJ5nvnEyggGLxItnWuDdkR1BV
icTJzHM/XwJZu7u7oyZvZnLPePRyKo39o8+PJ0Ym5vns2igzQyybqSyaPBGN
TA1ZJNX1osnLwhCz87LKm+m8fjRKy6QQc5BIK5E1u6ks8npXyHP+K9Jd0xvR
/bjhes/Ii6wcjfJFtWc01bJubNOMTHt0Ia8vyyrdM46LRlaFbHYPidhoVDei
SF+JWVlggGtZj+q5qJpX3y/LRtaqZZHvGf/clMmOUZdVU8msxqfrOX34l9GI
llBWeyNjd2TgPzXTJ5UoLoxDmim3ltW5KPI3gtaGq6JusP7jIhnzVTkX+WzP
yFL5J9PMxpjdGjUR56VxVFR5UhqnsnhTGpOkbMoi30D8uEjz13m6FDPjoCya
Ko+XTVkNxiFyf5J1LcfJdDjSRMyXcmY8XSZi08Tvp10zgd0ZEfD/tJiP5xLS
gEyqOWi8lnsj9GYt2OPbWuVQTcY+Jlc3GxXB2Hptja3tR3zba1kscdvB/tFk
/9RIyvlCghL6K6KiOpfNnjFtmkW99/hx73o9Tqrx9WLclI+rclmkzmNWpNeW
NV6kGd/dCZT/29X/GtAs6MMXY+ObZdekmPZFWZx/tyz6F8C2PeOZKK5FcW68
lMm0KGflOdR8ZnxdgA1VnTfXm0f4bGy8qGQh5WxtmM+glzcu8UBffW08lUvw
hJtT2MKeYZuWv2tGu5ZHHP/y6aFtDTn++RIasAvl3z2UMIl5XsA8m0YkF7UB
vrNAFLOrRFvvAfi4RF/jy3JZFWKmLteyymVNMm55dvj8eM+wzLFlRg4x/7ti
9ji+ErHpRfdz+OnY+DIX5drin+bFsJkXPmmwVuMreW08FXFZCSgju5UD0h7i
+PWO8ZnMv8uL882DfTsG5bWhvoU4v89JcL1Ldw533Oo3+DaRyRL6ioGPixq8
Br/WuxwV52A2uFac7xgHU3yuwfpEpHLO5CZJDgOQ9R/waVqWM17RdQy+r4iv
tIiv3k5k87onY+NwXY0nU1FeL/vt78XjVv1sC45517ZJ/Z4en0zW9e8bKS6I
bI0ZwamlywQRQMUHKKXxEsK+youeBh7vH5waL+FYa5GwKZOaTq7ncwlHlAzm
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

-->

</rfc>
