[Openid-specs-digital-credentials-protocols] A proposed solution, based on Orie's

Francisco Corella fcorella at pomcor.com
Thu Oct 24 18:51:44 UTC 2024


Hi Orie,

 
Thank you for asking if I can propose a solution.  I wasn't planning to, I was just reporting a problem.  But since you asked I came up with one, which builds on what you propose in the message below.

 
To motivate the solution, let me point out that there are two distinct kinds of cryptography: traditional cryptography (the cryptography of academia, the crypto conferences and the Journal of Cryptology) and W3C cryptography.

 
One thing I like about W3C cryptography is that it is innovative.  It has come up with both good and bad innovations.  The solution I'm proposing includes one good innovation and remedies for two bad innovations.

 
One bad innovation is verifiable presentations.  In traditional cryptography, a credential presentation is a protocol for presenting the credential, not something with a life of its own, signed by a party possible different from the subject.  Allowing the presentation to be signed by a party other than the subject creates opportunities for application errors and increases the attack surface, enabling impersonation attacks like the one I described yesterday.

 
The remedy to this is what you proposed: a cnf field in the credential.  The verificationMethod field in the VP should be deprecated, not just made redundant or optional, since leaving it there would not reduce the attack surface.

 
The other bad innovation is burying the public key used to verify the presentation in a DID document, instead of having it explicitly signed by the issuer.  That also provides opportunities for application vulnerabilities and increases the attack surface.

 
To remedy this I propose using one the good innovations of W3C cryptography: using the hash of a public key instead of the public key itself.  I found that idea in the did:peer specification.  I propose the use an encoded hash of the public key as the value of the cnf field.  When presenting the credential, the subject would send the public key along with the signature, and the verifier would check that the hash of the public key that it receives agrees with the value of the cnf field.

 
Using the hash of the public key has two advantages over using the public key itself as is done in traditional public key certificates: the hash is shorter, and the private key is protected against post-quantum attacks by an attacker with access to the certificate.  This is a valuable innovation with many possible uses, which could be retrofitted from W3C cryptography into traditional cryptography.  I've mentioned this to a traditional cryptographer and he was impressed by the potential benefit.


 
Francisco

-----Original message-----
From: Orie Steele <orie at transmute.industries>
Sent: Wednesday, October 23 2024, 1:47 pm
To: Francisco Corella <fcorella at pomcor.com>
Cc: Digital Credentials Protocols List <openid-specs-digital-credentials-protocols at lists.openid.net>; Gabe Cohen <gabe at tbd.email>; Veronica Wojnas <v.wojnas at gmail.com>; Sukhi Chuhan <sukhpreetchuhan at gmail.com>
Subject: Re: [Openid-specs-digital-credentials-protocols] NOT READY --- RE: FW: Working group last call for proposed OpenID4VP Implementer's Draft
 Then the issue is solved by doing this:

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "type": [
    "VerifiablePresentation"
  ],
  "verifiableCredential": [
    {
      "@context": [
        "https://www.w3.org/2018/credentials/v1",
        "https://www.w3.org/2018/credentials/examples/v1"
      ],
      "id": "https://example.com/credentials/1872",
      "type": [
        "VerifiableCredential",
        "IDCredential"
      ],
      "issuer": {
        "id": "did:example:issuer"
      },
      "issuanceDate": "2010-01-01T19:23:24Z",
      "cnf": { "kid": "did:example:holder" },
      "credentialSubject": {
        "id": "did:example:holder",
        "given_name": "Max",
        "family_name": "Mustermann",
        "birthdate": "1998-01-11",
        "address": {
          "street_address": "Sandanger 25",
          "locality": "Musterstadt",
          "postal_code": "123456",
          "country": "DE"
        }
      },
      "proof": {
        "type": "Ed25519Signature2018",
        "created": "2021-03-19T15:30:15Z",
        "jws": "eyJhb...JQdBw",
        "proofPurpose": "assertionMethod",
        "verificationMethod": "did:example:issuer#keys-1"
      }
    }
  ],
  "id": "ebc6f1c2",
  "holder": "did:example:holder",
  "proof": {
    "type": "Ed25519Signature2018",
    "created": "2021-03-19T15:30:15Z",
    "challenge": "n-0S6_WzA2Mj",
    "domain": "https://client.example.org/cb",
    "jws": "eyJhb...IAoDA",
    "proofPurpose": "authentication",
    "verificationMethod": "did:example:holder#key-1"
  }
}

Per the W3C VCDM the credential subject id is optional, as is "cryptographic binding" between credentials and subjects / holders using mechanisms like "cnf" or "DIDs".

Your suggestion is that the error in this example is grounds for not progressing the document, can you propose a solution?

There are lots of other problems with this example such as being for VCDM v1 (v2 is in progress right now, and including data integrity proofs that have been deprecated Ed25519Signature2018 (https://w3c-ccg.github.io/lds-ed25519-2018/)  is now: https://www.w3.org/TR/vc-di-eddsa

I recommend removing the example, or updating it to support version 2.

Regards,

OS




  On Wed, Oct 23, 2024 at 2:55 PM Francisco Corella <fcorella at pomcor.com> wrote:
The issue is NOT how you resolve DIDs, nor any other technical details of decentralized identifiers.

 
The issue is that there is no relationship between the credential subject and the holder of the presentation that can be cryptographically verified by the relying party.

 
Francisco

 
 
-----Original message-----
From: Orie Steele <orie at transmute.industries>
Sent: Wednesday, October 23 2024, 12:48 pm
To: Digital Credentials Protocols List <openid-specs-digital-credentials-protocols at lists.openid.net>
Cc: Gabe Cohen <gabe at tbd.email>; Francisco Corella <fcorella at pomcor.com>; Veronica Wojnas <v.wojnas at gmail.com>; Sukhi Chuhan <sukhpreetchuhan at gmail.com>
Subject: Re: [Openid-specs-digital-credentials-protocols] NOT READY --- RE: FW: Working group last call for proposed OpenID4VP Implementer's Draft
 The idea with these JSON-LD graph node identifiers, is that you have some document loader that resolves the identifiers to cryptographic material or other credentials.

So in W3C VCDM where you see:

kid: did:example:holder#key-1

You can mentally replace that with:

- urn:ietf:params:oauth:ckt:sha-256:SWvYr63zB-WwjGSwQhv53AFSijRKQ72oj63RZp2iU-w
- urn:ietf:params:oauth:jwk-thumbprint:sha-256:NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs

And then assume that *somehow* the issuers, holders and verifiers have all agreed to resolve key identifiers to public keys the same way, and that they confirm signatures the same way.

In terms of "credential binding", you can use the "cnf" claim in W3C VCDM credentials just like you can use it with CWTs / JWTs.

- https://www.iana.org/assignments/cwt/cwt.xhtml#confirmation-methodshttps://www.iana.org/assignments/jwt/jwt.xhtml#confirmation-methods

>From this view a "DID URL" aka "JSON-LD graph node identifier for a verification method", is just a special case of "weird looking" kid.

Notice that "kid" is in both registries as a valid confirmation method.

I'd suggest removing the DID examples from this specification before publishing or documenting what I have written above in the specification.

OS
  On Wed, Oct 23, 2024 at 2:26 PM Francisco Corella via Openid-specs-digital-credentials-protocols <openid-specs-digital-credentials-protocols at lists.openid.net> wrote:
That reference is not in the credential, it's in the presentation.  And it is not a reference to the subject of the credential.

 
Even if the verifier were able to find the public key of the holder in the DID document of the holder,

it would no way of verifying cryptographically that the credential was issued to did:example:holder.

 
Francisco

 
-----Original message-----
From: Gabe Cohen <gabe at tbd.email>
Sent: Wednesday, October 23 2024, 12:01 pm
To: Digital Credentials Protocols List <openid-specs-digital-credentials-protocols at lists.openid.net>
Cc: Francisco Corella <fcorella at pomcor.com>; Veronica Wojnas <v.wojnas at gmail.com>; Sukhi Chuhan <sukhpreetchuhan at gmail.com>
Subject: Re: [Openid-specs-digital-credentials-protocols] NOT READY --- RE: FW: Working group last call for proposed OpenID4VP Implementer's Draft
 There is a reference to it in what you’ve quoted
     "verificationMethod": "did:example:holder#key-1"
 If your implementation understands DIDs then this is a standard way to express referencing key material in a DID Document.
 The examples do need to be updated, however, I would not classify this as a fundamental security flaw. I have an issue to make the W3C VC examples better. 
 Gabe
 On Oct 23, 2024 at 11:48:26 AM, Francisco Corella via Openid-specs-digital-credentials-protocols <openid-specs-digital-credentials-protocols at lists.openid.net> wrote:
  Hello Mike,

 
Thank you for sending the last call and the current Editor's draft of the OpenID4VP specification.

 
I think the draft is not ready because it has a fundamental security flaw.

 
Section 2 says:

 
Cryptographic Holder Binding:
Ability of the Holder to prove legitimate possession of a Verifiable Credential by proving control over the same private key during the issuance and presentation. Mechanism might depend on the Credential Format. For example, in jwt_vc_json Credential Format, a Verifiable Credential with Cryptographic Holder Binding contains a public key or a reference to a public key that matches to the private key controlled by the Holder.

 
But Section B.1.2.3 has the following example of a verifiable presentation of a verifiable credential:

 
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "type": [
    "VerifiablePresentation"
  ],
  "verifiableCredential": [
    {
      "@context": [
        "https://www.w3.org/2018/credentials/v1",
        "https://www.w3.org/2018/credentials/examples/v1"
      ],
      "id": "https://example.com/credentials/1872",
      "type": [
        "VerifiableCredential",
        "IDCredential"
      ],
      "issuer": {
        "id": "did:example:issuer"
      },
      "issuanceDate": "2010-01-01T19:23:24Z",
      "credentialSubject": {
        "given_name": "Max",
        "family_name": "Mustermann",
        "birthdate": "1998-01-11",
        "address": {
          "street_address": "Sandanger 25",
          "locality": "Musterstadt",
          "postal_code": "123456",
          "country": "DE"
        }
      },
      "proof": {
        "type": "Ed25519Signature2018",
        "created": "2021-03-19T15:30:15Z",
        "jws": "eyJhb...JQdBw",
        "proofPurpose": "assertionMethod",
        "verificationMethod": "did:example:issuer#keys-1"
      }
    }
  ],
  "id": "ebc6f1c2",
  "holder": "did:example:holder",
  "proof": {
    "type": "Ed25519Signature2018",
    "created": "2021-03-19T15:30:15Z",
    "challenge": "n-0S6_WzA2Mj",
    "domain": "https://client.example.org/cb",
    "jws": "eyJhb...IAoDA",
    "proofPurpose": "authentication",
    "verificationMethod": "did:example:holder#key-1"
  }
}

 
The public key of the holder is "did:example:holder#key-1".  There is no reference to it in the verifiable credential, so cryptographic holder binding cannot be verified.

 
The root of this problem is that, in a verifiable credential, the signature of the issuer does not cover the public key of the subject.

 
I plan to call a session at next week's IIW to discuss this issue.

 
Best regards,

 
Francisco
 
-----Original message-----
From: Michael Jones via Openid-specs-digital-credentials-protocols <openid-specs-digital-credentials-protocols at lists.openid.net>
Sent: Wednesday, October 23 2024, 7:34 am
To: openid-specs-digital-credentials-protocols at lists.openid.net <openid-specs-digital-credentials-protocols at lists.openid.net>
Cc: Michael Jones <michael_b_jones at hotmail.com>
Subject: [Openid-specs-digital-credentials-protocols] FW: Working group last call for proposed OpenID4VP Implementer's Draft
 FYI

 
From: Openid-specs-ab <openid-specs-ab-bounces at lists.openid.net> On Behalf Of Michael Jones via Openid-specs-ab
Sent: Wednesday, October 23, 2024 7:31 AM
To: openid-specs-ab at lists.openid.net
Cc: Michael Jones <michael_b_jones at hotmail.com>
Subject: [Openid-specs-ab] Working group last call for proposed OpenID4VP Implementer's Draft

 
Dear OpenID Connect Working Group,

                                                                                     

We would like to get working group consensus that the current OpenID4VP draft is ready to start the Implementer’s draft approval process.  Please respond to this e-mail within the next week, by Wednesday, October 30th end of business hours in Pacific Time, saying whether you believe the current draft should proceed or not.

 
The current OpenID4VP document to be reviewed can be found here: https://openid.github.io/OpenID4VP/openid-4-verifiable-presentations-wg-draft.html.

 
The details of the Implementer’s Draft approval process can be found here: https://openid.net/wg/resources/approving-specifications/.  This e-mail is about the first bullet point on this list, which is sometimes called Working Group Last Call.  Following that, there’s a 45-day Foundation-wide review, followed by a 7-day voting period. (The poll itself will actually open 7 days before the end of the Foundation-wide review ends.)  If all goes smoothly, the voting will hopefully start on Monday, 16th December.

 
As shared on the working group calls, completing this Implementer’s Draft process promptly is an important step in obtaining IPR commitments for the specification, thereby enabling the DCP working group to adopt it.  This will allow the DCP WG to hopefully publish a final specification by the end of March for inclusion into the EUDI implementing acts.  We hope to get implementers’ feedback on this draft over the next few months so we can continue to perfect the specification before it becomes final.

 
                                -- Mike (writing as working group chair)

 
P.S.  Thanks to Joseph Heenan for drafting most of the text above!

 

-- 

Openid-specs-digital-credentials-protocols mailing list

Openid-specs-digital-credentials-protocols at lists.openid.net

https://lists.openid.net/mailman/listinfo/openid-specs-digital-credentials-protocols



--
Openid-specs-digital-credentials-protocols mailing list
Openid-specs-digital-credentials-protocols at lists.openid.net
https://lists.openid.net/mailman/listinfo/openid-specs-digital-credentials-protocols
--
Openid-specs-digital-credentials-protocols mailing list
Openid-specs-digital-credentials-protocols at lists.openid.net
https://lists.openid.net/mailman/listinfo/openid-specs-digital-credentials-protocols
  -- 
 
ORIE STEELE
Chief Technology Officer
www.transmute.industries


  -- 
 
ORIE STEELE
Chief Technology Officer
www.transmute.industries


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openid.net/pipermail/openid-specs-digital-credentials-protocols/attachments/20241024/01a229d0/attachment-0001.htm>


More information about the Openid-specs-digital-credentials-protocols mailing list