<?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-04" 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-04"/>
    <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 the following cryptographic constructs:</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 instantiat the following:</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 the following cryptographic constructs:</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>
        <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"/>.</t>
      </section>
      <section anchor="using-multiplicative-blinding">
        <name>Using multiplicative blinding</name>
        <t>Such instantations of HDK <xref target="using-prime-order-groups">use prime-order groups</xref> and instantiate the following:</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>
      </section>
      <section anchor="using-additive-blinding">
        <name>Using additive blinding</name>
        <t>Such instantations of HDK use <xref target="using-prime-order-groups">use prime-order groups</xref> and instantiate the following:</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>
      </section>
      <section anchor="using-ecdh-shared-secrets">
        <name>Using ECDH shared secrets</name>
        <t>Such instantiations of HDK <xref target="using-multiplicative-blinding">use multiplicative blinding</xref> and require the following cryptographic construct:</t>
        <ul spacing="normal">
          <li>
            <t><tt>DH</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>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>Such instantiations of HDK <xref target="using-digital-signatures">use digital signatures</xref> and <xref target="using-additive-blinding">use additive blinding</xref> and instantiate the following:</t>
        <ul spacing="normal">
          <li>
            <t><tt>DSA</tt>: An EC-SDSA (Schnorr) 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>Such instantiations of HDK <xref target="using-prime-order-groups">use prime-order groups</xref> and require the following parameter:</t>
        <ul spacing="normal">
          <li>
            <t><tt>DST</tt>: A domain separation tag for use with HashToScalar.</t>
          </li>
        </ul>
        <t>Such instantiations instantiate the following:</t>
        <ul spacing="normal">
          <li>
            <t><tt>Ns</tt>: 32</t>
          </li>
          <li>
            <t><tt>H</tt>: SHA-256 <xref target="FIPS180-4"/>.</t>
          </li>
          <li>
            <t><tt>G</tt>: The NIST curve <tt>secp256r1</tt> (P-256) <xref target="SEC2"/> with:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>HashToScalar(msg)</tt>: Implemented by computing <tt>hash_to_field(msg, 1)</tt> with the parameters:
                </t>
                <ul spacing="normal">
                  <li>
                    <t><tt>DST</tt>: <tt>DST</tt></t>
                  </li>
                  <li>
                    <t><tt>F</tt>: GF(EC-Order()), the scalar field of the prime order subgroup of <tt>G</tt></t>
                  </li>
                  <li>
                    <t><tt>p</tt>: EC-Order()</t>
                  </li>
                  <li>
                    <t><tt>m</tt>: 1</t>
                  </li>
                  <li>
                    <t><tt>L</tt>: 48</t>
                  </li>
                  <li>
                    <t><tt>expand_message</tt>: <tt>expand_message_xmd</tt> with <tt>H</tt></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>KEM</tt>: DHKEM(P-256, HKDF-SHA256) <xref target="RFC9180"/>.</t>
          </li>
        </ul>
      </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 <xref target="using-p-256">uses P-256</xref> and <xref target="using-ecdh-shared-secrets">uses ECDH shared secrets</xref>.</t>
        <ul spacing="normal">
          <li>
            <t><tt>DST</tt>: <tt>"ECDH Key Blind"</tt></t>
          </li>
          <li>
            <t><tt>DH</tt>: ECKA-DH with curve <tt>EC</tt>.</t>
          </li>
        </ul>
      </section>
      <section anchor="hdk-ecdsa-p256">
        <name>HDK-ECDSA-P256</name>
        <t>This instantiation <xref target="using-p-256">uses P-256</xref> and <xref target="using-digital-signatures">uses digital signatures</xref>.</t>
        <ul spacing="normal">
          <li>
            <t><tt>DST</tt>: <tt>"ECDSA Key Blind"</tt> as specified in <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>This instantiation <xref target="using-p-256">uses P-256</xref> and <xref target="using-ec-sdsa-signatures">uses EC-SDSA signatures</xref>.</t>
        <ul spacing="normal">
          <li>
            <t><tt>DST</tt>: <tt>"EC-SDSA Key Blind"</tt></t>
          </li>
          <li>
            <t><tt>DSA</tt>: EC-SDSA-opt (the optimised EC-SDSA) with curve <tt>G</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-P256 (see <xref target="hdk-ecdsa-p256"/>):
            </t>
            <ul spacing="normal">
              <li>
                <t>P-256 ECDSA blinding key pair generation</t>
              </li>
              <li>
                <t>P-256 ECDSA blinded signature creation</t>
              </li>
            </ul>
          </li>
          <li>
            <t>In the case of HDK-ECSDSA-P256 (see <xref target="hdk-ecsdsa-p256"/>):
            </t>
            <ul spacing="normal">
              <li>
                <t>P-256 EC-SDSA key pair generation</t>
              </li>
              <li>
                <t>P-256 EC-SDSA signature creation</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>The other HDK operations can be performed in a WSCA or WSCA agent running on any UD, including hostile ones with limited sandboxing capabilities, such as in a smartphone's rich execution environment or in a personal computer web browser.</t>
      </section>
      <section anchor="trust-evidence">
        <name>Trust evidence</name>
        <t>Some issuers could require evidence from a solution provider of the security of the holder's cryptographic device. This evidence can in the context of <xref target="EU2024-1183"/> be divided into initial "Wallet Trust Evidence" and related "Issuer Trust Evidence". Each is a protected document that contains a trust evidence public key associated with a private key that is protected in the secure cryptographic device. With HDK, these public keys are specified as follows.</t>
        <section anchor="wallet-trust-evidence">
          <name>Wallet Trust Evidence</name>
          <t>The Wallet Trust Evidence public key is the first level 0 HDK public key. To achieve reader unlinkability, the wallet <bcp14>SHOULD</bcp14> limit access to a trusted person identification document provider only.</t>
          <t>To prevent association across identities, the solution provider <bcp14>MUST</bcp14> before issuing Wallet Trust Evidence ensure that (a) a newly generated device key pair is used and (b) the wallet follows the protocol so that the HDK output is bound to exactly this key. For (a), the solution provider could rely on freshness of a key attestation and ensure that each device public key is attested only once. For (b), the wallet could proof knowledge of the blinding factor <tt>bf</tt> with a Schnorr non-interactive zero-knowledge proof <xref target="RFC8235"/> with base point <tt>pk_device</tt>. This would ensure that the root blinding key <tt>bf</tt> is not shared with the solution provider to reduce the risk of the solution provider unblinding future derived keys.</t>
        </section>
        <section anchor="issuer-trust-evidence">
          <name>Issuer Trust Evidence</name>
          <t>The Issuer Trust Evidence public key can be any other HDK public key. The solution provider <bcp14>MUST</bcp14> verify that the wallet knows the associated private key before issuing Issuer Trust Evidence. The solution provider <bcp14>MUST</bcp14> ensure that <tt>sk_device</tt> is under sole control of the unit holder. To achieve reader unlinkability, the unit <bcp14>MUST</bcp14> limit access of Issuer Trust Evidence to a single issuer. Subsequent issuers within the same HDK tree do not need to receive any Issuer Trust Evidence, since they can derive equally secure keys by applying the remote HDK protocol to presented keys attested by trusted (other) issuers.</t>
        </section>
      </section>
      <section anchor="applying-hdk-in-openid-for-verifiable-credential-issuance">
        <name>Applying HDK in OpenID for Verifiable Credential Issuance</name>
        <t>In <xref target="draft-OpenID4VCI"/>, the following terminology applies:</t>
        <table>
          <thead>
            <tr>
              <th align="left">OpenID4VCI</th>
              <th align="left">HDK</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Credential</td>
              <td align="left">document</td>
            </tr>
            <tr>
              <td align="left">Credential Issuer</td>
              <td align="left">issuer</td>
            </tr>
            <tr>
              <td align="left">Verifier</td>
              <td align="left">reader</td>
            </tr>
            <tr>
              <td align="left">Wallet</td>
              <td align="left">unit</td>
            </tr>
          </tbody>
        </table>
        <t>HDK enables unit and issuers cooperatively to establish the cryptographic key material that issued documents will be bound to.</t>
        <t>For the remote HDK protocol, HDK proposes an update to the OpenID4VCI endpoints. This proposal is under discussion in <eref target="https://github.com/openid/OpenID4VCI/issues/359">openid/OpenID4VCI#359</eref>. In the update, the unit shares a key encapsulation public key with the issuer, and the issuer returns a key handle. Then documents can be re-issued, potentially in batches, using synchronised indices. Alternatively, re-issued documents can have their own key handles.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security considerations</name>
      <section anchor="confidentiality-of-key-handles">
        <name>Confidentiality of key handles</name>
        <t>The key handles <bcp14>MUST</bcp14> be considered confidential, since they provide knowledge about the blinding factors. Compromise of this knowledge could introduce undesired linkability. In HDK, both the holder and the issuer know the key handle during issuance.</t>
        <t>In an alternative to HDK, the holder independently generates blinded key pairs and proofs of association, providing the issuer with zero knowledge about the blinding factors. However, this moves the problem: the proofs of association would now need to be considered confidential.</t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="FIPS180-4" target="https://csrc.nist.gov/pubs/fips/180-4/upd1/final">
          <front>
            <title>Secure Hash Standard (SHS)</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2012" month="June"/>
          </front>
          <seriesInfo name="FIPS" value="180-4"/>
          <seriesInfo name="DOI" value="10.6028/NIST.FIPS.180-4"/>
        </reference>
        <reference anchor="ISO18013-5" target="https://www.iso.org/standard/69084.html">
          <front>
            <title>Personal identification - ISO-compliant driving licence - Part 5: Mobile driving licence (mDL) application</title>
            <author>
              <organization>ISO/IEC</organization>
            </author>
            <date year="2019" month="September"/>
          </front>
          <seriesInfo name="ISO/IEC" value="18013-5:2021"/>
        </reference>
        <reference anchor="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 770?>

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

-->

</rfc>
