KERI Bridge to the DID World - Jonathan Rayback

KERICONF26 Day 2 · 41:35

0:00 Jonathan Rayback | KERI Bridge to the DID World | KERI Conference 2026

0:03 Okay, well, let's get started everybody.

0:06 Thank you for coming to this session.

0:09 Hopefully, you'll find it interesting.

0:12 Let's see if I can get my cur- whoa,

0:14 my cursor. There we go.

0:25 So, my presentation is on DID:Webs.

0:30 My name's Jonathan Rayback.

0:33 I am a co-chair on the DID:Webs task force

0:40 underneath the KERI stack working group

0:42 at TrustoverIP.

0:43 My other co-chair is Kent Bull here,

0:46 is here with me.

0:47 And I'm going to be talking about

0:49 DID:Webs.

0:50 I also am a chair of the DID methods

0:55 working group at Decentralized Identity

0:57 Foundation. So, I am squarely in the DID

1:00 ecosystem and community.

1:02 And the

1:07 idea behind this talk is really to talk

1:11 about DID:Webs, which is the KERI entry

1:13 into the DID:Webx

1:16 genre of decentralized identifier.

1:19 So, the talk today is going to be

1:23 I would say pretty technical, and I'm

1:25 going to really assume that the audience

1:28 is fairly familiar with KERI. I'm not

1:30 going to assume that the audience is

1:32 familiar with DIDs. I'm going to sort of

1:34 that's kind of the point of the talk is

1:36 a little bit to describe DIDs and

1:38 why we have DID:Webs and how it relates

1:41 to KERI.

1:42 So, that's kind of I guess my prelude.

1:47 Let's see if I can actually get this to…

1:56 We're going to go through a little

1:57 bit about DIDs. We're going to do a

1:59 brief discussion on DID:KERI itself cuz

2:01 there is DID:KERI came before DID:Webs

2:03 and it is another DID method. We'll talk

2:06 about DID:Web,

2:07 the original DID:Web at W3C. We'll talk

2:10 about DID:Webs and why it exists

2:12 why DID:Web exists.

2:14 Then, we'll do a little bit of a

2:16 conversation about the relationship

2:17 between DID:Webs and DID:web. We'll

2:19 talk about some other DID:WebX methods,

2:21 the status of DID:Webs from a standards

2:23 point of view, and then I'll do a little

2:25 demo.

2:28 So, decentralized identifiers or DIDs.

2:32 It is a W3C

2:33 official recommendation

2:36 As of several years ago.

2:39 There's a 1.0 core spec and I think

2:41 they're working on a 2.0 spec now.

2:44 You can click through to the actual

2:47 specification there at on that

2:49 hyperlink.

2:50 It's a type of identifier. It's

2:52 formally a URI identifier that allows an

2:55 entity to communicate things like

2:57 cryptographic material keys,

2:59 Verification methods, and or service

3:01 endpoints like say an authorized agent.

3:05 And this communication happens by

3:07 resolving is the term the DID. So, you

3:10 resolve the DID like you would resolve a

3:11 URL. And when you resolve a URL, you get

3:14 back a usually a

3:16 chunk of HTML like a webpage or

3:17 something like that, some resource. When

3:20 you resolve a DID, what you get back is

3:21 a DID document and the DID document will

3:23 contain information like what are your

3:25 current public keys, do you have any

3:27 authorized agents, etc. etc.

3:30 So, the scheme

3:32 for a DID is you have

3:35 the mandatory URI scheme

3:38 prefix, which is DID,

3:41 the colon, similar to a URL.

3:43 So, like in a URL if it's the HTTP, you

3:45 know, and then whatever. This is in this

3:46 case it's DID, whatever.

3:48 The DID method name, so in the case of

3:50 DID:Webs this would be Webs. And then

3:53 each DID method has its own method

3:55 specific identifier that's determined by

3:58 the designers of the specification for

3:59 that DID method. This is an example of

4:01 an imaginary one.

4:04 You have, in addition to the DID

4:06 document, the DID method itself

4:07 describes how do you create, update,

4:10 delete, you know, etc.

4:12 the DID documents, and every DID method

4:14 has its own mechanism for that, along

4:16 with its own method specific identifier.

4:19 There are currently hundreds of DID

4:20 methods out there in various states of

4:24 standardization.

4:27 Many are associated with specific

4:30 blockchain technologies.

4:32 There are lots of other creative ones.

4:34 There are a few that deal specifically

4:37 with web and web protocols and web

4:39 infrastructure, of which DID:Webs is

4:42 one.

4:44 If anybody has questions, by the way,

4:46 at any point, feel free. Oh, there'll be

4:48 time for questions at the end,

4:49 hopefully, but if you just want to ask a

4:50 question, ask a question.

4:53 Okay, cool. So, decentralized

4:55 identifiers, as I mentioned, there are

4:57 four method operations that every DID

4:59 method must explain. So, if you're going

5:01 to create a new DID and then have a new

5:02 DID method, you have to explain at least

5:04 how to do these four things. How do you

5:06 create them? How do you resolve them?

5:08 How do you update them? How do you

5:09 deactivate them?

5:10 Then the DID document itself is

5:16 always called did.json, so it's a JSON

5:19 format following the specific DID core

5:21 JSON scheme.

5:24 And

5:26 every DID that's compliant with the DID

5:29 spec is going to have a DID document

5:32 did.json, and it's going to follow that

5:34 particular scheme, right?

5:36 Including DID:Webs.

5:38 DID document has specified

5:41 properties, including

5:43 and I listed these out cuz these are

5:45 the ones that are particularly relevant

5:46 for DID:Webs.

5:47 The subject of the DID is in the ID

5:51 field.

5:52 The DID can have other identifiers that

5:55 it calls out as equivalent IDs

5:58 basically, "also known as"

6:01 You'll see that in a minute. It has

6:03 Verification methods

6:05 Which is basically, you know, the

6:07 list of the keys that the

6:10 DID controller is publishing the DID

6:12 document. It can have verification

6:14 relationships, for example,

6:16 authentication saying this key is

6:18 authorized to authenticate for me or

6:20 this key is authorized to sign on my

6:23 behalf in these two cases.

6:26 You can also list out various services

6:28 that are relevant to you as a

6:29 controller.

6:30 DIDs ..,

6:33 DID identifiers do support parameters

6:35 like URLs do, so you can have a DID and

6:38 then like a question mark and a

6:39 parameter on the end that

6:41 allows you to, you know, adjust the kind

6:43 of information you're going to get back

6:44 from the resolver.

6:45 And there's also metadata that comes

6:47 back when you resolve a DID. You'll see

6:49 that later when we do the

6:51 demo.

6:54 So this is an example DID document. This

6:56 is pulled from the core DID spec.

6:58 You can see in this case

7:00 the subject is this DID.

7:03 And this particular the controller of

7:05 this DID has authorized this key

7:09 which is an Ed25519

7:11 key.

7:13 This one in particular.

7:16 they've authorized it to serve as

7:19 authentication method.

7:20 It's basically what this DID document

7:22 says.

7:23 Okay?

7:24 Questions so far?

7:25 Yes. Yeah.

7:27 – There's no “also known as”…

7:30 In this one. Also known as is a optional field

7:33 in the core spec. Yeah.

7:36 Technically, authentication is

7:40 also an optional field.

7:43 In DID:Webs is not an optional field,

7:45 and that's why I called it out earlier

7:46 cuz DID:Web asset does makes, you know,

7:49 has certain

7:51 additional requirements above and beyond

7:53 the core spec, okay?

7:56 So, I just wanted to cover this really

7:58 quickly. I added this morning cuz

7:59 like if I was in a KERI conference,

8:01 I thought someone would ask what do I

8:02 DID:KERI. There absolutely is a DID:

8:04 KERI, okay? There's a specification for

8:06 It hasn't been touched in 4 years.

8:11 It's mostly

8:13 stub, I would say.

8:16 It's like got all the sections,

8:18 but each section kind of says, "Need to

8:20 fill this in," right? Like it hasn't

8:21 really been filled in yet. It's

8:23 very early draft, very draft, right?

8:27 A DID:KERI is very simple. It's just,

8:32 you know, the

8:33 prefix, the name of the DID method, which is

8:36 KERI, and then the AID. That's a DID:

8:39 KERI.

8:40 The thing about DID:KERI is, it is

8:42 entirely silent on the topic of

8:44 discovery. How do you discover

8:46 the KEL essentially? How do you ..,

8:49 cuz like if you know the KEL, this

8:51 is totally sufficient for you to go do

8:53 whatever you need to do, right? You just

8:54 you have the ID, you go to the

8:56 Key Event Log, you can do whatever

8:58 you need for validation. But the

9:00 DID method itself doesn't give you any

9:01 hint on like how am I supposed to get

9:03 this KEL? And I think this

9:05 spec was actually written pre-OOBI world.

9:07 So, like they didn't have the idea of

9:09 OOBIs even yet. So, now you would say

9:12 you're probably just going to get an OOBI

9:13 or something, right? But

9:14 in the day, you know, we just

9:17 don't have this. So, it has limited

9:18 practical use is what I'm saying, right?

9:20 In the real world today.

9:22 Because

9:23 you are going to have to negotiate how to

9:27 discover the

9:30 verifiable history

9:33 outside of the method itself.

9:37 Okay, so DID:Web going to the other side

9:40 of the world. So in the W3C, right, it's

9:42 the

9:44 web specification, web standards

9:46 organization, they thought, "Well, if

9:48 we're going to have these DIDs, we

9:49 should have a DID:Web. That would be

9:50 amazing, right?" So yes, there is a DID:Web

9:52 and it's an unofficial draft right

9:55 now at the W3C, but

9:56 it's used and it's used in

9:58 production. People use DID:Web. When

10:00 when I was at Gen

10:02 Digital, the solution we were

10:04 developing was built around DID:Web.

10:09 The thing about DID:Web is it's

10:11 all web technology, it's all web

10:14 infrastructure. So,

10:16 the way that you resolve

10:18 a DID:Web is you turn it into a

10:21 URL and resolve the URL in your browser,

10:25 with Curl, you know, programmatically,

10:28 with a headless

10:30 browser, whatever,

10:31 And you get back did.json. And that's

10:35 amazing. It's a very

10:38 very extremely limited practical use

10:41 because

10:42 there's no history of that DID document.

10:44 That DID document could change at any

10:45 time. It's subject to any of the

10:48 exploits that are common on the web,

10:49 man-in-the-middle attacks, hijacking,

10:52 you know, DNS, like any of these things.

10:54 It's completely subject to

10:56 all those problems. When you get a

10:58 DID document, you have no way of knowing

11:00 that the key that's published here now,

11:02 frankly, is the key. But you also have

11:06 no idea of knowing this controller at

11:08 some point in the past may have had

11:09 other keys, may have signed things with

11:11 other keys.

11:12 Don't know. None of that. You know You

11:14 know none of that with a DID:Web. Yes.

11:18 – I wanted to plus one and add a bit of

11:22 bit of history. So, I was one of the

11:23 co-creators of the DID:Web

11:26 spec and it was always meant to be

11:29 training wheels.

11:30 Right? This was like, "Hey, you're just

11:32 dipping your toe into DID world. You're

11:35 going to try to do key

11:37 and then, you know, try DID:Web like to

11:40 resolve it over the network."

11:42 But, it has all of the

11:44 downsides that you just mentioned.

11:46 Right? There's no key history.

11:48 There's no cryptographic binding of that

11:50 identifier to the key, all that stuff.

11:53 The funny part is, so

11:56 I've at least always meant to

11:58 add that to it.

12:00 But, what happened was… so I was

12:02 one of the authors of this spec.

12:04 And I opened an issue like, "Okay, now

12:07 that we've gotten it out there, let's

12:09 add cryptographic binding. Let's add key

12:10 history."

12:12 And the other developers were like,

12:14 "Nope." And I was like, so basically

12:15 there was a lot of pushback against

12:16 that. They're like, "We're going to keep

12:17 it super basic. We're

12:20 going to leave the binding and the

12:22 history to other methods."

12:24 This is…

12:26 So.

12:27 that's that's basically what ended up

12:29 happening. Hence, DID:Webs

12:31 and all that stuff.

12:32 – Yeah, thanks. Appreciate the

12:33 history.

12:35 So this is a the main thing I wanted

12:37 to show here was kind of just give a bit

12:39 of background, but then

12:41 if you look at the syntax of a DID:Web,

12:45 this is like relevant as we move

12:47 into DID:Webs and other DID:Webx

12:49 methods. So, you're going to have,

12:52 basically the method specific

12:55 identifier for a DID:Web is looks very

12:57 much like a URL. So, you're going to

12:59 have your you know, host information.

13:02 You can have an optional port

13:04 information. It has to be percent [%]

13:06 encoded like this with URL safe.

13:08 And then some path to whatever the

13:11 document is. This would then translate

13:13 into a URL that looks like this, right?

13:16 So,

13:17 your host is example.com on port 3000,

13:20 path to document did.json. You resolve

13:23 this, you're going to get back that JSON

13:26 DID document.

13:28 So,

13:29 because of DID:Web having the

13:32 shortcomings that it has, a number of

13:35 designers have proposed solutions.

13:38 DID:Webs is one of them.

13:40 I think it was really the first,

13:42 honestly, and then some others spun off,

13:44 but

13:45 DID:Webs has a specification. Kent and

13:48 I are responsible for it. We're working

13:50 on it.

13:51 But what DID:Webs does

13:55 is it separates discoverability from

13:58 verifiability. So we use the web to

14:02 discover the information about the

14:06 identifier, and you can use the DID

14:08 document to get the keys and all of

14:10 that. But, if you want to verify the

14:12 information in the DID document, you do

14:16 that via KERI events

14:20 through something we call the KERI

14:23 Event Stream, the KERI Event Stream,

14:26 which is kind of an

14:27 aggregation of various KERI events from

14:31 various sources that

14:32 may be relevant to the controller, and

14:34 that's aggregated into this KERI event

14:36 stream. So, to resolve a DID:Webs, you

14:39 actually are resolving two resources,

14:41 two endpoints. You resolve the did.json

14:44 and get the DID document, but then you

14:45 also resolve the KERI CESR, and you

14:48 have to validate that just like you

14:49 would any other KERI Event Stream. We

14:52 have a question back here. – Yeah, I just

14:54 wanted to ask you is it possible to get

14:56 the copy of the slides? – Yeah. There's a

14:59 Yes. There's a little QR code at the

15:02 end if you want to just scan it.

15:06 – All slides all presentations.

15:11 – Well, I must have missed that in the

15:12 beginning.

15:18 – So, it's more widely

15:20 adoptable than DID:KERI because, you

15:22 know, it's got existing web

15:23 infrastructure. It solves the problem of

15:24 how you do discoverability.

15:26 And it keeps the security

15:28 properties of KERI.

15:30 It provides way better verifiability

15:32 than DID:Web certainly, but

15:34 also than other DID:Webx methods. And

15:36 we'll talk about DID:Web versus other

15:37 DID:Webx methods a little bit at the

15:39 end. But there are properties you get

15:41 from DID:Webs that you don't get from

15:43 any other DID:Webx method.

15:48 This is a DID:Webs identifier. You can

15:50 see it looks super similar to a DID:Web

15:52 identifier. The only difference is

15:54 the last segment of the method

15:57 specific identifier is always the

15:59 autonomic identifier. It's always the

16:00 AID of the controller.

16:03 So: "da da da",

16:05 path, you've got the host,

16:07 you've got the port, optional port,

16:09 you've got the path, and then at the end

16:11 you've got the identifier.

16:13 In order to resolve this, you're going

16:15 to turn this into essentially a URL up

16:18 to the path, and you're going to go get

16:19 the slash did.json and the slash

16:22 KERI.cesr,

16:24 and the very first thing you better see

16:25 in that KERI.cesr is the inception event

16:29 for that AID.

16:31 If you don't see that, you're already

16:34 no go. No bueno. Right?

16:37 – So that path is not is just to a web

16:41 server that's serving the redirect. It's

16:43 not necessarily the KERI watcher.

16:46 – It's not the KERI watcher. 100% not the

16:48 KERI watcher. It is where you go to get

16:51 the

16:52 Ultimately, it's where you go to get the

16:53 KERI.cesr stream.

16:56 But it's also where you can for

16:57 convenience get the did.json file,

16:59 because it's a DID. By specification,

17:01 you have to have a did.json file there

17:03 at that endpoint as well. – And then with

17:05 that DID.keri stream, that's where

17:08 you're going to confirm against the

17:09 watcher to make sure that it verifies correctly.

17:12 Sure. KERI.cesr, you're going

17:13 to take the information from

17:15 the

17:16 KERI Event Stream With the file is

17:19 called KERI.cesr.

17:21 It's a CESR encoded stream of KERI

17:22 events and you're going to use that,

17:24 yeah, sure, against the watcher or

17:26 whatever validation you're

17:27 going to do. What's going to happen

17:28 first is your DID resolver is going

17:30 to validate that. That's what a DID:Webs

17:32 resolver is supposed to do is check

17:34 that.

17:36 – So, I mean I'm not hearing so I'm

17:38 trying to understand.

17:40 The CESR file is the source of truth for

17:42 that Key Event Log? – Yes. – Okay, it's a

17:46 – The CESR is the

17:48 credential encoding format used by

17:50 KERI.

17:51 Correct? – CESR, it's a

17:54 streaming yeah, it's a streaming

17:56 protocol.

17:59 Which includes encoding, yes.

18:01 So given that we are reversing we're

18:04 giving responsibility to the controller

18:07 for his/her keys? – Yeah.

18:10 – Is there a protocol that, given

18:13 this

18:14 exception log, gets pushed to the domain

18:17 of some

18:20 DNS host

18:22 or I mean a website?

18:25 Or…

18:25 – Yeah. – I'm

18:26 looking at it from the custodian

18:28 perspective. So, I have my customers, I

18:30 assign them a DID:Webs DID. – Mhm. – But

18:33 then

18:34 it breaks the whole purpose of KERI,

18:36 right? Where my controller is…

18:38 – No, we'll talk about that in a minute,

18:39 actually. But

18:42 theoretically you could provide a

18:44 hosting

18:45 platform for individuals to have a

18:48 DID:Webs. You could certainly do that. – And

18:51 the individuals have to push their own?

18:54 – You could do that for them, but

18:56 there's a mechanism that DID:Webs

18:58 has that is intrinsic to KERI that

19:01 allows the controller to authorize that

19:05 endpoint as the definitive endpoint for

19:07 their DID.

19:09 And we'll talk about that in just a

19:10 minute. And that's actually one of the

19:11 unique features of DID:Webs that other

19:13 DID:Webs methods do not have. And this

19:15 is maybe a good point, too, to bring out

19:17 the fact that

19:19 in DID:Webs, and it may seem

19:22 like a minor kind of detail, but it's

19:24 actually functionally has some pretty

19:27 important ramifications.

19:29 DID:Webs, the DID document is always a

19:33 derivative of some KERI Event Stream.

19:39 Always.

19:40 So, there's no idea of like

19:42 I'm going to go write this

19:44 like type out my DID document or

19:45 something like that, right?

19:48 The DID document should always be

19:50 generated from some KERI Event Stream,

19:52 and the current key state and all of the

19:54 other events that have happened in that

19:56 have a consequence on what shows up in

19:59 the DID document. This is reversed from

20:02 other DID:Webx methods like DID:Webvh,

20:05 where it's kind of the other way around.

20:07 The DID document and the state of the

20:09 DID document creates the verifiable

20:11 history as hashes.

20:14 It's the other way around. And

20:16 there are some ramifications for this

20:19 that come up.

20:22 It's a less nuanced

20:26 differentiation than you might think.

20:28 – Are you going to cover those

20:29 ramifications? At the end, yeah. We'll

20:31 talk about it for a little bit, yeah.

20:32 – You just piqued my interest.

20:33 [laughter]

20:34 So DID:Webs has some features that

20:37 just come because it's KERI based. You

20:39 get multi-party signatures.

20:41 You get delegation. I want to be

20:43 clear this is really clear for

20:46 people who are in KERI land, there's

20:47 kind of there's two kinds of delegation

20:48 we can talk about, right? There's

20:50 ACDC-based delegation that you get

20:53 through like vLEI, where you get

20:56 this hierarchy of credentials that

20:58 go back to a root credential. That's not

21:01 what we're talking about here. This is

21:02 AID delegation. This is where my

21:05 identifier is specifically saying, "And

21:08 this identifier is allowed to act on my

21:10 behalf". Okay? That's a different kind of

21:12 delegation. We can we can encode that

21:14 into a DID:Webs DID document. It

21:17 supports services that are relevant to

21:18 KERI like OOBI endpoints, witnesses,

21:21 agents, mailboxes, and it supports

21:23 designated aliases

21:26 through ACDCs. So this is an ACDC

21:28 delegation concept, but this is where

21:31 for example

21:33 it's required in the DID:Webs spec that

21:35 if I'm going to have my DID:Web…

21:39 I, as a controller, am required

21:40 by the spec

21:42 to authorize

21:43 the host and path information

21:45 that's going to be in my identifier

21:47 with an ACDC credential

21:49 or it's not a valid DID:Webs.

21:51 Again, that's another differentiating point

21:53 from other DID:Webx methods

21:55 because they give you no way,

21:57 other than implicitly, to say

21:59 this is the correct host and path

22:01 information,

22:01 like when I give you my DID:Webvh

22:04 and it says example.com in it,

22:07 implicitly I'm telling you I've

22:08 authorized this. In a DID:Webs when I

22:11 give you Moisey's service.com

22:15 or whatever, it is you're hosting for

22:16 people.

22:18 The person who's verifying my DID gets

22:20 to go through my KEL and gets to see

22:22 that I actually did at one point give

22:25 you the authorization to host that at

22:26 this location. This is the only DID:Webs

22:29 method that provides that capability.

22:31 – Sorry. The DID controller's KEL?

22:33 Where does it live?

22:35 They live in… the authorization?

22:38 Are you asking where does what live?

22:40 – The controller's KEL live.

22:42 – The controller's KEL lives wherever

22:45 the controller's KEL lives cuz it's

22:47 KERI, but the information from that KEL

22:50 that's relevant to the DID:Webs is

22:54 aggregated into this KERI Event Stream

22:56 and encoded in a KERI.cesr file which

22:58 lives on your server cuz you're hosting it.

23:02 Yeah, Kent.

23:04 – May I add something to

23:05 what you said earlier?

23:07 So, earlier you said, and this is

23:09 important

23:10 for those that are new to DID:Webs,

23:11 you said

23:13 the DID:Webs DID document is always

23:16 derived from the KERI Event Stream.

23:18 And I think it's worth

23:20 highlighting the fact

23:22 that based on what you just barely said

23:23 about the path information being in an

23:25 ACDC,

23:27 that the DID document will always be

23:30 derived

23:31 from an ACDC as well. You've got the

23:34 KERI Event Stream with the KERI

23:35 event logs, and actually the TEL and

23:38 ACDC. So,

23:40 cuz when I was first learning the

23:41 DID:Webs spec, I was like, oh, is there a…

23:44 Does it make sense to just have a

23:45 KEL cuz I you know, that

23:47 was simpler. I thought it

23:48 was a good idea at the beginning.

23:50 Then as I got more familiar, I thought,

23:52 you know what? Actually,

23:54 cuz my goal was maybe we can have a

23:56 DID:Webs version that only depends on

23:58 KERI, not KERI and ACDC. I tried

24:00 to simplify it.

24:01 But actually, when you look at the

24:02 security characteristics that you're

24:03 going to get into in just a minute,

24:05 Jonathan,

24:06 you want there to be an explicit

24:09 authorization

24:10 of the path segments of the whole DID.

24:13 So, it's important to realize that

24:15 the KERI Event Stream I think it

24:17 bears repeating that the KERI event

24:19 stream will always include at least one ACDC.

24:22 It has to have one ACDC. You

24:24 cannot have a DID:Webs unless there's

24:25 at least one ACDC because at the very

24:28 least, you have to authorize the host

24:30 and path information for the DID:Webs.

24:33 Period. That's all. – Why is DID:Webvh

24:37 inherently unsafe? – Well, it's not

24:40 inherently unsafe. It does a lot of

24:41 things fine. One thing it does not do is

24:44 it doesn't let you as a controller

24:45 explicitly

24:48 authorize host and path information for

24:51 your identifier. It's always implicit

24:53 because like I'm going to give you my

24:56 DID:Webvh and it's going to say

24:58 rayback.com and because I gave that to

25:01 you by whatever mechanism, you're going

25:03 to assume implicitly that I've

25:04 authorized that.

25:06 KERI says no, I'm going to actually

25:09 validate that because I'm going to check

25:11 to see if you issued an ACDC authorizing

25:14 this cryptographically. That's an

25:16 explicit authorization versus implicit.

25:19 – So that makes sense. I just want to add

25:24 Webvh implicitly authorizes, it not just

25:28 by handing over but by

25:30 signing. Right? There's an…

25:32 The identifier.

25:33 – The identifier. There's there's an

25:34 implicit authorization

25:36 signed with the [inaudible]

25:38 that serves as a…

25:40 Yeah. True.

25:43 And I might as well just get to the

25:44 point cuz I may not get to the slide

25:45 cuz I realize I'm running out of time.

25:47 But like the other thing that DID:Webvh

25:49 does not do as well as DID:Webs is the

25:52 long-term long-lived

25:54 multi-decade

25:56 identifier problem.

25:58 The spec really tries to make sure that

26:00 it's possible to do that but it gets

26:02 quite awkward. If you're going to change

26:05 like hosting, you're

26:07 going to change path websites over time.

26:10 And this is where I think that stems

26:12 from the fundamental difference. Like

26:14 you're essentially going to publish a

26:15 new

26:16 DID document with new

26:18 location information in it and then you

26:21 have to kind of go and make sure that

26:22 your verify history. A: it got transferred

26:24 from one domain to another, B: that it

26:26 like has all of the steps in it, that

26:28 nothing got missed. Like that's all

26:29 really important. Managing that over

26:31 time is much less practical than a DID:Webs

26:34 because it's the other way around.

26:36 In DID:Webs all of this is happening by

26:38 stuff in the KEL or the TEL or

26:40 one of the KERI artifacts which ends up

26:42 in the KERI.cesr and therefore your DID

26:44 document is always going to be like

26:46 reflective of the actual current state

26:48 of things cuz it's derived from the

26:51 KERI event information. – So they

26:53 tried to do KERI light and now they

26:54 have to bolt on.

26:56 They have a whole section on

26:57 witnesses and watchers now, so yeah

27:01 So, this is the also known as I want

27:04 to get into this really quick.

27:05 The spec requires there to be an

27:07 “alsoKnownAs” section in every DID:Webs

27:09 document. You must list the equivalent

27:11 DID:KERI as part of the “alsoKnownAs”.

27:14 So, at least there's going to be a

27:15 DID:KERI in every DID:Webs document cuz

27:18 that's considered an “alsoKnownAs”, it's

27:19 always by definition

27:22 any DID:Webs is also known as DID:KERI

27:24 whatever the ID is.

27:26 You may, if you choose

27:29 authorize a DID:Web endpoint.

27:32 So, that would happen by ACDC, the same

27:34 ACDC that the DID:Webs identifier shows

27:37 up in. You can authorize a DID:Web

27:39 endpoint, which means you're authorizing

27:41 a DID:Web resolver to go resolve the

27:43 DID:Web version of the

27:46 Identifier

27:49 for interoperability or for whatever

27:50 reasons you want to you want, but like

27:52 you have to explicitly authorize that

27:54 and if you don't authorize it

27:57 nobody should assume that like it's

27:58 DID:Web resolvable. You have to look for the

28:00 actual identifier in the DID document to

28:02 know that.

28:04 Verification method. Okay,

28:07 this is

28:09 what a verification method looks like in

28:11 a DID:Webs DID document. This is all

28:14 standard, you know, one of the various

28:15 options that's in the DID standard.

28:17 We support JSON web keys. We support

28:20 Ed25519. There are two or three other ..,

28:23 Whatever key

28:27 public key

28:28 are supported in KERI, we support in

28:30 DID:Webs.

28:33 verification relationship. This is

28:34 optional. It's optional to have this in

28:36 your DID:Webs, but the DID:Webs

28:39 spec does say specifically if you are

28:41 going to include verification

28:43 relationship

28:45 any key that you publish as a

28:47 public key must be authorized both for

28:49 authentication and assertion. That's the

28:51 one thing. If you're going to have it,

28:52 you have to have both.

28:54 So,

28:55 again, because KERI itself

28:58 any keys that you publish are for

29:01 either authentication or assertion.

29:06 We support these services, these

29:07 KERI services, which would look

29:09 familiar, I think, probably. Looks

29:11 something like this in the

29:14 in the DID document. So, this service

29:16 is a witness service. You can get to it

29:18 at this URL or this TCP endpoint.

29:26 Parameters, as I said, you can have

29:28 parameters on the end of a did

29:30 identifier, just like any other URI. So,

29:32 for example, this one has a version ID

29:34 parameter on the end.

29:36 This lets you tell the resolver

29:38 that you want version one of the… So, you

29:40 can go back in time and derive the DID

29:42 document that existed after

29:45 event with sequence number one occurred

29:47 in the KEL, right?

29:52 We also support this transform keys

29:54 extension, which just…

29:57 I don't actually think we have this

29:58 implemented in the resolver right now,

30:00 but like theoretically, the spec says we

30:01 should support this. This basically just

30:03 means if you pass this in as part of the

30:06 parameter, we're going to transform all

30:08 the keys in the document to that format

30:11 for convenience. This is for convenience

30:13 for people who when they resolve the

30:14 DID.

30:16 – What other formats would you use besides

30:17 CESR?

30:19 – I mean, they're like the native

30:20 format that we support is this JWK.

30:23 – Okay.

30:24 – JSON web key, right?

30:25 – I opened an issue on this. There's

30:27 public key JWK and public key

30:28 multi-base. – Yeah, those are the two. – I'm

30:31 already using public key multi-base in

30:33 the W3C cross walk, and so it's going to

30:34 be added to the resolver. – And

30:37 the spec says we should be supporting

30:38 public key CESR as well. But,

30:41 then there's document metadata.

30:43 This is where you get into some like

30:45 I'm not going to get into much detail

30:46 here, but the main one has to do with

30:48 this equivalent ID. There's a bit of a

30:50 distinction, but the idea is anything

30:52 that should show up in the equivalent ID

30:53 in the metadata. This is not in the DID

30:55 document itself, it's in the document

30:56 metadata.

30:57 Should be other DID:Webses that

30:59 you've authorized. And again, this is

31:01 going to happen via some ACDC. But, it's

31:03 possible you have a DID:Webs

31:04 example.com, but there's an equivalent

31:06 DID:Webs foo.com. That's fine. You can

31:09 have that. It has to

31:12 be authorized by ACDC. Yeah. Mhm.

31:15 – Why “equivalentId” and not put it in

31:19 “alsoKnownAs”?

31:20 This goes back to the DID

31:23 core spec. So, the idea is

31:26 equivalentId are equivalentId of the

31:29 same DID method.

31:33 So, if I have a DID:Webs identifier,

31:36 any other DID:Webs identifier that I

31:39 want to call equivalentId goes in

31:40 equivalentId.

31:42 If I have a DID:Webs identifier, it

31:46 might also be known as a DID:KERI DID

31:47 method, it might also be known as a DID:

31:49 Web DID method. You have It's more

31:51 inclusive. The alsoKnownAs section is

31:52 meant to be more inclusive. The

31:54 equivalentId is meant to be within the

31:56 scope of that DID method because it's

31:58 meant to be processed by a specific

32:00 resolver. That's going to be a DID:Webs

32:02 resolver, right?

32:04 [inaudible]

32:09 I mean, it could be that.

32:10 It could be for any other any number of

32:12 reasons, but…

32:13 – I can give an example there.

32:16 So, we like to do some work that's

32:19 called up with

32:20 DID:Iota and the twin. So, the

32:24 DID:Iota Foundation. And the integration

32:26 point, the initial integration point

32:28 between DID:Iota and DID:Webs was just

32:31 through mutual alsoKnownAs. So, from

32:33 their DID document, they put the DID:Webs

32:34 And from our DID document, we put the

32:36 DID:Iota in the alsoKnownAs sections.

32:39 – So, I'm going to go through this really

32:40 quickly cuz I want to do the little demo

32:41 and I only have about 5 minutes.

32:43 This is important though because this

32:45 is something we had to like deal with

32:47 because of KERI cuz there was no way to

32:48 deal with this in the DID document. So,

32:51 when you have

32:53 multi-signature. So, this particular

32:57 verification method type,

33:00 ConditionalProof2022, there's a spec for it at

33:01 W3C.

33:03 That's what it looks like. This is the…

33:06 This is actually the KERI Event

33:08 Stream. So, you can see here that

33:10 there's a threshold. It's a two out of

33:12 three threshold involving these three

33:14 keys.

33:15 When you get to the DID document itself,

33:17 it looks like

33:19 Oh, this is delegation. When you get to

33:20 the DID document itself, it looks like

33:21 this.

33:23 So, you get a verification method,

33:24 ConditionalProof2022. Says there's a

33:26 threshold of two, here are the keys, and

33:28 then here are the keys listed. We'll

33:30 look at that more detailed later.

33:32 And then this is a delegation of the AID

33:33 itself. It just basically, you have to

33:35 provide the delegator OOBI so that the

33:37 person can go look up the delegator's

33:39 KEL and validate that the delegation

33:41 event is in that

33:44 doc. Okay.

33:45 I'm going to really quickly.

33:48 Specification status, there's a bunch of

33:49 stuff we've done. We've registered it

33:51 all the right places. There's a bunch of

33:53 like. There's a final draft version

33:55 that's being reviewed at under the KERI

33:57 stack working group. There's a

33:59 new IANA media type registered. We also

34:02 are in the final review stage at DIF to

34:04 become a DIF recommended DID method.

34:06 Okay. We're going to do the demo here

34:08 now really quick. – Five more minutes.

34:11 – Yeah, that's why I want to do this. This

34:13 is pretty. This is more like an

34:14 illustrative demo.

34:17 [inaudible]

34:27 Why? Oh.

34:40 Okay. What we're doing here is

34:42 we're just going to kind of start doing

34:44 some KERI stuff. So, the first thing

34:45 I'm going to do is I'm just going to

34:46 accept an AID, right? So, I've

34:48 created this AID.

34:50 It has that public key.

34:54 This is what the

34:56 KEL looks like. This is what the KERI

34:58 Event Stream looks like.

35:01 Okay? So, you've got the

35:04 the AID, you've got the key.

35:06 At this point,

35:08 I cannot have a DID:Webs.

35:10 Why?

35:13 There's no ACDC authorizing the host and

35:15 path information. So, that's the next

35:16 thing I have to do. I have to issue the

35:19 the ACDC.

35:21 Here's the ACDC that I just issued

35:24 that's authorizing for this identifier

35:27 these two

35:29 identifiers. For this AID

35:31 identifier, these two DID:Webs or DID

35:34 identifiers. One is a DID:Web In this

35:36 case, I'm authorizing a DID:Web endpoint

35:37 as well in the correct format.

35:40 So, now I have this Key Event

35:44 Log, this KERI Event Stream

35:47 that includes

35:49 the ACDC right here.

35:51 Right? That has my

35:54 host and path information

35:56 committed to, right? Now, I can create a

35:59 DID document.

36:00 So, this is what DID:Webs

36:03 DID document would look like. This is

36:04 almost the most simple possible DID:Webs

36:06 DID document.

36:08 I don't have to have a witness service

36:09 if I'm working in direct mode. So,

36:11 that's optional. I don't have to have a

36:14 DID:Web identifier.

36:16 Beyond those two things, this is about

36:18 the most simple possible DID:Webs DID

36:19 document you could have.

36:21 Okay?

36:22 Now, let me show you a multisig

36:23 example.

36:25 So, I'm going to set up a multisig

36:26 group.

36:30 And they've got to do all the chatter

36:32 back and forth to get each other's

36:33 KELs.

36:36 Okay, so now I've created a multisig

36:38 group. It involves three identifiers

36:42 with each having one key.

36:48 You can see here that the keys are given

36:51 each one half weight. So, this is

36:53 fractional weight using KERI fractional

36:55 weights. That means that there are three

36:57 keys and each key gets half a vote.

37:00 So, in order to have a full vote, two of

37:02 the three have to vote, right? Two of

37:04 the three have to approve. That

37:05 gives you quorum.

37:10 That produces a DID document that looks

37:11 like this.

37:13 So, I've got my, you know, my identifier.

37:16 I have my alsoKnownAs. Now, here's my

37:18 verification method ConditionalProof

37:19 2022. It correctly determines that two

37:23 out of three, so two of these three

37:25 keys, which are listed in detail here,

37:28 have to sign in order for something to

37:30 be valid, right?

37:33 And then we get our cute pony.

37:35 CUTE PONY.

37:37 [applause]

37:40 So, there's that.

37:42 And then let me really quick just

37:45 show you in the last minute or so.

37:48 We have

37:50 Yeah, we have the…

37:53 This is the Universal Resolver and

37:54 [inaudible] the Universal Resolver. This

37:56 is mostly Marcus and his work that he's

37:58 done on this. It's pretty amazing. Kent

38:00 wrote the driver for this. So, we have a

38:02 DID:Webs driver that goes here.

38:04 Let me grab my

38:10 DID:Webs identifier here.

38:19 I'm going to resolve this DID:Webs DID

38:22 at the Universal Resolver.

38:27 There it is.

38:28 Tells me where the witness is.

38:32 You can look at the DID document, see

38:33 the DID document.

38:37 You can see the document metadata where

38:40 you should get the equivalent IDs.

38:43 Okay.

38:45 And

38:46 this is where you cannot because

38:49 DID:Webs has the unique property of

38:50 the KERI.cesr that's not available

38:53 on the Universal Resolver page.

38:55 If you want to see that.

39:02 I can resolve that. Just by Curl here.

39:10 And you'll notice too that this CESR

39:13 that's getting

39:14 printed to the terminal.

39:16 Looks really great.

39:18 This is a tool that Kent wrote recently

39:20 here that's a really nice that annotates

39:22 and prettifies the CESR stream.

39:25 This is the

39:28 aggregated chunk of KERI events that we

39:31 call the KERI.cesr, the KERI Event

39:33 Stream that created that DID document.

39:36 So you're going to go all the way back

39:37 you're going to see an inception event

39:39 here.

39:40 Somewhere in here you're going to notice

39:42 that there's going to be an ACDC.

39:45 It's very bottom.

39:48 Right here.

39:50 That authorizes the endpoints.

39:53 So.

39:55 So there you go. That's what I got.

39:57 Time up. [applause]