<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.21 (Ruby 3.1.1) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-dijkhuis-cfrg-hdkeys-05" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.25.0 -->
  <front>
    <title abbrev="HDK">Hierarchical Deterministic Keys</title>
    <seriesInfo name="Internet-Draft" value="draft-dijkhuis-cfrg-hdkeys-05"/>
    <author initials="S. Q." surname="Dijkhuis" fullname="Sander Dijkhuis" role="editor">
      <organization>Cleverbase</organization>
      <address>
        <email>mail@sanderdijkhuis.nl</email>
      </address>
    </author>
    <date year="2025" month="January" day="19"/>
    <area>IRTF</area>
    <workgroup>Crypto Forum</workgroup>
    <keyword>KDF</keyword>
    <abstract>
      <?line 112?>

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

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies the algorithms to apply Hierarchical Deterministic Keys (HDKeys). The purpose of an HDK architecture is to manage large sets of keys bound to a secure cryptographic device that protects a single key. This enables the development of secure digital identity wallets providing many one-time-use public keys.</t>
      <t>The core idea has been introduced in <xref target="BIP32"/> to create multiple cryptocurrency addresses in a manageable way. The present document extends the idea towards devices commonly used for digital wallets, and towards common interaction patterns for document issuance and authentication.</t>
      <t>To store many HDKeys, only a seed string needs to be stored confidentially, associated with a device private key. Each HDK is then deterministically defined by a path of indices, optionally alternated by key handles provided by another party. Such a path can efficiently be stored and requires less confidentiality than the seed.</t>
      <t>To prove possession of many HDKeys, the secure cryptographic device only needs to perform common cryptographic operations on a single private key. The HDK acts as a blinding factor that enables blinding the device public key. In several instantiations, such as those <xref target="using-ecdh-shared-secrets">using ECDH shared secrets</xref> and those <xref target="using-ec-sdsa-signatures">using EC-SDSA signatures</xref>, the secure cryptographic device does not need to support key blinding natively, and the application can pre-process the input or post-process the output from the device to compute the blinded device authentication data. This enables the application of HDK on devices that are already deployed without native support for HDK.</t>
      <t>This document provides a specification of the generic HDK function, generic HDK instantiations, and fully specified concrete HDK instantiations.</t>
      <t>An HDK instantiation is expected to be applied in a solution deployed as (wallet) units. One unit can have multiple HDK instantiations, for example to manage multiple identities or multiple cryptographic algorithms or key protection mechanisms.</t>
      <t>This document represents the consensus of the authors, based on working group input and feedback. It is not a standard. It does not include security or privacy proofs.</t>
      <section anchor="conventions-and-definitions">
        <name>Conventions and definitions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

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

Outputs:
- ctx, an application context byte string.

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

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

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

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

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

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

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

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

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

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

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

# 4. Issuer shares with unit: kh

# Subsequently, for any index known to both parties:

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

# 6. Issuer shares with unit: pk'

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

# 8. Unit computes:
sk' = BlindPrivateKey(sk, bf) # optional
]]></artwork>
        <t>After step 7, the unit can use the value of <tt>salt'</tt> to derive next-level HDKeys.</t>
        <t>Step 4 <bcp14>MAY</bcp14> be postponed to be combined with step 6. Steps 5 to 8 <bcp14>MAY</bcp14> be combined in concurrent execution for multiple indices.</t>
      </section>
    </section>
    <section anchor="generic-hdk-instantiations">
      <name>Generic HDK instantiations</name>
      <section anchor="using-digital-signatures">
        <name>Using digital signatures</name>
        <t>Instantiations of HDK using digital signatures require:</t>
        <ul spacing="normal">
          <li>
            <t><tt>DSA</tt>: A digital signature algorithm, consisting of the functions:
            </t>
            <ul spacing="normal">
              <li>
                <t>GenerateKeyPair(): Outputs a new key pair <tt>(sk, pk)</tt> consisting of private key <tt>sk</tt> and public key <tt>pk</tt>.</t>
              </li>
              <li>
                <t>Sign(sk, msg): Outputs the signature created using private signing key <tt>sk</tt> over byte string <tt>msg</tt>.</t>
              </li>
              <li>
                <t>Verify(signature, pk, msg): Outputs whether <tt>signature</tt> is a signature over <tt>msg</tt> using public verification key <tt>pk</tt>.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>Using these constructs, an example proof of possession protocol is:</t>
        <artwork><![CDATA[
# 1. Unit shares with reader: pk

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

# 3. Reader shares with unit: nonce

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

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

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

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

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

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

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

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

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

# 3. Reader shares with unit: pkR

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

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

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

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

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

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

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

<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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
mjFuE/u/cj//quadAAA=

-->

</rfc>
