From 8689e0b205e908db62857a894722552764ec59b4 Mon Sep 17 00:00:00 2001 From: Mircea Nistor Date: Fri, 19 Jan 2024 16:50:07 +0100 Subject: [PATCH] feat(cli): add support for did:jwk and did:peer to CLI --- packages/cli/default/default.yml | 10 ++ packages/cli/package.json | 3 +- packages/cli/tsconfig.json | 1 + packages/did-provider-jwk/package.json | 1 + .../src/__tests__/jwk.test.ts | 166 ++++++++++++++++-- packages/did-provider-jwk/tsconfig.json | 3 + .../src/peer-did-provider.ts | 3 +- pnpm-lock.yaml | 42 +---- 8 files changed, 173 insertions(+), 56 deletions(-) diff --git a/packages/cli/default/default.yml b/packages/cli/default/default.yml index 850d58f64..73f462dac 100644 --- a/packages/cli/default/default.yml +++ b/packages/cli/default/default.yml @@ -168,6 +168,8 @@ didResolver: $ref: /did-key-resolver peer: $require: '@veramo/did-provider-peer?t=function&p=/peer#getResolver' + jwk: + $require: '@veramo/did-provider-jwk?t=function&p=/jwk#getDidJwkResolver' pkh: $require: '@veramo/did-provider-pkh?t=function&p=/pkh#getDidPkhResolver' elem: @@ -248,6 +250,14 @@ didManager: $require: '@veramo/did-provider-key#KeyDIDProvider' $args: - defaultKms: local + did:jwk: + $require: '@veramo/did-provider-jwk#JwkDIDProvider' + $args: + - defaultKms: local + did:peer: + $require: '@veramo/did-provider-peer#PeerDIDProvider' + $args: + - defaultKms: local did:pkh: $require: '@veramo/did-provider-pkh#PkhDIDProvider' $args: diff --git a/packages/cli/package.json b/packages/cli/package.json index 924b9f608..dc6ef3ad3 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -50,6 +50,7 @@ "@veramo/did-manager": "workspace:^", "@veramo/did-provider-ethr": "workspace:^", "@veramo/did-provider-key": "workspace:^", + "@veramo/did-provider-jwk": "workspace:^", "@veramo/did-provider-peer": "workspace:^", "@veramo/did-provider-pkh": "workspace:^", "@veramo/did-provider-web": "workspace:^", @@ -61,11 +62,9 @@ "@veramo/message-handler": "workspace:^", "@veramo/remote-client": "workspace:^", "@veramo/remote-server": "workspace:^", - "@veramo/kv-store": "workspace:^", "@veramo/selective-disclosure": "workspace:^", "@veramo/url-handler": "workspace:^", "@veramo/utils": "workspace:^", - "@veramo/mediation-manager": "workspace:^", "blessed": "^0.1.81", "commander": "^11.0.0", "console-table-printer": "^2.11.2", diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json index 67186ff98..b05471109 100644 --- a/packages/cli/tsconfig.json +++ b/packages/cli/tsconfig.json @@ -16,6 +16,7 @@ { "path": "../did-jwt" }, { "path": "../did-manager" }, { "path": "../did-provider-ethr" }, + { "path": "../did-provider-jwk" }, { "path": "../did-provider-key" }, { "path": "../did-provider-peer" }, { "path": "../did-provider-pkh" }, diff --git a/packages/did-provider-jwk/package.json b/packages/did-provider-jwk/package.json index 4ba15a0e4..15163eff0 100644 --- a/packages/did-provider-jwk/package.json +++ b/packages/did-provider-jwk/package.json @@ -22,6 +22,7 @@ "@veramo/core": "workspace:*", "@veramo/key-manager": "workspace:*", "@veramo/kms-local": "workspace:*", + "@veramo/did-resolver": "workspace:*", "typescript": "5.2.2" }, "repository": { diff --git a/packages/did-provider-jwk/src/__tests__/jwk.test.ts b/packages/did-provider-jwk/src/__tests__/jwk.test.ts index bd46f8dcf..d24b3290b 100644 --- a/packages/did-provider-jwk/src/__tests__/jwk.test.ts +++ b/packages/did-provider-jwk/src/__tests__/jwk.test.ts @@ -1,14 +1,16 @@ import { JwkDIDProvider } from '../jwk-did-provider' -import { IDIDManager, IKeyManager } from "@veramo/core-types"; +import { getDidJwkResolver } from '../resolver' +import { IDIDManager, IKeyManager, IResolver } from '@veramo/core-types' import { createAgent } from '@veramo/core' -import { MemoryKeyStore, MemoryPrivateKeyStore, KeyManager } from '@veramo/key-manager' +import { KeyManager, MemoryKeyStore, MemoryPrivateKeyStore } from '@veramo/key-manager' import { KeyManagementSystem } from '@veramo/kms-local' -import { DIDManager, MemoryDIDStore } from "@veramo/did-manager"; +import { DIDManager, MemoryDIDStore } from '@veramo/did-manager' +import { DIDResolverPlugin } from '@veramo/did-resolver' const defaultKms = 'memory' -const ionDIDProvider = new JwkDIDProvider({ defaultKms }) +const jwkDIDProvider = new JwkDIDProvider({ defaultKms }) -const agent = createAgent({ +const agent = createAgent({ plugins: [ new KeyManager({ store: new MemoryKeyStore(), @@ -18,11 +20,14 @@ const agent = createAgent({ }), new DIDManager({ providers: { - 'did:jwk': ionDIDProvider, + 'did:jwk': jwkDIDProvider, }, defaultProvider: 'did:jwk', store: new MemoryDIDStore(), }), + new DIDResolverPlugin({ + ...getDidJwkResolver(), + }), ], }) describe('create did:jwk', () => { @@ -30,39 +35,164 @@ describe('create did:jwk', () => { const id = await agent.didManagerCreate({ options: { keyType: 'Secp256k1', - privateKeyHex: 'a5e81a8cd50cf5c31d5b87db3e153e2817f86de350a60edc2335f76d5c3b4e0d' - } + privateKeyHex: 'a5e81a8cd50cf5c31d5b87db3e153e2817f86de350a60edc2335f76d5c3b4e0d', + }, }) - expect(id.did).toEqual('did:jwk:eyJhbGciOiJFUzI1NksiLCJjcnYiOiJzZWNwMjU2azEiLCJrdHkiOiJFQyIsInVzZSI6InNpZyIsIngiOiJVNV85NlJMQWxMeEl0a3llNXhzcnJzNGt4eEM4clN4N3JNN1dGZllLNVRrIiwieSI6IlNjM0pVM25yVUZWdEVjc0stckRscHNxTXRIWFVFN0x4SXdmTUxYOVVPTjQifQ') + expect(id.did).toEqual( + 'did:jwk:eyJhbGciOiJFUzI1NksiLCJjcnYiOiJzZWNwMjU2azEiLCJrdHkiOiJFQyIsInVzZSI6InNpZyIsIngiOiJVNV85NlJMQWxMeEl0a3llNXhzcnJzNGt4eEM4clN4N3JNN1dGZllLNVRrIiwieSI6IlNjM0pVM25yVUZWdEVjc0stckRscHNxTXRIWFVFN0x4SXdmTUxYOVVPTjQifQ', + ) }) it('Ed25519', async () => { const id = await agent.didManagerCreate({ options: { keyType: 'Ed25519', - privateKeyHex: 'a5e81a8cd50cf5c31d5b87db3e153e2817f86de350a60edc2335f76d5c3b4e0d' - } + privateKeyHex: 'a5e81a8cd50cf5c31d5b87db3e153e2817f86de350a60edc2335f76d5c3b4e0d', + }, }) - expect(id.did).toEqual('did:jwk:eyJhbGciOiJFZERTQSIsImNydiI6IkVkMjU1MTkiLCJrdHkiOiJPS1AiLCJ1c2UiOiJzaWciLCJ4IjoiTTNodVJCZnJpU3lHemlJS3pUSE5nS1djSVhuX3IxUzYxRnZBcUQyVmhSUSJ9') + expect(id.did).toEqual( + 'did:jwk:eyJhbGciOiJFZERTQSIsImNydiI6IkVkMjU1MTkiLCJrdHkiOiJPS1AiLCJ1c2UiOiJzaWciLCJ4IjoiTTNodVJCZnJpU3lHemlJS3pUSE5nS1djSVhuX3IxUzYxRnZBcUQyVmhSUSJ9', + ) }) it('X25519', async () => { const id = await agent.didManagerCreate({ options: { keyType: 'X25519', - privateKeyHex: 'a5e81a8cd50cf5c31d5b87db3e153e2817f86de350a60edc2335f76d5c3b4e0d' - } + privateKeyHex: 'a5e81a8cd50cf5c31d5b87db3e153e2817f86de350a60edc2335f76d5c3b4e0d', + }, }) - expect(id.did).toEqual('did:jwk:eyJhbGciOiJFQ0RILUVTIiwiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwidXNlIjoiZW5jIiwieCI6IlVuNFNEWk12R2dReENiZkRBOWpwNjlyNDdvVWdsSF93eU1aRjU2THAwbU0ifQ') + expect(id.did).toEqual( + 'did:jwk:eyJhbGciOiJFQ0RILUVTIiwiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwidXNlIjoiZW5jIiwieCI6IlVuNFNEWk12R2dReENiZkRBOWpwNjlyNDdvVWdsSF93eU1aRjU2THAwbU0ifQ', + ) }) it('Secp256r1', async () => { const id = await agent.didManagerCreate({ options: { keyType: 'Secp256r1', - privateKeyHex: 'a5e81a8cd50cf5c31d5b87db3e153e2817f86de350a60edc2335f76d5c3b4e0d' - } + privateKeyHex: 'a5e81a8cd50cf5c31d5b87db3e153e2817f86de350a60edc2335f76d5c3b4e0d', + }, + }) + expect(id.did).toEqual( + 'did:jwk:eyJhbGciOiJFUzI1NiIsImNydiI6IlAtMjU2Iiwia3R5IjoiRUMiLCJ1c2UiOiJzaWciLCJ4IjoiejhTTlNYTVgxUjZlVEt6SkdtLUE3ZWpBZkZsdURsaUhKdW9nT2FQc0REUSIsInkiOiJLUUtBTWVwTU56dHJseTB6ODI3MTg0dDRQdkFuU0lULW1MMFFsaUg1enU0In0', + ) + }) +}) + +describe('resolve did:jwk', () => { + it('should resolve Secp256k1', async () => { + const did = + 'did:jwk:eyJhbGciOiJFUzI1NksiLCJjcnYiOiJzZWNwMjU2azEiLCJrdHkiOiJFQyIsInVzZSI6InNpZyIsIngiOiJVNV85NlJMQWxMeEl0a3llNXhzcnJzNGt4eEM4clN4N3JNN1dGZllLNVRrIiwieSI6IlNjM0pVM25yVUZWdEVjc0stckRscHNxTXRIWFVFN0x4SXdmTUxYOVVPTjQifQ' + const result = await agent.resolveDid({ didUrl: did }) + + expect(result.didDocument).toEqual({ + id: did, + '@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1'], + verificationMethod: [ + { + id: `${did}#0`, + type: 'JsonWebKey2020', + controller: did, + publicKeyJwk: { + alg: 'ES256K', + crv: 'secp256k1', + kty: 'EC', + use: 'sig', + x: 'U5_96RLAlLxItkye5xsrrs4kxxC8rSx7rM7WFfYK5Tk', + y: 'Sc3JU3nrUFVtEcsK-rDlpsqMtHXUE7LxIwfMLX9UON4', + }, + }, + ], + assertionMethod: [`${did}#0`], + authentication: [`${did}#0`], + capabilityInvocation: [`${did}#0`], + capabilityDelegation: [`${did}#0`], + }) + }) + + it('should resolve P-256', async () => { + const did = + 'did:jwk:eyJhbGciOiJFUzI1NiIsImNydiI6IlAtMjU2Iiwia3R5IjoiRUMiLCJ1c2UiOiJzaWciLCJ4IjoiejhTTlNYTVgxUjZlVEt6SkdtLUE3ZWpBZkZsdURsaUhKdW9nT2FQc0REUSIsInkiOiJLUUtBTWVwTU56dHJseTB6ODI3MTg0dDRQdkFuU0lULW1MMFFsaUg1enU0In0' + const result = await agent.resolveDid({ didUrl: did }) + + expect(result.didDocument).toEqual({ + id: did, + '@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1'], + verificationMethod: [ + { + id: `${did}#0`, + type: 'JsonWebKey2020', + controller: did, + publicKeyJwk: { + alg: 'ES256', + crv: 'P-256', + kty: 'EC', + use: 'sig', + x: 'z8SNSXMX1R6eTKzJGm-A7ejAfFluDliHJuogOaPsDDQ', + y: 'KQKAMepMNztrly0z827184t4PvAnSIT-mL0QliH5zu4', + }, + }, + ], + assertionMethod: [`${did}#0`], + authentication: [`${did}#0`], + capabilityInvocation: [`${did}#0`], + capabilityDelegation: [`${did}#0`], + }) + }) + + it('should resolve Ed25519', async () => { + const did = + 'did:jwk:eyJhbGciOiJFZERTQSIsImNydiI6IkVkMjU1MTkiLCJrdHkiOiJPS1AiLCJ1c2UiOiJzaWciLCJ4IjoiTTNodVJCZnJpU3lHemlJS3pUSE5nS1djSVhuX3IxUzYxRnZBcUQyVmhSUSJ9' + const result = await agent.resolveDid({ didUrl: did }) + + expect(result.didDocument).toEqual({ + id: did, + '@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1'], + verificationMethod: [ + { + id: `${did}#0`, + type: 'JsonWebKey2020', + controller: did, + publicKeyJwk: { + alg: 'EdDSA', + crv: 'Ed25519', + kty: 'OKP', + use: 'sig', + x: 'M3huRBfriSyGziIKzTHNgKWcIXn_r1S61FvAqD2VhRQ', + }, + }, + ], + assertionMethod: [`${did}#0`], + authentication: [`${did}#0`], + capabilityInvocation: [`${did}#0`], + capabilityDelegation: [`${did}#0`], + }) + }) + + it('should resolve X25519', async () => { + const did = + 'did:jwk:eyJhbGciOiJFQ0RILUVTIiwiY3J2IjoiWDI1NTE5Iiwia3R5IjoiT0tQIiwidXNlIjoiZW5jIiwieCI6IlVuNFNEWk12R2dReENiZkRBOWpwNjlyNDdvVWdsSF93eU1aRjU2THAwbU0ifQ' + const result = await agent.resolveDid({ didUrl: did }) + + expect(result.didDocument).toEqual({ + id: did, + '@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1'], + verificationMethod: [ + { + id: `${did}#0`, + type: 'JsonWebKey2020', + controller: did, + publicKeyJwk: { + alg: 'ECDH-ES', + crv: 'X25519', + kty: 'OKP', + use: 'enc', + x: 'Un4SDZMvGgQxCbfDA9jp69r47oUglH_wyMZF56Lp0mM', + }, + }, + ], + keyAgreement: [`${did}#0`], }) - expect(id.did).toEqual('did:jwk:eyJhbGciOiJFUzI1NiIsImNydiI6IlAtMjU2Iiwia3R5IjoiRUMiLCJ1c2UiOiJzaWciLCJ4IjoiejhTTlNYTVgxUjZlVEt6SkdtLUE3ZWpBZkZsdURsaUhKdW9nT2FQc0REUSIsInkiOiJLUUtBTWVwTU56dHJseTB6ODI3MTg0dDRQdkFuU0lULW1MMFFsaUg1enU0In0') }) }) diff --git a/packages/did-provider-jwk/tsconfig.json b/packages/did-provider-jwk/tsconfig.json index b6209e799..5a4fe826d 100644 --- a/packages/did-provider-jwk/tsconfig.json +++ b/packages/did-provider-jwk/tsconfig.json @@ -16,6 +16,9 @@ { "path": "../did-manager" }, + { + "path": "../did-resolver" + }, { "path": "../key-manager" }, diff --git a/packages/did-provider-peer/src/peer-did-provider.ts b/packages/did-provider-peer/src/peer-did-provider.ts index c59ad16fc..1aa1f7dcb 100644 --- a/packages/did-provider-peer/src/peer-did-provider.ts +++ b/packages/did-provider-peer/src/peer-did-provider.ts @@ -38,9 +38,10 @@ export class PeerDIDProvider extends AbstractIdentifierProvider { } async createIdentifier( - { kms, options }: { kms?: string; options?: any }, + { kms, options = { num_algo: 0 } }: { kms?: string; options?: { num_algo: number; service?: any } }, context: IContext, ): Promise> { + options.num_algo = options?.num_algo ?? 0 if (options.num_algo == 0) { const key = await context.agent.keyManagerCreate({ kms: kms || this.defaultKms, type: 'Ed25519' }) const methodSpecificId = bytesToMultibase(hexToBytes(key.publicKeyHex), 'base58btc', 'ed25519-pub') diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b85deaa3..3b1716769 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -122,7 +122,7 @@ importers: version: 22.0.0 ts-jest: specifier: 29.1.1 - version: 29.1.1(@babel/core@7.22.9)(jest@29.7.0)(typescript@5.2.2) + version: 29.1.1(@babel/core@7.23.6)(babel-jest@29.7.0)(jest@29.7.0)(typescript@5.2.2) ts-json-schema-generator: specifier: 1.3.0 version: 1.3.0 @@ -195,6 +195,9 @@ importers: '@veramo/did-provider-ethr': specifier: workspace:^ version: link:../did-provider-ethr + '@veramo/did-provider-jwk': + specifier: workspace:^ + version: link:../did-provider-jwk '@veramo/did-provider-key': specifier: workspace:^ version: link:../did-provider-key @@ -881,6 +884,9 @@ importers: '@veramo/core': specifier: workspace:* version: link:../core + '@veramo/did-resolver': + specifier: workspace:* + version: link:../did-resolver '@veramo/key-manager': specifier: workspace:* version: link:../key-manager @@ -26454,40 +26460,6 @@ packages: dev: false optional: true - /ts-jest@29.1.1(@babel/core@7.22.9)(jest@29.7.0)(typescript@5.2.2): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - '@babel/core': 7.22.9 - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.8.2)(ts-node@10.9.1) - jest-util: 29.6.2 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.2.2 - yargs-parser: 21.1.1 - dev: true - /ts-jest@29.1.1(@babel/core@7.23.6)(babel-jest@29.7.0)(jest@29.7.0)(typescript@5.2.2): resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}