<?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.7.19 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-aegis-aead-13" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title>The AEGIS Family of Authenticated Encryption Algorithms</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-aegis-aead-13"/>
    <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="2024" month="October" day="14"/>
    <workgroup>Crypto Forum</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 295?>

<t>This document describes the AEGIS-128L, AEGIS-256, AEGIS-128X, and AEGIS-256X AES-based authenticated encryption algorithms designed for high-performance applications.</t>
      <t>The 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/cfrg/draft-irtf-cfrg-aegis-aead"/>.</t>
    </note>
  </front>
  <middle>
    <?line 302?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes the AEGIS family of authenticated encryption with associated data (AEAD) algorithms <xref target="AEGIS"/>, which were chosen for high-performance applications in the CAESAR (Competition for Authenticated Encryption: Security, Applicability, and Robustness) competition.</t>
      <t>Among the finalists, AEGIS-128 was chosen as the winner for this category. However, AEGIS-128L, another finalist, offers enhanced performance and a stronger security margin <xref target="ENP19"/> <xref target="JLD21"/> <xref target="LIMS21"/> <xref target="STSI23"/>.
Additionally, AEGIS-256, which also reached the final round, provides 256-bit security and supports higher usage limits.</t>
      <t>Therefore, this document specifies the following variants:</t>
      <ul spacing="normal">
        <li>
          <t>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.</t>
        </li>
        <li>
          <t>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.</t>
        </li>
        <li>
          <t>AEGIS-128X, which is a mode based on AEGIS-128L, specialized for CPUs with large vector registers and vector AES instructions.</t>
        </li>
        <li>
          <t>AEGIS-256X, which is a mode based on AEGIS-256, specialized for CPUs with large vector registers and vector AES instructions.</t>
        </li>
      </ul>
      <t>All variants are inverse-free and constructed from the AES encryption round function <xref target="FIPS-AES"/>.</t>
      <t>The AEGIS cipher family offers performance that significantly exceeds that of AES-GCM on CPUs with AES instructions. Similarly, software implementations not using AES instructions 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 and AEGIS-256X. AEGIS-128L and AEGIS-128X also allow 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 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 AEGIS, finding distinct (key, nonce) pairs that successfully decrypt a given (associated data, ciphertext, authentication tag) tuple is believed to have 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.</t>
      <t>Unlike most other AES-based AEAD constructions, leaking a state does not leak the key or previous states.</t>
      <t>Finally, an AEGIS key is not required after the initialization function, and there is no key schedule. Thus, ephemeral keys can be erased from memory before any data has been encrypted or decrypted, mitigating cold boot attacks.</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 state updates in the <tt>Finalize()</tt> function. We follow the specification of <xref target="AEGIS"/>, 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>Throughout this document, “byte” is used interchangeably with “octet” and refers to an 8-bit sequence.</t>
      <t>Primitives:</t>
      <ul spacing="normal">
        <li>
          <t><tt>{}</tt>: an empty bit array.</t>
        </li>
        <li>
          <t><tt>|x|</tt>: the length of <tt>x</tt> in bits.</t>
        </li>
        <li>
          <t><tt>a ^ b</tt>: the bitwise exclusive OR operation between <tt>a</tt> and <tt>b</tt>.</t>
        </li>
        <li>
          <t><tt>a &amp; b</tt>: the bitwise AND operation between <tt>a</tt> and <tt>b</tt>.</t>
        </li>
        <li>
          <t><tt>a || b</tt>: the concatenation of <tt>a</tt> and <tt>b</tt>.</t>
        </li>
        <li>
          <t><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.</t>
        </li>
        <li>
          <t><tt>LE64(x)</tt>: the little-endian encoding of unsigned 64-bit integer <tt>x</tt>.</t>
        </li>
        <li>
          <t><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.</t>
        </li>
        <li>
          <t><tt>Truncate(x, n)</tt>: truncation operation. The first <tt>n</tt> bits of <tt>x</tt> are kept.</t>
        </li>
        <li>
          <t><tt>Split(x, n)</tt>: splitting operation. <tt>x</tt> is split into <tt>n</tt>-bit blocks, ignoring partial blocks.</t>
        </li>
        <li>
          <t><tt>Tail(x, n)</tt>: returns the last <tt>n</tt> bits of <tt>x</tt>.</t>
        </li>
        <li>
          <t><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.</t>
        </li>
        <li>
          <t><tt>Repeat(n, F)</tt>: <tt>n</tt> sequential evaluations of the function <tt>F</tt>.</t>
        </li>
        <li>
          <t><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.</t>
        </li>
      </ul>
      <t>AEGIS internal functions:</t>
      <ul spacing="normal">
        <li>
          <t><tt>Update(M0, M1)</tt> or <tt>Update(M)</tt>: the state update function.</t>
        </li>
        <li>
          <t><tt>Init(key, nonce)</tt>: the initialization function.</t>
        </li>
        <li>
          <t><tt>Absorb(ai)</tt>: the input block absorption function.</t>
        </li>
        <li>
          <t><tt>Enc(xi)</tt>: the input block encryption function.</t>
        </li>
        <li>
          <t><tt>Dec(ci)</tt>: the input block decryption function.</t>
        </li>
        <li>
          <t><tt>DecPartial(cn)</tt>: the input block decryption function for the last ciphertext bits when they do not fill an entire block.</t>
        </li>
        <li>
          <t><tt>Finalize(ad_len_bits, msg_len_bits)</tt>: the authentication tag generation function.</t>
        </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>
          <t><tt>Si</tt>: the <tt>i</tt>-th AES block of the current state.</t>
        </li>
        <li>
          <t><tt>S'i</tt>: the <tt>i</tt>-th AES block of the next state.</t>
        </li>
        <li>
          <t><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.</t>
        </li>
        <li>
          <t><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>.</t>
        </li>
        <li>
          <t><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>.</t>
        </li>
      </ul>
      <t>AES blocks are always 128 bits in length.</t>
      <t>Input and output values:</t>
      <ul spacing="normal">
        <li>
          <t><tt>key</tt>: the encryption key (128 bits for AEGIS-128L, 256 bits for AEGIS-256).</t>
        </li>
        <li>
          <t><tt>nonce</tt>: the public nonce (128 bits for AEGIS-128L, 256 bits for AEGIS-256).</t>
        </li>
        <li>
          <t><tt>ad</tt>: the associated data.</t>
        </li>
        <li>
          <t><tt>msg</tt>: the plaintext.</t>
        </li>
        <li>
          <t><tt>ct</tt>: the ciphertext.</t>
        </li>
        <li>
          <t><tt>tag</tt>: the authentication tag (128 or 256 bits).</t>
        </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>
          <t><tt>K_LEN</tt> (key length) is 16 bytes (128 bits).</t>
        </li>
        <li>
          <t><tt>P_MAX</tt> (maximum length of the plaintext) is 2<sup>61</sup> - 1 bytes (2<sup>64</sup> - 8 bits).</t>
        </li>
        <li>
          <t><tt>A_MAX</tt> (maximum length of the associated data) is 2<sup>61</sup> - 1 bytes (2<sup>64</sup> - 8 bits).</t>
        </li>
        <li>
          <t><tt>N_MIN</tt> (minimum nonce length) = <tt>N_MAX</tt> (maximum nonce length) = 16 bytes (128 bits).</t>
        </li>
        <li>
          <t><tt>C_MAX</tt> (maximum ciphertext length) = <tt>P_MAX</tt> + tag length = (2<sup>61</sup> - 1) + 16 or 32 bytes (in bits: (2<sup>64</sup> - 8) + 128 or 256 bits).</t>
        </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>
            <t>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.</t>
          </li>
          <li>
            <t>The key <bcp14>MUST</bcp14> be randomly chosen from a uniform distribution.</t>
          </li>
        </ul>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>msg</tt>: the message to be encrypted (length <bcp14>MUST</bcp14> be less than or equal to <tt>P_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than or equal to <tt>A_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ct</tt>: the ciphertext.</t>
          </li>
          <li>
            <t><tt>tag</tt>: the authentication tag.</t>
          </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>
            <t>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.</t>
          </li>
          <li>
            <t>The comparison of the input <tt>tag</tt> with the <tt>expected_tag</tt> <bcp14>MUST</bcp14> be done in constant time.</t>
          </li>
        </ul>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ct</tt>: the ciphertext to be decrypted (length <bcp14>MUST</bcp14> be less than or equal to <tt>C_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>tag</tt>: the authentication tag.</t>
          </li>
          <li>
            <t><tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than or equal to <tt>A_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t>Either the decrypted message <tt>msg</tt> or an error indicating that the authentication tag is invalid for the given inputs.</t>
          </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>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Defines:</t>
        <ul spacing="normal">
          <li>
            <t><tt>{S0, ...S7}</tt>: the initial state.</t>
          </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>
            <t><tt>M0</tt>: the first 128-bit block to be absorbed.</t>
          </li>
          <li>
            <t><tt>M1</tt>: the second 128-bit block to be absorbed.</t>
          </li>
        </ul>
        <t>Modifies:</t>
        <ul spacing="normal">
          <li>
            <t><tt>{S0, ...S7}</tt>: the state.</t>
          </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>
            <t><tt>ai</tt>: the 256-bit input block.</t>
          </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>
            <t><tt>xi</tt>: the 256-bit input block.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ci</tt>: the 256-bit encrypted block.</t>
          </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>
            <t><tt>ci</tt>: the 256-bit encrypted block.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>xi</tt>: the 256-bit decrypted block.</t>
          </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>
            <t><tt>cn</tt>: the encrypted input.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>xn</tt>: the decryption of <tt>cn</tt>.</t>
          </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>
            <t><tt>ad_len_bits</tt>: the length of the associated data in bits.</t>
          </li>
          <li>
            <t><tt>msg_len_bits</tt>: the length of the message in bits.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>tag</tt>: the authentication tag.</t>
          </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>
          <t><tt>K_LEN</tt> (key length) is 32 bytes (256 bits).</t>
        </li>
        <li>
          <t><tt>P_MAX</tt> (maximum length of the plaintext) is 2<sup>61</sup> - 1 bytes (2<sup>64</sup> - 8 bits).</t>
        </li>
        <li>
          <t><tt>A_MAX</tt> (maximum length of the associated data) is 2<sup>61</sup> bytes (2<sup>64</sup> bits).</t>
        </li>
        <li>
          <t><tt>N_MIN</tt> (minimum nonce length) = <tt>N_MAX</tt> (maximum nonce length) = 32 bytes (256 bits).</t>
        </li>
        <li>
          <t><tt>C_MAX</tt> (maximum ciphertext length) = <tt>P_MAX</tt> + tag length = (2<sup>61</sup> - 1) + 16 or 32 bytes (in bits: (2<sup>64</sup> - 8) + 128 or 256 bits).</t>
        </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>
            <t>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.</t>
          </li>
          <li>
            <t>The key <bcp14>MUST</bcp14> be randomly chosen from a uniform distribution.</t>
          </li>
        </ul>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>msg</tt>: the message to be encrypted (length <bcp14>MUST</bcp14> be less than or equal to <tt>P_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than or equal to <tt>A_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ct</tt>: the ciphertext.</t>
          </li>
          <li>
            <t><tt>tag</tt>: the authentication tag.</t>
          </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>
            <t>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.</t>
          </li>
          <li>
            <t>The comparison of the input <tt>tag</tt> with the <tt>expected_tag</tt> <bcp14>MUST</bcp14> be done in constant time.</t>
          </li>
        </ul>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ct</tt>: the ciphertext to be decrypted (length <bcp14>MUST</bcp14> be less than or equal to <tt>C_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>tag</tt>: the authentication tag.</t>
          </li>
          <li>
            <t><tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than or equal to <tt>A_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t>Either the decrypted message <tt>msg</tt> or an error indicating that the authentication tag is invalid for the given inputs.</t>
          </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>
            <t><tt>key</tt>: the encryption key.</t>
          </li>
          <li>
            <t><tt>nonce</tt>: the public nonce.</t>
          </li>
        </ul>
        <t>Defines:</t>
        <ul spacing="normal">
          <li>
            <t><tt>{S0, ...S5}</tt>: the initial state.</t>
          </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>
            <t><tt>msg</tt>: the block to be absorbed.</t>
          </li>
        </ul>
        <t>Modifies:</t>
        <ul spacing="normal">
          <li>
            <t><tt>{S0, ...S5}</tt>: the state.</t>
          </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>
            <t><tt>ai</tt>: the input block.</t>
          </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>
            <t><tt>xi</tt>: the input block.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ci</tt>: the encrypted input block.</t>
          </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>
            <t><tt>ci</tt>: the encrypted input block.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>xi</tt>: the decrypted block.</t>
          </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>
            <t><tt>cn</tt>: the encrypted input.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>xn</tt>: the decryption of <tt>cn</tt>.</t>
          </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>
            <t><tt>ad_len_bits</tt>: the length of the associated data in bits.</t>
          </li>
          <li>
            <t><tt>msg_len_bits</tt>: the length of the message in bits.</t>
          </li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>tag</tt>: the authentication tag.</t>
          </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="parallel-modes">
      <name>Parallel Modes</name>
      <t>Some CPUs, such as Intel and Intel-compatible CPUs with the VAES extensions, include instructions to efficiently apply the AES round function to a vector of AES blocks.</t>
      <t>AEGIS-128X and AEGIS-256X are optional, specialized modes designed to take advantage of these instructions. They share the same properties as the ciphers they are based on but can be significantly faster on these platforms, even for short messages.</t>
      <t>AEGIS-128X and AEGIS-256X are parallel evaluations of multiple AEGIS-128L and AEGIS-256 instances respectively, with distinct initial states. On CPUs with wide vector registers, different states can be stored in different 128-bit lanes of the same vector register, allowing parallel updates using vector instructions.</t>
      <t>The modes are parameterized by the parallelism degree. With 256-bit registers, 2 parallel operations can be applied to 128-bit AES blocks. With 512-bit registers, the number of instances can be raised to 4.</t>
      <t>The state of a parallel mode is represented as a vector of AEGIS-128L or AEGIS-256 states.</t>
      <section anchor="additional-conventions-and-definitions">
        <name>Additional Conventions and Definitions</name>
        <ul spacing="normal">
          <li>
            <t><tt>D</tt>: the degree of parallelism.</t>
          </li>
          <li>
            <t><tt>R</tt>: the absorption and output rate of the mode. With AEGIS-128X, the rate is <tt>2 * 128 * D</tt> bits. With AEGIS-256X, the rate is <tt>128 * D</tt> bits.</t>
          </li>
          <li>
            <t><tt>V[j,i]</tt>: the <tt>j</tt>-th AES block of the <tt>i</tt>-th state. <tt>i</tt> is in the <tt>[0..D)</tt> range. For AEGIS-128X, <tt>j</tt> is in the <tt>[0..8)</tt> range, while for AEGIS-256, <tt>j</tt> is in the <tt>[0..6)</tt> range.</t>
          </li>
          <li>
            <t><tt>V'[j,i]</tt>: the <tt>j</tt>-th AES block of the next <tt>i</tt>-th state.</t>
          </li>
          <li>
            <t><tt>ctx[i]</tt>: the <tt>i</tt>-th context separator. This is a 128-bit mask, made of a byte representing the state index, followed by a byte representing the highest index and 112 all-zero bits.</t>
          </li>
          <li>
            <t><tt>Byte(x)</tt>: the value <tt>x</tt> encoded as 8 bits.</t>
          </li>
        </ul>
      </section>
      <section anchor="authenticated-encryption-2">
        <name>Authenticated Encryption</name>
        <artwork><![CDATA[
Encrypt(msg, ad, key, nonce)
]]></artwork>
        <t>The <tt>Encrypt</tt> function of AEGIS-128X resembles that of AEGIS-128L, and similarly, the <tt>Encrypt</tt> function of AEGIS-256X mirrors that of AEGIS-256, but processes <tt>R</tt>-bit input blocks per update.</t>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

ct = {}

ad_blocks = Split(ZeroPad(ad, R), R)
for ai in ad_blocks:
    Absorb(ai)

msg_blocks = Split(ZeroPad(msg, R), R)
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-2">
        <name>Authenticated Decryption</name>
        <artwork><![CDATA[
Decrypt(ct, tag, ad, key, nonce)
]]></artwork>
        <t>The <tt>Decrypt</tt> function of AEGIS-128X resembles that of AEGIS-128L, and similarly, the <tt>Decrypt</tt> function of AEGIS-256X mirrors that of AEGIS-256, but processes <tt>R</tt>-bit input blocks per update.</t>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

msg = {}

ad_blocks = Split(ZeroPad(ad, R), R)
for ai in ad_blocks:
    Absorb(ai)

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

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="aegis-128x">
        <name>AEGIS-128X</name>
        <section anchor="the-init-function-2">
          <name>The Init Function</name>
          <artwork><![CDATA[
Init(key, nonce)
]]></artwork>
          <t>The <tt>Init</tt> function initializes a vector of <tt>D</tt> AEGIS-128L states with the same <tt>key</tt> and <tt>nonce</tt> but a different context <tt>ctx[i]</tt>. The context is added to the state before every update.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
for i in 0..D:
    V[0,i] = key ^ nonce
    V[1,i] = C1
    V[2,i] = C0
    V[3,i] = C1
    V[4,i] = key ^ nonce
    V[5,i] = key ^ C0
    V[6,i] = key ^ C1
    V[7,i] = key ^ C0

nonce_v = {}
key_v = {}
for i in 0..D:
    nonce_v = nonce_v || nonce
    key_v = key_v || key

for i in 0..D:
    ctx[i] = ZeroPad(Byte(i) || Byte(D - 1), 128)

Repeat(10,
    for i in 0..D:
        V[3,i] = V[3,i] ^ ctx[i]
        V[7,i] = V[7,i] ^ ctx[i]

    Update(nonce_v, key_v)
)
]]></artwork>
        </section>
        <section anchor="the-update-function-2">
          <name>The Update Function</name>
          <artwork><![CDATA[
Update(M0, M1)
]]></artwork>
          <t>The AEGIS-128X <tt>Update</tt> function is similar to the AEGIS-128L <tt>Update</tt> function, but absorbs <tt>R</tt> (<tt>2 * 128 * D</tt>) bits at once. <tt>M0</tt> and <tt>M1</tt> are <tt>128 * D</tt> bits instead of 128 bits but are split into 128-bit blocks, each of them updating a different AEGIS-128L state.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
m0 = Split(M0, 128)
m1 = Split(M1, 128)

for i in 0..D:
    V'[0,i] = AESRound(V[7,i], V[0,i] ^ m0[i])
    V'[1,i] = AESRound(V[0,i], V[1,i])
    V'[2,i] = AESRound(V[1,i], V[2,i])
    V'[3,i] = AESRound(V[2,i], V[3,i])
    V'[4,i] = AESRound(V[3,i], V[4,i] ^ m1[i])
    V'[5,i] = AESRound(V[4,i], V[5,i])
    V'[6,i] = AESRound(V[5,i], V[6,i])
    V'[7,i] = AESRound(V[6,i], V[7,i])

    V[0,i]  = V'[0,i]
    V[1,i]  = V'[1,i]
    V[2,i]  = V'[2,i]
    V[3,i]  = V'[3,i]
    V[4,i]  = V'[4,i]
    V[5,i]  = V'[5,i]
    V[6,i]  = V'[6,i]
    V[7,i]  = V'[7,i]
]]></artwork>
        </section>
        <section anchor="the-absorb-function-2">
          <name>The Absorb Function</name>
          <artwork><![CDATA[
Absorb(ai)
]]></artwork>
          <t>The <tt>Absorb</tt> function is similar to the AEGIS-128L <tt>Absorb</tt> function, but absorbs <tt>R</tt> bits instead of 256 bits.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
t0, t1 = Split(ai, R)
Update(t0, t1)
]]></artwork>
        </section>
        <section anchor="the-enc-function-2">
          <name>The Enc Function</name>
          <artwork><![CDATA[
Enc(xi)
]]></artwork>
          <t>The <tt>Enc</tt> function is similar to the AEGIS-128L <tt>Enc</tt> function, but encrypts <tt>R</tt> bits instead of 256 bits.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
z0 = {}
z1 = {}
for i in 0..D:
    z0 = z0 || (V[6,i] ^ V[1,i] ^ (V[2,i] & V[3,i]))
    z1 = z1 || (V[2,i] ^ V[5,i] ^ (V[6,i] & V[7,i]))

t0, t1 = Split(xi, R)
out0 = t0 ^ z0
out1 = t1 ^ z1

Update(t0, t1)
ci = out0 || out1

return ci
]]></artwork>
        </section>
        <section anchor="the-dec-function-2">
          <name>The Dec Function</name>
          <artwork><![CDATA[
Dec(ci)
]]></artwork>
          <t>The <tt>Dec</tt> function is similar to the AEGIS-128L <tt>Dec</tt> function, but decrypts <tt>R</tt> bits instead of 256 bits.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
z0 = {}
z1 = {}
for i in 0..D:
    z0 = z0 || (V[6,i] ^ V[1,i] ^ (V[2,i] & V[3,i]))
    z1 = z1 || (V[2,i] ^ V[5,i] ^ (V[6,i] & V[7,i]))

t0, t1 = Split(ci, R)
out0 = t0 ^ z0
out1 = t1 ^ z1

Update(out0, out1)
xi = out0 || out1

return xi
]]></artwork>
        </section>
        <section anchor="the-decpartial-function-2">
          <name>The DecPartial Function</name>
          <artwork><![CDATA[
DecPartial(cn)
]]></artwork>
          <t>The <tt>DecPartial</tt> function is similar to the AEGIS-128L <tt>DecPartial</tt> function, but decrypts up to <tt>R</tt> bits instead of 256 bits.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
z0 = {}
z1 = {}
for i in 0..D:
    z0 = z0 || (V[6,i] ^ V[1,i] ^ (V[2,i] & V[3,i]))
    z1 = z1 || (V[2,i] ^ V[5,i] ^ (V[6,i] & V[7,i]))

t0, t1 = Split(ZeroPad(cn, R), 128 * D)
out0 = t0 ^ z0
out1 = t1 ^ z1

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

v0, v1 = Split(ZeroPad(xn, R), 128 * D)
Update(v0, v1)

return xn
]]></artwork>
        </section>
        <section anchor="the-finalize-function-2">
          <name>The Finalize Function</name>
          <artwork><![CDATA[
Finalize(ad_len_bits, msg_len_bits)
]]></artwork>
          <t>The <tt>Finalize</tt> function finalizes every AEGIS-128L instance and combines the resulting authentication tags using the bitwise exclusive OR operation.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
t = {}
u = LE64(ad_len_bits) || LE64(msg_len_bits)
for i in 0..D:
    t = t || (V[2,i] ^ u)

Repeat(7, Update(t, t))

if tag_length == 16: # 128 bits
    tag = ZeroPad({}, 128)
    for i in 0..D:
        tag = tag ^ V[0,i] ^ V[1,i] ^ V[2,i] ^ V[3,i] ^ V[4,i] ^ V[5,i] ^ V[6,i]

else:                # 256 bits
    tag0 = ZeroPad({}, 128)
    tag1 = ZeroPad({}, 128)
    for i in 0..D:
        tag0 = tag0 ^ V[0,i] ^ V[1,i] ^ V[2,i] ^ V[3,i]
        tag1 = tag1 ^ V[4,i] ^ V[5,i] ^ V[6,i] ^ V[7,i]
    tag = tag0 || tag1

return tag
]]></artwork>
        </section>
      </section>
      <section anchor="aegis-256x">
        <name>AEGIS-256X</name>
        <section anchor="the-init-function-3">
          <name>The Init Function</name>
          <artwork><![CDATA[
Init(key, nonce)
]]></artwork>
          <t>The <tt>Init</tt> function initializes a vector of <tt>D</tt> AEGIS-256 states with the same <tt>key</tt> and <tt>nonce</tt> but a different context <tt>ctx[i]</tt>. The context is added to the state before every update.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
k0, k1 = Split(key, 128)
n0, n1 = Split(nonce, 128)

for i in 0..D:
    V[0,i] = k0 ^ n0
    V[1,i] = k1 ^ n1
    V[2,i] = C1
    V[3,i] = C0
    V[4,i] = k0 ^ C0
    V[5,i] = k1 ^ C1

k0_v, k1_v = {}, {}
k0n0_v, k1n1_v = {}, {}
for i in 0..D:
    k0_v = k0_v || k0
    k1_v = k1_v || k1
    k0n0_v = k0n0_v || (k0 ^ n0)
    k1n1_v = k1n1_v || (k1 ^ n1)

for i in 0..D:
    ctx[i] = ZeroPad(Byte(i) || Byte(D - 1), 128)

Repeat(4,
    for i in 0..D:
        V[3,i] = V[3,i] ^ ctx[i]
        V[5,i] = V[5,i] ^ ctx[i]

    Update(k0_v)
    for i in 0..D:
        V[3,i] = V[3,i] ^ ctx[i]
        V[5,i] = V[5,i] ^ ctx[i]

    Update(k1_v)
    for i in 0..D:
        V[3,i] = V[3,i] ^ ctx[i]
        V[5,i] = V[5,i] ^ ctx[i]

    Update(k0n0_v)
    for i in 0..D:
        V[3,i] = V[3,i] ^ ctx[i]
        V[5,i] = V[5,i] ^ ctx[i]

    Update(k1n1_v)
)
]]></artwork>
        </section>
        <section anchor="the-update-function-3">
          <name>The Update Function</name>
          <artwork><![CDATA[
Update(M)
]]></artwork>
          <t>The AEGIS-256X <tt>Update</tt> function is similar to the AEGIS-256 <tt>Update</tt> function, but absorbs <tt>R</tt> (<tt>128 * D</tt>) bits at once. <tt>M</tt> is <tt>128 * D</tt> bits instead of 128 bits and is split into 128-bit blocks, each of them updating a different AEGIS-256 state.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
m = Split(M, 128)

for i in 0..D:
    V'[0,i] = AESRound(V[5,i], V[0,i] ^ m[i])
    V'[1,i] = AESRound(V[0,i], V[1,i])
    V'[2,i] = AESRound(V[1,i], V[2,i])
    V'[3,i] = AESRound(V[2,i], V[3,i])
    V'[4,i] = AESRound(V[3,i], V[4,i])
    V'[5,i] = AESRound(V[4,i], V[5,i])

    V[0,i]  = V'[0,i]
    V[1,i]  = V'[1,i]
    V[2,i]  = V'[2,i]
    V[3,i]  = V'[3,i]
    V[4,i]  = V'[4,i]
    V[5,i]  = V'[5,i]
]]></artwork>
        </section>
        <section anchor="the-absorb-function-3">
          <name>The Absorb Function</name>
          <artwork><![CDATA[
Absorb(ai)
]]></artwork>
          <t>The <tt>Absorb</tt> function is similar to the AEGIS-256 <tt>Absorb</tt> function, but absorbs <tt>R</tt> bits instead of 128 bits.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
Update(ai)
]]></artwork>
        </section>
        <section anchor="the-enc-function-3">
          <name>The Enc Function</name>
          <artwork><![CDATA[
Enc(xi)
]]></artwork>
          <t>The <tt>Enc</tt> function is similar to the AEGIS-256 <tt>Enc</tt> function, but encrypts <tt>R</tt> bits instead of 128 bits.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
z = {}
for i in 0..D:
    z = z || (V[1,i] ^ V[4,i] ^ V[5,i] ^ (V[2,i] & V[3,i]))

Update(xi)

ci = xi ^ z

return ci
]]></artwork>
        </section>
        <section anchor="the-dec-function-3">
          <name>The Dec Function</name>
          <artwork><![CDATA[
Dec(ci)
]]></artwork>
          <t>The <tt>Dec</tt> function is similar to the AEGIS-256 <tt>Dec</tt> function, but decrypts <tt>R</tt> bits instead of 128 bits.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
z = {}
for i in 0..D:
    z = z || (V[1,i] ^ V[4,i] ^ V[5,i] ^ (V[2,i] & V[3,i]))

xi = ci ^ z

Update(xi)

return xi
]]></artwork>
        </section>
        <section anchor="the-decpartial-function-3">
          <name>The DecPartial Function</name>
          <artwork><![CDATA[
DecPartial(cn)
]]></artwork>
          <t>The <tt>DecPartial</tt> function is similar to the AEGIS-256 <tt>DecPartial</tt> function, but decrypts up to <tt>R</tt> bits instead of 128 bits.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
z = {}
for i in 0..D:
    z = z || (V[1,i] ^ V[4,i] ^ V[5,i] ^ (V[2,i] & V[3,i]))

t = ZeroPad(cn, R)
out = t ^ z

xn = Truncate(out, |cn|)

v = ZeroPad(xn, 128 * D)
Update(v)

return xn
]]></artwork>
        </section>
        <section anchor="the-finalize-function-3">
          <name>The Finalize Function</name>
          <artwork><![CDATA[
Finalize(ad_len_bits, msg_len_bits)
]]></artwork>
          <t>The <tt>Finalize</tt> function finalizes every AEGIS-256 instance and combines the resulting authentication tags using the bitwise exclusive OR operation.</t>
          <t>Steps:</t>
          <artwork><![CDATA[
t = {}
u = LE64(ad_len_bits) || LE64(msg_len_bits)
for i in 0..D:
    t = t || (V[3,i] ^ u)

Repeat(7, Update(t))

if tag_length == 16: # 128 bits
    tag = ZeroPad({}, 128)
    for i in 0..D:
        tag = tag ^ V[0,i] ^ V[1,i] ^ V[2,i] ^ V[3,i] ^ V[4,i] ^ V[5,i]

else:                # 256 bits
    tag0 = ZeroPad({}, 128)
    tag1 = ZeroPad({}, 128)
    for i in 0..D:
        tag0 = tag0 ^ V[0,i] ^ V[1,i] ^ V[2,i]
        tag1 = tag1 ^ V[3,i] ^ V[4,i] ^ V[5,i]
    tag = tag0 || tag1

return tag
]]></artwork>
        </section>
      </section>
      <section anchor="implementation-considerations">
        <name>Implementation Considerations</name>
        <t>AEGIS-128X and AEGIS-256X with a degree of <tt>1</tt> are identical to AEGIS-128L and AEGIS-256. This property can be used to reduce the code size of a generic implementation.</t>
        <t>In AEGIS-128X, <tt>V</tt> can be represented as eight 256-bit registers (when <tt>D = 2</tt>) or eight 512-bit registers (when <tt>D = 4</tt>). In AEGIS-256X, <tt>V</tt> can be represented as six 256-bit registers (when <tt>D = 2</tt>) or six 512-bit registers (when <tt>D = 4</tt>). With this representation, loops over <tt>0..D</tt> in the above pseudocode can be replaced by vector instructions.</t>
      </section>
      <section anchor="operational-considerations">
        <name>Operational Considerations</name>
        <t>The AEGIS parallel modes are specialized and can only improve performance on specific CPUs.</t>
        <t>The degrees of parallelism implementations are encouraged to support are <tt>2</tt> (for CPUs with 256-bit registers) and <tt>4</tt> (for CPUs with 512-bit registers). The resulting algorithms are called <tt>AEGIS-128X2</tt>, <tt>AEGIS-128X4</tt>, <tt>AEGIS-256X2</tt>, and <tt>AEGIS-256X4</tt>.</t>
        <t>The following table summarizes how many bits are processed in parallel (rate), the memory requirements (state size), and the minimum vector register sizes a CPU should support for optimal performance.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Algorithm</th>
              <th align="right">Rate (bits)</th>
              <th align="center">Optimal Register Size</th>
              <th align="right">State Size (bits)</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">AEGIS-128L</td>
              <td align="right">256</td>
              <td align="center">128 bits</td>
              <td align="right">1024</td>
            </tr>
            <tr>
              <td align="left">AEGIS-128X2</td>
              <td align="right">512</td>
              <td align="center">256 bits</td>
              <td align="right">2048</td>
            </tr>
            <tr>
              <td align="left">AEGIS-128X4</td>
              <td align="right">1024</td>
              <td align="center">512 bits</td>
              <td align="right">4096</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256</td>
              <td align="right">128</td>
              <td align="center">128 bits</td>
              <td align="right">768</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256X2</td>
              <td align="right">256</td>
              <td align="center">256 bits</td>
              <td align="right">1536</td>
            </tr>
            <tr>
              <td align="left">AEGIS-256X4</td>
              <td align="right">512</td>
              <td align="center">512 bits</td>
              <td align="right">3072</td>
            </tr>
          </tbody>
        </table>
        <t>Note that architectures with smaller vector registers but with many registers and large pipelines may still benefit from the parallel modes.</t>
        <t>Protocols <bcp14>SHOULD</bcp14> opt for a parallel mode only when all the involved parties agree on a specific variant. AEGIS-128L and AEGIS-256 <bcp14>SHOULD</bcp14> remain the default choices.</t>
        <t>Implementations <bcp14>MAY</bcp14> choose not to include the parallel AEGIS modes.</t>
      </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="aegis-as-a-stream-cipher">
      <name>AEGIS as a Stream Cipher</name>
      <t>All AEGIS variants can also be used as stream ciphers.</t>
      <artwork><![CDATA[
Stream(len, key, nonce)
]]></artwork>
      <t>The <tt>Stream</tt> function expands a key and an optional nonce into a variable-length, secure keystream.</t>
      <t>Inputs:</t>
      <ul spacing="normal">
        <li>
          <t><tt>len</tt>: the length of the keystream to generate in bits.</t>
        </li>
        <li>
          <t><tt>key</tt>: the AEGIS key.</t>
        </li>
        <li>
          <t><tt>nonce</tt>: the nonce. If unspecified, it is set to <tt>N_MAX</tt> zero bytes.</t>
        </li>
      </ul>
      <t>Outputs:</t>
      <ul spacing="normal">
        <li>
          <t><tt>stream</tt>: the keystream.</t>
        </li>
      </ul>
      <t>Steps:</t>
      <artwork><![CDATA[
stream, tag = Encrypt(ZeroPad({}, len), {}, key, nonce)

return stream
]]></artwork>
      <t>This is equivalent to encrypting a <tt>len</tt> all-zero bits message without associated data, and discarding the authentication tag.</t>
      <t>Instead of relying on the generic <tt>Encrypt</tt> function, implementations can skip the finalization step.</t>
      <t>After initialization, the <tt>Update</tt> function is called with constant parameters, allowing further optimizations.</t>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t><em>This note is to be removed before publishing as an RFC.</em></t>
      <t>Multiple implementations of the schemes described in this document have been developed and verified for interoperability.</t>
      <t>A comprehensive list of known implementations and integrations can be found at <eref target="https://github.com/cfrg/draft-irtf-cfrg-aegis-aead"/>, which includes reference implementations closely aligned with the pseudocode provided in this document.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="usage-guidelines">
        <name>Usage Guidelines</name>
        <section anchor="key-and-nonce-selection">
          <name>Key and Nonce Selection</name>
          <t>All AEGIS variants <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, even with different <tt>tag</tt> lengths. Failure to do so would immediately reveal the bitwise difference between two messages.</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 and AEGIS-128X, 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 and AEGIS-256X, random nonces can be used with no practical limits.</t>
        </section>
        <section anchor="key-commitment">
          <name>Key Commitment</name>
          <t>An authentication tag may verify under multiple keys, nonces, or associated data, but AEGIS is assumed to be key committing in the receiver-binding game, preventing common attacks when used with low-entropy keys such as passwords. Finding distinct keys and/or nonces that successfully verify the same <tt>(ad, ct, tag)</tt> tuple 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>AEGIS is fully committing in the restricted setting where an adversary cannot control the associated data. As shown in <xref target="IR23"/>, with the ability to alter the associated data, it is possible to efficiently find multiple keys that will verify the same authenticated ciphertext.</t>
          <t>Protocols mandating a fully committing scheme without that restriction can provide the associated data as input to a cryptographic hash function and use the output as the <tt>ad</tt> parameter of the <tt>Encrypt</tt> and <tt>Decrypt</tt> functions. The selected hash function must ensure a minimum of 128-bit preimage resistance. An instance of such a function is SHA-256 <xref target="RFC6234"/>.</t>
          <t>Alternatively, the associated data can be fed into a collision-resistant KDF, such as HKDF <xref target="RFC5869"/>, via the <tt>info</tt> input to derive the <tt>key</tt> parameter. The <tt>ad</tt> parameter can then be left empty. Note that the <tt>salt</tt> input <bcp14>MUST NOT</bcp14> be used since large salts get hashed, which affects commitment. Furthermore, this requires values concatenated to form the <tt>info</tt> input to be unambiguously encoded, like by appending their lengths.</t>
        </section>
        <section anchor="multi-user-security">
          <name>Multi-User Security</name>
          <t>AEGIS nonces match the size of the key. AEGIS-128L and AEGIS-128X feature 128-bit nonces, offering an extra 32 bits compared to the commonly used AEADs in IETF protocols. The AEGIS-256 and AEGIS-256X variants provide even larger nonces. With 192 random bits, 64 bits remain available to optionally encode additional information.</t>
          <t>In all these variants, unused nonce bits can encode a key identifier, enhancing multi-user security. If every key has a unique identifier, multi-target attacks don’t provide any advantage over single-target attacks.</t>
        </section>
        <section anchor="other-uses-of-aegis">
          <name>Other Uses of AEGIS</name>
          <t>All variants can be used as a MAC by calling the <tt>Encrypt()</tt> function with the message as the <tt>ad</tt> and leaving <tt>msg</tt> empty, resulting in just a tag. However, they <bcp14>MUST NOT</bcp14> be used as a hash function; if the key is known, inputs generating state collisions can easily be crafted. Similarly, as opposed to hash-based MACs, tags <bcp14>MUST NOT</bcp14> be used for key derivation as there is no proof they are uniformly random.</t>
        </section>
      </section>
      <section anchor="implementation-security">
        <name>Implementation Security</name>
        <t>If tag verification fails, the unverified plaintext and the computed message authentication tag <bcp14>MUST NOT</bcp14> be released. As shown in <xref target="VV18"/>, even a partial leak of the plaintext without verification would facilitate chosen ciphertext attacks.</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>Regardless of the variant, the <tt>key</tt> and <tt>nonce</tt> are only required by the <tt>Init</tt> function; other functions only depend on the resulting state. Therefore, implementations can overwrite ephemeral keys with zeros right after the last <tt>Update</tt> call of the initialization function.</t>
      </section>
      <section anchor="security-guarantees">
        <name>Security Guarantees</name>
        <t>AEGIS-256 offers 256-bit message security against plaintext and state recovery, whereas AEGIS-128L offers 128-bit security.</t>
        <t>Under the assumption that the secret key is unknown to the attacker, all AEGIS variants offer at least 128-bit security against forgery attacks.</t>
        <t>Encrypting the same message with the same key and nonce but different associated data generates distinct ciphertexts that do not reveal any additional information about the message.</t>
        <t>AEGIS has been shown to have reforgeability resilience in <xref target="FLLW17"/>. Without the ability to set the associated data, a successful forgery does not increase the probability of subsequent forgeries.</t>
        <t>AEGIS-128X and AEGIS-256X share the same security properties and requirements as AEGIS-128L and AEGIS-256 respectively. In particular, the security level and usage limits remain the same <xref target="D23"/>.</t>
        <t>AEGIS is considered secure against guess-and-determine attacks aimed at recovering the state from observed ciphertexts.</t>
        <t>This resilience extends to quantum adversaries operating within the Q1 model, where the attacker has access to a quantum computer but is restricted to classical (non-quantum) communications with the systems under attack. In this model, quantum attacks offer no practical advantage in decrypting previously recorded ciphertexts or in recovering the encryption key.</t>
        <t>This document extends the original specification by introducing optional support for 256-bit authentication tags, which are constructed similarly to the 128-bit tags.
As shown in <xref target="SSI24"/>, with 256-bit tags, all AEGIS variants achieve more than 128-bit security against forgery by differential attacks.</t>
        <t>Security analyses of AEGIS can be found in <xref target="AEGIS"/>, <xref target="M14"/>, <xref target="FLLW17"/>, <xref target="ENP19"/>, <xref target="LIMS21"/>, <xref target="JLD21"/>, <xref target="STSI23"/>, <xref target="IR23"/>, <xref target="BS23"/>, <xref target="AIKRS24"/>, and <xref target="SSI24"/>.</t>
      </section>
    </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 is requested to update the references of these entries to refer to the final version of this document.</t>
      <t>IANA is also requested to register the following identifiers in the AEAD Algorithms Registry:</t>
      <ul spacing="normal">
        <li>
          <t><tt>AEAD_AEGIS128X2</tt></t>
        </li>
        <li>
          <t><tt>AEAD_AEGIS128X4</tt></t>
        </li>
        <li>
          <t><tt>AEAD_AEGIS256X2</tt></t>
        </li>
        <li>
          <t><tt>AEAD_AEGIS256X4</tt></t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-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>
        <reference anchor="RFC6234">
          <front>
            <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="May" year="2011"/>
            <abstract>
              <t>Federal Information Processing Standard, FIPS</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6234"/>
          <seriesInfo name="DOI" value="10.17487/RFC6234"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
      </references>
      <references anchor="sec-informative-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"/>
          </front>
        </reference>
        <reference anchor="AIKRS24">
          <front>
            <title>Differential fault attack on AES-based encryption schemes: application to B5G/6G ciphers—Rocca, Rocca-S and AEGIS</title>
            <author initials="R." surname="Anand" fullname="Ravi Anand">
              <organization>Indraprastha Institute of Information Technology Delhi; University of Hyogo</organization>
            </author>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="A. K." surname="Kundu" fullname="Anup Kumar Kundu">
              <organization>Indian Statistical Institute Kolkata</organization>
            </author>
            <author initials="M." surname="Rahman" fullname="Mostafizar Rahman">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="S." surname="Suryawanshi" fullname="Sahiba Suryawanshi">
              <organization>University of Hyogo; Indian Institute of Technology Bhilai</organization>
            </author>
            <date year="2024"/>
          </front>
          <seriesInfo name="DOI" value="10.1007/s13389-024-00360-6"/>
          <refcontent>Journal of Cryptographic Engineering, 2024</refcontent>
        </reference>
        <reference anchor="BS23" target="https://eprint.iacr.org/2023/1306">
          <front>
            <title>Single-query Quantum Hidden Shift Attacks</title>
            <author initials="X." surname="Bonnetain" fullname="Xavier Bonnetain">
              <organization>Université de Lorraine, CNRS, Inria, LORIA</organization>
            </author>
            <author initials="A." surname="Schrottenloher" fullname="André Schrottenloher">
              <organization>Université de Rennes, CNRS, Inria, IRISA</organization>
            </author>
            <date year="2023"/>
          </front>
          <refcontent>Cryptology ePrint Archive, Paper 2023/1306</refcontent>
        </reference>
        <reference anchor="D23" target="https://eprint.iacr.org/2023/523">
          <front>
            <title>Adding more parallelism to the AEGIS authenticated encryption algorithms</title>
            <author initials="F." surname="Denis" fullname="Frank Denis">
              <organization>Fastly Inc.</organization>
            </author>
            <date year="2023"/>
          </front>
          <refcontent>Cryptology ePrint Archive, Paper 2023/523</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"/>
          </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="FLLW17" target="https://eprint.iacr.org/2017/332">
          <front>
            <title>Reforgeability of Authenticated Encryption Schemes</title>
            <author initials="C." surname="Forler" fullname="Christian Forler">
              <organization>Beuth Hochschule für Technik Berlin</organization>
            </author>
            <author initials="E." surname="List" fullname="Eik List">
              <organization>Bauhaus-Universität Weimar</organization>
            </author>
            <author initials="S." surname="Lucks" fullname="Stefan Lucks">
              <organization>Bauhaus-Universität Weimar</organization>
            </author>
            <author initials="J." surname="Wenzel" fullname="Jakob Wenzel">
              <organization>Bauhaus-Universität Weimar</organization>
            </author>
            <date year="2017"/>
          </front>
          <refcontent>Cryptology ePrint Archive, Paper 2017/332</refcontent>
        </reference>
        <reference anchor="IR23" target="https://eprint.iacr.org/2023/1495">
          <front>
            <title>Key Committing Security Analysis of AEGIS</title>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="M." surname="Rahman" fullname="Mostafizar Rahman">
              <organization>University of Hyogo</organization>
            </author>
            <date year="2023"/>
          </front>
          <refcontent>Cryptology ePrint Archive, Paper 2023/1495</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"/>
          </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"/>
          </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="SSI24">
          <front>
            <title>Bit-Wise Analysis for Forgery Attacks on AES-Based AEAD Schemes</title>
            <author initials="T." surname="Shiraya" fullname="Takuro Shiraya">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="K." surname="Sakamoto" fullname="Kosei Sakamoto">
              <organization>Mitsubishi Electric Corporation</organization>
            </author>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo</organization>
            </author>
            <date year="2024"/>
          </front>
          <seriesInfo name="DOI" value="10.1007/978-981-97-7737-2_1"/>
          <refcontent>Advances in Information and Computer Security. IWSEC 2024. Lecture Notes in Computer Science, vol 14977</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"/>
          </front>
          <seriesInfo name="DOI" value="10.1049/ise2.12109"/>
          <refcontent>IET Information Security, vol 17, 2023(3), pp. 458-467</refcontent>
        </reference>
        <reference anchor="TEST-VECTORS" target="https://github.com/cfrg/draft-irtf-cfrg-aegis-aead/tree/7e4a38d1/test-vectors">
          <front>
            <title>AEGIS Test Vectors</title>
            <author>
              <organization/>
            </author>
            <date year="2024"/>
          </front>
          <refcontent>commit 7e4a38d1</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 1733?>

<section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>The following test vectors are also available in JSON format at <xref target="TEST-VECTORS"/>. In this format, byte strings are represented as JSON strings containing their hexadecimal encoding.</t>
      <section anchor="aesround-test-vector">
        <name>AESRound Test Vector</name>
        <sourcecode type="test-vectors"><![CDATA[
in   : 000102030405060708090a0b0c0d0e0f

rk   : 101112131415161718191a1b1c1d1e1f

out  : 7a7b4e5638782546a8c0477a3b813f43
]]></sourcecode>
      </section>
      <section anchor="aegis-128l-test-vectors">
        <name>AEGIS-128L Test Vectors</name>
        <section anchor="update-test-vector">
          <name>Update Test Vector</name>
          <sourcecode type="test-vectors"><![CDATA[
S0   : 9b7e60b24cc873ea894ecc07911049a3
S1   : 330be08f35300faa2ebf9a7b0d274658
S2   : 7bbd5bd2b049f7b9b515cf26fbe7756c
S3   : c35a00f55ea86c3886ec5e928f87db18
S4   : 9ebccafce87cab446396c4334592c91f
S5   : 58d83e31f256371e60fc6bb257114601
S6   : 1639b56ea322c88568a176585bc915de
S7   : 640818ffb57dc0fbc2e72ae93457e39a

M0   : 033e6975b94816879e42917650955aa0
M1   : fcc1968a46b7e97861bd6e89af6aa55f

After Update:
S0   : 596ab773e4433ca0127c73f60536769d
S1   : 790394041a3d26ab697bde865014652d
S2   : 38cf49e4b65248acd533041b64dd0611
S3   : 16d8e58748f437bfff1797f780337cee
S4   : 9689ecdf08228c74d7e3360cca53d0a5
S5   : a21746bb193a569e331e1aa985d0d729
S6   : 09d714e6fcf9177a8ed1cde7e3d259a6
S7   : 61279ba73167f0ab76f0a11bf203bdff
]]></sourcecode>
        </section>
        <section anchor="test-vector-1">
          <name>Test Vector 1</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 10010000000000000000000000000000

nonce : 10000200000000000000000000000000

ad    :

msg   : 00000000000000000000000000000000

ct    : c1c0e58bd913006feba00f4b3cc3594e

tag128: abe0ece80c24868a226a35d16bdae37a

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

nonce : 10000200000000000000000000000000

ad    :

msg   :

ct    :

tag128: c2b879a67def9d74e6c14f708bbcc9b4

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

ct    : 79d94593d8c2119d7e8fd9b8fc77845c
        5c077a05b2528b6ac54b563aed8efe84

tag128: cc6f3372f6aa1bb82388d695c3962d9a

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f
        20212223242526272829

msg   : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f
        3031323334353637

ct    : b31052ad1cca4e291abcf2df3502e6bd
        b1bfd6db36798be3607b1f94d34478aa
        7ede7f7a990fec10

tag128: 7542a745733014f9474417b337399507

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

nonce : 10010000000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc78

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050608

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 6c04b3dba849b2701effbe32c7f0fab8

tag256: 86f1b80bfb463aba711d15405d094baf
        4a55a15dbfec81a76f35ed0b9c8b04ad
]]></sourcecode>
        </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>
          <sourcecode type="test-vectors"><![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
]]></sourcecode>
        </section>
        <section anchor="test-vector-1-1">
          <name>Test Vector 1</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 10010000000000000000000000000000
        00000000000000000000000000000000

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    :

msg   : 00000000000000000000000000000000

ct    : 754fc3d8c973246dcc6d741412a4b236

tag128: 3fe91994768b332ed7f570a19ec5896e

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    :

msg   :

ct    :

tag128: e3def978a0f054afd1e761d7553afba3

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

ct    : f373079ed84b2709faee373584585d60
        accd191db310ef5d8b11833df9dec711

tag128: 8d86f91ee606e9ff26a01b64ccbdd91d

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f
        20212223242526272829

msg   : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f
        3031323334353637

ct    : 57754a7d09963e7c787583a2e7b859bb
        24fa1e04d49fd550b2511a358e3bca25
        2a9b1b8b30cc4a67

tag128: ab8a7d53fd0e98d727accca94925e128

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

nonce : 10010000000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358459

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050608

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215653

tag256: 8c1cc703c81281bee3f6d9966e14948b
        4a175b2efbdc31e61a98b4465235c2da
]]></sourcecode>
        </section>
      </section>
      <section anchor="aegis-128x2-test-vectors">
        <name>AEGIS-128X2 Test Vectors</name>
        <section anchor="initial-state">
          <name>Initial State</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f

nonce : 101112131415161718191a1b1c1d1e1f

ctx[0]: 00010000000000000000000000000000
ctx[1]: 01010000000000000000000000000000
]]></sourcecode>
          <t>After initialization:</t>
          <sourcecode type="test-vectors"><![CDATA[
V[0,0]: a4fc1ad9a72942fb88bd2cabbba6509a
V[0,1]: 80a40e392fc71084209b6c3319bdc6cc

V[1,0]: 380f435cf801763b1f0c2a2f7212052d
V[1,1]: 73796607b59b1b650ee91c152af1f18a

V[2,0]: 6ee1de433ea877fa33bc0782abff2dcb
V[2,1]: b9fab2ab496e16d1facaffd5453cbf14

V[3,0]: 85f94b0d4263bfa86fdf45a603d8b6ac
V[3,1]: 90356c8cadbaa2c969001da02e3feca0

V[4,0]: 09bd69ad3730174bcd2ce9a27cd1357e
V[4,1]: e610b45125796a4fcf1708cef5c4f718

V[5,0]: fcdeb0cf0a87bf442fc82383ddb0f6d6
V[5,1]: 61ad32a4694d6f3cca313a2d3f4687aa

V[6,0]: 571c207988659e2cdfbdaae77f4f37e3
V[6,1]: 32e6094e217573bf91fb28c145a3efa8

V[7,0]: ca549badf8faa58222412478598651cf
V[7,1]: 3407279a54ce76d2e2e8a90ec5d108eb
]]></sourcecode>
        </section>
        <section anchor="test-vector-1-2">
          <name>Test Vector 1</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f

nonce : 101112131415161718191a1b1c1d1e1f

ad    :

msg   :

ct    :

tag128: 63117dc57756e402819a82e13eca8379

tag256: b92c71fdbd358b8a4de70b27631ace90
        cffd9b9cfba82028412bac41b4f53759
]]></sourcecode>
        </section>
        <section anchor="test-vector-2-2">
          <name>Test Vector 2</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f

nonce : 101112131415161718191a1b1c1d1e1f

ad    : 0102030401020304

msg   : 04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        0405060704050607

ct    : 5795544301997f93621b278809d6331b
        3bfa6f18e90db12c4aa35965b5e98c5f
        c6fb4e54bcb6111842c20637252eff74
        7cb3a8f85b37de80919a589fe0f24872
        bc926360696739e05520647e390989e1
        eb5fd42f99678a0276a498f8c454761c
        9d6aacb647ad56be62b29c22cd4b5761
        b38f43d5a5ee062f

tag128: 1aebc200804f405cab637f2adebb6d77

tag256: c471876f9b4978c44f2ae1ce770cdb11
        a094ee3feca64e7afcd48bfe52c60eca
]]></sourcecode>
        </section>
      </section>
      <section anchor="aegis-128x4-test-vectors">
        <name>AEGIS-128X4 Test Vectors</name>
        <section anchor="initial-state-1">
          <name>Initial State</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f

nonce : 101112131415161718191a1b1c1d1e1f

ctx[0]: 00030000000000000000000000000000
ctx[1]: 01030000000000000000000000000000
ctx[2]: 02030000000000000000000000000000
ctx[3]: 03030000000000000000000000000000
]]></sourcecode>
          <t>After initialization:</t>
          <sourcecode type="test-vectors"><![CDATA[
V[0,0]: 924eb07635003a37e6c6575ba8ce1929
V[0,1]: c8b6a5d91475445e936d48e794be0ce2
V[0,2]: fcd37d050e24084befe3bbb219d64760
V[0,3]: 2e9f58cfb893a8800220242c373a8b18

V[1,0]: 1a1f60c4fab64e5471dc72edfcf6fe6b
V[1,1]: c1e525ebea2d6375a9edd045dce96381
V[1,2]: 97a3e25abd228a44d4a14a6d3fe9185c
V[1,3]: c2d4cf7f4287a98744645674265d4ca8

V[2,0]: 7bb50c534f6ec4780530ff1cce8a16e8
V[2,1]: 7b08d57557da0b5ef7b5f7d98b0ba189
V[2,2]: 6bfcac34ddb68404821a4d665303cb0f
V[2,3]: d95626f6dfad1aed7467622c38529932

V[3,0]: af339fd2d50ee45fc47665c647cf6586
V[3,1]: d0669b39d140f0e118a4a511efe2f95a
V[3,2]: 7a94330f35c194fadda2a87e42cdeccc
V[3,3]: 233b640d1f4d56e2757e72c1a9d8ecb1

V[4,0]: 9f93737d699ba05c11e94f2b201bef5e
V[4,1]: 61caf387cf7cfd3f8300ac7680ccfd76
V[4,2]: 5825a671ecef03b7a9c98a601ae32115
V[4,3]: 87a1fe4d558161a8f4c38731f3223032

V[5,0]: 7a5aca78d636c05bbc702b2980196ab6
V[5,1]: 915d868408495d07eb527789f282c575
V[5,2]: d0947bfbc1d3309cdffc9be1503aea62
V[5,3]: 8834ea57a15b9fbdc0245464a4b8cbef

V[6,0]: e46f4cf71a95ac45b6f0823e3aba1a86
V[6,1]: 8c4ecef682fc44a8eba911b3fc7d99f9
V[6,2]: a4fb61e2c928a2ca760b8772f2ea5f2e
V[6,3]: 3d34ea89da73caa3016c280500a155a3

V[7,0]: 85075f0080e9d618e7eb40f57c32d9f7
V[7,1]: d2ab2b320c6e93b155a3787cb83e5281
V[7,2]: 0b3af0250ae36831a1b072e499929bcb
V[7,3]: 5cce4d00329d69f1aae36aa541347512
]]></sourcecode>
        </section>
        <section anchor="test-vector-1-3">
          <name>Test Vector 1</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f

nonce : 101112131415161718191a1b1c1d1e1f

ad    :

msg   :

ct    :

tag128: 5bef762d0947c00455b97bb3af30dfa3

tag256: a4b25437f4be93cfa856a2f27e4416b4
        2cac79fd4698f2cdbe6af25673e10a68
]]></sourcecode>
        </section>
        <section anchor="test-vector-2-3">
          <name>Test Vector 2</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f

nonce : 101112131415161718191a1b1c1d1e1f

ad    : 0102030401020304

msg   : 04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        0405060704050607

ct    : e836118562f4479c9d35c17356a83311
        4c21f9aa39e4dda5e5c87f4152a00fce
        9a7c38f832eafe8b1c12f8a7cf12a81a
        1ad8a9c24ba9dedfbdaa586ffea67ddc
        801ea97d9ab4a872f42d0e352e2713da
        cd609f9442c17517c5a29daf3e2a3fac
        4ff6b1380c4e46df7b086af6ce6bc1ed
        594b8dd64aed2a7e

tag128: 0e56ab94e2e85db80f9d54010caabfb4

tag256: 69abf0f64a137dd6e122478d777e98bc
        422823006cf57f5ee822dd78397230b2
]]></sourcecode>
        </section>
      </section>
      <section anchor="aegis-256x2-test-vectors">
        <name>AEGIS-256X2 Test Vectors</name>
        <section anchor="initial-state-2">
          <name>Initial State</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ctx[0]: 00010000000000000000000000000000
ctx[1]: 01010000000000000000000000000000
]]></sourcecode>
          <t>After initialization:</t>
          <sourcecode type="test-vectors"><![CDATA[
V[0,0]: eca2bf4538442e8712d4972595744039
V[0,1]: 201405efa9264f07911db58101903087

V[1,0]: 3e536a998799408a97f3479a6f779d48
V[1,1]: 0d79a7d822a5d215f78c3bf2feb33ae1

V[2,0]: cf8c63d6f2b4563cdd9231107c85950e
V[2,1]: 78d17ed7d8d563ff11bd202c76864839

V[3,0]: d7e0707e6bfbbad913bc94b6993a9fa0
V[3,1]: 097e4b1bff40d4c19cb29dfd125d62f2

V[4,0]: a373cf6d537dd66bc0ef0f2f9285359f
V[4,1]: c0d0ae0c48f9df3faaf0e7be7768c326

V[5,0]: 9f76560dcae1efacabdcce446ae283bc
V[5,1]: bd52a6b9c8f976a26ec1409df19e8bfe
]]></sourcecode>
        </section>
        <section anchor="test-vector-1-4">
          <name>Test Vector 1</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ad    :

msg   :

ct    :

tag128: 62cdbab084c83dacdb945bb446f049c8

tag256: 25d7e799b49a80354c3f881ac2f1027f
        471a5d293052bd9997abd3ae84014bb7
]]></sourcecode>
        </section>
        <section anchor="test-vector-2-4">
          <name>Test Vector 2</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ad    : 0102030401020304

msg   : 04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        0405060704050607

ct    : 73110d21a920608fd77b580f1e442808
        7a7365cb153b4eeca6b62e1a70f7f9a8
        d1f31f17da4c3acfacb2517f2f5e1575
        8c35532e33751a964d18d29a599d2dc0
        7f9378339b9d8c9fa03d30a4d7837cc8
        eb8b99bcbba2d11cd1a0f994af2b8f94
        7ef18473bd519e5283736758480abc99
        0e79d4ccab93dde9

tag128: 94a3bd44ad3381e36335014620ee638e

tag256: 0392c62b17ddb00c172a010b5a327d0f
        97317b6fbaee31ef741f004d7adc1e81
]]></sourcecode>
        </section>
      </section>
      <section anchor="aegis-256x4-test-vectors">
        <name>AEGIS-256X4 Test Vectors</name>
        <section anchor="initial-state-3">
          <name>Initial State</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ctx[0]: 00030000000000000000000000000000
ctx[1]: 01030000000000000000000000000000
ctx[2]: 02030000000000000000000000000000
ctx[3]: 03030000000000000000000000000000
]]></sourcecode>
          <t>After initialization:</t>
          <sourcecode type="test-vectors"><![CDATA[
V[0,0]: 482a86e8436cd2361063a4b2702769b9
V[0,1]: d95a2be81c9245b22996f68eea0122f9
V[0,2]: 0c2a3b348b1a5e256c6751377318c41e
V[0,3]: f64436a21653fe7cf2e0829a177db383

V[1,0]: e705e8866267717d96092e58e78b574c
V[1,1]: d1dd412142df9806cc267af2fe1d830e
V[1,2]: 30e7dfd3c9941b8394e95bdf5bac99d9
V[1,3]: 9f27186f8a4fab86820689822c3c74d2

V[2,0]: e1aa6af5d9e31dde8d94a48a0810fa89
V[2,1]: 63555cdf0d98f18fb75b029ad80786c0
V[2,2]: a3ee0e4a3429a9539e4fcec385475608
V[2,3]: 28ea527d31ef61df498dc107fe02df99

V[3,0]: 37f06808410c8f3954525ae44584d3be
V[3,1]: 8fcc23bca2fe2209f93d34e2da35b33d
V[3,2]: 33156347df89eaa69ab11096362daccf
V[3,3]: bbe58d9dbe8c5b0469be5a87086db5d4

V[4,0]: d1c9eb37fecbc5ada7b351fa4f501f32
V[4,1]: 0b9b803283c1538628b507c8f6432434
V[4,2]: bfb8b6d4f87cce28825c7e92f54b8728
V[4,3]: 8917bb5b09c32f900c6a5a1d63c46264

V[5,0]: 4f6110c2ef0c3c687e90c1e5532ddf8e
V[5,1]: 031bd85d99f64684d23728a0453c72a1
V[5,2]: 10bc7ec34d4119b5bdeb6c7dfc458247
V[5,3]: 591ece530aeaa5c9867220156f5c25e3
]]></sourcecode>
        </section>
        <section anchor="test-vector-1-5">
          <name>Test Vector 1</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ad    :

msg   :

ct    :

tag128: 3b7fee6cee7bf17888ad11ed2397beb4

tag256: 6093a1a8aab20ec635dc1ca71745b01b
        5bec4fc444c9ffbebd710d4a34d20eaf
]]></sourcecode>
        </section>
        <section anchor="test-vector-2-5">
          <name>Test Vector 2</name>
          <sourcecode type="test-vectors"><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ad    : 0102030401020304

msg   : 04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        0405060704050607

ct    : bec109547f8316d598b3b7d947ad4c0e
        f5b98e217cffa0d858ad49ae34109a95
        abc5b5fada820c4d6ae2fca0f5e2444e
        52a04a1edb7bec71408de3e199500521
        94506be3ba6a4de51a15a577ea0e4c14
        f7539a13e751a555f48d0f49fecffb22
        0525e60d381e2efa803b09b7164ba59f
        dc66656affd51e06

tag128: ec44b512d713f745547be345bcc66b6c

tag256: ba3168ecd7f7120c5e204a7e0d616e39
        5675ddfe00e4e5490a5ba93bb1a70555
]]></sourcecode>
        </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 state update function leverages the AES permutation invented by Joan Daemen and Vincent Rijmen. They also authored the Pelican MAC, which 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>
          <t>Eric Lagergren and Daniel Bleichenbacher for catching a broken test vector and Daniel Bleichenbacher for many helpful suggestions.</t>
        </li>
        <li>
          <t>John Preuß Mattsson for his review of the draft, and for suggesting how AEGIS should be used in the context of DTLS and QUIC.</t>
        </li>
        <li>
          <t>Bart Mennink and Charlotte Lefevre as well as Takanori Isobe and Mostafizar Rahman for investigating the commitment security of the schemes specified in this document.</t>
        </li>
        <li>
          <t>Scott Fluhrer for his review of the draft as a member of the CFRG Crypto Panel.</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+19WXccR7Lee/+KMuecO8QYAGtfOFf3GgJJCRJJ8aKpZTxn
RsjKzAJK7AVT1Q0SojTHj363320/+m/4vvpX+Jf4i8istRsLKVKi5khnBgSq
snKJjOWLyMzIvb29yapczfR9587zM+0cPPzkaOo8EvNyduksC+dgvTrTi1Up
xUor5+FCVpfnq3K5cA5mp8uqXJ3N6zsTtZQLMUcVqhLFaq+sVsWeLKrTPaFP
yxo/hdrzggnVgY8u7zvlolhOJuV5dd9ZVet65btu5vqTF/ry5bJS952jxUpX
C73ae0AVTvDwxWm1XJ/fdw6p/aXzaFmt55N6nc/LukZ3nl+eo/mj4+ePJpN6
JRbqWzFbLvDoUteTei6q1bd/Wy9XujZPzsv7zp9XS7nr1MtqVemixm+Xc/rl
L5OJwJiX1f2Jszdx8J8Z2qNKLF44D/SirPnpsjoVi/J7QcTAW1GvQLCjhdzn
t3ouytl9p1D6P7lusY+hDGubivlaz5zHaym2VXe0UOVFqdZi5hwuF6uqzNer
ZdWvueYK9mZUQfyfzuf7cw2CgqzVHHVc6PsTlObJvM+fNXNsHjkH3ONbzK5z
98Lb93bucCUXerFGJYcHD6cHx+jZ/FyjXpQ3TYjqVK/uO2er1Xl9/9492b2v
92W1f3m+v1rewzQuVHCPOePC8/bPVcFft0Tn//bsvw5YBXP26b7z9bp9ZEj4
6XJx+t160X8BIt53norFpVicOs+1PFssZ8tTjG7mfLkAUaq6XF1ub+HjfedZ
pRdaz0bNfAze2XjFDX3+pfNYr0ETfqxAwvuO73oxU/7o8+OpHw5p/6AsCl0R
vdGhQqxnK0esVkK+cIjiD6d7uagxDbqbhlqe6TkxrTg/n9Es0UOw/8fRJ/fi
TxxZnp9hUP/vv/z346WUYtfhf/amDgTATL6Zt0qi9c+W62qBhiHURohOK3F+
VkpM+2mJ0VXl4nQXA/BD81GNJ7omlmom5cEXR/cdz933XDe5V3tBkGZ7KL7n
ukHs7sU3T+PxvnOwQN9GJD4WF+XoBRMYUoAuVmDUM4E/atBxvdI0gKOG0UGO
dp4vIZ2zs/KPvbmmsp9eLk+X2/vzfN85qpe5HvXnuXghFmD/0Uvu063rPth3
Psf/wOxjxj1YrM/xAkpp9LoZdCkWznSF0dUr5t1u6J8vZy/ESmxv8ck+KHk2
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
83GPQUs3Hvh4vwtIhX1UWzjfY4UmhGkT9s9z2kpiYnO6psA0IZ6NlZm6tz54
fdrPLWs44I01/rnlIs42PjJreAOGWL+b0xnNDL7+0UKzazC4+YJ+/rWDZC03
91g1aH4JR8xreHdy25Uk96oO4p335p13Te/d23S//51nvvOuGRL/kjTftYRi
AaJPtyx4/a4XUfnZnOoupP6B+NRvtSHrWkfc7tPqYd5uv1YP8vY878YTd/sw
t9vH1UO5vf1cL1z2Iz3rUO+yf+0u7NPF4PmW/tLn3Ib1pU0ztjr+h556tuyi
Kb2w5fs7xJyuPfsLF2g2jL07Fz38qR561BSIrvTQiSDXyvE7asb7eZrhCftZ
xrPw3jSgsRHL4Nju7WMZpEtuFcq4OoxxsrkWtjV2YS8gewehi1YBjiMXXZDi
TWMUjafexCg+8BDFrUMTH0Qw4X0HCJiJ3zw+0HDmjbsh33UUgPv7pkGAK3r7
/dV+C3kgFm+2+GiMfLa4L2+wDfJd++NMmDd1x38+wtx+7+PP4hU31Hp7p/jn
I914X+PxT9nVOHRPPxTPtL/n6VfrmAbXOaYfrFf6ATujV/qgV4xkQI3rXc+j
wX1+tJ2qLlWzZey6fX3m7HRvX9WJXYGiW0LMnWpQGFdt7LO7eeyGxctmF9na
7iEz17/ZcylK88VeZosPJ8Av5egewv3u8rJmj9NXJ+3WtOFmM5P2emPXnHOX
t3afPADVfCBUOsHHJTf2wvVLhid0X27vsslrm6bEEbdpmMrd3OzXxm/vb6cT
RnPPlsvzmo9vOifEbyftAf18SfeX1XqtlkzYrp8zIc2uqO07FMEqXzQKxGy7
G/BJ6zsM9/rVdqGx2+7KOo0OSNIdSXQbGneod30lHaO1N1bxJk67m9DwWT3a
wLdxHSU1R9uv1pU4Naxk74s1i6M+vJDhBaAb07FjYh/hRsmNCdkxgY+eUu7u
Ieb7aKiXdLdJy5Y+XX3S/Rl2fxLn0FtzGUr7KGxyiXQp/s2VdPV6PhcVm4+z
5UtnTskBjINU6XbbDe9ibefjLm053Nm1W9P5+jV77xvRD+xlIjUkajvtNW9O
k21jtNGVi1FsCfSh3cDrWXszL6s62utMdw/0ZhYj+aFLtgIN9YNzzIdoraUB
f5lvjps2piT1PzhT7hf/0ZRFTXvdf07/r/v46/7e5n/3B6XaZ9SnTkehTPMf
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
gLD5WZDn5DxgOO2VWpIyjM60OuX8kZPX9xfreU75Gz+6U4hZrSkZWnfP5PD+
gV6CwPYWRucl3xBwYRJy5ZfOp8vF6XfrhfP1mpPOfSyqlfOs0gutZ01WYs7y
aJOrtTmxKQdlxbeRmPRm0/4tKYMWPluKhfNAUAZMbuIrylO/WDnH5Xd4xNlo
L23qMXR/Wdksds803Ze2oDzUTaJBSog5u3TmyxVlnbbllKbUd022WUMHfEMX
l2ibgpmTz3O2N7F4Mc7VtlDlRanW6IBJ+suJyPjWCXubjLlV6yFdI/UYA65O
KzuQB2JR6pnz8Uyjc3oB0MapeJeUzn8lzdVLTl4tX9D1Nl2utRu+5fv3zvTs
nDKY1uvTU5NFmC8R+2x5tqDZWf/7/3CeiNWqrmlHKj4yaTYvSv2yIQRfgWQS
CVKBpiL0ie7GNGSyd1T2rhAyCbRNKl1U9OD54ylX8W9fHh1SB5g9nujFogQh
6cXhmahmyxU447Eu9EXFudFf6tmM/n0uXogF+M45qpe5ubr5yRLsVMAlqJxj
cYax2suiLqhzp6LNcttdUDDIit2/oaq9IG3L3Ut7zlSiV86j2fqssoS9gkYm
3/pck1g1Lw4fHX/iHPLlGc4zsSBR+P9aD1T0dA4BAA==

-->

</rfc>
