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

<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 225?>

<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 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 in order to perform an exhaustive search, making it practical if the key space is small. For example, with password-based encryption, an attacker can guess a large number of passwords at a time by recursively submitting such a ciphertext to an oracle, which speeds up a password search by reducing it to a binary search.</t>
      <t>In 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 nor 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> bytes (2<sup>64</sup> 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) = 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> + 16 or 32 bytes (2<sup>64</sup> + 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 <tt>P_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than <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 <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 <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> bytes (2<sup>64</sup> 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> + 16 or 32 bytes (2<sup>64</sup> + 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 <tt>P_MAX</tt>).</t>
          </li>
          <li>
            <t><tt>ad</tt>: the associated data to authenticate (length <bcp14>MUST</bcp14> be less than <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 <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 <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

Repeat(10,
    for i in 0..D:
        ctx[i] = ZeroPad(Byte(i) || Byte(D - 1), 128)
        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)

Repeat(4,
    for i in 0..D:
        ctx[i] = ZeroPad(Byte(i) || Byte(D - 1), 128)
        V[3,i] = V[3,i] ^ ctx[i]
        V[5,i] = V[5,i] ^ ctx[i]
        Update(k0_v)
        V[3,i] = V[3,i] ^ ctx[i]
        V[5,i] = V[5,i] ^ ctx[i]
        Update(k1_v)
        V[3,i] = V[3,i] ^ ctx[i]
        V[5,i] = V[5,i] ^ ctx[i]
        Update(k0n0_v)
        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.</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 bytes 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>
      <t>AEGIS-256 offers 256-bit message security against plaintext and state recovery, whereas AEGIS-128L offers 128-bit security.</t>
      <t>An authentication tag may verify under multiple keys, nonces, or associated data, 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>However, it is NOT fully committing because the authentication tag doesn’t commit to the associated data. As shown in <xref target="IR23"/>, with the ability to also alter <tt>ad</tt>, it is possible to efficiently find multiple keys that will verify the same authenticated ciphertext.</t>
      <t>Protocols mandating a fully committing scheme 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>Under the assumption that the secret key is unknown to the attacker both AEGIS-128L and AEGIS-256 target 128-bit security against forgery attacks regardless of the tag size.</t>
      <t>Both algorithms <bcp14>MUST</bcp14> be used in a nonce-respecting setting: for a given <tt>key</tt>, a <tt>nonce</tt> <bcp14>MUST</bcp14> only be used once. Failure to do so would immediately reveal the bitwise difference between two messages.</t>
      <t>If tag verification fails, the decrypted message and wrong message authentication tag <bcp14>MUST NOT</bcp14> be given as output. As shown in <xref target="VV18"/>, even a partial leak of the plaintext without verification would facilitate chosen ciphertext attacks.</t>
      <t>Every key <bcp14>MUST</bcp14> be randomly chosen from a uniform distribution.</t>
      <t>The nonce <bcp14>MAY</bcp14> be public or predictable. It can be a counter, the output of a permutation, or a generator with a long period.</t>
      <t>With AEGIS-128L, random nonces can safely encrypt up to 2<sup>48</sup> messages using the same key with negligible (~ 2<sup>-33</sup>, to align with NIST guidelines) collision probability.</t>
      <t>With AEGIS-256, random nonces can be used with no practical limits.</t>
      <t>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>
      <t>For the same <tt>(key, nonce, ad, msg)</tt> tuple, a different degree of parallelism in AEGIS-128X and AEGIS-256X can produce a different <tt>ct</tt> and <tt>tag</tt>. Furthermore, different <tt>ad</tt> with the same <tt>(key, nonce, msg)</tt> can produce a different <tt>ct</tt> and <tt>tag</tt> with all variants. However, as the <tt>ad</tt> and <tt>msg</tt> are absorbed into the state identically in that order, this does not necessarily hold when the <tt>msg</tt> changes.</t>
      <t>Each variant 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>
      <t>As shown in <xref target="D23"/>, 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.</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>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="ENP19"/>, <xref target="LIMS21"/>, <xref target="JLD21"/>, <xref target="STSI23"/>, <xref target="IR23"/>, and <xref target="BS23"/>.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA has assigned the following identifiers in the AEAD Algorithms Registry:</t>
      <table>
        <name>AEGIS entries in the AEAD Algorithms Registry</name>
        <thead>
          <tr>
            <th align="left">Algorithm Name</th>
            <th align="left">ID</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>AEAD_AEGIS128L</tt></td>
            <td align="left">
              <tt>32</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>AEAD_AEGIS256</tt></td>
            <td align="left">
              <tt>33</tt></td>
          </tr>
        </tbody>
      </table>
      <t>IANA has also assigned the following TLS cipher suites in the TLS Cipher Suite Registry:</t>
      <table>
        <name>AEGIS entries in the TLS Cipher Suite Registry</name>
        <thead>
          <tr>
            <th align="left">Cipher Suite Name</th>
            <th align="left">Value</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>TLS_AEGIS_256_SHA384</tt></td>
            <td align="left">
              <tt>{0x13,0x06}</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>TLS_AEGIS_128L_SHA256</tt></td>
            <td align="left">
              <tt>{0x13,0x07}</tt></td>
          </tr>
        </tbody>
      </table>
      <t>A 128-bit tag length must be used with these cipher suites.</t>
      <t>IANA is requested to update the references of these entries to refer to the final version of this document.</t>
      <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>
      <t>as well as the following identifiers in the TLS Cipher Suite Registry:</t>
      <ul spacing="normal">
        <li>
          <t><tt>TLS_AEGIS_128X2_SHA256</tt></t>
        </li>
        <li>
          <t><tt>TLS_AEGIS_128X4_SHA256</tt></t>
        </li>
        <li>
          <t><tt>TLS_AEGIS_256X2_SHA384</tt></t>
        </li>
        <li>
          <t><tt>TLS_AEGIS_256X4_SHA384</tt></t>
        </li>
      </ul>
    </section>
    <section anchor="quic-and-dtls-13-header-protection">
      <name>QUIC and DTLS 1.3 Header Protection</name>
      <section anchor="dtls-13-record-number-encryption">
        <name>DTLS 1.3 Record Number Encryption</name>
        <t>In DTLS 1.3, record sequence numbers are encrypted as specified in <xref target="RFC9147"/>.</t>
        <t>For AEGIS-128L and AEGIS-256, the mask is generated using the AEGIS <tt>Stream</tt> function with:</t>
        <ul spacing="normal">
          <li>
            <t>a 128-bit tag length</t>
          </li>
          <li>
            <t><tt>sn_key</tt>, as defined in <xref section="4.2.3" sectionFormat="comma" target="RFC9147"/></t>
          </li>
          <li>
            <t><tt>ciphertext[0..16]</tt>: the first 16 bytes of the DTLS ciphertext</t>
          </li>
          <li>
            <t><tt>nonce_len</tt>: the AEGIS nonce length</t>
          </li>
        </ul>
        <t>The 5-byte mask is computed as follows:</t>
        <artwork><![CDATA[
mask = Stream(5, sn_key, ZeroPad(ciphertext[0..16], nonce_len))
]]></artwork>
      </section>
      <section anchor="quic-header-protection">
        <name>QUIC Header Protection</name>
        <t>In QUIC, parts of the QUIC packet headers are encrypted as specified in <xref target="RFC9001"/>.</t>
        <t>For AEGIS-128L and AEGIS-256, the mask is generated using the AEGIS <tt>Encrypt</tt> function with:</t>
        <ul spacing="normal">
          <li>
            <t>a 128-bit tag length</t>
          </li>
          <li>
            <t><tt>hp_key</tt>, as defined in <xref section="5.4" sectionFormat="comma" target="RFC9001"/></t>
          </li>
          <li>
            <t><tt>sample</tt>: the 16 bytes QUIC ciphertext sample</t>
          </li>
          <li>
            <t><tt>nonce_len</tt>: the AEGIS nonce length</t>
          </li>
        </ul>
        <t>The mask is computed as follows:</t>
        <artwork><![CDATA[
mask = Encrypt("", "", hp_key, ZeroPad(sample, nonce_len))
]]></artwork>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references 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="RFC9147">
          <front>
            <title>The Datagram Transport Layer Security (DTLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="N. Modadugu" initials="N." surname="Modadugu"/>
            <date month="April" year="2022"/>
            <abstract>
              <t>This document specifies version 1.3 of the Datagram Transport Layer Security (DTLS) protocol. DTLS 1.3 allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>The DTLS 1.3 protocol is based on the Transport Layer Security (TLS) 1.3 protocol and provides equivalent security guarantees with the exception of order protection / non-replayability. Datagram semantics of the underlying transport are preserved by the DTLS protocol.</t>
              <t>This document obsoletes RFC 6347.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9147"/>
          <seriesInfo name="DOI" value="10.17487/RFC9147"/>
        </reference>
        <reference anchor="RFC9001">
          <front>
            <title>Using TLS to Secure QUIC</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <author fullname="S. Turner" initials="S." role="editor" surname="Turner"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document describes how Transport Layer Security (TLS) is used to secure QUIC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9001"/>
          <seriesInfo name="DOI" value="10.17487/RFC9001"/>
        </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="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="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="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="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 1664?>

<section anchor="test-vectors">
      <name>Test Vectors</name>
      <section anchor="aesround-test-vector">
        <name>AESRound Test Vector</name>
        <artwork><![CDATA[
in   : 000102030405060708090a0b0c0d0e0f

rk   : 101112131415161718191a1b1c1d1e1f

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

M0   : 033e6975b94816879e42917650955aa0
M1   : 033e6975b94816879e42917650955aa0

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

nonce : 10000200000000000000000000000000

ad    :

msg   : 00000000000000000000000000000000

ct    : c1c0e58bd913006feba00f4b3cc3594e

tag128: abe0ece80c24868a226a35d16bdae37a

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

nonce : 10000200000000000000000000000000

ad    :

msg   :

ct    :

tag128: c2b879a67def9d74e6c14f708bbcc9b4

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

ct    : 79d94593d8c2119d7e8fd9b8fc77845c
        5c077a05b2528b6ac54b563aed8efe84

tag128: cc6f3372f6aa1bb82388d695c3962d9a

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f
        20212223242526272829

msg   : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f
        3031323334353637

ct    : b31052ad1cca4e291abcf2df3502e6bd
        b1bfd6db36798be3607b1f94d34478aa
        7ede7f7a990fec10

tag128: 7542a745733014f9474417b337399507

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

nonce : 10010000000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc78

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050608

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 6c04b3dba849b2701effbe32c7f0fab8

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

M    : b165617ed04ab738afb2612c6d18a1ec

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    :

msg   : 00000000000000000000000000000000

ct    : 754fc3d8c973246dcc6d741412a4b236

tag128: 3fe91994768b332ed7f570a19ec5896e

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    :

msg   :

ct    :

tag128: e3def978a0f054afd1e761d7553afba3

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

ct    : f373079ed84b2709faee373584585d60
        accd191db310ef5d8b11833df9dec711

tag128: 8d86f91ee606e9ff26a01b64ccbdd91d

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f
        20212223242526272829

msg   : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f
        3031323334353637

ct    : 57754a7d09963e7c787583a2e7b859bb
        24fa1e04d49fd550b2511a358e3bca25
        2a9b1b8b30cc4a67

tag128: ab8a7d53fd0e98d727accca94925e128

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

nonce : 10010000000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358459

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050608

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215653

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

nonce : 101112131415161718191a1b1c1d1e1f

ctx[0]: 00010000000000000000000000000000
ctx[1]: 01010000000000000000000000000000
]]></artwork>
          <t>After initialization:</t>
          <artwork><![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
]]></artwork>
        </section>
        <section anchor="test-vector-1-2">
          <name>Test Vector 1</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f

nonce : 101112131415161718191a1b1c1d1e1f

ad    :

msg   :

ct    :

tag128: 63117dc57756e402819a82e13eca8379

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

nonce : 101112131415161718191a1b1c1d1e1f

ad    : 0102030401020304

msg   : 04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        04050607040506070405060704050607
        0405060704050607

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

tag128: 1aebc200804f405cab637f2adebb6d77

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

nonce : 101112131415161718191a1b1c1d1e1f

ctx[0]: 00030000000000000000000000000000
ctx[1]: 01030000000000000000000000000000
ctx[2]: 02030000000000000000000000000000
ctx[3]: 03030000000000000000000000000000
]]></artwork>
          <t>After initialization:</t>
          <artwork><![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
]]></artwork>
        </section>
        <section anchor="test-vector-1-3">
          <name>Test Vector 1</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f

nonce : 101112131415161718191a1b1c1d1e1f

ad    :

msg   :

ct    :

tag128: 5bef762d0947c00455b97bb3af30dfa3

tag256: a4b25437f4be93cfa856a2f27e4416b4
        2cac79fd4698f2cdbe6af25673e10a68
]]></artwork>
        </section>
        <section anchor="test-vector-2-3">
          <name>Test Vector 2</name>
          <artwork><![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
]]></artwork>
        </section>
      </section>
      <section anchor="aegis-256x2-test-vectors">
        <name>AEGIS-256X2 Test Vectors</name>
        <section anchor="initial-state-2">
          <name>Initial State</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ctx[0]: 00010000000000000000000000000000
ctx[1]: 01010000000000000000000000000000
]]></artwork>
          <t>After initialization:</t>
          <artwork><![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
]]></artwork>
        </section>
        <section anchor="test-vector-1-4">
          <name>Test Vector 1</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ad    :

msg   :

ct    :

tag128: 62cdbab084c83dacdb945bb446f049c8

tag256: 25d7e799b49a80354c3f881ac2f1027f
        471a5d293052bd9997abd3ae84014bb7
]]></artwork>
        </section>
        <section anchor="test-vector-2-4">
          <name>Test Vector 2</name>
          <artwork><![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
]]></artwork>
        </section>
      </section>
      <section anchor="aegis-256x4-test-vectors">
        <name>AEGIS-256X4 Test Vectors</name>
        <section anchor="initial-state-3">
          <name>Initial State</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ctx[0]: 00030000000000000000000000000000
ctx[1]: 01030000000000000000000000000000
ctx[2]: 02030000000000000000000000000000
ctx[3]: 03030000000000000000000000000000
]]></artwork>
          <t>After initialization:</t>
          <artwork><![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
]]></artwork>
        </section>
        <section anchor="test-vector-1-5">
          <name>Test Vector 1</name>
          <artwork><![CDATA[
key   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

nonce : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f

ad    :

msg   :

ct    :

tag128: 3b7fee6cee7bf17888ad11ed2397beb4

tag256: 6093a1a8aab20ec635dc1ca71745b01b
        5bec4fc444c9ffbebd710d4a34d20eaf
]]></artwork>
        </section>
        <section anchor="test-vector-2-5">
          <name>Test Vector 2</name>
          <artwork><![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
]]></artwork>
        </section>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The AEGIS authenticated encryption algorithm was invented by Hongjun Wu and Bart Preneel.</t>
      <t>The round function leverages the AES permutation invented by Joan Daemen and Vincent Rijmen. They also authored the Pelican MAC that partly motivated the design of the AEGIS MAC.</t>
      <t>We would like to thank the following individuals for their contributions:</t>
      <ul spacing="normal">
        <li>
          <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+296XYdx5Uu+P88RTa1VplwAWBGzkmXqi7EwYJMUCyAkuX2
sonIiEggxTPAJ88hAQ1e9x36Afren/0aXW/ST9Lf3hE5noOBMiVRLmnZIJAZ
GcOOPXx7R8SOvb29yapaTc1D797Lc+MdPPn94Yn3VM6q6ZW3KL2D9erczFeV
kiujvSdztby6WFWLuXcwPVssq9X5rL430Qs1lzNUoZeyXO1Vy1W5p8rl2Z40
Z1WNn1Lv+emE6sBHVw+9al4uJpPqYvnQWy3X9Srw/dwPJq/N1dvFUj/0Ducr
s5yb1d5jqnCCh6/Plov1xUPvEbW/8J4uluvZpF4Xs6qu0Z2XVxdo/vD45dPJ
pF7JuX4lp4s5Hl2ZelLP5HL16m/rxcrU9slF9dD782qhdr16sVwtTVnjt6sZ
/fKXyURizIvlw4m3N/Hwnx3a06Wcv/Yem3lV89PF8kzOq28kEQNvZb0CwQ7n
ap/fmpmspg+9Upv/4fvlPoYyrO1EztZm6j1bK7mtusO5rt5Uei2n3qPFfLWs
ivVqsezXXHMFe1OqIPkfF7P9mQFBQdblDHW8MQ8nKM2T+ZA/a+bYPvIOuMd3
mF3v/huxL3bucSVvzHyNSh4dPDk5OEbPZhcG9aK8bUIuz8zqoXe+Wl3UDx88
UN37el8t968u9leLB5jGuQ4fMGe8EWL/Qpf8dUt0/m/P/euBVTBnn+57f1y3
jywJP13Mz75ez/svQMSH3nM5v5LzM++lUefzxXRxhtFNvS/mIMqyrlZX21v4
ZN97sTRzY6ajZj4B72y84ob+8IX3zKxBE36sQcKHXuCLhCj/yUkQDgl/Us3P
pmbvb2uzvPL+cy3nq/XM+7TS2sy9k/OqxGSsVlK9ri2plwrfWGbHEK4882JZ
zVFmqc4xkF3vhbwwSzQXhA9E6Cf3ts6AuaCP9isJ6qPLD9rit1P8q33vk8Uc
fCur+YgiX8k3FdrefM1UaQn9X/+Pp433bLFcogx6/Oj58ckuOHtZyV3v2efH
hwfbWz7Y907U+XKxWpn5dHFulqPmD+Z6ibqvKbOtD8cGPa1HPTg8Pjw5GMxc
ENLMPR5P3IHWmDpvtlga70Iu5XRqplU986CFVq3ClANBMp0gyZ6afMd5jYPw
HaYVpW+f1af7PQ3WkXSs21pCjtXakFRPnr8Q+YhYczm9+oboRbR5homXS+8P
5qqGkpUz75NK1qZGXyzZeiQ5PHh07L1EP2qpWGN4IN7J1WxmoP2U11Fsl2Qs
vx/t7HoXF/teGGX/3//8v8Iks3XVZlmZmvRgQ4HHnx8+9IS/L0IRRw9Wi1rt
v6Ea9qtoHx/v4dPb6Xa07z2p1Pm0NnqDH48k+Gnba6bg75fym57yIZPaKqZr
VBEaey7PzHRbSwpGY/zyh7ZzTCqvmskxNxwvCsM6b/Dujq20HOIThxwej6UJ
vECGY1atVsQlJ0atl1QTM05d1Yw5RrxxRzUY5fG7qEEUv33iX+57hzXoMSLR
S/laziHXo5dD5cPk+fRqcba4dp6P5flMjvXr0QIIpgQWWI7f31j/UDY/e/Y4
EEPS/35taoCxud57bACvZhDOxuaQsI2pTmiQTPwaZb3PFuslZmjXe7OYeklM
QhgE9zMnhEEQCEhhEIT+rWLo5yEhg6/n0wfFpSz8OL99Fp7te59VcjGiE7TL
8DGT52QFOpDK8Z7JYrGUwE1MqI6Jtrfxp31UOGrhT4AYf6sITPRe3djKYYPA
SHs53iaTU2MSQMhxkSfzM8wCiDU/g3k6x+815kRJbWZc3YmqYEtM/TsydwuQ
ngZyBfHsVT7khxsq2T7uE5iEMbQ6OZeLq3X/+buQtmVEQYz47PfHY0Z8AUjF
sJA0wOdLqaZmC/gJ/dW598XJk+eHX3VqAhbhYlFXgE73x68C4bhR5DExowi2
a4O3b9/ur2vYuktWBmoxL82SCPTAPq1dhYF4cLEEKecrnqsHUwf0buTUz8BF
ZizQn62nsBD950zORwu4ONMpa9Dttb3Yh8ZdF8VYQ7+Q6+n4zR2rhEI7rmrA
JkCZ1VirnS+g8be93175aKIPj07GM/1HI1+z+SeTf2z0WgEdOcQ0195LSO9l
Nf+hMCAQ94Nmzv0Icy7C/Db9EyVxlrQwIBD7VQCdFO3h0zvBp2fVWFierl9b
DTGSlifkYJE4Su85CXzfB/nd3a3E+7FAvwNqIHqiF9cqI5oRMs3rOcFYJn5n
3H/nvTh+cvLy813vM3kh541SsdPYlvIOzvD0Gg37x33vyFQbqOaP1XRajd5s
GcbBxcW0Avc02oxbPliuaqLu6vytqSlk4J28rVbfmOUUb7f34g9wL0C72WI1
tid/WNSm2nx5N6PLInAkoiH/OwA8gr0dIO5x/gkwnSLn4QAvuKxl9rOlvDi/
QqcPHhHyjUjBqNUazshzimdwwcZKO9pYK52lmXDmOfcJI/vx7cbZTx/kKUDx
XihyyIQfi73olbgDQob/fARWX+sRUT+B2JrxKybpwfOTk8Oh6xwREU9enhyO
UePR4bMXewWIqL1GPXvmjZyuLeeChy1lHziNshdGyYPjhVKyr1uevLzGPhO5
RMoqJbwfOpUSxdlelKS30yzKH1S1gRoJAG7uBCnh7y/lldwU6fVysfHy3UDl
832qx6yBj0fVP18U66v162rz/bu18H4F6EPVd1sg9ZdfimzIlo+gCB9JU5OI
G7nyfi+ni6r+jx7PNVqrL8vc8HOzoqhmy4T73sGj5yckBNmdJVz4WR44Zk0T
iHiUR+8o4nkYZume/yq4gy8EpPglpNjM5dVock4MINbmS2sGXzx9tr2+x6iv
+ua//vfYIDyWM2Du8bthZa3KyCaTvb09TxZQqIAMk8nLcziReqHWMyA3T5ta
LasCVGxjNXsiyJ7tut+DONntHn+1a61K8+or/Hri9M4dIjzUWnU2x2tSSOfV
2fkevFNmODaVxAuO0/apo6brJ/osvYvlAghpRXxKve2HugGealgSdQ7Yt1hf
ePcfPT3+/Q5EhT+dL1bouAcF97SthAbSvPI4JC6XGs0yuWaV1lMzmXxEkXb7
AUVxbyeeV7YrA9cSBBb43JN1vVAVv8JcSe/+wZODxzt9Yn37Ldf4/fe73tvz
CiN7Cxjuwc0B5MbnntS6ciJcwnxMgUrr2wlL0rJynqsLPlvzcE2k+2HPDBzY
eopqyn8SBY+hNOsVPKoaJOewN4j+x/NqSsHzhm28t+hu3dhv6jpoMJ9DXKnl
FdEUroWnwEc9ZnvmnXPRwqxIslu7NoO/UhFbwfmsK228aoY5fYOaB2Pu8ylV
T1Xh172iWnmv4aJ9+60F5N9/D9UC1P6GwlTzVRdg8SSRGyRbLdfc8XK5mLmZ
PunPJ0fsvXI9ZyZBxf/H08MXJ3so9TH9si/ydD/wfW5pyED1hVFVCU30EGw3
kD4745YAeNL0erf353zBig4P/CDiJzX5n00RKIR2vD1WpB6u5JmdPdANSJFo
05Ss5tCjXjFdwNfcb/vEWqDfpR4hd3t/tl1Kk+wf7VEzzO09ssrIdol1w2wB
TrCaqInVOFIykSEe3zi98+jFF7WVwSl5vt4bsCUeL2nBBYxmgbN7SDNdOQ6w
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
7VTuNpL1V2/mY0Z3muJio7jvitObtliwUUy4YkG/WLhRLHDFwn6xaKNY6IpF
ro+i38d4o3jkisf9WpONYrErlvSLpRvFElcs5WJ9PUSiYEnaV0L2qeieBt3T
oHsadk/D7mnUPY26p3H3NO6eJt3TpHuadk/p16H4/QNrHTfL27j4pryNpaaJ
Y91+9OL4uoMXP3Tx4+ahDMracbSrJe8wEN74DdXP+7y3mwAu8g1vzHZ8BuZ2
XPRXz4mH9y+NfFge5frww34UNB/F7UdJ81FqP9p2FOP4xziI8UPXWm6ejkFZ
Ox3tGsM/w3Sod5mOdz2U8V6Xdm6dp41PRtNlN6/+M0xaf+Hn2AIpwgY/8qmM
QUu3nsv4cReNSveodhC+xwpN2JLxk1rMCto+YuNxpqZgNCGejdWYurcmeHMi
zS3rNuCNNf6548LNNj6y63YDhli/n0MUzQx++30PcF+D3O0X9POvHSRrubnH
qmHzSzRiXsu7k7uuHvnXdRDvxLt33re99+/S/f53wn4nbhgS/5I237WEYgGi
T7cscn3Ui6L8ZI50F0b/QPzoH7QJ60bn2+3N6mHebo9WD/L2vO3G+/b7MLfb
u9VDub09XK999iOFc6J32af25+7pfPB8S3/pc27D+c+2GVcd/0NPhSs7b0rP
Xfn+rjCva8/9wgWaTWKD3WY/vVceNwXirQXaTW7kjr//asWPUy3Pw4/S37l4
17jERkiCw7J3D0mQSrhTROL6aMTp5jLW1hCEu97qPUQgWj02DkB0sYZ3DTU0
DncTavjAIw13jjB8EDGBH9vPZyZ+dze/4cxbNzK+b2ee+/uuvvw1vf3meveD
HAkHG1uYMwYwW7yQd9jB+L7daibMu3rVPx1h7r5t8Sdxbhtq/XDf9qcj3XhL
4vE/siFx6GV+KA5mf7vSL9a/DG/yLz9Y5/ID9imvdSWvGcmAGjd7kIeDS+xo
JxRdPul2e920Jc8eY+5tiTp1C0l0fYa9WgwK47o9eW4jjttreNVsAFu77V/2
OjR3pEQbvt/K7s7hzPCVGl2+t9/d4dVsT/rytN1VNtwnZvNBb2x48+7zruzT
x6BaAIRKd59xyY1tbP2S0Sndxtq7GPHGpilNw10apnK3N/tH6373d8JJq7mn
i8VFzScsvVPit9P2rHyxoGu8arPWCyZs18+pVHZD0/bNhWCVzxsFYnfMDfik
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

-->

</rfc>
