<?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-01" 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-01"/>
    <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="October" day="17"/>
    <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 (HDKs). 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 HDKs, only a seed string needs to be securely stored, associated with the device private key. Each HDK is then deterministically defined by a path of self-generated indices or provided key handles. Such a path can efficiently be stored and requires less confidentiality than the seed.</t>
      <t>To prove possession of many HDKs, 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 scheme, 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) solution instances. One solution instance 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-keys-algorithm">
      <name>The Hierarchical Deterministic Keys algorithm</name>
      <t>An HDK instantiation applies local key derivation to create many key pairs from a single seed value. It applies asynchronous remote key generation to enable providers to derive more key pairs. Additionally, an HDK instantiation applies these key pairs to blind a single key pair and proofs of its possession, such as required in <xref target="RFC7800"/>.</t>
      <t>Solutions <bcp14>MAY</bcp14> omit application of the asynchronous remote key generation functionality. In this case, a solution instance can only derive keys locally.</t>
      <section anchor="introductory-examples">
        <name>Introductory examples</name>
        <section anchor="local-key-derivation-example">
          <name>Local key derivation example</name>
          <t>The following example illustrates the use of key derivation. An HDK tree is defined by an initial public key and a seed value, which is a byte array containing sufficient entropy. Now tree nodes are constructed as follows.</t>
          <artwork><![CDATA[
              +------------------------+
              |Confidential static data|
              |+---------+ +----+      |
              ||pk_device| |seed|      |
              |+----+----+ +--+-+      |
              +-----+---------+--------+
  +-----------------+---------+---------------------------+
  |Level 0          v         v                           |
  |+-----------------------------------------------------+|
  ||(pk0, sdk0, salt0) = hdk0 = HDK-Root(pk_device, seed)||
  |+----+------------------------------------------------+|
  +-----+-------------------------------------------------+
Level 1 v
+-------------------------++-----------------++-----------------+
|(pk1, sk1, salt1) =      ||HDK-Derive-Local(||HDK-Derive-Local(|
|HDK-Derive-Local(hdk0, 0)||    hdk0, 1)     ||    hdk0, 2)     |
+-----------+--------+----++-----------------++-----------------+
            |        +---------------+
            |                        |
+-----------+------------------------+--------------------+
|Level 2    v                        v                    |
|+-----------------------++-----------------------+       |
||HDK-Derive-Local(      ||HDK-Derive-Local(      |       |
||    (pk1,sk1,salt1), 0)||    (pk1,sk1,salt1), 1)|       |
|+-----------------------++-----------------------+       |
+---------------------------------------------------------+
]]></artwork>
          <t>The solution instance computes the Level 0 HDK at the root node using a deterministic function called HDK-Root. The HDK consists of a key pair <tt>(pk0, sk0)</tt>, and a byte string <tt>salt0</tt> to derive next-level keys.</t>
          <t>The solution instance computes the Level <tt>n &gt; 0</tt> value is using a deterministic function called HDK-Derive-Local. The function takes the previous-level salt as input, and a sequence number <tt>i</tt> starting at 0. The function returns a new HDK as output.</t>
        </section>
        <section anchor="remote-key-derivation-example">
          <name>Remote key derivation example</name>
          <t>Instead of a locally generated index, an HDK can also be derived using a key handle as per Asynchronous Remote Key Generation (ARKG) <xref target="I-D.draft-bradleylundberg-cfrg-arkg-02"/>. To enable ARKG, the solution instance uses HDK-Seed-Remote and provides the output public key to an issuer. The issuer returns a key handle, using which the solution instance can derive a next-level key pair and seed using HDK-Derive-Remote.</t>
          <t>Locally derived parents can have remotely derived children. Remotely derived parents can have locally derived children.</t>
        </section>
        <section anchor="blinding-example">
          <name>Blinding example</name>
          <t>The next concept to illustrate is blinding. Blinding enables a solution instance to prove possession of a private key without disclosing the directly associated public key. This way, solutions can avoid linkability across readers of a document that is released with proof of possession.</t>
          <t>In this example, a document is issued in such a way that it can be presented with proof of possession using <tt>pk</tt> as derived using HDK. The solution instance applies the HDK-Authenticate function to the associated <tt>sk</tt> along with the device private key <tt>sk_device</tt> and reader-provided <tt>reader_data</tt>. The output is <tt>device_data</tt>, which the solution instance can subsequently use to prove possession to the reader. The reader does not need to be aware that HDK was used.</t>
          <artwork><![CDATA[
In secure
cryptographic
device
+-----------+
|sk_device  +-------------+
+-----------+             |
-------------             |
HDK in                    |
solution                  |
instance                  v        +-----------+
+-----------+    HDK-Authenticate->|device_data|
|pk         |       ^     ^        +-----------+
+-----------+       |     |
+-----------+       |     |
|sk         +-------+     |
+-----------+             |
-------------             |
+-----------+             |
|reader_data+-------------+
+-----------+
]]></artwork>
          <t>Blinding methods can be constructed such that the secure cryptographic device does not need to be designed for it. In such cases, <tt>sk_device</tt> does not contain the value of the private device key but a reference to it.</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>Nk</tt>: The amount of bytes needed to create a uniformly random key. Note that <tt>Nk</tt> usually needs to be higher than the size of the key space, for example to maintain uniform distribution when deriving RNG({1,2,...,n-1}) from RNG({0,1,2,...,2^k-1}) for <tt>k=8*Nk</tt> and <tt>2^k &gt;= n</tt> as per <xref target="TR03111"/> Section 4.1.1 Algorithm 2.</t>
          </li>
          <li>
            <t><tt>Ns</tt>: The amount of bytes of a salt value with sufficient entropy.</t>
          </li>
          <li>
            <t><tt>key(bytes)</tt>: Deterministically outputs a key pair <tt>(pk, sk)</tt> from a uniformly random string of <tt>Nk</tt> bytes.</t>
          </li>
          <li>
            <t><tt>serialize(pk)</tt>: Serializes a public key <tt>pk</tt> to a fixed-size string.</t>
          </li>
          <li>
            <t><tt>expand(msg, DST, L)</tt>: Outputs a uniformly random string of <tt>L</tt> bytes using a cryptographic hash or extendable-output function and input byte strings <tt>msg</tt> and <tt>DST</tt>.</t>
          </li>
          <li>
            <t><tt>BL</tt>: An asymmetric key blinding scheme <xref target="I-D.draft-bradleylundberg-cfrg-arkg-02"/>, consisting of the functions:
            </t>
            <ul spacing="normal">
              <li>
                <t>BL-Blind-Public-Key(pk, tau, info): Outputs <tt>pk</tt> blinded with blinding factor <tt>tau</tt> and domain separation parameter <tt>info</tt>, both byte strings.</t>
              </li>
              <li>
                <t>BL-Blind-Private-Key(sk, tau, info): Outputs <tt>sk</tt> blinded with blinding factor <tt>tau</tt> and domain separation parameter <tt>info</tt>, both byte strings.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>ARKG</tt>: An asynchronous remote key generation instantiation <xref target="I-D.draft-bradleylundberg-cfrg-arkg-02"/>, encapsulating an asymmetric key blinding scheme instantiation <tt>BL</tt> and a key encapsulation mechanism <tt>KEM</tt>, and consisting of the functions:
            </t>
            <ul spacing="normal">
              <li>
                <t>ARKG-Derive-Public-Key(pk, info): Outputs <tt>(pk', kh)</tt> where <tt>pk'</tt> is a derived public key and <tt>kh</tt> is a key handle to derive the associated private key, based on an ARKG public seed <tt>pk = (pk_kem, pk_bl)</tt> and application-specific information <tt>info</tt>.</t>
              </li>
              <li>
                <t>ARKG-Derive-Private-Key(sk, kh, info): Outputs <tt>sk'</tt>, a blinded private key based on ARKG private seed <tt>sk = (sk_kem, sk_bl)</tt>, a key handle <tt>kh</tt>, and application-specific information <tt>info</tt>.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>HDK-Root(pk_device, seed)</tt>: See <xref target="the-hdk-root-function">The HDK-Root function</xref>.</t>
          </li>
          <li>
            <t><tt>HDK-Derive-Remote(pk_device, (pk, sk, salt), kh)</tt>: See <xref target="the-hdk-derive-remote-function">The HDK-Derive-Remote function</xref>.</t>
          </li>
          <li>
            <t><tt>HDK-Authenticate(sk_device, sk_hdk, reader_data)</tt>: See <xref target="the-hdk-authenticate-function">The HDK-Authenticate function</xref>.</t>
          </li>
        </ul>
        <t>A concrete HDK instantiation <bcp14>MUST</bcp14> specify the instantiation of each of the above functions and values.</t>
      </section>
      <section anchor="the-hdk-root-function">
        <name>The HDK-Root function</name>
        <t>A solution instance creates a root HDK using a seed and a device public key. The generation of the seed is out of scope for this specification.</t>
        <artwork><![CDATA[
Inputs:
- pk_device, a device public key.
- seed, a string of Ns bytes.

Outputs:
- pk, the root public key.
- sk, the root private key.
- salt, the root salt.

def HDK-Root(pk_device, seed)
]]></artwork>
      </section>
      <section anchor="the-hdk-derive-local-function">
        <name>The HDK-Derive-Local function</name>
        <t>A solution instance derives a key pair and a salt from an HDK and an index.</t>
        <artwork><![CDATA[
Inputs:
- pk, a public key.
- sk, a private key.
- salt, a string of Ns bytes.
- index, an integer between 0 and 2^32-1 (inclusive).

Outputs:
- pk', the next-level public key at the provided index.
- sk', the next-level private key at the provided index.
- salt', the next-level salt at the provided index.

def HDK-Derive-Local((pk, sk, salt), index):
    msg = serialize(pk) || I2OSP(index, 4)
    okm = expand(msg, ID || salt, Nk + Ns)
    tau = okm[0:Nk]
    info = "HDK-Derive-Local"
    sk' = BL-Blind-Private-Key(sk, tau, info)
    pk' = BL-Blind-Public-Key(pk, tau, info)
    salt' = okm[Nk:]
    return (pk', sk', salt')
]]></artwork>
      </section>
      <section anchor="the-hdk-seed-remote-function">
        <name>The HDK-Seed-Remote function</name>
        <t>A solution instance derives an ARKG seed from an HDK.</t>
        <artwork><![CDATA[
Inputs:
- pk, a public key.
- sk, a private key.
- salt, a string of Ns bytes.

Outputs:
- pk', an ARKG public seed.
- sk', an ARKG private seed.

def HDK-Seed-Remote((pk, sk, salt)):
    okm = expand("seed", ID || salt, Nk)
    (pk_kem, sk_kem) = key(okm)
    pk_bl = pk
    sk_bl = sk
    return ((pk_kem, pk_bl), (sk_kem, sk_bl))
]]></artwork>
        <t>Given an ARKG public seed <tt>pk</tt>, an issuer can derive an ARKG key handle <tt>kh</tt> and blinded public key <tt>pk'</tt> using:</t>
        <artwork><![CDATA[
(pk', kh) = ARKG-Derive-Public-Key(pk, "")
]]></artwork>
      </section>
      <section anchor="the-hdk-derive-remote-function">
        <name>The HDK-Derive-Remote function</name>
        <t>A solution instance derives a key pair and a salt from an HDK and an ARKG key handle.</t>
        <artwork><![CDATA[
Inputs:
- pk_device, the device public key.
- pk, a public key.
- sk, a private key.
- salt, a string of Ns bytes.
- kh, an ARKG key handle.

Outputs:
- pk', the next-level public key for the provided key handle.
- sk', the next-level private key for the provided key handle.
- salt', the next-level salt for the provided key handle.

def HDK-Derive-Remote(pk_device, (pk, sk, salt), kh)
]]></artwork>
      </section>
      <section anchor="the-hdk-authenticate-function">
        <name>The HDK-Authenticate function</name>
        <t>A solution instance authenticates the device by creating a blinded proof applying the device private key and an HDK private key. This yields device data which it can use to prove possession of the device-bound document. The application-specific data for proof of possession is out of scope for HDK.</t>
        <artwork><![CDATA[
Inputs:
- sk_device, a (reference to a) device private key.
- sk_hdk, an HDK private key.
- reader_data, a byte string of solution instance-specific data.

Outputs:
- device_data, a byte string of device data for proving possession.

def HDK-Authenticate(sk_device, sk_hdk, reader_data)
]]></artwork>
        <t>Implementations of this function typically perform pre-processing on the <tt>reader_data</tt>, invoke the device key operation on the result, and perform post-processing on the output.</t>
        <t>A HDK instantiation <bcp14>MUST</bcp14> define HDK-Authenticate such that the <tt>device_data</tt> can be verified using the public key in the same HDK as <tt>sk_hdk</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-export-blinding-factor-function">
        <name>The HDK-Export-Blinding-Factor function</name>
        <t>When presenting multiple documents, a reader could 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"/>.</t>
        <t>For example, a solution instance could prove that 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 device public key <tt>D</tt>, are associated using a zero-knowledge protocol. In this protocol, the solution instance proves that they know the discrete logarithm of <tt>B2 = [bf2/bf1]B1</tt> with respect to generator <tt>B1</tt>.</t>
        <t>The construction of proof of association protocols requires availability to the prover of the blinding factors. The following function enables exporting these blinding factors.</t>
        <artwork><![CDATA[
Inputs:
- pk, an HDK public key.
- sk, an HDK private key.
- salt, an HDK salt which is a string of Ns bytes.

Outputs:
- bf, an HDK private key which is used as a blinding factor.

def HDK-Export-Blinding-Factor((pk, sk, salt)):
    bf = sk
    return bf
]]></artwork>
        <t>Implementations <bcp14>SHOULD</bcp14> use a plausibly deniable proof of association protocol to ensure that the interactive presentation does not accidentally generate evidence that is potentially non-repudiable.</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 requires the following cryptographic construct:</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-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>
        </ul>
        <t>These instantiations instantiate the following:</t>
        <artwork><![CDATA[
def serialize(pk):
    return EC-Serialize-Element(pk)

def key(bytes):
    sk' = OS2IP(bytes) mod (EC-Order() - 1)
    sk = sk' + 1
    pk = EC-Scalar-Base-Mult(sk)
    return (pk, sk)
]]></artwork>
      </section>
      <section anchor="using-ecdh-message-authentication-codes-for-proof-of-possession">
        <name>Using ECDH message authentication codes for proof of possession</name>
        <t>Such instantiations of HDK use elliptic curves (see <xref target="using-elliptic-curves">Using elliptic curves</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 HDK-Authenticate function returns <tt>device_data</tt> consisting of a binary encoded x-coordinate <tt>Z_AB</tt> of an ECDH operation with <tt>sk_device</tt> and <tt>sk_hdk</tt>. Subsequently, the solution instance 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 HDK public key.</t>
        <t>These instantiations instantiate the following:</t>
        <artwork><![CDATA[
def HDK-Root(pk_device, seed):
    msg = serialize(pk_device)
    okm = expand(msg, ID || seed, Nk + Ns)
    (_, sk') = key(okm[0:Nk])
    pk' = EC-Scalar-Mult(pk_device, sk')
    salt' = okm[Nk:]
    return (pk', sk', salt')

def HDK-Derive-Remote(pk_device, (pk, sk, salt), kh):
    (pk_arkg, sk_arkg) = HDK-Seed-Remote((pk, sk, salt))
    sk' = ARKG-Derive-Private-Key(sk_arkg, kh, "")
    pk' = EC-Scalar-Mult(pk_device, sk')
    msg = serialize(pk')
    salt' = expand(msg, ID || salt, Ns)
    return (pk', sk', salt')

def HDK-Authenticate(sk_device, sk_hdk, reader_data):
    P' = EC-Scalar-Mult(reader_data, sk_hdk)

    # 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-sdsa-signatures-for-proof-of-possession">
        <name>Using EC-SDSA signatures for proof of possession</name>
        <t>Such instantiations of HDK use elliptic curves (see <xref target="using-elliptic-curves">Using elliptic curves</xref>) require the following cryptographic construct:</t>
        <ul spacing="normal">
          <li>
            <t><tt>DSA</tt>: an EC-SDSA (Schnorr) digital signature algorithm <xref target="TR03111"/>, consisting of the functions:
            </t>
            <ul spacing="normal">
              <li>
                <t>DSA-Sign(sk, message): Outputs the signature <tt>(c, r)</tt> created using private signing key <tt>sk</tt> over byte string <tt>message</tt>.</t>
              </li>
              <li>
                <t>DSA-Verify(signature, pk, message): Outputs whether <tt>signature</tt> is a signature over <tt>message</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 <bcp14>MUST</bcp14> create an input byte string <tt>reader_data</tt> with sufficient entropy for each challenge.</t>
        <t>The reader <bcp14>MUST</bcp14> verify the proof <tt>device_data</tt> using DSA-Verify with the HDK public key.</t>
        <artwork><![CDATA[
def HDK-Root(pk_device, seed):
    msg = serialize(pk_device)
    okm = expand(msg, ID || seed, Nk + Ns)
    (pk_blind, sk') = key(okm[0:Nk])
    pk' = EC-Add(pk_device, pk_blind)
    salt' = okm[Nk:]
    return (pk', sk', salt')

def HDK-Derive-Remote(pk_device, (pk, sk, salt), kh):
    (pk_arkg, sk_arkg) = HDK-Seed-Remote((pk, sk, salt))
    sk' = ARKG-Derive-Private-Key(sk_arkg, kh, "")
    pk' = EC-Add(pk_device, EC-Scalar-Base-Mult(sk'))
    msg = serialize(pk')
    salt' = expand(msg, ID || salt, Ns)
    return (pk', sk', salt')

def HDK-Authenticate(sk_device, sk_hdk, reader_data):
    # Compute signature within the secure cryptographic device.
    signature = DSA-Sign(sk_device, reader_data)

    (c, s) = DSA-Deserialize(proof)
    s' = s + c * sk_hdk mod EC-Order()
    proof = DSA-Serialize(c, s')
    return proof
]]></artwork>
      </section>
      <section anchor="using-ecdsa-signatures-for-proof-of-possession">
        <name>Using ECDSA signatures for proof of possession</name>
        <t>Due to potential patent claims, this document does not specify an implementation for threshold ECDSA.</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 (see <xref target="using-ecdh-message-authentication-codes-for-proof-of-possession">Using ECDH message authentication codes for proof of possession</xref>).</t>
        <ul spacing="normal">
          <li>
            <t><tt>ID</tt>: <tt>"HDK-ECDH-P256-v1"</tt></t>
          </li>
          <li>
            <t><tt>Nr</tt>: 48</t>
          </li>
          <li>
            <t><tt>Ns</tt>: 32</t>
          </li>
          <li>
            <t><tt>expand</tt>: <tt>expand_message_xmd</tt> from <xref target="RFC9380"/> with:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>H</tt>: SHA-256 <xref target="FIPS180-4"/></t>
              </li>
              <li>
                <t><tt>b_in_bytes</tt>: 32</t>
              </li>
              <li>
                <t><tt>s_in_bytes</tt>: 64</t>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>ARKG</tt>: ARKG instantiation as described in <xref target="I-D.draft-bradleylundberg-cfrg-arkg-02"/> with the identifier <tt>ARKG-P256MUL-ECDH</tt>, <tt>KEM</tt> as defined above, and <tt>BL</tt> with elliptic curve arithmetic as described in <xref target="I-D.draft-bradleylundberg-cfrg-arkg-02"/> Section 3.1, but with multiplicative instead of additive blinding.</t>
          </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>
        </ul>
        <t>The holder <bcp14>MUST</bcp14> generate <tt>sk_device</tt> as an <tt>ECDH</tt> private key in the secure cryptographic device.</t>
      </section>
      <section anchor="hdk-ecsdsa-p256">
        <name>HDK-ECSDSA-P256</name>
        <t>This instantiation uses EC-SDSA (see <xref target="using-ec-sdsa-signatures-for-proof-of-possession">Using EC-SDSA signatures for proof of possession</xref>).</t>
        <ul spacing="normal">
          <li>
            <t><tt>ID</tt>: <tt>"HDK-ECSDSA-P256-v1"</tt></t>
          </li>
          <li>
            <t><tt>Nr</tt>: 48</t>
          </li>
          <li>
            <t><tt>Ns</tt>: 32</t>
          </li>
          <li>
            <t><tt>expand</tt>: <tt>expand_message_xmd</tt> from <xref target="RFC9380"/> with:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>H</tt>: SHA-256 <xref target="FIPS180-4"/></t>
              </li>
              <li>
                <t><tt>b_in_bytes</tt>: 32</t>
              </li>
              <li>
                <t><tt>s_in_bytes</tt>: 64</t>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>ARKG</tt>: ARKG instantiation as described in <xref target="I-D.draft-bradleylundberg-cfrg-arkg-02"/> with the identifier <tt>ARKG-P256ADD-ECDH</tt>, <tt>KEM</tt> as defined above, and <tt>BL</tt> with elliptic curve arithmetic as described in <xref target="I-D.draft-bradleylundberg-cfrg-arkg-02"/> Section 3.1.</t>
          </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>
        </ul>
        <t>The holder <bcp14>MUST</bcp14> generate <tt>sk_device</tt> as a <tt>DSA</tt> private key in the secure cryptographic device.</t>
      </section>
    </section>
    <section anchor="application-considerations">
      <name>Application considerations</name>
      <section anchor="secure-cryptographic-device">
        <name>Secure cryptographic device</name>
        <t>The HDK algorithm 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:
            </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-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 is in the context of <xref target="EU2024-1183"/> 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. In 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 root 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-Root 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 <tt>sk'</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>sk'</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 non-root 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 solution instance holder. To achieve reader unlinkability, the solution instance <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 ARKG 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">attestation</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">solution instance</td>
            </tr>
          </tbody>
        </table>
        <t>HDK enables solution instances and issuers cooperatively to establish the cryptographic key material that issued attestations will be bound to.</t>
        <t>For asynchronous batch issuance, 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 solution instance shares an ARKG public seed with the issuer, and the issuer shares a key handle for each attestation, generated using:</t>
        <artwork><![CDATA[
ARKG-Derive-Public-Key(key_generation_public_key, "")
]]></artwork>
      </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="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="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="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 692?>

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

-->

</rfc>
