<?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-12" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.1 -->
  <front>
    <title>The AEGIS Family of Authenticated Encryption Algorithms</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-aegis-aead-12"/>
    <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="September" day="23"/>
    <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 as additional finalists for high-performance applications in the Competition for Authenticated Encryption: Security, Applicability, and Robustness (CAESAR). Whilst AEGIS-128 was selected as a winner for this use case, AEGIS-128L has a better security margin alongside improved performance and AEGIS-256 uses a 256-bit key <xref target="LIMS21"/>. All variants of AEGIS are inverse-free and constructed from the AES encryption round function <xref target="FIPS-AES"/>. This document specifies:</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>The AEGIS cipher family offers performance that significantly exceeds that of AES-GCM with hardware support for parallelizable AES block encryption <xref target="AEGIS"/>. Similarly, software implementations can also be faster, although to a lesser extent.</t>
      <t>Unlike with AES-GCM, nonces can be safely chosen at random with no practical limit when using AEGIS-256 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 setup phase, 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 rounds 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. This resilience extends to quantum adversaries in the Q1 model, wherein quantum attacks do not confer any practical advantage for decrypting previously recorded ciphertexts or achieving key recovery.</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/167cab9e/test-vectors">
          <front>
            <title>AEGIS Test Vectors</title>
            <author>
              <organization/>
            </author>
            <date year="2024"/>
          </front>
          <refcontent>commit 167cab9e</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 1721?>

<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   : 033e6975b94816879e42917650955aa0

After Update:
S0   : 596ab773e4433ca0127c73f60536769d
S1   : 790394041a3d26ab697bde865014652d
S2   : 38cf49e4b65248acd533041b64dd0611
S3   : 16d8e58748f437bfff1797f780337cee
S4   : 69761320f7dd738b281cc9f335ac2f5a
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 round 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>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+29WXccR7Im+J6/IoZ1zi2iGgDDYw/WrXsbAkkJEknxAtRS
U6dK8HD3AELMBZWRSRJa6vRjv3e/z8zj/I25r/0r+pfMZ+YeayYWUqRE1ZFO
FQhEePhibstn5u7me3t7k1W1mpr73p3n58Y7ePjx0Yn3SM6q6aW3KL2D9erc
zFeVkiujvYdztby8WFWLuXcwPVssq9X5rL4z0Qs1lzNUoZeyXO1Vy1W5p8rl
2Z40Z1WNn1LviWBCdeCjy/teNS8Xk0l1sbzvrZbrehX4fu4Hkxfm8tViqe97
R/OVWc7Nau8BVTjBwxdny8X64r53SO0vvEeL5Xo2qdfFrKprdOf55QWaPzp+
/mgyqVdyrr+R08Ucjy5NPalncrn65u/rxcrU9slFdd/7y2qhdr16sVwtTVnj
t8sZ/fLXyURizIvl/Ym3N/Hwnx3ao6Wcv/AemHlV89PF8kzOq+8kEQNvZb0C
wY7map/fmpmspve9Upv/6vvlPoYyrO1EztZm6j1eK7mtuqO5rl5Wei2n3uFi
vlpWxXq1WPZrrrmCvSlVkPzXi9n+zICgIOtyhjpemvsTlObJvM+fNXNsH3kH
3ONbzK5396XYFzt3uJKXZr5GJYcHD08OjtGz2YVBvShvm5DLM7O6752vVhf1
/Xv3VPe+3lfL/cuL/dXiHqZxrsN7zBkvhdi/0CV/3RKd/9tz/3pgFczZJ/ve
V+v2kSXhJ4v52bfref8FiHjfeyrnl3J+5j036ny+mC7OMLqp98UcRFnW1epy
ewsf7XvPlmZuzHTUzEfgnY1X3NBnX3iPzRo04ccaJLzvBb5ImPJHnx2fBNGQ
9g+qsjRLojc6VMr1dOXJ1UqqFx5R/OHJXiFrTIPppqFW52ZGTCsvLqY0S/QQ
7P9R/PG95GNPVRfnGNT//m//83ihlNz1+J+9Ew8CYCffzttSofVPF+vlHA1D
qK0QnS3lxXmlMO1nFUa3rOZnuxhAENmPajwxNbFUMykPPj+67wl/X/h+eq8W
YZjleyi+5/th4u8lN0/j8b53MEffRiQ+li+r0QsmMKQAXVyCUc8l/qhBx/XK
0ACOGkYHOdp5voR0Ts+rP/bmmsp+crk4W2zvz/N976heFGbUn+fyhZyD/Ucv
uU+3rvtg3/sM/wOzjxn3YL6+wAsopdHrZtCVnHsnK4yuXjHvdkP/bDF9IVdy
e4tP9kHJ85mcj9p7soBGLKFbluP3bzaik33vZL28lK/kvD6vRo2cyPOqkFsL
XNXKH5uxDqa2N50fnVdTWQ2kK4hIuj46CcKhaJ2Aeadm7+9rs7z0/mMt56v1
zPuk0tqAlOdVCVXHklb3BMJKAbdknoH7UWapztHNXe+ZvDBLai68J0I/ubNV
v5kL+mi/ktBtGOO9tvjNgvD1vvfRYg6rIKvxbH0NYUDbm6+HZPzP/9fTxnu8
WC5RBj0+fHp8sgtKLiuogcefHx8dXMmWJ+p8uVitzHy6gPbYYE69RN1XlNnW
h2ODntajHhwdH50cDGcupJl7MJ64A60xdd5ssTTehVzK6dRMq3pGSm7VwhE5
MFM9/Sh7IOQN5zUOwjeYVpS+eVYf7ffwQUfSMXJoCTkGDUNSPXz6TOQjYkF/
X35H9CLaPMbEkw4xlzUgjJx5H1WwHzX6sqH7jw4Oj73n6EctFdtjsjgnl7OZ
AbZQXkcxMgAivxvt7HoXF/teGGX/+7/9jzDJbjQJoYije6tFrfZfUg37VbSP
j/fw6c10g+J6WKnzKYzfBj8+keCnba+Zgh8v5Xcj1dLpjysbeyrPzHRbSwqQ
bPzybds5JkBRzeSYG45hUhhRDN7dspWWQ3zikEePH38l0iGLHBtYxjMji2rq
qrgS451YcPFmkiPSe2EY3FZybOmbOeBwnxD95pwcni/JCMJGjF4zvT4yqBM4
UJ0DJ62nxivX/+u/Ly3Nqhd4vZy2+nPU4MN9iE+9GjX3EF8NHttm5Ppcruu9
dmbk//rvK+8rgwlcbq8dlhLI/sV46k9WpsRQhq/esolPgYjN/LsNuPqpfLEo
xq9u10aLYFNirqPjsaqGoiHMP6tWK1JBJ0atl8RjrJXqqmZmGymeW9rYKI/f
xMai+M089T7B3TuGWkPF/+njB4EYkv7jtanhR8/13gMDz3gGzd8AGus7DKlO
jjx5Z4BUS8/h/l3v5WLqJTFD/OBu5jR8EAQCKj4IQv9m2J+H5NR9O5/eK17L
wo/zm2fh8b73aSUXIzrBdA0fM3kI8xqyZ95jWSyWEi7vZeeuXK1q/0zCPGrh
z/AO/16RH/i4ul0rfZ+i4e3dq92Ogdd0eI7fa8yJktrMuLoTVQGomPqPpGcX
C+t3XUL39yof8sM1lVypZh6MnYuTc7m4XPefvwlpW0YUxIiPPz4eM+IzeMPs
0ZMG+Hwp1dRsQdahD738xcnDp0dfd2oCcONiUVfA5XfHrwLhuFHkMTGjuMLA
vHr1an9dA0i9ZmWgFnP2p5W5Z5/WrsJA3LtYgpTzFc/Vvanz0a/lVGjUx2Ys
0J+up4Af/edMzsPFcm6mUzY122t7tg9zvi6KsQ14Brd//OaWVUKhHcM4mTlw
8thyPT9fAE5se7+98tFEHz05Gc/0V0a+YGxJePLY6LUyuoHjc+09h/S+ruZv
izEDcTdo5tyPMOcizG/SP1ESZ0mLMQOxXwXQSdEePr0VNn9cjYXl0fqF1RAj
aXlIsTESR+k9JYHvh49+9vDCHwFJiZ6DQMBIGdGMkGlez12QqO4hxz96z44f
njz/fBfg4IJCC1ap2GnsvO2DMzy9QsN+te89MdUGPPuqmk6r0Zstwzig4BW4
p9FmNjy1XNVE3dX5K1NTtNc7eVWtvgNm6+JAo158Bt8VtJstVmN78tmiNtXm
y9sZXRaBJ2IUrHPe1cin6rytHuefwGFQBK4P8ILL9gJsl+j0wSHBqogUjFqt
4ek+pVA0F2ystKONtdJZmglnnnOfHDA/vlVMLk/hce2FIodM+LHYi74Rt3C/
PsLkgtXX47DcRxBbM37FJD14enJyNMSMHJfB03HM86NqtfdVRVatQYngWkLz
ZxSpGWCYk72POP558PDgwRbn5EC/lMw91Xwb7zsyOgsAyfvq5OEhR4xuTXbg
yjS9NaHzTOzl6V6ahule8I24FSA9Oa+W8lJuKoT1crHx8s0g6dsJx5NqVa+L
qj6vvIfExKypF8sLgghNXP99IuthXO/kORho5HU8OXr8zAXGG/PumZdyuraz
T9zEknnPWaS9MErucRy8b5sePr8C3/G8p2ySwruhM0lRnO1FyS1YIcrvgbdh
hgKA41+aA57uUz1mrTaCs08Xxfpy/aLafP9z8NivzV5uccmew37uffnw8Pnn
x9vW0/AxAMOXkJ/FslFZpgQ8BRgDfFXsNHsiSZUscrMV2p5Vq/N1sY+i92jl
9N7VK6n3YH7Mvaaye9Boq72XtuktIvXllyIb9vgQEOBQmpqMm5Er72M5XVT1
v/c1rbPXfSvGJHtqVrQU29OyB4dPT0j9Z7dXsn6WB07M0gTGLcpvt+DUGbc8
DLN0z/8muEUUAD7Sl7BfZi4vR2x1YjADmy8tAHz26PH2+h6gvuq7//x/xlDo
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
9ZqaIj9PejVRu/0yNKJbjo6y4AxrGoyuT6cbRificNSn/ugGdLphdKGfouzg
or+lOq9W9rp4J7B8Vydf/De6ZpeALZdgsRlev2sv5byoLsyUYddMXnr1quIM
KnNTVr1rN4aabp+uGHOXQHruRjVIgb26Z7QDur0gji+Es2fTXi6mfLW1dPv3
rVmdU5qVRh26m6uvuJyWiO/atVd8uX3PpYR6oqQelb1w9mikMp8c/JneUjIi
2qUGldmckRgM0mr3Zqi/I0/W3ufV7Ezc8Z7TVZ0EGvrXkFP1L4y52MjA4hTM
tpPo825rf5tjhrMq2J21XrHgi9W7xDWUmmR+ZlGAPd3FV4nbi8bpQZsJoZrN
jKYTPXTSobskseuYQ8UOd+tvejtAe2dU3MXh1IWT1dLImXfINWDw04ZW7UXj
/VuPGeEQFLBfufMZ++4YKz+krAJXbfG0JfqnJV9fSLoRUvJWLz7xNG9PmriU
Mhwnk7Y/MB57Fnfv2stO7V27XO3ocBSKbT3X1JYnXmkvH+4fjerOc7f3im4c
5bZnuCnpxXre3qy5SxfRkqtqmBGblE522/Wl3f8/OERlO+Kq7A+k7+HYh7sO
EjcbrfswHQPc2eUg/WDXqcPL9vtmFuwmdLKcL+WU4ol0esht5uZIIxNuuF28
PQtGaod81o1kQTRzYHoll7rx4rYeCzvqHO8leJgvkrM83yDjzQ3du1vv4a5f
VFYonSdqW0HtF3Seh299Hd7t5fYEbwsLO6jDSrXN6NHlP+sdiynXyxUlr2CA
4Cq2CmXkiZDVX0OZ/IEpPl/Y4xL2tDj024KUpVtV4qwA9TlTn5MgHT863P/D
ZPKkOV40Hn5zgsdesT1MozW8HJQvGuaraDXc9Cm8Fe1uaV/aq2Dbi4DZvbZ3
YRP9+Oji0pzTwbOXdBdizRukX8zpvs8N1Dq311uejY7q2BtZYd3+8te756sV
GPrevTPQeF3so/p7qlye3dN06fZetVyVe/T3niRzhp9S77QX9Fl9XtsbMg2r
hDFDTKH/6ejb1B5Da9cEe75Ck8xqg0o8fU0qmw3XAJ7DF8z7H6/xmK2qja58
5hTWU1ZSJ2ZqXHxliwptMqy4m0AhZSyje82pML66me9VvO8sbi/zxC4JpVvM
5IrY/ja12fVEPtrmTpU1CwU2k41VfvW+90hW07W9LFYvKOvWK4a9fYuyRDVy
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
wfMWjiVQNLHSpa/hdousLNK48DFunflplii/jQrK0BjfQLIjvM1jcsLgc1Gs
L0pj2vLRRAWDzEi7y9yUidBllGeQUT8tjU+E6AG8MC3Rf1h/uCxZGeZxFAex
hHaFttFhYVqAl5WgHe/HK00QkIPFYZ5AyzAGENVtVBD+IkBlBGrShmxJfg90
eJ6ECcoqXqy0UcGiwIzpXIOHFAYcgbtMDM8OThgws446yKjBY0C76L4q4M1p
mRZhLErMAHRaGQYtZPQLOlkRQmEqGIIsCcAOBH9LOrsShVEbFQSczYpER2UG
DQ2QmAWxgh8GIwBPD+LeRQVzQdHdws8BOcsc+jGRsRQa8BrKNIk6EBqB0iBi
ADQLVkgyVOdTUBo2RIMWpgWhfgi4DW8xz9GtBGQOQrQofVpDh+4VbVQQShid
oihwJESOTmhTJAqEVZgdOI9tVDDOKbwZw+iA4LHKsyTFFGEaylgFsbnifME/
NawNC3CLgSsPjwHWPssyCZML9x1udGEGjrkPX0bIDA47jCMcqBiioiTUCrSa
31smjAujIoqRRjDyJSrRKbAJSSOcJyOvyKbxG6z9sLDlBwFrCzo3Dl2bllko
4ArnWQGG1XQgHHDO78JosD95RjtEVAlcCa0BNob7ZULoazIB3QIrFGMRl9CN
MEgq0uT6lgr4EhYXHNvVSJG6SEISCsiBSuH+ZtqERtABdfhrXagPbqCfFCYs
YMQibYCBRSzjNIV9N3Dwe7k/UlgiKUJDOBmWrIwywMYoh7aGmATdYrdPC3Rw
0wmQBrTDxQ+hV4tUJFEhyfNvCmqVJHDoeWeRMH7vcBYkMCpiEUD0QgDQGCRE
FyGoCp9AOfb2h0hQlrJYpGUqQBLQAeNOja8TkZiww9Ax0AgUtPExLBNHEEDY
/DwsCnIeMJz28iVFuSinRp9xpsHJ9/fn61lBmf7+dKeU09pQMrTuRsJhpvrm
qh5K5dgmdnvFueRf2oRcxaX3yWJ+9u167n215qRzH8nlynu2NHNjpi5/7ZLz
brVpkylN4ZIvrLB5zU76F2kMqv50IefeA0lJErnuLymV+XzlHVff4hEnLL10
OcfQ78XSpa97ZuhKrTmlKm4SnFPOxOmlN1usKDGxK6cN5bxrEpJaAuAbutvC
uCy9nJ+c07zJ+Ytxkra5rl5Weo0O2LywnIGMLyZwF47Yi5ce0k1DjzHg5dnS
DeSBnFdm6n00NeicmQOtcbbWBWV8Xyl7O49XLBcv6AaULsnaDd/yFW3nZnpB
SS7r9dmZTTTL90x9ujif07Ss//P/8p7I1aquaSsqPrKpGF9W5lVDCL4lx2YQ
pAJNRegTXZ9oyeSuMezdMmNzLNtsq6jowfPHJ1zFf3xxdEgdYL54YubzCoSk
F4fncjldrFbGe2xK83LJ6bNfmemU/n0uX8g5GM47qheFvd33yaJeyRK+wNI7
lucYq7tP6CV17ky2iVC7HPaDxMn9S4zaO7S2XM/z/wMumzH6kQsBAA==

-->

</rfc>
