<?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.39 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-aegis-aead-04" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.4 -->
  <front>
    <title>The AEGIS Family of Authenticated Encryption Algorithms</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-aegis-aead-04"/>
    <author initials="F." surname="Denis" fullname="Frank Denis">
      <organization>Fastly Inc.</organization>
      <address>
        <email>fde@00f.net</email>
      </address>
    </author>
    <author initials="S." surname="Lucas" fullname="Samuel Lucas">
      <organization>Individual Contributor</organization>
      <address>
        <email>samuel-lucas6@pm.me</email>
      </address>
    </author>
    <date year="2023" month="July" day="24"/>
    <workgroup>Crypto Forum</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 177?>

<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>
    <?line 183?>

<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>In a fully committing AEAD scheme, finding different inputs (key, nonce, associated data, message) producing the same authentication tag has a complexity that depends on the tag size. A 128-bit tag provides 64-bit committing security, which is generally acceptable for interactive protocols. With a 256-bit tag, finding a collision becomes impractical. As of the time of writing, no research has been published claiming that AEGIS is not a fully committing AEAD scheme.</t>
      <t>Finally, unlike most other AES-based AEAD constructions, leaking a state does not leak the previous states.</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>
      <?line -18?>

<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 unsigned 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>Absorb(ai)</tt>: the input block absorption 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_bits, msg_len_bits)</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>: an AES block built from the following bytes in hexadecimal format: <tt>{ 0x00, 0x01, 0x01, 0x02, 0x03, 0x05, 0x08, 0x0d, 0x15, 0x22, 0x37, 0x59, 0x90, 0xe9, 0x79, 0x62 }</tt>.</li>
        <li>
          <tt>C1</tt>: an AES block built from the following bytes in hexadecimal format: <tt>{ 0xdb, 0x3d, 0x18, 0x55, 0x6d, 0xc2, 0x2f, 0xf1, 0x20, 0x11, 0x31, 0x42, 0x73, 0xb5, 0x28, 0xdd }</tt>.</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 ai in ad_blocks:
    Absorb(ai)

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

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

return ct and tag
]]></artwork>
      </section>
      <section anchor="authenticated-decryption">
        <name>Authenticated Decryption</name>
        <artwork><![CDATA[
Decrypt(ct, tag, ad, key, nonce)
]]></artwork>
        <t>The <tt>Decrypt</tt> function decrypts a ciphertext, verifies that the authentication tag is correct, and returns the message on success or an error if tag verification failed.</t>
        <t>Security:</t>
        <ul spacing="normal">
          <li>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 ai in ad_blocks:
    Absorb(ai)

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

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

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

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

if CtEq(tag, expected_tag) is False:
    erase msg
    return "verification failed" error
else:
    return msg
]]></artwork>
      </section>
      <section anchor="the-init-function">
        <name>The Init Function</name>
        <artwork><![CDATA[
Init(key, nonce)
]]></artwork>
        <t>The <tt>Init</tt> function constructs the initial state <tt>{S0, ...S7}</tt> using the given <tt>key</tt> and <tt>nonce</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>key</tt>: the encryption key.</li>
          <li>
            <tt>nonce</tt>: the public 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-absorb-function">
        <name>The Absorb Function</name>
        <artwork><![CDATA[
Absorb(ai)
]]></artwork>
        <t>The <tt>Absorb</tt> function absorbs a 256-bit input block <tt>ai</tt> into the state <tt>{S0, ...S7}</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ai</tt>: the 256-bit input block.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
t0, t1 = Split(ai, 128)
Update(t0, t1)
]]></artwork>
      </section>
      <section anchor="the-enc-function">
        <name>The Enc Function</name>
        <artwork><![CDATA[
Enc(xi)
]]></artwork>
        <t>The <tt>Enc</tt> function encrypts a 256-bit input block <tt>xi</tt> using the state <tt>{S0, ...S7}</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <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_bits, msg_len_bits)
]]></artwork>
        <t>The <tt>Finalize</tt> function computes a 128- or 256-bit tag that authenticates the message and associated data.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ad_len_bits</tt>: the length of the associated data in bits.</li>
          <li>
            <tt>msg_len_bits</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_bits) || LE64(msg_len_bits))

Repeat(7, Update(t, t))

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

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

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

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

return ct and tag
]]></artwork>
      </section>
      <section anchor="authenticated-decryption-1">
        <name>Authenticated Decryption</name>
        <artwork><![CDATA[
Decrypt(ct, tag, ad, key, nonce)
]]></artwork>
        <t>The <tt>Decrypt</tt> function decrypts a ciphertext, verifies that the authentication tag is correct, and returns the message on success or an error if tag verification failed.</t>
        <t>Security:</t>
        <ul spacing="normal">
          <li>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 ai in ad_blocks:
    Absorb(ai)

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

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

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

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

if CtEq(tag, expected_tag) is False:
    erase msg
    return "verification failed" error
else:
    return msg
]]></artwork>
      </section>
      <section anchor="the-init-function-1">
        <name>The Init Function</name>
        <artwork><![CDATA[
Init(key, nonce)
]]></artwork>
        <t>The <tt>Init</tt> function constructs the initial state <tt>{S0, ...S5}</tt> using the given <tt>key</tt> and <tt>nonce</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>key</tt>: the encryption key.</li>
          <li>
            <tt>nonce</tt>: the public 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-absorb-function-1">
        <name>The Absorb Function</name>
        <artwork><![CDATA[
Absorb(ai)
]]></artwork>
        <t>The <tt>Absorb</tt> function absorbs a 128-bit input block <tt>ai</tt> into the state <tt>{S0, ...S5}</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ai</tt>: the input block.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Update(ai)
]]></artwork>
      </section>
      <section anchor="the-enc-function-1">
        <name>The Enc Function</name>
        <artwork><![CDATA[
Enc(xi)
]]></artwork>
        <t>The <tt>Enc</tt> function encrypts a 128-bit input block <tt>xi</tt> using the state <tt>{S0, ...S5}</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <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>
      </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_bits, msg_len_bits)
]]></artwork>
        <t>The <tt>Finalize</tt> function computes a 128- or 256-bit tag that authenticates the message and associated data.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ad_len_bits</tt>: the length of the associated data in bits.</li>
          <li>
            <tt>msg_len_bits</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_bits) || LE64(msg_len_bits))

Repeat(7, Update(t))

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

return tag
]]></artwork>
      </section>
    </section>
    <section anchor="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, nonces, or associated data. Assuming AEGIS is fully committing, finding different inputs producing the same tag 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 both AEGIS-128L and AEGIS-256 target 128-bit security against forgery attacks regardless of the tag size.</t>
      <t>Both algorithms <bcp14>MUST</bcp14> be used in a nonce-respecting setting: for a given <tt>key</tt>, a <tt>nonce</tt> <bcp14>MUST</bcp14> only be used once. Failure to do so would immediately reveal the bitwise difference between two messages.</t>
      <t>If tag verification fails, the decrypted message and wrong message authentication tag <bcp14>MUST NOT</bcp14> be given as output. As shown in the analysis of the (robustness of CAESAR candidates beyond their guarantees)<xref target="VV18"/>, even a partial leak of the plaintext without verification would facilitate chosen ciphertext attacks.</t>
      <t>Every key <bcp14>MUST</bcp14> be randomly chosen from a uniform distribution.</t>
      <t>The nonce <bcp14>MAY</bcp14> be public or predictable. It can be a counter, the output of a permutation, or a generator with a long period.</t>
      <t>With AEGIS-128L, random nonces can safely encrypt up to 2<sup>48</sup> messages using the same key with negligible (~ 2<sup>-33</sup>, to align with NIST guidelines) collision probability.</t>
      <t>With AEGIS-256, random nonces can be used with no practical limits.</t>
      <t>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="M14"/>, 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>A 128-bit tag length must be used with these cipher suites.</t>
      <t>IANA is requested to update the references of these entries to refer to the final version of this document.</t>
    </section>
    <section anchor="quic-and-dtls-13-header-protection">
      <name>QUIC and DTLS 1.3 Header Protection</name>
      <section anchor="dtls-13-record-number-encryption">
        <name>DTLS 1.3 Record Number Encryption</name>
        <t>In DTLS 1.3, record sequence numbers are encrypted as specified in [RFC9147].</t>
        <t>For AEGIS-128L and AEGIS-256, the mask is generated using the AEGIS <tt>Encrypt</tt> function with:</t>
        <ul spacing="normal">
          <li>a 128-bit tag length</li>
          <li>
            <tt>sn_key</tt>, as defined in Section 4.2.3 of [RFC9147]</li>
          <li>
            <tt>ciphertext[0..16]</tt>: the first 16 bytes of the DTLS ciphertext</li>
          <li>
            <tt>nonce_len</tt>: the AEGIS nonce length</li>
        </ul>
        <t>The mask is computed as follows:</t>
        <artwork><![CDATA[
mask = Encrypt("", "", sn_key, ZeroPad(ciphertext[0..16], nonce_len))
]]></artwork>
      </section>
      <section anchor="quic-header-protection">
        <name>QUIC Header Protection</name>
        <t>In QUIC, parts of the QUIC packet headers are encrypted as specified in [RFC9001].</t>
        <t>For AEGIS-128L and AEGIS-256, the mask is generated using the AEGIS <tt>Encrypt</tt> function with:</t>
        <ul spacing="normal">
          <li>a 128-bit tag length</li>
          <li>
            <tt>hp_key</tt>, as defined in Section 5.4 of [RFC9001]</li>
          <li>
            <tt>sample</tt>: the 16 bytes QUIC ciphertext sample</li>
          <li>
            <tt>nonce_len</tt>: the AEGIS nonce length</li>
        </ul>
        <t>The mask is computed as follows:</t>
        <artwork><![CDATA[
mask = Encrypt("", "", hp_key, ZeroPad(sample, nonce_len))
]]></artwork>
      </section>
    </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"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC5116">
          <front>
            <title>An Interface and Algorithms for Authenticated Encryption</title>
            <author fullname="D. McGrew" initials="D." surname="McGrew"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>This document defines algorithms for Authenticated Encryption with Associated Data (AEAD), and defines a uniform interface and a registry for such algorithms. The interface and registry can be used as an application-independent set of cryptoalgorithm suites. This approach provides advantages in efficiency and security, and promotes the reuse of crypto implementations. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5116"/>
          <seriesInfo name="DOI" value="10.17487/RFC5116"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="AEGIS" target="https://competitions.cr.yp.to/round3/aegisv11.pdf">
          <front>
            <title>AEGIS: A Fast Authenticated Encryption Algorithm (v1.1)</title>
            <author initials="H." surname="Wu" fullname="Hongjun Wu">
              <organization>Nanyang Technological University</organization>
            </author>
            <author initials="B." surname="Preneel" fullname="Bart Preneel">
              <organization>KU Leuven</organization>
            </author>
            <date year="2016" month="September" day="15"/>
          </front>
        </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="JLD21">
          <front>
            <title>Guess-and-Determine Attacks on AEGIS</title>
            <author initials="L." surname="Jiao" fullname="Lin Jiao">
              <organization>State Key Laboratory of Cryptology</organization>
            </author>
            <author initials="Y." surname="Li" fullname="Yongqiang Li">
              <organization>State Key Laboratory of Information Security, Institute of Information Engineering, Chinese Academy of Sciences; School of Cyber Security, University of Chinese Academy of Sciences</organization>
            </author>
            <author initials="S." surname="Du" fullname="Shaoyu Du">
              <organization>State Key Laboratory of Cryptology</organization>
            </author>
            <date year="2021" month="May" day="22"/>
          </front>
          <seriesInfo name="DOI" value="10.1093/comjnl/bxab059"/>
          <refcontent>The Computer Journal, vol 65, 2022(8), pp. 2221–2230</refcontent>
        </reference>
        <reference anchor="LGR21" target="https://www.usenix.org/conference/usenixsecurity21/presentation/len">
          <front>
            <title>Partitioning Oracle Attacks</title>
            <author initials="J." surname="Len" fullname="Julia Len">
              <organization>Cornell Tech</organization>
            </author>
            <author initials="P." surname="Grubbs" fullname="Paul Grubbs">
              <organization>Cornell Tech</organization>
            </author>
            <author initials="T." surname="Ristenpart" fullname="Thomas Ristenpart">
              <organization>Cornell Tech</organization>
            </author>
            <date year="2021"/>
          </front>
          <refcontent>30th USENIX Security Symposium (USENIX Security 21), pp. 195–212</refcontent>
        </reference>
        <reference anchor="LIMS21">
          <front>
            <title>Weak Keys in Reduced AEGIS and Tiaoxin</title>
            <author initials="F." surname="Liu" fullname="Fukang Liu">
              <organization>East China Normal University; University of Hyogo</organization>
            </author>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo; National Institute of Information and Communications Technology; PRESTO, Japan Science and Technology Agency</organization>
            </author>
            <author initials="W." surname="Meier" fullname="Willi Meier">
              <organization>University of Applied Sciences and Arts Northwestern Switzerland</organization>
            </author>
            <author initials="K." surname="Sakamoto" fullname="Kosei Sakamoto">
              <organization>University of Hyogo</organization>
            </author>
            <date year="2021" month="June" day="11"/>
          </front>
          <seriesInfo name="DOI" value="10.46586/tosc.v2021.i2.104-139"/>
          <refcontent>IACR Transactions on Symmetric Cryptology, 2021(2), pp. 104–139</refcontent>
        </reference>
        <reference anchor="M14">
          <front>
            <title>Linear Biases in AEGIS Keystream</title>
            <author initials="B." surname="Minaud" fullname="Brice Minaud">
              <organization>ANSSI</organization>
            </author>
            <date year="2014"/>
          </front>
          <seriesInfo name="DOI" value="10.1007/978-3-319-13051-4_18"/>
          <refcontent>Selected Areas in Cryptography. SAC 2014. Lecture Notes in Computer Science, vol 8781, pp. 290–305</refcontent>
        </reference>
        <reference anchor="STSI23">
          <front>
            <title>MILP-based security evaluation for AEGIS/Tiaoxin-346/Rocca</title>
            <author initials="T." surname="Shiraya" fullname="Takuro Shiraya">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="N." surname="Takeuchi" fullname="Nobuyuki Takeuchi">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="K." surname="Sakamoto" fullname="Kosei Sakamoto">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo; National Institute of Information and Communications Technology</organization>
            </author>
            <date year="2023" month="January" day="27"/>
          </front>
          <seriesInfo name="DOI" value="10.1049/ise2.12109"/>
          <refcontent>IET Information Security, vol 17, 2023(3), pp. 458-467</refcontent>
        </reference>
        <reference anchor="VV18">
          <front>
            <title>Can Caesar Beat Galois?</title>
            <author initials="S." surname="Vaudenay" fullname="Serge Vaudenay">
              <organization>EPFL</organization>
            </author>
            <author initials="D." surname="Vizár" fullname="Damian Vizár">
              <organization>EPFL</organization>
            </author>
            <date year="2018"/>
          </front>
          <seriesInfo name="DOI" value="10.1007/978-3-319-93387-0_25"/>
          <refcontent>Applied Cryptography and Network Security. ACNS 2018. Lecture Notes in Computer Science, vol 10892, pp. 476–494</refcontent>
        </reference>
      </references>
    </references>
    <?line 1027?>

<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 the following individuals for their contributions:</t>
      <ul spacing="normal">
        <li>Eric Lagergren and Daniel Bleichenbacher for catching a broken test vector and Daniel Bleichenbacher for many helpful suggestions.</li>
        <li>John Preuss Mattsson for his review of the draft, and for suggesting how AEGIS should be used in the context of DTLS and QUIC.</li>
        <li>Bart Mennink and Charlotte Lefevre for their input regarding the commitment security of the schemes specified in this document.</li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
AAA=

-->

</rfc>
