<?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-03" 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-03"/>
    <author initials="S. Q." surname="Dijkhuis" fullname="Sander Dijkhuis" role="editor">
      <organization>Cleverbase</organization>
      <address>
        <email>mail@sanderdijkhuis.nl</email>
      </address>
    </author>
    <date year="2024" month="December" day="23"/>
    <area>IRTF</area>
    <workgroup>Crypto Forum</workgroup>
    <keyword>KDF</keyword>
    <abstract>
      <?line 103?>

<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.</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 107?>

<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 confidentially stored, 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 key. The HDK acts as a blinding factor that enables blinding the device public key.</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|
                          +-+--+
                            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: <tt>(bf0, salt0) = hdk0 = HDK(seed, 0)</tt>. The HDK consists of a first blinding factor <tt>bf0</tt> and a first byte string <tt>salt0</tt> to derive next-level keys. Using <tt>bf0</tt> and the device key pair, the unit can compute blinded public and private keys and proofs of possession.</t>
          <t>The unit computes any Level <tt>n &gt; 0</tt> HDK from any other HDK <tt>(bf, salt)</tt> using the same deterministic function: <tt>(bf', salt') = hdk' = HDK(salt, index)</tt>. The function takes the previous-level <tt>salt</tt> as input, and an <tt>index</tt> starting at 0. 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"/>, but not the same since ARKG does not enable distributed proof of possession with deterministic hierarchies. This makes it difficult to implement with cryptographic devices that lack specific firmware support.</t>
          <t>To enable remote derivation of child HDKeys, the unit uses the parent HDKey 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 = (bf, salt)</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>ID</tt>: A domain separation tag, represented as a string of ASCII bytes.</t>
          </li>
          <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>H1(msg): Outputs <tt>Ns</tt> bytes.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>BL</tt>: An asymmetric key blinding scheme with opaque blinding factors and algebraic properties, consisting of the functions:
            </t>
            <ul spacing="normal">
              <li>
                <t>BL-Generate-Blinding-Key-Pair(): Outputs a blinding key pair <tt>(pk, sk)</tt>.</t>
              </li>
              <li>
                <t>BL-Derive-Blinding-Factor(msg, ctx): Outputs a blinding factor <tt>bf</tt> based on two byte string inputs, message <tt>msg</tt> and domain separation parameter <tt>ctx</tt>.</t>
              </li>
              <li>
                <t>BL-Blind-Public-Key(pk, bf): Outputs the result <tt>pk'</tt> of blinding <tt>pk</tt> with <tt>bf</tt>. This again is a blinding public key.</t>
              </li>
              <li>
                <t>BL-Blind-Private-Key(sk, bf): Outputs the result <tt>sk'</tt> of blinding <tt>sk</tt> with <tt>bf</tt>. This again is a blinding private key.</t>
              </li>
              <li>
                <t>BL-Combine-Blinding-Factors(bf1, bf2): Outputs a blinding factor <tt>bf</tt> such that for all blinding key pairs <tt>(pk, sk)</tt>:
                </t>
                <ul spacing="normal">
                  <li>
                    <t><tt>BL-Blind-Public-Key(pk, bf) == BL-Blind-Public-Key(BL-Blind-Public-Key(pk, bf1), bf2)</tt></t>
                  </li>
                  <li>
                    <t><tt>BL-Blind-Private-Key(pk, bf) == BL-Blind-Private-Key(BL-Blind-Private-Key(pk, bf1), bf2)</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>KEM</tt>: A key encapsulation mechanism, consisting of the functions:
            </t>
            <ul spacing="normal">
              <li>
                <t>KEM-Derive-Key-Pair(msg, ctx): Outputs a key encapsulation key pair <tt>(pk, sk)</tt>.</t>
              </li>
              <li>
                <t>KEM-Encaps(pk, ctx): 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> and domain separation parameter <tt>ctx</tt>, a byte string.</t>
              </li>
              <li>
                <t>KEM-Decaps(sk, c, ctx): Outputs shared secret <tt>k</tt>, taking key encapsulation private key <tt>sk</tt> and domain separation <tt>ctx</tt>, a byte string.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>Authenticate(sk_device, reader_data, bf)</tt>: Outputs <tt>device_data</tt> for use in a protocol for proof of possession, taking a BL blinding private key <tt>sk_device</tt>, remotely received <tt>reader_data</tt>, and a BL blinding factor <tt>bf</tt>.</t>
          </li>
        </ul>
        <t>An HDK instantiation <bcp14>MUST</bcp14> specify the instantiation of each of the above functions and values.</t>
        <t>An HDK instantiation <bcp14>MUST</bcp14> define Authenticate such that the <tt>device_data</tt> can be verified using the blinded public key <tt>pk = BL-Blind-Public-Key(sk, bf)</tt>. 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>
      </section>
      <section anchor="the-hdk-function">
        <name>The HDK function</name>
        <t>A local unit or a remote party deterministically computes an HDK from a salt and an index. 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:
- salt, a string of Ns bytes.
- index, an integer between 0 and 2^32-1 (inclusive).

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

def HDK(salt, index):
    msg = salt || I2OSP(index, 4)
    bf = BL-Derive-Blinding-Factor(msg, ID)
    salt' = H1(msg)
    return (bf, salt')
]]></artwork>
      </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
(pk_device, sk_device) = BL-Generate-Blinding-Key-Pair()
]]></artwork>
        <t>The unit <bcp14>MUST</bcp14> generate <tt>sk_device</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[
(bf, salt) = HDK(seed, index)

pk = BL-Blind-Public-Key( pk_device, bf) # optional
sk = BL-Blind-Private-Key(sk_device, bf) # optional
]]></artwork>
        <t>Now the unit can use the blinded key pair <tt>(pk, sk)</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 = (bf, salt)</tt> with blinded key pair <tt>(pk, sk)</tt> at level <tt>n</tt>, the unit computes:</t>
        <artwork><![CDATA[
(bf', salt') = HDK(salt, index)

pk' = BL-Blind-Public-Key( pk, bf') # optional
sk' = BL-Blind-Private-Key(sk, bf') # optional
]]></artwork>
        <t>Now the unit can use the blinded key pair <tt>(pk', sk')</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 blinding key pair <tt>(pk, sk)</tt> generated using the local HDK procedure.</t>
        <artwork><![CDATA[
# 1. Unit computes:
(pk_kem, sk_kem) = KEM-Derive-Key-Pair(salt, ID)

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

# 3. Issuer computes:
(salt, kh) = KEM-Encaps(pk_kem, ID)

# 4. Issuer shares with unit: kh

# Subsequently, for any index known to both parties:

# 5. Issuer computes:
(bf, salt') = HDK(salt, index)
pk' = BL-Blind-Public-Key(pk, bf)

# 6. Issuer shares with unit: pk'

# 7. Unit verifies integrity:
salt' = KEM-Decaps(sk_kem, kh, ID)
(bf, salt'') = HDK(salt', index)
pk' == BL-Blind-Public-Key(pk, bf)

# 8. Unit computes:
sk' = BL-Blind-Private-Key(sk, bf)
]]></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="combining-blinding-factors">
        <name>Combining blinding factors</name>
        <t>A unit <bcp14>MUST</bcp14> not 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 unit needs to combine parent blinding factor <tt>bf1</tt> with child blinding factor <tt>bf2</tt> before blinding the parent private key <tt>sk</tt>:</t>
        <artwork><![CDATA[
bf = BL-Combine-Blinding-Factors(bf1, bf2)
]]></artwork>
        <t>Subsequently, the unit can apply the Authenticate function to the parent blinding key. The unit can combine multiple blinding factors in the HDK path.</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 BL-Combine-Blinding-Factors to obtain values to compute this association.</t>
      </section>
    </section>
    <section anchor="generic-hdk-instantiations">
      <name>Generic HDK instantiations</name>
      <section anchor="using-elliptic-curves">
        <name>Using elliptic curves</name>
        <t>Instantiations of HDK using elliptic curves require the following cryptographic constructs:</t>
        <ul spacing="normal">
          <li>
            <t><tt>EC</tt>: An elliptic curve with elements of type Element and scalars of type Scalar, consisting of the functions:
            </t>
            <ul spacing="normal">
              <li>
                <t>EC-Random(): Outputs a random Scalar <tt>k</tt>.</t>
              </li>
              <li>
                <t>EC-Add(A, B): Outputs the sum between Elements <tt>A</tt> and <tt>B</tt>.</t>
              </li>
              <li>
                <t>EC-Scalar-Mult(A, k): Outputs the scalar multiplication between Element <tt>A</tt> and Scalar <tt>k</tt>.</t>
              </li>
              <li>
                <t>EC-Scalar-Base-Mult(k): Outputs the scalar multiplication between the base Element and Scalar <tt>k</tt>.</t>
              </li>
              <li>
                <t>EC-Order(): Outputs the order of the base Element.</t>
              </li>
              <li>
                <t>EC-Serialize-Element(A): Outputs a byte string representing Element <tt>A</tt>.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>H2C</tt>: A hash-to-curve suite <xref target="RFC9380"/> for EC, providing the function:
            </t>
            <ul spacing="normal">
              <li>
                <t>hash_to_field(msg, count): Outputs <tt>count</tt> EC Elements based on the result of cryptographically hashing <tt>msg</tt> (see <xref target="RFC9380"/>, Section 5.2).</t>
              </li>
            </ul>
          </li>
        </ul>
        <artwork><![CDATA[
def BL-Generate-Blinding-Key-Pair():
    sk = EC-Random()
    pk = EC-Scalar-Base-Mult(sk)
    return (pk, sk)

def BL-Derive-Blinding-Factor(msg, ctx):
    bf = hash_to_field(msg, count) with the parameters:
        DST: ID || ctx
        F: GF(EC-Order()), the scalar field
            of the prime order subgroup of EC
        p: EC-Order()
        m: 1
        L: as defined in H2C
        expand_message: as defined in H2C
    return bf
]]></artwork>
      </section>
      <section anchor="using-ec-multiplicative-blinding">
        <name>Using EC multiplicative blinding</name>
        <t>Such instantations of HDK use elliptic curves (see <xref target="using-elliptic-curves">Using elliptic curves</xref>) and instantiate the following:</t>
        <artwork><![CDATA[
def BL-Blind-Public-Key(pk, bf):
    pk' = EC-Scalar-Mult(pk, bf)
    return pk

def BL-Blind-Private-Key(sk, bf):
    sk' = sk * bf mod EC-Order()
    return sk

def BL-Combine-Blinding-Factors(bf1, bf2):
    bf = bf1 * bf2 mod EC-Order()
    return bf
]]></artwork>
      </section>
      <section anchor="using-ec-additive-blinding">
        <name>Using EC additive blinding</name>
        <t>Such instantations of HDK use elliptic curves (see <xref target="using-elliptic-curves">Using elliptic curves</xref>) and instantiate the following:</t>
        <artwork><![CDATA[
def BL-Blind-Public-Key(pk, bf):
    pk' = EC-Add(pk, EC-Scalar-Base-Mult(bf))
    return pk

def BL-Blind-Private-Key(sk, bf):
    sk' = sk + bf mod EC-Order()
    return sk

def BL-Combine-Blinding-Factors(bf1, bf2):
    bf = bf1 + bf2 mod EC-Order()
    return bf
]]></artwork>
      </section>
      <section anchor="using-ecdh-shared-secrets">
        <name>Using ECDH shared secrets</name>
        <t>Such instantiations of HDK use EC multiplicative blinding (see <xref target="using-ec-multiplicative-blinding">Using EC multiplicative blinding</xref>) and require the following cryptographic construct:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ECDH</tt>: An Elliptic Curve Key Agreement Algorithm - Diffie-Hellman (ECKA-DH) <xref target="TR03111"/> with elliptic curve <tt>EC</tt>, consisting of the functions:
            </t>
            <ul spacing="normal">
              <li>
                <t>ECDH-Create-Shared-Secret(sk_self, pk_other): Outputs a shared secret byte string representing an Element.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>In such instantiations, the reader provides an ephemeral public key <tt>reader_data</tt>. The Authenticate function returns shared secret <tt>device_data</tt> consisting of a binary encoded x-coordinate <tt>Z_AB</tt> of an ECDH operation with the blinded private key. Subsequently, the unit creates a message authentication code (MAC), such as in ECDH-MAC authentication defined in <xref target="ISO18013-5"/>. The reader verifies this MAC by performing an ECDH operation with its ephemeral private key and the blinded public key.</t>
        <t>These instantiations instantiate the following:</t>
        <artwork><![CDATA[
def Authenticate(sk_device, reader_data, bf):
    P' = EC-Scalar-Mult(reader_data, bf)

    # Compute Z_AB within the secure cryptographic device.
    Z_AB = ECDH-Create-Shared-Secret(sk_device, P')

    return Z_AB
]]></artwork>
      </section>
      <section anchor="using-ec-digital-signatures">
        <name>Using EC digital signatures</name>
        <t>Such instantiations of HDK use EC additive blinding (see <xref target="using-ec-additive-blinding">Using EC additive blinding</xref>) and require the following cryptographic construct:</t>
        <ul spacing="normal">
          <li>
            <t><tt>DSA</tt>: An EC digital signature algorithm , consisting of the functions:
            </t>
            <ul spacing="normal">
              <li>
                <t>DSA-Sign(sk, msg): Outputs the signature <tt>(c, r)</tt> created using private signing key <tt>sk</tt> over byte string <tt>msg</tt>.</t>
              </li>
              <li>
                <t>DSA-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>
              <li>
                <t>DSA-Serialize(c, r): Outputs the byte array serialization of the signature <tt>(c, r)</tt>.</t>
              </li>
              <li>
                <t>DSA-Deserialize(bytes): Outputs the signature <tt>(c, r)</tt> represented by byte string <tt>bytes</tt>.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>The reader is expected to create an input byte string <tt>reader_data</tt> with sufficient entropy for each challenge.</t>
        <t>The reader is expected to verify the proof <tt>device_data</tt> using DSA-Verify with the blinded public key.</t>
      </section>
      <section anchor="using-ec-sdsa-signatures">
        <name>Using EC-SDSA signatures</name>
        <t>Such instantiations of HDK use EC digital signatures (see <xref target="using-ec-digital-signatures">Using EC digital signatures</xref>) and EC digital and instantiate the following:</t>
        <ul spacing="normal">
          <li>
            <t><tt>DSA</tt>: An EC-SDSA (Schnorr) digital signature algorithm <xref target="TR03111"/>.</t>
          </li>
        </ul>
        <artwork><![CDATA[
def Authenticate(sk_device, reader_data, bf):
    # Compute signature within the secure cryptographic device.
    signature = DSA-Sign(sk_device, reader_data)

    (c, s) = DSA-Deserialize(proof)
    s' = s + c * bf mod EC-Order()
    device_data = DSA-Serialize(c, s')
    return device_data
]]></artwork>
      </section>
      <section anchor="using-ecdsa-signatures">
        <name>Using ECDSA signatures</name>
        <t>Such instantiations of HDK use EC digital signatures (see <xref target="using-ec-digital-signatures">Using EC digital signatures</xref>) and instantiate the following:</t>
        <ul spacing="normal">
          <li>
            <t><tt>DSA</tt>: An ECDSA digital signature algorithm <xref target="TR03111"/>.</t>
          </li>
        </ul>
        <artwork><![CDATA[
def Authenticate(sk_device, reader_data, bf):
    # Blind private key and create signature
    # within the secure cryptographic device.
    sk' = BL-Blind-Private-Key(sk_device, bf)
    device_data = DSA-Sign(sk', reader_data)
    return device_data
]]></artwork>
        <t>Due to potential patent claims, this document does not specify an instantiation with multi-party ECDSA signing, even though this would be theoretically possible using EC multiplicative blinding.</t>
      </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>This instantiation uses ECDH for proof of possession (see <xref target="using-ecdh-shared-secrets">Using ECDH shared secrets</xref>) and for <tt>KEM</tt>.</t>
        <ul spacing="normal">
          <li>
            <t><tt>ID</tt>: <tt>"HDK-ECDH-P256-v1"</tt></t>
          </li>
          <li>
            <t><tt>Ns</tt>: 32</t>
          </li>
          <li>
            <t><tt>H</tt>: SHA-256 <xref target="FIPS180-4"/> with:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>H1(msg)</tt>: Implemented by computing <tt>H(ID || msg)</tt>.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>EC</tt>: The NIST curve <tt>secp256r1</tt> (P-256) <xref target="SEC2"/></t>
          </li>
          <li>
            <t><tt>ECDH</tt>: ECKA-DH with curve <tt>EC</tt></t>
          </li>
          <li>
            <t><tt>KEM</tt>: ECKA-DH with curve <tt>EC</tt></t>
          </li>
        </ul>
      </section>
      <section anchor="hdk-ecdsa-p256">
        <name>HDK-ECDSA-P256</name>
        <t>This instantiation uses ECDSA for proof of possession (see <xref target="using-ecdsa-signatures">Using ECDSA signatures</xref>) and ECDH for <tt>KEM</tt>.</t>
        <ul spacing="normal">
          <li>
            <t><tt>ID</tt>: <tt>"HDK-ECSDSA-P256-v1"</tt></t>
          </li>
          <li>
            <t><tt>Ns</tt>: 32</t>
          </li>
          <li>
            <t><tt>H</tt>: SHA-256 <xref target="FIPS180-4"/> with:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>H1(msg)</tt>: Implemented by computing <tt>H(ID || msg)</tt>.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>EC</tt>: The NIST curve <tt>secp256r1</tt> (P-256) <xref target="SEC2"/></t>
          </li>
          <li>
            <t><tt>DSA</tt>: ECDSA with curve <tt>EC</tt>.</t>
          </li>
          <li>
            <t><tt>KEM</tt>: ECKA-DH with curve <tt>EC</tt></t>
          </li>
        </ul>
      </section>
      <section anchor="hdk-ecsdsa-p256">
        <name>HDK-ECSDSA-P256</name>
        <t>This instantiation uses EC-SDSA for proof of possession (see <xref target="using-ec-sdsa-signatures">Using EC-SDSA signatures</xref>) and ECDH for <tt>KEM</tt>.</t>
        <ul spacing="normal">
          <li>
            <t><tt>ID</tt>: <tt>"HDK-ECSDSA-P256-v1"</tt></t>
          </li>
          <li>
            <t><tt>Ns</tt>: 32</t>
          </li>
          <li>
            <t><tt>H</tt>: SHA-256 <xref target="FIPS180-4"/> with:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>H1(msg)</tt>: Implemented by computing <tt>H(ID || msg)</tt>.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>EC</tt>: The NIST curve <tt>secp256r1</tt> (P-256) <xref target="SEC2"/></t>
          </li>
          <li>
            <t><tt>DSA</tt>: EC-SDSA-opt (the optimised EC-SDSA) with curve <tt>EC</tt>.</t>
          </li>
          <li>
            <t><tt>KEM</tt>: ECKA-DH with curve <tt>EC</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>(pk_device, sk_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-P256 (see <xref target="hdk-ecdsa-p256"/>):
            </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="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="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="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="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="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="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>
      </references>
    </references>
    <?line 666?>

<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:
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
gyqJAAA=

-->

</rfc>
