<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
<div name="messageBodySection">
<div dir="auto">Hi Sietse, <br />
<br />
thanks for sharing your ideas for PoA. To me it seems reasonable to define a new proof type for PoA, especially if the PoA contains multiple credential keys. Can you please explain why you are treating the PoP and the PoA separately? I’m asking since the signature in the PoA object is both, a PoA and a PoP (for the WTE and the credential keys). Would you agree? </div>
</div>
<div name="messageSignatureSection"><br />
<div class="matchFont">best regards, 
<div dir="auto">Torsten.</div>
</div>
</div>
<div name="messageReplySection">Am 22. Okt. 2024, 14:36 +0200 schrieb Sietse Ringers via Openid-specs-digital-credentials-protocols <openid-specs-digital-credentials-protocols@lists.openid.net>:<br />
<blockquote type="cite" style="border-left-color: grey; border-left-width: thin; border-left-style: solid; margin: 5px 5px;padding-left: 10px;">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif">Hi,</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif">Within the EUDI NL Wallet implementation we have recently been making some progress on implementing the WTE. We originally started working based on this suggestion by Torsten <a href="https://github.com/openid/OpenID4VCI/issues/355#issuecomment-2236186075">https://github.com/openid/OpenID4VCI/issues/355#issuecomment-2236186075</a>, and I have also been reading <a href="https://github.com/openid/OpenID4VCI/pull/389">https://github.com/openid/OpenID4VCI/pull/389</a></span> <span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia",serif" xml:lang="EN-US">which adds key attestations</span><span style="font-size:10.0pt;font-family:"Georgia",serif">, but for our sitation neither approaches seems ideal. With this mail I would like to explain our situation and the direction we have taken, and suggest some ways how this might be integrated into OpenID4VCI.</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia",serif" xml:lang="EN-US"></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif"> </span></p>
<p class="MsoNormal"><b><span style="font-size:14.0pt;font-family:"Georgia",serif">WTE and PoA</span></b></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif">The main difference in approach comes from that we plan to use Proofs of Association (PoA) in the NL Wallet. A Proof of Association of a set of keys managed by a WSCD (Wallet Secure Cryptographic Device) is a proof produced by that WSCD that all those keys are managed by a single WSCD. For now we implement that as follows: a PoA is a JWS in JSON serialization format whose body contains all involved keys, and it is signed by all of those keys. This implementation is based on work that the NL Wallet architects, myself included, did with Torsten some time ago.  (Unfortunately this implementation is so new that it is not visible yet on the public mirror of our source code repository, <a href="https://github.com/MinBZK/nl-wallet">https://github.com/MinBZK/nl-wallet</a>. If you like, I can notify you when it appears there.)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif">Here is a PoA of two keys, as we have currently implemented it.</span> <span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia",serif" xml:lang="EN-US">If you recombine the JWTs to compact serialization, you can use <a href="https://jwt.io/">https://jwt.io/</a> to see that they both validate against the public keys in the payload.</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">{</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">  "payload": "eyJpc3MiOiJodHRwczovL3dhbGxldC5lZGkucmlqa3NvdmVyaGVpZC5ubCIsImF1ZCI6Imh0dHBzOi8vZXhhbXBsZS5jb20vaXNzdWFuY2UvIiwibm9uY2UiOiJXMjJsVTY5a29LRlNINUZadW52ck5kanhqbndLRnQzVCIsImlhdCI6MTcyOTQzNzE1MywiandrcyI6W3sia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsIngiOiJGV1Rla3JNY2xFX1hIMzZpaXpBeU9DSWlEQjYtM1U4Z3RCbFpsWDl2YWNZIiwieSI6InI1aUNlYU9NUk1GMENjZkwtRjJaQ2o5TGRUemFwaWtabEFDcXItMVQ1QmMifSx7Imt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4IjoibG5lbFBRaThNTVdxTXV3cE95MWloN2lsaDktV2xYVloya3U3Ri04SHRzRSIsInkiOiJkM3NBbG9nTVd4X2JvYmRCeGdLbmVkcGM5X0VlWFRBYTNOZkhyd1JOZWpNIn1dfQ",</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">  "signatures": [</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">    {</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">      "protected": "eyJ0eXAiOiJwb2Erand0IiwiYWxnIjoiRVMyNTYifQ",</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">      "signature": "Fb25pcLORvBIRrEysJKP3U3pbcuOTCkZ9LFOlbNdyR-DDCUEnSzyVZu6u9eavtGyKVo9sK8a_LmyJ2X8YSDSlw"</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">    },</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">    {</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">      "protected": "eyJ0eXAiOiJwb2Erand0IiwiYWxnIjoiRVMyNTYifQ",</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">      "signature": "sM7C2ljWgVCztMGBd2bJAU0dg3tUk3ThQFQr3THnmf-YMqvAKSxROgCKJoeFipJTvmVb5CTy77PSSZvh4BODdg"</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">    }</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">  ]</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">}</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif">This can be used both during disclosure (allowing the wallet</span> <span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia",serif" xml:lang="EN-US">to</span> <span style="font-size:10.0pt;font-family:"Georgia",serif">prove that the keys of all involved credentials are managed by one WSCD, i.e. preventing credential pooling attacks), but for now I am interested in discussing issuance, where we use it as follows:</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif"> </span></p>
<ul style="margin-top:0cm" type="disc">
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l4 level1 lfo4"><span style="font-size:10.0pt;font-family:"Georgia",serif">The WTE is in our case not a signature by the Wallet Provider (WP) over a set of keys of which the WP declares that they are suitable to put in an credential. Instead it is its own credential (in JWT format), having its own public key like a credential always does, in a</span> <span style="font-size:10.0pt;font-family:Consolas">cnf</span> <span style="font-size:10.0pt;font-family:"Georgia",serif">header field.</span></li>
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l4 level1 lfo4"><span style="font-size:10.0pt;font-family:"Georgia",serif">During issuance of a set of credential copies, the wallet sends:</span>
<ul style="margin-top:0cm" type="circle">
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l4 level2 lfo4"><span style="font-size:10.0pt;font-family:"Georgia",serif">the PoPs of the keys of the credential copies, as usual;</span></li>
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l4 level2 lfo4"><span style="font-size:10.0pt;font-family:"Georgia",serif">the WTE and a PoP of the private key of the WTE;</span></li>
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l4 level2 lfo4"><span style="font-size:10.0pt;font-family:"Georgia",serif">a PoA over the WTE key and the key of the PoP of the credential.</span></li>
</ul>
</li>
</ul>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif">From this, the issuer infers that the WTE and the credential key belong to one WSCD, which was apparently deemed trustworthy by the WTE issuer, so that it is issuing its credential to a trustworthy key. The advantages of this approach is that the wallet doesn't need explicit blessings of the WP over every</span> <span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia",serif" xml:lang="EN-US">single</span> <span style="font-size:10.0pt;font-family:"Georgia",serif">key that a credential is issued to, which should lessen load on the WP and increase user privacy.</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif">Currently, in our implementation a Credential Request looks like this. Please note that this is just an initial implementation that we made to have a starting point; it is by no means final, and indeed I am mailing largely to talk about what this should become instead.</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">{</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">  "format": "mso_mdoc",</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">  "doctype": "com.example.pid",</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">  "proof": {</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">    "proof_type": "jwt",</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">    "jwt": "eyJ0eXAiOiJvcGVuaWQ0dmNpLXByb29mK2p3dCIsImFsZyI6IkVTMjU2IiwiandrIjp7Imt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4IjoiRldUZWtyTWNsRV9YSDM2aWl6QXlPQ0lpREI2LTNVOGd0QmxabFg5dmFjWSIsInkiOiJyNWlDZWFPTVJNRjBDY2ZMLUYyWkNqOUxkVHphcGlrWmxBQ3FyLTFUNUJjIn19.eyJpc3MiOiJodHRwczovL3dhbGxldC5lZGkucmlqa3NvdmVyaGVpZC5ubCIsImF1ZCI6Imh0dHBzOi8vZXhhbXBsZS5jb20vaXNzdWFuY2UvIiwibm9uY2UiOiJXMjJsVTY5a29LRlNINUZadW52ck5kanhqbndLRnQzVCIsImlhdCI6MTcyOTQzNzE1M30.4-sj7NyRqzEh4hPlSrhnf2HdkWzDrLJ33n9OCcjCV9GzMlC5ugCWcJ31Oa50E7kXysoL1CBqdmfdFFWbD31EWA"</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">  },</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">  "attestations": [ // The WTE and its PoP</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">    "eyJ0eXAiOiJqd3QiLCJhbGciOiJFUzI1NiJ9.eyJjbmYiOnsiandrIjp7Imt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4IjoibG5lbFBRaThNTVdxTXV3cE95MWloN2lsaDktV2xYVloya3U3Ri04SHRzRSIsInkiOiJkM3NBbG9nTVd4X2JvYmRCeGdLbmVkcGM5X0VlWFRBYTNOZkhyd1JOZWpNIn19LCJpc3MiOiJpc3MiLCJleHAiOjE3Mjk0MzcxNTN9.TAZKFgS_2Sqix0OplA62gZPP6I6bGHdudzBN6TXGxpSfhgFDONLnq8emNZ8-sIMm9N5lsRSdn-fp8S-UsmeCyg",</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">    "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJodHRwczovL3dhbGxldC5lZGkucmlqa3NvdmVyaGVpZC5ubCIsImF1ZCI6Imh0dHBzOi8vZXhhbXBsZS5jb20vaXNzdWFuY2UvIiwibm9uY2UiOiJXMjJsVTY5a29LRlNINUZadW52ck5kanhqbndLRnQzVCIsImlhdCI6MTcyOTQzNzE1M30.UY3x-z9w5Ks6NhywHT8NJ76wHtleAMDfHs6sIJ-E6TIA7V-zkeS39iDsiPqXm9VnJBiY-anzTgL3I0Kl5Xjz5w"</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">  ],</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">  "poa": {</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">    // as in the example above</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">  }</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">}</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif"> </span></p>
<p class="MsoNormal"><b><span style="font-size:14.0pt;font-family:"Georgia",serif">WTE and PoA in OpenID4VCI</span></b></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia",serif" xml:lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif">The current key attestation PR, <a href="https://github.com/openid/OpenID4VCI/pull/389">https://github.com/openid/OpenID4VCI/pull/389</a>, offers two ways of including a key attestation:</span></p>
<ul style="margin-top:0cm" type="disc">
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l3 level1 lfo5"><span style="font-size:10.0pt;font-family:"Georgia",serif">It may be included in the JWT header when using the Credential Request</span> <span style="font-size:10.0pt;font-family:Consolas">jwt</span> <span style="font-size:10.0pt;font-family:"Georgia",serif">proof type,</span></li>
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l3 level1 lfo5"><span style="font-size:10.0pt;font-family:"Georgia",serif">Alternatively, a new</span> <span style="font-size:10.0pt;font-family:Consolas">attestation</span> <span style="font-size:10.0pt;font-family:"Georgia",serif">proof type may be used.</span></li>
</ul>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif">Neither approaches seem suitable for our WTE and PoA, because:</span></p>
<ul style="margin-top:0cm" type="disc">
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l5 level1 lfo6"><span style="font-size:10.0pt;font-family:"Georgia",serif">In the first approach, we always have a single WTE and WTE PoP JWT and PoA, while a Credential Request may contain multiple</span> <span style="font-size:10.0pt;font-family:Consolas">jwt</span> <span style="font-size:10.0pt;font-family:"Georgia",serif">proofs;</span></li>
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l5 level1 lfo6"><span style="font-size:10.0pt;font-family:"Georgia",serif">The second approach misses a place for the WTE PoP JWT and the PoA. Additionally there is a semantic difference: a key attestation as defined in this PR (a signature over some keys) and a WTE (a credential) are very different things.</span></li>
</ul>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif">Given that this PR works (at least in the second approach) by adding a Credential Request proof type, we might consider adding yet another proof type for this, perhaps called</span> <span lang="EN-US" style="font-size:10.0pt;font-family:Consolas" xml:lang="EN-US">wte</span><span style="font-size:10.0pt;font-family:"Georgia",serif">, looking like this:</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">{</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">  "proof_type": "wte",</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">  "wte": {</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">     "jwt": [</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">       // PoPs as in the `jwt` proof type</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">     ],</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">     "wte": "<WTE JWT>",</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">     "wte_pop": "<PoP of WTE key>",</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">     "poa": {</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">       // PoA as in the example above</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">     }</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">  }</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas">}</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia",serif" xml:lang="EN-US">Alternatively, we could stick to the</span> <span lang="EN-US" style="font-size:10.0pt;font-family:Consolas" xml:lang="EN-US">jwt</span> <span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia",serif" xml:lang="EN-US">proof type and use <a href="https://datatracker.ietf.org/doc/draft-ietf-oauth-attestation-based-client-auth/">https://datatracker.ietf.org/doc/draft-ietf-oauth-attestation-based-client-auth/</a> for the WTE and its PoP, but then it seems a little strange to me that in that case the PoA would contain keys that are present in both the JSON body and a HTTP header of the HTTP request.</span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia",serif" xml:lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif">Finally, I should note that we have multiple ideas on how to implement the PoA. There is also an approach differing from the one I showed above in that it invol</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia",serif" xml:lang="EN-US">v</span><span style="font-size:10.0pt;font-family:"Georgia",serif">es zero-knowledge proofs. This approach has a number of advantages</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia",serif" xml:lang="EN-US">, but requires more</span> <span style="font-size:10.0pt;font-family:"Georgia",serif">cryptographic</span> <span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia",serif" xml:lang="EN-US">sophistication of the WSCD</span><span style="font-size:10.0pt;font-family:"Georgia",serif">, so we decided to go with what I wrote above for now. However, to allow for potential future other approaches it is probably sensible to include some name or identifier in the</span> <span lang="EN-US" style="font-size:10.0pt;font-family:Consolas" xml:lang="EN-US">poa</span> <span style="font-size:10.0pt;font-family:"Georgia",serif">field to identify the approach, like</span> <span style="font-size:10.0pt;font-family:Consolas">jwt</span> <span style="font-size:10.0pt;font-family:"Georgia",serif">and</span> <span lang="EN-US" style="font-size:10.0pt;font-family:Consolas" xml:lang="EN-US">attestation</span> <span style="font-size:10.0pt;font-family:"Georgia",serif">(and perhaps</span> <span lang="EN-US" style="font-size:10.0pt;font-family:Consolas" xml:lang="EN-US">wte</span><span style="font-size:10.0pt;font-family:"Georgia",serif">) are identifiers for the proof type. The one I introduced above could then perhaps be called</span> <span style="font-size:10.0pt;font-family:Consolas">json_</span><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas" xml:lang="EN-US">jwts</span><span style="font-size:10.0pt;font-family:"Georgia",serif">.</span> <span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia",serif" xml:lang="EN-US">(</span><span style="font-size:10.0pt;font-family:"Georgia",serif">But I am certainly open for suggestions concerning names.</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia",serif" xml:lang="EN-US">)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif">I would very much like to learn what you think about this approach. I hope I have explained our situation understandably, but if not please don't hesitate to ask questions. Or perhaps I could join one of the WG calls so we could discuss it further there. Let me know what you think.</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif">Thank you, kind regards,</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Georgia",serif">Sietse Ringers</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia",serif" xml:lang="EN-US">.</span></p>
</div>
--<br />
Openid-specs-digital-credentials-protocols mailing list<br />
Openid-specs-digital-credentials-protocols@lists.openid.net<br />
https://lists.openid.net/mailman/listinfo/openid-specs-digital-credentials-protocols<br /></blockquote>
</div>
</body>
</html>