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

Add nonTransferable property to credentials vocab #969

Closed
wants to merge 1 commit into from
Closed

Add nonTransferable property to credentials vocab #969

wants to merge 1 commit into from

Conversation

matthieubosquet
Copy link

The nonTransferable property is missing from all contexts and the vocab.

It sounds like an important concept that should be part of the main vocab.


Note

The Subject-Holder relationships section is where the nonTransferable property was described in VC data model v1, however that section has been moved to the implementation guidelines, therefore, the nonTransferable property cannot currently be found in the V2 data model spec.

Potentially, a property so important as to convey the concept of transferability should be added to the VC Data Model 2.0 - Advanced Concepts under a new Section "5.11 Transferability".

What do you think?

@iherman
Copy link
Member

iherman commented Nov 2, 2022

The issue was discussed in a meeting on 2022-11-02

  • no resolutions were taken
View the transcript

1.2. Add nonTransferable property to credentials vocab (pr vc-data-model#969)

See github pull request vc-data-model#969.

Manu Sporny: next item is 969.
… this one is controversial.
… one of them is that a non-WG member suggesting normative changes.
… may want to talk with mateo.
… other thing is to have a nonTransferable to property to core, which has not reached consensus.
… expecting PR to be blocked possibly.

Ivan Herman: every member of the WG has the right to create normative changes.

Manu Sporny: we are concerned about having non members doing normative changes due to IPR etc..

Shigeya Suzuki: I'm actually had plan to create PR to remove these complex structures. (wrt multilingual).

Shigeya Suzuki: (haven't had time to realize it..).

Manu Sporny: chairs, staff, we should have a quick chat.
… but we want them to be engaging.

Ivan Herman: we should have a timing thing about it, if Mateo doesn't react that by then, we are closing without any further steps.

@matthieubosquet
Copy link
Author

@msporny is there a preferred channel on which we could maybe discuss options?

I have linked my w3c account to my GitHub account after seeing that the CI failed. I’d love to join the WG if it’s an option and seems appropriate to you. I don’t have any intention of claiming any IP on contributions and I would happily take the necessary steps for legal compliance.

@jandrieu
Copy link
Contributor

jandrieu commented Nov 2, 2022

A credential itself is, by its nature, transferable. The actual digital object, serialized to JSON, can be sent via any digital channel.

As such, I don't believe it is an appropriate property for the VC data model.

@David-Chadwick has mentioned the health club membership card as a use case, where the card itself has the term "Non-transferable" on it. This is a fine use case and should be supported by VCs.

However, I believe it is not the VC (and the card) that is non-transferable, it's the privileges associated with the claims that are not transferable. It isn't that a member cardholder is unable to physically transfer the membership card, it's that the membership privileges referenced by the card are non-transferable. Compare with "membership" cards that might be fully transferable as they represent a promotion or one-day pass or the sort.

In this use case, it is the privilege that is non-transferable, not the VC.

As such, the VC could say something like


{
  "credentialSubject" : {
     "id" : "did:ex:subject",
     "nonTransferablePrivilege" : "Silver Membership"
  }
}

Which reads to me as the person in control of "did:ex:subject" has the non-transferable privilege of a Silver Membership, whatever that means to the Issuer.

On the contrary, if we use this alternative as referenced in the implementation guide:

{
  "credentialSubject" : {
     "id" : "did:ex:subject",
     "membershipLevel" : "Silver"
  },
  "nonTransferable":true
}

Then, we can read that as the person in control of did:ex:subject has a "Silver" membership, whatever that means, and the VC itself is non-transferable.

It actually ends up NOT making the statement that I believe @David-Chadwick is looking for. Namely, the actual transferability of the privilege is not stated. Only the transferability of the VC itself.

The VC itself is transferable.
The privilege is not.

IMO, the former use, with the transferability as part of the claim set maps more closely to the actual semantic meaning.

This matters because VCs are statements. Full stop.

As statements, we verify that the assertion has not been tampered with (proofs) and that the issuer still stands by the statement (status).

Who those statements are made to, for what reason is, IMO, out of scope of the VC spec itself. And when we move into restrictions on the use of statements, we move into censorship and digital rights management issues.

It's not just that "information wants to be free". It's that we are building a layered architecture that provides specific features at different layers. We have an identification layer with DIDs and URLs. We have an assertion layer with VCs. On top of VCs, we can build anything by making statements that express whatever we want. It's in those statements that we can bootstrap authorization mechanisms and even restrictions on use of certain privileges.

As statements, transferability is fundamental and should not be restricted.

As privileges described by those statements, restrictions are easily supported.

I would recommend we update the implementation guide to reflect that. I'm concerned that the current language implies a capability that simply doesn't exist.

That said, we do still have a gap in the specification where holders lack a standard way to explain in the VP their relationship to the VCs presented. The equivalence of identifiers between VP creators and VC subjects is just one possible relationship. We need more flexibility and better consensus standards about how to represent things like that described in Section 5.1 of the use cases document https://www.w3.org/TR/vc-use-cases/#citizenship-by-parentage In particular, we state there that the VP includes assertions, but we don't have standardized support for how to do that except as an additional VC. And as such, it's a pattern that requires fairly sophisticated processing on behalf of the verifier to be able to programmatically interpret arbitrary VC claims.

@msporny
Copy link
Member

msporny commented Nov 3, 2022

@matthieubosquet wrote:

I have linked my w3c account to my GitHub account after seeing that the CI failed. I’d love to join the WG if it’s an option and seems appropriate to you. I don’t have any intention of claiming any IP on contributions and I would happily take the necessary steps for legal compliance.

Oh, you're with Inrupt! :) They're a W3C Member. @csarven is Inrupt's AC Rep. All you need to do is get Sarven to add you to the group as a WG Member... Inrupt is already a member of the VCWG. This should be a fairly simple and straight-forward task.

@csarven can you please add @matthieubosquet to the VCWG? We'd love to have more PRs from him as long as we can clear up the IPR concerns.

@iherman
Copy link
Member

iherman commented Nov 5, 2022

Regardless of the membership/IPR issues, even if the changes are accepted, this PR should not be merged as is. We are caught here on the PR-s #968 and #964, and their mutual interrelations. Once those PR-s are merged, the core file to create the vocabulary will not be the csv file, that is changed by this PR, but its YAML equivalent.

@msporny, @mkhraisha, it becomes important to solve those pending PR-s asap, see #964 (comment). @matthieubosquet once all these are solved, I am happy to transfer the changes you propose in this PR into the YAML equivalent to speed up things.

@msporny msporny added the DO NOT MERGE PR contains something that should not be merged. label Nov 5, 2022
Copy link
Member

@msporny msporny left a comment

Choose a reason for hiding this comment

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

This PR adds a property that is likely to not achieve consensus in its current form. Further WG discussion is needed, thus I've marked this PR "DO NOT MERGE" and "discuss" until further notice.

@msporny msporny added the discuss label Nov 5, 2022
@csarven
Copy link
Member

csarven commented Nov 6, 2022

Manu, thanks for the nudge and welcoming Matthieu. Matthieu is now a member of the VCWG.

@iherman
Copy link
Member

iherman commented Nov 6, 2022

@matthieubosquet is now bona fide WG member (welcome!). I have therefore let the pending workflow run its course; there should not be any administrative obstacle for merging (if and when the time comes).

@TallTed
Copy link
Member

TallTed commented Nov 8, 2022

In addition to what @jandrieu said, nonTransferable was moved to the Implementation Guide in large part because there was (and I believe remains) no technological mechanism by which to enforce it; rather, it falls under business logic, which is outside the scope of the Data Model. Putting it into the core VCDMv1 implies technological enforceability, and that just doesn't exist at this time, if it ever does.

@David-Chadwick
Copy link
Contributor

@TallTed non-transferrable is technically enforceable in the case where issuee EQ holder. The verifier can verify this property and say that the VC is not verifiable when a holder, who is NE issuee, presents it. If the holder then passes the VC back to the issuee, then the issuee can present it and it will be verifiable.
Note. issuee is independent of who the subject or the holder is. Issuee is the entity that the issuer issued the VC to and said it was non-transferrable. This is another reason why we need to add the issuee property to the v2 DM

@logpo
Copy link

logpo commented Nov 9, 2022

@TallTed non-transferrable is technically enforceable in the case where issuee EQ holder.

I'm not sure this is true, If I am issued a credential what is stopping me from giving someone else the credential and the private key it was issued to? Even if it is issued to an HSM that can't export the key what if I give my device to someone else to use?

IMO adding this just adds a source of confusion where it is not clear to me what should be verified and I think this is something that should be a claim in a credential not in the core data model

@David-Chadwick
Copy link
Contributor

@logpo We have already agreed that with technology as it is today no verifier can be assured that the remote biological entity is the same one to whom the cryptographic key (and VC) was orginally issued. There are technologies in the pipeline that can do this (e.g. binding the VC issuing and phone to just one fingerprint so that the same fingerprint has to be used to create the VP, but these types of biological imprinting mechanism are not yet widely deployed).
Whether the claim is in the credential or data model is independent of the biological binding issue.

@matthieubosquet
Copy link
Author

matthieubosquet commented Nov 15, 2022

As a verifier, I will only trust some issuers to issue specific types of VCs.

As an issuer of a specific type of VC, I might want to assert that the VC cannot be transferred.


For example, let's say that an organisation such as a health ministry wants to issue medical license VCs but does not want doctors to transfer them:

{
 ...
"type": ["VerifiableCredential", "MedicalLicense"],
"issuer": "did:web:health-ministry.example.org",
"issuanceDate": "2022-05-01T19:23:24Z",
"credentialSubject": {
  "id": "did:web:health-ministry.example.org:doctors:bob"
  },
"nonTransferable": true,
...
}

The above example shows that did:web:health-ministry.example.org issued a MedicalLicense.

As a person with digital health records, I want to configure something simple: I recognise did:web:health-ministry.example.org as a legitimate issuer of MedicalLicense and trust presentation of such a VC to warrant access to my health records.

Now a random doctor asserted their identity as did:web:health-ministry.example.org:doctors:bob... my access control system does not care who Bob is, it cares that Bob is the rightful holder of a MedicalLicense issued by did:web:health-ministry.example.org.

My access control system will check:

  1. The VC issuer;
  2. The VC/VP proofs;
  3. The VC type;
  4. Bob's identity and the subject-holder relationship of Bob to the VC.

My access control system doesn't even know anything specific about a MedicalLicense, nor does it implement any custom logic related to it; It just knows that I've allowed reading my health records for anyone presenting a VC of type MedicalLicense issued by did:web:health-ministry.example.org:doctors:bob.

Now, if did:web:health-ministry.example.org doesn't have a way to mark the VC as non-transferable, then my access control system will accept a presented MedicalLicense that Bob has reissued to their friend Alice (as per "Subject Passes a Verifiable Credential to Someone Else").

{
...
"type": ["VerifiablePresentation"],
"verifiableCredential": [
  {
     ...
    "type": ["VerifiableCredential", "MedicalLicense"],
    "issuer": "did:web:health-ministry.example.org",
    "issuanceDate": "2022-05-01T19:23:24Z",
    "credentialSubject": {
      "id": "did:web:health-ministry.example.org:doctors:bob"
      },
    ...
   },
  {
     ...
    "type": ["VerifiableCredential", "MedicalLicense"],
    "issuer": "did:web:health-ministry.example.org:doctors:bob",
    "issuanceDate": "2022-11-15T01:23:24Z",
    "credentialSubject": {
      "id": "did:web:random.example.org:id:alice"
      }
    ...
   }
],
...
}

It is problematic that Bob could reissue a medical license because only did:web:health-ministry.example.org should be trusted to issue such a VC (as per the health ministry's requirements).

I generally think that the subject-holder relationship is very important to enable the use and adoption of VCs (which I think can be a really nice and useful abstraction layer for role-based access control).

In other words, as an issuer, I generally would not like to define custom verification logic for every new VC type issued, let alone hope for alignment of such logic on the side of every verifier out there. I would rather like to trust a standard "righful holder" model/verification mechanism is being implemented accross the board and access can be configured based on VC type+issuer identity. That's why I think that the nonTransferable property is an important property for interoperability of VCs.

@TallTed
Copy link
Member

TallTed commented Nov 15, 2022

I've allowed reading my health records for anyone presenting a VC of type MedicalLicense issued by did:web:health-ministry.example.org:doctors:bob.

This would appear to be an error on your part, because the earlier text indicated that you

recognise did:web:health-ministry.example.org as a legitimate issuer of MedicalLicense and trust presentation of such a VC to warrant access to my health records.

To rephrase -- did:web:health-ministry.example.org is a legitimate issuer of MedicalLicense; did:web:health-ministry.example.org:doctors:bob is not.

There is no need for nonTransferable here, and it would have no impact even if it were present, because there was no transfer of MedicalLicense.

@matthieubosquet
Copy link
Author

The VC was issued by a trusted authority and transferred. That’s fine from my access control system’s perspective. There is a clear and valid chain of trust going back to a trusted issuer.

@TallTed
Copy link
Member

TallTed commented Nov 16, 2022

That’s fine from my access control system’s perspective.

Except that it is not fine, as you've just shown.

@matthieubosquet
Copy link
Author

Except that it is not fine, as you've just shown.

My point is about keeping the verifier logic generic (and keep custom business logic that is associated with a specific VC type at the issuance level) which also means that a machine readable property for the Issuer to indicate that a VC is not transferable is very useful.

@jandrieu
Copy link
Contributor

Cross-linking to related discussion #959 (comment)

@iherman
Copy link
Member

iherman commented Nov 30, 2022

The issue was discussed in a meeting on 2022-11-30

  • no resolutions were taken
View the transcript

2.1. Add nonTransferable property to credentials vocab (pr vc-data-model#969)

See github pull request vc-data-model#969.

Manu Sporny: objections to PR for nonTransferable property; 969 - could use a special topics call.

Kristina Yasuda: was this filed as PR without discussion?.

Manu Sporny: yes but in the past we allowed for this.

Oliver Terbu: #960 might be the issue.

@iherman
Copy link
Member

iherman commented Dec 8, 2022

The issue was discussed in a meeting on 2022-12-07

  • no resolutions were taken
View the transcript

1.1. Add nonTransferable property to credentials vocab (pr vc-data-model#969)

See github pull request vc-data-model#969.

Manu Sporny: VCDM first. two PRs - one is nonTransferrable property. do not merge is listed on it. some discussion, but need more. chances of it making it in are fairly slim. don't know what the group should do with prs like this. can leave it open. hasn't been much progress.

@OR13 OR13 self-requested a review December 14, 2022 13:44
Copy link
Contributor

@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.

conflicts exist, I suggest this PR be closed until the specification has addressed holder binding more completely.

@awoie
Copy link
Contributor

awoie commented Dec 14, 2022

I agree, at the moment it seems we need something better than nonTransferable. Also suggest closing this.

@mprorock
Copy link
Contributor

agree - i think we should close this for now

@jandrieu
Copy link
Contributor

Recommend we close this as the conversation about holder binding has overtaken this thread.

@iherman
Copy link
Member

iherman commented Dec 14, 2022

The issue was discussed in a meeting on 2022-12-14

  • no resolutions were taken
View the transcript

3.1. Add nonTransferable property to credentials vocab (pr vc-data-model#969)

See github pull request vc-data-model#969.

Manu Sporny: status updates - VC Data Integrity no updates, Nontranfereable property, with good discussion on Special Issue call..
… not sure what to do about closing, wait for more comments.

David Chadwick: use cases will put into the holder binding..
… when we have new feature we can say it is reproduced or replaced by this new PR.

Manu Sporny: watch the holder binding discussion and is it ok to close this PR if it takes several weeks or months to resolve (969).

@David-Chadwick
Copy link
Contributor

Since there is already a use case for having nonTransferrable VCs, in order to support existing plastic cards that already contain this feature, then there will be a PR to resolve this use case in due course.

I think the usual procedure that we have adopted previously (@TallTed correct me if I am wrong) is to keep this PR open but mark it pending closure, and only to close it once the replacement PR has been written, so that this PR can point to its successor.

@TallTed
Copy link
Member

TallTed commented Dec 14, 2022

The whole "nontransferable" thing is business logic, to my thinking, and does not belong in the main VCDM.

@mccown
Copy link

mccown commented Dec 15, 2022

This is a great discussion of the "should VCs be transferrable?" question. As @jandrieu commented (Nov 2) and @TallTed commented (Dec 14), this really does seem like business logic and enforceable by policy.

This brings up the question of, what should happen if a VC is transferred? Perhaps, this is addressed in the related PRs, but documenting how to detect a transferred VC would assist those verifiers that are seeking to reject transferred VCs without adding this particular field to the VCDM.

@David-Chadwick
Copy link
Contributor

@TallTed Are you inferring that when an Issuer issues a VC it cannot indicate anywhere in the VC what the intended business purpose is or how it can state what the legal purposes of the VC are once it has been issued? If so I disagree with you. Some issuers that issue certificates to users today do place controls on their intended use (cf. the key usage property in X.509 PKCs, or the T&Cs applied to plastic credit cards). Whilst these ToUs cannot stop the user doing what it wants to with the VC, it can inform verifiers which verifications the issuer will take some responsibility for and which are outside its ToUs (in the latter case the verifier is 100% on its own whether it wants to accept the VC or not, and takes all the risk).

@TallTed
Copy link
Member

TallTed commented Dec 15, 2022

@David-Chadwick

@TallTed Are you inferring [implying] that when an Issuer issues a VC it cannot indicate anywhere in the VC what the intended business purpose is or how it can state what the legal purposes of the VC are once it has been issued?

No, an Issuer can say anything it likes in the PAYLOAD of the VC.

I'm saying that "intended business purpose" and/or "legal purposes" are BUSINESS LOGIC; they have nothing to do with the VCDM.

Everything else you said continues to be about BUSINESS LOGIC.

@David-Chadwick
Copy link
Contributor

@TallTed

"No, an Issuer can say anything it likes in the PAYLOAD of the VC."

Then we are in agreement about this. Perhaps where we disagree is in the definition of the payload.
In my mental model the payload is the credentialSubject (the claims) and the metadata about the claims such as validity period and ToUs.

the Proof is then the issuer's cryptographic information used to protect the payload.

@msporny
Copy link
Member

msporny commented Dec 18, 2022

@matthieubosquet it is highly unlikely that this PR is going to get in before the "holder binding" discussions have completed. Given how those discussions are going, it's also unlikely that a nonTransferable property will be added to the data model in its current form.

Would you object to us closing this PR for now as we like to keep the PR queue fairly clean and this one has been lingering for almost two months now, and it will probably be another 2-3 months before we close and/or adopt it.

We're going to close this PR within 14 days unless we hear an objection back from you.

@msporny msporny added the pending close Close if no objection within 7 days label Dec 18, 2022
@matthieubosquet
Copy link
Author

No objection to keeping the PR queue fairly clean and closing this PR.

All I'm interested in is that the questions of non-transferability and holder-binding find clear answers!


For the record: I think that non-transferability of VCs should be enforceable via a generic VC property (not VC-type specific/part of the credential subject) because an issuer should be able to restrict transfer and a verifier should be able to understand that restriction without having to implement VC-type specific business logic.

@msporny
Copy link
Member

msporny commented Jan 6, 2023

@matthieubosquet wrote:

No objection to keeping the PR queue fairly clean and closing this PR.

Acknowledged, closing (noting your preference of having a generic property to convey non-transferability).

@msporny msporny closed this Jan 6, 2023
@TallTed TallTed mentioned this pull request Apr 3, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
discuss DO NOT MERGE PR contains something that should not be merged. pending close Close if no objection within 7 days
Projects
None yet
Development

Successfully merging this pull request may close these issues.