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

<t>This document describes AEGIS-128L and AEGIS-256, two AES-based authenticated encryption algorithms designed for high-performance applications.
This document is a product of the Crypto Forum Research Group (CFRG). It is not an IETF product and is not a standard.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/jedisct1/draft-aegis-aead"/>.</t>
    </note>
  </front>
  <middle>
    <?line 198?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes the AEGIS-128L and AEGIS-256 authenticated encryption with associated data (AEAD) algorithms <xref target="AEGIS"/>, which were chosen as additional finalists for high-performance applications in the Competition for Authenticated Encryption: Security, Applicability, and Robustness (CAESAR). Whilst AEGIS-128 was selected as a winner for this use case, AEGIS-128L has a better security margin alongside improved performance and AEGIS-256 uses a 256-bit key <xref target="LIMS21"/>. All variants of AEGIS are constructed from the AES encryption round function <xref target="FIPS-AES"/>. This document specifies:</t>
      <ul spacing="normal">
        <li>
          <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>
      </ul>
      <t>The AEGIS cipher family offers performance that significantly exceeds that of AES-GCM with hardware support for parallelizable AES block encryption <xref target="AEGIS"/>. Similarly, software implementations can also be faster, although to a lesser extent.</t>
      <t>Unlike with AES-GCM, nonces can be safely chosen at random with no practical limit when using AEGIS-256. AEGIS-128L also allows for more messages to be safely encrypted when using random nonces.</t>
      <t>With some existing AEAD schemes, such as AES-GCM, an attacker can generate a ciphertext that successfully decrypts under multiple different keys (a partitioning oracle attack) <xref target="LGR21"/>. This ability to craft a (ciphertext, authentication tag) pair that verifies under multiple keys significantly reduces the number of required interactions with the oracle in order to perform an exhaustive search, making it practical if the key space is small. For example, with password-based encryption, an attacker can guess a large number of passwords at a time by recursively submitting such a ciphertext to an oracle, which speeds up a password search by reducing it to a binary search.</t>
      <t>In 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 <tt>Finalize()</tt> respectively. We follow the specification of <xref target="AEGIS"/> that is current at the time of writing, which can be found in the References section of this document.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words “<bcp14>MUST</bcp14>”, “<bcp14>MUST NOT</bcp14>”, “<bcp14>REQUIRED</bcp14>”, “<bcp14>SHALL</bcp14>”, “<bcp14>SHALL
NOT</bcp14>”, “<bcp14>SHOULD</bcp14>”, “<bcp14>SHOULD NOT</bcp14>”, “<bcp14>RECOMMENDED</bcp14>”, “<bcp14>NOT RECOMMENDED</bcp14>”,
“<bcp14>MAY</bcp14>”, and “<bcp14>OPTIONAL</bcp14>” in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>Primitives:</t>
      <ul spacing="normal">
        <li>
          <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>: 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 octets (128 bits).</t>
        </li>
        <li>
          <t><tt>P_MAX</tt> (maximum length of the plaintext) is 2<sup>61</sup> octets (2<sup>64</sup> bits).</t>
        </li>
        <li>
          <t><tt>A_MAX</tt> (maximum length of the associated data) is 2<sup>61</sup> octets (2<sup>64</sup> bits).</t>
        </li>
        <li>
          <t><tt>N_MIN</tt> (minimum nonce length) = <tt>N_MAX</tt> (maximum nonce length) = 16 octets (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 octets (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 octets (256 bits).</t>
        </li>
        <li>
          <t><tt>P_MAX</tt> (maximum length of the plaintext) is 2<sup>61</sup> octets (2<sup>64</sup> bits).</t>
        </li>
        <li>
          <t><tt>A_MAX</tt> (maximum length of the associated data) is 2<sup>61</sup> octets (2<sup>64</sup> bits).</t>
        </li>
        <li>
          <t><tt>N_MIN</tt> (minimum nonce length) = <tt>N_MAX</tt> (maximum nonce length) = 32 octets (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 octets (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="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="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 key 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>Under the assumption that the secret key is unknown to the attacker both AEGIS-128L and AEGIS-256 target 128-bit security against forgery attacks regardless of the tag size.</t>
      <t>Both algorithms <bcp14>MUST</bcp14> be used in a nonce-respecting setting: for a given <tt>key</tt>, a <tt>nonce</tt> <bcp14>MUST</bcp14> only be used once. Failure to do so would immediately reveal the bitwise difference between two messages.</t>
      <t>If tag verification fails, the decrypted message and wrong message authentication tag <bcp14>MUST NOT</bcp14> be given as output. As shown in the analysis of the (robustness of CAESAR candidates beyond their guarantees)<xref target="VV18"/>, even a partial leak of the plaintext without verification would facilitate chosen ciphertext attacks.</t>
      <t>Every key <bcp14>MUST</bcp14> be randomly chosen from a uniform distribution.</t>
      <t>The nonce <bcp14>MAY</bcp14> be public or predictable. It can be a counter, the output of a permutation, or a generator with a long period.</t>
      <t>With AEGIS-128L, random nonces can safely encrypt up to 2<sup>48</sup> messages using the same key with negligible (~ 2<sup>-33</sup>, to align with NIST guidelines) collision probability.</t>
      <t>With AEGIS-256, random nonces can be used with no practical limits.</t>
      <t>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>The security of AEGIS against timing and physical attacks is limited by the implementation of the underlying <tt>AESRound()</tt> function. Failure to implement <tt>AESRound()</tt> in a fashion safe against timing and physical attacks, such as differential power analysis, timing analysis or fault injection attacks, may lead to leakage of secret key material or state information. The exact mitigations required for timing and physical attacks also depend on the threat model in question.</t>
      <t>Security analyses of AEGIS can be found in Chapter 4 of <xref target="AEGIS"/>, in <xref target="M14"/>, in <xref target="ENP19"/>, in <xref target="LIMS21"/>, in <xref target="JLD21"/>, in <xref target="STSI23"/>, and in <xref target="IR23"/>.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA has assigned the following identifiers in the AEAD Algorithms Registry:</t>
      <table>
        <name>AEGIS entries in the AEAD Algorithms Registry</name>
        <thead>
          <tr>
            <th align="left">Algorithm Name</th>
            <th align="left">ID</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>AEAD_AEGIS128L</tt></td>
            <td align="left">
              <tt>32</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>AEAD_AEGIS256</tt></td>
            <td align="left">
              <tt>33</tt></td>
          </tr>
        </tbody>
      </table>
      <t>IANA has also assigned the following TLS cipher suites in the TLS Cipher Suite Registry:</t>
      <table>
        <name>AEGIS entries in the TLS Cipher Suite Registry</name>
        <thead>
          <tr>
            <th align="left">Cipher Suite Name</th>
            <th align="left">Value</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>TLS_AEGIS_256_SHA384</tt></td>
            <td align="left">
              <tt>{0x13,0x06}</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>TLS_AEGIS_128L_SHA256</tt></td>
            <td align="left">
              <tt>{0x13,0x07}</tt></td>
          </tr>
        </tbody>
      </table>
      <t>A 128-bit tag length must be used with these cipher suites.</t>
      <t>IANA is requested to update the references of these entries to refer to the final version of this document.</t>
    </section>
    <section anchor="quic-and-dtls-13-header-protection">
      <name>QUIC and DTLS 1.3 Header Protection</name>
      <section anchor="dtls-13-record-number-encryption">
        <name>DTLS 1.3 Record Number Encryption</name>
        <t>In DTLS 1.3, record sequence numbers are encrypted as specified in [RFC9147].</t>
        <t>For AEGIS-128L and AEGIS-256, the mask is generated using the AEGIS <tt>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 Section 4.2.3 of [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 [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 Section 5.4 of [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>
      </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" month="September" day="15"/>
          </front>
        </reference>
        <reference anchor="ENP19">
          <front>
            <title>Analyzing the Linear Keystream Biases in AEGIS</title>
            <author initials="M." surname="Eichlseder" fullname="Maria Eichlseder">
              <organization>Graz University of Technology</organization>
            </author>
            <author initials="M." surname="Nageler" fullname="Marcel Nageler">
              <organization>Graz University of Technology</organization>
            </author>
            <author initials="R." surname="Primas" fullname="Robert Primas">
              <organization>Graz University of Technology</organization>
            </author>
            <date year="2020" month="January" day="31"/>
          </front>
          <seriesInfo name="DOI" value="10.13154/tosc.v2019.i4.348-368"/>
          <refcontent>IACR Transactions on Symmetric Cryptology, 2019(4), pp. 348–368</refcontent>
        </reference>
        <reference anchor="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" month="May" day="22"/>
          </front>
          <seriesInfo name="DOI" value="10.1093/comjnl/bxab059"/>
          <refcontent>The Computer Journal, vol 65, 2022(8), pp. 2221–2230</refcontent>
        </reference>
        <reference anchor="LGR21" target="https://www.usenix.org/conference/usenixsecurity21/presentation/len">
          <front>
            <title>Partitioning Oracle Attacks</title>
            <author initials="J." surname="Len" fullname="Julia Len">
              <organization>Cornell Tech</organization>
            </author>
            <author initials="P." surname="Grubbs" fullname="Paul Grubbs">
              <organization>Cornell Tech</organization>
            </author>
            <author initials="T." surname="Ristenpart" fullname="Thomas Ristenpart">
              <organization>Cornell Tech</organization>
            </author>
            <date year="2021"/>
          </front>
          <refcontent>30th USENIX Security Symposium (USENIX Security 21), pp. 195–212</refcontent>
        </reference>
        <reference anchor="LIMS21">
          <front>
            <title>Weak Keys in Reduced AEGIS and Tiaoxin</title>
            <author initials="F." surname="Liu" fullname="Fukang Liu">
              <organization>East China Normal University; University of Hyogo</organization>
            </author>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo; National Institute of Information and Communications Technology; PRESTO, Japan Science and Technology Agency</organization>
            </author>
            <author initials="W." surname="Meier" fullname="Willi Meier">
              <organization>University of Applied Sciences and Arts Northwestern Switzerland</organization>
            </author>
            <author initials="K." surname="Sakamoto" fullname="Kosei Sakamoto">
              <organization>University of Hyogo</organization>
            </author>
            <date year="2021" month="June" day="11"/>
          </front>
          <seriesInfo name="DOI" value="10.46586/tosc.v2021.i2.104-139"/>
          <refcontent>IACR Transactions on Symmetric Cryptology, 2021(2), pp. 104–139</refcontent>
        </reference>
        <reference anchor="M14">
          <front>
            <title>Linear Biases in AEGIS Keystream</title>
            <author initials="B." surname="Minaud" fullname="Brice Minaud">
              <organization>ANSSI</organization>
            </author>
            <date year="2014"/>
          </front>
          <seriesInfo name="DOI" value="10.1007/978-3-319-13051-4_18"/>
          <refcontent>Selected Areas in Cryptography. SAC 2014. Lecture Notes in Computer Science, vol 8781, pp. 290–305</refcontent>
        </reference>
        <reference anchor="STSI23">
          <front>
            <title>MILP-based security evaluation for AEGIS/Tiaoxin-346/Rocca</title>
            <author initials="T." surname="Shiraya" fullname="Takuro Shiraya">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="N." surname="Takeuchi" fullname="Nobuyuki Takeuchi">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="K." surname="Sakamoto" fullname="Kosei Sakamoto">
              <organization>University of Hyogo</organization>
            </author>
            <author initials="T." surname="Isobe" fullname="Takanori Isobe">
              <organization>University of Hyogo; National Institute of Information and Communications Technology</organization>
            </author>
            <date year="2023" month="January" day="27"/>
          </front>
          <seriesInfo name="DOI" value="10.1049/ise2.12109"/>
          <refcontent>IET Information Security, vol 17, 2023(3), pp. 458-467</refcontent>
        </reference>
        <reference anchor="VV18">
          <front>
            <title>Can Caesar Beat Galois?</title>
            <author initials="S." surname="Vaudenay" fullname="Serge Vaudenay">
              <organization>EPFL</organization>
            </author>
            <author initials="D." surname="Vizár" fullname="Damian Vizár">
              <organization>EPFL</organization>
            </author>
            <date year="2018"/>
          </front>
          <seriesInfo name="DOI" value="10.1007/978-3-319-93387-0_25"/>
          <refcontent>Applied Cryptography and Network Security. ACNS 2018. Lecture Notes in Computer Science, vol 10892, pp. 476–494</refcontent>
        </reference>
      </references>
    </references>
    <?line 1083?>

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

rk   : 101112131415161718191a1b1c1d1e1f

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

M0   : 033e6975b94816879e42917650955aa0
M1   : 033e6975b94816879e42917650955aa0

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

nonce : 10000200000000000000000000000000

ad    :

msg   : 00000000000000000000000000000000

ct    : c1c0e58bd913006feba00f4b3cc3594e

tag128: abe0ece80c24868a226a35d16bdae37a

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

nonce : 10000200000000000000000000000000

ad    :

msg   :

ct    :

tag128: c2b879a67def9d74e6c14f708bbcc9b4

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

ct    : 79d94593d8c2119d7e8fd9b8fc77845c
        5c077a05b2528b6ac54b563aed8efe84

tag128: cc6f3372f6aa1bb82388d695c3962d9a

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f
        20212223242526272829

msg   : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f
        3031323334353637

ct    : b31052ad1cca4e291abcf2df3502e6bd
        b1bfd6db36798be3607b1f94d34478aa
        7ede7f7a990fec10

tag128: 7542a745733014f9474417b337399507

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

nonce : 10010000000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc78

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050608

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 5c04b3dba849b2701effbe32c7f0fab7

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

nonce : 10000200000000000000000000000000

ad    : 0001020304050607

ct    : 79d94593d8c2119d7e8fd9b8fc77

tag128: 6c04b3dba849b2701effbe32c7f0fab8

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

M    : b165617ed04ab738afb2612c6d18a1ec

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    :

msg   : 00000000000000000000000000000000

ct    : 754fc3d8c973246dcc6d741412a4b236

tag128: 3fe91994768b332ed7f570a19ec5896e

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    :

msg   :

ct    :

tag128: e3def978a0f054afd1e761d7553afba3

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f

ct    : f373079ed84b2709faee373584585d60
        accd191db310ef5d8b11833df9dec711

tag128: 8d86f91ee606e9ff26a01b64ccbdd91d

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

msg   : 000102030405060708090a0b0c0d

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 000102030405060708090a0b0c0d0e0f
        101112131415161718191a1b1c1d1e1f
        20212223242526272829

msg   : 101112131415161718191a1b1c1d1e1f
        202122232425262728292a2b2c2d2e2f
        3031323334353637

ct    : 57754a7d09963e7c787583a2e7b859bb
        24fa1e04d49fd550b2511a358e3bca25
        2a9b1b8b30cc4a67

tag128: ab8a7d53fd0e98d727accca94925e128

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

nonce : 10010000000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358459

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050608

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215652

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

nonce : 10000200000000000000000000000000
        00000000000000000000000000000000

ad    : 0001020304050607

ct    : f373079ed84b2709faee37358458

tag128: c60b9c2d33ceb058f96e6dd03c215653

tag256: 8c1cc703c81281bee3f6d9966e14948b
        4a175b2efbdc31e61a98b4465235c2da
]]></artwork>
        </section>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The AEGIS authenticated encryption algorithm was invented by Hongjun Wu and Bart Preneel.</t>
      <t>The round function leverages the AES permutation invented by Joan Daemen and Vincent Rijmen. They also authored the Pelican MAC that partly motivated the design of the AEGIS MAC.</t>
      <t>We would like to thank the following individuals for their contributions:</t>
      <ul spacing="normal">
        <li>
          <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+1963bcxrXm/34KjLzWCTkhW7hfmDjn0JRk0xFlHVK2TyYr
EQtAgY2wG+gAaJGU5Kx5h3mAmXmVOW8yTzLf3lW4dTcvchRHnmWtZbobVdhV
te8XYPf+/v6kyZu5PDAevZpJ4/Dpl8dnxjOxyOc3RpkZh6tmJosmT0QjU+Np
kVQ3yyYvC+NwflFWeTNb1I8maZkUYgEQaSWyZj+vmmw/yaqLfSEv8hp/Rbpv
ehOCgZtuDoy8yMrJJF9WB0ZTrerGNs3ItCeX8uaqrNID47hoZFXIZv8JAZzg
4uVFVa6WB8YRrV8az8pqtZjUq3iR1zW28+pmieWPT189m0zqRhTpazEvC1y6
kfWkXoiqef3XVdnIWl1Z5gfGH5sy2TPqsmoqmdX4dLOgD3+aTATOXFYHE2N/
YuCfOtqzShSXxhNZ5DVfLasLUeRvBSEDo6JugLDjIpnyqFyIfH5gZKn8N9PM
pjjKGNqZWKzk3Hi+SsQ2cMdFmr/J05WYG0dl0VR5vGrKagi5ZgD7cwLg/9ty
MV1IIBRorRaA8UYeTDCbiXnAt7U0VpeMQ97xA6hr7LyxptbuIwbyRhYrADk6
fHp2eIqdLZYScDFfLSGqC9kcGLOmWdYHjx8n/Xg9TarpzXLalI9BxiJ1HjNn
vLGs6TLN+O4O6fxvX//fAKuAZl9Nje9X3SWFwq/K4uIvq2I4ACQeGC9EcSOK
C+OVTGZFOS8vcLq58W0BpFR13txsX+GLqfGykoWU87VlvgDvbAzxQr//1ngu
V8AJX06BwgPDNi1/34z2LY/w//TFSytaw38h5jdvc+wPmDee54UUlfF7eVOD
C8XC+CIXtayxJUU7hfYqwY3Hh0enxiswYS0SRqkBMp3dLBYS7JFoucBpb/Zo
E9GOu7tnLJdTw3HD//vf/4fjhwpWLatc1sQoLaqffHN8YFjm1HIsz33clHUy
fUMQprk7xc37uPV+Ap1Mjad5MpvXMpXVGgZPRJWLbcOMxS8r8XZAHdI5HeVu
oRUWeyEu5HzbSgmkan3wx65zSjyRL7SE9suclrFkphiNPXCVlk9sc9+09h2L
+OT41HbGbAKOIPla5E1DvHImk1VF8Jh96rxm1bzGIT0LGBJ7KyDeVTLDVvaM
l2IpK1rUeWy5kfdoq7zKJd00zQVkFYd53E2/n/yvpsZxDaysIeqVuBQF9Mja
IGNqjKSvbsqL8lZqn4rZQhTrxC6h6DOozGp9/E74Hf4dwvzXz5/Y1hj1X65k
DZtVpPtPJKzQAiJqHDaNSC5Z5NaxTkaTNOEKc42vy1UFCu0Zb8q54Xskira9
E2pRtG3bgizatmPeK4xm5JAC/Usxfxxfi9j0ovup8HxqfJ2Lcg1P0DHjy4ye
swZ4IMVjPBdxWQmYF0ZUz0Tb1/jDFADXVvgDNPFfc9K5g6E7VzluDRXpMM3b
e7hagwhA5PqUp8UFqABkFRd7xtEMn2vQJBGpXDC4sySXRSLr3+DTrATq6SA3
ENIB8DE/3AFk+7nPpsaTdQt0NhPlzWp4/UNQ2zGiBd9o37aJHZ9/ebrOji9h
f9iGkh74phLJvGPHARc6ZjMzvj17+uL4P3plAeuwLOt8BSO+PmRbmietyCOW
tOztOuHq6mq6quH0XLNKSMoikxWh6bG6WmuAtvV4WQGhRcMUezzXVvFOfv0a
vCTXxfrr1RzWYnidkXpUwh+cz1mbbof2cgrtu4rjdW39Uqzm6yMPBAm1dprX
jSyWIMK6bpuV0P7bxrcD78nNhD4+OVun9PdSXLIrQOb/VKarBD6Z8sehjYxX
kOHrvPixLoFt7dgtzU0XNLec6D4t5Ppe6HcugW1Ncxuayd3HrfdT9xlpinWR
eba6VHpiTWaekjdKQimMFyT2Q4ftNw+3FR/HDv0GHgThE7u4VSURRchArwpy
nhn5vaH/jfHy9OnZq2/2jK/FUhStalFk7GYZhxe4eoue/X5qnMh8w8P5Pp/P
87WRLcc4XC7nObin1Wm88mHV1ITdZnYla4qvjLOrvHkrqzlGt+/i91NEKpdi
UTbrVuX3ZS3zzcGHmV5oPH/fYkE4sdyxFGiXeM0R7l3kAf+fwctLKHA5xADP
VSx/UYnl7AZbPzwiX9glNZM0q0ri9I0C2llsjSFlscMgtLSpjkzymk3vfkNt
Bo+jAG4yfDn4/bjF2ndfWw/wmRFynIDhV+kaar+A8Mr1IUbs4Yuzs+NxtOES
Es9enR2ve5Anx89f7sdAYmq0StqQb8R8pfgXnKww+1jrlX3H9R+flkkihhrm
6atbbDWhywpYsTg7jlYsrhfuu35wP87c6HFeSygTG47Og9zLs1leiRuxKdir
qtwY/DAH88WU4MgVfOU18C/KeHWzusw3xz9shY8rRp+q1ltzrym8sQNiz+++
s8Ixcx5BKR4JWZOgS9EYX4p5mdf/OuC8VoMNJZqXfyEbSgd1rDg1Do9enJEo
hA+Wc8sMI1uzbOBD0N3I/UBBjxwnDPbN1/YDoiP4jt9BlmUhbtZIdCbhbm0O
KpP48tnz7fCeAF7+9j//97pxeCIW8MLXx8bAOsURTib7+/uGiKFW4T5MJq9m
CCvTMlkt4MUZqayTKo+BRdYS+5YdPldWhL/anr9ngBD4eqa1jBjlkmSfSxJd
ppCg5hcFhkn9zPKL2T7iUmYvNo9Ec81X07X94LMwllUJr6ghrqTsyTAXCIep
ht1IZnD1ytXS2Dl6dvrlLgSDby3KBps3oM6edUDoMO2QwTlDUaXTiULLIk/T
uZxMPqNUpLqB0ly3IqlpU6dbEHU7ZmB+Z4ao6zLJeQjEEcbO4dPDJ7tDrL17
x7B++GHPuJrlOOIVfHADkQ78bdxuiDTNteRmsBpzuKT1/Rgm8Wh08KrTdMoq
3JITPBho/0MFJ87n/JWOewpdWTcIqmrgnhOEwP73s3xOacYWM8YVtlu3Zpu2
DhwUBeSTVm4IuYgrjAQMtTfE54ynxrIhUe7M2QLBSk78hfizzlNp5AsQ9w0g
j848osWKvAph4ON+nDfGJaK0d++UN/7DD9AlcNnfUL6qaPociyEI3UBZU614
41lVLjTJz4b05Nymka0K5hYA/i/Pjl+e7WPW5/RhakXB1DZNXmnMSfVSJnkG
1XMA/hucvKW4QgCutLveG3wtStZsuGDaLl+pKQRtp0ADdOcdsCLtsBEXinrA
G9xEwk07My+gOI14XiLQnHZ7YrkfbmmAyL3B125LgR/+vTtqjzne0aSvViT5
ckYs1BYtEKLWIxZoZrAxpHmA4gSkxSx5nUiZ1mqICX22/+XRiRLJGTTBFRG9
Xi2XcJiZOxHjiflczvO3Ip4r0vNehgzQSSoMfo7diGp+QzWGrGFw4M+5XLRB
cg0+J+6tS3A2dk8+Oc4+hyVZXcwMaDZhzAkFFXaLILPBob8t5vmlVLvUW95T
yFbQAKgWmcQBW/XQGAgQU/Ar31OUQCxFi5QTn2OLDaiJaaua0gsdjacjZUY7
xNHLK6VVFiWOssDGxAVpvnKwqEYFRGQAVa+vdokzfE8bqcuFxLGgqtTCh0+M
OpkBOVSJgatFyqE7IKGJUx5ABZ0ScZOsKMkiNO0bIEhTeZUQ22SrObaTSt4O
lEqR4tbFat7koICR5hmnMZhtoa8EEbfPspQqy6KW3CX9QGmZTmi12qOTJ1Se
wi52+m3sbeHoXcDPK7VBuF0s6Ot74p2MebTiHIAyLsVqQfkscGol/7rKMQR5
AMO0kT9TlybqzUMvlhUtgF1qUSA0yuuZgJqG82coc7kHLXpJhwYn9JyRKwNL
2rFeCkgQjl0jKp9PydoCiiBO3lOrLmHBqGyn/YBeHLYQjnKrxNaUZhqcqQVR
E78KuIlgjpgQAE1fY7NABtf6VDZc8ceI9CUtpY7e6ieoVBJw+AKig68PrWAD
ufrgLGoxTGd1o2eATY916LlHRjWlmSlzK1yHHdZ2zNCKtPXtzAfIFzhBAS4b
G/o94z6maVbEGEB9DK0jya5hozPxhvm+JApcMx/S0qlcyiLlDBBRDveDmd5K
CHKnP+ka2UdYytrwlaFI+hpD3Vl3hT+sq+SMDiNwsGXDio9UQMd62AtANmVS
zmuYe/ZnOtXOurxFHm15DteEThdLrEsO+qJjuV63LUp4DGVDGr13LllBdCaY
OH4PulFxrlDGBcZUKneOBjr+LUh1V/JNXq5qNZF00DPyk+bsumgjQnO1O9hJ
GISbJGhGwgJiGMsZOyZknmh/Ut2gxATKK13NJemIFTYnl6TMgDwl2Fo340Ld
+g8LuaDEcCwz0qeiuFHuH5nVWIJfel2KE2hmkinkFXrqQjDJgNHUiEvyYFVG
GCej0EexBIk7DFCOI3CsB8RTrNeVTfkcw/Lmr2A1uVCUa5+3swmdf5Le7uXW
ZCmVmGQ6SazVUiUvBMk2uJdwmXBMpvhce/Kb3N8ieaj4yLtit/WcyQf23tk9
B3TaXMNaAixIDEq2SpFNbTvpFusMtEIR6AemZ0sgGiU4pHow8QqiwOUGJQya
fhk7eNpxPpXdMWuZ9McZ+HVTiiCOyuINHY7UNJ3qiYRMqLK48mKIf5T2e3Ty
7dmrR3vq/8aLb/jz6dN///b49OkT+nz21eHz592HiZ5x9tU33z5/0n/q7zz6
5uTk6Ysn6mZcNUaXJo9ODv/wSDH0o29evjr+5sXh80fqfEPvlHwXZedZ8CFO
yn2ftAEQ4+SLo5f/539ZLrm9p8+ObMuKgGb1JbQCF1/IKVCrlQWUivoKVN5M
EJhQ1o+9+TmwvcwbuB175AXUs/KqMEjcgM3/+kfCzJ8OjN/GydJyf6cv0IFH
F1ucjS4yzjavbNyskLjl0pZlOmyOrq9herzfwz+Mvrd4H1z87b/Oqeq4b4X/
+jsEpFRozonBVXRw/u6H8wOW7sUS6p+d6KoSN+Sln7+/fo9BYs+5LC4gfGDJ
8+tzwiwmsid/Low/G7GehYtXeU2uWDJfkak1vjk1yiW5V0pTN1ekjM7FOdPt
PD7XIP5lA8ThiycPuvP9++5WaHQKM4tOPjdnL8q0m17Rwy/sNmm98XSVzGHO
gAt6XqbeWFf5TvwsDaxjC3l4vS4rXuj5U9/dud5tcQebOJf7uIcSKpDxkm0Y
Vl0VOoOhDSgJxAU2BBwznP8mq/KlSHeu4R8QtCUF53Rri5gpVWzgQOLaW8yt
2+BS40EZeaLYCipjrnRS2ZC3rujJiZDOaySUFec9aV9VK4bUrd+oC4zewRYA
NYPb0nR3t3xCu7mEqWdoZ4jymw5UTd+atcMwb9VqjJBREkTGjArU9gygq6TK
rfKxcZA+pjx/BUx08KFVVlWhSDMXm3vjO+ASnJIS3smhOqpLug/2H+CBDBV+
a9a4MzQf+DitRSrrfGiRzs9W8Rc3cBbO9/B5lmfNKeIf+nKSXx+V89Wi1px6
mKa8o9/Lm3OgWxR1ly9VCiwlfa9UZGsnPGWL2uwAhRZfQcEBel6ct7tq/TY6
iYp92yCalq0uNyaqM8KaMKZO4RGKZgdnfUZYImTWcGzIEoEIfSmgbo/c5S3O
nylcHzVP/7oDPzWm+wlHYI56KKJ0JHbKEK/sk+Xc00QkchMvynN2FznwgKOH
WKOhkOP8GZQ7xtjLI90Bza78DLYvnMjSm9Eq79slJS53Tsw948RqpVS5fSse
6m7gnR/Dvg6ddH0Dm11yHHQNZHjLYQxVEO+IvJ/cpRsoS1pWy82bnhbJzvXW
OwasN7rjiUwQLG67Q7t42+54qSRnJykeeKNOp2k5GgRKLE4cm5PZhYVnhzfL
YXRZ0TXwexVYXrvzs0T6GvrnNd0OD7S+6L61G9riwekofXwghFV9Foe1DfmO
vK2uJNV7l5QyXBuj7ARxi86+aP44y/U+zvPzfZUb0djRzN26ecwzSrn96r57
CsJYf8O7s3zPmE6nZ3/5Qd/4BuJcdsboQUu3TvD5X3jyPXs8MpWl72HGq3ze
9AlI5euSuMU3uuQxg6iBJXIqoitNBOF/Z5jXJoQHf63BX5v/OvzX478h/03p
r8VXbJ7jBPTXi+hvxHAkfw74r28bP2iVYX3EDacxL602wxvzeEs+X0l4Y3ZG
fzM+js0bs/izw39dnhPwAWN1HIaTprzhARsxK4r5lbipe67D5pTV7fiWfddV
Qx9JgbYeGVSNZomB3JNbv7OFg1Vedwvb49IuY5GVlga4XMXzPFF67EeCE2kr
pOMMBA9CmNuV5oLU77Wy/UnT+mid9uDrkOzbRZ73p5K7vJtdDoC6TK0S7O7Z
Yq30hyn+9Qz2ApxB4iHzi1nTGTpNMkikqSQyYGrSOpSlXdBze3VfUuhKKWT2
y5qSl4JNVD4yzipU8SzL36NSBx+KohZwhqLy718/f/rinLM/mi92CYTlG2XS
SOC+I4/C+8vXJ4f/gfkLcZ0vVouBRz5CNwOxf1uvlr/zrd8+pv93APVlV1/u
YR/eCXuN0D9qhRevT47ptAtYTVpBcWB77s95wmgL6xNuxcvR2o0D+zQAr7H3
a2YsfbzP10/xa16lMhz7tgP92tjCk0/aTN568Y3tauu2DWLbbbzhgDfqGcWr
CIxXhVjE+cWqXNUqD16mbYVLe6cMejpRBcnVsjUEg5KcyihLldhWmS4qZut0
w9atUqa2kBJrkaR9dmvxbjL529/+NtHfdyDzOCK06MBF4gksQud62nnvTmit
xqGHSvyzJhx67AMickFOFzeLbWpinAgf6RL9RAJdG660kTvFuXUuk07eViZZ
TilD3SZd+YBsy5k521wBUaySK8rFqTQ8pd+SvErg1jdCPUqalpwV7Uofw1w2
CFXJpHyjs4Od19pZ7jatwwvSYlwD6csybA8FFs85M0+ZZX7JY+AjadPS6+cW
HyoT06cHd7RwtGtRzYhQXLQydLcV4Oz3gG3ugnc4gHebzbvTguFw37D51Kf7
MVaG6N3IJUEgnl339ScTyPXnxrsfJhN4rdpUfG6oWLYNz4n5yT6qvxMOUnJO
P7W3qGc5+qhgMiG39xZwLFBr8K4ZXn+TAsh7w5/37w0dPEwmJBKfG52v/V6k
7/eM97jz/a46SxfVJ003MFHCZ+gnGQBDSfCGEngix0pAf2dYqtp6qyLQUweK
oKuoiVH1YiDLOo+6Reop2VrCw6WF17VHy9uYqosoho4bq4rqDRlDUMtokJnI
55vCf3zLzFqpgS6PPtIuVxUprO7K5taHekMpFmh25QeqZMom3FZ6SElQMrmR
+nkPzvq0OkJF1XndJx6UWmcB6It65/J6yc9MvObrLey0LOQwBufs9Zr+2CJh
WoP0e75D4o8GEn+3UH6iKuZpzqWk7cRn7TrmtCLlUxUX9/FyXiACyNMu1FZ8
oRyIe1UU1v2H6KikWYdG0sb3JwVpEkq4sRZJmvecW+UxBp4w8A6CAq42Sn+h
sXTyYjKBPAKcLpdxGnr77EHiYjIZ8vCt+o5Ac96JVdPwFnZiOXGk1uJaGq2l
HhpU2vDRFhXxSJF2Irtb9WS6t9WZJIxEJuOZVnW3UK5XjjQ00IxdcbIeppp0
0D+KVPRjET3PMJ+rnJpi6jUR/rFiwIWmrmgw2MHB5hbXOPbMBIXIgfmzgjY5
s3DhyJqc2fR/c3Lm6O/u+kSvu0DT/P4bJgfDsYnOUFrYmM7v6ceGMGV3d0Qa
Nb5GnHFScEAaNTAgTpfnrWSfHx484KLjQ/bOVT6xHmQYt1LvquzCUZUJWCPa
ianRrPLso9BVK2DOKsZkw2i+1WY14Viq1NcdN0xOyrR/XmwLcbcS9VdE1S6D
fhYgljFBixNzF2PWaAzwziy6bI8uW7hs02VndNnGZYcuu6PLDi67tABD8kZj
LsY8uuyPLnu47NPlYHSZwq4A2gH7Jc32K5MYkj8xS/Inm5iSPznElvzJJX7k
Tx7xIn/yiQ/5UzDiMaVH13hsoFx7/lIXB/ylCDN8Hm6YoD0X+bmqjdzCU2us
I9rE5BZgayRtAKSxOmUv8j1inN1WNNTwWJTgdq6dsXVERxHg9uhv6/Gu86FO
u/9813efbxwgrM/t455t+HhLHA5C/xnciz/gTONfmDXfMpJsGvB4wKcBYqk1
FF63KIR7R8AakpC3Jn2lSQ2BfWtN1jEM4/m5wbfA8tHc3kHPR+iHVVxDf2tV
R373dp97K/qTD0T/A1A6IsEGuXo/6h9DguTDSECz9hjnu5PrW8lwvUEG7Zxs
UmPotYyIoge20ebWYst5UtxDnofWY8ZELMYuAaepOMG0Rrx23qBKROVU3P/R
6dY6rknROq4PoeJ1MYxwh7QjL7Ugn/AN1nmzuc71eB3NDmpyHyBfFyPCt27n
GtkfUOka8EI7e+T/8Zsm9ZZHnLuU1zAGGse9W3Jc60ah39fGAx7b04P9UwHD
Y2y9ud1Gd9OYiT4gG9O0vLLDT1QMdr1LZOWLI6zudn5g0LmBlJnYVbEAVnjd
Jn8ppXxgfNbVZyaGoUIJ9mKYaxWbOvTHbRn2zFeuv7H277MuJdwB2tmAxLve
GQKjP0HPXn3iZVDnIMAbZQ66qKocaw/Ft0WOOr++vcTh/TNLHMP0ep9G/6XE
cStefilx/FLi+KXE8UuJ459c4iC/SHtHH6XEsQbvlxLHLyWOX0oc/3QV8/Mu
cXyojtoscXRxZzOCdkvBg8d+KXj8VAUP759e8PAeUvC4xOTLPsXAGGBOKTBQ
9AO6QqGYSFVJKGQsTFUhuaTQsWjLJJYuk5i6TGLqoojXzsSMNvp190ApHf9e
mruDL9bwi1psNMwr7k4+oGDy42ol3MrgwaWSnu5iXCi51fn7sEqH9yGVDq+t
dPwjCx231jj+rqrFR69QbHmd/p4KhXd7heL2yoTmtW5bH6P6sHXrd1cfNvd+
vX3v26sOa9nV7QlvopQ1Sjn1ydMWD+wFc5EATvOfjbf/kPLAVvzcXR7YxM+9
Z99eHLinKHAnjjhrn2i8DBH2aefuvU8nd38neim+Gubm26w8ZeEVzjdy8H3q
fXDvdbGWaf8lyf5PTLI7f2+S/SNl2H9ccl3n1QdwtqbUn7avXrax/K7xiroi
1JPJ4bCX0cnhH+AgyuVGnk6/Rb4tvin6hg5dJpJjcpXaNOKSuzP16U1KYBUX
qjWE0hncj0h1K6ILXRydLxYyJT6Z3wxfR+83pgkJfo4pN/96kDMZnF53H6It
nKn+4EcMAYeHklGjXbeiYTMZTvvRu9PqLrUucRw7R3yR4tPbkiJqxtAGXy8F
vXsvOOPHckTvk+qmUyrxyO6DUPuJ53Jf8dSe6iuh+psw2DWRw7St0tLNJ4+w
bfiyFjJ3nRs2AgMVEVCqZFV0vQv2qNcHvawqOT/QZvcpW6HeRloXSbUBDXJ4
gKEwqot7msnb/HOrM9/9QI0qCsSk9GkUIGtuV/e32KeouzaoAQWcZXoZDBtt
gyD2pRlhlLDd7/fdqRbKppBi38glE8nA7Ymo0taabdUy1PlPilT1mZnf8Mu+
itmZBIi1NlPne1v7GtWX+VI//1T0r1wC+pLeu+LGGuPXMZUIbY1HEmq8lKpc
UZcI6stgeyp/TZvNVhXnQog3FxpwzS8hda2Pj3AlT/WbifWwOKc7R7UWpUVq
129MXIgci/dlLUar8gp0rpy7p0huRzp4wEwDbt2zFiAhYmvxYCFuVHrvZluX
oLbh0x5nddYpHa90vzV+U7yuVwv1SnmssvWDhi+66IKdS2oGia2pTi0Xgl7k
pZ4ptC1uM7JYlG1poG5bO7UEAeb3JTUMWd7oJka6fVPX1GdK/sC4gw5PBPYe
4wi6fdVmBx2NAna9sCfjnPNFrSE47/vjtFkTVbTg5i3G39aKZKSrF+TtqaJN
R4xbWo/o2zHrlvsHfgfo+FV5BXRVrYahPKo6wwDfsUwEdbfTyoT71RS/anvw
dMWyNQfFOGxbYHCNjn4qgBsBtnnTQTcq3aiLRIvylO1mlmVd59S5h1RJluXU
CZPaS1FnnrX+U0yDK/Jg13E/7mE4LGVMvmUW1XtfLZSf2mUWwexQdG17nVVx
WdBZ2sO21Sa2tbe2llFdyTfkpxPIrMR4ddNxqGo4wxlXbU26fkiTyRds1vvu
im2CljmaUo+KIffbvjLcGokpeKBeZh8msaijnTY8ChA3NmmhKSP0TOTzleqg
ghgBJLoqV/N05COQrAnV7KHtptF30elaWtAzp23fNdLVP30dYMiLTL/Bz1HQ
952q7wJJHe/VD8XAHKS5yhTF8qZULlleGRcrqHAoUlnvvntHTWKJsSUv2TWL
4F5O648TdHZudHaF1kwkJBCkk3UhcugOdm2SnpKy/jvql6/6gitcz7hLRapu
U2mecLMs7j+qewdRA6xVwT3+6DD6LWIcTVCDtoXuiKSUeuvw4LNWN1xvxry8
TNsWesPXf0c99pT9HXXk09V4pdTcVqd1TfwGMS4JOzck4naB8mKeX7Dy2Pmb
vnvfcdTte0rn5Be66vPiGIi8WMG2UvcahCJ9w68l+EIrqvHuuZ/k5uZbAbql
ZyER8HRDxrUnrP2I9RQzv+DN0tm194qVfltLbP9GNx/rOlCou1SDtdYbgnIg
xUm6gdOPFPVW3MlruzfUlsjkemOwvl5mVPyOc99zTPVAaf0h8oH6AtotfSyY
LTv12Pcv1XqSfKJC2bflDHJLCG11JoSYcdvjZXyOdm12SJRn2Ddj2e3RN9J3
HYjxXNaymahn7BKCUR+yw74vZNe+kRTEEpa36hTRXg+h1UzUGBS0wqJ/0U+1
dADJz5qTu4utkqLh8mw2NFkL4L6iZQBGOXp53w5b1UV1ZxPdlY0I3jEY183u
wDkb7DFjNTN6OoYKVXJOePrrStaatp0Hq84mBw1q19uTHc3EktjIHfU821Mu
xInldp/5F6q6b20fXP2Vfxyn+6aazNNXUaRDZ4Td6+PDF4cbrjVf5Efeat01
iQOCrgUEdWVqKDSrum7E3Oiv/20545R+J6ypqPL9fvCrZC9ITRnGe+P4Cf0P
Y/tr/wx1icfOCeprxgKpy3OMnTv2+foYlNG5wWMOjb07UP3KP1c/mkYZPWoO
ft9OH/0wPDi7ZNtP/+p517q2XuVND5kGVKBvnNHAGAmjEY0Hg3HxHZVXugzM
NqSMcTP4TojAsgoPr4GI12dfHTqhq/Dxzry2nD3z2vR/OF+fSwilyYy84dzg
hwcg8dajEhbHrSt1emAB/2JsHwCnlmNMTjUJciWM9HMXLOS6V5DS4F33PqXZ
qAma3hyHEZl6CKoLYYdNFDeb/P37t8dHqrsfHcmaOsZXUCwA8bIqG6lzoJ99
1g+fImCsUuOFam84fIztuOhm7XFcyX1LqXNT0rZDVO1K+vQxpXq6Do1A7R9P
nx1Flhv8iVpdbrbVGfZwp8SkqC/7dp8Er/cHFNU2M0KEeU6SiC1E4txJ8Vo7
yKMnULunTqc2kABUdltVtYfWVfujOZ1a/p/G71D5Ot2hTdGTXoLoli4H9LrP
KantDx/bVDbS2ydI3cl1XpkRqQS0ze7wjM91+m3HgxHic+31CfX1LevwnDYx
eImN+WMLS4DYNLTHDm93Mp69pNCoMWZ804MobprWR6P45hOS95J8tryT5N7U
7QhOO2Uu4UbCmlgdffn4A7ddzfoQ+j6YsG2+7hE1yMR/6gw9eWvd6XiDpqQ2
Y1CIH/yGgjG+42ZQtXo8TTs7wxG1LPBhGAeGCQSYtumYrumZvhmYoRmZwozN
xExNaWaTSXXJEy3TsizbcizX8izfCqzQiixhxVZipZa0MJHiIEwMRBC70vOd
MAhtz/VFmJhuEAgnDi0nc53+0bmeM9b3/Vn72MDGtqmCjUWiOJC+GdtukoSB
I0UYuTJJzCCy6DddhMP1bcxzHDOWZpg5nmOamRC2jLMIGzRTO6AfleLqN206
jlMvTu0Yd2dBHMWe5SWZ7WexDALPT7g2jnmJ4wkA8jws6SdOGPoy8WRkh1kY
pLEVcuWc9ifjJBFZIsMgEbHr+k7kJ67juF5kJxGwRXV1zPPCNHSkY2WQCCew
cKYs8ePY9gLLcn3T4ncFCfsAEHu+FI5tJ2Ho+aGwAuzfiwHNSyW/SYh5vmuG
VphlsRekiZnFiS0DW8gICwfSicRkcqIQaDqO9KPAiyM3tPwwiKRrRwTSjDxP
CHNyYj1snk6hKnodtPTxIl/EASjj4tCJMC07SAIn803P8QM/Slv6BJHpRK7p
WsJJbdyCpeJUhgCP43t22tLHCZPMxdoxLrqhSFIPlHWt2HfT1PQtq6WP5aeh
9MLADcFpQZxlmRVEQRaEOEeQSNnSB+v4lmObWZCmgRPGdmglSZQ5IG9iZ55o
6SNsC3wSx1bkCM+PpOOA14WIQi8108COWvqYURpYrvSzJAN2AhHK1EpSCZyn
thcJv6MPEBHFInAsP8hMoMjHX8uKM4hgnGZZKxwjUTYs/WgQ4gAlipDZO/5N
JkoP8UwT0n3HTMQcBFM9JacVwp3/+JFfJQtWYgLXcRpZEC4/kzGJhhs7CaQE
8sgP20K8gUXIoIQsmAmIB9a1QWrHSy0/ToV0AsEzIQEHhu2FjhdnkABwPHDv
J5kJ788E5yVxpH8Alp/tFYl0oYZEZsUpkdH03QRCIrwEPCrd7Yi0fzpEdnjq
0ZDYMQRI+AFsEvgF7JJYbgaVG0NZRLHbo8FyfDNNojQOBeTN9bzMl17siyh1
w1AKt0NDZluhm7gSmtk2bTcCA+ObDN0YwaztpdvR4PzD0bBhV0YMdrfFac92
v8VpOTGI0gia1UnDhLo9p4EMszSKwywJgtD1kg6kBxMRCNODgrVD4DPxXGhV
R0hojQxYG9Aq8aENAjvzBZaMQxu6PvUjL4Eit9NowLImNHIcROD/QJpCYv3A
s70s8yH8JrRmt7ibZLEgBRamYIAwgmoiJshCmaShHTvbaeV+qrR6GPp7jAL3
0A1pLEI3iu3AtCTMlHTsBIowgybsMRr6EOrQhBqA3RTQlhYI7mELKfAJxu4x
KmCDYP7iTCahJaBMHU+mZhwlIQy5SLZj1PvpMfrjebydSD9WaNu2Y7tgXd8O
7BDGp6PT3wXGFnZsJ3ZqS7uf6JgO7KMDjwWuE1yTntqxY5meLWDfEuFKOAMi
hqeUAvWmLaHROxAxzFrqpzEsfhSC0sBDbGWRmzquG4Si/5W8QMJSZoGIIhOE
tMyeZwLPtUUA3wXWHqoycgPXtYIYgulEkWcOeCaOLOzFhZvppAKryTCKsS50
rBuAZcxeYyawMFnmBeAP4WQJHBPHgX1KY1tkWRRu5xlfl8QbusaJel00F3c9
+Dzd4LR7+GfAaffw5O2y+zOVyuAjYfgn0I4PwHD4CWI4/JlgOPzZ8nD0M8Hw
B2sJ/24Mhx8fw+lamoCq7x+cJbAyAbcY5gVxBDZmJ24cu6YMYyfyYteRbRSK
AD1xAo/8cQn3LUwRV8ZJatmSIj5YRR2FminO6saZiDJ4fb6Locx3zAx2MnXh
oLdRKLCY+R5c+siRoURQnwRkll0YQNP3ZdBGoTi1GQOvwkRsjDjKjlNESIHj
wk56fhZ3UWhoI96H/yki33WjQCQAIj0n8TIP8Q7c+RNtmy3fg/kHHl3wvROK
LLYRciZ+agGATG6J1mG2E5wmFjKEIUcoHkXwHWLY/9CJ0qSL1n039AK4wjYi
vcxG5ArTHmRYME3gEiROiycpAoQpCA4D23Rd4SLsj+B3IFQ3AwxFLZ7szHIj
hDgWGA64tYAE4UdhZoahCL3I7PDkuYktZeRJcKnAQggbbZkELjx3Pw79Dk/w
a8wskbEfgjlTRJiWm4IfyYOB5x18nOi65eC7Jn2goD4c5N8Rr8OZyhIS9CgA
nvwUIQ7iD7iMtnBj2/F7cXcyGVkRvCkfouLYkB/4S6awIpl4YeTLQaAKT1NA
wuHfWiaCGMiF72e+b0cBwvugdwbhGoaQHQSylnBicEuQOhaUTBzEFAndEvx8
aLz+SZFmSwZAOhT6w/k1M9NzRQbnPPCtNPA8B6IqnB6xvnBcUMoxRRqnvucS
2i3fRzSaUv4g6vYVRpA2T8YCXnxoZ7EXhlFAjjbpVd8VHycD8Ckg9qfNKWSI
McwgkikUPixelAkpcckDD4de6vf7FwksRWSlFBfJzEvDGEIBg5BFKVQU/bh8
S/0whRFCnAKD4Msoy2xfmJTCTJI4TQFhEM0EqR2mZuIkpoxTF6untg0rZUGT
4pRBH6ZBNUKGbZiQ0INliqPAdoAJMlRQqLdQ/0NzCj9j6j+MoIO8j08uiJ06
DsyI6YUZ5M6H4XLgHnm+Zw88nQQRcICBEDdaiDidzIfhhH2HUXPDeODpWIEX
2xIWPnEsCQWIcNil9LbjYaXo42QpPkka/f+U9/ACGFARwI+NfEcGiPECL3SE
LWHBvCju6W27cDul6aYuxNbzzNj2LBg9Dz5JnAj9O+08UUTwsmBizSRxhR8M
E+YhVvKcDFiLwjSw4fIliYjcyPYkZvRcKBwBmAEQDHxHbhpYiW1KH9Y4Joz0
qU9YZz9lT9UMYdyFB0ZNbPhtlHWBy/nPzHv8KN79WOJwf4z0M9McP00m5ZPU
Nw+iWfQJ0uynyc18ijQLf7Zy9tNkez5Fmn1s3eh8fJq1nq9xmNCLHsD/BT0i
V0/eHagn12T6+aOMeprQA36vuid4xq+XDLp+dC9qGFeCG9JglnpE+Y4fMtYP
Qo9/89GY0xs66jfrZ+r3IQfP3Y9Af12Kwngi6Mllhv1dDhIXjXGa/wWX+LHf
G/1oJ/ZdVvrRzpeSXkgtjJPDI/X+Cz3TNb8xFmWTv+GDqfcy6GnQUWsNuoOe
i5f6HQb+HWx+9lAUl+vPzBb8c6YrLN/25ckreiuueztBNwWil/We47jVRaWP
8UQUuZwbX8xlngDbsUj4OXfqhEO/y6jeL4yr8pLeNSHp0r9vd/e9C2osN5Pz
ZbaaG/Xq4kI9sMwvRX9dzgoiyuo//6dxIpqmrvVvE874ycw3ubxqEZFWItNd
s2hCCwh7mpVX7a9Qzxg9g5d1VKcS9VIIAPETgQSCniCjDTBXnMiiyIFIGjia
iWpeNo00nstMvqEffauNK0nv7NfGK3Ep6MdKjeO6jNX7Midl3Ygsfysq41TM
cFb9++dvaHMXbRclqV/i4kfdh8/f8ysVCT3xv/a83toTpP8PYsfNAIebAAA=

-->

</rfc>
