<?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.21 (Ruby 3.1.1) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-dijkhuis-cfrg-hdkeys-06" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.25.0 -->
  <front>
    <title abbrev="HDK">Hierarchical Deterministic Keys</title>
    <seriesInfo name="Internet-Draft" value="draft-dijkhuis-cfrg-hdkeys-06"/>
    <author initials="S. Q." surname="Dijkhuis" fullname="Sander Dijkhuis" role="editor">
      <organization>Cleverbase</organization>
      <address>
        <email>mail@sanderdijkhuis.nl</email>
      </address>
    </author>
    <date year="2025" month="January" day="20"/>
    <area>IRTF</area>
    <workgroup>Crypto Forum</workgroup>
    <keyword>KDF</keyword>
    <abstract>
      <?line 114?>

<t>Hierarchical Deterministic Keys enables managing large sets of keys bound to a secure cryptographic device that protects a single key. This enables the development of secure digital identity wallets providing many one-time-use public keys. Some instantiations can be implemented in such a way that the secure cryptographic device does not need to support key blinding, enabling the use of devices that already are widely deployed.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-dijkhuis-cfrg-hdkeys/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/sander/hierarchical-deterministic-keys"/>.</t>
    </note>
  </front>
  <middle>
    <?line 118?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies the algorithms to apply Hierarchical Deterministic Keys (HDKeys). The purpose of an HDK architecture is to manage large sets of keys bound to a secure cryptographic device that protects a single key. This enables the development of secure digital identity wallets providing many one-time-use public keys.</t>
      <t>The core idea has been introduced in <xref target="BIP32"/> to create multiple cryptocurrency addresses in a manageable way. The present document extends the idea towards devices commonly used for digital wallets, and towards common interaction patterns for document issuance and authentication.</t>
      <t>To store many HDKeys, only a seed string needs to be stored confidentially, associated with a device private key. Each HDK is then deterministically defined by a path of indices, optionally alternated by key handles provided by another party. Such a path can efficiently be stored and requires less confidentiality than the seed.</t>
      <t>To prove possession of many HDKeys, the secure cryptographic device only needs to perform common cryptographic operations on a single private key. The HDK acts as a blinding factor that enables blinding the device public key. In several instantiations, such as those <xref target="using-ecdh-shared-secrets">using ECDH shared secrets</xref> and those <xref target="using-ec-sdsa-signatures">using EC-SDSA signatures</xref>, the secure cryptographic device does not need to support key blinding natively, and the application can pre-process the input or post-process the output from the device to compute the blinded device authentication data. This enables the application of HDK on devices that are already deployed without native support for HDK.</t>
      <t>This document provides a specification of the generic HDK function, generic HDK instantiations, and fully specified concrete HDK instantiations.</t>
      <t>An HDK instantiation is expected to be applied in a solution deployed as (wallet) units. One unit can have multiple HDK instantiations, for example to manage multiple identities or multiple cryptographic algorithms or key protection mechanisms.</t>
      <t>This document represents the consensus of the authors, based on working group input and feedback. It is not a standard. It does not include security or privacy proofs.</t>
      <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>The following notation is used throughout the document.</t>
        <ul spacing="normal">
          <li>
            <t>byte: A sequence of eight bits.</t>
          </li>
          <li>
            <t><tt>I2OSP(n, w)</tt>: Convert non-negative integer <tt>n</tt> to a <tt>w</tt>-length, big-endian byte string, as described in <xref target="RFC8017"/>.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="the-hierarchical-deterministic-key-function">
      <name>The Hierarchical Deterministic Key function</name>
      <t>An HDK instantiation enables local key derivation to create many key pairs from a single seed value. It enables remote parties to generate key handles from which both parties can derive more key pairs asynchronously. Additionally, an HDK instantiation enables securely proving possession of the private keys, such as required in <xref target="RFC7800"/>, either in a centralised or in a distributed manner.</t>
      <t>Solutions <bcp14>MAY</bcp14> omit application of the remote functionality. In this case, a unit can only derive keys locally.</t>
      <section anchor="introductory-examples">
        <name>Introductory examples</name>
        <section anchor="local-deterministic-key-derivation">
          <name>Local deterministic key derivation</name>
          <t>The following example illustrates the use of local key derivation. An HDK tree is associated with a device key pair and initiated using confidential static data: a <tt>seed</tt> value, which is a byte array containing sufficient entropy. Now tree nodes are constructed as follows.</t>
          <artwork><![CDATA[
                          +----+ +--+
Confidential static data: |seed| |pk|
                          +-+--+ +--+
                            v
                          +----+ +----+
Level 0 HDKeys:           |hdk0| |hdk1|
                          +-+--+ +----+
                            v
                          +-----+ +-----+ +-----+
Level 1 HDKeys:           |hdk00| |hdk01| |hdk02|
                          +-----+ ++---++ +-----+
                                   v   v
                             +------+ +------+
Level 2 HDKeys at hdk01:     |hdk000| |hdk001| ...
                             +------+ +------+
]]></artwork>
          <t>The unit computes a Level 0 HDK at the root node using a deterministic function, taking the device public key <tt>pk</tt> and the <tt>seed</tt> as input: <tt>(pk0, salt0, bf0) = hdk0 = HDK(0, pk, seed)</tt>. The HDK consists of a first blinded public key <tt>pk0</tt>, a first byte string <tt>salt0</tt> to derive next-level keys, and a first blinding factor <tt>bf0</tt>. Using <tt>bf0</tt> and the device key pair, the unit can compute blinded private keys and proofs of possession.</t>
          <t>The unit computes any Level <tt>n &gt; 0</tt> HDK from any other HDK <tt>(pk, salt, bf)</tt> using the same deterministic function: <tt>(pk', salt', bf') = hdk' = HDK(index, pk, salt, bf)</tt>. The function takes as input the <tt>index</tt> starting at 0, an the previous-level HDK. The function returns a new HDK as output, which can be used in the same way as the root HDK.</t>
        </section>
        <section anchor="remote-deterministic-key-derivation">
          <name>Remote deterministic key derivation</name>
          <t>Instead of local derivation, an HDK salt can also be derived using a key handle that is generated remotely. Using the derived salt, the local and remote parties can derive the same new HDKeys. The remote party can use these to derive public keys. The local party can use these to derive associated private keys for proof of possession.</t>
          <t>This approach is similar to Asynchronous Remote Key Generation (ARKG) <xref target="I-D.draft-bradleylundberg-cfrg-arkg-02"/> when considered at a single level. However, ARKG does not enable distributed proof of possession with deterministic hierarchies. Such hierarchies can be used for example to enable remote parties to derive keys from previously derived keys. Secure cryptographic devices that support ARKG may therefore not support all features of HDK.</t>
          <t>To enable remote derivation of child HDKeys, the unit uses the parent HDK to derive the parent public key and a second public key for key encapsulation. The issuer returns a key handle, using which both parties can derive a sequence of child HDKeys. Key encapsulation prevents other parties from discovering a link between the public keys of the parent and the children, even if the other party knows the parent HDK or can eavesdrop communications.</t>
          <t>Locally derived parents can have remotely derived children. Remotely derived parents can have locally derived children.</t>
        </section>
        <section anchor="blinded-proof-of-possession">
          <name>Blinded proof of possession</name>
          <t>The next concept to illustrate is blinded proof of possession. This enables a unit to prove possession of a (device) private key without disclosing the directly associated public key. This way, solutions can avoid linkability across readers of a digital document that is released with proof of possession.</t>
          <t>In this example, a document is issued with binding to a public key <tt>pk'</tt>, which is a blinding public key <tt>pk</tt> blinded with the blinding factor <tt>bf</tt> in some HDK <tt>hdk = (pk', salt, bf)</tt>. The unit can present the document with a proof of possession of the corresponding blinded private key, which is the blinding private key <tt>sk</tt> blinded with <tt>bf</tt>. The unit applies some authentication function <tt>device_data = authenticate(sk, reader_data, bf)</tt> to the blinding private key, reader-provided data and the blinding factor. The unit can subsequently use the output <tt>device_data</tt> to prove possession to the reader using common algorithms.</t>
          <artwork><![CDATA[
+------------------+ +--------+
|       +--+ +---+ | |        |
| Unit  |sk| |hdk| | | Reader |
|       +--+ +---+ | |        |
+---+--------------+ +----+---+
    |                     |
    |                     |
    |  1. Request and     |
    |     reader_data     |
    | <------------------ |
    |                     |
+---+-------------+       |
| 2. authenticate |       |
+---+-------------+       |
    |                     |
    |  3. Proof with      |
    |     device_data     |
    | ------------------> |
    |                     |
    |    +-----------+    |
    |    | Document  |    |
    |    |           |    |
    |    | +---+     |    |
    |    | |pk'|     |    |
    |    | +---+     |    |
    |    |           |    |
         +-----------+
]]></artwork>
          <t>The reader does not need to be aware that an HDK function or key blinding was used, since for common algorithms, the blinded public key and the proof are indistinguishable from non-blinded keys and proofs.</t>
          <t>When applied on HDK level <tt>n</tt>, the blinding private key <tt>sk</tt> is the device private key blinded with a combination of <tt>n</tt> blinding factors. These can either be combined within the secure cryptographic device, by subsequent computation of the blinded private key starting with the device private key, or outside of the secure cryptographic device, by combining the blinding factors outside of the secure cryptographic device.</t>
          <t>Blinding methods can be constructed such that the secure cryptographic device does not need to be designed for key blinding. In such cases, the computation of <tt>device_data</tt> is distributed between two parties: the secure cryptographic device using common cryptographic operations, and the unit component invoking these operations. Some blinded proof of possession algorithms can only be centralised.</t>
        </section>
      </section>
      <section anchor="instantiation-parameters">
        <name>Instantiation parameters</name>
        <t>The parameters of an HDK instantiation are:</t>
        <ul spacing="normal">
          <li>
            <t><tt>Ns</tt>: The amount of bytes of a salt value with sufficient entropy.</t>
          </li>
          <li>
            <t><tt>H</tt>: A cryptographic hash function.
            </t>
            <ul spacing="normal">
              <li>
                <t>H(msg): Outputs <tt>Ns</tt> bytes.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>BL</tt>: A key blinding scheme <xref target="Wilson2023"/> with opaque blinding factors and algebraic properties, consisting of the functions:
            </t>
            <ul spacing="normal">
              <li>
                <t>DeriveBlindKey(ikm): Outputs a blind key <tt>bk</tt> based on input keying material <tt>ikm</tt>.</t>
              </li>
              <li>
                <t>DeriveBlindingFactor(bk, ctx): Outputs a blinding factor <tt>bf</tt> based on a blind key <tt>bk</tt> and an application context byte string <tt>ctx</tt>.</t>
              </li>
              <li>
                <t>BlindPublicKey(pk, bk, ctx): Outputs the result public key <tt>pk'</tt> of blinding public key <tt>pk</tt> with blind key <tt>bk</tt> and application context byte string <tt>ctx</tt>.</t>
              </li>
              <li>
                <t>BlindPrivateKey(sk, bf): Outputs the result private key <tt>sk'</tt> of blinding private key <tt>sk</tt> with blinding factor <tt>bf</tt>. This result <tt>sk'</tt> is such that if <tt>bf = DeriveBlindingFactor(bk, ctx)</tt> for some <tt>bk</tt> and <tt>ctx</tt>, <tt>(sk', pk')</tt> forms a key pair for <tt>pk' = BlindPublicKey(pk, bk, ctx)</tt>.</t>
              </li>
              <li>
                <t>Combine(bf1, bf2): Outputs a blinding factor <tt>bf</tt> such that for all key pairs <tt>(sk, pk)</tt>:      </t>
                <artwork><![CDATA[
BlindPrivateKey(sk, bf) ==
    BlindPrivateKey(BlindPrivateKey(sk, bf1), bf2)
]]></artwork>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>KEM</tt>: A key encapsulation mechanism <xref target="RFC9180"/>, consisting of the functions:
            </t>
            <ul spacing="normal">
              <li>
                <t>DeriveKeyPair(ikm): Outputs a key encapsulation key pair <tt>(sk, pk)</tt>.</t>
              </li>
              <li>
                <t>Encap(pk): Outputs <tt>(k, c)</tt> consisting of a shared secret <tt>k</tt> and a ciphertext <tt>c</tt>, taking key encapsulation public key <tt>pk</tt>.</t>
              </li>
              <li>
                <t>Decap(c, sk): Outputs shared secret <tt>k</tt>, taking ciphertext <tt>c</tt> and key encapsulation private key <tt>sk</tt>.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>An HDK instantiation <bcp14>MUST</bcp14> specify the instantiation of each of the above functions and values.</t>
        <t>Note that by design of BL, when a document is issued using HDK, the reader does not need to know that HDK was applied: the public key will look like any other public key used for proofs of possession.</t>
        <t>An HDK implementation <bcp14>MAY</bcp14> leave BlindPrivateKey implicit in cases where the blinding method is constructed in a distributed way. In those cases, the secure cryptographic device holding the private key does not need to support key blinding, and the value of the blinded private key is never available during computation.</t>
      </section>
      <section anchor="the-hdk-context">
        <name>The HDK context</name>
        <t>A local unit or remote party creates an HDK context from an index.</t>
        <artwork><![CDATA[
Inputs:
- index, an integer between 0 and 2^32-1 (inclusive).

Outputs:
- ctx, an application context byte string.

def CreateContext(index):
    ctx = ID || I2OSP(index, 4)
    return ctx
]]></artwork>
        <t>This context byte string is used as input for DeriveBlindingFactor, BlindPublicKey, and <xref target="the-hdk-salt">DeriveSalt</xref>.</t>
      </section>
      <section anchor="the-hdk-salt">
        <name>The HDK salt</name>
        <t>A local unit or remote party derives a next-level HDK salt from within an HDK context.</t>
        <artwork><![CDATA[
Inputs:
- salt, a string of Ns bytes.
- ctx, an HDK context byte string.

Outputs:
- salt', the next salt for HDK derivation.

def DeriveSalt(salt, ctx):
    salt' = H(salt || ctx)
    return salt'
]]></artwork>
        <t>Salt values are used as input for DeriveBlindKey, DeriveKeyPair, and DeriveSalt.</t>
        <t>Salt values, including the original seed value, <bcp14>MUST NOT</bcp14> be reused outside of HDK.</t>
      </section>
      <section anchor="the-hdk-function">
        <name>The HDK function</name>
        <t>A local unit or a remote party deterministically computes an HDK from an index, a parent public key, a salt, and an optional parent blinding factor. The salt can be an initial seed value of <tt>Ns</tt> bytes or it can be taken from another parent HDK. The secure generation of the seed is out of scope for this specification.</t>
        <artwork><![CDATA[
Inputs:
- index, an integer between 0 and 2^32-1 (inclusive).
- pk, a public key to be blinded.
- salt, a string of Ns bytes.
- bf, a blinding factor to combine with, Nil otherwise.

Outputs:
- pk', the blinded public key at the provided index.
- salt', the salt for HDK derivation at the provided index.
- bf', the blinding factor at the provided index.

def HDK(index, pk, salt, bf = Nil):
    ctx   = CreateContext(index)
    salt' = DeriveSalt(salt, ctx)

    bk  = DeriveBlindKey(salt)
    pk' = BlindPublicKey(bk, ctx)
    bf' = if bf == Nil:
        DeriveBlindingFactor(bk, ctx)
    else:
        Combine(bf, DeriveBlindingFactor(bk, ctx))

    return (pk', salt', bf')
]]></artwork>
        <t>A unit <bcp14>MUST NOT</bcp14> persist a blinded private key. Instead, if persistence is needed, a unit can persist either the blinding factor of each HDK, or a path consisting of the seed salt, indices and key handles. In both cases, the application of Combine in the HDK function enables reconstruction of the blinding factor with respect to the original private key, enabling application of for example BlindPrivateKey.</t>
        <t>If the unit uses the blinded private key directly, the unit <bcp14>MUST</bcp14> use it within the secure cryptographic device protecting the device private key.</t>
        <t>If the unit uses the blinded private key directly, the unit <bcp14>MUST</bcp14> ensure the secure cryptographic device deletes it securely from memory after usage.</t>
        <t>When presenting multiple documents, a reader can require a proof that multiple keys are associated to a single device. Several protocols for a cryptographic proof of association are possible, such as <xref target="Verheul2024"/>. For example, a unit could prove in a zero-knowledge protocol knowledge of the association between two elliptic curve keys <tt>B1 = [bf1]D</tt> and <tt>B2 = [bf2]D</tt>, where <tt>bf1</tt> and <tt>bf2</tt> are multiplicative blinding factors for a common blinding public key <tt>D</tt>. In this protocol, the association is known by the discrete logarithm of <tt>B2 = [bf2/bf1]B1</tt> with respect to generator <tt>B1</tt>. The unit can apply Combine to obtain values to compute this association.</t>
      </section>
      <section anchor="the-local-hdk-procedure">
        <name>The local HDK procedure</name>
        <t>This is a procedure executed locally by a unit.</t>
        <t>To begin, the unit securely generates a <tt>seed</tt> salt of <tt>Ns</tt> bytes and a device key pair:</t>
        <artwork><![CDATA[
seed = random(Ns) # specification of random out of scope
(skD, pkD) = GenerateKeyPair()
]]></artwork>
        <t>The unit <bcp14>MUST</bcp14> generate <tt>skD</tt> within a secure cryptographic device.</t>
        <t>Whenever the unit requires the HDK with some <tt>index</tt> at level 0, the unit computes:</t>
        <artwork><![CDATA[
(pk, salt, bf) = HDK(index, pkD, seed)

sk = BlindPrivateKey(skD, bf) # optional
]]></artwork>
        <t>Now the unit can use the blinded key pair <tt>(sk, pk)</tt> or derive child HDKeys.</t>
        <t>Whenever the unit requires the HDK with some <tt>index</tt> at level <tt>n &gt; 0</tt> based on a parent HDK <tt>hdk = (pk, salt, bf)</tt> with blinded key pair <tt>(sk, pk)</tt> at level <tt>n</tt>, the unit computes:</t>
        <artwork><![CDATA[
(pk', salt', bf') = HDK(index, pk, salt)

sk' = BlindPrivateKey(sk, bf') # optional
]]></artwork>
        <t>Now the unit can use the blinded key pair <tt>(sk', pk')</tt> or derive child HDKeys.</t>
      </section>
      <section anchor="the-remote-hdk-protocol">
        <name>The remote HDK protocol</name>
        <t>This is a protocol between a local unit and a remote issuer.</t>
        <t>As a prerequisite, the unit possesses a <tt>salt</tt> of <tt>Ns</tt> bytes associated with a parent key pair <tt>(sk, pk)</tt> generated using the local HDK procedure.</t>
        <artwork><![CDATA[
# 1. Unit computes:
(skR, pkR) = DeriveKeyPair(salt)

# 2. Unit shares with issuer: (pk, pkR)

# 3. Issuer computes:
(salt_kem, kh) = Encap(pkR)

# 4. Issuer shares with unit: kh

# Subsequently, for any index known to both parties:

# 5. Issuer computes:
(pk', salt', bf') = HDK(index, pk, salt_kem)

# 6. Issuer shares with unit: pk'

# 7. Unit verifies integrity:
salt_kem = Decap(kh, skR)
(pk_expected', salt', bf') = HDK(index, pk, salt_kem)
pk' == pk_expected'

# 8. Unit computes:
sk' = BlindPrivateKey(sk, bf) # optional
]]></artwork>
        <t>After step 7, the unit can use the value of <tt>salt'</tt> to derive next-level HDKeys.</t>
        <t>Step 4 <bcp14>MAY</bcp14> be postponed to be combined with step 6. Steps 5 to 8 <bcp14>MAY</bcp14> be combined in concurrent execution for multiple indices.</t>
      </section>
      <section anchor="the-hdk-key-alias-format">
        <name>The HDK key alias format</name>
        <t>An HDK can be represented canonically using the following string format, in augmented Backus-Naur form (ABNF) <xref target="RFC5234"/> and applying non-padded base64url encoding <xref target="RFC4648"/> for key handles:</t>
        <artwork><![CDATA[
hdk-key-alias  = origin-alias "/" path

; The origin-alias is an opaque identifier for a device
; key pair, the associated HDK instantiation, and the seed.
origin-alias   = 1*255no-slash

; The hdk-path identifies the indices and key handles to
; apply from left to right.
hdk-path       = hdk-index *("/" hdk-sub-path)

hdk-sub-path   = *(hdk-edge "/") hdk-index
hdk-edge       = ("#" hdk-key-handle) / hdk-index

; The index is to be parsed to an integer between 0 and
; 2^32-1 (inclusive) and used as input to CreateContext.
hdk-index      = non-zero-digit 0*9DIGIT

; The key handle is to be decoded from
hdk-key-handle = 1*base64url-char

no-slash       = %x21-%x2E / %x30-%x7E ; ASCII printable, no "/"
non-zero-digit = %31-39
base64url-char = ALPHA / DIGIT / "-" / "_"
]]></artwork>
        <t>A unit <bcp14>MAY</bcp14> use the HDK key alias format to represent keys internally.</t>
        <t>A unit <bcp14>MUST NOT</bcp14> directly include the device private key in the <tt>origin-alias</tt>.</t>
        <t>A unit <bcp14>MUST NOT</bcp14> directly include the seed in the <tt>origin-alias</tt>.</t>
        <t>When taking input in the HDK key alias format:</t>
        <ul spacing="normal">
          <li>
            <t>a unit <bcp14>MAY</bcp14> pose further limitations on the value of <tt>origin-alias</tt>;</t>
          </li>
          <li>
            <t>a unit <bcp14>MUST</bcp14> limit either the amount of <tt>hdk-edge</tt> instances or the total length of the <tt>hdk-key-alias</tt>;</t>
          </li>
          <li>
            <t>a unit <bcp14>MUST</bcp14> verify that the byte strings represented by <tt>hdk-key-handle</tt> has the size of ciphertext in <tt>KEM</tt>.</t>
          </li>
        </ul>
        <t>Example key handles:</t>
        <artwork><![CDATA[
my_pid_key/0

my_pid_key/12345

my_pid_key/0/iS2ipkvGCDI0-Lps25Ex2KdjTfGRmIBjGEHkjBCPoQg/3

; newline for printing purposes not in the actual hdk-path
second_key/123/45/itnCVhZ-DYZDaUqofDNhHEbNc9XOrdnLL9B-9dVZ
tTg/6789/3JVRsML8NvUnCx1CvzpZrHSn4TkSUpGgn8r-X_RiQ1Y/3
]]></artwork>
      </section>
    </section>
    <section anchor="generic-hdk-instantiations">
      <name>Generic HDK instantiations</name>
      <section anchor="using-digital-signatures">
        <name>Using digital signatures</name>
        <t>Instantiations of HDK using digital signatures require:</t>
        <ul spacing="normal">
          <li>
            <t><tt>DSA</tt>: A digital signature algorithm, consisting of the functions:
            </t>
            <ul spacing="normal">
              <li>
                <t>GenerateKeyPair(): Outputs a new key pair <tt>(sk, pk)</tt> consisting of private key <tt>sk</tt> and public key <tt>pk</tt>.</t>
              </li>
              <li>
                <t>Sign(sk, msg): Outputs the signature created using private signing key <tt>sk</tt> over byte string <tt>msg</tt>.</t>
              </li>
              <li>
                <t>Verify(signature, pk, msg): Outputs whether <tt>signature</tt> is a signature over <tt>msg</tt> using public verification key <tt>pk</tt>.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>Using these constructs, an example proof of possession protocol is:</t>
        <artwork><![CDATA[
# 1. Unit shares with reader: pk

# 2. Reader computes:
nonce = generate_random_nonce() # out of scope for this spec

# 3. Reader shares with unit: nonce

# 4. Unit computes:
msg = create_message(pk, nonce) # out of scope for this spec
signature = Sign(sk, msg)

# 5. Reader computes:
msg = create_message(pk, nonce) # out of scope for this spec
Verify(signature, pk, msg)
]]></artwork>
        <t>Instantiations of HDK using digital signatures provide:</t>
        <ul spacing="normal">
          <li>
            <t><tt>BL</tt>: A cryptographic construct that extends <tt>DSA</tt> as specified in <xref target="I-D.draft-irtf-cfrg-signature-key-blinding-07"/>, implementing the interface from <xref target="instantiation-parameters">Instantiation parameters</xref>.</t>
          </li>
        </ul>
        <t>While <xref target="I-D.draft-irtf-cfrg-signature-key-blinding-07"/> does not expose blinding factors, it provides public algorithms to compute these. In HDK, the computed blinding factors are applied in <tt>BL</tt> as follows:</t>
        <artwork><![CDATA[
def BlindSign(sk, bf, msg):
    sk' = BlindPrivateKey(sk, bf)
    signature = Sign(sk', msg)
    return signature
]]></artwork>
        <t>By design of <tt>BL</tt>, the same proof of possession protocol can be used with blinded key pairs and BlindSign, in such a way that the reader does not recognise that key blinding was used.</t>
        <t>In the default implementation, BlindSign requires support from the secure cryptographic device protecting <tt>sk</tt>. In some cases, BlindSign can be implemented in an alternative, distributed way. An example will be provided below.</t>
        <t>Applications <bcp14>MUST</bcp14> bind the message to be signed to the blinded public key. This mitigates attacks based on signature malleability. Several proof of possession protocols require including document data in the message, which includes the blinded public key indeed.</t>
      </section>
      <section anchor="using-prime-order-groups">
        <name>Using prime-order groups</name>
        <t>Instantiations of HDK using prime-order groups require:</t>
        <ul spacing="normal">
          <li>
            <t><tt>G</tt>: A prime-order group as defined in <xref target="RFC9497"/> with elements of type Element and scalars of type Scalar, consisting of the functions:
            </t>
            <ul spacing="normal">
              <li>
                <t>RandomScalar(): Outputs a random Scalar <tt>k</tt>.</t>
              </li>
              <li>
                <t>Add(A, B): Outputs the sum between Elements <tt>A</tt> and <tt>B</tt>.</t>
              </li>
              <li>
                <t>ScalarMult(A, k): Outputs the scalar multiplication between Element <tt>A</tt> and Scalar <tt>k</tt>.</t>
              </li>
              <li>
                <t>ScalarBaseMult(k): Outputs the scalar multiplication between the base Element and Scalar <tt>k</tt>.</t>
              </li>
              <li>
                <t>Order(): Outputs the order of the base Element.</t>
              </li>
              <li>
                <t>SerializeElement(A): Outputs a byte string representing Element <tt>A</tt>.</t>
              </li>
              <li>
                <t>SerializeScalar(k): Outputs a byte string representing Scalar <tt>k</tt>.`</t>
              </li>
              <li>
                <t>HashToScalar(msg): Outputs the result of deterministically mapping a byte string <tt>msg</tt> to an element in the scalar field of the prime order subgroup of <tt>G</tt>, using the <tt>hash_to_field</tt> function from a hash-to-curve suite <xref target="RFC9380"/>.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>Instantiations of HDK using prime-order groups provide:</t>
        <artwork><![CDATA[
def GenerateKeyPair():
    sk = GenerateRandomScalar()
    pk = ScalarBaseMult(sk)
    return (sk, pk)

def DeriveBlindKey(ikm):
    bk_scalar = HashToScalar(ikm)
    bk = SerializeScalar(bk_scalar)
    return bk

def DeriveBlindingFactor(bk, ctx):
    msg = bk || 0x00 || ctx
    bf = HashToScalar(msg)
    return bf
]]></artwork>
        <t>Note that DeriveBlindingFactor is compatible with the definitions in <xref target="I-D.draft-irtf-cfrg-signature-key-blinding-07"/>. The function is almost compatible with the definitions in <xref target="I-D.draft-bradleylundberg-cfrg-arkg-02"/>: only in AKRG, the context string needs to be prefixed with <tt>0x00</tt>.</t>
        <section anchor="using-additive-blinding">
          <name>Using additive blinding</name>
          <t>Instantiations of HDK using additive blinding use:</t>
          <ul spacing="normal">
            <li>
              <t><xref target="using-prime-order-groups">prime-order groups</xref></t>
            </li>
          </ul>
          <t>Instantiations of HDK using additive blinding provide:</t>
          <artwork><![CDATA[
def BlindPublicKey(pk, bk, ctx):
    bf = DeriveBlindingFactor(bk, ctx)
    pk' = Add(pk, ScalarBaseMult(bf))
    return pk

def BlindPrivateKey(sk, bf):
    sk' = sk + bf mod Order()
    return sk

def Combine(bf1, bf2):
    bf = bf1 + bf2 mod Order()
    return bf
]]></artwork>
          <t>Note that all algorithms in <xref target="I-D.draft-bradleylundberg-cfrg-arkg-02"/> use additive blinding.</t>
        </section>
        <section anchor="using-multiplicative-blinding">
          <name>Using multiplicative blinding</name>
          <t>Instantiations of HDK using multiplicative blinding use:</t>
          <ul spacing="normal">
            <li>
              <t><xref target="using-prime-order-groups">prime-order groups</xref></t>
            </li>
          </ul>
          <t>Instantiations of HDK using multiplicative blinding provide:</t>
          <artwork><![CDATA[
def BlindPublicKey(pk, bk, ctx):
    bf = DeriveBlindingFactor(bk, ctx)
    pk' = ScalarMult(pk, bf)
    return pk

def BlindPrivateKey(sk, bf):
    sk' = sk * bf mod Order()
    return sk

def Combine(bf1, bf2):
    bf = bf1 * bf2 mod Order()
    return bf
]]></artwork>
          <t>Note that all algorithms in <xref target="I-D.draft-irtf-cfrg-signature-key-blinding-07"/> use multiplicative blinding.</t>
        </section>
      </section>
      <section anchor="using-elliptic-curves">
        <name>Using elliptic curves</name>
        <t>Instantiations of HDK using elliptic curves use:</t>
        <ul spacing="normal">
          <li>
            <t><xref target="using-prime-order-groups">prime-order groups</xref></t>
          </li>
        </ul>
        <t>Instantiations of HDK using elliptic curves require:</t>
        <ul spacing="normal">
          <li>
            <t><tt>DST</tt>: A domain separation tag for use with HashToScalar.</t>
          </li>
          <li>
            <t><tt>H2C</tt>: A hash-to-curve suite <xref target="RFC9380"/>.</t>
          </li>
        </ul>
        <t>Instantiations of HDK using elliptic curves provide:</t>
        <ul spacing="normal">
          <li>
            <t><tt>H</tt>: <tt>H</tt> from <tt>H2C</tt>.</t>
          </li>
          <li>
            <t><tt>Ns</tt>: The output size of <tt>H</tt>.</t>
          </li>
        </ul>
        <artwork><![CDATA[
def HashToScalar(msg):
    scalar = hash_to_field(msg, 1) with the parameters:
        DST: DST
        F: GF(Order()), the scalar field
            of the prime order subgroup of EC
        p: Order()
        m: 1
        L: as defined in H2C
        expand_message: as defined in H2C
    return scalar
]]></artwork>
        <section anchor="using-ecdh-shared-secrets">
          <name>Using ECDH shared secrets</name>
          <t>Instantiations of HDK using ECDH shared secrets use:</t>
          <ul spacing="normal">
            <li>
              <t><xref target="using-elliptic-curves">elliptic curves</xref></t>
            </li>
            <li>
              <t><xref target="using-multiplicative-blinding">multiplicative blinding</xref></t>
            </li>
          </ul>
          <t>Instantiations of HDK using ECDH shared secrets provide:</t>
          <ul spacing="normal">
            <li>
              <t><tt>DH</tt>: The Elliptic Curve Key Agreement Algorithm - Diffie-Hellman (ECKA-DH) <xref target="TR03111"/> with elliptic curve <tt>G</tt>, consisting of the functions:
              </t>
              <ul spacing="normal">
                <li>
                  <t>CreateSharedSecret(skX, pkY): Outputs a shared secret byte string <tt>Z_AB</tt> representing the x-coordinate of the Element <tt>ScalarMult(pkY, skX)</tt>.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>Note that DH enables an alternative way of authenticating a key pair <tt>(sk, pk)</tt> without creation or verification of a signature:</t>
          <artwork><![CDATA[
# 1. Unit shares with reader: pk

# 2. Reader computes:
(skR, pkR) = GenerateKeyPair()

# 3. Reader shares with unit: pkR

# 4. Unit computes:
Z_AB = CreateSharedSecret(sk, pkR)

# 5. Reader computes:
Z_AB = CreateSharedSecret(skR, pk)
]]></artwork>
          <t>Now with the shared secret <tt>Z_AB</tt>, the unit and the reader can compute a secret shared key. The unit can convince the reader that it possesses <tt>sk</tt> for example by sharing a message authentication code created using this key. The reader can verify this by recomputing the code using its value of <tt>Z_AB</tt>. This is for example used in ECDH-MAC authentication defined in <xref target="ISO18013-5"/>.</t>
          <t>In this example, step 1 can be postponed in the interactions between the unit and the reader if a trustworthy earlier commitment to <tt>pk</tt> is available, for example in a sealed document.</t>
          <t>Similarly, ECDH enables authentication of key pair <tt>(sk', pk')</tt> blinded from an original key pair <tt>(sk, pk)</tt> using a blinding factor <tt>bf</tt> such that:</t>
          <artwork><![CDATA[
sk' = BlindPrivateKey(sk, bf)
    = sk * bf mod Order()
pk' = ScalarMult(pk, bf)
]]></artwork>
          <t>In this case, the computation in step 4 can be performed as such:</t>
          <artwork><![CDATA[
# 4. Unit computes:
Z_AB = CreateSharedSecret(sk', pkR)
     = CreateSharedSecret(sk * bf mod Order(), pkR)
     = CreateSharedSecret(sk, ScalarMult(pkR, bf))
]]></artwork>
          <t>Note that the value of <tt>ScalarMult(pkR, bf)</tt> does not need to be computed within the secure cryptographic device that protects <tt>sk</tt>.</t>
        </section>
        <section anchor="using-ec-sdsa-signatures">
          <name>Using EC-SDSA signatures</name>
          <t>Instantiations of HDK using EC-SDSA (Schnorr) signatures use:</t>
          <ul spacing="normal">
            <li>
              <t><xref target="using-additive-blinding">additive blinding</xref></t>
            </li>
            <li>
              <t><xref target="using-digital-signatures">digital signatures</xref></t>
            </li>
            <li>
              <t><xref target="using-elliptic-curves">elliptic curves</xref></t>
            </li>
          </ul>
          <t>Instantiations of HDK using EC-SDSA signatures provide:</t>
          <ul spacing="normal">
            <li>
              <t><tt>DSA</tt>: An EC-SDSA digital signature algorithm <xref target="TR03111"/>, representing signatures as pairs <tt>(c, s)</tt>.</t>
            </li>
          </ul>
          <t>Note that in this case, the following definition is equivalent to the original definition of BlindSign:</t>
          <artwork><![CDATA[
def BlindSign(sk, bf, msg):
    # Compute signature within the secure cryptographic device.
    (c, s) = Sign(sk, msg)

    # Post-process the signature outside of this device.
    s' = s + c * bf mod Order()

    signature = (c, s')
    return signature
]]></artwork>
        </section>
        <section anchor="using-p-256">
          <name>Using P-256</name>
          <t>Instantiations of HDK using P-256 use:</t>
          <ul spacing="normal">
            <li>
              <t><xref target="using-elliptic-curves">elliptic curves</xref></t>
            </li>
          </ul>
          <t>Instantiations of HDK using P-256 provide:</t>
          <ul spacing="normal">
            <li>
              <t><tt>G</tt>: The NIST curve <tt>secp256r1</tt> (P-256) <xref target="SEC2"/>.</t>
            </li>
            <li>
              <t><tt>H2C</tt>: P256<em>XMD:SHA-256_SSWU_RO</em> <xref target="RFC9380"/>, which uses SHA-256 <xref target="FIPS180-4"/> as <tt>H</tt>.</t>
            </li>
            <li>
              <t><tt>KEM</tt>: DHKEM(P-256, HKDF-SHA256) <xref target="RFC9180"/>.</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="concrete-hdk-instantiations">
      <name>Concrete HDK instantiations</name>
      <t>The <bcp14>RECOMMENDED</bcp14> instantiation is the HDK-ECDH-P256. This avoids the risk of having the holder unknowingly producing a potentially non-repudiable signature over reader-provided data. Secure cryptographic devices that enable a high level of assurance typically support managing ECDH keys with the P-256 elliptic curve.</t>
      <section anchor="hdk-ecdh-p256">
        <name>HDK-ECDH-P256</name>
        <t>The HDK-ECDH-P256 instantiation of HDK uses:</t>
        <ul spacing="normal">
          <li>
            <t><xref target="using-p-256">P-256</xref></t>
          </li>
          <li>
            <t><xref target="using-ecdh-shared-secrets">ECDH shared secrets</xref></t>
          </li>
        </ul>
        <t>The HDK-ECDH-P256 instantiation defines:</t>
        <ul spacing="normal">
          <li>
            <t><tt>DST</tt>: <tt>"ECDH Key Blind"</tt></t>
          </li>
        </ul>
      </section>
      <section anchor="hdk-ecdsa-p256add">
        <name>HDK-ECDSA-P256add</name>
        <t>The HDK-ECDSA-P256add instantiation of HDK uses:</t>
        <ul spacing="normal">
          <li>
            <t><xref target="using-digital-signatures">digital signatures</xref></t>
          </li>
          <li>
            <t><xref target="using-p-256">P-256</xref></t>
          </li>
          <li>
            <t><xref target="using-additive-blinding">additive blinding</xref></t>
          </li>
        </ul>
        <t>The HDK-ECDSA-P256add instantiation of HDK defines:</t>
        <ul spacing="normal">
          <li>
            <t><tt>DST</tt>: <tt>"ARKG-BL-EC.ARKG-P256ADD-ECDH"</tt> for interoperability with <xref target="I-D.draft-bradleylundberg-cfrg-arkg-02"/>.</t>
          </li>
          <li>
            <t><tt>DSA</tt>: ECDSA <xref target="TR03111"/> with curve <tt>G</tt>.</t>
          </li>
        </ul>
      </section>
      <section anchor="hdk-ecdsa-p256mul">
        <name>HDK-ECDSA-P256mul</name>
        <t>The HDK-ECDSA-P256mul instantiation of HDK uses:</t>
        <ul spacing="normal">
          <li>
            <t><xref target="using-digital-signatures">digital signatures</xref></t>
          </li>
          <li>
            <t><xref target="using-p-256">P-256</xref></t>
          </li>
          <li>
            <t><xref target="using-multiplicative-blinding">multiplicative blinding</xref></t>
          </li>
        </ul>
        <t>The HDK-ECDSA-P256mul instantiation of HDK defines:</t>
        <ul spacing="normal">
          <li>
            <t><tt>DST</tt>: <tt>"ECDSA Key Blind"</tt> for interoperability with <xref target="I-D.draft-irtf-cfrg-signature-key-blinding-07"/>.</t>
          </li>
          <li>
            <t><tt>DSA</tt>: ECDSA <xref target="TR03111"/> with curve <tt>G</tt>.</t>
          </li>
        </ul>
      </section>
      <section anchor="hdk-ecsdsa-p256">
        <name>HDK-ECSDSA-P256</name>
        <t>The HDK-ECSDSA-P256 instantiation of HDK uses:</t>
        <ul spacing="normal">
          <li>
            <t><xref target="using-ec-sdsa-signatures">EC-SDSA signatures</xref></t>
          </li>
          <li>
            <t><xref target="using-p-256">P-256</xref></t>
          </li>
        </ul>
        <t>The HDK-ECSDSA-P256 instantiation of HDK defines:</t>
        <ul spacing="normal">
          <li>
            <t><tt>DST</tt>: <tt>"EC-SDSA Key Blind"</tt></t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="application-considerations">
      <name>Application considerations</name>
      <section anchor="secure-cryptographic-device">
        <name>Secure cryptographic device</name>
        <t>The HDK approach assumes that the holder controls a secure cryptographic device that protects the device key pair <tt>(sk_device, pk_device)</tt>. The device key is under sole control of the holder.</t>
        <t>In the context of <xref target="EU2024-1183"/>, this device is typically called a Wallet Secure Cryptographic Device (WSCD), running a personalised Wallet Secure Cryptographic Application (WSCA) that exposes a Secure Cryptographic Interface (SCI) to a Wallet Instance (WI) running on a User Device (UD). The WSCD is certified to protect access to the device private key with high attack potential resistance to achieve high level of assurance authentication as per <xref target="EU2015-1502"/>. This typically means that the key is associated with a strong possession factor and with a rate-limited Personal Identification Number (PIN) check as a knowledge factor, and the verification of both factors actively involve the WSCD.</t>
        <t>An example deployment of HDK in this context is illustrated below.</t>
        <artwork><![CDATA[
+---------------------+          +----------------------+
|Issuer infrastructure|          |User Device (UD)      |
|                     |          |                      |
|+-------------------+|OpenID4VCI|+--------------------+|
||Issuer service     |<----------++Wallet Instance (WI)||
||                   ||          |++-------------------+|
||Optionally an      ||          +-+--------------------+
||ARKG subordinate   ||            |Secure
||party              ||            |Cryptographic
|+-------------------+|            |Interface (SCI)
+---------------------+           +v-------------------+
                                  |Wallet Secure       |
                                  |Cryptographic       |
          Internal     Manages    |Application (WSCA)  |
          registry    <-----------+                    |
                                  |Optionally an       |
                                  |ARKG delegating     |
                                  |party               |
                                  ++-------------------+
                                   |Uses
                                  +v-------------------+
                       Protects   |Wallet secure       |
          Device keys <-----------+cryptographic       |
                                  |device (WSCD)       |
                                  +--------------------+
]]></artwork>
        <t>The WSCA could be a single program or could be deployed in a distributed architecture, as illustrated below.</t>
        <artwork><![CDATA[
+--------------+
|User device   |
|+------------+|
||WI          ||
|++-----------+|
| |SCI         |
|+v-----------+|
||WSCA agent  ||
|++-----------+|
+-+------------+
  |WSCA protocol
 +v-----------+
 |WSCA service|
 +------------+
]]></artwork>
        <t>In the case of a distributed WSCA, the UD contains a local component, here called WSCA agent, accessing an external and possibly remote WSCA service from one or more components over a WSCA protocol. For example, the WSCA agent may be a local web API client and the WSCA service may be provided at a remote web API server. In such cases, typically the WSCA service receives a high-assurance security evaluation, while the WSCA agent is assessed to not be able to compromise the system's security guarantees.</t>
        <t>The internal registry can be managed by the WSCA agent, by the WSCA service, or by the combination. When the user device is a natural person’s mobile phone, WSCA agent management could provide better confidentiality protection against compromised WSCA service providers. When the user device is a cloud server used by a legal person, and the legal person deploys its own WSCD, WSCA service management could provide better confidentiality protection against compromised Wallet Instance cloud providers.</t>
        <t>In a distributed WSCA architecture, the WSCA could internally apply distributed key generation. A description of this is out of scope for the current document.</t>
        <t>The solution proposal discussed herein works in all any WSCD architecture that supports the required cryptographic primitives:</t>
        <ul spacing="normal">
          <li>
            <t>In the case of HDK-ECDH-P256 (see <xref target="hdk-ecdh-p256"/>):
            </t>
            <ul spacing="normal">
              <li>
                <t>P-256 ECDH key pair generation</t>
              </li>
              <li>
                <t>P-256 ECDH key agreement</t>
              </li>
            </ul>
          </li>
          <li>
            <t>In the case of HDK-ECDSA-P256mul (see <xref target="hdk-ecdsa-p256mul"/>):
            </t>
            <ul spacing="normal">
              <li>
                <t>P-256 ECDSA blinding key pair generation</t>
              </li>
              <li>
                <t>P-256 ECDSA blinded signature creation</t>
              </li>
            </ul>
          </li>
          <li>
            <t>In the case of HDK-ECSDSA-P256 (see <xref target="hdk-ecsdsa-p256"/>):
            </t>
            <ul spacing="normal">
              <li>
                <t>P-256 EC-SDSA key pair generation</t>
              </li>
              <li>
                <t>P-256 EC-SDSA signature creation</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>The other HDK operations can be performed in a WSCA or WSCA agent running on any UD, including hostile ones with limited sandboxing capabilities, such as in a smartphone's rich execution environment or in a personal computer web browser.</t>
      </section>
      <section anchor="trust-evidence">
        <name>Trust evidence</name>
        <t>Some issuers could require evidence from a solution provider of the security of the holder's cryptographic device. This evidence can in the context of <xref target="EU2024-1183"/> be divided into initial "Wallet Trust Evidence" and related "Issuer Trust Evidence". Each is a protected document that contains a trust evidence public key associated with a private key that is protected in the secure cryptographic device. With HDK, these public keys are specified as follows.</t>
        <section anchor="wallet-trust-evidence">
          <name>Wallet Trust Evidence</name>
          <t>The Wallet Trust Evidence public key is the first level 0 HDK public key. To achieve reader unlinkability, the wallet <bcp14>SHOULD</bcp14> limit access to a trusted person identification document provider only.</t>
          <t>To prevent association across identities, the solution provider <bcp14>MUST</bcp14> before issuing Wallet Trust Evidence ensure that (a) a newly generated device key pair is used and (b) the wallet follows the protocol so that the HDK output is bound to exactly this key. For (a), the solution provider could rely on freshness of a key attestation and ensure that each device public key is attested only once. For (b), the wallet could proof knowledge of the blinding factor <tt>bf</tt> with a Schnorr non-interactive zero-knowledge proof <xref target="RFC8235"/> with base point <tt>pk_device</tt>. This would ensure that the root blinding key <tt>bf</tt> is not shared with the solution provider to reduce the risk of the solution provider unblinding future derived keys.</t>
        </section>
        <section anchor="issuer-trust-evidence">
          <name>Issuer Trust Evidence</name>
          <t>The Issuer Trust Evidence public key can be any other HDK public key. The solution provider <bcp14>MUST</bcp14> verify that the wallet knows the associated private key before issuing Issuer Trust Evidence. The solution provider <bcp14>MUST</bcp14> ensure that <tt>sk_device</tt> is under sole control of the unit holder. To achieve reader unlinkability, the unit <bcp14>MUST</bcp14> limit access of Issuer Trust Evidence to a single issuer. Subsequent issuers within the same HDK tree do not need to receive any Issuer Trust Evidence, since they can derive equally secure keys by applying the remote HDK protocol to presented keys attested by trusted (other) issuers.</t>
        </section>
      </section>
      <section anchor="applying-hdk-in-openid-for-verifiable-credential-issuance">
        <name>Applying HDK in OpenID for Verifiable Credential Issuance</name>
        <t>In <xref target="draft-OpenID4VCI"/>, the following terminology applies:</t>
        <table>
          <thead>
            <tr>
              <th align="left">OpenID4VCI</th>
              <th align="left">HDK</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Credential</td>
              <td align="left">document</td>
            </tr>
            <tr>
              <td align="left">Credential Issuer</td>
              <td align="left">issuer</td>
            </tr>
            <tr>
              <td align="left">Verifier</td>
              <td align="left">reader</td>
            </tr>
            <tr>
              <td align="left">Wallet</td>
              <td align="left">unit</td>
            </tr>
          </tbody>
        </table>
        <t>HDK enables unit and issuers cooperatively to establish the cryptographic key material that issued documents will be bound to.</t>
        <t>For the remote HDK protocol, HDK proposes an update to the OpenID4VCI endpoints. This proposal is under discussion in <eref target="https://github.com/openid/OpenID4VCI/issues/359">openid/OpenID4VCI#359</eref>. In the update, the unit shares a key encapsulation public key with the issuer, and the issuer returns a key handle. Then documents can be re-issued, potentially in batches, using synchronised indices. Alternatively, re-issued documents can have their own key handles.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security considerations</name>
      <section anchor="confidentiality-of-key-handles">
        <name>Confidentiality of key handles</name>
        <t>The key handles <bcp14>MUST</bcp14> be considered confidential, since they provide knowledge about the blinding factors. Compromise of this knowledge could introduce undesired linkability. In HDK, both the holder and the issuer know the key handle during issuance.</t>
        <t>In an alternative to HDK, the holder independently generates blinded key pairs and proofs of association, providing the issuer with zero knowledge about the blinding factors. However, this moves the problem: the proofs of association would now need to be considered confidential.</t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="FIPS180-4" target="https://csrc.nist.gov/pubs/fips/180-4/upd1/final">
          <front>
            <title>Secure Hash Standard (SHS)</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2012" month="June"/>
          </front>
          <seriesInfo name="FIPS" value="180-4"/>
          <seriesInfo name="DOI" value="10.6028/NIST.FIPS.180-4"/>
        </reference>
        <reference anchor="ISO18013-5" target="https://www.iso.org/standard/69084.html">
          <front>
            <title>Personal identification - ISO-compliant driving licence - Part 5: Mobile driving licence (mDL) application</title>
            <author>
              <organization>ISO/IEC</organization>
            </author>
            <date year="2019" month="September"/>
          </front>
          <seriesInfo name="ISO/IEC" value="18013-5:2021"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC5234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
            <author fullname="P. Overell" initials="P." surname="Overell"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="68"/>
          <seriesInfo name="RFC" value="5234"/>
          <seriesInfo name="DOI" value="10.17487/RFC5234"/>
        </reference>
        <reference anchor="RFC8017">
          <front>
            <title>PKCS #1: RSA Cryptography Specifications Version 2.2</title>
            <author fullname="K. Moriarty" initials="K." role="editor" surname="Moriarty"/>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski"/>
            <author fullname="J. Jonsson" initials="J." surname="Jonsson"/>
            <author fullname="A. Rusch" initials="A." surname="Rusch"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document provides recommendations for the implementation of public-key cryptography based on the RSA algorithm, covering cryptographic primitives, encryption schemes, signature schemes with appendix, and ASN.1 syntax for representing keys and for identifying the schemes.</t>
              <t>This document represents a republication of PKCS #1 v2.2 from RSA Laboratories' Public-Key Cryptography Standards (PKCS) series. By publishing this RFC, change control is transferred to the IETF.</t>
              <t>This document also obsoletes RFC 3447.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8017"/>
          <seriesInfo name="DOI" value="10.17487/RFC8017"/>
        </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="RFC9380">
          <front>
            <title>Hashing to Elliptic Curves</title>
            <author fullname="A. Faz-Hernandez" initials="A." surname="Faz-Hernandez"/>
            <author fullname="S. Scott" initials="S." surname="Scott"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="R. S. Wahby" initials="R. S." surname="Wahby"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>This document specifies a number of algorithms for encoding or hashing an arbitrary string to a point on an elliptic curve. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9380"/>
          <seriesInfo name="DOI" value="10.17487/RFC9380"/>
        </reference>
        <reference anchor="RFC9497">
          <front>
            <title>Oblivious Pseudorandom Functions (OPRFs) Using Prime-Order Groups</title>
            <author fullname="A. Davidson" initials="A." surname="Davidson"/>
            <author fullname="A. Faz-Hernandez" initials="A." surname="Faz-Hernandez"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="December" year="2023"/>
            <abstract>
              <t>An Oblivious Pseudorandom Function (OPRF) is a two-party protocol between a client and a server for computing the output of a Pseudorandom Function (PRF). The server provides the PRF private key, and the client provides the PRF input. At the end of the protocol, the client learns the PRF output without learning anything about the PRF private key, and the server learns neither the PRF input nor output. An OPRF can also satisfy a notion of 'verifiability', called a VOPRF. A VOPRF ensures clients can verify that the server used a specific private key during the execution of the protocol. A VOPRF can also be partially oblivious, called a POPRF. A POPRF allows clients and servers to provide public input to the PRF computation. This document specifies an OPRF, VOPRF, and POPRF instantiated within standard prime-order groups, including elliptic curves. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9497"/>
          <seriesInfo name="DOI" value="10.17487/RFC9497"/>
        </reference>
        <reference anchor="SEC2" target="https://www.secg.org/sec2-v2.pdf">
          <front>
            <title>SEC 2: Recommended Elliptic Curve Domain Parameters, Version 2.0</title>
            <author>
              <organization>Certicom Research</organization>
            </author>
            <date year="2010" month="January"/>
          </front>
          <seriesInfo name="SEC" value="2 Version 2.0"/>
        </reference>
        <reference anchor="TR03111" target="https://www.bsi.bund.de/EN/Themen/Unternehmen-und-Organisationen/Standards-und-Zertifizierung/Technische-Richtlinien/TR-nach-Thema-sortiert/tr03111/tr-03111.html">
          <front>
            <title>Elliptic Curve Cryptography</title>
            <author>
              <organization>Federal Office for Information Security (BSI)</organization>
            </author>
            <date year="2018" month="June"/>
          </front>
          <seriesInfo name="BSI" value="TR-03111 Version 2.10"/>
        </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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="BIP32" target="https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki">
          <front>
            <title>Hierarchical Deterministic Wallets</title>
            <author initials="P." surname="Wuille" fullname="Pieter Wuille">
              <organization/>
            </author>
            <date year="2021" month="February"/>
          </front>
          <seriesInfo name="BIP" value="32"/>
        </reference>
        <reference anchor="draft-OpenID4VCI" target="https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html">
          <front>
            <title>OpenID for Verifiable Credential Issuance, draft 13</title>
            <author initials="T." surname="Lodderstedt" fullname="T. Lodderstedt">
              <organization/>
            </author>
            <author initials="K." surname="Yasuda" fullname="K. Yasuda">
              <organization/>
            </author>
            <author initials="T." surname="Looker" fullname="T. Looker">
              <organization/>
            </author>
            <date year="2024" month="February" day="08"/>
          </front>
        </reference>
        <reference anchor="EU2015-1502" target="https://eur-lex.europa.eu/legal-content/TXT/?uri=CELEX%3A32015R1502">
          <front>
            <title>Commission Implementing Regulation (EU) 2015/1502 of 8 September 2015 on setting out minimum technical specifications and procedures for assurance levels for electronic identification means</title>
            <author>
              <organization>European Commission</organization>
            </author>
            <date year="2025" month="September"/>
          </front>
          <seriesInfo name="(EU)" value="2015/1502"/>
        </reference>
        <reference anchor="EU2024-1183" target="https://data.europa.eu/eli/reg/2024/1183/oj">
          <front>
            <title>Amending Regulation (EU) No 910/2014 as regards establishing the European Digital Identity Framework</title>
            <author>
              <organization>The European Parliament and the Council of the European Union</organization>
            </author>
            <date year="2024" month="April"/>
          </front>
          <seriesInfo name="(EU)" value="2024/1183"/>
        </reference>
        <reference anchor="I-D.draft-bradleylundberg-cfrg-arkg-02">
          <front>
            <title>The Asynchronous Remote Key Generation (ARKG) algorithm</title>
            <author fullname="Emil Lundberg" initials="E." surname="Lundberg">
              <organization>Yubico</organization>
            </author>
            <author fullname="John Bradley" initials="J." surname="Bradley">
              <organization>Yubico</organization>
            </author>
            <date day="27" month="May" year="2024"/>
            <abstract>
              <t>   Asynchronous Remote Key Generation (ARKG) is an abstract algorithm
   that enables delegation of asymmetric public key generation without
   giving access to the corresponding private keys.  This capability
   enables a variety of applications: a user agent can generate
   pseudonymous public keys to prevent tracking; a message sender can
   generate ephemeral recipient public keys to enhance forward secrecy;
   two paired authentication devices can each have their own private
   keys while each can register public keys on behalf of the other.

   This document provides three main contributions: a specification of
   the generic ARKG algorithm using abstract primitives; a set of
   formulae for instantiating the abstract primitives using concrete
   primitives; and an initial set of fully specified concrete ARKG
   instances.  We expect that additional instances will be defined in
   the future.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bradleylundberg-cfrg-arkg-02"/>
        </reference>
        <reference anchor="I-D.draft-irtf-cfrg-signature-key-blinding-07">
          <front>
            <title>Key Blinding for Signature Schemes</title>
            <author fullname="Frank Denis" initials="F." surname="Denis">
              <organization>Fastly Inc.</organization>
            </author>
            <author fullname="Edward Eaton" initials="E." surname="Eaton">
              <organization>University of Waterloo</organization>
            </author>
            <author fullname="Tancrède Lepoint" initials="T." surname="Lepoint">
         </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="23" month="September" year="2024"/>
            <abstract>
              <t>   This document describes extensions to existing digital signature
   schemes for key blinding.  The core property of signing with key
   blinding is that a blinded public key and all signatures produced
   using the blinded key pair are independent of the unblinded key pair.
   Moreover, signatures produced using blinded key pairs are
   indistinguishable from signatures produced using unblinded key pairs.
   This functionality has a variety of applications, including Tor onion
   services and privacy-preserving airdrop for bootstrapping
   cryptocurrency systems.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-signature-key-blinding-07"/>
        </reference>
        <reference anchor="RFC7800">
          <front>
            <title>Proof-of-Possession Key Semantics for JSON Web Tokens (JWTs)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="April" year="2016"/>
            <abstract>
              <t>This specification describes how to declare in a JSON Web Token (JWT) that the presenter of the JWT possesses a particular proof-of- possession key and how the recipient can cryptographically confirm proof of possession of the key by the presenter. Being able to prove possession of a key is also sometimes described as the presenter being a holder-of-key.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7800"/>
          <seriesInfo name="DOI" value="10.17487/RFC7800"/>
        </reference>
        <reference anchor="RFC8235">
          <front>
            <title>Schnorr Non-interactive Zero-Knowledge Proof</title>
            <author fullname="F. Hao" initials="F." role="editor" surname="Hao"/>
            <date month="September" year="2017"/>
            <abstract>
              <t>This document describes the Schnorr non-interactive zero-knowledge (NIZK) proof, a non-interactive variant of the three-pass Schnorr identification scheme. The Schnorr NIZK proof allows one to prove the knowledge of a discrete logarithm without leaking any information about its value. It can serve as a useful building block for many cryptographic protocols to ensure that participants follow the protocol specification honestly. This document specifies the Schnorr NIZK proof in both the finite field and the elliptic curve settings.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8235"/>
          <seriesInfo name="DOI" value="10.17487/RFC8235"/>
        </reference>
        <reference anchor="Verheul2024" target="https://eprint.iacr.org/2024/1444">
          <front>
            <title>Attestation Proof of Association – provability that attestation keys are bound to the same hardware and person</title>
            <author initials="E." surname="Verheul" fullname="E. Verheul">
              <organization/>
            </author>
            <date year="2024" month="September" day="18"/>
          </front>
        </reference>
        <reference anchor="Wilson2023" target="https://hdl.handle.net/10012/19316">
          <front>
            <title>Post-Quantum Account Recovery for Passwordless Authentication. Master’s thesis</title>
            <author initials="S. M." surname="Wilson" fullname="Spencer MacLaren Wilson">
              <organization/>
            </author>
            <date year="2023" month="April" day="24"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 901?>

<section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>This design is based on ideas introduced to the EU Digital Identity domain by Peter Lee Altmann.</t>
      <t>Helpful feedback came from Emil Lundberg, John Bradley and Remco Schaar.</t>
    </section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact fullname="Micha Kraus">
        <organization/>
        <address>
      </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA9V923LbSLLgO78CK8eEpTZB6uZuWzM9c2RRtnQs22pR7ptD
a4JkkUQLBHgAULJ6NBPzD/t03vZb9lPmSzZvdQNAXbpnNmI7OiwJqCpkZWXl
vbLCMGyVcZmoveAoVnmUj2bxKEqCnipVPo/TuCjjUfBW3RStaDjM1RW0671t
jaJSTbP8Zi+I00nWGmejNJrDGOM8mpThOP7lcraMi3A0yafhbHwJ3cPNr1vF
cjiPiyLO0vJmobDvWC0U/JOWLRh4pxXlKtoLjs/OX7eus/xymmfLxV5wkN8s
yix4neXLeQvGglfjvVYA/4XB297r1pVKl4ofTONythzuBUUEo+bdmTOlcOxO
KbykKS3LWZbrsSbLJOFp9Kl70JN50PsgyDNEkxrHZZbLIxitjKOkgC6d4LuO
PC2WOY9TGSDLp1Ea/xqVgAGYVqKuVD6MCiWv1TyKk70A//0PnoBGZCdNWiPA
Wh4Pl2UTwO/i0SwK3ubRsmjFi3wvKPNlUW5vbr7c3G6lWT6Hb14Jjl4fn/a3
XmyGu3vy3SAQCuir0TJXwVFUzIJ+CRBE+ThY7x/1N2zLKJ+qci+YleWi2Ot2
R0U+6iBKO9PsqrtYDovuJF4UXfpAd7kYb8HfaZSYAQqVx6pAqrGf11DtBdTN
e977cAyPNztfb26/6L4/7p93sGXHb+iuo/4vrKD7Pf0E0j5OgQDKZamCbGKm
WQTwMzhXo1maJdn0JljHb9l5j4Hg94Ltza1tJGR8ctz/AEBs7YTPa3hcO1V5
Qd+KkbbjCdAffhxggl7hKJsvkjhKS9gu8VWcToMkHql0pOD9aZSXwXNY0GwY
J6rWYH3eO9kIogX05yHXVq7M9fV1Jy6yDmChW8gsu1+/3Hyx25mV8/sXBCDt
Hh8e0JrQLLc3t7cehXEZoY7Dl+HmS3p69vpg9+vdF3v6j+fbO7vmD/jsN+aP
lwCF/WPH/WP3pTTrHx5s19cCngbbe8GZArTPkdmMg8MkiRfI1w6W+ZUKehls
uRRRD3sJeETRDr6Hf3HBtjubd2O4UKMpo1iNtsOr7c5iPLkXtX1E67b7kUfh
9UDlAHw2hzkVCtlbHcOb4Sav1fnZ5s7W1lYNLRUUMIud5tFidnPnfIdF3Bku
03FnrLqH77vnMwU47X5MAW2pmsHvIbwMPxC8BcELr80mo5c/I/iT+Ffgzct0
2qU9FxejmQrPgIuVCfBU6HN+FqbRaBbiF6KwyKAP9OuWOc0Hfob0y8No+VUf
mAiMSF0cvG89DvGvFfBk2NUfJrCjVTDJcmAmE+auMB6xz7gE3gHfa2AdL5B1
xLqDZsevjk936mR7hzD+IUoSVRYrl4llYAcIpDuMy1EWp/ATWPIwyYbdeVTA
WPgg3Nzc2e7MQZxF1/FlfD8Oj09BRG/fgzAWR6cxQhz8sIwB1BoitrfCTR6H
1YUPoAMc93a/PziuoYFfEaZh1YBqomGC1KqIryIzL4plBJyxzWMFWzsr8ZLB
WPG4k6qyWyzUqJAH4W54ZYYOR2boMJahw63Pmz6Z3TX1805wko2BTgDP47Kx
ydtO8FNULMfR6gGyS5XX8bYLeAs3X9CLw49AUc/DreebdeI5AE7HelZwDKIG
t2iJUuRMTZcJ0+r64ccNpMnnXRwBJeELoN9FqeZDWDh8EUCrQpXUMVuWAdLf
fDkPStqvSJaIRSPbWIAu8mykxqBEFLRmEaAwRxwGqOsk/FAlalTmGYxRFY9z
FaWr6Vot8zBRXzrwM1tE8KObqCmsEypGMEz3/Mfz7l9gA357cHhy+OMfdvZ3
cBpnOL9H7fJDHB8gcdB47+ZAdO5ZfNaX7rkWebhusJBbWy92auu2j/KpaaHe
Z8HLrc0ujL8LOA1ymDeqLArk+jCJixn2KWfKgt6LgQvg9iAEA0t6jbINdeqV
6AVQIwe3Kom78J0uQttFaLvZL49C47kLD8hW0HiQDolMENaDbJmO4gRJzwP9
Y/oYhAtwjXuF9cPjsNdhPjPMo3GibhIQQkDkU7ZOIjAzQr2HbNs4LyfcoIin
aVQCSaPJEAK6aYnCTaubfPNi06ojL7Z3RCEEhjVTywRhqa90WeLi0Qqf5hng
AP7fL4psFPPDf/7jf+FmuopADcT1K2cRoM7phfZLAPZSMAQ8AkYzwmIBOA5m
QBzX+Ip2JKmiqzfVIo/TshNHo5zUGMbo7u59ujXzqsOOnmXjArwMt5hZ/RAn
AAQ8rNP8aVaU4XfAaEvgLfujEcymJGUNmPIN8YtT4CJo8iWqKIJ9gAZJmjlG
J3hH8uyf//jvAudfxKvZx2ycdGaAkUSRCNjaBF2+u/VyZ+vrB021v0AFPIcP
jk4At6nMqT7vHSC8cHu31QrDMIiGRZlHo7LVuse6DlSK8qcA6y+NpqTyI/zI
gQukDVpus9QRPCdTbWT1NhhorK5QLyFaAeIBTg2doS0MB1IThujAroztt5Bi
xsiYswVtTfiOjDsW/hFr/nHNSgfRZEw8CgC9ARmhwjKeq3BZqACsPzBLCNRO
0M+AEuMULY8yFgkxgu09hKdaJoEqDnp3sRzNAMrrSKic6PiO6Y0zAD3NyiBV
irBRLBcL0A/xw4Hen22epGaMCB7MjkcoZDcluYrGN7SJrmGiyQ28XyTZjRp3
ePXm8RjIpdV6AmoeSKzxcoTzaLUIieNstCSsiRgUfEbJNAMlcDYvaKHAUru5
z7MSrB/18OdGh5jmYpkvMoYX8AWvAuqLq4k4iWlgIhP1/zmRICYBvAxnNVYR
MC4AX8HeigXdTCCfSEW+wDmBegb7LJgvkzIGIpKpATSwI0ewlOMxqB4FQA3d
IkESqYxAXYJdaIDTMMunvoD2MOZ5EhRldk3SVRML2o1ZCssI4I+JI+mJy3zb
LNOkGzfHKSjc+cirF8i485TVH/NhrV9S78jna4AZoOsSMUMoZAJpBwQHLixA
ApwFUYy7gEgCdhb1GAMI6SQWNTa5aaMaRoIFXl0DacIAQgTA/K8Qn7Tqh2Bu
EbnFhIw08BxmOBI8mcQpjDJEIGBWM6QG3HCAJwBuwR4WBDHBCdMXoS1uTGa9
mjZkDNjFM+CpiygvAYA+MwIaF1mFQjMLbMESBrSTQ2zl6r+WMSqZJBPc6Yqs
TIWL0FYGVOJXYboZ0gbpxQC3h9j7mA4h3qAahCpacXqt/R6gxuTC8LLU7iwP
10iJtLNp8+H+04wrmMAzIBPan3oPmpeyGWntzEbqAHsC4K/INvVZblu4K64o
8pRPS4QmODzoHQUF6AlIRgo2VVlcrD+hd6EajWchvwvl3YYobd4IYb/X3w+M
duQOEBbjIrKKU7FxP34fxNRBFKPdTCQtWqTjCiOage0dkhFSyI5OF2C7AD4X
qGe4b8CmwVeTPJu7aEUmk80X6B7Ep/RpgEje+ts0IJ25zi5doIDQcKGxsSd8
UD0TAaSlDm1ONLV4mgYFyDVgjE5V8MhWIu7tmmJapZ6qFLTnEX1/Aso2vmt7
T6vEglhFp/KNEWrETJAIVEMHgGg/rT9HBqK+wAAlL+VQMMLcHIDNkiWjT08c
6HOdmelGsEzjEvSHD6miX2lVZ9GVw/SbICfD8kuEmoUjHk0XEVEopKFhRXxo
UnRENzRCwhP5yLbpaIY+rXlRW4dciVDh1QeEwR/FstDrwGolAIm+/jGSAhpi
SM8U4BAaJdwD8Q+j0SXsaJQPtCEAX+I+o6dmo8TpKFmOZVch20MiRx4zIriz
CQL65AnYWekVTl6b6MTDY/qb5S9OFPXrIlh797F/vtbmn8H7D/T72eF3H4/P
Dnv4e/9o/+TE/NKSFv2jDx9PevY32/Pgw7t3h+973BmeBt6j1tq7/Z/WmOrW
PpyeH394v3+yhjRSevjFvcJkREJ1gdSINNMC2h/l8ZDp6tXB6f/532Af//Wv
/wPMsO2trZd/+5v88WLrm1344xq2Ln+NuDn/CQt00wLyVFFO1JkkQHELFO+4
Hwrgktk1EKDKFaDzq0+ImYu94E/D0WJr98/yACfsPdQ48x4SzupPap0ZiQ2P
Gj5jsOk9r2Dah3f/J+9vjXfn4Z/+AkxPBWC8/eXPLaaRSZYk2TWx4Kw0m5wU
onIGRDwlvkVsVFYNVWiQ8WgUgZQAeU3xC9gRKp7OymCImxxaDI63P/RP12Eh
rjcGe0yswPLSLA1TNWU+iKs+BTVhkA5Yrx1cD8JEpdNyBnsqBokD0gFNC/ia
aEW0dB55fJKIwgXuCpa/d2rlhmOu4HGa3ycZdsc9NFYk4fGlo6mikkGsJIrz
gqWNUQlIjbuKkqWira2HzNUc2A5pRWRVZMyzRXkwmhSNdQ3gz0DnB5VJt0eG
SbDA11GBtF+Pipt0BMuVZssiAbVhfzyOtcrW1sZG8zRZdic3LHSADnxdqpx5
Co6jd4iqZtYAnSUXYJ3FpPmRPBgBuYDqEhNzlGfjuOBoJzwDHML0Yd36IjiK
AKg4yOYgHSqiFuEQ9On1I52QVCTiKiPgwTBXK1uIFwi+yICiFQX0EPc0hl+W
32gBU+CbJ8EJrbynJFfooLp3tICKk2SJfoFS9AWxTptICRaJl6XMFdl+K3V5
vczE4DgujY1YXXNV5IBcSCNSXvZwNyEZDpgO20JQMamkuJ+iPAfDHH2sEQwK
QxVLrZYHuG7ZApD7PrtmANOM9JGcpWCZL0fMqgUJKJL+/ve/ew4W/79nYHeH
z/DHs9bBSqBvEeTb4HZxeXvnWM/MWKtbBcHVg+DBUU7QDg42xWrYc9rdzsaX
m7f0Y+thMP1uqPQw9qfAt7UKPgFwc0t+bt8NqYyNvzyz37gLZg36PeCb0Q3o
BvZtgT0AHZlA3XPA1/DjBDqdzmO/gJRHO5L3Pmv5SOjOsgbigAIFqiRqlg0U
VTa61afL6HKlZRYMFpcDY6vIRosK1vj2gsH64nITWCVYy/BjONncCL6lWcMP
gGUdHi4u2yQmNgbWaMStBVCQfhkFE+DspbFT/G9vDtq2hZWOAAl+kqSpcL5U
fSlDCtII/yanhDu4Y5sOAFSA5yNhhv4wc6wwIzb8DK/VlpWB1hEZOn4EiitO
zMqXTuOigVjlZRukwZ8DgICsHBKv6HIi6YKPEMeMYsTwxkDW0zjLm5eV1+Yp
d3yKPZ/K2jyVtcEJfJH1MYPzGulBkDRUYdabaYD6DZCd5RRaA3rbJNnLIhTQ
B8JZVgKNPn9EUH2X6EiKYMGumV4LsWQ16xYnK+lmcWoniv7VqLDEzRYlCrIz
Fph3SzLMmgFr1cop+9KoDogI+j4oz6SvM3GNzR6y6gtbwSBmtGozFrmNesnH
wu4oHoBRjE/44+wE8tQkR+0xcxYkkUP63KoG5G+iDih5MW6gnK3gubHPzSfv
7uSIZY+oJ2SVSYCnQtMoZBfwMmKBW8TzOAErBAbddxQ1vTyok75hZFFccP/s
7ZuN4NPDwlsXZO0w5wCIUSaXVg8lausER9k1OpHaAQ5tDU1WAT2NrGFGrI34
NGTS71Qh3j3niUeoFfNdPllXhF09jTa73jFGhxvr+MNqZ5O4YLR7hWY7p+gD
YGaCKjNOW79Gi3Ci2JEl3hz2KfpAOto/NIIZJmPPuUjsa1mIxrfAEFLJil3m
kq28cNg4M2LQv7PUY+8T8VGAXRUtCgkXM8GiZxnYn2UWdt+1ZS/ebTdEnsXm
TqZDdOh9k9aAvB/Wmxtr+wSohkJ5vP+B7V/CmpfX6OSn6dq9ZswIxoAWKPTx
HC11/EgQcyPHbxxcpqBYVrEKyCEXcnSlijEoqeSqXaY6WQFW8CTTPm0mG+5c
WH+T5kemhQalI1vyrs5JZXTTl1nuKyMAaxuJpR3KY3K9qUWJJGJNBmQVw9Xd
K+5IMXTKZhd4FKzzlthwuZbxQ+LiJZllxmDHjdAZ7zI7xwtNHwYx0zYePkZI
dJXFY1p7Hc2ORjnAEaD7U+Wix+iginH7aAkBZqcixxlxmGZmqq074SGo9Thx
Ft4QMsBQu9LRk+CrS08Hvv2j1Z6qQqfRT+MZL7GvIA0otIlBUNJCQHMAxcHq
FK6+YNQjHZty/SjaymtiubJjRlkOHRcZg9CgWzmz8qB113xQVCeGk3AAZBdu
wXOq+MGNfjJgcvqMZhrM12mm1gtQlXjF6bWoY5K40ASTbh6amBENqzlDBekV
XBbLIfOwkiN3rs/fhXLQuDcEKv6+saEp2GO9xGLMin3h/meMDjQ7bq1Bws+f
BWDHGMMM3n9EoMGovWT75pben/G3b+/tT48av//MGGy3QdN/tw95t4XsDhBZ
ME+u9nNW1Hv3pzpW7vlefR7PHBxtdzxqMqPc3e8B89vpSAYOEX2tn0vQ7rv6
9P78sO8FwbMqqM6726CnN748cN85w9XePTMTr7+7Bb5z+xv6NX4vqM3BWtay
YWrRPAwBUUoSB79SLyaloy1mQ19H7Ftuo4Iqiba13df24nMVhYmNKVxV/CgO
W6C1tYyLGSltpJugk1n3r1igsLV/QIVZx60yhjgRi3PQvoeRxiZvohJm91ls
hNMCgWT0RnRxV/gaGyHAwEifYbfpUElHGUjbeat13jbG2y1PFEPa85s2CA5r
phpRV59SG9cPOCtaFnqs+yBh6LViUZ3xI0aDhXqle88VqC1jY1i4HkjyRv+2
7CIyYzGWLWaKS6kceV+S1V0oIckKan1hg3Etx5AyuvB1pvXmvXtB9MTRqtwD
GyI3jhPMxce44VWmPVbodzY9JGfrDt3SjZAa1zli2jrwtdfcjSEszMEKZhL2
byfHyQ87wK7dwwDS4H0x4FTSaE6ZgdABHVmiM5LDgRzXTKANvmkc5GiAQSgf
UzM85KQ5ELoSw+BofV5MN/aCD6QlFPRx/hqN8uqEhvE4FR5bAJx9sgmOFwxJ
tohgo9Upm6y5ZKrAWAcgFpjzSqve1l49SrdmstfQFXsEXo9MCaJ2sMHW48u5
A6toq8yBhqjK6Vgz+57gOedjAdrRnT6A7oNOdVxo8poAXR+CsjYqv9S/UNVy
zXdqENBUUz9DA1O1v1R8kfAZgYRgOCVOjjNE31odDtbLwPgsa9o7UccqpZ2V
/wYQHwsfcz4EEDVaUGKbYfNFQhW4qsCw0FUQLGaVjMojobPIMDSwiKEdKNt3
ruOAeBfp7mbmNLN2MIB5PEVP5lNuNdceA4omYTdELnzgjuURBB2wUFofTrYQ
M9v3k4+dB50XSBInXDkgBC8uNwbAC1Dp0KGjFesQfPutUVCqTZq7bG0wmGZ0
3OdvD9+Zje47OkwOCEUy8Ujaxb371u4w+OwpzKu2cevfMci3GOjIUIfYEFDv
sql1XARYOx+SyE/wCgaa3oNRvAAlggh9MBqYCEYdjsoW6pjpIAwj0M5cMGpf
MwP73yMgGr5V2RGrcoso34Kzk24kw8t9jQkG6E/VqTdDNOzMgtC3SV6ghvc+
K0UhHd6IjMd+r07a7C1t9CGw8AW42q6FWNMa0CnFY+MUUKEVVXKv4veCnQ9E
n2TZZZDEl8qJXjhtjI90RXxEY0onVguq9n8CjRW9URXqp4YgJ1EZYM0FJ5wr
XxljdQqn7mpSteg8ZdaS/yUjJdXoQXepMLMsMfmM7so/MLdbqzYs+u/QXzGH
Cn3aQXQVxQn7sZe5qE9aS2OdxYmuIakCUsXxT/pTlleCB5TeUWjtRQsOCUDR
yfYv4h84RgEMvCAMJGYUpSalRet/mzSl7f+5sx1uBeuU2lUAy9iAIWR/YX/g
tO0HiFToNFYTPCUHIB7we45XbTBHgnGAnR/3gtvbgPNvBLJd5oTsOMZm2rJj
IqjJRp0DZEJcSKNNcqhdER68hJ+4aR+0uIv1J7CGWCsgRKVuw18TfHTPgrCj
lSNjJpRpglKcK8OWkr9ktUVi71ykpwjE9b6wWqBeAnfRfdQ76yXBw1L7cxkU
zuZ0czx4vSwy1hkG0ntoQWggDDzSG1w2fOeuFbXg1eobpZgzMe5cIVoLTz7x
0lhgOt6Ibck71JsXzIEpnu93cpnagc6JQ9sgV/R9x6LTgUezuk6mVWWFo+oa
VxPSnXiwGwA2O60eT2mL2dDW+qnOWtdNG92KJrKJjoxUl31wJk2WnrEXKI3J
dMAwcKpBM5ELiVTI+Mwrpza+Z0xfRSwY3fF48mIEBgOtIbm7vbTffwm7CSmi
7TnG2QYW7tq5d4cMJ+2mdPZMeyxoG7aD93j0D3FxDWajv23ISb7KuVNq3w57
hIXRenttxTZb3Xc4eVpx6AjUK3rQdl2RBAC7FKbmMNoAnjSxYm9jN+59VnqH
l4Gv3JP6ijySXjeq5lot5wEm2ALMBASOoLMn3O60GaiVSgpl21sFv313XwFe
uFMtl4I51T5vdMMu8KxijH7mJlneCSQFoY1zkaYUoiQhr8boL3Ty+vRg4jJr
Wl6tLJI2R+yGz57UNHo+b0MLI6ddjBYr2ZikAlE41dGAKsmJgjydleG5QG3u
p1G2qq45B3CyFjHmo0aljlUYTuy55swpuAosbsC9oh1iOG3SELNu0q90SNCJ
cdNqYsAlLh/omzRp9pU0Kmft/wUgYUq+qLh3+v9UopCDQzeT80qsew6SKAcG
NCkpIhRNlXYSS9iOdGZ9skBbDuiH00YCUqWkw5qAHpkIppc51OtEWPkkHydq
iM8z6MthH0RcNsrkYH1UmZHx4EXOwWIcHW2HeIhhUp2l+8k5rHzRwVJLbihV
PIjLZCyRMjICflV5FqKdk6jxVBlYAvtIG2HO512Hp9I1SEZUg4QmP3i1Bczq
E5jmFz3xUrza5ifb8KQthsoAGshreDGgWQkWicivGlxvgiJ2mza6iXoDmyes
p9OuTQFe4hQx31zC4gUfkEmyaUTeUVIGDNhdnMyrrUFt14q0R1cIvK7EL/nk
qGYZ0DobYgauVuy8Y0pOWrBnzrAyhXzG1GUQZZ7i2+YhrDWQOhKbTlugA34I
C6e6DBWwFmdDmZ2hs7cKm0dM0tfXhtjtUEkN3GN1hVjrt0EObbL5+vtiI3hS
P83Ebz0lqLVeXPZQ9PYwMU8So4yPZaOS7EkcwGTRD6DrwJgD94QXcIuTCWlm
b04fai7OvmfyrUl6H2xqtkA23QxIUVZl5n5iYjWtsCd5n61WcWkEvOu/6nG3
J0aB5SlTKrZLSDr27US6qs4llH2S+ePl+vzeyevUTMdH7KTo2JwILz/TekJX
AOsMP7gTu7X0zQaVjfD7tBHB0u33Idg4VleiWPaqGDqyWYn1VPYqc1fNQCPX
VOINJkNw9hd6hbijoiUr4lI52BL3kWxcQMSgumdr5wxk6ZqWxCZx2uzaBuYj
FsoTzCn46K8ZjHWGg51tGGVX72VZpieYAkC9yNNYMFg82T2mIuyODXc6VBdI
5d4HYJjPl2reDi5n+BHtSeUuu6aLOzqiag/aY4u+k1DC5w3RVUfkJPIADSUn
oW4Pez1vAuVhpInAEmxf3wEbDIVNvhHUcCUjOv8OFh8eC9xr6bEIsTjnyxm6
bmHeAMhnfVDz4RCRxfFt4PZFEF7U1vSujVXfV/ukWIFKvwi+aTfvMGtpE6gr
8tfNzurjWLvkBh2S0lNiCFQHdb0AOn8XEI19iuA5tnmhe5qWMbnbuNpAKUKT
0p/cM6ViIPguDjJdk5gOwmD1L+OyFReBOUKKqYJRmqXi37DbyZ4iErObB2qT
LracSjmNV9HoclmE76MlRW7mwfr+q/evNyhegcX1LkzI64YP86XhIhrTcXzg
0V/vLvME/fIZqUafpDzfhYl7i7EjLBaddfA05InBUrMJIn+vddfInGq1/kho
8F7GBbteKEiqq0CpXHQ0lr3Qzz9G4LCkWlzA+oT50L/3NYRt66vt58/TLCyS
qDAw4QzI5DMg6FPjjUYeUAV0ZM2MbIJETUiTy/FMY6dlhuP/6LxAyBziq3XE
B7k3l0NqBFvb/ZPaf7WOj0h3huYbtn/LPNdDr6894fFwBRi+jaDr9JAp8udj
XSECeFMhRsUKtxD0qzuGCBO+IxGG8NwaPH3+nMCI5EVWAuV2Bptfvewdvzk+
16A5pwEMfGOwf5EcEb0tf3q0iIZMwxHwwlZLr6jByx++bG+F8M8hIOMPX3Y2
4fdvDoM/Bvv9g+PjgKodRWT6pBniuFWBEQbY2Qp3Xrb8D8Hz/ZPTo30YlKYA
P9fCNfz385rvywCWodlV08YnatGbnU0eOtScypHDqkvE5Nzq494r0orEyh64
dD946HjsZFwxApm4EsnjlXf8F9XpUdJGZFFBhWwmy5xcMEk8j0tbGcPn6N5n
/+iMgpBTT9eTY7NBBnpnDIQhjNj9iq3KDBOK+aSwNkYHHteqfYkEqFOIyPHt
Fx6XBgtp4NPngOrXED7jXzlx3gY+AWcUWAaEHorbpc5Q5zefF/EYpOxNd7Pl
/rUFrPu592SzG/e348Xl1ZuD3vFmeLIotp8fftl+O/7lfPLmbH786pc3h0eX
v7w6OM2+m3Z3cMul6prOdXMcMWaHhRQb0iUFGLmjcgl409ysxWcPNCDd3efd
uEwPvp/9HPZ++rkXffyvbNJ7Pzs6HL4fvfzxQz5OT05evgpfjr//uVWeT7tf
f/PiZXfnP78/K96dvHh/9TE9+LJ1cPXr4uf8qJ/unl/2Py7eTNMXefjj57P4
u62fAFraUU/YqmssVUHClY8J6bxxW26EDys5daekBsdyRXtt03DGUa+/T+H/
Wjub/fSAZJ2aQepG/PFYUpMa7Y9ayxGJ0ur5Pkm76AOINIqfv8SkqKHniKXW
0PXg+F4H/+kjeFjDz3+BQeU7VIITNDg9JmuG/kevZ4p26cC0GrAFYyGhT9Cw
GhieFCuvI5sDwTNsmeNghZPURwluxoXZlKxmTKZY7y9reLiKNHvnUJUWI0My
r60im+I5DBAB2sz5zP6Iz/R8nVTZleEZsUdkzLoCT2OIBVLRnwFD8FFet89z
mFU0VWTnUJ97PmvR/a1PH2KV1Cb5u762mjJ4Lz9yQ0rAhTek5N357hlDB8yq
dREv2r1UtsPUr8G6A4+q63jRtokUWvsmGT2JRpI5/GlVguPF+hOPUYX21QbJ
Uizq/UhwnJN4X0ieVj2bbXRWm2JAspn8OnROSaNCkZPTZLDIq3FDrmLuFe7B
hXCO8suewlAYmXiGyDA2RDyBI1x3GYHcok6pT4V23AC3bsUE9crN2EHIdOhv
fg8zcE8dNrqaWOs3U2qvKlFYzfzByA3w0kJSihoT2vVJJVThJhEm9PkpO237
XetoM2WgdKWqB4ZSKIuKEpTROSdhKTt+czFGOrzLtdtA72/XM332LdOlzKWh
Ex4dKiAMVDptrKlgtQoPXRHswlh0vTpOq3bPADWdKQPlL56yl7kswcItrEfR
Es8c60fJATMvQrKSFozgd3IaTMYXHfgQhUiANseoWHUuVgBNJpfOhP6ope1c
hVmOBEM1n+7RUertfR3lDXHEWisuejPRvopPUh1fUpIVrzMftLwBFn7ID4je
i1GURLl916e/H6DonJEo5Oa+liNOe36FCYGsROyPx+v7QIhVRWU5N3booYZ0
sK9jQFrTocHewc7BMS6rY/Cn3ECQE3LS09WDVgHjv18BZdH4jxucSAG6ekit
fuEDLtV6ZVxePx3odYYQqChfGwwKebq+7yfVOpqaMU+oQJ+dbWUgWavLh43j
zGHAWfJgbZ9nMkhd4ZREZSq2Ws3WmYM04YPANQVTPBJCo6ZwAX8c5HgydsoM
zTXWiuWQCR+FwJtB2/GXDTDB/3OZfabOAxtplxJM+Doss5Bjj8UyBoA+yd0S
F51Hb0+rsWihWLcARB464Sp/80g+B4pBnxSLS08UaoPBTRvzjwVI4shnwd+3
/qJhE51a8m2NLkw375vDy9rXGg4LUA9WJGHs29tg88vmpqSrSS5KFZiqnB9O
dJhFJ+c2fZKzUudgnsZU3dWeTjLF7X6D4lcptoFmSzLPivKRn7qzEMMen5qB
Hvtvz95oFYwTCRsqusJOnMRfzJFcxOdAzpCzaImohpcT776bdGvNUS8hofKp
TtWmpKfzKuRXG4/9TH2D3HXawxLL/RlKnAGFYgWHqGwdUDI98loIHa86yuHo
rLBTnyEM82ysObenkMpI9TMPFnh4RmNsrxqkTu14BMLR3R9BWeR3rCHeI5YV
KRJ3r+WqvIp/C+Gs+ti/m3wcxWLh2Ca/iWq++hdQzVf/Qqp5kJGJxLMC+a4m
6+fs3KPGVhr/eyim+pGKM++cnXl8xVOh0B6X2kwUQqN5E291pRKfGtw+oL6/
R1OoAuc5NvBYIvzDGgl9ruMdeZRqBdqbDE07lvzrahgToZb4nvqDDdrB1oaV
XtYv4SSD9s/38B/z4PVe8Ob1uhCgLuLsqGReAbZ71DPnHrDFnkfUpDPsBfZu
sZO9iiEDqDEv1ZcFKE3aQbWqpd5tBKy4kw0NN1S/vnsVGzpYWq4ssS2DLc+Z
boCKoe2KDWb6+O/NBr1nBzSB5xFa70goqnLrFx4F2p/minXufc0/8IhXPIEV
Do9gEvMIL6E5eLsf9o42gk9yoZixKb0UPtLB7zUZOWzYJ4D7BC8w0h9Rpf3J
s0n8E2WeyfDz5/1XA99QwQ99CUcZkB4eqDfZh8YQ8lj8T5gC8SOeq3M1zSNb
N8fzg5DnBxMpnbInpqBZ1Yuvq+eQK1XKG3iubT6cp1nx7/RNe4kz9TS4e7zP
0K/Z94wINonrlaWyiTZNfuS7ep6x3WLyqAw7qhwepOV1kkB0bN9JpNUezUh3
kiEudXl9p+hgekVlJJwR+OSsmwZFwQ83KxrrJcCQvM7abVWpe4Ox6kpghXzi
BggHYBNZxPpNN+QuxBlo0h3ZWpMxUL8NjBIuxBEWFx6IusYfMoDw3f5BrTy9
4wuy11VeNNVLovyXLe0UtLkyYog7t1kUns+jaXlipG+6gPQ6y8vZTaDw9icm
knlccnGnjE9lo42lj+b5VdwlNTNKsO6PLSrd5yp5mINFfM9sWH/qfBtKQx6e
9tfpk0Imbb5pK+u6hXcfXdaZrPd6upu1w5UKqEROAqdusXXYSy5yyiu3a1aO
b6bgRA2E0LCXx+3xp7LJJauisU1tKg/o0/YnekYz3aiqs35qQEOPQWOdDhPK
eOC5A/8OHDl17OoJ1Tsu7pPD3H69j7fI5vmGG9Iy+kLNQjPSX79x5D60r4fH
TAd55d608SiN5EGzWRWWkzh5ahreETC3akPbF9rO4ECv+tg/Hi2viOa4tg1s
Qpz1xNDNE6D+A+0Ik/FOxjgNMydq9cBIFl6lwDLHzvBhhMYH53la9XAsj31a
vZ/EiZe71XDiwhu0IJszeBaM6oylFl0jCJ7eFVazxH8abj//+m4KoSa/QRF+
wKAepb0R7RVvZNaKJmB7AQ3zrUGwTl1ANcX7fy8c0+0UHn/+8V1vr3+0j00+
9/s/fPx89uGzNd90SIdOFEmz4JO5IfsCqZLsLlMXoncEP/mT7eDobe91CN34
+7omBN0wcLD62hQ+l+Bc0FC/PkXyq0KS7DgPUQColKI42mPgwIC6WXSldQg8
VY+Hk1LMR8YTQ1Suf7wcsRRbZKW+E4pS82AnLsd8o2olOaOp7t5DSqpKSdQo
mMXTmWTp8/kjuQa0vFlILEBHNc19dyTNKSHOaIVMCz5dsTPCww3j03tUrwrB
FEapVkCrNLL1ORAB4fPHXox0/6dZBytcd8RgjT6D1hfxm7WBO6f+Pg0DwsAb
3D6+b26PFxirsPEoUfUYYBuRgnV4w1cn0L9Dv+II+70eYXaNdXNSQ6lilRQS
JVJ5qIO0Y8UWwVg1Zo0N22lYDzDNm6YIj//frcdvdx88AvBVBAv4cij2Ycvx
oKDLb1mVvp6GOzXz8L4VedzlZStX5OGfXoFThsLnA8G+X9yD6nU7SY93MGED
kC0rjpx3rrmzIyIw4pRjBsRjLol0Uo89Y+mzLuy30L/qyrZOaywVkpITIkuU
/r720TBUNjtGB8Tg9SfnwuSLtqsAkZw08gT/RatHrkfXeDrwptXjjus/9A96
YK3kyzQV0Ui35ModNHeN4K4ODrO/oRPQOI02au52bPLH1vsHxxt8qFe+cyxp
yzAevNEw0Wm5j4XKDdAfe3JBKEJPAVAsHUc5blzCFlcpiEasQWarMsVpU5F8
5mQaqxZg7D4WWBBALNMOW2+VLK9Y3Ki/A7SfnIvJL0RrsatEN3xbahTCqJ81
K/CCcO+SIV2RITVt0NEVUmY49DuVBZQbr42v7f2SLjRfPz1+vxGMZgrmS9ct
2kPKEylQY2oKVVx1dKTLpMSN+AJCqqKYSM12XA8uwqR9F3yxnb4ulTVAsV+E
stGZY0p628ypFfWEnZq2gV971SvDeivHxOJ0kkecHgmk6JRxva0SlDxurahZ
2/ir16J12wTNs9sPC5Ue93a/PzhubAAtWrcaXICJAKIBnbrBz5417ZBb7NkE
igvts2aooOcH55LStN7zWbWUssHtLd0TUCyHxsHs94S/eOtDUy5XsxI8+Mtj
D6uQ6PWosJD7ySR4dtU4k+aV9L7lc0B5+JCOPterdzyWsy70xzu6pLGgNg18
1euYqylmIhJS/7RivhaMh4DaQAgP68i3Y6iErqcDJvXgjg1U8aCOzcT8kIuY
cL8XD/nCoyjlVCsEllKKVZTSMxpA4a/b6B5KWTmlsSvDH9Fxxb42dQKQ6KTI
xVC51/YikHO6UEK/NPeW1orhuTd10x2ED2TywF+INcvk6oyVeNcPxw4esMWz
SgtgQQe2Dba4qo2B04RtRwXGG8aoMEAkAu5jTqX71AIN+L1wcViKygDWjc1Z
yPq6B4s17M9OvY89fdVcYU64m9LFbbqGU2t6diJtUXpIlUvpLADxGDovw6VO
bvTheBdUjgHA0HQnbJYr+6mC/SBR4E29Uhil1FTD6MQrZIhyGOxrNQz2T4+D
URK795l4AEgX42ehS3kEUt0f24JuXKs0bXSq2qi5GimphYe6W2hVNnNXrELv
uqScX9OhhMpkWCvD0Bhpl+hox7kNE3NDMuAuloOOxU1RqvnTwo4/XUbwxVIp
fcm7PuRoGbkELPim3rEupuKu6rA+NyrTJM+d0umdgE8pzigmljsGQhSQGYeZ
4KQh/vMf/13AWg9xyosZrHXbX0IEZs4F0nW5G3S9DhXe4F67ady5HziaItGW
DmrG/qrIUFjPfTWwoyRbjmXJObxHlVhQ1ugZWE3VfSo8qaDgIRYjQPbYrlLb
v3Z2FeWMYbfTpE1f3+gVHln6rNcehpVz1m53NBdsibwO5vXQFa8LWyuLg6QN
J5VUoM/tO8FEpExzGzUW484KDBPExWhJlI/8Jubrmgt9OzBWfSALzJ1H4N4o
pROh5eLTalEmtFhwe5I3oMIXfU/ieqFU8Ml7drH+hA68oi8SHeAbG5xTwa5S
7UNl29yiqqlJpBM/VkLheIo8SOxzC00RETjwrAZRf9/GT++FTTdG/6t/dBGb
roDUel9cOM1TA2WhwazCyI6Y+4CrOI0sWERH9spBW1K/HpUljYHoHajS4Tyu
2Q8E9rHnFtqcZUWJDAvYlXjHtdlbAC8YZl+w0ShasBuOqsnrwl4cRZ+D5knc
Dnh0jvEOW7tCpVcx2Npsq8rlu9obogOqOQmjYZ5dF+SlwcIWGN4HMYL8Aj1P
dHUAF2MpZCvrwzW6kbn82NlwxCq8ax7oJnPXKwQgN8bU5J4rPfiI6hnc6T0i
1S3WlRzxUi0p47kmrIwndShDrsktgwkpb2tirFbadILDSN8XJfzSyVdgtuBo
NKWHNq+wZb3ejuO00Xdh2U88IOoY/EB5jXLQr/BvW8PDffaQpHdDLwYBGzEi
inLTK+/8EzNAvjs0ce5W9Q52WQeTvmUpda4IY8FwLXYoX3/OVQCsg0vQiYev
WAbGvu/HrIIltJSKLJxn+s46vzQe30rGo/A2KisCgofhI218VSDSPG6/ZqyY
ooOwfOvRBp/9duqmjWsOVVNSGWhvfbjhokFWSNIs5TxjkVl3GjEfThrFJKNs
mZLyBgorlXywqUmoxgI4q+an9y/0oQMzqpiliHNS3LkKa6kKSUFBQN1pUkXN
+k24cSG96NwejYwkSpAMN7zlNsoJJvFUiwk2puLIjpG8CwpumowlILB6pUJk
DXgh/PbOcwkz0MmrRRZjpqDxY+u8q2uCyJ0lSXi8RtUTbXzvG+elSBTRprjV
0EylQMZLnZkm8dzmtsvUTnxJ0se77pI3bSOL4k3b+MpdH1Pc2L081z+JuXIr
VItmyDraixmbb0etbqFGGO/8sLsiAxOIGNwdbKCUNYk4PIwNVQuRCAuC8ZrR
6pbslGpsTvkwIybd5JFILgqkW9THmZfZJPYcrU3jB/U9WTDSjXuNJ3yPY+0s
JIjvD29s+SdWU2t15zicoAudsLTQWxdtL2G660QnG3o6rBfs67HF6c1+YNLB
qUYApxscAN1LzAEnFBGZgmr3icOG1nl8Uc314SOFWZJNb/SNhKBH3wa2i/F+
EAgV51Gr4eK2psvcqKUDpRnTyBRvzMp88No+fQlr5euMBPf5rSa8SksRKO5T
JsTKjFo4TZ0FadIxrSom2ihFLVAYFFj/KC6YKfl6A+5Jc0OQqBx06YWpZmvO
fGvhAqv+WuyrBkpq678kOJYGy8UYd7+Ep5xVU+mYuG8hLNdYY2Yvi1kmaY+f
YF5pPO7aIZ7sPH95sT4ry0Wx1+1OYXMthx3QYLu1ll2aVtGFDhsdbVIwZG6R
U86Wbrqgxbu+Q/g7Y9xa53dcwks8LXWwaqrAhYzwtperA7MdRuVohgoJJ0np
66FjTgDmgnPBvk1YT+jyzLC2fOZ+WoAQlA10FLhFrKnOodbCG4LPBxUPgWTZ
SneWNG69NFGU3HunXSeDx7e0M8LK6WiYya3p1dIUHUrFEw+UtvttR+NKoOQn
RfRTkC3usHZbBYMifE5wvLKCcpWLV69MLhGJhXmJr8M/MwA0bopsyMho2AIV
jvlWUls8t7kGhb3sxdFS24IoU5mEgSQyRD3ngfgzd30T6ubZlTJ6JTCS+Z7+
ow6AKEOIFC/1tnGFATHITYfRiA4w7I8MdESPrb/upRSgVeNv1yZRUqi1v0nV
U6nuETu1HmBQsmhlWU3diMOPQU9ybDj6i1dF8IEvEFeneMopOAGxCvtjHqVY
H/lIJYvJEu/1VmOEDfbFXOzTw3mcBCeSP9QO/jObpcErziqiRTlT81GGmmaE
x8T+L4g+PwY/pQAA

-->

</rfc>
