-
Notifications
You must be signed in to change notification settings - Fork 98
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
Fix assertion narrative clearly define the authoritative claims made when DID Key Controllers are not the DID Controller of the Document #831
Comments
Vitor, you raise a good point. A number of considerations about the relationship of the DID controller (controller of the keys for updating the DID document) to the DID subject (the entity identified by the DID) are discussed generally in Appendix B of the DID spec. We make it clear there that there are cases where DID controller may be entirely separate from the DID subject. However this separation often cannot be "seen" by an external party. Thus for any particular DID—or set of DIDs—it is up to the DID controller to specify the policies that it will follow with regard to key management and liability. At the Trust Over IP (ToIP) Foundation, such policies are declared in a governance framework. So it would be the governance framework followed by a particular digital trust ecosystem where the policies for key management and liability should be declared. |
I agree. It's just that it would conflict with the current narrative of the assertion, which forces it to be a DID Subject claim. |
The language in the spec is in error.
What I think is meant is that during validation the Verifiable Presentation (VP) proof creator can be checked against the subject identifier of one or more claims to establish that the current holder (and presenter) has access to the same private material as the subject (assuming the issuer performed a DID Auth before issuing to that subject DID). To wit: verification only checks the tamper-evident signature and the statusCheck property. The business rule that requires evaluating whether or not the presenter/holder is the subject is a part of validation not verification. Perhaps more important, a VC never has a proof by the subject. Only VPs would have that, if and only if, the holder is the subject. |
(Thanks @vitorpamplona for pointing me to this thread -- very relevant to our discussion on verifiable credentials for clinical data!) I'd like to introduce a concrete example (even if it's a silly one), because I'm not sure if everyone is talking about the same thing. Let's look at a DID Document involving four distinct entities:
{
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/suites/ed25519-2020/v1"
],
"id": "did:example:all-the-kings-men",
"controller": "did:example:the-king-of-town",
"assertionMethod": [{
"id": "did:example:all-the-kings-men#key-for-the-hornblower",
"type": "JsonWebKey2020",
"controller": "did:example:the-hornblower",
"publicKeyJwk": {/*omited for brevity*/}
}, {
"id": "did:example:all-the-kings-men#key-for-the-knight",
"type": "JsonWebKey2020",
"controller": "did:example:the-knight",
"publicKeyJwk": {/*omited for brevity*/}
}]
} With this configuration, reading the DID Core v1.0 spec:
I would conclude that
This makes perfect sense @talltree, in terms of policies about when and how to populate the ⟹ In my example, I'd think something was broken if The King of Town tried to say "When I write If we allowed The King to say this, it would seem to limit the usefulness of a standardized |
@jmandel presents an example, above. In that example, the literal controller of the DID, with the capability to modify the DID Document, has created two assertionMethod verification relationships which allow From a pragmatic perspective, it will be obvious which of those two keys are used when signing a VC issued under the authority of As such, I think you got it exactly right, @jmandel:
The DID Document MUST mean that signing with a verification method associated with an assertionMethod relationship is on behalf of the DID Controller for the presumed DID Subject. If the King merely wants to express that some of his staff use specific keys, he can issue a VC to that effect, although interpreting that VC will require understanding the semantics of the VC, because neither VCs nor DIDs are designed to directly express this notion using semantics from the core specifications. You can, of course, use a VC to say anything, so you can make these statements, provably as the King; you just need a vocabulary that disambiguates that statement clearly and which is known to ultimate recipients of the VC.. I also should point out that the following construct in the DID Document probably doesn't mean what you think it means. "id": "did:example:all-the-kings-men",
"controller": "did:example:the-king-of-town", This does NOT establish that the literal controller of the DID is did:example:the-king-of-town. Unfortunately, that's not a requirement for the controller property. Different DID methods may use the controller property that way, but some DID methods do not. What it means is that any verification relationships in the DID document resolved from So, it is worth nothing that the example DOES NOT give |
Ok, so is the spec wrong or not? I am confused. @jandrieu you seem to have described what the current text is saying. That it doesn't matter if the DID Controller of each key is different than the DID Document's controller, in the end, the king gave permission to issue credentials on behalf of the band and the band is fully liable for anything each member says. Am I understanding this right? |
To keep discussion focused I might say "The King has expressed that The Hornblower and The Knight, using the two specified keys, are allowed to issue statements on behalf of the band". Liability seems like another level of the governance stack, and it's not important or even explicit in the band's DID Document that these two entities are members of the band. |
Makes sense. In this example, both The Hornblower and The Knight can issue VCs as band authorities (for lack of a better word) OR themselves. If The Knight signs the VC with |
Is the issue in the spec simply the "created by the DID subject" language as opposed to "on behalf of the DID subject"? The DID Subject doesn't seem to be something that "creates a proof". The controllers are the ones "creating" proofs, right? For this discussion, is there any difference between the terms: "created by", "on behalf of", "provided by"? |
I think so. When you say "signs the VC with," I'm reading this as "Creates a VC where the 'issuer' property is |
Correct. The As a Band Authority: {
/*omited for brevity*/
"credentialSubject": { /*omited for brevity*/ },
"proof": {
"type": "Ed25519Signature2020",
"verificationMethod": "did:example:all-the-kings-men#key-for-the-knight",
"proofPurpose": "assertionMethod",
"proofValue": "..."
}
} As a Person: {
/*omited for brevity*/
"credentialSubject": { /*omited for brevity*/ },
"proof": {
"type": "Ed25519Signature2020",
"verificationMethod": "did:example:the-knight#key-for-the-knight",
"proofPurpose": "assertionMethod",
"proofValue": "..."
}
} |
In these examples I'm particularly interested in
(I understand that there may not be one single answer or even established practice at this stage... and that additional implementation guides or downstream specs may be required to nail down this level of detail -- but from the periphery it can be hard for me to tell what's settled and what's wide open.) |
The IMHO, because of the link established between the If The Knight signs as himself, the verifier can still verify if The Knight is part of the Band by comparing keys. So, there would be a third-party saying that The Knight is reliable (otherwise it would just be a random joe) without the knight having to make credentials on behalf of the band (although he could). |
I just realized that you just implied that any verification relationship (including new ones) will have to be authoritative. We cannot create a |
I think the spec is talking about the DID subject as the issuer of the VC. It is not talking about the credential subject. Holders, presenters, VPs, etc. are not involved at all. |
I would have expected My expectation based on DID Core v1.0 would be that when an |
The simple answer of how most code behaves is this although I've seen many different methods misuse these terms:
More importantly though, this thread is a pretty big red flag to me because these terms are determining authorization systems most commonly for VCs which are confusing enough that we are going to see authorization bypass vulnerabilities in VC verifiers because of this. This language needs to be simplified quite a bit and concrete code path examples of how this gets used needs to be defined or the semantic drift between different methods are going to cause vulnerabilities. |
Let's go back to the first principles. Is it possible to have a non-authoritative verification relationship where keys are known by the controller/subject but are not authorized to make claims on behalf of the Subject? As an example: The Hornblower and The Knight can make claims on behalf of the band, but not The Singer. {
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/suites/ed25519-2020/v1"
],
"id": "did:example:all-the-kings-men",
"controller": "did:example:the-king-of-town",
"assertionMethod": [{
"id": "did:example:all-the-kings-men#key-for-the-hornblower",
"type": "JsonWebKey2020",
"controller": "did:example:the-hornblower",
"publicKeyJwk": {/*omited for brevity*/}
}, {
"id": "did:example:all-the-kings-men#key-for-the-knight",
"type": "JsonWebKey2020",
"controller": "did:example:the-knight",
"publicKeyJwk": {/*omited for brevity*/}
}],
"nonAuthoritativeMethod": [{
"id": "did:example:all-the-kings-men#key-for-the-singer",
"type": "JsonWebKey2020",
"controller": "did:example:the-singer",
"publicKeyJwk": {/*omited for brevity*/}
}]
} |
Sure -- on my reading, the following text:
... makes it clear that you can define new relationships as you see fit. You'd have to conceive of can be used to verify assertions made by someone who belongs to the Organization that is the DID Subject as a kind of "relationship between the DID subject and the verification method", to go down this path. I guess you'd call it something like
... notably, either of these approaches requires defining some new predicates (whether it's a |
I guess we can also keep non-authoritative keys in the verificationMethod without any verification relationship defined. But that means that the DID Document is also, at the core, a credential. All verification relationships could have been separate VCs to define the authorization for authoritative and non-authoritative claims. But they are not. I am trying to understand why. Or what's the line that should take an implementer to express their relationship as a VC instead of just creating a new verification relationship in the DID Documents themselves. |
Yes, this is the purpose of the This however assumes that the Also, it's worth noting this is all built on the assumption that JSON-LD signatures is in use. If non JSON-LD Signatures are being used then this is even less clear to me and I'm not certain anyone is actually doing this. |
This was discussed during the #did meeting on 06 December 2024. View the transcriptw3c/did-core#831decentralgabe: long discussion, some agreement w/ Joe's clarification. Sounds like language could be made more clear, but took a bit to understand that what they want is supported. Probably room for improvements. manu: Maybe ready for PR decentralgabe: I'm going to tag Joe since he seems to understand what language might be good here. manu: We might need to move it to CID spec. decentralgabe: We got through all of those issues. decentralgabe: Anything else you'd like to discuss? No other issues. <denkeni> Thanks! <decentralgabe> m2gbot, link issues with transcript <m2gbot> Something wrong happened: Failed loading minutes from https://www.w3.org/2024/12/06-did-minutes.html <decentralgabe> m2gbot, link issues with transcript <m2gbot> Something wrong happened: Failed loading minutes from https://www.w3.org/2024/12/06-did-minutes.html |
The assertion section refers to "claims made by the DID Subject". Since the DID Document can have keys from multiple DID Controllers, the liability of the claim should be linked to the DID Controller of each key. If the DID Controller of the key is the same as the DID Document Controller, then it is an assertion of the DID Subject. If not, then it is an assertion of the DID Subject linked by the DID Controller of the key.
This is just semantics, but it's blocking some institutional use of the spec. A note to release DID Subject of the liability of claims made by different DID controllers listed in a single DID Document would be very, very helpful.
The text was updated successfully, but these errors were encountered: