Infrastructure for Security - Phil Feairheller

KERICONF26 Day 1 · 41:15

0:00 Phil Feairheller | Infrastructure for Security | Keri Conference 2026

0:03 Hi everyone. Thanks for showing up

0:04 today. My name, for those of you who

0:05 don't know me, is Phil Feairheller and

0:07 the CTO and co-founder of healthKERI.

0:10 We are specializing in bringing KERI

0:12 technology, as the name would suggest,

0:14 into healthcare, in particular data

0:16 exchange in healthcare to help

0:17 facilitate trust across the healthcare

0:19 ecosystem. I realized I forgot a intro

0:21 slide, so I'm just doing it without a

0:23 slide.

0:24 So, in my job, I end up teaching KERI

0:27 very often to a lot of different people,

0:28 in particular people who have never even

0:30 heard of it before. Sometimes maybe

0:32 they've heard of PKI, sometimes they've

0:34 heard of X.509s, but they've never heard

0:36 of KERI. And this is one of my favorite

0:38 slides to teach KERI because it starts

0:41 at the very bottom of the layers that

0:44 make KERI the security protocol that it

0:46 is. And when Sam first asked me to do

0:48 this talk on KERI infrastructure, I

0:51 immediately thought of this slide

0:52 because the infrastructure that I'm

0:54 going to talk about is very clearly

0:55 spelled out in the layers of security

0:57 that make up the KERI stack. So, I

1:00 won't do the whole spiel that I usually

1:02 do for this, but very quickly, starting

1:03 at the bottom of the self-certifying

1:05 identifiers and CESR, for folks that

1:07 who know PKI, I always like to say that

1:09 KERI solves the two hard problems of

1:11 PKI. One is creating a cryptographic

1:14 binding between the identifier and the

1:16 first set of keys, and the second hard

1:18 problem it solves is key rotation,

1:20 creating the cryptographic binding to

1:21 every other set of keys. And we are able

1:24 to do that with CESR, which is our

1:25 encoding format for exchanging

1:27 cryptographic primitives at scale.

1:30 So, the next layer up is pre-rotation

1:32 Key Event Logs. Already touched on what

1:33 pre-rotation is, and the Key Event Logs

1:36 are of course the data structure,

1:38 append-only data structure that allows

1:40 us to communicate changes in our key

1:41 state that anyone else in the world can

1:43 verify without ever having to phone

1:45 home. Layer three delegation distributed

1:47 group multisig,

1:49 that is something that we only talk to I

1:52 only talk to when I'm dealing with more

1:53 advanced audiences, talking about

1:55 KERI's ability to do delegation both at

1:56 the identifier level as well as

1:59 attenuated delegation with ACDC

2:01 credentials and distributed group

2:03 multisig is one of the more fun

2:06 technologies in KERI. I love working

2:07 with it. I love building it when we were

2:08 at GLEIF, but we don't really dig too

2:11 much into it. And so then if you think

2:13 about what I'm going to talk about

2:14 today, the wallets and then the watchers

2:17 and the witnesses, the first three layers,

2:20 one through three that I just talked

2:21 about are all in the wallet. So I'll be

2:23 able to demo most of these,

2:25 actually all of these capabilities today

2:26 with the wallet. It's our wallet called

2:29 Locksmith. And then when you get to

2:30 layer four, witnesses and watchers,

2:32 those are the other components that I'll

2:33 talk about today that we've donated it

2:35 to the KERI Foundation for open source.

2:37 And those are of course the layer that

2:39 allows us to make our Key Event Logs

2:41 available to other people and keep an

2:43 eye on anyone else we're doing business

2:45 with, keep an eye on their key state.

2:49 So the Locksmith wallet is an

2:51 application that we've built over time.

2:53 It actually started as a pet project of

2:55 mine because I was tired of using the

2:56 command line. Most of the work that we

2:58 did at GLEIF was done building out the

3:00 command line and then actually creating

3:02 the entire

3:04 GLEIF-authorized representative system

3:07 with the KERI command line. And

3:09 at one point I just got tired

3:10 of

3:11 [laughter]

3:11 using the command line over and over

3:12 again particularly when trying to demo

3:14 KERI to people. So I just started

3:15 playing around with what it would look

3:16 like to create a wallet and took the

3:18 KERI command line from KERIpy and

3:20 just started building little features

3:22 one at a time into this and eventually

3:24 it became a tool that I was using all

3:25 the time and we figured it would be very

3:26 useful and started making it a

3:28 production quality wallet.

3:32 The core of it is open source and what I

3:33 mean by core and I'm going to be demoing

3:34 it here in a minute, you'll see the core

3:35 is basically all the KERI

3:36 functionality. Just core KERI

3:38 functionality for working with your key

3:39 state locally, creating what we call

3:41 vaults which if you know KERIpy

3:43 they're called Haberies. (Sorry Sam,

3:45 couldn't call them Haberies in my

3:46 product)

3:48 Creating identifiers inside of those

3:51 vaults, doing delegation, multisig,

3:53 Provisioning

3:54 witnesses is actually on our on our SaaS

3:56 platform, but working with witnesses,

3:59 doing key rotations, etc. We also

4:00 have sections for all the work you do

4:03 with a credential, so uploading schema,

4:06 issuing credentials, granting

4:07 credentials, doing the whole IPEX

4:09 exchange, as well as receiving

4:11 credentials and using them in various

4:12 ways. There's no server required for

4:14 the core Locksmith wallet. You can

4:16 create all of your stuff locally for

4:18 everything that you would need to

4:20 potentially share with someone, we have

4:21 an export feature. So, if you create an

4:23 identifier, you do a couple key

4:24 rotations, you want to share it with

4:26 someone, you can just export the CESR

4:28 of the Key Event Log and email to

4:29 someone.

4:31 And then finally, it's extensible by

4:32 design. We'll get into that

4:34 quite a bit. When we first started

4:36 adding features for our SaaS platform,

4:38 and the healthKERI SaaS platform is

4:40 really just KERI infrastructure.

4:41 We're allowing folks to provision

4:43 witnesses and watchers and use them with

4:45 their identifiers for doing business

4:46 with each other, we realized actually it

4:49 was just because of where we put it on

4:50 the user interface, it looked like a

4:52 plugin. And we thought, well, you know

4:53 what? If we do really want to donate

4:55 this to open source, we're not going to

4:56 donate that part of the product to open

4:58 source, so why not wrap the interaction

5:01 with our SaaS services into a plugin API

5:05 and make it so that anyone can provide

5:07 plugins to that system. And so, I

5:09 believe later today or maybe tomorrow

5:12 we'll see some of the gentlemen from the

5:14 KERI Foundation who have taken this

5:16 open source core and integrated their

5:18 own plugin to deal with their own SaaS

5:19 services. And Two presentations this

5:22 afternoon. Great. On just that? Yeah.

5:25 Excellent.

5:26 And so, what we've also done with it

5:28 over time is part of the business

5:30 that we're getting into, you heard Jared

5:32 talk about today, we're starting to

5:33 bring the vLEI into healthcare. So,

5:36 we're helping folks with the issuance of

5:38 credentials, particularly vLEI

5:39 credentials. So, we've added a new

5:41 component underneath our plugin for our

5:44 SaaS platform that is a credential

5:46 issuance management protocol or

5:48 plug-in. And so that will interact with

5:50 a server component, really wrapping all

5:52 of the hardest part of

5:55 of issuing the vLEIs is managing the

5:57 multisig identifiers required and the

5:59 coordination between participants and

6:01 how they see the credentials and how

6:02 they interact with each other,

6:04 notifications, etc. when issuing

6:06 credentials across an enterprise by

6:08 various parties who may not be sitting

6:10 in the same room all the time.

6:12 (Let's see where to go.) So the

6:13 KERI core already talked about it a

6:15 little bit and I'm honestly not really

6:18 sure where to go to the demo, so I may

6:19 just tell on the slides and go right

6:20 over soon, but

6:22 this is just all the basic stuff you

6:23 would do with a with a KERI

6:25 system. So create your identifiers,

6:26 manage them, do rotations, like I said,

6:29 export them, share them with other

6:30 folks.

6:31 We've broken out group identifiers into

6:33 its own section. We initially

6:35 experimented with having it as just

6:36 another type of identifier you create

6:38 and that was a little bit unwieldy, so

6:40 we have our own separate group

6:41 identifier section. The ability to do

6:43 delegation with any identifier that you

6:45 create, you can send challenge

6:46 responses. I already mentioned the

6:48 credential schemas and then working with

6:49 witnesses

6:50 and watchers, as a matter of fact. And

6:52 then kind of tangential to what you get

6:55 with a normal KERI wallet, but much

6:57 needed is a full notification system

6:59 integrated with KERI messages that go

7:01 back and forth. So if you receive KERI

7:03 messages like IPEX messages for a grant

7:05 that you were given, they turn into

7:08 notifications inside of the user

7:09 interface, kind of separate from the

7:12 actual IXN message itself. (What's next?)

7:16 The plug-in arcitecture is the part ..,

7:22 Down at the bottom here, this is the

7:26 healthKeri plug-in and this is what

7:28 you would access to be able to reserve

7:31 resources on our SaaS platform in much

7:34 the same way that you would go

7:36 reserve a VM from Digital Ocean or from

7:39 AWS. And so we tried to keep that

7:41 comfortable for people who are used to

7:43 dealing with cloud services to say, "Oh,

7:45 I need another witness. I can just go

7:46 rent him, if you will."

7:49 And so when you go into that

7:51 Plug-in, you will see the ability to

7:53 access identifiers, witnesses. We

7:56 give you the opportunity to publish

7:57 credentials,

7:59 we're going to do a lot more with

8:00 that in the future once the KERI

8:02 Foundation starts working on observers

8:04 and registrars. This is just kind of

8:06 a lightweight version of that. We

8:08 have a connections feature which steps

8:10 kind of outside of OOBIs if you just want

8:12 to do quick connections with each other

8:14 and you know the other person is using

8:15 Locksmith at our SaaS platform. And then

8:18 watched identifiers is our watcher

8:20 network. And I'll talk more about that

8:22 later.

8:23 Mailboxes so that you can get

8:25 these messages sent back and forth to

8:26 each other. And then finally servers and

8:28 profiles I'll touch on when I do the

8:29 demo.

8:31 Okay, so we're going to stop

8:32 there and I'm going to switch over

8:36 To the demo. So this is Locksmith.

8:38 Again, I have two of them running here.

8:39 (I don't know how awkward that is to see

8:40 on the screen. Maybe I'll just center

8:42 them both.)

8:46 (With the overlap there, that might be a

8:47 little bit awkward.)

8:48 I have two Locksmiths here so

8:49 that I can demo some of the features of

8:51 going back and forth between them.

8:53 As I mentioned, we call [them vaults, red.]

8:55 Your database environments which you

8:57 can separate out groups of identifiers

8:59 within a KERI system, we call them

9:01 vaults. And so we have the ability to

9:03 create a new vault. You can give it a

9:05 name. So I'm going to go with Alice.

9:08 And create a vault. One of the things we

9:10 focused on here is making it very

9:14 simple to do very simple things. So when

9:16 you're creating an identifier, there's a

9:18 lot of things you can do and it can be

9:19 very complicated and complex to

9:21 understand what all the knobs and

9:23 buttons do on creating an identifier.

9:26 Same with creating a vault here. And so

9:28 we tried to make it so that in the very

9:30 simple case, if you know what you're

9:32 doing, you just need to do something

9:33 quickly, type in a name and go and

9:34 you're done. So that's what we did with

9:35 creating in a vault you could creating a

9:37 vault. You can do two-factor auth with

9:39 it if you want. Not really that

9:41 meaningful or important, but you can cuz

9:42 someone requested it from us. So, now

9:44 I'm going to open the vault.

9:46 And here I am in a KERI environment.

9:47 Over here on the left-hand side, I have

9:50 my menu which gives me the ability to

9:51 work with all the items I talked about

9:53 before. Identifiers are my local

9:55 identifiers. Remote identifiers are

9:57 those with other people who I'm

9:59 doing business with. Group multisigs,

10:02 credentials, proxies, and the

10:05 settings. So, I'll just touch on

10:06 the settings very quickly inside of

10:07 here. These for those of you who have

10:10 worked very closely with KERI under the

10:12 hoods, these are various knobs and

10:15 buttons you can turn to configure your

10:17 environment whether you want a temporary

10:18 data store where if you want to change

10:19 the directory where we store things by

10:21 default, etc. We have a plugin that

10:24 I'll be demoing tomorrow that interacts

10:26 directly with Locksmith for gaining

10:29 access to getting things signed for you

10:32 Submitting IPEX grants so that you

10:34 can log onto a website, that sort of

10:35 thing. You can configure that here as

10:37 well.

10:40 Going back to identifiers. As I

10:41 said, we try and make things very

10:42 simple. So, I'm Alice and I want to

10:44 create an identifier. I just did. So,

10:45 now I have a KERI identifier. It's got

10:47 a Key Event Log, only an inception

10:49 event. And if I look at it, you can see

10:51 that I created it. It has a public key.

10:54 No witnesses or anything like that

10:55 yet. And there's my Key Event Log. So,

10:57 that was really easy. And that's one of

10:58 the things that we really want to

11:00 emphasize here is how quickly we can do

11:02 things. Now, if we want to get more

11:03 complicated with it, you can go into our

11:06 advanced configuration and you have all

11:08 of these options available to you. You

11:09 can we can do a keychain if you want to

11:11 do a hierarchical deterministic

11:13 keychain. You can create that here. You

11:15 can have a salt which you can look at,

11:17 copy and paste, and save in your one

11:19 password so that you could recover this

11:21 identifier and all of its keys in the

11:23 in the case of a catastrophic event.

11:26 If you're a little more

11:28 concerned about security, you can just

11:29 do a random key so that you could never

11:31 get it back if you lose your keys.

11:33 Underneath that, we have our signing

11:34 thresholds. So, you have the number of

11:36 signing keys in the signing threshold.

11:38 This is only the M of N support. We

11:40 haven't built in the support for

11:42 fractionally weighted thresholds yet. We

11:43 will eventually. Some of the other

11:46 features when you create an identifier,

11:47 you can go with establishment only or do

11:48 not delegate. And then if you choose

11:51 delegation, you can delegate from some

11:53 other identifier, whether it's a local

11:55 or a remote identifier. So, I'm not

11:57 going to create any of that right now.

12:01 We have our remote identifiers.

12:04 (That's actually a problem.

12:08 I'll come back to that in a minute.)

12:09 And then in our group identifier

12:11 section, if you wanted to go ahead and

12:12 create a group identifier, you give it a

12:14 name, you select your local identifier

12:16 that you want to use to join that group,

12:18 and then you would select your other

12:19 participants.

12:21 And again, a group identifier is

12:25 exactly like any other identifier in

12:26 KERI. It's just that the keys are

12:28 shared across different machines. So,

12:30 all the other options for specifying

12:32 your thresholds, whether it's

12:33 establishment only or do not delegate,

12:35 all apply in here as well.

12:40 – Quick question. (Yes) Is there a

12:42 discovery built into that

12:44 drop down for adding group?

12:46 Yes, so the other participants would

12:48 be coming from your remote identifiers

12:50 here. So, any identifiers that you OOBI

12:52 with and you've connected with become

12:54 candidates for joining a group

12:55 multisig. So, you already have to know

12:57 about their Key Event Log, and that's in

12:59 that's because of the protocol used to

13:01 create a group multisig. It involves

13:04 taking keys from individual

13:07 identifiers from all the participants

13:09 involved. And only the public keys, we

13:11 don't share the private keys. So, that's

13:13 where they came from.

13:14 – Is that a different concept than like a

13:17 connection, a more general connection,

13:19 or is it specifically scoped to

13:21 Multisig

13:22 group identifier? When you say that,

13:24 are you referring to remote identifiers?

13:25 Yeah. So remote identifiers are just

13:28 ones you OOBI's with. So, in KERIpy, I

13:30 think they're called 'contacts' in KERIpy,

13:32 that's what the remote identifiers

13:34 are here.

13:36 It could be anything. Issuing a

13:37 credential to receiving a

13:39 credential from, anything at all.

13:42 (real quick, I realized I

13:45 forgot to do something, so you're going

13:46 to see a little bit of behind the scenes

13:47 here.)

13:49 (Because I realized I don't have…) – [Inaudible]

13:52 [laughter]

13:53 What do you mean?

14:00 We're going to

14:01 restart my two Locksmiths.

14:05 (And I knew I was going to make that mistake.)

14:12 We should be good to go

14:13 now.

14:15 I'll re-center and size them a little

14:17 more.

14:29 We were in the middle of

14:30 creating Alice, so we will open up her

14:33 vault again, and we'll go over to remote

14:35 identifiers. Good, there they are. Those

14:37 are the two identifiers for our SaaS

14:39 platform. And so, they are configured to

14:42 load when I And these are

14:44 configuration options you can add when

14:46 you package and ship your version of

14:48 Locksmith. Those are OOBIs that he will

14:50 automatically resolve when he starts up,

14:52 so that he has access to them here. For

14:54 in our particular case, verifying the

14:56 signatures against our SaaS platform

15:00 for gaining access.

15:03 Let's go over to the healthKERI,

15:05 SaaS platform. This is

15:09 our 'getting started' screen, creating an

15:10 account within healthKERI. And the

15:13 reason why I'm doing this,

15:14 it won't take very long, but this gives

15:16 me the ability to provision witnesses,

15:17 so we can talk about the witnesses that

15:19 we have, and then also to start watching

15:21 identifiers inside of the healthKERI

15:22 watcher network so we can see the

15:24 interplay there. And then I can talk

15:26 more about what we, you know, what's

15:28 going to be available for all of you

15:29 folks to start working with. So I am

15:31 in Alice, so I will very quickly create

15:33 Alice and this is one of the key

15:34 differentiators of what we do with

15:37 our SaaS platform. There are no usernames

15:39 and passwords. There are only usernames

15:42 and KERI identifiers. So you aren't

15:45 uploading a password here, you're

15:46 selecting a local KERI identifier ..,

15:48 (Hold on.)

15:52 (Create a new one.)

15:56 I'm going to select my healthKERI

16:03 identifier to use and that will be the

16:06 identifier that the public key and

16:08 Key Event Log of that identifier will

16:10 be stored on our services and anything

16:12 that I send to the SaaS platform API will

16:15 be signed and encrypted and anything

16:17 that it responds with, will also be

16:19 signed and encrypted from their AID.

16:21 So we have all of our communications

16:23 between our local Locksmith plugin and

16:25 our SaaS platform secured with what we

16:27 call ESSR which is 'encrypt send sign

16:29 receiver' which is a protocol

16:32 that's built into KERIpy.

16:34 So I'm going to continue into

16:35 the account creation. This is Alice.

16:38 She's on the internet.

16:41 'Alice

16:43 at healthkeri.com'

16:51 Create an account. Now when

16:52 we first created our SaaS platform, we

16:54 based everything off of an individual

16:55 user and you would provision your own

16:57 witnesses and watchers and that

16:58 immediately was revealed to be

17:01 very much too limiting because

17:03 people would want to share accounts. So

17:04 we switched over to a model where we

17:06 have teams and if any of you are

17:07 familiar with using Digital Ocean, it's

17:09 very much modeled off of their

17:11 approach for how you share resources

17:13 across teams. And this came in

17:16 handy later when we started working with

17:18 provisioning services inside of

17:20 enterprises where you have maybe a cloud

17:22 service that needs an identifier and it

17:24 also needs things like witnesses and

17:26 watchers, how you bring that server into

17:29 your platform so he can start doing

17:30 KERI things and reserving resources

17:32 from your KERI account. So this is team

17:36 'Alice .. [@]

17:39 healthkeri.com' and we'll continue to

17:45 access code and as of right now we don't

17:47 have billing built into our system so we

17:49 just base it off access codes. I hand

17:51 out access codes when people want to get

17:52 an account on our system.

17:56 And so I've created a couple for this demo.

17:59 – There's no vLEI

18:03 integration where you're collecting

18:05 their role? No, not in this. No, we

18:07 don't require a vLEI to gain access to

18:09 our to our platform. Okay, so I've gone

18:11 ahead gone ahead and created an account

18:13 Inside of healthKERI. I've added a

18:15 team to that account.

18:17 And now I'm going to add an identifier.

18:18 And this is a little bit of an awkward

18:20 step but one that we were required to do

18:22 for all of the other things you would

18:24 want to do on our SaaS platform. And what

18:25 I mean by that is when we provision

18:27 witnesses, slightly different from what

18:29 many of the other witness

18:31 deployments are right now, when we

18:33 provision witnesses, we provision them

18:34 only for a single AID. So every witness

18:37 that you get on our service will only

18:39 ever witness for the AID you gave it.

18:42 And that's a security measure and also

18:45 it helps us keep the scale of all the

18:46 witnesses very low so that we can

18:48 have a lot of witnesses because we know

18:50 each one will only ever witness for one

18:52 AID. And so in order to do that, we have

18:55 to give it the AID to witness for.

18:57 So that's an example of why we had to

18:59 create a first step that when you want

19:02 to start using our system, you have to

19:03 give us an identifier to start working with.

19:05 – Are there any special caveats for

19:08 group identifiers? No.

19:10 – They have separate witnesses?

19:12 Correct. Absolutely, yep.

19:14 In addition to that,

19:17 if I have, for example, maybe an

19:19 identifier on a phone and I want

19:21 witnesses for it, I can actually do that

19:22 as well from here (and I'll show you how

19:24 you integrate with that later).

19:26 When you first upload an account

19:27 identifier, it can be a remote

19:29 identifier that you OOBI'd with so you

19:31 can get resources for some other

19:32 identifier or a local one from this

19:34 wallet. In addition, we added a

19:36 feature of making this identifier

19:38 publicly available and that's just the

19:40 healthcare platform global OOBI system so

19:43 that whenever you upload an identifier,

19:45 we immediately create a new OOBI for you

19:46 that you can hand out to anyone and

19:48 it'll work for all roles within your

19:50 system. And for those of you who know

19:52 the details of KERI,

19:54 if you OOBI against a specific role, you

19:56 only get back the responses

19:58 for that role like for a witness. So,

20:01 this just gives you everything back with

20:02 one single OOBI. So, I'm going to upload

20:05 Yep, got to select it first. I'm going

20:06 to upload the Alice identifier.

20:09 And you can see that now our SaaS

20:11 platform knows about this identifier.

20:13 It's associated with our account. It has

20:15 our sequence number.

20:17 And broken out on this grid is both the

20:19 local sequence number that I have on my

20:21 machine and the sequence number that the

20:23 remote system has for me. And those

20:26 can get out of sync if I do a bunch of

20:27 rotations and don't come back and update

20:28 healthKERI except for when watchers are

20:31 involved.

20:35 And so now it's also public.

20:36 From here I'm going to jump

20:37 back real quick to

20:40 the wallet side of this

20:42 application, not the healthcare platform

20:45 side, and talk about our

20:47 credential management system. So, inside

20:49 of here, we have the ability to issue

20:50 credentials. We broke credentials out

20:52 into those that you have issued, those

20:54 that you have received, and then

20:56 accepted offers is something very

20:58 particular to the demo I will be doing

20:59 tomorrow.

21:01 And for those of you who were here at

21:03 SEDI and saw me do it yesterday, it's

21:05 where we have integrated IPEX

21:07 protocol into our OAuth servers so that

21:10 you can do a credential presentation of

21:11 an offer without the actual credential

21:13 itself and require the site to sign your

21:16 terms and conditions before you give

21:18 them the full credential. Those signed

21:20 receipts, signed offers show up here.

21:23 And then finally we have the ability to

21:24 do schema.

21:26 We can upload schema from any source.

21:29 I'm going to go ahead and grab the QVI

21:31 schema just cuz I know it doesn't have any ..,

21:32 Doesn't have any chains on it. So we put

21:40 the OOBI in there and it automatically

21:41 pulls out the SAID for you just so you

21:43 see you have that tuple of the

21:46 identifier as well as the OOBI. And then

21:48 this is another use case where we looked

21:49 at it and said, "Okay,

21:52 credential registries make sense to me,"

21:55 but that's cuz Sam has explained them to

21:56 me about five times, maybe probably more

21:58 than that.

21:59 It was really hard for us to explain to

22:00 people what they're doing in that first

22:03 step before you're allowed to issue

22:04 credentials. You have to create a

22:05 registry. Well, what's that? What name

22:06 do I give it? "Where does it live?" And

22:08 so instead of doing that we tried to

22:10 hide all that and this is open for

22:12 debate. This will now be an open source.

22:13 So if folks don't like this it can be

22:15 undone, but we've decided that instead

22:18 we've added a step to uploading a schema

22:20 that says, "I want to use this for

22:22 credential issuance." So when you select

22:24 that, you select an identifier who's

22:26 going to be the issuer for that

22:27 particular type of credential. And when

22:29 you load the schema, not only does it

22:32 load the schema, but it has now created

22:33 a credential registry behind the scenes.

22:35 So that is completely hidden from the

22:36 user and we think that's probably a good

22:38 thing,

22:40 but again open for debate and we're

22:41 willing to accept feedback on that. Did

22:43 you have a question? – Yeah,

22:45 Did you issue a credential registry per schema type?

22:47 Yep. It was just a an allowance that we

22:50 made to try and make it a little bit

22:51 easier for the user.

22:53 When you come into our issue

22:55 credential screen, (I'm not going to

22:56 issue any credentials but I just want to

22:57 show you really quickly), you select the

23:00 type that you want. We dig into the

23:02 schema and present fields for you. These

23:05 are as typed as we can make them based

23:06 on the JSON schema in each of the

23:08 credentials cuz you cannot specify

23:10 formats and stuff in schema

23:12 if you don't want to.

23:14 Calling out required fields and stuff

23:15 like that just to make credential

23:16 issuance a little bit easier

23:19 for the user without hardcoding into

23:21 this app knowledge of any specific

23:23 schema type.

23:24 Okay, so now we're going to go back to

23:29 the healthKERI plugin.

23:31 And

23:32 there we go. Perfect example. So this

23:34 this identifier is now out of sync and

23:36 that is because I created a credential

23:37 registry with it which had which had to

23:39 create an anchor into my Key Event Log

23:41 and now he's out of sync, so you can see

23:42 that the remote server doesn't have my most

23:47 up-to-date key state.

23:49 So I'm just going to go ahead and update

23:51 that. And so this tells me that I'm

23:53 going to be taking the local key state

23:54 where I'm at 1

23:56 and pushing it up to the remote server

23:57 who is at key state 0 for this and

24:00 updating now we're in sync. So he now

24:01 knows about my most recent key events.

24:04 So now we're going to move on to

24:04 witnesses and this is .., (Does it make sense

24:07 to go back to the

24:09 slideshow?)

24:11 So yeah, so I'll just go over this slide

24:12 very quickly.

24:14 So this is witness as a service and as I

24:17 mentioned earlier this gives you the

24:18 ability to reserve individual witnesses

24:21 for your AID. Any number of witnesses

24:23 you want. We have geographically

24:25 disperse witness infrastructure so you

24:27 get to pick where you want your

24:28 witnesses deployed, how many you want

24:30 deployed and then you get to pick your

24:31 threshold that you want of those

24:33 witnesses and our user interface will

24:35 default to the most logical threshold

24:38 based on the What's the name of that

24:40 algorithm?

24:41 The Kawa algorithm. So the

24:43 number of witnesses that you should have

24:45 in your threshold versus the number of

24:46 witnesses that you have.

24:48 So as I said reserve a witness as easily

24:51 as any cloud resource. The core of this

24:53 is open source. I know we're going to

24:54 see demos of the KERI Foundation folks

24:56 who have already put it into production

24:58 in their systems.

25:00 it is a multi-tenant system, so you can

25:03 put it on one

25:04 VM and reserve as many witnesses as you

25:06 think that VM can support. And then what

25:09 we've done behind the scenes for us is

25:10 that we spread that out across multiple

25:12 hosts and we have a round-robin, and I'll

25:14 talk about how we deploy all this later,

25:16 that we can then pick from for any

25:18 particular region.

25:20 We have added, actually I added, to

25:22 KERI core, at the very beginning of my

25:25 work at healthKeri, the ability for a

25:27 two-factor auth for witnesses. So we have

25:29 a one-time passcode that you select

25:33 that you authenticate with the witness.

25:34 He gives you back the one-time passcode,

25:36 then you have to enter that anytime you

25:37 do a key rotation. And that's to make

25:39 sure that your witnesses won't just

25:40 accept the Key Event Log for you from

25:42 anyone. You have to provide that

25:43 one-time password with it. There are

25:45 other ways to do this. We could use our

25:48 our proprietary API with the ESSR to

25:50 accept events for your witnesses, but we

25:54 thought that was more vendor lock-in

25:56 than we really were comfortable with, so

25:57 we went with this one-time password

25:59 solution. They are

26:00 non-promiscuous. They will only witness

26:02 for the people for the one AID that you

26:04 reserve them for. Each witness has its

26:06 own dedicated key store, so there's no

26:08 mixing of keys in like a MongoDB

26:10 or anything. They each have their own

26:11 private LMDB and we manage that across

26:14 multiple servers. This makes it fairly

26:16 scalable, pretty easy to deploy, and

26:18 designed for and in our case implemented

26:20 with geographic distribution.

26:23 (Let's just see the screen. I don't

26:25 need to talk through this.)

26:27 So here we are. So let's add a witness.

26:29 So when you open up the create a witness

26:30 screen, it will of course make you

26:32 select an identifier, so I'm going to

26:33 select Alice. In our system right now

26:36 we have four regions deployed. We have

26:37 New York, Frankfurt, Singapore, and

26:39 Sydney. And you get to choose where you

26:42 want your witnesses deployed. So I've

26:43 already chose I've already selected

26:45 Alice as the identifier that I want

26:47 witnesses for. I can add as many as I

26:49 want in each region. It gives you a

26:52 suggestion of a name for that witness in

26:54 that region. You can name them anything

26:55 you want.

26:57 If you want to, I'm just going to go

26:58 ahead and reserve a witness in each of

27:01 the regions.

27:03 And then I'm going to choose an

27:03 authentication method.

27:05 Trade-off here between security and

27:07 friction, ease of use.

27:10 We've given you the ability to have

27:12 an individual one-time passcode for each

27:13 witness that you reserve. At four,

27:16 that's really onerous, so I wouldn't

27:18 even do it at four. At 12, I couldn't

27:19 even imagine it. So, we also give you

27:21 the opportunity to do a batch one-time

27:23 passcode. One-time passcode for all of

27:25 your witnesses for this AID, and that

27:28 way you can only enter it once, only

27:30 enter one code once when you do a full

27:32 rotation.

27:34 So, we're going to select batch,

27:35 create our witnesses, and you can see

27:37 here I've now spun up four witnesses.

27:39 Pretty fast. This is actually witnesses

27:41 spinning up in our SaaS platform. It's

27:43 very light touch for getting a single

27:44 witness to spin up.

27:46 Each one has its own identifier. You can

27:47 see them here. They're non-transferable

27:49 identifiers, as you would imagine. Here

27:51 are the OOBIs right here that you can

27:53 copy and paste if you wanted to.

27:55 You can also toggle on QR codes for

27:57 those OOBIs. So, if you're doing this

27:59 for a device that's on a mobile phone,

28:01 and you need to scan in these so that

28:03 you can now gain access to them for that

28:04 device, you can do that here with these,

28:07 QR codes. And then finally, we provide

28:10 the opportunity for you to right here

28:11 grab those OOBIs out of this screen and

28:13 just introduce to all of them. So, I'm

28:15 going to go ahead and do this. I'm now

28:16 OOBI'ing with each witness individually

28:18 and saving him into my database. And

28:21 then we did the authentication step,

28:23 where I called into the

28:24 witness, and this was really tricky to

28:26 get right because this like sort of a

28:29 trust a TOFU (trust on first use) case,

28:31 where that witness wasn't authenticated

28:33 anybody, but he would only accept things

28:35 from me. So, I was able to sign one

28:37 request to him to get the one-time

28:39 passcode back from him, and it was

28:40 encrypted between the two of us. So, now

28:42 I have the one-time passcode here. I

28:44 can, again, I could scan that into the

28:46 one-time passcode feature on my phone or

28:49 in this case I'm going to copy it and

28:51 put it in

28:52 one password so I can actually

28:54 do things with these witnesses

28:55 afterwards.

28:57 So, I don't know if any of you knew

28:58 this, but

28:59 What's that?

29:01 – We need your one password? No, I use

29:03 my fingerprint. You don't have that

29:05 again.

29:07 – I just wanted you to type it out for us on screen

29:09 Nope.

29:11 So, I don't know if you knew this, but

29:11 when I discovered this like wow, that's

29:13 cool. They have they have a one-time

29:14 password support.

29:18 Yeah, absolutely.

29:20 Yeah, they have a they have OP command

29:21 line, very cool. Two words or two

29:23 letters, I love that.

29:25 Then finally, the last step would have

29:26 be of course rotation this in. I could

29:28 just go do this manually, but we've

29:29 added the ability to do a rotation right

29:31 here on the screen. It brings up common

29:33 defaults that you'd use. You want your

29:34 new your next keys or signing

29:36 thresholds. We select the TOAD, the

29:38 TOAD = threshold-of-accountable-duplicity

29:43 accountable duplicity of three, which

29:47 makes sense for four witnesses.

29:48 And these are the four witnesses we just

29:49 created. You can add more or remove here

29:51 if you wanted to, but we'll just go

29:52 ahead and rotate them in. And of course

29:54 now it's asking for my one-time passcode

29:56 so I'm going to go over here.

29:58 (I'm very paranoid cuz I'm

30:00 going to wait till it rolls over

30:01 to the next 30 seconds.)

30:03 1:30

30:08 There we go.

30:09 Now I'm going to grab that.

30:10 Paste that in here and do a rotation.

30:17 And we've rotated. Now I have all

30:18 four witnesses rotated into my

30:19 identifier. You can see over

30:21 here on this side. I'm now at sequence

30:22 number 2. I was at sequence number 1.

30:24 All four witnesses gave me

30:26 receipts. There's my threshold. There's

30:27 my new public key. And because this is a

30:29 remote identifier and we know that we're

30:31 given the opportunity to just go ahead

30:32 and upload the new event that you just

30:34 used to rotate in those witnesses into

30:36 your upstream server. So, we'll update

30:37 that. I'm now done with this. You

30:40 see here I've created these four

30:41 witnesses. These are my account

30:43 witnesses. You're now paying for them.

30:45 They're a monthly service, but very

30:47 very cheap. The controller is Alice.

30:49 This is each of the AIDs for those

30:51 witnesses, and these are the regions

30:52 that they're on. So, I now have

30:54 witnesses spread out around the world

30:55 for this identifier. So, someone would

30:57 immediately now have to attack four

30:58 different places around the world to

31:00 eclipse [attack, red.] my witnesses. And that was

31:02 pretty easy, right? I think it was

31:03 pretty easy.

31:04 Thank you.

31:06 [applause]

31:08 And then if we come over here, you can

31:10 see that we have updated to our new

31:13 key state to this remote server

31:15 To our remote SaaS platform, and

31:17 we're now at sequence number 2. If you

31:19 click on this, you can see this is the

31:20 public OOBI I was talking about cuz I

31:22 said "Hey, make this guy public." I

31:23 5 minutes left?

31:25 Oh, man, that went fast.

31:27 I'm not even close to done. All right,

31:29 well all right, let's see if I can do

31:30 this really quick. All right, so let's

31:31 get to watchers really fast.

31:34 And to do that, I'm going to create a

31:35 whole new account. So, let's create Bob.

31:40 Create. Open. Add identifier 'Bob'. Now

31:44 you see how fast this can actually work, right?

31:49 All right. So, I think I

31:53 copied. This is where you get to

31:53 see remote identifiers. I grabbed

31:55 Alice's OOBI, so I'm just going to

32:01 paste her OOBI in here and connect, and

32:04 now I have Alice. So, now I'm connected

32:05 to Alice. I'll go over here. Oh, no, I

32:07 got to create an account ' Bob'

32:10 I 'boob'-ed, oh, jeez, sorry Bob!

32:13 (That was a zero. It wasn't a second O)

32:16 Continue to account access ' Bob'

32:20 Wonderful.

32:22 [laughter]

32:23 – Want to use the healthKERI

32:24 identifier for that?

32:32 [Meanwhile, Phil is typing and speaking out loud]

32:48 These are one-time access codes,

32:49 by the way, if I didn't mention that

32:50 before.

32:51 We're going to grab Bob, paste.

32:55 Paste, continue to invites, no invites.

32:58 Go to identifiers. Let's add Bob an

33:01 identifier. Although, I don't think I

33:02 need to do this, but anyway, you can

33:03 just see how quick this is. And now,

33:05 let's go to the last step, watcher

33:06 network. So, very quickly, I want to

33:07 mention that we initially implemented

33:09 our watcher network the same way we did

33:11 witnesses. You have to rent individual

33:14 watchers and assign them to watch

33:16 people. So, if I wanted to have like

33:17 five watchers watching Sam's AID, I'd

33:19 have to go and get five watchers and

33:20 I'll say watch Sam's ID. That way, it

33:22 was it didn't work well. I talked with

33:24 Sam about it. He said it's no more

33:25 secure giving them VMs inside of our

33:29 infrastructure than if I just created a

33:30 global watcher network. And so, that's

33:32 what we did. We created a global watcher

33:34 network. So, instead of having to worry

33:36 about renting your own watchers and

33:37 assigning them and managing them, we

33:39 just tell you

33:40 tell us an identifier you want to watch.

33:42 We'll distribute it across our global

33:44 watcher network for you at random in

33:45 different locations, and we'll keep an

33:48 eye on it for you. So, that's what we've

33:49 done. So, getting a watched identifier

33:51 is as simple as selecting one of your

33:53 remote identifiers and say watch. He

33:55 immediately pulled the key state for

33:56 that watcher down, and now telling our

33:59 system to go watch that identifier. The

34:01 value of that, of course, is that now I

34:04 can come over here to Alice, and in the

34:06 regular KERI side of the plugin (lock

34:10 that)

34:13 (Hm? 2 minutes? Well, I did that pretty quick then!)

34:15 I'm going to rotate Alice's

34:16 identifier, do a key rotation. (I got to

34:19 get my a one-time passcode.)

34:21 Grab that. 15 seconds should be plenty.

34:24 Rotate. There, I've now rotated. I have

34:27 all four witnesses

34:29 Pulled down for him. And if

34:30 everything works correctly, Bob will now

34:33 get a notice that Alice

34:35 has done an update. This takes a lot

34:37 longer than I wanted it to doing a demo,

34:38 but that's because I have all my numbers

34:39 kind of spun down. There it is, it just

34:41 showed up. Just so I don't burn my CPU

34:43 out. So, I just received a notification.

34:45 This is again the integration of

34:47 notifications into our

34:48 system.

34:50 The notification is available in the

34:51 open source plug-in, and you can

34:52 integrate it anything you want. So,

34:53 whatever you add to the to the health

34:55 KERI if as a plug-in, you can integrate

34:57 into the notification systems to drive

34:59 that as well. Now that I see that I have

35:01 new key state for Alice, we made the

35:03 decision not to automatically pull that

35:05 key state down for you. So, I would just

35:06 go into my watched identifiers. You can

35:09 see that he is now Alice is now out of

35:11 date, and I want to do a sync, and now

35:13 I'm up to date with Alice.

35:15 So, one last thing I'll point out is

35:17 that's all well and good, but I'm

35:19 doing it manually. Where this really

35:21 comes into play is when you're deploying

35:23 servers into enterprise infrastructure,

35:26 and you have a server that has an

35:28 identifier and that is let's say for

35:30 example an OAuth server that's

35:32 validating vLEIs coming in, but needs to

35:34 keep up to date with the key state of

35:36 any of the identifiers that it is now

35:38 interacted with. You can provision it so

35:40 that it can connect through this

35:41 authorization server feature inside of

35:43 our SaaS platform, so that it now has the

35:46 authority to ask our platform to watch

35:48 identifiers on its behalf, and it will

35:50 and I'll talk a lot more about this

35:52 tomorrow. It will then have a side car

35:54 running that is its local watcher that

35:56 integrates with the healthKERI we

35:57 watcher platform to keep up to date on

35:59 key state changes so that anyone that

36:01 you're using towards anyone that is using you

36:03 to authenticate into a system can do a

36:05 key rotation anytime they want and

36:06 automatically get updates.

36:08 I just real quick I'll go to questions I

36:10 guess.

36:15 [applause] Thanks everyone.

36:19 – How diversified is the watcher set

36:23 that you're running? So, right now we're

36:24 in four regions, and the same regions

36:27 that we are in the witness in the

36:28 witness network that are on different

36:29 data centers than the

36:30 witnesses are.

36:31 So, yeah. We have

36:34 I think three servers in each of the

36:35 regions. And we just pick them at random

36:38 when you ask us to watch. We do four

36:40 watchers. So, pick them at random, one

36:42 in each region.

36:43 And that's easy to extend. (I didn't even

36:47 get to how we're deploying the services.)

36:47 No, it was only 40 minutes.

36:49 I know. I realized that when you told me

36:51 I had 5 minutes left.

36:52 [laughter]

36:57 All right, great. Thanks, everyone.

36:58 Dismissed. [applause]