<?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.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-dijkhuis-hdk-00" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="HDK">Hierarchical Deterministic Keys</title>
    <seriesInfo name="Internet-Draft" value="draft-dijkhuis-hdk-00"/>
    <author initials="S. Q." surname="Dijkhuis" fullname="Sander Dijkhuis" role="editor">
      <organization>Cleverbase</organization>
      <address>
        <email>mail@sanderdijkhuis.nl</email>
      </address>
    </author>
    <date year="2026" month="August" day="29"/>
    <area>Internet</area>
    <keyword>OpenID4VCI</keyword>
    <keyword>credential binding</keyword>
    <keyword>key derivation</keyword>
    <abstract>
      <?line 76?>

<t>Using a distinct holder-binding key for each Credential improves unlinkability, but generating and storing many keys in a Wallet secure area can be expensive or impossible. This document defines a way to derive unlinkable P-256 Credential keys from one protected parent key while retaining the parent's key-protection properties. It specifies this mechanism as an extension to OpenID for Verifiable Credential Issuance (OpenID4VCI), allowing the Issuer to derive each child public key while only the Wallet can use the corresponding child private key.</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-hdk/"/>.
      </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 80?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>A Wallet can use distinct holder-binding keys for its Credentials to avoid giving Relying Parties a common correlation handle. An Issuer can nevertheless need assurance that these keys remain associated with a holder-binding key whose security properties it has already accepted.</t>
      <t>For example, an Issuer can accept a hardware-protected key when a Wallet presents a Person Identification Data credential, then issue mobile Driving Licence (mDL) Credentials bound to distinct child keys. The mDL keys appear unrelated to Relying Parties, while the Issuer can determine that they are derived from the previously accepted parent key. HDK relies on the assurance already established for that parent key rather than establishing the holder's identity itself.</t>
      <t>Generating and storing a separate secure area key pair for every Credential can also be expensive or impossible. HDK instead derives many P-256 child keys from one protected parent. Child-key operations can retain the parent's protections, including user authentication.</t>
      <t>This specification is limited to P-256 because it targets high-assurance Wallet ecosystems in which P-256 is widely supported by secure hardware and Credential formats. Other curves or key types require separate specification.</t>
      <t>During issuance, the Wallet and Issuer establish a shared secret using ephemeral X25519 keys. Together with the parent public key and Credential index, this determines each child key. The Issuer can derive the child public keys but not the corresponding private keys. Verifiers see ordinary P-256 keys and need no HDK support.</t>
      <t><xref target="TR119476-1"/> identifies key management and Proof of Association (PoA) as challenges when issuing multiple single-use holder-binding keys in the EUDI Wallet setting. It discusses ARKG <xref target="ARKG"/>, including HDK, for deriving such keys and related-key PoA for associating them. This document defines a concrete OpenID4VCI mechanism for that design space. <xref target="KeyBlinding"/> independently specifies multiplicative key blinding for signature keys; the construction here uses the same algebraic relation but adapts it for deterministic remote derivation of Credential keys. The interoperability differences are discussed in Interoperability Considerations.</t>
      <t>This version is a substantial rewrite of earlier versions and has not yet been reviewed by the stakeholders involved in that earlier work. The purpose of the rewrite is to specify the smallest possible extension to OpenID4VCI that makes HDK practical to use.</t>
      <t>A child key can itself be a parent, allowing hierarchical derivation.</t>
    </section>
    <section anchor="conventions-and-encoding">
      <name>Conventions and Encoding</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><tt>a || b</tt> denotes byte-string concatenation.</t>
      <t>OS2IP and I2OSP are the octet-string/integer conversions defined in <xref target="RFC8017"/>.</t>
      <t><tt>base64(x)</tt> is unpadded base64url as defined in Section 5 of <xref target="RFC4648"/>.</t>
    </section>
    <section anchor="cryptographic-dependencies">
      <name>Cryptographic Dependencies</name>
      <t>This specification imports the following values and functions:</t>
      <ul spacing="normal">
        <li>
          <t>From <xref target="SEC1"/>, the P-256 elliptic curve, its scalar and point representations, and its public-key validation rules. The P-256 group order is:  </t>
          <artwork><![CDATA[
n = 0xffffffff00000000ffffffffffffffff
    bce6faada7179e84f3b9cac2fc632551
]]></artwork>
        </li>
        <li>
          <t><tt>ScalarMult(pk, k)</tt> is P-256 scalar multiplication as defined by <xref target="SEC1"/>. Received P-256 public keys <bcp14>MUST</bcp14> be validated as required by <xref target="SEC1"/>. When a P-256 public key <tt>pk</tt> is used as a byte string, it is encoded as the 65-byte uncompressed SEC 1 representation <tt>0x04 || x || y</tt>.</t>
        </li>
        <li>
          <t><tt>SHA-256(msg)</tt> is SHA-256 as defined by <xref target="FIPS180-4"/>.</t>
        </li>
        <li>
          <t><tt>GenerateX25519KeyPair()</tt> generates a fresh X25519 private key and its corresponding 32-byte public key, using X25519 as defined by <xref target="RFC7748"/>.</t>
        </li>
        <li>
          <t><tt>X25519(sk, pk)</tt> is the X25519 function defined by <xref target="RFC7748"/>. Its 32-byte output is used directly as <tt>shared_secret</tt>. An all-zero output <bcp14>MUST</bcp14> be rejected.</t>
        </li>
      </ul>
    </section>
    <section anchor="parent-key-assurance">
      <name>Parent-Key Assurance</name>
      <t>The Wallet has a P-256 parent key pair <tt>(sk_parent, pk_parent)</tt> protected by its secure area.</t>
      <t>Before a Credential Request using HDK, the Issuer <bcp14>MUST</bcp14> already have established that <tt>pk_parent</tt> represents the intended Credential Holder and meets its requirements for key protection and user authentication. How this is established is out of scope. For example, it can be established by presentation of a Person Identification Data credential using OpenID4VP <xref target="OpenID4VP"/>, or by proof of possession associated with a refresh token bound to <tt>pk_parent</tt>.</t>
    </section>
    <section anchor="credential-request">
      <name>Credential Request</name>
      <t>For each request, the Wallet generates:</t>
      <artwork><![CDATA[
(sk_wallet, pk_wallet) = GenerateX25519KeyPair()
]]></artwork>
      <t>and sends an <tt>hdk</tt> proof containing:</t>
      <ul spacing="normal">
        <li>
          <t><tt>parent</tt>: the P-256 parent public key as a JWK <xref target="RFC7517"/>; and</t>
        </li>
        <li>
          <t><tt>pk_wallet</tt>: <tt>base64(pk_wallet)</tt>.</t>
        </li>
      </ul>
      <t>For example:</t>
      <sourcecode type="http"><![CDATA[
POST /credential HTTP/1.1
Host: issuer.example.com
Content-Type: application/json
Authorization: Bearer czZCaGRSa3F0MzpnWDFmQmF0M2JW

{
  "credential_configuration_id": "org.iso.18013.5.1.mDL",
  "proofs": {
    "hdk": [{
      "parent": {
        "kty": "EC",
        "crv": "P-256",
        "x": "axfR8uEsQkf4vOblY6RA8ncDfYEt6zOg9KE5RdiYwpY",
        "y": "T-NC4v4af5uO5-tKfA-eFivOM1drMV7Oy7ZAaDe_UfU"
      },
      "pk_wallet": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8"
    }]
  }
}
]]></sourcecode>
      <t>The Wallet <bcp14>MUST</bcp14> generate a fresh <tt>(sk_wallet, pk_wallet)</tt> for each request and retain <tt>sk_wallet</tt> until it processes the response.</t>
    </section>
    <section anchor="credential-response">
      <name>Credential Response</name>
      <t>The Issuer generates:</t>
      <artwork><![CDATA[
(sk_issuer, pk_issuer) = GenerateX25519KeyPair()
shared_secret = X25519(sk_issuer, pk_wallet)
]]></artwork>
      <t>If <tt>shared_secret</tt> is all zero, the Issuer <bcp14>MUST</bcp14> reject the request.</t>
      <t>The Issuer returns <tt>base64(pk_issuer)</tt> once in the <tt>hdk</tt> response parameter:</t>
      <sourcecode type="http"><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json

{
  "hdk": {
    "pk_issuer": "ICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8"
  },
  "credentials": [
    { "credential": "<Credential 0>" },
    { "credential": "<Credential 1>" },
    { "credential": "<Credential 2>" }
  ]
}
]]></sourcecode>
      <t>Credential position is its zero-based HDK index. The Issuer <bcp14>MUST</bcp14> bind Credential <tt>i</tt> to the child public key for index <tt>i</tt>. A response <bcp14>MUST NOT</bcp14> contain more than <tt>2^32</tt> Credentials.</t>
      <t>The Wallet computes:</t>
      <artwork><![CDATA[
shared_secret = X25519(sk_wallet, pk_issuer)
]]></artwork>
      <t>If <tt>shared_secret</tt> is all zero, the Wallet <bcp14>MUST</bcp14> reject the response.</t>
    </section>
    <section anchor="child-key-derivation">
      <name>Child-Key Derivation</name>
      <t>Define:</t>
      <artwork><![CDATA[
H(msg) = (OS2IP(SHA-256(msg)) mod (n - 1)) + 1

BlindPK(pk, bk, ctx) = ScalarMult(pk, H(bk || ctx))
BlindSK(sk, bk, ctx) = sk * H(bk || ctx) mod n
]]></artwork>
      <t>This is multiplicative key blinding, as used for ECDSA in <xref target="KeyBlinding"/>. Its use here for remote child-key derivation serves a role related to ARKG <xref target="ARKG"/>, whose <tt>ARKG-P256</tt> instance instead uses additive blinding.</t>
      <t><tt>H</tt> returns an integer in <tt>1..n-1</tt>. The small statistical bias from reduction modulo <tt>n - 1</tt> is accepted for simplicity.</t>
      <t>For Credential <tt>i</tt>, where <tt>0x00000000 &lt;= i &lt;= 0xffffffff</tt>:</t>
      <artwork><![CDATA[
index = I2OSP(i, 4)
ctx = pk_parent || index

sk_child = BlindSK(sk_parent, shared_secret, ctx)
pk_child = BlindPK(pk_parent, shared_secret, ctx)
]]></artwork>
      <t>Because the blinding factor and <tt>sk_parent</tt> are non-zero modulo the prime <tt>n</tt>, <tt>sk_child</tt> is non-zero.</t>
      <section anchor="hierarchical-derivation">
        <name>Hierarchical Derivation</name>
        <t>A child key pair <bcp14>MAY</bcp14> itself be used as a parent. For successive blinding factors <tt>b1</tt> and <tt>b2</tt>:</t>
        <artwork><![CDATA[
pk_child2 = ScalarMult(pk_parent, b1 * b2 mod n)
sk_child2 = sk_parent * b1 * b2 mod n
]]></artwork>
      </section>
    </section>
    <section anchor="using-a-child-key">
      <name>Using a Child Key</name>
      <t>Child-key operations <bcp14>SHOULD</bcp14> receive protections equivalent to parent-key operations, including the same user-authentication policy. A secure area can derive <tt>sk_child</tt> internally, or use the equivalences below while continuing to operate with <tt>sk_parent</tt>.</t>
      <section anchor="ecdh">
        <name>ECDH</name>
        <t>For this section, <tt>ECDH(sk, pk)</tt> denotes P-256 ECDH as specified in <xref target="SEC1"/>, returning the 32-byte big-endian x-coordinate of <tt>ScalarMult(pk, sk)</tt>.</t>
        <t>For the blinding factor <tt>b</tt> of a child:</t>
        <artwork><![CDATA[
ECDH(sk_child, pk) = ECDH(sk_parent, ScalarMult(pk, b))
]]></artwork>
        <t>This allows <tt>b</tt> to be applied outside the secure area while the protected ECDH operation still uses <tt>sk_parent</tt>. <tt>pk</tt> <bcp14>MUST</bcp14> be validated before scalar multiplication; the result <bcp14>MUST</bcp14> also be validated if required by the ECDH interface.</t>
      </section>
      <section anchor="ecdsa">
        <name>ECDSA</name>
        <t>A secure area that supports multiplicative key blinding can derive and use the child key directly as described in <xref target="KeyBlinding"/>. The remainder of this subsection describes an alternative that keeps the protected ECDSA operation on <tt>sk_parent</tt>.</t>
        <t>For the blinding factor <tt>b</tt> of the child, let:</t>
        <artwork><![CDATA[
z = OS2IP(SHA-256(msg))
]]></artwork>
        <t>Then <tt>SHA256withECDSA(sk_child, msg)</tt> is equivalent to <tt>(r, s * b mod n)</tt>, where:</t>
        <artwork><![CDATA[
(r, s) = NONEwithECDSA(
    sk_parent,
    I2OSP(z * b^-1 mod n, 32))
]]></artwork>
        <t><tt>b^-1</tt> is the inverse of <tt>b</tt> modulo <tt>n</tt>. <tt>NONEwithECDSA</tt> means ECDSA over the supplied 32-byte representative without hashing it again. Implementations <bcp14>MUST</bcp14> verify that their API has exactly this behavior.</t>
        <t>The resulting <tt>(r, s * b mod n)</tt> is an ordinary ECDSA signature under <tt>pk_child</tt> for <tt>msg</tt>.</t>
        <t>This ECDSA construction may be covered by patent claims in some jurisdictions or implementations. This document makes no determination about their validity or applicability. Deriving <tt>sk_child</tt> inside the secure area and signing with it is an alternative architecture and can have a different intellectual-property analysis.</t>
      </section>
    </section>
    <section anchor="openid4vci-metadata">
      <name>OpenID4VCI Metadata</name>
      <t>Support is advertised with the <tt>hdk</tt> proof type in <tt>proof_types_supported</tt> <xref target="OpenID4VCI"/>:</t>
      <sourcecode type="json"><![CDATA[
{
  "credential_configurations_supported": {
    "org.iso.18013.5.1.mDL": {
      "format": "mso_mdoc",
      "doctype": "org.iso.18013.5.1.mDL",
      "cryptographic_binding_methods_supported": ["jwk"],
      "credential_signing_alg_values_supported": ["ES256"],
      "proof_types_supported": {
        "hdk": {}
      }
    }
  }
}
]]></sourcecode>
      <t>The <tt>hdk</tt> object in <tt>proof_types_supported</tt> is empty in this version of the specification; no proof-type-specific metadata parameters are currently defined. Implementations <bcp14>MUST NOT</bcp14> infer HDK support merely from P-256 support.</t>
    </section>
    <section anchor="interoperability-considerations">
      <name>Interoperability Considerations</name>
      <t>The derivation in this document is not interoperable with either <tt>ARKG-P256</tt> <xref target="ARKG"/> or the ECDSA construction in <xref target="KeyBlinding"/>.</t>
      <t><tt>ARKG-P256</tt> uses additive blinding, P-256 ECDH, and ARKG-specific seed and key-handle structures. This document uses multiplicative blinding and an ephemeral X25519 exchange directly in OpenID4VCI. The simpler construction avoids introducing ARKG key representations and key handles, and the multiplicative relation also permits the ECDH and ECDSA child-key equivalences above while the secure area continues to operate with the parent key.</t>
      <t>X25519 was selected for the exchange because it requires little protocol and encoding boilerplate for this application: each party contributes one fixed-size public value and <xref target="RFC7748"/> directly defines the shared-secret computation. It is also listed as an agreed key-establishment mechanism in the draft Version 3 of the EUCC Agreed Cryptographic Mechanisms <xref target="EUCC-ACM-v3"/>.</t>
      <t>The ECDSA construction in <xref target="KeyBlinding"/> uses the same multiplicative relation between parent and blinded keys, but derives the blinding scalar differently. It uses a separately generated private blinding key, domain separation, and <tt>hash_to_field</tt>; this document uses the X25519 <tt>shared_secret</tt> as <tt>bk</tt>, the parent public key and Credential index as <tt>ctx</tt>, and the compact <tt>H</tt> function above. Consequently, implementations of the two constructions will not derive the same keys from nominally corresponding inputs.</t>
      <t>These deviations are intentional: HDK needs one high-entropy per-request secret from which both parties can deterministically derive a batch of child keys, and it applies the same child-key relation to ECDH as well as ECDSA. They should not be interpreted as inheriting interoperability or security analysis from either referenced construction.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>HDK relies on the Issuer having already accepted <tt>pk_parent</tt>, including its holder binding, key protection, and user-authentication properties. It preserves that association for child keys; it does not establish it.</t>
      <t>The security guarantee remains rooted in <tt>sk_parent</tt>. Disclosure of <tt>shared_secret</tt> does not reveal <tt>sk_parent</tt> or by itself enable child-key operations, but it reveals the relationship between <tt>pk_parent</tt> and its child public keys. Implementations <bcp14>SHOULD</bcp14> therefore protect and erase it when no longer needed.</t>
      <t>Both parties <bcp14>MUST</bcp14> use fresh X25519 key pairs for each request.</t>
      <t>Compromise of both <tt>sk_parent</tt> and an issuance <tt>shared_secret</tt> permits reconstruction of every child private key from that response.</t>
      <t>The biased <tt>H</tt> construction is intentional: this specification prefers ease of implementation over eliminating the small statistical bias. Replacing it with an unbiased construction would not be wire-compatible and requires a new algorithm identifier or protocol version.</t>
      <t>See the ECDSA section for intellectual-property considerations.</t>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>Distinct child public keys prevent correlation merely through reuse of the holder-binding public key. Other Credential contents, protocol metadata, network identifiers, or application behavior can still enable correlation.</t>
      <t>The Issuer knows <tt>pk_parent</tt> and derives all child public keys, so HDK does not provide unlinkability from the Issuer. <tt>shared_secret</tt> is privacy-sensitive because it reveals these relationships.</t>
    </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="2015" month="August"/>
          </front>
          <seriesInfo name="FIPS" value="180-4"/>
        </reference>
        <reference anchor="OpenID4VCI" target="https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0-final.html">
          <front>
            <title>OpenID for Verifiable Credential Issuance 1.0</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>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC7748">
          <front>
            <title>Elliptic Curves for Security</title>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="M. Hamburg" initials="M." surname="Hamburg"/>
            <author fullname="S. Turner" initials="S." surname="Turner"/>
            <date month="January" year="2016"/>
            <abstract>
              <t>This memo specifies two elliptic curves over prime fields that offer a high level of practical security in cryptographic applications, including Transport Layer Security (TLS). These curves are intended to operate at the ~128-bit and ~224-bit security level, respectively, and are generated deterministically based on a list of required properties.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7748"/>
          <seriesInfo name="DOI" value="10.17487/RFC7748"/>
        </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="SEC1" target="https://www.secg.org/sec1-v2.pdf">
          <front>
            <title>SEC 1: Elliptic Curve Cryptography, Version 2.0</title>
            <author>
              <organization>Standards for Efficient Cryptography Group</organization>
            </author>
            <date year="2009" month="May"/>
          </front>
        </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="ARKG" target="https://www.ietf.org/archive/id/draft-bradleylundberg-cfrg-arkg-09.html">
          <front>
            <title>The Asynchronous Remote Key Generation (ARKG) algorithm</title>
            <author initials="E." surname="Lundberg" fullname="E. Lundberg">
              <organization/>
            </author>
            <author initials="J." surname="Bradley" fullname="J. Bradley">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="EUCC-ACM-v3" target="https://certification.enisa.europa.eu/publications/eucc-guidelines-cryptography_en">
          <front>
            <title>Agreed Cryptographic Mechanisms, Version 3, Draft for Public Review</title>
            <author>
              <organization>European Cybersecurity Certification Group, Sub-group on Cryptography</organization>
            </author>
            <date year="2026" month="April"/>
          </front>
        </reference>
        <reference anchor="TR119476-1" target="https://www.etsi.org/deliver/etsi_tr/119400_119499/11947601/">
          <front>
            <title>Selective disclosure and zero-knowledge proofs applied to Electronic Attestation of Attributes; Part 1: Feasibility study</title>
            <author>
              <organization>ETSI</organization>
            </author>
            <date year="2025" month="August"/>
          </front>
          <seriesInfo name="ETSI TR" value="119 476-1 V1.3.1"/>
        </reference>
        <reference anchor="KeyBlinding" target="https://www.ietf.org/archive/id/draft-irtf-cfrg-signature-key-blinding-11.html">
          <front>
            <title>Key Blinding for Signature Schemes</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="OpenID4VP" target="https://openid.net/specs/openid-4-verifiable-presentations-1_0-final.html">
          <front>
            <title>OpenID for Verifiable Presentations 1.0</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC7517">
          <front>
            <title>JSON Web Key (JWK)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>A JSON Web Key (JWK) is a JavaScript Object Notation (JSON) data structure that represents a cryptographic key. This specification also defines a JWK Set JSON data structure that represents a set of JWKs. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and IANA registries established by that specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7517"/>
          <seriesInfo name="DOI" value="10.17487/RFC7517"/>
        </reference>
      </references>
    </references>
    <?line 361?>

<section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Helpful ideas and feedback came from Peter Lee Altmann, Micha Kraus, Emil Lundberg, John Bradley, Paul Bastian, and Remco Schaar.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
0hqHKzWPMnxPU8qi1/kfr9ND/QVCAAA=

-->

</rfc>
