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

When is a DID subject not a DID controller (if ever)? #122

Closed
rhiaro opened this issue Nov 25, 2019 · 52 comments
Closed

When is a DID subject not a DID controller (if ever)? #122

rhiaro opened this issue Nov 25, 2019 · 52 comments
Assignees
Labels
pending close Issue will be closed shortly if no objections

Comments

@rhiaro
Copy link
Member

rhiaro commented Nov 25, 2019

By default, the DID subject is a controller of its own DID (this is not stated in the spec but I think everyone agrees on this).

When there is explicitly a controller property at the top level of the DID document, pointing to a controller other than the DID subject, does this add to a list of controllers which still includes the DID subject, or does it override such that the DID subject is no longer considered a controller?

If there is a case for both or the latter of these being an option, how could it ever be shown that the DID subject is not a controller of the DID?

@rhiaro rhiaro added the question Further information is requested label Nov 25, 2019
@TallTed
Copy link
Member

TallTed commented Nov 25, 2019

I think there are cases for both scenarios, which could be covered by something like --

  • When controller property is not present, the DID subject is the only controller of the DID.
  • When controller property is present, its value identifies all controllers of the DID. If the DID subject is not included therein, the DID subject is not a controller of the DID.

@ewelton
Copy link

ewelton commented Dec 4, 2019

I think this is a great question for clarification, and I feel like I may have missed a large chunk of the historical conversation here so I'd like to offer up some ignorance in hopes that it be quickly put to rest.

It really feels like the winds of DIDs are now pointing only to a certain class of enabled sentient sapiens.

Once upon a time I thought it might be possible for my cats to have multiple DIDs - one for their medical records, one for their instragram accounts, and a separate one for Litter - like Tinder, but for cats.

I also once had an idea that I'd tag all the books on the banana pancake trail with dids, so they could be tracked via QR codes (kinda as a playground for rugged wearing pepper-and-ink or scantrust kinda QR tech - SICPA has some tech in play too)

Perhaps this is entirely dealt with by Guardianship and Ownership constructs - or that DIDs are now only about establishing communication with active software agents. Is the idea of having a DID for a book, where the control of that DID moves along with the controller while allowing the book to be referenced (via DID) sensible, or is that an abuse of DIDs in the current thinking?

I'm noting that in the use-case-spec we write:

The Subject is the entity referred to by the DID, which can be literally anything: a person, an organization, a device, a location, even a concept. Typically, the Subject is also the Controller, but in cases of guardianship, agents (human or software), and inanimate Subjects, this is not possible. As such, the Subject has no functional role. When the Subject is, in fact, the Controller, we consider the action to be taken by the Controller on their own behalf as the Subject. When the Subject is not the Controller, the Controller is said to be taking action on behalf of the Subject, such as when an employee manages a DID on behalf of their employer or a parent uses a DID on behalf of their child.

I'm asking as a point of clarification rather than advancing this specific question forward so that I can respond to the question itself with minimal lateral confusion. Looking at the use-cases tied to the charter, it does seem that the above are - more or less - "out of scope" and that only agency-capable entities should be the targets of DIDs.... but i would not mind some clarification.

@jandrieu
Copy link
Contributor

jandrieu commented Dec 4, 2019

Responding to @rhiaro's opening:

By default, the DID subject is a controller of its own DID

Depending on your meaning, I would not say this is the default. It is the most common case that most of us care about, but one should not assume that the subject is the controller.

In discussion (although not necessarily in the Use Cases & Requirements document yet), the most common cases where the subject is not the controller are devices and dependents, or more commonly for both: IoT and guardianship situations.

However, the Subject of a DID should be assumed to be anything in particular. And, to my sensibility, the DID Document should not, itself, give any indication about what exactly that Subject is.

The Subject of a DID is whatever that DID refers to. Any statements about that Subject, such as "who they are" in some other namespace, e.g., their legal name, or any claims about them like "he is the King of England" belong somewhere outside the DID Document, like in a Verifiable Credential. The authenticity and veracity of such a claim is a problem dealt with in that domain.

The only thing the DID Document does is present the necessary information for secure interactions with the Subject. And yes, that Subject could be a company, a building, a car, or a cat.

@jandrieu
Copy link
Contributor

jandrieu commented Dec 4, 2019

Sorry, I got distracted by @ewelton's comment.

It is not possible to prove a null hypothesis within the system. You can't prove that I don't control a DID, you can only prove that I do.

To @TallTed's response, I don't think that's accurate. If there is no controller property, you can't assume that the Subject actually controls the DID. Rather, if there is no controller property then you must look the DID method to see who the controller is.

My understanding is that the controller property was added to allow another DID to control the DID under discussion. However, this is not a meaningful property for BTCR. The control resides on-chain and is completely independent of what might be in the DID Document. So, you could construct a BTCR DID Document with a controller value, it just wouldn't have any meaning wrt actual control of the DID.

@kimdhamilton or @ChristopherA Could you verify if that is a correct wrt BTCR?

@ewelton
Copy link

ewelton commented Dec 4, 2019

@jandrieu My comment should not have been distracting, it was an honest request for clarification. I think you provided a bit of that, albeit coated in a bit of preliminary vitriolic ejaculation.

My concern is that none of the use cases listed in the "focal use case" documents has the important properties we're now talking about - all of those cases are biased towards a certain class of subjects.

The result is that important dimensions of "when wouldn't subject=controller" is hidden, as per the charter.

@jandrieu
Copy link
Contributor

jandrieu commented Dec 4, 2019

@ewelton I meant that my answer to your question did not directly answer @rhiaro's closing question.

The Use Cases and Requirements document is currently seeking additional use cases to fill out Section 2. The Focal Use Cases section is not intended to be comprehensive, but rather a deep dive on a limited set.

If I still haven't addressed your question, @ewelton, please try again. Or, if it is more pertinent to the use cases document, consider adding an issue over there: https://github.com/w3c/did-use-cases/issues

@TallTed
Copy link
Member

TallTed commented Dec 4, 2019

@jandrieu

To @TallTed's response, I don't think that's accurate. If there is no controller property, you can't assume that the Subject actually controls the DID. Rather, if there is no controller property then you must look the DID method to see who the controller is.

To be clear, I was answering "what wording would communicate @rhiaro's opening"?

I don't think the governing normative language in the spec has been determined yet -- it could be your assertion here, or my earlier wording, or a combination of the two (e.g., "if there's no controller property, check the DID method; if the method doesn't specify, and there's no controller property, the subject is the only controller").

@jandrieu
Copy link
Contributor

jandrieu commented Dec 4, 2019

I think I see my disconnect with what @rhiaro was asking.

I was reading DID Subject and Controller in the context of the roles in the architecture, not the DIDs that may be in the DID Document.

In the way the question was asked:

If there is a case for both or the latter of these being an option, how could it ever be shown that the DID Subject is not a controller of the DID?

I took this to literally mean the DID Subject, but I believe @rhiaro, you mean the DID of the current DID Document. In which case, I believe the answer is that the DID is always the de facto "controller" of its own document, whether or not it is listed explicitly in the controller property.

The controller property may list one (or more?) DIDs whose Controllers should be afforded the privileges of controlling the current DID Document. I take this to mean that the DID of the current document is implicitly in the set of DIDs in the "controller" property.

To my knowledge no one has proposed that the DID of the current document NOT be able to control its own document.

Although, the more we discuss it, the less I feel this particular form of delegation / authorization is the right approach.

@TallTed
Copy link
Member

TallTed commented Dec 4, 2019

The controller property may list one (or more?) DIDs whose Controllers should be afforded the privileges of controlling the current DID Document.

What? DIDs identify entities, who may be designated as Controllers of other DIDs. You appear to be suggesting an indirect relationship, such that Controllers-of-other-DIDs may be designated as Controllers of this DID by listing the other DIDs that they control -- instead of listing the DIDs (or other identifying URIs) of those Controllers? That makes no sense to me.

(And again I wonder whether using the DID abbreviation is causing more trouble than it solves by saving keystrokes; and just how much trouble could be solved by some pictorial illustrations of the things we're trying to talk about.)

@rhiaro
Copy link
Member Author

rhiaro commented Dec 4, 2019

Thanks all for this discussion. Makes it evident that we do need to figure this out and make it explicit in the spec.

I understood "DID Controller" to mean an entity which can change the DID document (for which there is an updated definition in an open PR here: 189e5bd). With that in mind, the DID itself - the identifier string - can't be a controller (re: "the DID is always the de facto "controller" of its own document") and I did indeed mean "The Subject of a DID is whatever that DID refers to" when I mentioned the DID subject being the/a DID controller for its own DID.

In the case of DIDs for entities incapable of authenticating themselves, like a cat or a company, the DID subject (the cat or the company) cannot be the controller, so some other entity like a human (or a piece of software? right? or is this the realms of the robot uprising?) should be expressed with the top level controller property.

If a DID and corresponding document is generated and there is no top level controller property, and the DID subject happens to be a cat, we would have to assume that document will never change, because there is no authorized entity capable of changing it.

I still feel like I'm missing a part of the picture here though.

@ewelton
Copy link

ewelton commented Dec 4, 2019

@rhiaro I've taken this up w/ my cats.... but I think you are correct. The chances that we will come to decision before them is highly likely.

@dlongley
Copy link
Contributor

dlongley commented Dec 6, 2019

A DID is an dereferencable identifier; it refers to a DID subject. If you dereference the DID, you get a DID Document that includes information about the DID subject. This information can only have been put there with the consent of a DID controller. It is safe to trust this information only got there with the consent of a DID controller provided that you trust the resolution process and the root of trust (as defined according to the DID method).

So who/what is a DID controller? A DID controller for the DID foo is any entity that is specified, implicitly or explicitly, as having root authority to express information in the DID Document associated with foo. So how is a DID controller specified?

  1. A DID Document that has no controller property has an implicit DID controller that is identified by the DID, i.e., the same entity as the DID subject.

  2. A DID Document that has a controller property has one or more explicit DID controllers, identified by DIDs, expressed in the value of that property. If the DID subject is intended to be only one a DID controller amongst several, it must be specified using this property just like any other DID controller. If the DID subject is not specified but other entities are, then the DID subject is not its own DID controller.

Exactly what a DID controller can do with a DID Document is up to a DID method to specify. Some DID methods may not allow updates to a DID Document; some may allow certain pieces of information to be written and prevent others pieces of information. Some DID methods may only allow DID controllers to directly make changes to a DID Document whereas others may employ technologies such as Authorization Capabilities to enable DID controllers to delegate authority to other parties to make changes. Systems using Authorization Capabilities are more likely to do most authority delegation through a chain of capabilities rather than by expressing multiple controllers.

Some DID methods may require DID controllers to use cryptographic keys to make changes to a DID Document. In these systems, it may be the case that a DID controller cannot update a DID Document without also expressing verification methods (using an appropriate authorization relation such as capabilityInvocation) in its own DID Document. Note that these systems may allow DID Documents to be created that are immutable because they contain no appropriate verification methods and they do not specify a controller that references another DID subject with appropriate verification methods.

@ewelton
Copy link

ewelton commented Dec 10, 2019

@dlongley - I'd like to ask some follow on questions?

What would be different about the DID-doc statements relative to limiting the doc to just support a conversation about VCs, and letting VCs or other elements bound through service_endpoints carry the load?

As I have a tendency to derail otherwise focused conversations - is there a better issue w/in which to pursue this thread?

The idea that did-controllers can update "statements" about a did-subject just smacks of an invitation to get into VC territory. Would we simplify the spec (and promote advancement and adoption) by simply equating the two and limiting the semantic for the DID-doc to Layer1 bootstrapping and let Layer2 carry all exchanges beyond cryptographic integrity?

Equating DID-subject = DID-controller and fixing that relationship is a simplification that will reduce the burden and complexity of the spec, and as such, it will foster adoption. Perhaps limiting the problem space of DIDs is a win?

@TallTed
Copy link
Member

TallTed commented Dec 10, 2019

Equating DID-subject = DID-controller and fixing that relationship is a simplification that will reduce the burden and complexity of the spec, and as such, it will foster adoption. Perhaps limiting the problem space of DIDs is a win?

This degree of limit would eliminate a vast (possibly the majority) segment of the expected universe of DIDs, and I would not be in favor of forcing this limitation.

@Oskar-van-Deventer
Copy link
Contributor

Oskar-van-Deventer commented Jan 21, 2020

Equating DID-subject = DID-controller and fixing that relationship is a simplification that will reduce the burden and complexity of the spec, and as such, it will foster adoption. Perhaps limiting the problem space of DIDs is a win?

I second @ewelton 's proposal. TNO has been studying stuff related to representation, guardianship, delegation and mandates in a.o. the Sovrin Guardianship Taskforce. Each of those is complex and highly domain, jurisdiction and Verifier specific. It hence requires proper case-by-case modeling with verifiable credentials. It should not be modeled in a DID document. Cases of DID-subject != DID-controller should be treated as an impersonation security risk.

Se also #4

@iherman
Copy link
Member

iherman commented Jan 21, 2020

Re-reading part of the core spec...

  • The controller key appears to be defined in §6.5 Authorization and delegation. Getting back to @rhiaro's question, it certainly needs further explanation. For example, it is not clear from the definition whether there can be only one controller or several...
  • The same key also appears in §6.3 Public Keys. What does that exactly mean in the context of keys? Is the same notion or something else? Is it singular or plural? How is it related to a document level controller if one is defined?

I do not have a clear answer to these questions... :-(

@iherman
Copy link
Member

iherman commented Jan 21, 2020

I just realize that my question is also closely related to #4 (e.g., #4 (comment))

@jandrieu
Copy link
Contributor

The reason controller != subject is because we can't guarantee that AND there are use cases where that is a useful thing, including IoT and guardianship. Perhaps most importantly, it avoids the security fallacy of arbitrarily believing that the entity currently controlling a DID Document is actually the subject. We can't identity-proof the controller as the subject within the context of DID technology and it is vital that we do what we can to minimize the expectation that proof-of-control is the same as proof-of-identity.

DID Controller is a functional definition. Any entity that can actually control the DID Document is a controller. The point of crypto is to ensure strong authentication such that the control is reasonably restricted to parties who have access to a secret key--which is more easily protected than authentication mechanisms that rely on shared secrets.

Proof mechanisms that don't use a secret key are also supported, which leaves DID Methods room to innovate. But thinking of proof-of-control of a secret key as the functional definition of controller is likely the most useful mental model.

So, you can easily have multiple controllers of a DID Document, with or without the Document explicitly enumerating multiple proofs/keys, simply because multiple entities could have the ability to use the crypto that lets them change the DID Document.

That said, I'll bear witness again to a point I'm in continuing disagreement with @dlongley about

If you dereference the DID, you get a DID Document that includes information about the DID subject.

I believe this is entirely the wrong framing. A DID Document, following the language of RFC3986:

URI "resolution" is the process of determining an access mechanism and the appropriate parameters necessary to dereference a URI; this resolution may require several iterations.

Resolving a DID gives you a DID Document with the data need to dereference the DID as a URL. Functionally, what MUST be in a DID Document is the data required for dereferencing the DID as a URI that refers to the Subject. That is, a DID Document contains the information you need to securely interact with the Subject, either by dereferencing to a service endpoint or directly using cryptographic material in the DID Document for service-independent secure communications, such as encrypting a message or verifying a signature in a transport-agnostic manner. Anything that supports secure dereferencing is fair game for inclusion in a DID Document. Anything that does not directly support secure dereferencing is a privacy anti-pattern that should be avoided.

If you want to say something about a DID Subject, you should use a VC, which is literally designed to do this, including the critical function that the author of such a statement is explicit, cryptographically verifiable, and the message is capable of status checks and automated refreshing in ways that may or may not be supported by any given DID method.

In contrast, we are still debating whether or not a DID Document contains statements only asserted by the DID Controller or if it should include meta-data based on resolution--which may or may not be verifiable and may or may not have an explicit author.

We could make the simplification that a DID Document MUST be a VC, signed by the controller, and explicitly separate the assertions of the controller from those of the resolver (and/or registry). This would be a clear separation of authority, including a nice delineation between the author/controller and the subject. However, this has not been the consensus to date.

@ewelton
Copy link

ewelton commented Jan 22, 2020

Wonderful points all - looking forward to Amsterdam

I wanted to be very clear that I actually side w/ @TallTed 's comment that the S=C limitation is too strict, because I believe that only a small slice of the DID namespace will be capable of exercising agency, and of those, the "publicly resolvable" DIDs are going to have a set of "public credentials" which will form the basis of searchable open registries. When @jandrieu writes

That is, a DID Document contains the information you need to securely interact with the Subject,

I see the core of the problem in one word - with. I pretty much agree with all of the rest of @jandrieu 's comment except for that one word. I expect the vast majority of DIDs to point to elements with which it is impossible to exchange message - these are entities that we can talk about, but not with. We don't talk with them - we talk about them with their controllers, or perhaps we interact via controller designed endpoints.

This is where S!=C, because the S is not necessarily capable of agency, whereas C's are. I think this bears out in IoT and software agents as well - does my wallet control my private crypto assets, or does it contain assets which I try to control? This appears to get tremendously difficult when we think in terms of Guardianship - but that is because we are making the mistake of trying to link DIDs with some form of 'real-world-identity' - and that linkage should be 100% in VCs.

The only thing we know w/ DIDs is what the controllers want us to believe - there is no way to differentiate, in the land of DID-documents, the difference between S and C unless we build it into the core - which perhaps we do by saying S should never control a DID. Pulling apart delegates, subjects, and controllers (and service_endpoints, authentication protocols, etc.) seem to be the domain of VCs.

So what about a hard and fast rule, S!=C - ever - S can be the target of VCs, but the DID-Document is only ever a minimal description of an S. Drop service_endpoints, authentication, and anything that is not about "managing a controller structure" (perhaps a list of KERI witnesses and supporting docs)

Yet that seems quite overkill in cases where the simple "I done got me a DID and writ that private key on this here fancy wallet"

It seems to me what is needed is a structured way to have some flexibility in the DID document, and thereby accommodate a wide range of use-cases in a strongly machine processable fashion. Ideally the absolute minimum could have a clear abstract data model - and perhaps, in that minimum, S and C are orthogonal - S is simply the registration of a key pair, C is the designation required to adjust S, and all else is handled by VCs.

@Oskar-van-Deventer
Copy link
Contributor

Indeed wonderful points!

It seems to me what is needed is a structured way to have some flexibility in the DID document, and thereby accommodate a wide range of use-cases in a strongly machine processable fashion. Ideally the absolute minimum could have a clear abstract data model - and perhaps, in that minimum, S and C are orthogonal - S is simply the registration of a key pair, C is the designation required to adjust S, and all else is handled by VCs.

I second that notion. From a technical perspective, C is the bunch of hardware+software that puts electronically signatures ("electronic agent"), whereas S is the party (legal or natural person) that the electronic signature is supposed to represent towards the Relying Party. The binding between S and C is "authentication". As highlighted in #151, bare DID-based signatures may be sufficient for "LOA1" authentication ("eIDAS Non-Existent"), but they are already insufficient for "LOA2" authentication ("eIDAS Low"). eIDAS Low requires "an authoritative source" that makes a claim about S. This translates in our context to VCs.

Oskar

@ewelton
Copy link

ewelton commented Jan 22, 2020

@Oskar-van-Deventer my only concern about the phrasing - "S is the party (legal or natural person)" - I think that the majority of DIDs will not represent either. In some cases they will, but the identifier in that case should only serve to link the VCs, likely in the context of public registries. For cases where anonymity is valued, the binding between the public-S DIDs, VCs, and pairwise DIDs driving ZKP exchanges might be preferable.

On the other hand, I totally agree with the recognition that we want to be able to use these DIDs to represent ourselves in transactions - but that is a special subset of DIDs where "S is a legal or natural person" is important.

The sense that "C is hardware + software" is also somewhat troubling to me - but I'm waffling on that. Capturing the sense of C's as wallets and agents might be a clarifying step - but if we did that, then I'd say that for the set S_person \in DID*, ultimately relationships like Guardianship and Delegation would best be carried out by VCs linking those roles between elements of S (as in a Domain-Specific Trust Framework - which places the link-VCs in a documented governing - and thus enforcement - context)

Thinking that C => bound to mechanics of keys, and that it is S's that manage C's, kinda does clarify things. S is never a C, a C's merely participate in an update policy brought into play when S's DID was minted. Perhaps it would be straightforward to map most of the Guardianship, Delegation, and related inter-S relationships into a combination of S->C bindings written as VCs.

Reflecting on @rhiaro's init stmt:

When there is explicitly a controller property at the top level of the DID document, pointing to a controller other than the DID subject, does this add to a list of controllers which still includes the DID subject, or does it override such that the DID subject is no longer considered a controller?

If there is a case for both or the latter of these being an option, how could it ever be shown that the DID subject is not a controller of the DID?

In this setup, there is an implication that DIDs are minted by entities capable, at least in theory, of exhibiting agency and executing key-mgmt tradecraft. This setup is pretty important - when we talk about DIDs for my cats or cows though, it is a stretch - no matter how hard I try to explain DPKI to my bovine companions, they usually just stare at me and chew.

Control is required to "take action regarding", but that is different from using a DID as the identifier for a passive actor. For maximum privacy preservation, it must be possible to be impossible to distinguish "President of the United States" from "Cow staring at a wall" - at the level of identifiers. The DID:S relationship is intentional - it is about, the DID:C relationship is mechanistic - but, as we are understanding the intentional component of the DID:S relationship must be carried by VCs.

Maybe a clean separation - S!=C - is the answer..... or an equivalently clean S=C is the answer - and if we allow a more complicated relationship between S and some cabal of C, then we definitely need a mechanism for capturing the full-richness of this relationship in a complex structure of DID-documents. Seems to me that going one way or the other is easier than going both ways at once - or perhaps DIDs require Quantum computation ;)

@Oskar-van-Deventer
Copy link
Contributor

I like this discussion. Is it on the agenda for next-week's meeting in Amsterdam? Should it be? Or is it a "break-out" issue?
One of the things that we need to understand, is what the impact of any conclusion to discussion, or absence thereof, would be on the did-core document and its associated terminology.

@dlongley
Copy link
Contributor

dlongley commented Jan 22, 2020

This is a useful discussion. I would point out that controllers themselves are (typically) represented by DIDs and are thus themselves DID subjects. It is impossible to say S never equals C (as this eventually ends in a contradiction through infinite recursion) and, as noted, it is insufficient for the use cases to say that S always equals C.

I think everyone is on the same page regarding keeping private data out of DID Documents and in the domain of VCs to the greatest possible extent. However, some level of flexibility for stating minimal things (important "discoverable" things) about DID subjects should be in the data model (to support a number of use cases or practicality) even if it is often not used or permitted by systems employed in other use cases.

The most obvious example of an important "discoverable" thing is "DID subject S has a service X where you can do Y with S (or find out Y about S)" or ... "DID subject S has a service X where you can find out all of the other services S has".

@ewelton
Copy link

ewelton commented Jan 23, 2020

That's a great point - and it is "as the spec is written", having grown from a context where S=C was fairly simple and then growing to encompass the subtle distinction between the two for use in cases where that made sense. And there was a wonderful extension mechanism, where you could "add attributes" to the DID-Document to address various "typical lookups" - S could talk about itself, perhaps leveraging the facilities of specific methods. If it was appropriate for S to be controlled, it could provide the relevant set of Controller attributes (and link those to a context), and if it was appropriate for S to advertise service_endpoints, it could do that as well. S was in control of the semantic of its self expression.

I thought this handled the different sorts of S and rules of C (and other variants of referent) very cleanly. For S's that wished to participate and advertise "potential PII" - such as might be found in service_endpoints, they could do so - for those who wished not to, then the service_endpoint information could be moved to the time of DID introduction - and this gets more and more like pairwise DIDs and is related to the concept of "resolution" - publicly resolving a published DID to gather information about it and perhaps initiate communication is rather different than resolving a single use DID constrained to a single communication context.

In the current climate of removing the possibility of S using the DID document to express anything except the cryptographic material required to bootstrap layer-2 communication, it seems that separating S and C, and replacing the C - not with a pointer to a DID, but with just the control material itself, is worth considering. S - the self-certifying identifier, can be used as the skeleton of the VCs which define all other behaviour, while C is the separate pool of cryptographic information required to update S - and, given the minimality of information in these restricted DID documents, the only update that makes sense is termination - all else is handled by VCs. How you get those VCs is out of scope for the DID-document, because it can potentially reveal PII.

If we start cross-linking DID documents and establishing relationships between them we should look closely at tools that support that sort of data linking in a systematic fashion. If, on the other hand, we do not want to cross-link DID documents to form a DID-document web, then we should consider removing C as a DID itself and replace it with just the cryptographic material. The DID document thus contains 2 sets of cryptographic material - one about S, and the other about the rights to update the information about S, or C. In the case that S wishes to advertise itself as the sort of DID capable of agency, a simple rule of "if C-info is absent, use S" - that handles the S=C case cleanly, but allows separation when relevant - all while avoiding cross-document linking.

In terms of the opening question then,
if the C information is present, then C can update the document, but S can not
if the C information is absent, then S can update the document

sometimes a subject could use separate cryptographic material for each but be the same entity, and in some cases they could be different entities. The reason for "but S can not" is just to make it clear and simple.

But why not just move "controller" to a VC? And we would want to see that all of this complexity is worth it - if the DID-document is only about S's cryptographic material, and everything else is moved out to VCs, then perhaps we can simply get rid of controller altogether - we should be able to look very closely through the use-cases to determine which ones that would break under the assumption that the DID-document had zero content beyond that required to manage keys.

@Oskar-van-Deventer
Copy link
Contributor

In terms of the opening question then,
if the C information is present, then C can update the document, but S can not
if the C information is absent, then S can update the document

This semantic fuzzyness worries me. What is the nature of C and S?
a) pieces of hardware and software that performs the actual operation of putting electronic signatures;
b) flesh-and-blood human beings that operate a);
c) natural and legal entries that may either equate b) or are represented by b);
d) any or all of the above

Until the DID spec explicitly addresses this issue, answer d) is the default answer. I do not like that answer, because it leads to all kinds of potential confusion (= interoperability issues) with implementors and users, not to mention the standards development by the DID-WG itself.

@ewelton
Copy link

ewelton commented Jan 23, 2020

@Oskar-van-Deventer
I probably have this all wrong, but this is my current understanding:

Entities like these

a) pieces of hardware and software that performs the actual operation of putting electronic signatures;
b) flesh-and-blood human beings that operate a);
c) natural and legal entries that may either equate b) or are represented by b);
d) any or all of the above

Could be either S or C - they are capable of agency - they can act. Sometimes this involves a 'fiduciary' relationship. The detail of a,b,c to a governance framework should be carried by VCs.

S, however - to the best of my knowledge - can include

  • inanimate objects which are uniquely identified, about which VCs & ZKPs can provide information
  • animate objects that are "sentience-challenged" - cats, plants, the occasional president
  • abstract objects, such as concepts and roles

So I see C as a subset of S - and S-C is underrepresented in the canonical use-cases. Let's look at DIDs then, and characterize them as:

  • A DID Is effectively a sequence of integer pairs <S,doc_n> where doc_n+1 = update(doc_n), for n>=0 up to some final n, such that doc_n = null for all n > M
  • The crypto-material about S is used to do things in the ballpark of
    • correlate public VCs
    • authenticate
    • engage ZKPs
  • Update to the DID-doc itself is "executable" only by C - and this is guarded by the crypto-material associated with C

if S=C is strict, then S-C = \empty - then S can only refer to agency-capable entities - so every S needs, minimally, some sort of software-agent. In that case we could completely remove any distinction, there is only the cryptographic material around S, and the "actual controller" of S impersonates S. What matters is only the management of the private-side of the crypto-material.

Let's look in detail at a DID for my cat - and the desire to publish a service_endpoint in a global network of verifiable medical records - or even a ZKP provider that could prove that "S had a rabies vaccination" - the backing data might include the lot-number of the rabies vaccine, the date of administration, the DID of the administrator, etc. Maybe the VC issues a credential (perhaps with its own DID) that details S's rabies vaccination.

In those cases I accept the agency by "impersonating my cat" - no one can tell the difference between any of the cases a-d above.

Now consider the following case

I have one particular cat - her name is "Khao Nieow Dahm" and she is a sweet and loving 3 year old calico. She has decided that she prefers spending her time with the widow who runs a small guesthouse a few doors down the road. KND likes spending time down the street and can't stand staying at home anymore because we have another, younger, newer cat "Bahn Haa" who routinely attacks her - any time BH sees KND, then BH attacks - it is BH's goal to "claim the house for her own", and KND has decided that P. Jeab's home is a much, much, friendlier environment.

If want to transition KND's DID to P. Jeab, then I simply hand her the private key material and I promise that I will never, ever, use that private material again. I mean - trust me, I'm a trustable guy right?

A better way to achieve the transfer might be simply me updating "the control of S" to point to the new controller, and then letting the new controller rotate S's keys. After that dance I can no longer impersonate S - as is required by the S=C condition.

That's one possible argument for separating S and C - and not one that hinges on the legal bindings to agency-capable external entities.

It is not yet clear to me, however, that strictly setting S=C doesn't have a solution that avoids the whole "transfer of impersonation" - perhaps P. Jeab generates new material, hands me the public-only part, and I update the DID-document with new public key information so that the impersonation ability transfers seamlessly. Perhaps that dance could be enshrined such that the simplification of S=C and the removal of C from the spec completely is a win.

One thing that I do suspect is that enshrining a distinction between S & C in the firmament of the DID-Document itself requires one of two options - either
a) completely defining all possible S/C relationships completely, a-priori, in the specification, and modeling them explicitly in an abstract data model
b) pushing the S/C binding into a "mechanism of systematic extension/flexibility" whereby different terms-and-conditions of S/C relationships could be managed - as in "this DID-document includes Controller tech"

There is a definite win if S=C is firm enough to drop the entirety of the controller construct - but if there is even one use case where S!=C is mandatory, then we're in the above territory and (b) seems like the only reasonable answer.

@Oskar-van-Deventer
Copy link
Contributor

@ewelton You confirm my worry of "answer d)", that is, we leave all of this to the implementers/market. A possible consequence is that much of this signing/authentication/delegation/representation stuff will be replicated both in DID and VC/VP, leaving the market confused and impeded about the non-interoperability of those.

As for the cat example, I don't see why my cat should have private keys associated to it. My vet will put any cat to sleep, as long as the person bringing it in pays for it. There is no proof of ownership required, nor the consent of the cat. So the cat example feels like a red herring to me.

Anyway, this discussion may be derailing. It will be good to continue the discussion in Amsterdam next week. Perhaps this should be a discussion for a joint meeting of DID-WG and CCG-WG?

@rhiaro rhiaro added pr exists There is an open PR to address this issue and removed discuss Needs further discussion before a pull request can be created labels Jun 21, 2020
@rhiaro
Copy link
Member Author

rhiaro commented Jul 13, 2020

A note has been merged saying:

If the controller property is not present, the DID controller can be determined by consulting the respective DID method specification. It cannot be assumed that the DID subject is also the controller of its own DID, nor can it be assumed that only entities identified by DIDs present in the value of controller are capable of exerting control over the DID in question. Similarly, DID methods are not obliged to respect the value of controller and can specify means for updating the DID document that are unrelated to the controller property.

I don't know if this reflects consensus (the PR didn't get review from most people in this thread) but if there are no objections to that this issue can be closed soon.

@rhiaro rhiaro added pending close Issue will be closed shortly if no objections and removed pr exists There is an open PR to address this issue labels Jul 13, 2020
@msporny
Copy link
Member

msporny commented Jul 13, 2020

I don't know if this reflects consensus (the PR didn't get review from most people in this thread) but if there are no objections to that this issue can be closed soon.

I believe that has consensus... at least, that's how DID Methods today seem to be using (or not using) the controller property.

@dlongley
Copy link
Contributor

dlongley commented Jul 13, 2020

If the controller property is not present, the DID controller can be determined by consulting the respective DID method specification. It cannot be assumed that the DID subject is also the controller of its own DID, nor can it be assumed that only entities identified by DIDs present in the value of controller are capable of exerting control over the DID in question. Similarly, DID methods are not obliged to respect the value of controller and can specify means for updating the DID document that are unrelated to the controller property.

I haven't had time to look into better language than this. But I do feel like it needs further tweaks, otherwise it's an interop failure. To me, it's like saying "controller is scoped to the DID method and meaningless on its own". I don't think that's good and I don't think that even reflects reality with most DID methods. I would prefer to see something more like:

"If controller is present, it expresses the root of authority for information expressed in the DID Document. If controller is not present, then the DID subject represents the root of authority. To determine how the DID Document can be changed, you must consult the DID method. It is possible that the DID method will indicate that the DID Document can no longer be changed beyond whatever its present value is."

Something like this creates a separation between expressing the semantics of subject/controller (which should be the same across all DID methods) and the mechanics for actually changing it, which are DID method specific. DID methods should not allow expressing a controller in a DID Document unless it is intended to convey an alternative root of authority over what is expressed in the DID Document.

@dmitrizagidulin
Copy link

@dlongley

"If controller is present, it expresses the root of authority for information expressed in the DID Document. If controller is not present, then the DID subject represents the root of authority. To determine how the DID Document can be changed, you must consult the DID method. It is possible that the DID method will indicate that the DID Document can no longer be changed beyond whatever its present value is."

+1, that's a great way of phrasing it.

@jandrieu
Copy link
Contributor

jandrieu commented Jul 13, 2020

@dlongley suggests

the DID subject represents the root of authority

Unfortunately, this is not correct. The DID Subject is determined by the root of authority, NOT the other way around. This is a fairly fundamental to the authority architecture of DIDs themselves. A controller controls the DID Document and their intent about the Subject shapes the rest of any identity built around that identifier. The Subject may not even be involved in the DID Document, especially if the subject is inanimate or incapable (child, invalid, etc.).

Ultimately, it is always the DID Method that determines the actual root authority (the ability to change the DID Document) and while we can require that the controller represent the root authority if present, I don't believe we can ascribe anything if the value is NOT present.

If what you mean is "when the value of the controller property is not present, the controller value should be treated as the same as the "id" property of the DID Document", that I can support. But, that begs the question of what "controller" means when the DID Method is not required to represent the root authority in that manner. If the subject is a dependent (unable to exercise their own cryptographic authority), is the proposal that the controller value MUST be present and MUST be the same authority as recognized by the DID Method for changes to the DID Document?

@dlongley
Copy link
Contributor

If what you mean is "when the value of the controller property is not present, the controller value should be treated as the same as the "id" property of the DID Document", that I can support.

Yes, that. I'm happy for the language to reflect that.

But, that begs the question of what "controller" means when the DID Method is not required to represent the root authority in that manner. If the subject is a dependent (unable to exercise their own cryptographic authority), is the proposal that the controller value MUST be present and MUST be the same authority as recognized by the DID Method for changes to the DID Document?

Yes -- but I think there's room for a caveat where, if no verification methods are present, it is unnecessary to express a controller value.

@rhiaro
Copy link
Member Author

rhiaro commented Jul 21, 2020

I'll make another PR to update the language

@talltree
Copy link
Contributor

@rhiaro Just a heads up that my proposed Appendix A is something you'll probably want to reference in your PR on this topic. I plan to submit it this week. But don't wait on that—we can always add a reference to it later.

@burnburn burnburn removed the pending close Issue will be closed shortly if no objections label Jul 24, 2020
@kdenhartog kdenhartog added ready for pr Issue is ready for a PR and removed question Further information is requested labels Jul 28, 2020
@rhiaro rhiaro added pr exists There is an open PR to address this issue and removed ready for pr Issue is ready for a PR labels Aug 11, 2020
@rhiaro
Copy link
Member Author

rhiaro commented Sep 1, 2020

This will be closed when PR #371 is merged, which contains further discussion and is just about ready.

@rhiaro rhiaro added pending close Issue will be closed shortly if no objections and removed pr exists There is an open PR to address this issue labels Sep 22, 2020
@brentzundel
Copy link
Member

No comments since marked pending close, closing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
pending close Issue will be closed shortly if no objections
Projects
None yet
Development

No branches or pull requests