<?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.18 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-dijkhuis-cfrg-hdkeys-02" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.22.0 -->
  <front>
    <title abbrev="HDK">Hierarchical Deterministic Keys</title>
    <seriesInfo name="Internet-Draft" value="draft-dijkhuis-cfrg-hdkeys-02"/>
    <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="21"/>
    <area>IRTF</area>
    <workgroup>Crypto Forum</workgroup>
    <keyword>KDF</keyword>
    <abstract>
      <?line 117?>

<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 121?>

<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:
(bf, salt') = HDK(salt, index)
pk' == BL-Blind-Public-Key(pk, bf)

# 8. Unit computes:
sk' = BL-Blind-Private-Key(sk, bf)
]]></artwork>
        <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 HDK algorithm can support any of the following WSCD architectures:</t>
        <ol spacing="normal" type="1"><li>
            <t>Local external standalone device, for example:
            </t>
            <ul spacing="normal">
              <li>
                <t>GlobalPlatform secure element, running for example a Java Card applet as WSCA for:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>Personal Identity Verification (PIV)</t>
                  </li>
                  <li>
                    <t>Fast IDentity Online 2 (FIDO2)</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>Local internal standalone programmable cryptographic chip, for example:
            </t>
            <ul spacing="normal">
              <li>
                <t>Smartphone embedded universal integrated circuit card (eUICC), running for example a Subscriber Identity Module (SIM) as WSCA; also called eSIM</t>
              </li>
              <li>
                <t>Smartphone embedded secure element (eSE), running for example a Java Card applet as WSCA</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Local internal preprogammed security platform, for example:
            </t>
            <ul spacing="normal">
              <li>
                <t>Android trusted execution environment acting as WSCA</t>
              </li>
              <li>
                <t>Android StrongBox secure element acting as WSCA</t>
              </li>
              <li>
                <t>iOS Secure Enclave system-on-chip acting as WSCA</t>
              </li>
              <li>
                <t>Trusted Platform Module (TPM) acting as WSCA</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Remote HSM, for example:
            </t>
            <ul spacing="normal">
              <li>
                <t>Cryptographic module certified against EN 419221-5:2018 with a local client application providing a WSCA service, remotely controlled for example using:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>PIV card as possession factor and PIN verification using a HSM-backed Device-Enhanced Augmented PAKE (an approach proposed by Sweden)</t>
                  </li>
                  <li>
                    <t>Android/iOS security platform or standalone device, applying asymmetric cryptography to enable detection of remote HSM corruption as described in <xref target="SCAL3"/></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
        </ol>
        <t>In all cases, the WSCD may implement a Cryptographic Service Provider <xref target="TR03181"/> to reduce the scope for Common Criteria certification of the WSCA.</t>
        <t>The solution proposal discussed herein works in all four WSCD architectures that support the required cryptographic primitives within the WSCD:</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>
        <t>If the user enters the PIN in the WI instead of on the WSCD directly, the WI <bcp14>MUST</bcp14> process it directly after entering, the WI <bcp14>MUST</bcp14> keep the plaintext PIN confidential, and the WI <bcp14>MUST</bcp14> delete the PIN from memory as soon as the encrypted PIN or data derived from the PIN is passed over the SCI.</t>
        <t>The rate-limiting of the PIN check <bcp14>MUST</bcp14> be managed within the WSCD or on securely managed SCI infrastructure. In particular, the rate-limiting <bcp14>MUST NOT</bcp14> be managed solely in local WI or WSCA agent software since it is assumed that attackers could modify this without detection.</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="SCAL3" target="https://github.com/cleverbase/scal3">
          <front>
            <title>SCAL3: Verify that systems operate under your sole control, version de8c5ae</title>
            <author>
              <organization>Cleverbase ID B.V.</organization>
            </author>
            <date year="2024" month="March"/>
          </front>
        </reference>
        <reference anchor="TR03181" target="https://www.bsi.bund.de/EN/Themen/Unternehmen-und-Organisationen/Standards-und-Zertifizierung/Technische-Richtlinien/TR-nach-Thema-sortiert/tr03181/TR-03181_node.html">
          <front>
            <title>Cryptographic Service Provider 2 (CSP2)</title>
            <author>
              <organization>Federal Office for Information Security (BSI)</organization>
            </author>
            <date year="2023" month="April"/>
          </front>
          <seriesInfo name="BSI" value="TR-03181 Version 0.94"/>
        </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 702?>

<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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
mXIY7Bs9UyeXFypKE7+WWgMAaeLcKlicxUJq2+O3oBt3Sl04narTqxxYNeJ2
CWqVzRVt15jTKOUbb5ZJqtuTYa0Mz4SQdon+NJzbjOvcI54Ad4mcdeGbk56Y
uv9FFcKIpdb2+o3EMn7HyOW8I5fMj222p7+qs+7cKLldnnu1W0aKMoUpxutt
I4oXkRWKTkPSEP/z3/7DwFrTfZvrJaz1sLmECMyKK7TYfFyshDLTeLdG5w4I
r1A/1QUwpYeauLkq0hUWlNkMbJTmVSxLzmdb6eAf3YomM6g1Vf+p8CRDMWPM
nkX2OGxT2193di3ljGGvp0mbvrvRWzyybLJeSycolSlF12+O5kJ96nWEhUmo
1vq6jtDxCameA7Ba2bMeXql4Zy873zvXLmNPJB04nreCs2R8+VPAPNuDkZTl
dryHL09IkblY69i7K4K89IH6Ic1nYXqZhiXd8yFCVLJya/PUv2QiVP8QXofq
FC/rRQTBAoCUIQTO3UVMQdscgsX8yTdrwBz6add++wpMBXVxJt+9z6gK/1jt
vLo4ez/eHYzt3NwW9uYm0nFFjKEVt14m675JT1agBtHWU3gzYYx8r8oSvFRN
BlmwuIySIqooXRsvJtafLk5PdzchBXM9qOh+Uc/4bR5XKWrLF293LZL+Bxen
FRGi4dVmoJrLARBMzjeOv2lRBocd7K0x5psvAGl2DNprQgR9GDvJ4gKrN9I1
zwi2O6yks+sEDGXOKuYTHnbgRssJmdMv86/tSfU1St5PrOZ/nkUpVtJkBh/k
WYCr2tvqowDnqNmi/+Mlor/Z4pkt36leT972TblpR6y4q9rfYdnR+Tv17ODF
eHxANxYfHFnXgCgOInk906LOWg5bcsWVexDXVCp1Bewak3ez3l8XPzFdotej
10lxefGu6UqwVZBhxgFetgL9s3IcnGdLZKCxOqkW4rW8PPnxXO3wOQX25GGJ
oVwEwuQGbzR1G1hWeQ8XrkNQKDB7mBExV14SVwTJ279UEteWA9ZWCuDBb7ds
VPeyWlvfT/PWC7pe8QtLALraxJ0kI/6Jek9dCji8727Cz3KnIV3OVWi8skvy
mS1/P+VjJ6cwdYwkW1Jp3tCACy5M390FxGjFkqeJiSpSd1DJTPiyHGPvZpnj
LZBd1s+eLCsvOJ9O7p1onxVCPxUpZV6wFTuk6HBLO24EjMTx3nj2ZefxMr7i
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

-->

</rfc>
