<?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.27 (Ruby 3.1.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-aegis-aead-02" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.0 -->
  <front>
    <title>The AEGIS family of authenticated encryption algorithms</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-aegis-aead-02"/>
    <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="April" day="08"/>
    <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). It is not an IETF product and is not a standard.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/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- or 256-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- or 256-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 or 256 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 or 32 octets (2<sup>64</sup> + 128 or 256 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- or 256-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))

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

return tag
]]></artwork>
      </section>
    </section>
    <section anchor="the-aegis-256-algorithm">
      <name>The AEGIS-256 Algorithm</name>
      <t>AEGIS-256 has a 768-bit state, made of six 128-bit blocks <tt>{S0, ...S5}</tt>.</t>
      <t>The parameters for this algorithm, whose meaning is defined in <xref section="4" sectionFormat="comma" target="RFC5116"/> are:</t>
      <ul spacing="normal">
        <li>
          <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 or 32 octets (2<sup>64</sup> + 128 or 256 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- or 256-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))

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

return tag
]]></artwork>
      </section>
    </section>
    <section anchor="encoding-ct-tag-tuples">
      <name>Encoding (ct, tag) Tuples</name>
      <t>Applications <bcp14>MAY</bcp14> keep the ciphertext and the authentication tag in distinct structures or encode both as a single string.</t>
      <t>In the latter case, the tag <bcp14>MUST</bcp14> immediately follow the ciphertext:</t>
      <artwork><![CDATA[
combined_ct = ct || tag
]]></artwork>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>AEGIS-256 offers 256-bit message security against plaintext and state recovery, whereas AEGIS-128L offers 128-bit security.</t>
      <t>An authentication tag may verify under multiple keys. Assuming AEGIS is key-committing, finding equivalent keys is expected to require ~2<sup>64</sup> attempts with a 128-bit authentication tag and ~2<sup>128</sup> attempts with a 256-bit tag.</t>
      <t>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"/>, in <xref target="JLD21"/>, and in <xref target="STSI23"/>.</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>
        <reference anchor="STSI23" target="https://doi.org/10.1049/ise2.12109">
          <front>
            <title>MILP-based security evaluation for AEGIS/Tiaoxin-346/Rocca</title>
            <author initials="T." surname="Shiraya" fullname="Takuro Shiraya">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="N." surname="Takeuchi" fullname="Nobuyuki Takeuchi">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="K." surname="Sakamoto" fullname="Kosei Sakamoto">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo; National Institute of Information and Communications Technology</organization>
            </author>
            <date year="2023" month="January" day="27"/>
          </front>
          <seriesInfo name="DOI" value="10.1049/ise2.12109"/>
          <refcontent>IET Information Security, 2023, pp. 1-10</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

tag128: abe0ece80c24868a226a35d16bdae37a

tag256: 25835bfbb21632176cf03840687cb968
        cace4617af1bd0f7d064c639a5c79ee4
]]></artwork>
        </section>
        <section anchor="test-vector-2">
          <name>Test Vector 2</name>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000

nonce : 10000200000000000000000000000000

ad    :

msg   :

ct    :

tag128: c2b879a67def9d74e6c14f708bbcc9b4

tag256: 1360dc9db8ae42455f6e5b6a9d488ea4
        f2184c4e12120249335c4ee84bafe25d
]]></artwork>
        </section>
        <section anchor="test-vector-3">
          <name>Test Vector 3</name>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

ct    : 79d94593d8c2119d7e8fd9b8fc77845c
        5c077a05b2528b6ac54b563aed8efe84

tag128: cc6f3372f6aa1bb82388d695c3962d9a

tag256: 022cb796fe7e0ae1197525ff67e30948
        4cfbab6528ddef89f17d74ef8ecd82b3
]]></artwork>
        </section>
        <section anchor="test-vector-4">
          <name>Test Vector 4</name>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

tag256: 86f1b80bfb463aba711d15405d094baf
        4a55a15dbfec81a76f35ed0b9c8b04ac
]]></artwork>
        </section>
        <section anchor="test-vector-5">
          <name>Test Vector 5</name>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000

nonce : 10000200000000000000000000000000

ad    : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f
        20212223242526272829

msg   : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f
        3031323334353637

ct    : b31052ad1cca4e291abcf2df3502e6bd
        b1bfd6db36798be3607b1f94d34478aa
        7ede7f7a990fec10

tag128: 7542a745733014f9474417b337399507

tag256: b91e2947a33da8bee89b6794e647baf0
        fc835ff574aca3fc27c33be0db2aff98
]]></artwork>
        </section>
        <section anchor="test-vector-6">
          <name>Test Vector 6</name>
          <t>This test <bcp14>MUST</bcp14> return a “verification failed” error.</t>
          <artwork><![CDATA[
key   : 10000200000000000000000000000000

nonce : 10010000000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

tag256: 86f1b80bfb463aba711d15405d094baf
        4a55a15dbfec81a76f35ed0b9c8b04ac
]]></artwork>
        </section>
        <section anchor="test-vector-7">
          <name>Test Vector 7</name>
          <t>This test <bcp14>MUST</bcp14> return a “verification failed” error.</t>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc78

tag128: 5c04b3dba849b2701effbe32c7f0fab7

tag256: 86f1b80bfb463aba711d15405d094baf
        4a55a15dbfec81a76f35ed0b9c8b04ac
]]></artwork>
        </section>
        <section anchor="test-vector-8">
          <name>Test Vector 8</name>
          <t>This test <bcp14>MUST</bcp14> return a “verification failed” error.</t>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000

nonce : 10000200000000000000000000000000

ad    : 0001020304050608

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

tag256: 86f1b80bfb463aba711d15405d094baf
        4a55a15dbfec81a76f35ed0b9c8b04ac
]]></artwork>
        </section>
        <section anchor="test-vector-9">
          <name>Test Vector 9</name>
          <t>This test <bcp14>MUST</bcp14> return a “verification failed” error.</t>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 6c04b3dba849b2701effbe32c7f0fab8

tag256: 86f1b80bfb463aba711d15405d094baf
        4a55a15dbfec81a76f35ed0b9c8b04ad
]]></artwork>
        </section>
      </section>
      <section anchor="aegis-256-test-vectors">
        <name>AEGIS-256 Test Vectors</name>
        <section anchor="update-test-vector-1">
          <name>Update Test Vector</name>
          <artwork><![CDATA[
S0   : 1fa1207ed76c86f2c4bb40e8b395b43e
S1   : b44c375e6c1e1978db64bcd12e9e332f
S2   : 0dab84bfa9f0226432ff630f233d4e5b
S3   : d7ef65c9b93e8ee60c75161407b066e7
S4   : a760bb3da073fbd92bdc24734b1f56fb
S5   : a828a18d6a964497ac6e7e53c5f55c73

M    : b165617ed04ab738afb2612c6d18a1ec

After Update:
S0   : e6bc643bae82dfa3d991b1b323839dcd
S1   : 648578232ba0f2f0a3677f617dc052c3
S2   : ea788e0e572044a46059212dd007a789
S3   : 2f1498ae19b80da13fba698f088a8590
S4   : a54c2ee95e8c2a2c3dae2ec743ae6b86
S5   : a3240fceb68e32d5d114df1b5363ab67
]]></artwork>
        </section>
        <section anchor="test-vector-1-1">
          <name>Test Vector 1</name>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000
        00000000000000000000000000000000

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    :

msg   : 00000000000000000000000000000000

ct    : 754fc3d8c973246dcc6d741412a4b236

tag128: 3fe91994768b332ed7f570a19ec5896e

tag256: 1181a1d18091082bf0266f66297d167d
        2e68b845f61a3b0527d31fc7b7b89f13
]]></artwork>
        </section>
        <section anchor="test-vector-2-1">
          <name>Test Vector 2</name>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000
        00000000000000000000000000000000

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    :

msg   :

ct    :

tag128: e3def978a0f054afd1e761d7553afba3

tag256: 6a348c930adbd654896e1666aad67de9
        89ea75ebaa2b82fb588977b1ffec864a
]]></artwork>
        </section>
        <section anchor="test-vector-3-1">
          <name>Test Vector 3</name>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000
        00000000000000000000000000000000

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

ct    : f373079ed84b2709faee373584585d60
        accd191db310ef5d8b11833df9dec711

tag128: 8d86f91ee606e9ff26a01b64ccbdd91d

tag256: b7d28d0c3c0ebd409fd22b4416050307
        3a547412da0854bfb9723020dab8da1a
]]></artwork>
        </section>
        <section anchor="test-vector-4-1">
          <name>Test Vector 4</name>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000
        00000000000000000000000000000000

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

tag256: 8c1cc703c81281bee3f6d9966e14948b
        4a175b2efbdc31e61a98b4465235c2d9
]]></artwork>
        </section>
        <section anchor="test-vector-5-1">
          <name>Test Vector 5</name>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000
        00000000000000000000000000000000

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f
        20212223242526272829

msg   : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f
        3031323334353637

ct    : 57754a7d09963e7c787583a2e7b859bb
        24fa1e04d49fd550b2511a358e3bca25
        2a9b1b8b30cc4a67

tag128: ab8a7d53fd0e98d727accca94925e128

tag256: a3aca270c006094d71c20e6910b5161c
        0826df233d08919a566ec2c05990f734
]]></artwork>
        </section>
        <section anchor="test-vector-6-1">
          <name>Test Vector 6</name>
          <t>This test <bcp14>MUST</bcp14> return a “verification failed” error.</t>
          <artwork><![CDATA[
key   : 10000200000000000000000000000000
        00000000000000000000000000000000

nonce : 10010000000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

tag256: 8c1cc703c81281bee3f6d9966e14948b
        4a175b2efbdc31e61a98b4465235c2d9
]]></artwork>
        </section>
        <section anchor="test-vector-7-1">
          <name>Test Vector 7</name>
          <t>This test <bcp14>MUST</bcp14> return a “verification failed” error.</t>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000
        00000000000000000000000000000000

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358459

tag128: c60b9c2d33ceb058f96e6dd03c215652

tag256: 8c1cc703c81281bee3f6d9966e14948b
        4a175b2efbdc31e61a98b4465235c2d9
]]></artwork>
        </section>
        <section anchor="test-vector-8-1">
          <name>Test Vector 8</name>
          <t>This test <bcp14>MUST</bcp14> return a “verification failed” error.</t>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000
        00000000000000000000000000000000

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050608

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

tag256: 8c1cc703c81281bee3f6d9966e14948b
        4a175b2efbdc31e61a98b4465235c2d9
]]></artwork>
        </section>
        <section anchor="test-vector-9-1">
          <name>Test Vector 9</name>
          <t>This test <bcp14>MUST</bcp14> return a “verification failed” error.</t>
          <artwork><![CDATA[
key   : 10010000000000000000000000000000
        00000000000000000000000000000000

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215653

tag256: 8c1cc703c81281bee3f6d9966e14948b
        4a175b2efbdc31e61a98b4465235c2da
]]></artwork>
        </section>
      </section>
    </section>
    <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+1923LcRprmfT0FVo6YJrdZJZwP7PZs0yRl0xYlLUtuj3di
WkwkEiyYVUAZQEmkLHXs7VzPC+zebb/G+k32Sfb7MxOnYhVJyWq3PCE5gq5C
Jv7M/M//l0DWeDwe1Vk9F/vGg+czYRwcf3kyNVK2yObXRpEabFXPRF5nnNUi
MUTOy+tlnRW5weYXRZnVs0X1YJQUPGcLkEhKltbjrKzTMU/LizETF1mFvywZ
m/aIaOCm630jy9NiNMqW5b5Rl6uqtk0zQodLcf2qKJN94ySvRZmLenxEBEe4
eHlRFqvlvnFI4xfGo6JcLUbVKl5kVYXpPL9eYviTs+ePRqOqZnnygs2LHJeu
RTWqFqysX/y4KmpRqSvLbN/417rge0ZVlHUp0gqfrhf04d9GI1pzUe6PjPHI
wD+1tEclyy+NI5FnlbxalBcsz14zYgZaWVWDYSc5n8hWsWDZfN9IE/En00wn
WMoaNRZnhXGclxkvjDORvy6MKS/qIs82ED/Jk+xllqzY3Dgs8rrM4lVdlINx
iNyfRFWJCZ8NR5qyxUrMjccrzjZN/G7alSQwnhMB/0/LxWQhIDoIsFyAxkux
P0JvqTb78rZGm9Ql4wCTq+qNmmPsvLQm1u4DedtLka9w2+HB8fTgzODFYilA
Cf0VUVZeiHrfmNX1stp/+LDXXk14ObleTuriIVQkT5yHUuteWtZkmaTy7lag
8t9Y/9+AGkIfvpoY363aS4ppXxX5xQ+rvN8Atu0bT1h+zfIL47ngs7yYFxew
i7nxbQ42lFVWX28e4YuJ8awUuRDztWG+gF7eaJIDffOt8ViswBN5OYHh7Bu2
afljMxpbHnH868dHtjXk+JcraMAYyj8+ErCfRZbDnuua8cvKAN+lQBSzS67N
/RB8XKGv8XWxKnM2V82VKDNRkYwbnh09Pdk3LHNimZFDzP8hnz+Mr1hsetHd
HH48Mb7OWLG2+MdZPrwsFz6tsVbjG3FtPGZxUTIoo/RDyu7B8es94wuR/ZDl
F5sH+34CymtDfQ9x/piR4HpNtw530ug3+DYVfAV9xcAneQVeg1/rXY7zCzAb
XMsv9ozDGT5XYD1niVhIclOewQBE9Qd8mhXFXK7oOgbfO+KdFsnW7UQ2r3s6
MY7W1Xg6Y8X1qn/9vXjcqJ9tjU1vbNukfo9PTqfr+vedYJdEtsKM4NSSFUfI
UAEFSmk8h7CvsryngScHh2fGczjWinFpyqSm0+vFQsAR8cF8aPQde3fPWC4n
UET3//3P/7Cc6MFG5yCWEEQ9yRgcAxb8kO59aIXBHbrt+l7oP6yLik9e0i2T
zIa+u2OMc7eOPyK1W+f/o9WlUro1ARyTRyQJM+MJ6VDfhfxhTRG+ui4uis1j
Pp8YJ1URi7VRnzOMCg+71ihH3kD7D/BqxHzMYqt+k/jgKharnBIBKanWBWLG
z86Op8+f7hlfsyXLGz1VMm97GQcXuLrFQ343MU5FJsq1lXyXzefZWsuGZRws
l/MMqtYYiBz5oKwr4m49eyUqyiaM6ausfi3KOVo3z+KbCaLlJVsgDq9N5Jui
EtnNxm0sXbMaaS9fnq2byzN4fxnBYGfG05LxeeuuezbimPXM+HZ6/OTkX1pn
QTayLKpshRC63mRbjZFEHozEtuzNRvLq1avJqkI6cyVthBd5Kkpi30N1tdIE
YTrLEp4or6XgH851TLrVGr6GNeh+HRO/Xs0zNrgu+XdYINObz6WqbKb2bGJ8
Wa7iuFoj+Iyt5ust9yQJ0znLoBb5EkJYt59ZsWDVpvbNxIeCPn7yzIrWMiHY
1vVrkjJyaYp7gpXSTyLzZAvji4xVQvrM9Qj9Tv7RinZcLXrHDSF6xw/vDOeO
5bmty7OiSeZOcPMYt94t5NOJcZzx2bwSyQ3LPWUlZL2hWbLwy5K9XrObzlFs
HewJuxDzTSNx5Lfrje87zhnlatmCrevaGVypTNYGbfccpdUQc2xaY0fqyeHZ
gRUO9eQQzvOQiQra8YVgtfElapis+m80NmokpAOVjNIqQ0bnJCPCcHcXDHOv
4e3I7Z6JVUW6Rk7wq+xiZhyxmslEby6uaH43fUzjQJVCXZRsObuW9z8RNdVe
rXeZGAeHT6akbCFZOK9XpcCwtVLfNpnUjnjPeIlUxzLDyFZ66QY+9NKN3LvT
TDN4GAVQRHArGkeOEwZj84Xt3a2VyIP+zFaJyNn1mginAh7wZqOU4c//zgu4
32fF/Lom2WU/roTx6Oe/JT//rWRoSGC3bFWxHCn18bNHjzePfYSxs9c//+91
HT1COQ3ZrrW9/8BtPRCSJp1mueUONUn7mDXP0vmcnuynMBtOtf0BGpQYe1qA
iHhwSCO595Z3GISWErcdmeSGTO8dxW3hFmvsvrDCe6Z3VvjQjuy7dQOFGJgF
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

-->

</rfc>
