Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

second attempt to add sd-jwt vcdm #147

Open
wants to merge 29 commits into
base: main
Choose a base branch
from
Open

second attempt to add sd-jwt vcdm #147

wants to merge 29 commits into from

Conversation

Sakurann
Copy link
Contributor

@Sakurann Sakurann commented Dec 19, 2024

resolves #128

intended as an altenative that supercedes #134

todo:

  • [] provide more details on the processing steps advisory (@awoie )
  • [] clean up the examples according to that (Kristina)

@Sakurann Sakurann marked this pull request as ready for review December 19, 2024 17:31
{
"vct": "https://credentials.example.com/identity_credential",
//W3C VCDM 2.0 compliant claims
"vcdm": {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resolving since discussion is continuing in another thread

//W3C VCDM 2.0 compliant claims
"vcdm": {
"@context": ["https://www.w3.org/ns/credentials/v2"],
"type": ["VerifiableCredential", "https://credentials.example.com/identity_credential"],

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should be top level and relationship with vct must be explained

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are various options, see above, but it seems that only one is reasonable.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I disagree. See my question on data model governance: https://github.com/openid/oid4vc-haip/pull/147/files#r1922674086


SD-JWT VCDM is a data model that follows IETF SD-JWT VC [@!I-D.ietf-oauth-sd-jwt-vc], but allows the usage of [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0]. When IETF SD-JWT VC is mentioned in this specification, SD-JWT VCDM define in this section MAY be used.

For backward compatibility with JWT processors, the following registered JWT claims MUST be used, instead of their respective counterpart properties in [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0]:
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

need to add a paragraph on vct claim and type property

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

option 1: keep completely independent. implementations need to define both - easiest to request via DCQL even if harder for the issuers.
option 2: redefine sd-jwt vc to make vct optional - would impact the rest of sd-jwt vc implementations
option 3: static vct for this case - makes it impossible to request using DCQL
option 4: define how to determine a vct value based on type values - hard to define

based on the discussion with @c2bo @danielfett @awoie @bc-pi choosing option 1.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The data model should not be impacted by DCQL. If it is, there's an issue in the design and should be resolved.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added this:
Implementaters of SD-JWT VCDM MUST use valid values for both vctClaim defined in IETF SD-JWT VC [@!I-D.ietf-oauth-sd-jwt-vc] andtype proprty defined in W3C VCDM [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0].


IETF SD-JWT VC is extended with the following claims:

* `vcdm`: OPTIONAL. Contains properties defined in [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0] that are not represented by their counterpart JWT Claims as defined above.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How is "vcdm" different from the good old "vc" claim?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I recommend removing the "vcdm" if the governance of the data model is well defined. (see my question on how to express claims from different vocabularies)

Copy link
Collaborator

@awoie awoie Jan 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The vcdm claim is there to allow JSON-LD processors to process the vcdm object which has to be a valid JSON-LD object in compact form. Some JSON-LD processors would have issues with terms that are not included in a context definition. There might be some SD-JWT and SD-JWT VC claims today or in the future that are not included and therefore cause issues. By encapsulating the JSON-LD stuff within vcdm, we guarantee this won't cause any issues. See my processing model suggestions https://github.com/openid/oid4vc-haip/pull/147/files#r1922554997.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

By encapsulating the JSON-LD stuff within vcdm

Isn't that exactly the same reason why you introduced vc a few years ago? Why not re-use that?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess vc would be fine, but it is an IANA-registered claim that's defined for use in a different context. Might be okay to re-use though. vcdm would make it clear that this claim is to be used with the processing model in mind that @awoie describes in one of the other suggested changes.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If implementations had issues
a) what are the issues?
b) can we contact them and learn more about the issues?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think vc won't be used. It would be "vcdm": { VCDM 1.1 or VCDM 2.0 stuff }.

But @Sakurann said:

IANA reserved vc for w3c vcdm 1.1

Wouldn't there be a lot of ambiguity and interop problems if you define two different JWT claims that can be used for the same purpose (VCDM 1.1)?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see how that would be a problem. The SD-JWT VC DM wrapper is new and has to be implemented anyway; any claim name would work. What is important is what is in the vcdm claim.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

any claim name would work

So are you saying if an Issuer wants to use VCDM 1.1 wrapped inside a JWT, they could use either the vc or vcdm claim, since both serve the same purpose? And would Verifiers also be expected to support both? Or pick one of the two?

Copy link

@danielfett danielfett Feb 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I meant to say that we can define any claim name here, without much impact on implementations. Whether they process vcdm, vc or foo doesn't matter. Of course we need to settle on one.

There may be a preference of one over the other for historic reasons, or because one has an existing IANA definition, or because one has clearer semantics, but other than that, it doesn't matter.

//W3C VCDM 2.0 compliant claims
"vcdm": {
"@context": ["https://www.w3.org/ns/credentials/v2"],
"type": ["VerifiableCredential", "https://credentials.example.com/identity_credential"],
Copy link
Collaborator

@awoie awoie Jan 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would remove the relationship between vct and type. We should acknowledge that the typing can be different. I assume that JSON-LD processors want their JSON-LD type system. To guarantee interop on the protocol level, e.g., query credentials in OID4VP, the vct value has to be used.

Suggested change
"type": ["VerifiableCredential", "https://credentials.example.com/identity_credential"],
"type": ["VerifiableCredential", "IdentityCredential"],

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This means you could have a situation where you request a driver's license on the OID4VP level, but then receive a VC with a type of birth certificate?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To guarantee interop on the protocol level, e.g., query credentials in OID4VP, the vct value has to be used.

I always thought OID4VP supports different credential formats? Is it now getting more tightly coupled to SD-JWT VC?

Copy link
Collaborator

@awoie awoie Jan 21, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This means you could have a situation where you request a driver's license on the OID4VP level, but then receive a VC with a type of birth certificate?

@peacekeeper It is the issuer's responsibility to avoid nonsensical situations like this. If the issuer is trusted, I'd assume this not going to happen and they would make sure that vct value and business logic object would align. For instance, this could be done via vct Type Metadata where the Type Metadata would say that for a given vct value the type property has to have certain values as well.

Copy link
Collaborator

@awoie awoie Jan 21, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I always thought OID4VP supports different credential formats? Is it now getting more tightly coupled to SD-JWT VC?

@peacekeeper It is not getting more tightly coupled. OID4VP does support any format. This PR is specifically about SD-JWT VCDM. Also note that this is the HAIP repository, not the OID4VP repository.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The goal is to have the selective disclosure capabilities of SD-JWT VC, but re-use existing data structures in W3C VCDM format. See the modified intro text: "SD-JWT VCDM credentials contain a data structure that can be processed using a JSON-LD processor after applying SD-JWT processing."

Copy link

@peacekeeper peacekeeper Jan 21, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The goal is to have the selective disclosure capabilities of SD-JWT VC, but re-use existing data structures in W3C VCDM format.

Apart from the fact that VCDM already supports selective disclosure using Data Integrity proofs (no SD-JWT needed), it ALSO supports securing VCDM with SD-JWT directly (no SD-JWT VC needed).

So why SD JWT VCDM?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So why SD JWT VCDM

If you asked me personally, one major advantage is that no JSON-LD is required whereas VCDM 2.0 requires the payload to be a valid JSON-LD object in compact form. It has more overhead and the idea is that while this should stay possible, it shouldn't be required. SD-JWT VCDM would allow for this.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@peacekeeper because SD-JWT VC does not cover several subjects like microcredentials, references to external formats. On other hand Selective Disclosure much easier as well as the subjects Olivermentioned. That's why SD-JWT VCDM needed. Also in context eIDAS. Recommend to focus on technical subjects here

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • base data format is JSON
  • if use cases want to use JSON-LD, JSON-LD should cover all the definitions needed to successfully process the data model (again, depending on for what purpose JSON-LD is used)
  • JSON-LD context MUST be treated as any referenced content in the data model (integrity protection, ability to share the data as unsigned payload); See related discussion: Data Integrity -> external resources w3c/vc-data-integrity#323 (comment)

Hence, I propose to remove the "VCDM" claim and the double-processing rules as it is creating confusion and repeating the error from the past.


SD-JWT VCDM credentials contain a data structure that can be processed using a JSON-LD processor after applying SD-JWT processing.

When IETF SD-JWT VC is mentioned in this specification, SD-JWT VCDM defined in this section MAY be used.

For backward compatibility with JWT processors, the following registered JWT claims MUST be used, instead of their respective counterpart properties in [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0]:
Implementaters of SD-JWT VCDM MUST use valid values for both `vct` Claim defined in IETF SD-JWT VC [@!I-D.ietf-oauth-sd-jwt-vc] and `type` proprty defined in W3C VCDM [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0].

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do they have to match or not? What happens if one client processes the vct claim, and another processes the type claim, and they arrive at different conclusions? To me it sounds like a huge source of ambiguity and potential problems if a data model contains basically the same concept twice ("type of a Verifiable Credential"). Especially if not only the values can be different, but also the way how the values are being expressed is different.

Saying that "it's the responsibility of the issuer" is a bit naïve I think...

@@ -255,6 +254,91 @@ Note: The issuer MAY decide to support both options. In which case, it is at the

A Credential Format Profile for Credentials complying with IETF SD-JWT VCs [@!I-D.ietf-oauth-sd-jwt-vc] is defined in Annex A.3 of [@!OIDF.OID4VCI] and Annex A.4 of [@!OIDF.OID4VP].

## SD-JWT VC Data Model (SD-JWT VCDM)

SD-JWT VCDM is a credential format that is compliant to IETF SD-JWT VC [@!I-D.ietf-oauth-sd-jwt-vc] that allows the usage of existing data structures represented using W3C VCDM [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0], while enabling selective disclosure.
Copy link

@peacekeeper peacekeeper Jan 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please change this sentence. While admittedly not strictly untrue, to most readers, this paragraph will only perpetuate the false claim that W3C VCDM does not support selective disclosure, which has been spread at various conferences and communities in the last years. The claim that SD-JWT VCDM is needed to do SIMPLE selective disclosure with W3C VCDM is equally untrue, as you can also just use plain SD-JWT if you really want. The introduction should explain this to avoid risk of further confusion and deception.


When IETF SD-JWT VC is mentioned in this specification, SD-JWT VCDM defined in this section MAY be used.

Implementaters of SD-JWT VCDM MUST use valid values for both `vct` Claim defined in IETF SD-JWT VC [@!I-D.ietf-oauth-sd-jwt-vc] and `type` proprty defined in W3C VCDM [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0].
Copy link
Member

@bc-pi bc-pi Jan 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Implementaters of SD-JWT VCDM MUST use valid values for both `vct` Claim defined in IETF SD-JWT VC [@!I-D.ietf-oauth-sd-jwt-vc] and `type` proprty defined in W3C VCDM [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0].
Implementers of SD-JWT VCDM MUST use valid values for both `vct` Claim defined in IETF SD-JWT VC [@!I-D.ietf-oauth-sd-jwt-vc] and `type` property defined in W3C VCDM [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0].

@@ -255,6 +254,91 @@ Note: The issuer MAY decide to support both options. In which case, it is at the

A Credential Format Profile for Credentials complying with IETF SD-JWT VCs [@!I-D.ietf-oauth-sd-jwt-vc] is defined in Annex A.3 of [@!OIDF.OID4VCI] and Annex A.4 of [@!OIDF.OID4VP].

## SD-JWT VC Data Model (SD-JWT VCDM)

SD-JWT VCDM is a credential format that is compliant to IETF SD-JWT VC [@!I-D.ietf-oauth-sd-jwt-vc] that allows the usage of existing data structures represented using W3C VCDM [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0], while enabling selective disclosure.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This, of course, doesn't strictly speak to the false cry of perpetuating claims that W3C VCDM does not support selective disclosure but might be more relatable to many readers.

Suggested change
SD-JWT VCDM is a credential format that is compliant to IETF SD-JWT VC [@!I-D.ietf-oauth-sd-jwt-vc] that allows the usage of existing data structures represented using W3C VCDM [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0], while enabling selective disclosure.
SD-JWT VCDM is a credential format that is compliant to IETF SD-JWT VC [@!I-D.ietf-oauth-sd-jwt-vc] that allows the usage of existing data structures represented using W3C VCDM [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0], while enabling a consistent approach to selective disclosure.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

false cry

I don't think it's helpful to bring emotions into this thread. There is no "cry", and it is not "false" to simply observe that SD-JWT (VC(DM)) proponents have made false claims about selective disclosure in W3C VCDM.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To try and be productive, I don't think this suggested change is helpful, since it still doesn't explain why SD-JWT VCDM is needed. If you want to enable "a consistent approach to selective disclosure", as this suggestion says, you can also just use plain SD-JWT with VCDM directly, without the SD-JWT VC extensions.

Therefore I still think this introduction needs to explain somehow what this work adds to what's already out there.

```json
{
"vct": "https://credentials.example.com/identity_credential",
"vcdm": { //W3C VCDM 2.0 compliant claims
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"vcdm": { //W3C VCDM 2.0 compliant claims
"vcdm": { //W3C VCDM 2.0 or 1.1 compliant claims

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does this mean for:

IANA reserved vc for w3c vcdm 1.1

}
```

The following is a non-normative example of how an unsecured payload of an SD-JWT VCDM above can be used for the SD-JWT:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Still not sure this sentience makes sense but the "an"s here weren't helping.

Suggested change
The following is a non-normative example of how an unsecured payload of an SD-JWT VCDM above can be used for the SD-JWT:
The following is a non-normative example of how the unsecured payload of the SD-JWT VCDM above can be used for the SD-JWT:

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this sentence is trying to say:

The following is a non-normative example of how to secure "application/vc" with "application/dc+sd-jwt":

```json
{
"_sd": [
"vwUhdFvpylx9Sqi2YNBV1dfVK6lCbhXvkH0nThfKFT0"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I realize it's just a "a non-normative example" but to my naïve little mind this implies that the vcdm claim is the only thing made selectively disclosable. And that doesn't make much sense to me.


When IETF SD-JWT VC is mentioned in this specification, SD-JWT VCDM defined in this section MAY be used.

Implementaters of SD-JWT VCDM MUST use valid values for both `vct` Claim defined in IETF SD-JWT VC [@!I-D.ietf-oauth-sd-jwt-vc] and `type` proprty defined in W3C VCDM [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0].
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Implementaters of SD-JWT VCDM MUST use valid values for both `vct` Claim defined in IETF SD-JWT VC [@!I-D.ietf-oauth-sd-jwt-vc] and `type` proprty defined in W3C VCDM [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0].
Implementaters of SD-JWT VCDM MUST use valid values for both `vct` Claim defined in IETF SD-JWT VC [@!I-D.ietf-oauth-sd-jwt-vc] and `type` property defined in W3C VCDM [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0].


* `vcdm`: OPTIONAL. Contains properties defined in [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0] that are not represented by their counterpart JWT Claims as defined above.

The following outlines a suggested non-normative processing steps for SD-JWT VCDM:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The following outlines a suggested non-normative processing steps for SD-JWT VCDM:
The following outlines a suggested non-normative set of processing steps for SD-JWT VCDM:

@peacekeeper
Copy link

Since there are discussions about the relationship between the vc and vcdm claims, I also wonder what all of this means for the vp claim?

Does SD-JWT VCDM support Verifiable Presentations?

@awoie
Copy link
Collaborator

awoie commented Jan 30, 2025

Since there are discussions about the relationship between the vc and vcdm claims, I also wonder what all of this means for the vp claim?

Does SD-JWT VCDM support Verifiable Presentations?

IMO, the vp claim is out of scope for this work and highly unlikely to be used. The VP, as defined in the W3C VCDM 2.0 for SD-JWT, is a fascinatingly unnecessary construct with a purpose that remains a mystery. For those who haven't had the pleasure, it's a JSON-LD object that wraps a base64url-encoded SD-JWT—for reasons that are, at best, questionable. Because VPs refer to the protocol layer, the SD-JWT (VC) representation should be used instead.

@peacekeeper
Copy link

JSON-LD object that wraps a base64url-encoded SD-JWT

That sounds pretty useless indeed, where is that defined? :)

But I was asking about Verifiable Presentations in general, I assume you wouldn't consider those an "unnecessary construct"? There are many projects and applications that use Verifiable Presentations. The Verifiable Credentials Data Model defines BOTH Verifiable Credentials and Verifiable Presentations.

Would it be correct to say that SD-JWT VC DM only supports the Verifiable Credentials part, but not the Verifiable Presentations part?

@filip26
Copy link

filip26 commented Feb 3, 2025

IMO, the vp claim is out of scope for this work and highly unlikely to be used. The VP, as defined in the W3C VCDM 2.0 for SD-JWT, is a fascinatingly unnecessary construct with a purpose that remains a mystery.

With all due respect, this is yet another unnecessary false claim. We should avoid such statements, as they detract from the quality of the discussion and tend to favor those who shout the loudest over those who present reasoned arguments.

The W3C VP enables the combination of multiple credentials into a single presentation, which is signed by the holder and then presented to a verifier. This mechanism plays a critical role in the interaction between the holder and the verifier.

As an independent open-source engineer and a European - directly affected by these issues - it's disheartening to see critical technologies being discussed in this manner, where valid points are diminished by false claims and dismissive rhetoric.

@awoie
Copy link
Collaborator

awoie commented Feb 5, 2025

IMO, the vp claim is out of scope for this work and highly unlikely to be used. The VP, as defined in the W3C VCDM 2.0 for SD-JWT, is a fascinatingly unnecessary construct with a purpose that remains a mystery.

With all due respect, this is yet another unnecessary false claim. We should avoid such statements, as they detract from the quality of the discussion and tend to favor those who shout the loudest over those who present reasoned arguments.

The W3C VP enables the combination of multiple credentials into a single presentation, which is signed by the holder and then presented to a verifier. This mechanism plays a critical role in the interaction between the holder and the verifier.

As an independent open-source engineer and a European - directly affected by these issues - it's disheartening to see critical technologies being discussed in this manner, where valid points are diminished by false claims and dismissive rhetoric.

The reason this is unnecessary in this context (OID4VP as a transmission protocol) is something I should have explained better—my apologies for that. While it has some value when combined with Data Integrity Proofs, it does not add any value when used with COSE/JOSE/SD-JWT. Here’s why:

The W3C VCDM 2.0 defines EnvelopedVerifiablePresentation and EnvelopedVerifiableCredential as envelopes for credentials and presentations when using COSE/JOSE/SD-JWT as the security mechanism. Both of these objects are JSON-LD structures, but any additional properties (or claims, in JOSE terms) added to them would remain unsigned, since the signature is encapsulated within the base64url-encoded blob inside the envelope.

Example: EnvelopedVerifiableCredential object using SD-JWT:

{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://www.w3.org/ns/credentials/examples/v2"
  ],
  "type": "VerifiablePresentation",
  "verifiableCredential": [{
    "@context": "https://www.w3.org/ns/credentials/v2",
    "type": "EnvelopedVerifiableCredential",
    "id": "data:application/vc+sd-jwt,eyJra...~"
  }]
}

Example: EnvelopedVerifiablePresentation object using SD-JWT:

{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://www.w3.org/ns/credentials/examples/v2"
  ],
  "type": "EnvelopedVerifiablePresentation",
  "id": "data:application/vp+sd-jwt,eyJhbGc...~"
}

Why This Adds No Value:

Unsigned Data is Meaningless

  • Any new properties added to EnvelopedVerifiablePresentation or EnvelopedVerifiableCredential remain unsigned and therefore lack cryptographic integrity.
  • In practice, this information is already conveyed at the protocol level (OID4VP), making its inclusion redundant.

Incompatibility with OID4VP Query Mechanisms

  • The W3C VCDM VP object is not a suitable container for multiple SD-JWT presentations because OID4VP has the vp_token for this.
  • It would break compatibility with query languages already defined in OID4VP, leading to unnecessary complexity without added benefit.

I hope this explanation makes more sense now, and I apologize if my previous articulation was unclear. Let me know if you have any further questions!

@peacekeeper
Copy link

I fully agree "EnvelopedVerifiableCredential" and "EnvelopedVerifiablePresentation" are "fascinatingly unnecessary constructs with a purpose that remains a mystery".

The same is true for this SD-JWT VCDM work.

In both cases, two incompatible data models are being mixed up in a complicated way, without any clear explanation other than "people want it".


When IETF SD-JWT VC is mentioned in this specification, SD-JWT VCDM defined in this section MAY be used.

Implementaters of SD-JWT VCDM MUST use valid values for both `vct` Claim defined in IETF SD-JWT VC [@!I-D.ietf-oauth-sd-jwt-vc] and `type` proprty defined in W3C VCDM [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0].
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Implementaters of SD-JWT VCDM MUST use valid values for both `vct` Claim defined in IETF SD-JWT VC [@!I-D.ietf-oauth-sd-jwt-vc] and `type` proprty defined in W3C VCDM [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0].
Implementaters of SD-JWT VCDM MUST use valid values for both `vct` Claim defined in IETF SD-JWT VC [@!I-D.ietf-oauth-sd-jwt-vc] and `type` property defined in W3C VCDM [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0].


For backward compatibility with JWT processors, the following registered JWT claims MUST be used, instead of their respective counterpart properties in W3C VCDM [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0]:

* To represent the validity period of SD-JWT VCDM (i.e., cryptographic signature), `exp`/`iat` Claims encoded as a UNIX timestamp (NumericDate) MUST be used, and not `expirationDate` and `issuanceDate` properties defined in [@!W3C.VCDM1.1], `validFrom` and `validTo` properties defined in [@!W3C.VCDM2.0].
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* To represent the validity period of SD-JWT VCDM (i.e., cryptographic signature), `exp`/`iat` Claims encoded as a UNIX timestamp (NumericDate) MUST be used, and not `expirationDate` and `issuanceDate` properties defined in [@!W3C.VCDM1.1], `validFrom` and `validTo` properties defined in [@!W3C.VCDM2.0].
* To represent the validity period of SD-JWT VCDM (i.e., cryptographic signature), `exp`/`nbf` Claims encoded as a UNIX timestamp (NumericDate) MUST be used, and not `expirationDate` and `issuanceDate` properties defined in [@!W3C.VCDM1.1], `validFrom` and `validTo` properties defined in [@!W3C.VCDM2.0].

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See:

iat is the time the token is issued, not the time at which the token is to be considered valid.

It's conceivable that a mismatch here would prevent use cases where I issue a credential now, that becomes active a day from now.

You could also say that for simplicity it is not possible to issue sd-jwt-vc with validity periods which exist in the future, and leave the current text, and resolve this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could there be valid scenarios where exp, iat, nbf, validFrom, validTo all have different values?

Or is the idea that validFrom, validTo are ignored, just like this PR also proposes to ignore other VC properties?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

* To represent the validity period of SD-JWT VCDM (i.e., cryptographic signature), `exp`/`iat` Claims encoded as a UNIX timestamp (NumericDate) MUST be used, and not `expirationDate` and `issuanceDate` properties defined in [@!W3C.VCDM1.1], `validFrom` and `validTo` properties defined in [@!W3C.VCDM2.0].
* `iss` Claim MUST represent the identifier of the `issuer` property, i.e., the `issuer` property value if `issuer` is a String, or the `id` property of the `issuer` object if `issuer` is an object. `issuer` property MUST be ignored if present.
* `status` Claim MUST represent `credentialStatus` property. `credentialStatus` property MUST be ignored if present.
* `sub` Claim MUST represent the `id` property of `credentialSubject` property. `credentialSubject` property MUST be ignored if present.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* `sub` Claim MUST represent the `id` property of `credentialSubject` property. `credentialSubject` property MUST be ignored if present.
* `sub` Claim MUST represent the `id` property of `credentialSubject` property. `credentialSubject` property MUST be ignored if present. There is no support for the case where `credentialSubject` is an array.


IETF SD-JWT VC is extended with the following claims:

* `vcdm`: OPTIONAL. Contains properties defined in [@!W3C.VCDM1.1] or [@!W3C.VCDM2.0] that are not represented by their counterpart JWT Claims as defined above.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't do this.

Just let the claimset be defined as a JWT claimset.
And allow any properties that are not understood to be ignored.
Do not introduce a nested object, it breaks compatibility with the TR defined here:

https://www.w3.org/TR/vc-jose-cose/#securing-with-sd-jwt

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree with @OR13 , inserting one data model as a nested object inside another data model will lead to interop problems.

1. SD-JWT VC Processing:

- A receiver (holder or verifier) of an SD-JWT VCDM applies the processing rules outlined in Section 4 of [@!I-D.ietf-oauth-sd-jwt-vc], including verifying signatures, validity periods, status information, etc.
- If the `vct` value is associated with any SD-JWT VC Type Metadata, schema validation of the entire SD-JWT VCDM is performed, including the nested `vcdm` claim.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just say that when vct is present it overrides any application profile type specific processing that might have been implied by type as described in https://www.w3.org/TR/vc-data-model-2.0/#types

"type": ["VerifiableCredential", "https://credentials.example.com/identity_credential"],
"credentialSubject": {
"given_name": "John",
"family_name": "Doe",
Copy link

@OR13 OR13 Feb 7, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these terms are not defined in https://www.w3.org/ns/credentials/v2, so you either need to add another context to the top level, or leave them defined like this to highlight that the RDF part of JSON-LD rarely works.

The "correct" way to fix this is to put a second context in the claimset which you are intending to be well formed JSON-LD, like this:

  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://credentials.example.com/ns/credentials/examples/v2"
  ],

or

  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    { "@vocab": "https://schema.org/" }
  ],

For example: https://github.com/schemaorg/schemaorg/blob/9aa7bd2b51717bceb825a3ef551fca89016e1e1f/data/sdo-soso-dataset-examples.txt#L22

Copy link

@OR13 OR13 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Drop the "vcdm" claim... Or... use the existing "vc" claim which at one point was planned to be deprecated, and now its unclear how it would relate to this PR... I filled w3c/vc-jose-cose#329

Copy link
Member

@selfissued selfissued left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@leecam commented during today's working group call that anything we put in HAIP effectively creates implementation requirements for all ecosystem participants. Therefore, there should be a high bar for deciding to add things to HAIP. I agree.

Personally, I don't think that creating an implementation requirement for VCDM 1.1 would be a step forward. I'd therefore prefer not to add this.

@steffenschwalm
Copy link

@leecam commented during today's working group call that anything we put in HAIP effectively creates implementation requirements for all ecosystem participants. Therefore, there should be a high bar for deciding to add things to HAIP. I agree.

Personally, I don't think that creating an implementation requirement for VCDM 1.1 would be a step forward. I'd therefore prefer not to add this.

As long as HAIP should be used in eIDAS Framework the SD-JWT VCDM is essential in order to achieve legal compliance and interoperability with existing ecosystems and standardization framework. But as it´s focused on Europe maybe it might be better to shift the standardization work on this subject to European standardization body to avoid affects for non-European parties.
@tlodderstedt

@David-Chadwick
Copy link

@selfissued Presumably you comment does not apply to VCDM 2.0? (which is why I gave it a thumbs up)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

add sd-jwt vcdm to HAIP