<?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-rfc2629 version 1.6.5 (Ruby 3.0.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-denis-aegis-aead-04" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.3 -->
  <front>
    <title>The AEGIS family of authenticated encryption algorithms</title>
    <seriesInfo name="Internet-Draft" value="draft-denis-aegis-aead-04"/>
    <author initials="F." surname="Denis" fullname="Frank Denis">
      <organization>Fastly Inc.</organization>
      <address>
        <email>fde@00f.net</email>
      </address>
    </author>
    <author initials="F. E. R." surname="Scotoni" fullname="Fabio Enrico Renzo Scotoni">
      <organization>Individual Contributor</organization>
      <address>
        <email>fabio@esse.ch</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="2022" month="March" day="23"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document describes AEGIS-128L and AEGIS-256, two AES-based authenticated encryption algorithms designed for high-performance applications.</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>
    <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"/>, a variant of which has been chosen as a winner in the Competition for Authenticated Encryption: Security, Applicability, and Robustness (CAESAR). All variants of AEGIS are constructed from the AES encryption round function <xref target="FIPS-AES"/>. This document specifies:</t>
      <ul spacing="normal">
        <li>AEGIS-128L, which has a 128-bit key, a 128-bit nonce, a 1024-bit state, a 128-bit authentication tag, and processes 256-bit input blocks.</li>
        <li>AEGIS-256, which has a 256-bit key, a 256-bit nonce, a 768-bit state, a 128-bit authentication tag, and processes 128-bit input blocks.</li>
      </ul>
      <t>The AEGIS cipher family offers performance that significantly exceeds that of AES-GCM with hardware support for parallelizable AES block encryption <xref target="AEGIS"/>. Similarly, software implementations can also be faster, although to a lesser extent.</t>
      <t>Unlike with AES-GCM, nonces can be safely chosen at random with no practical limit when using AEGIS-256. AEGIS-128L also allows for more messages to be safely encrypted when using random nonces.</t>
      <t>With some existing AEAD schemes, such as AES-GCM, an attacker can generate a ciphertext that successfully decrypts under multiple different keys (a partitioning oracle attack)<xref target="LGR21"/>. This ability to craft a (ciphertext, authentication tag) pair that verifies under multiple keys significantly reduces the number of required interactions with the oracle in order to perform an exhaustive search, making it practical if the key space is small. One example for a small key space is 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>While this may be mitigated by means of inserting a padding block in the aforementioned algorithms, this workaround comes with additional processing cost and must itself be carefully constructed to resist leaking information via timing. As a key-committing AEAD scheme, the AEGIS cipher family is naturally more resistant against partitioning oracle attacks than non-committing AEAD schemes, making it significantly harder to find multiple different keys that decrypt successfully.</t>
      <t>Finally, unlike most other AES-based AEAD constructions, such as Rocca and Tiaoxin, leaking the state does not leak the key.</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>
      <t>Primitives:</t>
      <ul spacing="normal">
        <li>
          <tt>|x|</tt>: the length of <tt>x</tt> in bits.</li>
        <li>
          <tt>a ^ b</tt>: the bitwise exclusive OR operation between <tt>a</tt> and <tt>b</tt>.</li>
        <li>
          <tt>a &amp; b</tt>: the bitwise AND operation between <tt>a</tt> and <tt>b</tt>.</li>
        <li>
          <tt>a || b</tt>: the concatenation of <tt>a</tt> and <tt>b</tt>.</li>
        <li>
          <tt>a mod b</tt>: the remainder of the Euclidean division between <tt>a</tt> as the dividend and <tt>b</tt> as the divisor.</li>
        <li>
          <tt>LE64(x)</tt>: the little-endian encoding of 64-bit integer <tt>x</tt>.</li>
        <li>
          <tt>Pad(x, n)</tt>: padding operation. Trailing zeros are concatenated to <tt>x</tt> until the total length is a multiple of <tt>n</tt> bits.</li>
        <li>
          <tt>Truncate(x, n)</tt>: truncation operation. The first <tt>n</tt> bits of <tt>x</tt> are kept.</li>
        <li>
          <tt>Split(x, n)</tt>: splitting operation. <tt>x</tt> is split <tt>n</tt>-bit blocks, ignoring partial blocks.</li>
        <li>
          <tt>Tail(x, n)</tt>: returns the last <tt>n</tt> bits of <tt>x</tt>.</li>
        <li>
          <tt>AESRound(in, rk)</tt>: a single round of the AES encryption round function, which is the composition of the <tt>SubBytes</tt>, <tt>ShiftRows</tt>, <tt>MixColums</tt> and <tt>AddRoundKey</tt> transformations, as defined in section 5 of <xref target="FIPS-AES"/>. <tt>in</tt> is the 128-bit AES input state, and <tt>rk</tt> is the 128-bit round key.</li>
        <li>
          <tt>Repeat(n, F)</tt>: <tt>n</tt> sequential evaluations of the function <tt>F</tt>.</li>
        <li>
          <tt>CtEq(a, b)</tt>: compares <tt>a</tt> and <tt>b</tt> in constant-time, returning <tt>True</tt> for an exact match, <tt>False</tt> otherwise.</li>
      </ul>
      <t>AEGIS internal functions:</t>
      <ul spacing="normal">
        <li>
          <tt>Update(M0, M1)</tt>: the state update function.</li>
        <li>
          <tt>Init(key, nonce)</tt>: the initialization function.</li>
        <li>
          <tt>Enc(xi)</tt>: the input block encryption function.</li>
        <li>
          <tt>Dec(ci)</tt>: the input block decryption function.</li>
        <li>
          <tt>DecPartial(cn)</tt>: the input block decryption function for the last ciphertext bits when they do not fill an entire block.</li>
        <li>
          <tt>Finalize(ad_len, msg_len)</tt>: the authentication tag generation function.</li>
      </ul>
      <t>Input blocks are 256 bits for AEGIS-128L and 128 bits for AEGIS-256.</t>
      <t>AES blocks:</t>
      <ul spacing="normal">
        <li>
          <tt>Si</tt>: the <tt>i</tt>-th AES block of the current state.</li>
        <li>
          <tt>S'i</tt>: the <tt>i</tt>-th AES block of the next state.</li>
        <li>
          <tt>{Si, ...Sj}</tt>: the vector of the <tt>i</tt>-th AES block of the current state to the <tt>j</tt>-th block of the current state.</li>
        <li>
          <tt>C0</tt>: the constant <tt>0x000101020305080d1522375990e97962</tt> as an AES block.</li>
        <li>
          <tt>C1</tt>: the constant <tt>0xdb3d18556dc22ff12011314273b528dd</tt> as an AES block.</li>
      </ul>
      <t>AES blocks are always 128 bits in length.</t>
      <t>Input and output values:</t>
      <ul spacing="normal">
        <li>
          <tt>key</tt>: the encryption key (128 bits for AEGIS-128L, 256 bits for AEGIS-256).</li>
        <li>
          <tt>nonce</tt>: the public nonce (128 bits for AEGIS-128L, 256 bits for AEGIS-256).</li>
        <li>
          <tt>ad</tt>: the associated data.</li>
        <li>
          <tt>msg</tt>: the plaintext.</li>
        <li>
          <tt>ct</tt>: the ciphertext.</li>
        <li>
          <tt>tag</tt>: the authentication tag (128 bits).</li>
      </ul>
    </section>
    <section anchor="the-aegis-128l-algorithm">
      <name>The AEGIS-128L Algorithm</name>
      <t>AEGIS-128L has a 1024-bit state, made of eight 128-bit blocks <tt>{S0, ...S7}</tt>.</t>
      <t>The parameters for this algorithm, whose meaning is defined in <xref section="4" sectionFormat="comma" target="RFC5116"/> are:</t>
      <ul spacing="normal">
        <li>
          <tt>K_LEN</tt> (key length) is 16 octets.</li>
        <li>
          <tt>P_MAX</tt> (maximum length of the plaintext) is 2<sup>61</sup> octets.</li>
        <li>
          <tt>A_MAX</tt> (maximum length of the associated data) is 2<sup>61</sup> octets.</li>
        <li>
          <tt>N_MIN</tt> (minimum nonce length) = <tt>N_MAX</tt> (maximum nonce length) = 16 octets.</li>
        <li>
          <tt>C_MAX</tt> (maximum ciphertext length) = <tt>P_MAX</tt> + tag length = 2<sup>61</sup> + 16 octets.</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:
- The nonce <bcp14>MUST NOT</bcp14> be reused under any circumstances; doing so allows an attacker to recover the internal state.
- The key <bcp14>MUST</bcp14> be randomly chosen from a uniform distribution.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>msg</tt>: the message to be encrypted.</li>
          <li>
            <tt>ad</tt>: the associated data to authenticate.</li>
          <li>
            <tt>key</tt>: the encryption key.</li>
          <li>
            <tt>nonce</tt>: the public nonce.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ct</tt>: the ciphertext.</li>
          <li>
            <tt>tag</tt>: the authentication tag.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

ct = {}

ad_blocks = Split(Pad(ad, 256), 256)
for xi in ad_blocks:
    Enc(xi)

msg_blocks = Split(Pad(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:
- 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.
- The comparison of the input <tt>tag</tt> with the <tt>expected_tag</tt> <bcp14>SHOULD</bcp14> be done in constant time.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ct</tt>: the ciphertext to be decrypted.</li>
          <li>
            <tt>tag</tt>: the authentication tag.</li>
          <li>
            <tt>ad</tt>: the associated data to authenticate.</li>
          <li>
            <tt>key</tt>: the encryption key.</li>
          <li>
            <tt>nonce</tt>: the public nonce.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>Either the decrypted message <tt>msg</tt>, or an error indicating that the authentication tag is invalid for the given inputs.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

msg = {}

ad_blocks = Split(Pad(ad, 256), 256)
for xi in ad_blocks:
    Enc(xi)

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

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

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

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

if CtEq(tag, expected_tag) is False:
    erase msg
    return "verification failed" error
else:
    return msg
]]></artwork>
      </section>
      <section anchor="the-init-function">
        <name>The Init Function</name>
        <artwork><![CDATA[
Init(key, nonce)
]]></artwork>
        <t>The <tt>Init</tt> function constructs the initial state <tt>{S0, ...S7}</tt> using the given <tt>key</tt> and <tt>nonce</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>key</tt>: the encryption key.</li>
          <li>
            <tt>nonce</tt>: the nonce.</li>
        </ul>
        <t>Defines:</t>
        <ul spacing="normal">
          <li>
            <tt>{S0, ...S7}</tt>: the initial state.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
S0 = key ^ nonce
S1 = C1
S2 = C0
S3 = C1
S4 = key ^ nonce
S5 = key ^ C0
S6 = key ^ C1
S7 = key ^ C0

Repeat(10, Update(nonce, key))
]]></artwork>
      </section>
      <section anchor="the-update-function">
        <name>The Update Function</name>
        <artwork><![CDATA[
Update(M0, M1)
]]></artwork>
        <t>The <tt>Update</tt> function is the core of the AEGIS-128L algorithm.
It updates the state <tt>{S0, ...S7}</tt> using two 128-bit values.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>M0</tt>: the first 128-bit block to be absorbed.</li>
          <li>
            <tt>M1</tt>: the second 128-bit block to be absorbed.</li>
        </ul>
        <t>Modifies:</t>
        <ul spacing="normal">
          <li>
            <tt>{S0, ...S7}</tt>: the state.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
S'0 = AESRound(S7, S0 ^ M0)
S'1 = AESRound(S0, S1)
S'2 = AESRound(S1, S2)
S'3 = AESRound(S2, S3)
S'4 = AESRound(S3, S4 ^ M1)
S'5 = AESRound(S4, S5)
S'6 = AESRound(S5, S6)
S'7 = AESRound(S6, S7)

S0  = S'0
S1  = S'1
S2  = S'2
S3  = S'3
S4  = S'4
S5  = S'5
S6  = S'6
S7  = S'7
]]></artwork>
      </section>
      <section anchor="the-enc-function">
        <name>The Enc Function</name>
        <artwork><![CDATA[
Enc(xi)
]]></artwork>
        <t>The <tt>Enc</tt> function encrypts a 256-bit input block <tt>xi</tt> using the state <tt>{S0, ...S7}</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>xi</tt>: the 256-bit input block.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ci</tt>: the 256-bit encrypted block.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
z0 = S6 ^ S1 ^ (S2 & S3)
z1 = S2 ^ S5 ^ (S6 & S7)

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

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

return ci
]]></artwork>
      </section>
      <section anchor="the-dec-function">
        <name>The Dec Function</name>
        <artwork><![CDATA[
Dec(ci)
]]></artwork>
        <t>The <tt>Dec</tt> function decrypts a 256-bit input block <tt>ci</tt> using the state <tt>{S0, ...S7}</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ci</tt>: the 256-bit encrypted block.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>xi</tt>: the 256-bit decrypted block.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
z0 = S6 ^ S1 ^ (S2 & S3)
z1 = S2 ^ S5 ^ (S6 & S7)

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

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

return xi
]]></artwork>
      </section>
      <section anchor="the-decpartial-function">
        <name>The DecPartial Function</name>
        <artwork><![CDATA[
DecPartial(cn)
]]></artwork>
        <t>The <tt>DecPartial</tt> function decrypts the last ciphertext bits <tt>cn</tt> using the state <tt>{S0, ...S7}</tt> when they do not fill an entire block.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>cn</tt>: the encrypted input.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>xn</tt>: the decryption of <tt>cn</tt>.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
z0 = S6 ^ S1 ^ (S2 & S3)
z1 = S2 ^ S5 ^ (S6 & S7)

t0, t1 = Split(Pad(cn, 256), 128)
out0 = t0 ^ z0
out1 = t1 ^ z1

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

v0, v1 = Split(Pad(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, msg_len)
]]></artwork>
        <t>The <tt>Finalize</tt> function computes a 128-bit tag that authenticates the message and associated data.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ad_len</tt>: the length of the associated data in bits.</li>
          <li>
            <tt>msg_len</tt>: the length of the message in bits.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>tag</tt>: the authentication tag.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
t = S2 ^ (LE64(ad_len) || LE64(msg_len))

Repeat(7, Update(t, t))

tag = S0 ^ S1 ^ S2 ^ S3 ^ S4 ^ S5 ^ S6

return tag
]]></artwork>
      </section>
    </section>
    <section anchor="the-aegis-256-algorithm">
      <name>The AEGIS-256 Algorithm</name>
      <t>AEGIS-256 has a 768-bit state, made of six 128-bit blocks <tt>{S0, ...S5}</tt>.</t>
      <t>The parameters for this algorithm, whose meaning is defined in <xref section="4" sectionFormat="comma" target="RFC5116"/> are:</t>
      <ul spacing="normal">
        <li>
          <tt>K_LEN</tt> (key length) is 32 octets.</li>
        <li>
          <tt>P_MAX</tt> (maximum length of the plaintext) is 2<sup>61</sup> octets.</li>
        <li>
          <tt>A_MAX</tt> (maximum length of the associated data) is 2<sup>61</sup> octets.</li>
        <li>
          <tt>N_MIN</tt> (minimum nonce length) = <tt>N_MAX</tt> (maximum nonce length) = 32 octets.</li>
        <li>
          <tt>C_MAX</tt> (maximum ciphertext length) = <tt>P_MAX</tt> + tag length = 2<sup>61</sup> + 16 octets.</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:
- The nonce <bcp14>MUST NOT</bcp14> be reused under any circumstances; doing so allows an attacker to recover the internal state.
- The key <bcp14>MUST</bcp14> be randomly chosen from a uniform distribution.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>msg</tt>: the message to be encrypted.</li>
          <li>
            <tt>ad</tt>: the associated data to authenticate.</li>
          <li>
            <tt>key</tt>: the encryption key.</li>
          <li>
            <tt>nonce</tt>: the public nonce.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ct</tt>: the ciphertext.</li>
          <li>
            <tt>tag</tt>: the authentication tag.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

ct = {}

ad_blocks = Split(Pad(ad, 128), 128)
for xi in ad_blocks:
    Enc(xi)

msg_blocks = Split(Pad(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:
- 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.
- The comparison of the input <tt>tag</tt> with the <tt>expected_tag</tt> <bcp14>SHOULD</bcp14> be done in constant time.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ct</tt>: the ciphertext to be decrypted.</li>
          <li>
            <tt>tag</tt>: the authentication tag.</li>
          <li>
            <tt>ad</tt>: the associated data to authenticate.</li>
          <li>
            <tt>key</tt>: the encryption key.</li>
          <li>
            <tt>nonce</tt>: the public nonce.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>Either the decrypted message <tt>msg</tt>, or an error indicating that the authentication tag is invalid for the given inputs.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
Init(key, nonce)

msg = {}

ad_blocks = Split(Pad(ad, 128), 128)
for xi in ad_blocks:
    Enc(xi)

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

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

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

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

if CtEq(tag, expected_tag) is False:
    erase msg
    return "verification failed" error
else:
    return msg
]]></artwork>
      </section>
      <section anchor="the-init-function-1">
        <name>The Init Function</name>
        <artwork><![CDATA[
Init(key, nonce)
]]></artwork>
        <t>The <tt>Init</tt> function constructs the initial state <tt>{S0, ...S5}</tt> using the given <tt>key</tt> and <tt>nonce</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>key</tt>: the encryption key.</li>
          <li>
            <tt>nonce</tt>: the nonce.</li>
        </ul>
        <t>Defines:</t>
        <ul spacing="normal">
          <li>
            <tt>{S0, ...S5}</tt>: the initial state.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
k0, k1 = Split(key, 128)
n0, n1 = Split(nonce, 128)

S0 = k0 ^ n0
S1 = k1 ^ n1
S2 = C1
S3 = C0
S4 = k0 ^ C0
S5 = k1 ^ C1

Repeat(4,
  Update(k0)
  Update(k1)
  Update(k0 ^ n0)
  Update(k1 ^ n1)
)
]]></artwork>
      </section>
      <section anchor="the-update-function-1">
        <name>The Update Function</name>
        <artwork><![CDATA[
Update(M)
]]></artwork>
        <t>The <tt>Update</tt> function is the core of the AEGIS-256 algorithm.
It updates the state <tt>{S0, ...S5}</tt> using a 128-bit value.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>msg</tt>: the block to be absorbed.</li>
        </ul>
        <t>Modifies:</t>
        <ul spacing="normal">
          <li>
            <tt>{S0, ...S5}</tt>: the state.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
S'0 = AESRound(S5, S0 ^ M)
S'1 = AESRound(S0, S1)
S'2 = AESRound(S1, S2)
S'3 = AESRound(S2, S3)
S'4 = AESRound(S3, S4)
S'5 = AESRound(S4, S5)

S0  = S'0
S1  = S'1
S2  = S'2
S3  = S'3
S4  = S'4
S5  = S'5
]]></artwork>
      </section>
      <section anchor="the-enc-function-1">
        <name>The Enc Function</name>
        <artwork><![CDATA[
Enc(xi)
]]></artwork>
        <t>The <tt>Enc</tt> function encrypts a 128-bit input block <tt>xi</tt> using the state <tt>{S0, ...S5}</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>xi</tt>: the input block.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ci</tt>: the encrypted input block.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
z = S1 ^ S4 ^ S5 ^ (S2 & S3)

Update(xi)

ci = xi ^ z

return ci
]]></artwork>
      </section>
      <section anchor="the-dec-function-1">
        <name>The Dec Function</name>
        <artwork><![CDATA[
Dec(ci)
]]></artwork>
        <t>The <tt>Dec</tt> function decrypts a 128-bit input block <tt>ci</tt> using the state <tt>{S0, ...S5}</tt>.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ci</tt>: the encrypted input block.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>xi</tt>: the decrypted block.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
z = S1 ^ S4 ^ S5 ^ (S2 & S3)

xi = ci ^ z

Update(xi)

return xi
]]></artwork>
        <t>It returns the 128-bit block <tt>out</tt>.</t>
      </section>
      <section anchor="the-decpartial-function-1">
        <name>The DecPartial Function</name>
        <artwork><![CDATA[
DecPartial(cn)
]]></artwork>
        <t>The <tt>DecPartial</tt> function decrypts the last ciphertext bits <tt>cn</tt> using the state <tt>{S0, ...S5}</tt> when they do not fill an entire block.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>cn</tt>: the encrypted input.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>xn</tt>: the decryption of <tt>cn</tt>.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
z = S1 ^ S4 ^ S5 ^ (S2 & S3)

t = Pad(ci, 128)
out = t ^ z

xn = Truncate(out, |cn|)

v = Pad(xn, 128)
Update(v)

return xn
]]></artwork>
      </section>
      <section anchor="the-finalize-function-1">
        <name>The Finalize Function</name>
        <artwork><![CDATA[
Finalize(ad_len, msg_len)
]]></artwork>
        <t>The <tt>Finalize</tt> function computes a 128-bit tag that authenticates the message and associated data.</t>
        <t>Inputs:</t>
        <ul spacing="normal">
          <li>
            <tt>ad_len</tt>: the length of the associated data in bits.</li>
          <li>
            <tt>msg_len</tt>: the length of the message in bits.</li>
        </ul>
        <t>Outputs:</t>
        <ul spacing="normal">
          <li>
            <tt>tag</tt>: the authentication tag.</li>
        </ul>
        <t>Steps:</t>
        <artwork><![CDATA[
t = S3 ^ (LE64(ad_len) || LE64(msg_len))

Repeat(7, Update(t))

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 128-bit authentication tag in distinct structures or encode both as a single string.</t>
      <t>In the latter case, the tag <bcp14>MUST</bcp14> immediately follow the ciphertext:</t>
      <artwork><![CDATA[
combined_ct = ct || tag
]]></artwork>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>AEGIS-256 offers 256-bit message security against plaintext and state recovery. AEGIS-128L offers 128-bit security. They are both key-committing and context-committing, the implications of which are outlined in the introduction. However, neither is compactly-committing because a 128-bit tag is too short to be collision resistant. This means it is still possible for a ciphertext to be successfully decrypted under multiple different keys, just significantly more difficult than for AEAD schemes lacking key commitment.</t>
      <t>Under the assumption that the secret key is unknown to the attacker and the tag is not truncated, both AEGIS-128L and AEGIS-256 target 128-bit security against forgery attacks.</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="CRA18"/>, 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 collision probability.</t>
      <t>With AEGIS-256, random nonces can be used with no practical limits.</t>
      <t>The security of AEGIS against timing attacks is limited by the implementation of the underlying <tt>AESRound()</tt> function. Failure to implement <tt>AESRound()</tt> in a fashion safe against side-channel attacks, such as differential power analysis or timing attacks, may lead to leakage of secret key material or state information. The exact mitigations required for side-channel attacks also depend on the threat model in question.</t>
      <t>A security analysis of AEGIS can be found in Chapter 4 of <xref target="AEGIS"/>.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA is requested to assign entries for <tt>AEAD_AEGIS128L</tt> and <tt>AEAD_AEGIS256</tt> in the AEAD Registry with this document as reference.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="FIPS-AES" target="http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf">
          <front>
            <title>Advanced Encryption Standard (AES)</title>
            <author>
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date month="November" year="2001"/>
          </front>
          <seriesInfo name="FIPS" value="PUB 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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <date month="January" year="2008"/>
            <abstract>
              <t>This document defines algorithms for Authenticated Encryption with Associated Data (AEAD), and defines a uniform interface and a registry for such algorithms.  The interface and registry can be used as an application-independent set of cryptoalgorithm suites.  This approach provides advantages in efficiency and security, and promotes the reuse of crypto implementations.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5116"/>
          <seriesInfo name="DOI" value="10.17487/RFC5116"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="AEGIS" target="https://competitions.cr.yp.to/round3/aegisv11.pdf">
          <front>
            <title>AEGIS: A fast 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="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)</refcontent>
        </reference>
        <reference anchor="CRA18">
          <front>
            <title>Can Caesar Beat Galois? Robustness of CAESAR Candidates against Nonce Reusing and High Data Complexity Attacks</title>
            <author initials="S." surname="Vaudenay" fullname="Serge Vaudenay">
              <organization>EPFL, Switzerland</organization>
            </author>
            <author initials="D." surname="Vizár" fullname="Damian Vizár">
              <organization>EPFL, Switzerland</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</refcontent>
        </reference>
      </references>
    </references>
    <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  : 00000000000000000000000000000000

nonce: 00000000000000000000000000000000

ad   :

msg  : 00000000000000000000000000000000

ct   : 41de9000a7b5e40e2d68bb64d99ebb19

tag  : f4d997cc9b94227ada4fe4165422b1c8
]]></artwork>
        </section>
        <section anchor="test-vector-2">
          <name>Test Vector 2</name>
          <artwork><![CDATA[
key  : 00000000000000000000000000000000

nonce: 00000000000000000000000000000000

ad   :

msg  :

ct   :

tag  : 83cc600dc4e3e7e62d4055826174f149
]]></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

tag  : cc6f3372f6aa1bb82388d695c3962d9a
]]></artwork>
        </section>
        <section anchor="test-vector-4">
          <name>Test Vector 4</name>
          <artwork><![CDATA[
key  : 10010000000000000000000000000000

nonce: 10000200000000000000000000000000

ad   : 0001020304050607

msg  : 000102030405060708090a0b0c0d

ct   : 79d94593d8c2119d7e8fd9b8fc77

tag  : 5c04b3dba849b2701effbe32c7f0fab7
]]></artwork>
        </section>
        <section anchor="test-vector-5">
          <name>Test Vector 5</name>
          <t>This test <bcp14>MUST</bcp14> return a "verification failed" error.</t>
          <artwork><![CDATA[
key  : 10000200000000000000000000000000

nonce: 10010000000000000000000000000000

ad   : 0001020304050607

msg  : 

ct   : 79d94593d8c2119d7e8fd9b8fc77

tag  : 5c04b3dba849b2701effbe32c7f0fab7
]]></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  : 10010000000000000000000000000000

nonce: 10000200000000000000000000000000

ad   : 0001020304050607

msg  : 

ct   : 79d94593d8c2119d7e8fd9b8fc78

tag  : 5c04b3dba849b2701effbe32c7f0fab7
]]></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   : 0001020304050608

msg  : 

ct   : 79d94593d8c2119d7e8fd9b8fc77

tag  : 5c04b3dba849b2701effbe32c7f0fab7
]]></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   : 0001020304050607

msg  : 

ct   : 79d94593d8c2119d7e8fd9b8fc77

tag  : 6c04b3dba849b2701effbe32c7f0fab8
]]></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  : 00000000000000000000000000000000
       00000000000000000000000000000000

nonce: 00000000000000000000000000000000
       00000000000000000000000000000000

ad   :

msg  : 00000000000000000000000000000000

ct   : b98f03a947807713d75a4fff9fc277a6

tag  : 478f3b50dc478ef7d5cf2d0f7cc13180
]]></artwork>
        </section>
        <section anchor="test-vector-2-1">
          <name>Test Vector 2</name>
          <artwork><![CDATA[
key  : 00000000000000000000000000000000
       00000000000000000000000000000000

nonce: 00000000000000000000000000000000
       00000000000000000000000000000000

ad   :

msg  :

ct   :

tag  : f7a0878f68bd083e8065354071fc27c3
]]></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

tag  : 8d86f91ee606e9ff26a01b64ccbdd91d
]]></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

tag  : c60b9c2d33ceb058f96e6dd03c215652
]]></artwork>
        </section>
        <section anchor="test-vector-5-1">
          <name>Test Vector 5</name>
          <t>This test <bcp14>MUST</bcp14> return a "verification failed" error.</t>
          <artwork><![CDATA[
key  : 10000200000000000000000000000000
       00000000000000000000000000000000

nonce: 10010000000000000000000000000000
       00000000000000000000000000000000

ad   : 0001020304050607

msg  : 

ct   : f373079ed84b2709faee37358458

tag  : c60b9c2d33ceb058f96e6dd03c215652
]]></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  : 10010000000000000000000000000000
       00000000000000000000000000000000

nonce: 10000200000000000000000000000000
       00000000000000000000000000000000

ad   : 0001020304050607

msg  : 

ct   : f373079ed84b2709faee37358459

tag  : c60b9c2d33ceb058f96e6dd03c215652
]]></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   : 0001020304050608

msg  : 

ct   : f373079ed84b2709faee37358458

tag  : c60b9c2d33ceb058f96e6dd03c215652
]]></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   : 0001020304050607

msg  : 

ct   : f373079ed84b2709faee37358458

tag  : d60b9c2d33ceb058f96e6dd03c215653
]]></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 Eric Lagergren and Daniel Bleichenbacher for catching a broken test vector and Daniel Bleichenbacher for many helpful suggestions.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAISHO2IAA+1963bcOJLm/3wKrvucaWlGSvN+0XbNtkqSq9xt2V7L1TN9
5kw7QRCUWM4ks0mmLNmufpbdV9l9sf0iADLJVOpiV5W7eqfsc6RMEAgE4h4B
Atrf35+0RTtXB9aj1xfKOjz55umZlYtFMb+2qtwSq/ZClW0hRasyS5Wyvl62
RVVaYn5e1UV7sWgeTbJKlmIBEFkt8nY/U2XR7At1zj9Ftm/7ExqPAdcHVlHm
1WRSLOsDq61XTevadmK7k7fq+l1VZwfW07JVdana/WMCNpk0rSizN2JelZjg
WjWTZiHq9s1fV1WrGt2yLA6s/2gruWc1Vd3WKm/w6XpBH/5zMqElVPXBxNqf
WPinMX1Si/KtdUyYcmtVn4uyeC9obXgqmhbrf1rKKT9VC1HMD6w8U7+37XwK
7DagibSorJOyLmRlvVLl+8o6k1VblcUW4E/LrLgsspWYW0dV2dZFumqrejQP
gfu9aho1lRfjmc7EYqXm1rOVFNsQvx92wwD25wQg/P1yMV0ocAM8qReAcakO
JujNUnDAwzrh0E3WIZBr2q2CYO1cOlNn9xEPu1TlCsOODk/ODl9ZslosFSCh
vwYq6nPVHlgXbbtsDh4/HjxvprKeXi+nbfW4rlZl5j1mQbp0nOkyy3l0z1D+
t29+W5AsyMO3U+vfVn2TJtq3VXn+/aocPgDZDqznorwW5bn1WsmLsppX5xDz
ufVdCTLUTdFeb5/h66n1slalUvONab6GXN54xBP98TvrmVqBJtycQRcOLNd2
wn072XcCovizb165zpjiLwGOSVIAxRe1kHOoZ9sK+bbRNK4lenl2e2F9d3by
/Om/W2dKrsCKa+vserGsmmIFnmw+cjsObfLg3bt301UDhbiaAmewpMwV1iLV
Y93aGAiu83hZKzS1LHOP52ZVd3LlD1MQoNyg1x9W80KM2plYRxXUfz5nrmyH
9nJqfVOv0rTZAPhSrOabTx4I8vXUelU0rSqXoPoG2NcX1UI0255vB97x13WI
s0evDp14zNkjUVpHQjWitr5WorW+gXUrmv9hvapSGMQSik+m1+gOOmcFgWws
cS6AbGs9r8AW2JlVQ6KB59a3xfmFdSxaAWwWy7m6IlbfFJbD5XJewI4fkfJW
57VYXlzz+OeqhfV924vJ1Do8en5GMhoT52S7qhWmJSSKkudYwUrDyBUkIXvW
ZTW3HDtOXD1Zo+pCNWRVOnk4fvH0AD2mjm1Hj5Mo3vf2PSfZTzwvjvbtN25w
vwydTa0/iRWci7jeYNCZgijffMjcOXn55NmedfauaN+reo61bgd+DODF+//7
v+sN0MfwhODWxrM7IPfKHU8m+/v7lkibFroLR/b6omgsuMrVArpjZaqRMM8g
KFvWfceNnzEr9Fc3CPcs8ARfz/ZT0YBpD3DFBLU4L/EY9ty6gFDsL1XNtp0k
RhD7pdBmdqLxWxRZNocL+A053rrKVpKt9K3Ytl2QsAXj21EEkS4s0TSVLPhR
RqK6c3hyeLw7RP/DB4b1ww97lrAuRQ3St6QK7y4KeWFdQAlTpUpLXlSwP4CH
Xu+KsoQkQioJs6O1I2ESHI4QOukROuglfc861FRJizl/pRUNFHFHq+EuNAI6
bnBi/dShkoBiwFaCyaAcEb6uFoZIZ0MKsDOz8lXJ9MVK/9uTpy/P9tHrK/ow
dZJoilDI+eGHqTWmfbNUssihT3DN+wPa7w3IIiy07KdFayGO2ht8LSvWTzTY
rs8tiKdaNewyYBph1opzTYRlXUmKQRoLrOWeRQm1t9J5Basy7XFhUR2i0nU3
qHRfe1SiMP5cTLqeY0wm68hVFssLiEMfwMKHNdZQB9oLGFxSEpBUgpXopa6k
UlmjHzFjz/a/OTrVQnsh6uwdMblZLZeILlms4ATEfK7miLvSuWY14zJkeC/L
U+usADainl9TgJq3DK4gM73ovGhjARdoQlNBwjnEUjXWPoc5XMGytxWoNCcS
1MAWXqjFor8r58VbpbE0KO9pImtoANSIXGGBnb60FqLeDPLJY8oKhIVl4qBn
DhRbcBHdtFfpeTsdqTthiKVX7xomxKLCUhZATJyTbagGkxpSQCUGUM38Gkus
4d8IkaZaKCwL7lVPfHhsNfICxKEwfiXJcKwXSGRivwZS0CrPEW7VkCMQSPO+
BYEMl1eSxCZfzYFOphidxoIaYuhiNW8LcMDKipzjHBZXqLsg5q7jrkrHXXrK
3Q8fOE7rddQYDVq4pGwFSOyssdjbItC7AF/UGj9EmazXmygxImMRrRUMs7G+
5WqRojsEtVZ/XRV4BHWAvAipJYmZSx0N7jCNSKwwAlgaTSAqqqsLASOHWBfu
WtTyYs9aiLe0ZgjCWjCKnGEBJxgiAQXCspGBzedT60VJbBMkyCwMQj8Y913C
6lNiZ5yYGpjgG6xckcGFoFNkOlhmB6IhCRaIoiAuKdEEFrwB/qBPs0ohvyw/
WmJGwlDRVJoanaWCUSWVXy0t0cM3dNCwQW9DC1a+tChFfW16kOBeFHMyJljh
QlyT2GP+4pzdDMYvlCjZSSC4ABYcpmGeLKNP2lQYjyVAObYDIAk5+d4Z7mno
FJYJ7TyQJSnDXoJEI8AgYxwJsKwQHJLBXICxQL1R85xQkzA4WguGngrrQhwP
rYNlMYzv0kDI6mXBlEYzDABxBVzdBwYdmQdqurcOCjbsL/AvBWJHQXOzrdAz
klvvgtnb1Y0tcknG4paJm6HIjhWGzLYW+bxggmxXd9ZDYxpG9gIsfgKWz8lm
r7ShXRB1q5aWtw7KGJueqqR/a5v1qpJSMD9eF6K6Ksq9ntJEMHZ/cPPgaVlp
JnSqhtkp2Nboka7CeRSYl/NSMAeCtc5peYZh7vlb0rolB0U6ouvteR9LZLfH
cA15ORrRkUp2Qlerc0FaCKISnpKzAC0tlbYSN+0dA9+wWiTMnEfMmMTFe7Wz
OyPJAHIt6zNyeDIp5Gc0qTTasp+sd66aRJAz2AJmq2h5BBsJihyhTFhMp/bG
L+asT0YDX6l+mY2S6+UMYrApxcdHVXmp9bThVR0riJauWegIhOyetlOPTr87
e/1oT/+2nr/gz69O/ud3T1+dHNPns28Pnz3rP0xMj7NvX3z37Hj9aT3y6MXp
6cnzYz0YrdaoafLo9PDPj3Ss9OjFy9dPXzw/fPZIr28YSVLcoX00Owyk8WQH
RDPpwnumyddHL//P/3J8ClFfPTlyHScBmfWX2Il8fCGHrmerSuia/gpSXk+Q
YUBWCQo5AimWRYuQYY+0obmo3pUWtEeBmv/8H0SZ/zywfpfKpeP/q2mgBY8a
O5qNGplmN1tuDNZE3NK0ZZqemqP2DUqP8T388+h7R/dB42Tysqa4CjKtg/fZ
x6uPswOWurkqz6FTkLTZ1YwIhrCWg+qZsP5ipaYXGt8VDblZOV+Rr7NevLKq
JUU8JKcp0nZKiGZixuyYpTMD4p9ugDh8fvygkR8/9kNh1yhxKnu1u9l7UWV9
95pKjBzKGHNwspLzIoMrtKgq2dyYV8czXLFUgGogD9ubquaJnp2E/s7Vbkc7
uIK52scYys2huhX7Vcwa+iY9aNU58ABpefhLke1cITgmAJ0X7mmBWK4WiOPQ
hkS+arqUzixde0pi0grKP9fWpWopZtYspDhw7WCISuVszc3X9Yoh9fO3uoEp
OkABUPOihofpRneiQdi8VcuWoZ0hVW17UA19azcWw+LU6GcEjAmiM6U9Cz4S
4QUGsNfFGtbJ3Ow1iNCDhmlY1aVmxFzcRItHwA2+Iku6Q66tfkvjEAMCPOig
QxYjCHfmwp1tLprerVRNMXQrs7NV+vV1q5rZHj5fFHn7CgkIfTktro6q+WrR
GLk8zDLG6I/qegZKIwjrIxpthTIy2trOdcY+0A6lS8cpuJ8V5azDp0s5aQ06
7ezyVpqwfnujo14de3HQ6JWCRWx3sMonRB8iY4OwnRwJyK8uxXxlMkCz2L5E
MHuiqXzUnvx1R+xZKY0n6kAimqEq0mI4BEHos0+Ob8+wjxhNAqhmOj6noB9x
PYKmlsL92RPYZjzjmIZsBAyzDhPYPVBw2SFjzNd3Sypv7Zzae9ap02mjjmNW
/KgfwJg/hXvc4SoAJ3zdAPaa5Pe1FoyGnJRy56pY9+zT/KH8jEYcK4mca9sI
E9dtG/FSi/+OLB84kAnYK8MguWCd4AyXHCB8LQdzeQH3x7apRYKmwfLcfcQj
sjdzcpuL5pw+dGhsiaBMhjtexuTpoALCNoJiN0aG617j6A4fNp9RZk/sNpUL
w+CzwuAxK2b7uq5gaGKkswuzmOnaJP32vjEl0Wk94MNZsWdNp9Oz738wAy+h
iVXvNR40dReEzr7nzvfgeGSvPZrOPmb2lW3bDv67tmcHdmxnTuC6XhQkia2S
KAlddkTgYY+IBuVsAZWlXubEQRBm0nXz3HFtx/Ec3428NHDjLNsCakB6Zp+Y
vxPXzZpT0GntX3pec7y1aukjWY0upIB+GYwGGkKh6M4Wruu64RZRQdMur481
1QBcrtJ5IbXyfiY4kXWCPS7+8kPIfjfTXJDNudJeTrYdjXs943Zow+1q0uO3
y9F6XxLUWnDY5dXGxOlWUzrdKI0uRMZ+XBXnF21v1g2vIL62Ft/oh5kpPVI5
cIFYum6MmaCQoJuQ3FvVKC4JcKo6ckI6rg4cJ9yjkjSvhkJsiIRm7x/fPDt5
PrPIjBqB2CUQTmhVyOJNkPHyzenhv6PTQlwVi9ViEFyOiMsj3d81q+W/hs7v
HtPvIZTDO6FsMPAeWM/fnD4ltBcw9gRLy1C3gK+4w2iyzQ7jBR5t9B4Y4AFM
Q4Z/YXkw2H+1ieS/DEFPjrnqCJ+4uTnB/qCLGQbZ0TaGeWBYc0EZD1KrVSkW
aXG+qlaNroJWGSdZ69CIQU8nTzlvXS07UzbYndEFRaXLmrq0QBtwXcloG6pU
qEPyj7lI/H9z687HZPK3v/1tYr7vQAOxxGzPGnhp7sByPTPdZms3aGwMh7y6
7Mt2aRguDnhDb22cm4pVuU1px3XQkWZTXdWI3nCmjcXv0bqXdUUpBK2829Y5
gNTQErRYdbkl8adWKyrc6JqrKK+Bb438mGy5VM1/hwfnKmJf5h5WKblkJqtL
VZuYwYRJvafpygA8IU3G9e51CZ53hwQmL7gMm0H6+B2NgU83Zn1tG7vV68y9
L6vfaV65aDmQgOldnuJOuw+0XrDTMXh9jm0mvrRqSRBItjbDwskE+veV9eGH
yQRRkbGzX1k616HUjQSUPIr+OSEbe1VwkaHrrreMTfA4mVBQtQUOS/tWQOsB
GhIjhB9IhnugJK9fWX0A91FkH/esjxj5cVcvoE/1ZNs/mGjNIFhcCRPnWr1u
aOixGmuo+c6w9EbYrVpqug60tN/sGNbB94aKZspkW1SSamkVAiiaeFO1O1FE
V1MstUxeUdf4QHsFgKCnMSBzZJU3NPPpLR0bXUo26IMqQ81/V5Mx6VtuYj7U
8vPiUu8Q64hJJ9g34XZ6SipNpUJk/NpccSWg02iddBXNOiPVJpeFfr3fMlNX
VMFU2RtuN7WmlGq8pRomaVyd3ND3LXplNL7H+gF69vcwCScF18S3M47t2N5Y
SsqMcS7P75PDokSgW2R97qWZqj3zvTYFE/+0RkW2m2BIRXiwLEn9qX7Cqi/b
j1wY42cMWTLkHoKGrDGknzAzJo2dTKBEAFfoTQG1WJLGbOs9SGEnk6Hk3Wqk
CDQXE9ieDIdwMMfVAD0X8k2KWJtz/eqQNmGPtuj1I83TieqHms40tjN0pELE
H+uJsU+3sGxt0ejRwJz1+yvNsH5gEsFRQG62mdfCwhKuCyVanDfU7sEK0Ek+
V/273Gs49cFN3DZk9MwGayg6+IuGNjlz0HDkTM5c+m1Pzjzz3d/sGPQN1C1c
f0PnaPhsYupNDhAz1Rrz3gW67O6OeKKfb3BlXOIZ8EQ/GHClr9fVal3nG7wp
YPIfDnR1dagZ1Iu2su1d1adbOsXd4NZpl8frUukoNTPWUqRNVafGWJ52yXqD
qE3XQe4YMDmtsvWLNluYu5WpvyWu9pXQswhpgQ1enNq7eOaMngHemUPN7qjZ
QbNLzd6o2UWzR83+qNlDs08TMKRg9MzHs4Caw1FzgOaQmqNRM2UwEcwC8CWT
9lubBJI/sUjyJ5eEkj95JJb8ySd55E8BySJ/CkkO+VM0kjFYzw0B6+zpKMvY
nmFsee/Iml0VQy3fIkwbMnPVlae2QLsR3G72Xb/E0vUf8v49sR4U+AvYih9g
mfVPzLP3xHd8w4OAH4T0gGjdAs/W6T3IVbFHQrk7QZhCwFoSnfc2faVOLYF9
70w6rdSj4W8KPOQh8AXUdx1nFiPyw09skL/zM6PwcXvouJX88hPJ/wCSjlhw
g13rmOLnYYH8NBZQrz2m+e7k6lY2XN1gg3HXN7kx9OMjppgH23hzayF6Jst7
2PPQWvWYieXYSXIphIsYG8zr+g0q6LRfhPE/Od8ohpNlF8M9hINX5TBJG/KN
YraSIqRLzHE5nuNqPIcRA91xnd9dlSOGdwHYBrtvrf4PON/1GcU//L718DXP
vngyDOnHSdqWaskGWzUWNzakt9eY1luaBumt47rJ+/5jAfmEKkHbycEOb/5q
XHeJY/y9o9xuH/JEfcRDKfNun7GzO2Yp02Ll0Q+/E7CzsOfhOjkfVI+puH2j
eEyNuna88S5rVzpuiqvbC8fB37Nw7Ln/nxeOxwv8tXD8a+H418Lxf+XCMXlt
47t/XOF4K6BfC8e/Fo5/LRz/lyscf5JRuVk45tylHYG5pYTMz34tIX+pEnLw
9yshBw8pIb9F57fr/JSXziJS4kG5fmBqvlp6dN2ZsqDS1jXnt5QNlV3h2TGF
Z9sUnm1TZg66nujRJVn+Hlhk0qy39u7gizP8oicbPeYZdyefUIL+vOozn0N9
cPF5zXAxLj3fGlV9Wu04+JTacdDVjn/O0vGtVeMfVQf+yWq+W0543lfzDW6v
+T6k1rtR09peZqRlOqPCwbpk1QmsNvZUE4Q/+Iv1/mcpym6lz91F2Zv0uXft
20uy95Ri76QR10qlocuQYBsVU+jrMHAc79jMEJTNpr+4smrwyymr3skDyjU4
9BiUvKlAqplyozy6roqacVQKHRVBf61//sz1T+/z6p8PKn5uq3uedGdpuvRx
13q9Ws5VM5kcDi6PsE4P/4wQRy1v1G3Mab/bT/QTZbKudtZXqDgd1CUvK634
roh12YtKHeU5886oaNvykeHGHD3tc7hisVAZcW1+PTw+uEbQ0BYClVIh9c0g
XR9Qob8s5whrLTLz9n0zrP6amwW6TaqO7d0lOevTrV0JlUmjDYepBF2PTtYb
gB3hmv4iltdkU+gNcabLxilcwceCeYJBs6YK3TDQM6y/RIMgQbfnXR3ZlKP6
mz+m1rfVO3VJ1w+USidonNgjkZXtfDR5qqRYNWpDKykwqyo67ld3iagEK/Tx
r/74rzlAr89JF1zQhEzAYi6rpinS/kT5jaR226H+vip3yzHfPet7OhA9PiHM
x5GpXyExyuKjxvoF9vX5Yoia5PO6VJrTK190ly9kJnWFpVgttE3us1JwD7rF
o6hSW74t6exjV67tioKdshiqkdMwh8MUUkxm962ndPXtTTfEpZc7rOQcItad
pAbGX7Nare9a6SoYXNSk7FXnJ/vdOVyqZSpm9IHhxSAdols7TG6jAfFB0A4a
5zlIBov5Sp84hUtsKutdtZpnIx2tIWhCH6nrjimuTx33ZwXptZDujgmyAl++
BnTYHV/tCulwUdeQ5M7q79Tbbm6S65ubUnVdaW4XtXW+EjVkUKlm98MHvh6K
LrxRPGd/MI+Pg2/uw3DJiJz2aPGarrmQdBkFGRhTMx7a5V4MTsjy/IhS86A2
Dh+Q9gUeuhWlBmNlS1eiTC3EceawNZQYeQZfaEKLMUdY6G5Buo5iYY6Q61JP
d9gJn3Xx3+KNAPQrqqy7L2R49mR0oQjPOL5+xGyT6K0cPzZbOf2NJYOYTizM
CW6+G0Wdz4tztkNr47UEl82NH2NU+Aacm5h06nDLbSvdxTW97q7vFDJKrO9f
6G9DgLzxQH3FRGfi15fIdOLCtnB+zaf/+ixvdx1PjVSzBzHuywYhF80FwSWS
9kiRQ9yXsJalmneore886A0vyfASnqQeKEu9saI9vjsDks5HbEniuUacD+3n
AgJdEzCM1u5zcEuFrs6aQ436/g32dv3FKGS4tiGsL7LJEDjxIXZthi9o44yq
buiH9f91pRoj9IcDAztQfXPlxcadAkcXYknxiT+6qIAPJT09fH54I6jgxkIj
jRn1eWN4FXgrSh7oJjVex4w80xsGR7LfnXjtGyGFs85AsRN7RRcntvV1V2ge
XQVA8xlDO9U3gaUgDO99AwnrT3wkr9H7DUYuhk90HIXZLOvA4pN0dI7OtwM7
tCM7thNb2Kkt7cxWdo5I8y13dGzHcVw6GucETuhETuwkjnBSRzqZoxx0JOOG
jpGIUl8FoRdHsRv4oYil7UeR8NLY8XLfW++FrB3kJt6/6apLN9CmQgcmSdJI
hXbq+lLGkadEnPhKSjtKHMf2E+FxGQT9PM9OlR3nXuDZdi6Eq9I8AYJ25kZ+
GMRcJCGk0zQL0sxNMTqP0iQNnEDmbpinKoqCUHIJBf2kFwgACgJMGUovjkMl
A5W4cR5HWerEXGAh/FQqpciliiMpUt8PvSSUvuf5QeLKBNSi8gv6BXEWe8pz
ckiAFzlYUy7DNHWDyHH80Hb4JT2iPgCkQaiE57oyjoMwFk4E/IMU0IJM8St8
6Bf6duzEeZ4GUSbtPJWuilyhEkwcKS8Rk8mpJqDteSpMoiBN/NgJ4yhRvpsQ
SDsJAiHsyanzsH6Tw5w0RvProONPkIQijcAZH4uWwnbcSEZeHtqBF0ZhknX8
iRLbS3zbd4SXuRiCqdJMxQCP5Qdu1vHHi2XuY+4UjX4sZBaAs76Thn6W2aHj
dPxxwixWQRz5MSQtSvM8d6IkyqMY64ikUh1/ME/oeK6dR1kWeXHqxo6USe6B
vdLNA9HxR7gO5CRNncQTQZgoz4OsC5HEQWZnkZt0/LGTLHJ8FeYyB3UiEavM
kZkCzTM3SETY8weESFIReU4Y5TZIFOKn46Q5VDDN8rxTjpEqW46pIMOmapW9
899kwo7sIR1hvQFR75s8CDKMNXX0nUwlaIAmBcq3lZuFcUrMSCD4IJZOYdEx
p6YIpIX8uG4kMuHnynfCAN9gOuLt63W/zHq75fTYxp6UoW1n0lceeBe6Gaxi
ELswd37u+Ml2bL0Rtg4Z1Idgy73c+7G9YaKH7LrbdpsrL+833YatUZIlsFBe
Fku6OyaLVJxnSRrnMopiP5AdwACWNhJ2ADvlxmkoZODDOHlCQflyFfs9QUFO
6FTk5qHAfGnswmJmYRJImEM3gznaSlD/l0jQBxGpXzgo5KdelorYT1I3sh0F
m6w8V0Lrc6j99oUH5u7Olto4xjdlHnHX9tt0k1z3UGFNrnvoeh+5vgRJwp+G
JF9Kgh5CkvhHkiT6RyBJ/EWlJP5HIMnnKk54N0nijYCaSkyfHE87uXBcO1JZ
FMo4zF3ppyn8epx6SZD6nuriNYSy0osCFUo4jiSKMzj9VGaOqyg2cvMuXrMz
IOanuUhy23VDH4/y0LNz1/MyJAdpF69hxXkYUHjgqVgh/JURuSjfRogehirq
4jURIdoHEYSNKDLNEjfNpOtHnp86eYAovY/XYheRMXyMSELfTyIhAUQFngwQ
syMCRfxr6YUgBoErVJntQ6q8WOQp3Lwrw8wBACVviWtVmEqsJhUqdrMcQWuS
wI+mHhybl2Syj2tDPw6Q/nhuKrBoxHgIe6McEyIqD1zpdXRSIopjZasgcm3f
Fwj5kSA4LoJaG3lUnHR0cin8iAVonsagLRKpVIRJnNtxLOIgsXs6BT5CfpUE
ChIlMFEmlKtk5MM5h2kc9nTyXB+phkrDGJKUBRnSjSx3UoTnHqLwW9TsE+NQ
Ey3c2+/B8duDAX5uXJsSST2R+EgYosjxsihAwJrnSS5dRDxhr5PokHtpQKFi
hJgnyihbzJBOSIk4K7Z/krj2l0K/G3FyjuAP2X2OoD+zkb/Gdhh4AZTWITpJ
7yeJkz919fea5U9c/ReMu3Mv8myk1hlMJgx8kgul0BQg5kaiGfaoCwlTmzhZ
6jm2yoMsTh0nhkXNkww6jiy4T2QyGPHEIYMaqiTPkVrblCxLmWYZAPwkcfc/
JoMeRPR1AgO3k0g38zzYSjuI8yRUIayzB38dhIH7d4zjP4P8PxE/Hxze/Iwk
/iJ5wS9Xwh9C4uRHkviL5Bm/NBJvyVt+Rin+InnLL43En2sosrtJ3EUd1qGk
PXuQ65y2S5rJhwN9gbXKvnqU01vOj34Y/tmJ+/82i/VO8Hvp6KX37+64wNts
DG78yZA5vZWh/87Chb5SdbB9OgL9h0qU1rGgbT2G/acCPClb61XxPZq6V0r4
TznwH9xR+j2El4reFymt08Mj/SoD7UXzmxJtcakvwuX9dd6ZGr5zSyNoR1SZ
rWi+Lp3fdqA/snZSF9J6BsTr89ogdCzKQs2tr+eqkKBbKiRfGk9vudPVpPp1
3LSu3tLuP4m1uSHy7rELOpR1oebLfDW3mtX5ud6/a6aT/weWplLF5m4AAA==

-->

</rfc>
