Skip to content

Commit 3ac343e

Browse files
authored
feat(cli): add support for did:jwk and did:peer to CLI (#1320)
1 parent 165de35 commit 3ac343e

File tree

8 files changed

+173
-56
lines changed

8 files changed

+173
-56
lines changed

packages/cli/default/default.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ didResolver:
168168
$ref: /did-key-resolver
169169
peer:
170170
$require: '@veramo/did-provider-peer?t=function&p=/peer#getResolver'
171+
jwk:
172+
$require: '@veramo/did-provider-jwk?t=function&p=/jwk#getDidJwkResolver'
171173
pkh:
172174
$require: '@veramo/did-provider-pkh?t=function&p=/pkh#getDidPkhResolver'
173175
elem:
@@ -248,6 +250,14 @@ didManager:
248250
$require: '@veramo/did-provider-key#KeyDIDProvider'
249251
$args:
250252
- defaultKms: local
253+
did:jwk:
254+
$require: '@veramo/did-provider-jwk#JwkDIDProvider'
255+
$args:
256+
- defaultKms: local
257+
did:peer:
258+
$require: '@veramo/did-provider-peer#PeerDIDProvider'
259+
$args:
260+
- defaultKms: local
251261
did:pkh:
252262
$require: '@veramo/did-provider-pkh#PkhDIDProvider'
253263
$args:

packages/cli/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
"@veramo/did-manager": "workspace:^",
5151
"@veramo/did-provider-ethr": "workspace:^",
5252
"@veramo/did-provider-key": "workspace:^",
53+
"@veramo/did-provider-jwk": "workspace:^",
5354
"@veramo/did-provider-peer": "workspace:^",
5455
"@veramo/did-provider-pkh": "workspace:^",
5556
"@veramo/did-provider-web": "workspace:^",
@@ -61,11 +62,9 @@
6162
"@veramo/message-handler": "workspace:^",
6263
"@veramo/remote-client": "workspace:^",
6364
"@veramo/remote-server": "workspace:^",
64-
"@veramo/kv-store": "workspace:^",
6565
"@veramo/selective-disclosure": "workspace:^",
6666
"@veramo/url-handler": "workspace:^",
6767
"@veramo/utils": "workspace:^",
68-
"@veramo/mediation-manager": "workspace:^",
6968
"blessed": "^0.1.81",
7069
"commander": "^11.0.0",
7170
"console-table-printer": "^2.11.2",

packages/cli/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
{ "path": "../did-jwt" },
1717
{ "path": "../did-manager" },
1818
{ "path": "../did-provider-ethr" },
19+
{ "path": "../did-provider-jwk" },
1920
{ "path": "../did-provider-key" },
2021
{ "path": "../did-provider-peer" },
2122
{ "path": "../did-provider-pkh" },

packages/did-provider-jwk/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"@veramo/core": "workspace:*",
2323
"@veramo/key-manager": "workspace:*",
2424
"@veramo/kms-local": "workspace:*",
25+
"@veramo/did-resolver": "workspace:*",
2526
"typescript": "5.2.2"
2627
},
2728
"repository": {
Lines changed: 148 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
import { JwkDIDProvider } from '../jwk-did-provider'
2-
import { IDIDManager, IKeyManager } from "@veramo/core-types";
2+
import { getDidJwkResolver } from '../resolver'
3+
import { IDIDManager, IKeyManager, IResolver } from '@veramo/core-types'
34
import { createAgent } from '@veramo/core'
4-
import { MemoryKeyStore, MemoryPrivateKeyStore, KeyManager } from '@veramo/key-manager'
5+
import { KeyManager, MemoryKeyStore, MemoryPrivateKeyStore } from '@veramo/key-manager'
56
import { KeyManagementSystem } from '@veramo/kms-local'
6-
import { DIDManager, MemoryDIDStore } from "@veramo/did-manager";
7+
import { DIDManager, MemoryDIDStore } from '@veramo/did-manager'
8+
import { DIDResolverPlugin } from '@veramo/did-resolver'
79

810
const defaultKms = 'memory'
9-
const ionDIDProvider = new JwkDIDProvider({ defaultKms })
11+
const jwkDIDProvider = new JwkDIDProvider({ defaultKms })
1012

11-
const agent = createAgent<IKeyManager & IDIDManager>({
13+
const agent = createAgent<IKeyManager & IDIDManager & IResolver>({
1214
plugins: [
1315
new KeyManager({
1416
store: new MemoryKeyStore(),
@@ -18,51 +20,179 @@ const agent = createAgent<IKeyManager & IDIDManager>({
1820
}),
1921
new DIDManager({
2022
providers: {
21-
'did:jwk': ionDIDProvider,
23+
'did:jwk': jwkDIDProvider,
2224
},
2325
defaultProvider: 'did:jwk',
2426
store: new MemoryDIDStore(),
2527
}),
28+
new DIDResolverPlugin({
29+
...getDidJwkResolver(),
30+
}),
2631
],
2732
})
2833
describe('create did:jwk', () => {
2934
it('Secp256k1', async () => {
3035
const id = await agent.didManagerCreate({
3136
options: {
3237
keyType: 'Secp256k1',
33-
privateKeyHex: 'a5e81a8cd50cf5c31d5b87db3e153e2817f86de350a60edc2335f76d5c3b4e0d'
34-
}
38+
privateKeyHex: 'a5e81a8cd50cf5c31d5b87db3e153e2817f86de350a60edc2335f76d5c3b4e0d',
39+
},
3540
})
36-
expect(id.did).toEqual('did:jwk:eyJhbGciOiJFUzI1NksiLCJjcnYiOiJzZWNwMjU2azEiLCJrdHkiOiJFQyIsInVzZSI6InNpZyIsIngiOiJVNV85NlJMQWxMeEl0a3llNXhzcnJzNGt4eEM4clN4N3JNN1dGZllLNVRrIiwieSI6IlNjM0pVM25yVUZWdEVjc0stckRscHNxTXRIWFVFN0x4SXdmTUxYOVVPTjQifQ')
41+
expect(id.did).toEqual(
42+
'did:jwk:eyJhbGciOiJFUzI1NksiLCJjcnYiOiJzZWNwMjU2azEiLCJrdHkiOiJFQyIsInVzZSI6InNpZyIsIngiOiJVNV85NlJMQWxMeEl0a3llNXhzcnJzNGt4eEM4clN4N3JNN1dGZllLNVRrIiwieSI6IlNjM0pVM25yVUZWdEVjc0stckRscHNxTXRIWFVFN0x4SXdmTUxYOVVPTjQifQ',
43+
)
3744
})
3845

3946
it('Ed25519', async () => {
4047
const id = await agent.didManagerCreate({
4148
options: {
4249
keyType: 'Ed25519',
43-
privateKeyHex: 'a5e81a8cd50cf5c31d5b87db3e153e2817f86de350a60edc2335f76d5c3b4e0d'
44-
}
50+
privateKeyHex: 'a5e81a8cd50cf5c31d5b87db3e153e2817f86de350a60edc2335f76d5c3b4e0d',
51+
},
4552
})
46-
expect(id.did).toEqual('did:jwk:eyJhbGciOiJFZERTQSIsImNydiI6IkVkMjU1MTkiLCJrdHkiOiJPS1AiLCJ1c2UiOiJzaWciLCJ4IjoiTTNodVJCZnJpU3lHemlJS3pUSE5nS1djSVhuX3IxUzYxRnZBcUQyVmhSUSJ9')
53+
expect(id.did).toEqual(
54+
'did:jwk:eyJhbGciOiJFZERTQSIsImNydiI6IkVkMjU1MTkiLCJrdHkiOiJPS1AiLCJ1c2UiOiJzaWciLCJ4IjoiTTNodVJCZnJpU3lHemlJS3pUSE5nS1djSVhuX3IxUzYxRnZBcUQyVmhSUSJ9',
55+
)
4756
})
4857

4958
it('X25519', async () => {
5059
const id = await agent.didManagerCreate({
5160
options: {
5261
keyType: 'X25519',
53-
privateKeyHex: 'a5e81a8cd50cf5c31d5b87db3e153e2817f86de350a60edc2335f76d5c3b4e0d'
54-
}
62+
privateKeyHex: 'a5e81a8cd50cf5c31d5b87db3e153e2817f86de350a60edc2335f76d5c3b4e0d',
63+
},
5564
})
56-
expect(id.did).toEqual('did:jwk:eyJhbGciOiJFQ0RILUVTIiwiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwidXNlIjoiZW5jIiwieCI6IlVuNFNEWk12R2dReENiZkRBOWpwNjlyNDdvVWdsSF93eU1aRjU2THAwbU0ifQ')
65+
expect(id.did).toEqual(
66+
'did:jwk:eyJhbGciOiJFQ0RILUVTIiwiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwidXNlIjoiZW5jIiwieCI6IlVuNFNEWk12R2dReENiZkRBOWpwNjlyNDdvVWdsSF93eU1aRjU2THAwbU0ifQ',
67+
)
5768
})
5869

5970
it('Secp256r1', async () => {
6071
const id = await agent.didManagerCreate({
6172
options: {
6273
keyType: 'Secp256r1',
63-
privateKeyHex: 'a5e81a8cd50cf5c31d5b87db3e153e2817f86de350a60edc2335f76d5c3b4e0d'
64-
}
74+
privateKeyHex: 'a5e81a8cd50cf5c31d5b87db3e153e2817f86de350a60edc2335f76d5c3b4e0d',
75+
},
76+
})
77+
expect(id.did).toEqual(
78+
'did:jwk:eyJhbGciOiJFUzI1NiIsImNydiI6IlAtMjU2Iiwia3R5IjoiRUMiLCJ1c2UiOiJzaWciLCJ4IjoiejhTTlNYTVgxUjZlVEt6SkdtLUE3ZWpBZkZsdURsaUhKdW9nT2FQc0REUSIsInkiOiJLUUtBTWVwTU56dHJseTB6ODI3MTg0dDRQdkFuU0lULW1MMFFsaUg1enU0In0',
79+
)
80+
})
81+
})
82+
83+
describe('resolve did:jwk', () => {
84+
it('should resolve Secp256k1', async () => {
85+
const did =
86+
'did:jwk:eyJhbGciOiJFUzI1NksiLCJjcnYiOiJzZWNwMjU2azEiLCJrdHkiOiJFQyIsInVzZSI6InNpZyIsIngiOiJVNV85NlJMQWxMeEl0a3llNXhzcnJzNGt4eEM4clN4N3JNN1dGZllLNVRrIiwieSI6IlNjM0pVM25yVUZWdEVjc0stckRscHNxTXRIWFVFN0x4SXdmTUxYOVVPTjQifQ'
87+
const result = await agent.resolveDid({ didUrl: did })
88+
89+
expect(result.didDocument).toEqual({
90+
id: did,
91+
'@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1'],
92+
verificationMethod: [
93+
{
94+
id: `${did}#0`,
95+
type: 'JsonWebKey2020',
96+
controller: did,
97+
publicKeyJwk: {
98+
alg: 'ES256K',
99+
crv: 'secp256k1',
100+
kty: 'EC',
101+
use: 'sig',
102+
x: 'U5_96RLAlLxItkye5xsrrs4kxxC8rSx7rM7WFfYK5Tk',
103+
y: 'Sc3JU3nrUFVtEcsK-rDlpsqMtHXUE7LxIwfMLX9UON4',
104+
},
105+
},
106+
],
107+
assertionMethod: [`${did}#0`],
108+
authentication: [`${did}#0`],
109+
capabilityInvocation: [`${did}#0`],
110+
capabilityDelegation: [`${did}#0`],
111+
})
112+
})
113+
114+
it('should resolve P-256', async () => {
115+
const did =
116+
'did:jwk:eyJhbGciOiJFUzI1NiIsImNydiI6IlAtMjU2Iiwia3R5IjoiRUMiLCJ1c2UiOiJzaWciLCJ4IjoiejhTTlNYTVgxUjZlVEt6SkdtLUE3ZWpBZkZsdURsaUhKdW9nT2FQc0REUSIsInkiOiJLUUtBTWVwTU56dHJseTB6ODI3MTg0dDRQdkFuU0lULW1MMFFsaUg1enU0In0'
117+
const result = await agent.resolveDid({ didUrl: did })
118+
119+
expect(result.didDocument).toEqual({
120+
id: did,
121+
'@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1'],
122+
verificationMethod: [
123+
{
124+
id: `${did}#0`,
125+
type: 'JsonWebKey2020',
126+
controller: did,
127+
publicKeyJwk: {
128+
alg: 'ES256',
129+
crv: 'P-256',
130+
kty: 'EC',
131+
use: 'sig',
132+
x: 'z8SNSXMX1R6eTKzJGm-A7ejAfFluDliHJuogOaPsDDQ',
133+
y: 'KQKAMepMNztrly0z827184t4PvAnSIT-mL0QliH5zu4',
134+
},
135+
},
136+
],
137+
assertionMethod: [`${did}#0`],
138+
authentication: [`${did}#0`],
139+
capabilityInvocation: [`${did}#0`],
140+
capabilityDelegation: [`${did}#0`],
141+
})
142+
})
143+
144+
it('should resolve Ed25519', async () => {
145+
const did =
146+
'did:jwk:eyJhbGciOiJFZERTQSIsImNydiI6IkVkMjU1MTkiLCJrdHkiOiJPS1AiLCJ1c2UiOiJzaWciLCJ4IjoiTTNodVJCZnJpU3lHemlJS3pUSE5nS1djSVhuX3IxUzYxRnZBcUQyVmhSUSJ9'
147+
const result = await agent.resolveDid({ didUrl: did })
148+
149+
expect(result.didDocument).toEqual({
150+
id: did,
151+
'@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1'],
152+
verificationMethod: [
153+
{
154+
id: `${did}#0`,
155+
type: 'JsonWebKey2020',
156+
controller: did,
157+
publicKeyJwk: {
158+
alg: 'EdDSA',
159+
crv: 'Ed25519',
160+
kty: 'OKP',
161+
use: 'sig',
162+
x: 'M3huRBfriSyGziIKzTHNgKWcIXn_r1S61FvAqD2VhRQ',
163+
},
164+
},
165+
],
166+
assertionMethod: [`${did}#0`],
167+
authentication: [`${did}#0`],
168+
capabilityInvocation: [`${did}#0`],
169+
capabilityDelegation: [`${did}#0`],
170+
})
171+
})
172+
173+
it('should resolve X25519', async () => {
174+
const did =
175+
'did:jwk:eyJhbGciOiJFQ0RILUVTIiwiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwidXNlIjoiZW5jIiwieCI6IlVuNFNEWk12R2dReENiZkRBOWpwNjlyNDdvVWdsSF93eU1aRjU2THAwbU0ifQ'
176+
const result = await agent.resolveDid({ didUrl: did })
177+
178+
expect(result.didDocument).toEqual({
179+
id: did,
180+
'@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1'],
181+
verificationMethod: [
182+
{
183+
id: `${did}#0`,
184+
type: 'JsonWebKey2020',
185+
controller: did,
186+
publicKeyJwk: {
187+
alg: 'ECDH-ES',
188+
crv: 'X25519',
189+
kty: 'OKP',
190+
use: 'enc',
191+
x: 'Un4SDZMvGgQxCbfDA9jp69r47oUglH_wyMZF56Lp0mM',
192+
},
193+
},
194+
],
195+
keyAgreement: [`${did}#0`],
65196
})
66-
expect(id.did).toEqual('did:jwk:eyJhbGciOiJFUzI1NiIsImNydiI6IlAtMjU2Iiwia3R5IjoiRUMiLCJ1c2UiOiJzaWciLCJ4IjoiejhTTlNYTVgxUjZlVEt6SkdtLUE3ZWpBZkZsdURsaUhKdW9nT2FQc0REUSIsInkiOiJLUUtBTWVwTU56dHJseTB6ODI3MTg0dDRQdkFuU0lULW1MMFFsaUg1enU0In0')
67197
})
68198
})

packages/did-provider-jwk/tsconfig.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
{
1717
"path": "../did-manager"
1818
},
19+
{
20+
"path": "../did-resolver"
21+
},
1922
{
2023
"path": "../key-manager"
2124
},

packages/did-provider-peer/src/peer-did-provider.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,10 @@ export class PeerDIDProvider extends AbstractIdentifierProvider {
3838
}
3939

4040
async createIdentifier(
41-
{ kms, options }: { kms?: string; options?: any },
41+
{ kms, options = { num_algo: 0 } }: { kms?: string; options?: { num_algo: number; service?: any } },
4242
context: IContext,
4343
): Promise<Omit<IIdentifier, 'provider'>> {
44+
options.num_algo = options?.num_algo ?? 0
4445
if (options.num_algo == 0) {
4546
const key = await context.agent.keyManagerCreate({ kms: kms || this.defaultKms, type: 'Ed25519' })
4647
const methodSpecificId = bytesToMultibase(hexToBytes(key.publicKeyHex), 'base58btc', 'ed25519-pub')

pnpm-lock.yaml

Lines changed: 7 additions & 35 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)