Verifiable Governance
Dmitri Zagidulin <dzagidulin@gmail.com>
Benedict Lau <benedict@eqtylab.io>��
The Goal: Verifiable Governance
Modeling Governance
We'll need:
Our Contribution (what's new)
Definitions
Describing Governance Decisions
Assigning self-authenticating IDs to things/topics
We want to record decisions about topics.
How do we give stable identifiers to arbitrary topics and resources?
DIDs? � * Globally unique, stable(?).� * Overkill - most things/topics/resources don't need their own keys
URNs? � * Globally unique, opaque, stable. � * Would be great to have integrity protection, though.
CIDs� * 'Content-addressable IDentifier'. Popularized by IPFS, but we're using them here generically.� * Similar to: hashlinks (url + digest hash)� * Immutability / content integrity, deterministic
CIDs (Content-addressable IDentifiers)
General Pattern: URL with a text-encoded digest hash.
Examples
IPFS CIDv1:
urn:cid:bagb6qaq6ece3zdatzdcpnr3ztxtenr5aoo4xx5kf3imvhp3llysearrzxtxfe
VC DM 2.0 style (see section 5.4):
https://example.com?digestSRI=sha384-z53j8ryjVeX16Z/dby//ujydhdEP5KUcPMmSe7edMlGr7G9rmcA==
Multihash-based (draft-sporny-hashlink-07):
https://example.com?hl=bagb6qaq6ece3zdatzdcpnr3ztxtenr5aoo4xx5kf3imvhp3llysearrzxtxfe
RFC 6920 (Naming Things With Hashes):� ni:///sha-256-32;f4OxZQ
Describing Governance Decisions
Governance Example: Github PR
Capturing Governance Decisions
Review Result
Request Outcome�
Final outcome (signed by Org)
Review Request
Review Plan
A set of steps/criteria
Example criterion:�
"Proper attributions are included in the dataset"
Subject
Data (CID)�
or
�Person (DID)
Criterion Outcome
Criterion sign-off (signed by Individuals/Group)
Subject Example� (a collection of files identified by a root hash)
Review Plan Examples� (each plan can have a set of criteria)
Governance Result
Overall Verification� (every green link is a valid VC from a Trusted Issuer)
2. Data Model for Actors (individuals / groups / orgs)
Data Model: Group
What do we need to model a Group?
DIDs!
? VCs?
Data Model: Group
Data Model: Group Membership
For a given group DID, how to we model its list of members?��Options (either, or both):
for our use case (signing as a group),�we'll focus on this
Example: DID Document with Member Keys
{� "@context": ["https://www.w3.org/ns/did/v1", "https://w3id.org/security/suites/ed25519-2020/v1"],�� "id": "did:web:coop.example",�� "assertionMethod": [� {
"id": "did:web:coop.example#z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",� "type": "Ed25519VerificationKey2020",� "controller": "did:web:coop.example",� "publicKeyMultibase": "z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK"
},
"did:web:alice.example.com#z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpb",�� "did:key:z6MkpTHR8VNsBxY…#z6MkpTHR8VNsBxY…" � ]
}
The Group's own key (by value)
Alice's and Bob's keys �(by reference)
(Sidetrack) Typing a Group DID
History: DID Core v1 WG discussed at length whether DIDs should be typed by "person vs org". Intentionally left out any typing.
So how do we say "this DID is a group/org, with the following members?"�Several options, none of them perfect.
Optional: DID Doc with Membership Service Endpoint
{� "@context": ["https://www.w3.org/ns/did/v1", "https://w3id.org/security/suites/ed25519-2020/v1"],�� "id": "did:web:coop.example",�� "assertionMethod": [ … ],
"authentication": [ … ],�� "service": [{� "id": "did:web:coop.example#members",�� "type": "Group Membership Credential",�� "serviceEndpoint": "https://coop.example/members.vc.json?cid=..."� }]�}
VC containing List of Members
Summary: Story So Far
The Goal: Signing as Individual, Role, Group, Organization
Use Cases
Signing as an Individual
Individual��did:example:123
DID Document
Authorizes�(for signing):���
key 1
Verifiable Credential��issuer: did:example:123
credentialSubject:
. . .
proof:
verificationMethod: key 1
�
Signing as an Organization
Organization��did:example:123
DID Document
Authorizes�(for signing):���
key 1
Verifiable Credential��issuer: did:example:123
credentialSubject:
. . .
proof:
verificationMethod: key 1
�
Who holds the Org signing key?
Signing by API (via custom app logic)
In practice, most corporate/org deployments use KMSs (hardware key mgmt systems).
Reasonable approach:
Organization
(Org DID authorizes Group DID and issues Role VC)
Group
(Group DID with Individual DID authorized as member)
Role
(VC assigning a Role to an Individual DID)
Individual
(e.g. did:key)
Individual
(e.g. did:key)
member of
assigned to
authorized by
authorized by
Signing as an Individual with Role/Capabilities
Individual’s DID�did:key:456
DID Document
Authorizes�(for signing):���
key
Verifiable Credential��issuer: did:key:456
credentialSubject:
. . .
proof:
verificationMethod: key
�
Role's VC�Ties the Role to an Org��issuer: did:example:org�
credentialSubject:
id: did:key:456� role: "President"
validFrom: …
validUntil: …
Out-of-band VC
Signing as an Individual on behalf of a Group
Group DID�did:example:group1
DID Document
Authorizes�(for signing):���
member's key
Verifiable Credential��issuer: did:example:group1
credentialSubject:
. . .
proof:
verificationMethod: member's key
�
Member's DID�did:key:456
DID Document
Authorizes�(for signing):���
member of
key
Governance As Crypto Signatures
How far can we go using signature primitives?
To express consensus, a Group can sign using:�
Threshold Proof Basics (see Verifiable Conditions spec)
Org's DID: Sets the policy (e.g., 1 of 2 sigs from the following…)�{� id: "did:ex:1234",� assertionMethod: {� /* Verifier, if EITHER did:web:bob.example OR did:web:alice.example signs� a VC, that is acceptable to me as an Org issuer. */
}�}�VC proof: Executes the policy�{� issuer: "did:ex:1234",� credentialSubject: { … },� proof: { /* signed by did:web:bob.example */ }�}
Verifier: ��1. Checks signature, Fetch issuer DID Doc�2. Look in issuer DID's assertionMethod to see what sort of proofs are authorized�3. Encounter the EITHER/OR rule, see if VC's proof fulfils it
the Org's DID
VC issued BY the Org!
even though Bob signed the VC
Next Steps
Questions?
(Sidetrack) Modeling a List of Members as a VC
Data modeling exercise:
a VC with multiple subjects? Or a VC with a single subject (the group) that has a list of members?
A: the latter.
credentialSubject:
id: <the group's DID>
hasMembers: [ � { id: “did:key:1”, name: "Alice" }, "did:key:2", …� ]
(Sidetrack) Organizational DID Identity Proofing
An Organization has a DID. For example:
did:ex:12345 - A DID that belongs to "Example, Inc."
But how do verifiers know that?
(Sidetrack) Authorization: ACLs vs CAPs
Options for authorization/access control:
Access Control Lists (ACLs, RBAC, ABAC, …)�e.g. a bouncer with a clipboard, �or a "Will-Call" at a concert.��"If you're on the list, you can come in."�
Capabilities (OCaps, zCaps, UCANs, … )
e.g. movie tickets or plane tickets��"If you have a ticket (capability), you can come in."
ACLs
Capabilities
Authorization: ACLs && CAPs
In practice, you need both.
ACL -> Cap� "You're on the list (acl), so here's a ticket (cap)."
Cap -> ACL� "Oh, you have a ticket? Ok, I'll add you to the VIP list."
B.F.F.s
ACL
Cap
(Sidetrack) What about delegation via DID 'controller'?
DID Core v1 spec has an under-explored delegation method: � the 'controller' property.
From DID Core v1 section 5.1.2 - DID Controller:�
"Any [keys] contained in the [DID docs found in the 'controller' field] SHOULD be accepted as authoritative, such that proofs that satisfy those verification methods are to be considered equivalent to proofs provided by the [original] DID subject."
(Sidetrack) What about delegation via DID 'controller'?
For example, for did:ex:1234 with the following DID Doc:
{ � "@context": [ … ],� id: "did:ex:1234",� controller: "did:web:employer.example",� …�}
A VC signed by did:web:employer.example (the controller)
is considered "equivalent to" a VC signed by did:ex:1234 (the subject).
Somewhat confusing, but:��1. The delegation is one-way. (the controller "speaks for" the subject, but not reverse)
2. The 'controller' property is intended only for DID Document updates (key rotations etc), not for VCs.
the Subject
2. Signing as an Individual with a Role/Capabilities
Org’s DID document (authorizes the Role):�{� @context: [ … ],� id: "did:web:group.coop.example",� assertionMethod: [� { /* the group's own key */ },� /* keys of other members */,� "did:web:president.coop.example#key2"� ]�}
VC signed by the President's DID (on behalf of group):��{� @context: [ … ],�� issuer: "did:web:group.coop.example",� � credentialSubject: { … },�� proof: [{� verificationMethod: "did:web:president.coop.example#key2",� cryptosuite: "ecdsa-jcs",� proofPurpose: "assertionMethod",� proofValue: "...."� }, …]�}
President's DID document:�{� @context: [ … ],� id: "did:web:president.coop.example",�� assertionMethod: [� "did:key:...#key1"� {� id: "did:web:president.coop.example#key2",� type: "Multikey",� controller: "did:web:president.coop.example",� publicKeyMultibase: "..."� }, …]�}
Governance As Crypto Signatures
Multiple signatures on a VC (e.g. ProofSet or ProofChain)
Threshold Multi-sig (Shamir Secret Sharing, N of M) (in-progress drafts)