<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.19 (Ruby 3.0.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-sfluhrer-cfrg-ml-kem-security-considerations-00" category="info" consensus="true" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title abbrev="ML-KEM Security">ML-KEM Security Considerations</title>
    <seriesInfo name="Internet-Draft" value="draft-sfluhrer-cfrg-ml-kem-security-considerations-00"/>
    <author fullname="Scott Fluhrer">
      <organization>Cisco Systems</organization>
      <address>
        <email>sfluhrer@cisco.com</email>
      </address>
    </author>
    <author fullname="Quynh Dang">
      <organization abbrev="NIST">National Institute of Standards and Technology</organization>
      <address>
        <email>Quynh.Dang@nist.gov</email>
      </address>
    </author>
    <author initials="J." surname="Preuß Mattsson" fullname="John Preuß Mattsson">
      <organization>Ericsson</organization>
      <address>
        <email>john.mattsson@ericsson.com</email>
      </address>
    </author>
    <date year="2024" month="October"/>
    <area>IRTF</area>
    <workgroup>Crypto Forum</workgroup>
    <abstract>
      <?line 65?>

<t>NIST standardized ML-KEM as FIPS 203 in August 2024.  This document discusses how to use ML-KEM - that is, what problem it solves, and how to use it securely.</t>
    </abstract>
  </front>
  <middle>
    <?line 69?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>A large reliable quantum computer (often termed a Cryptographically Relevant Quantum Computer or CRQC) would be able to break protocols which rely on the traditional RSA, DH, or ECDH methods of securely exchanging keys.  Even though we do not believe, at the time of this writing, there exists a CRQC, there still remains the possibility that an adversary may record the protocol exchange, and then later (when they have access to a CRQC) go ahead and read the traffic.</t>
      <t>Because of this potential threat, NIST has standardized ML-KEM (Module-Lattice-Based Key-Encapsulation Mechanism), which is standardized in FIPS 203 <xref target="FIPS203"/>.  ML-KEM is used to generate a shared secret key between two parties. One party (Alice) generates a public/private keypair, and sends the public key to the other party (Bob).  Bob uses the public key and some randomness to generate both the shared secret key and a ciphertext. Bob then sends the ciphertext to Alice, who uses her private key to generate the same shared secret key. NIST plans to standardize one or more code-based KEMs in the future.</t>
      <t>The fundamental security property is that someone listening to the exchanges (and thus obtains both the public key and the ciphertext) cannot reconstruct the shared secret key and this is true even if the adversary has access to a CRQC. ML-KEM is IND-CCA2 secure, that is, it remains secure even if an adversary is able to submit arbitrary ciphertexts and observe the resulting shared key. Submitting invalid ciphertexts to a ML-KEM.Decaps does not help the attacker obtain information about the decryption key of the PKE-Decrypt function inside the ML-KEM.Decaps. Substituting the public key Alice sends Bob by another public key chosen by the attacker will not help the attacker get any information about Alice's private key, it would just make Alice and Bob not have a same shared secret key. For practical purposes, IND-CCA2 means that ML-KEM is secure to use with static public keys.</t>
      <t>ML-KEM is what is termed a Key Encapsulation Mechanism. One common misunderstanding of that term is the expectation that Bob freely chooses the shared secret, and encrypts that when sending to Alice. What happens in ML-KEM is that randomness from both sides are used to contribute to the shared secret. That is, ML-KEM internally generates the shared secret in a way that Bob cannot select the value. Now, Bob can generate a number of ciphertext/shared secret pairs, and select the shared secret that he prefers, but he cannot freely choose it or make secrets shared with two parties be equal. This is different from RSA-KEM <xref target="RFC5990"/>, where Bob cannot select the value, but can encapsulate the same shared secret to many recipients.</t>
      <t>A KEM (such as ML-KEM) sounds like it may be a drop-in replacement for Diffie-Hellman, however this is not the case. In Diffie-Hellman, the parties exchange two public keys, whereas in a KEM, the ciphertext is necessarily a function of Alice's public key, and thus can only be useful only with that specific public key. As long a the application can handle larger public keys and ciphertexts, a KEM is a drop-in replacement for 'ephemeral-ephemeral' key exchange in protocols like TLS <xref target="RFC8446"/> and SSH <xref target="RFC4253"/> as well as 'static-ephemeral' key exchange in protocols like ECIES/HPKE <xref target="RFC9180"/>. A KEM is not a drop-in replacement in applications such as the Diffie-Hellman ratchet in Signal <xref target="SIGNAL"/>, implicit 'ephemeral-static' DH authentication in Noise <xref target="NOISE"/>, Wireguard <xref target="WIRE"/>, and EDHOC <xref target="RFC9528"/>, and 'static-static' configurations in CMS <xref target="RFC6278"/> and Group OSCORE <xref target="I-D.ietf-core-oscore-groupcomm"/>, where both sides have long-term public keys. Furthermore ML-KEM is not a drop-in replacement for RSA-KEM as RSA-KEM can encapsulate the same shared secret to many recipients whereas ML-KEM cannot.</t>
    </section>
    <section anchor="using-ml-kem">
      <name>Using ML-KEM</name>
      <t>To use ML-KEM, there are three steps involved</t>
      <section anchor="ml-kem-key-generation">
        <name>ML-KEM Key Generation</name>
        <t>The first step for Alice is to generate a public and private keypair.</t>
        <t>In FIPS 203, this function is termed ML-KEM.KeyGen() (see section 7.1 of <xref target="FIPS203"/>).  It internally calls the random number generator for a seed and produces both a public key (termed an encapsulation key in FIPS 203) and a private key (termed a decapsulation key).</t>
        <t>The public key can be freely published (and Bob will need it for his part of the process); this step may be performed simply by transmitting the key to Bob.  However, the private key must be kept secret.</t>
      </section>
      <section anchor="ml-kem-encapsulation">
        <name>ML-KEM Encapsulation</name>
        <t>The second step is for Bob to generate a ciphertext and a shared secret key.</t>
        <t>To perform this step, Bob would first run the Encapsulation Key Check on Alice's public key as outlined at the beginning of section 7.2 of <xref target="FIPS203"/>.
If that test passes, then Bob would perform the what FIPS 203 terms as ML-KEM.Encaps() (see section 7.2 of <xref target="FIPS203"/>).  This step takes the validated public key, internally calls the random number generator for a seed, and produces both a ciphertext and a 32-byte shared secret key.</t>
        <t>The ciphertext can be transmitted back to Alice; if the exchange is successful, the 32-byte shared secret key will be the key shared with Alice.</t>
        <t>It may be that some libraries combine the validation and the encapsulation step; you should check whether the library you are using does. For static public keys, the Encapsulation Key Check only needs to be performed once.</t>
      </section>
      <section anchor="ml-kem-decapsulation">
        <name>ML-KEM Decapsulation</name>
        <t>The third and final step is for Alice to take the ciphertext and generate the shared secret key.</t>
        <t>To perform this step, Alice would first run the Decapsulation Key Check on Bob's ciphertext as outlined at the beginning of section 7.3 of <xref target="FIPS203"/>.
If that test passes, then Bob would perform the what FIPS 203 terms as ML-KEM.Decaps() (see section 7.3 of <xref target="FIPS203"/>).  This step takes the ciphertext from Bob and the private key that was previously generated by Alice, and produces a 32-byte shared secret key.</t>
        <t>If the exchange is successful, the 32-byte key generated on both sides will be the same.</t>
        <t>It may be that some libraries combine the validation and the decapsulation step; you should check whether the library you are using does.</t>
      </section>
      <section anchor="ml-kem-parameter-sets">
        <name>ML-KEM Parameter Sets</name>
        <t>ML-KEM comes with three parameter sets; ML-KEM-512, ML-KEM-768 and ML-KEM-1024.  It is assumed that Alice and Bob both know which parameter sets they use (either by negotiation or by having one selection fixed in the protocol).</t>
        <t><xref target="par-sets"/> shows a summary of how those parameter sets differ:</t>
        <table anchor="par-sets">
          <name>pk = public key, sk = private key, ct = ciphertext, ss = shared key, all lengths in bytes</name>
          <thead>
            <tr>
              <th align="left"> </th>
              <th align="right">pk size</th>
              <th align="right">sk size</th>
              <th align="right">ct size</th>
              <th align="center">ss size</th>
              <th align="center">as strong as</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">ML-KEM-512</td>
              <td align="right">800</td>
              <td align="right">1632</td>
              <td align="right">768</td>
              <td align="center">32</td>
              <td align="center">AES-128</td>
            </tr>
            <tr>
              <td align="left">ML-KEM-768</td>
              <td align="right">1184</td>
              <td align="right">2400</td>
              <td align="right">1088</td>
              <td align="center">32</td>
              <td align="center">AES-192</td>
            </tr>
            <tr>
              <td align="left">ML-KEM-1024</td>
              <td align="right">1568</td>
              <td align="right">3168</td>
              <td align="right">1568</td>
              <td align="center">32</td>
              <td align="center">AES-256</td>
            </tr>
          </tbody>
        </table>
        <t><xref target="par-perf"/> shows an example of ML-KEM performance <xref target="EBACS"/>:</t>
        <table anchor="par-perf">
          <name>Single-core performance in operation per second on AMD Ryzen 7 7700</name>
          <thead>
            <tr>
              <th align="left"> </th>
              <th align="right">key generation</th>
              <th align="right">encapsulation</th>
              <th align="right">decapsulation</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">ML-KEM-512</td>
              <td align="right">244000</td>
              <td align="right">153000</td>
              <td align="right">202000</td>
            </tr>
            <tr>
              <td align="left">ML-KEM-768</td>
              <td align="right">142000</td>
              <td align="right">103000</td>
              <td align="right">134000</td>
            </tr>
            <tr>
              <td align="left">ML-KEM-1024</td>
              <td align="right">109000</td>
              <td align="right">77000</td>
              <td align="right">99000</td>
            </tr>
          </tbody>
        </table>
        <t>As can be seen from <xref target="par-sets"/> and <xref target="par-sets"/>, ML-KEM has significantly larger public keys and ciphertexts than ECDH but very good performance.</t>
      </section>
    </section>
    <section anchor="kem-security-considerations">
      <name>KEM Security Considerations</name>
      <t>This section pertains to KEM (Key Encapsulation Mechanisms) in general, including ML-KEM</t>
      <t>To use a KEM, you need to use a high-quality source of entropy during both the key-pair generation and ciphertext generation steps.  If an adversary can recover the random bits used in either of these processes, they can recover the shared secret.  If an adversary can recover the random bits used during key generation, they can recover the secret key.</t>
      <t>Alice needs to keep her private key secret. It is recommended that she zeroize her private key when she will have no further need of it.</t>
      <t>A KEM (including ML-KEM) provides no authentication of either communicating party. If an adversary could replace either the public key or the ciphertext with its own, it would generate a shared key with Alice or Bob.  Hence, it is important that the protocol that uses a KEM lets Bob be able to verify that the public key he obtains came from Alice and that the ciphertext that Alice receives came from Bob (that is, an entity that Alice is willing to communicate with).  Such verification can be performed by cryptographic methods such as digital signatures or a MAC to verify integrity of the protocol exchange transcript.</t>
    </section>
    <section anchor="ml-kem-security-considerations">
      <name>ML-KEM Security Considerations</name>
      <t>This section pertains specifically to ML-KEM, and may not be true of KEMs in general.</t>
      <t>To use ML-KEM, you need a source of random bits with security strength equal to greater than the security strength of the KEM during both key generation and encapsulation steps.  The cryptographic library that implements ML-KEM may access this source of randomness internally.</t>
      <t>Alice must keep her private key secret (both private and secure from modification).  It is recommended that she zeroizes her private key when she will have no further need of it.</t>
      <t>If the ciphertext that Alice receives from Bob is tampered with (either by small modification or by replacing it with an entirely different ciphertext), the shared secret key that Alice derives will be uncorrelated with the shared secret key that Bob obtains.  An attacker will not be able to determine any information about the correct shared secret key or Alice's private key, even if the attacker obtains Alice's modified shared secret key which is the output of the ML-KEM.Decaps function taking the modified ciphertext as input.</t>
      <t>It is secure to reuse a public key multiple times.  That is, instead of Alice generating a fresh public and private keypair for each exchange, Alice may generate a public key once, and then publish that public key, and use it for multiple incoming ciphertexts, generating multiple shared secret keys.  While this is safe, it is recommended that if the protocol allows it (if Alice and Bob exchange messages anyways) that Alice generates a fresh keypair each time (and zeroize the private key immediately after) to obtain Perfect Forward Secrecy. Be noted that generally key generation of ML-KEM is very fast, see <xref target="par-perf"/>. That is, if Alice's system is subverted (either by a hacker or a legal warrant), the previous communications remain secure (because Alice no longer has the information needed to recover the shared secret keys).</t>
      <t>Alice and Bob must perform the Key Check steps (the Encapsulation Key Check on the public key for Bob, the Decapsulation Key Check on the ciphertext for Alice).  The cryptographical libraries that Alice and Bob use may automatically perform such checks; if so, that should be verified.</t>
      <t>The shared secret key for all three parameter sets, ML-KEM-512, ML-KEM-768 and ML-KEM-1024 are 32 bytes which are indistinguishable from 32-byte pseudorandom byte-strings of 128, 192 and 256 bits of strengths respectively. As such, it is suitable both to use directly as a symmetric key (for use by a symmetric cipher such as AES or a MAC), and for inserting into a Key Derivation Function.  This is in contrast to a Diffie-Hellman (or ECDH) operation, where the output is distinguishable from random.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="FIPS203" target="https://doi.org/10.6028/NIST.FIPS.203">
          <front>
            <title>Module-Lattice-Based Key-Encapsulation Mechanism Standard</title>
            <author>
              <organization/>
            </author>
            <date year="2024" month="August"/>
          </front>
          <seriesInfo name="NIST" value="FIPS 203"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC4253">
          <front>
            <title>The Secure Shell (SSH) Transport Layer Protocol</title>
            <author fullname="T. Ylonen" initials="T." surname="Ylonen"/>
            <author fullname="C. Lonvick" initials="C." role="editor" surname="Lonvick"/>
            <date month="January" year="2006"/>
            <abstract>
              <t>The Secure Shell (SSH) is a protocol for secure remote login and other secure network services over an insecure network.</t>
              <t>This document describes the SSH transport layer protocol, which typically runs on top of TCP/IP. The protocol can be used as a basis for a number of secure network services. It provides strong encryption, server authentication, and integrity protection. It may also provide compression.</t>
              <t>Key exchange method, public key algorithm, symmetric encryption algorithm, message authentication algorithm, and hash algorithm are all negotiated.</t>
              <t>This document also describes the Diffie-Hellman key exchange method and the minimal set of algorithms that are needed to implement the SSH transport layer protocol. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4253"/>
          <seriesInfo name="DOI" value="10.17487/RFC4253"/>
        </reference>
        <reference anchor="RFC5990">
          <front>
            <title>Use of the RSA-KEM Key Transport Algorithm in the Cryptographic Message Syntax (CMS)</title>
            <author fullname="J. Randall" initials="J." surname="Randall"/>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski"/>
            <author fullname="J. Brainard" initials="J." surname="Brainard"/>
            <author fullname="S. Turner" initials="S." surname="Turner"/>
            <date month="September" year="2010"/>
            <abstract>
              <t>The RSA-KEM Key Transport Algorithm is a one-pass (store-and-forward) mechanism for transporting keying data to a recipient using the recipient's RSA public key. ("KEM" stands for "key encapsulation mechanism".) This document specifies the conventions for using the RSA-KEM Key Transport Algorithm with the Cryptographic Message Syntax (CMS). The ASN.1 syntax is aligned with an expected forthcoming change to American National Standard (ANS) X9.44.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5990"/>
          <seriesInfo name="DOI" value="10.17487/RFC5990"/>
        </reference>
        <reference anchor="RFC6278">
          <front>
            <title>Use of Static-Static Elliptic Curve Diffie-Hellman Key Agreement in Cryptographic Message Syntax</title>
            <author fullname="J. Herzog" initials="J." surname="Herzog"/>
            <author fullname="R. Khazan" initials="R." surname="Khazan"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>This document describes how to use the 'static-static Elliptic Curve Diffie-Hellman key-agreement scheme (i.e., Elliptic Curve Diffie- Hellman where both participants use static Diffie-Hellman values) with the Cryptographic Message Syntax. In this form of key agreement, the Diffie-Hellman values of both the sender and receiver are long-term values contained in certificates. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6278"/>
          <seriesInfo name="DOI" value="10.17487/RFC6278"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC9180">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan"/>
            <author fullname="B. Lipp" initials="B." surname="Lipp"/>
            <author fullname="C. Wood" initials="C." surname="Wood"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9180"/>
          <seriesInfo name="DOI" value="10.17487/RFC9180"/>
        </reference>
        <reference anchor="RFC9528">
          <front>
            <title>Ephemeral Diffie-Hellman Over COSE (EDHOC)</title>
            <author fullname="G. Selander" initials="G." surname="Selander"/>
            <author fullname="J. Preuß Mattsson" initials="J." surname="Preuß Mattsson"/>
            <author fullname="F. Palombini" initials="F." surname="Palombini"/>
            <date month="March" year="2024"/>
            <abstract>
              <t>This document specifies Ephemeral Diffie-Hellman Over COSE (EDHOC), a very compact and lightweight authenticated Diffie-Hellman key exchange with ephemeral keys. EDHOC provides mutual authentication, forward secrecy, and identity protection. EDHOC is intended for usage in constrained scenarios, and a main use case is to establish an Object Security for Constrained RESTful Environments (OSCORE) security context. By reusing CBOR Object Signing and Encryption (COSE) for cryptography, Concise Binary Object Representation (CBOR) for encoding, and Constrained Application Protocol (CoAP) for transport, the additional code size can be kept very low.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9528"/>
          <seriesInfo name="DOI" value="10.17487/RFC9528"/>
        </reference>
        <reference anchor="I-D.ietf-core-oscore-groupcomm">
          <front>
            <title>Group Object Security for Constrained RESTful Environments (Group OSCORE)</title>
            <author fullname="Marco Tiloca" initials="M." surname="Tiloca">
              <organization>RISE AB</organization>
            </author>
            <author fullname="Göran Selander" initials="G." surname="Selander">
              <organization>Ericsson AB</organization>
            </author>
            <author fullname="Francesca Palombini" initials="F." surname="Palombini">
              <organization>Ericsson AB</organization>
            </author>
            <author fullname="John Preuß Mattsson" initials="J. P." surname="Mattsson">
              <organization>Ericsson AB</organization>
            </author>
            <author fullname="Rikard Höglund" initials="R." surname="Höglund">
              <organization>RISE AB</organization>
            </author>
            <date day="26" month="September" year="2024"/>
            <abstract>
              <t>   This document defines the security protocol Group Object Security for
   Constrained RESTful Environments (Group OSCORE), providing end-to-end
   security of CoAP messages exchanged between members of a group, e.g.,
   sent over IP multicast.  In particular, the described protocol
   defines how OSCORE is used in a group communication setting to
   provide source authentication for CoAP group requests, sent by a
   client to multiple servers, and for protection of the corresponding
   CoAP responses.  Group OSCORE also defines a pairwise mode where each
   member of the group can efficiently derive a symmetric pairwise key
   with any other member of the group for pairwise OSCORE communication.
   Group OSCORE can be used between endpoints communicating with CoAP or
   CoAP-mappable HTTP.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-oscore-groupcomm-23"/>
        </reference>
        <reference anchor="SIGNAL" target="https://signal.org/docs/specifications/doubleratchet/">
          <front>
            <title>The Double Ratchet Algorithm</title>
            <author>
              <organization/>
            </author>
            <date year="2011" month="November"/>
          </front>
        </reference>
        <reference anchor="WIRE" target="https://www.wireguard.com/">
          <front>
            <title>WireGuard</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="NOISE" target="http://www.noiseprotocol.org/">
          <front>
            <title>Noise Protocol Framework</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="EBACS" target="https://bench.cr.yp.to/results-kem/amd64-hertz.html">
          <front>
            <title>eBACS: ECRYPT Benchmarking of Cryptographic Systems</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 171?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
    </section>
  </back>
  <!-- ##markdown-source:
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
s9GydmVdHzTSpi8WOr5lO2Y7Q9EzgZ9Tk1NlLolO9dzkuYeSrQmON0xwNLhu
kKYl/LECjKXubXlrGdcO4zZdBNqJbUHByPG9bfqb6x6EnptItgI8sgGxGDZD
k14C/jc95HCni2xp6/F4OF1XuwoHZwOdCd7SG/vD8CmqmgZEvwwFbJsLJWPR
uIEWnEk+uJ7zk6luTLqLFB1IRyBqkFZTzCPHTlGvEhYhKUxhBl1ZSn3lK/V+
IKDsX6p1UWMh0XMsNoYQLVUeJzjKaxnkUD5NijWrq6q2C6LDH9gvdMhIIMG3
595FLvtr3fFSb7kjPKd0gW9mmN+7fumiOmsOgu0NzMcp/WbMX3ZRR3eXk/YY
7DspfAcu2mXgL7vo4/9nF3Vcb7vo5roPuWhnU1KVkIdgX732l5SaEct5fWeK
2nYKvIRR3PfPej76fW+8/uvORQ7a1bDBDkDquhlRy3/qVf0c+Z95VdcBPkY8
b2EPeoK6sWk0gBvZhNQcBEPLZpzFuJd++vDpyTgU2cPnz06FXf/zxJ16XEsx
BIOq6YCy835vRYR2mxcr31Dur+Sa4oRp+9rI5qZ07nlRGSeKQt4Aj4qR59rX
pvw0M3+6hnS3CU9s8fUrFhmSPAAxJLiiUYDBjAKDhcrBCptOm8y4YvlsMPim
un/f1PIWev+i+Wj94zeFCrl5aZtH6cCXUqtZ9Q2UzobNHz77p7Pm8az/8mzr
0f8EpVYpXEj+To+P3ePJs8fj8JKaCjto355fTYYn49MuJQ70n09OTp+4x/GT
QFOdHJ8+SOnFuEuJ1hAmPQ3LPz5pGGlfblEaP30GSl/P1C9Ba+4w79UepP6q
l8StvOi29qCDV51wgiH2v/KpXb585f61jVVECbhsqvN5tZDKiT5u9+6DuTD6
teYCwPtnBKwoJy7eaXx8jJBkEOTk7PL+foexdOIGzfTbRsr8tuHsP20jOyxh
/ARKE62dPH3sn3guKY879H3yZBzGHzfjTx4/2RjfaPXk+EUY9fx5eFIv3MtG
dxRQ0N0E/ppqKTl7goPgeZbgtr4UxxN4TFT67lLdrL8gJz2XVaibcxsAk+Vh
kWSLnnszzHRfND1BOQpDCS+n63mFzPHj9gjjV+4OJNnwQgUATRZF0t2BFJrf
u24zcBnPBymem7hjxcK1wL7Tz7UHFI8znZSQNU7rZEdF63tSDP1SEVXh9cLM
F0P2/8iWLeoyFvvVPCFerlUCfkGtOYeBCIasTbvW2pdI94vUy4z4G6cf1A/P
au58ZvKgemoqfxKIPfnY7ko12xRrHoRs09jo9/78mn6rfVd8aLEuPnDJq4GX
txrAZfNULrDlch9JZZnOk5D/ULiqL7osmBA2p7q+OQEWAYS0WfJCzVxLxWkT
QjJV2zLdtIIDCu9OQAhmbrScqGwnavJU5/IeU+Xsc7QtRgEXvlkTZm6c4RTl
JmQT2EBJF6u8c7iyfdrr6pFQeChX+LK6RkDUMpNd22xZwEVy3xTvHajLGzkY
dW3LlMlBQEV78QB7MbN1Z3LLOo9+/dljzM6SRI8WnTRTumeyLYCBXrW50925
XHq/OR2UrkjVXBFoWkJUrT8WabXgTn8IiCfsPgrX3RZur44B4ol7N1XC9YjQ
uUzM3MgJLXuUPL21SkrWd+cXHZmw5p1LiGp7JP2bCq4MjUuzdA20H9wkfCC0
NZeYWF1j+dBxo5AJid0lDXdEC07C2bMPdKOtTl0T2KJOEOu6uDtIC0wCbklW
d0cf0ljhlQgx5SgPLr4x1kuEu+2GxY3c7Q++NqC5lbJGb+goIHJnH8QOmbQr
vUwpiHAKLVLc2JmcirVdiiYUScfpO2FI7Qvj4YM7dpJTRzHZrEgaQzto8Pr3
Ytb2LYSfCFq+vPqBRzXOxL4nYJZuWhSdKsBmBGxd/n0x4OKVnI/7YOQ9UW4N
tQdenTsFhw/cIOgwBysX3kJlV+fALqAoxZ+vlB4kwb34UAMZn+c7TrE7ISth
xZGxGtx9iC0S5OKsMLYWDH2KzVPu3uWH/vm/bWY4cZLgduco3PeRKzN1tayb
3mr/ukHTtUZBH7qnDd1+v8LkoOJq495peKkdYOkE64xXIQi4eX3LeVi4hZHD
6aKkOVprHFTOw2YIfovvNN6lsaMjbK29nuU9K1rv6N2LiPO4e4nLt6OdqjdP
9fz1PK7SbAE5u8jIXu/orcN2M3JLDdz554VJdXOmaaNZkyy3/NZsBHa4DOsX
jN43s41KvAn6GQ8ueUcH5reK1oCdHT/oXrhysg2CFCHK5TrpygeIs9m0MWAw
QfVOZ4xmsPQDatxfRPmIHEezflOUK56CTbjxGNDkNWNKFbblUwMobATkthqD
NASfzyLLsk9r1a3jOncETHsia+XCp+v5TO+omKQbcQCgvdcwl6Z6jmwCLhGf
QwQJfaguvOJBnLslFAx8f+pv63kwWchRGugu/KFj1+UZPh2GfxAAi10cNBkh
6FMyQ7dp17YP3dnW/g+OATbgkj+ZOPxRY3KzgxcC0sGutAgRtk2wHe0hiklS
Y10VlIgDEWFXgnek+WWlL26Lw5CvwgVUh6R04jvt23FNmvlpurPRdfgXG13S
Yns8dj0DHyn5yuSJsfToGvFBwrukttBBXFpdJ0VALngzBP7AaLnnejI+PVRs
o3AtNkEE2rCP6zEKzYrQirfXU3cHgPIIscDWgIBc0tVzDkIlhlkjlfMcoKc1
fBEr+tM8SoKDxNTbb06XDbY8v5o0YPLAxThORBSGwt2tNLmDRpu41OL4NJE3
PiuElq8RjCdXeeCh7traxmH7vr/9e9C2BMJZdCcHySWWHUJ2YhXYen3+/nw3
Vm3uY9P14IgyMhJGrb9JzdMXEjmP2aVMdTIX3Db4eubOhXTyam8WpVbv3Q/+
BVFIKUF1MwAA

-->

</rfc>
