import { mock } from 'jest-mock-extended'; import { DidDocumentResolver } from '../../../src/resolvers/didDocumentResolver.js'; import { DidPublicKeyResolver } from '../../../src/resolvers/didPublicKeyResolver.js'; import { DIDDocument } from '../../../src/resolvers/didDocument.dto.js'; import ResolvedValue = jest.ResolvedValue; describe('PublicKeyResolver should', () => { it('resolve a publicKey for a did:web', async () => { const kid = 'did:web:trust.validatedid.com#key-0'; const did = 'did:web:trust.validatedid.com'; const didDocumentResolver = mock(); const didKeyResolver = new DidPublicKeyResolver(didDocumentResolver); const expectedPublicKey = { kty: 'EC', x: 'gjuALBMqgSNT-Y0WotbN06wZ49DoSyLrzGMUmNL88ZU', y: 'aTV0B0dcuWQz-EBAH9mT-SP3LWvVvp2bk-s4DbuwlEw', crv: 'P-256', }; didDocumentResolver.resolveDid.mockResolvedValue({ '@context': [ 'https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1', ], id: 'did:web:trust.validatedid.com', verificationMethod: [ { id: 'did:web:trust.validatedid.com#key-0', type: 'JsonWebKey2020', controller: 'did:web:trust.validatedid.com', publicKeyJwk: { kty: 'EC', x: 'gjuALBMqgSNT-Y0WotbN06wZ49DoSyLrzGMUmNL88ZU', y: 'aTV0B0dcuWQz-EBAH9mT-SP3LWvVvp2bk-s4DbuwlEw', crv: 'P-256', }, }, ], authentication: ['did:web:trust.validatedid.com#key-0'], assertionMethod: ['did:web:trust.validatedid.com#key-0'], keyAgreement: ['did:web:trust.validatedid.com#key-0'], } as ResolvedValue); const publicKey = await didKeyResolver.getPublicKeyJwk(kid); expect(didDocumentResolver.resolveDid).toHaveBeenCalledWith(did, undefined); expect(publicKey).toEqual(expectedPublicKey); }); it('resolve a publicKey for a did:ebsi', async () => { const kid = 'did:ebsi:zj46t2gXPgmdriraZG6mb5A#awSc2nG7WGNGw9YDtnVZ5HPOjeIhC8eb8UDOr3QV1Fc'; const did = 'did:ebsi:zj46t2gXPgmdriraZG6mb5A'; const didDocumentResolver = mock(); const didKeyResolver = new DidPublicKeyResolver(didDocumentResolver); const expectedPublicKey = { kty: 'EC', crv: 'P-256', x: 'mDX7h2ZIOL1993wj4H83_jg67d_TaYk3dvVL447rRC0', y: 'Lr-efgLN1QPv-rb2sk-4gv7cVwXpzTY6FE8kdNHUUwU', }; didDocumentResolver.resolveDid.mockResolvedValue({ '@context': [ 'https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1', ], id: 'did:ebsi:zj46t2gXPgmdriraZG6mb5A', controller: ['did:ebsi:zj46t2gXPgmdriraZG6mb5A'], verificationMethod: [ { id: 'did:ebsi:zj46t2gXPgmdriraZG6mb5A#7-1eNcG4MFkxahS1m85zcyu9ey_zOAl_fxvSPtI5Q2k', type: 'JsonWebKey2020', controller: 'did:ebsi:zj46t2gXPgmdriraZG6mb5A', publicKeyJwk: { kty: 'EC', crv: 'secp256k1', x: 'u0LAULtFwOQwusN8esicYCz579culZW5htoPC_ADha4', y: 'mYnbYZH4iyvlyMWuXE-X2ssebVE7VC9aW3wPxkU9wdQ', }, }, { id: 'did:ebsi:zj46t2gXPgmdriraZG6mb5A#awSc2nG7WGNGw9YDtnVZ5HPOjeIhC8eb8UDOr3QV1Fc', type: 'JsonWebKey2020', controller: 'did:ebsi:zj46t2gXPgmdriraZG6mb5A', publicKeyJwk: { kty: 'EC', crv: 'P-256', x: 'mDX7h2ZIOL1993wj4H83_jg67d_TaYk3dvVL447rRC0', y: 'Lr-efgLN1QPv-rb2sk-4gv7cVwXpzTY6FE8kdNHUUwU', }, }, ], authentication: [ 'did:ebsi:zj46t2gXPgmdriraZG6mb5A#7-1eNcG4MFkxahS1m85zcyu9ey_zOAl_fxvSPtI5Q2k', 'did:ebsi:zj46t2gXPgmdriraZG6mb5A#awSc2nG7WGNGw9YDtnVZ5HPOjeIhC8eb8UDOr3QV1Fc', ], assertionMethod: [ 'did:ebsi:zj46t2gXPgmdriraZG6mb5A#awSc2nG7WGNGw9YDtnVZ5HPOjeIhC8eb8UDOr3QV1Fc', 'did:ebsi:zj46t2gXPgmdriraZG6mb5A#7-1eNcG4MFkxahS1m85zcyu9ey_zOAl_fxvSPtI5Q2k', ], capabilityInvocation: [ 'did:ebsi:zj46t2gXPgmdriraZG6mb5A#7-1eNcG4MFkxahS1m85zcyu9ey_zOAl_fxvSPtI5Q2k', ], } as ResolvedValue); const publicKey = await didKeyResolver.getPublicKeyJwk(kid); expect(didDocumentResolver.resolveDid).toHaveBeenCalledWith(did, undefined); expect(publicKey).toEqual(expectedPublicKey); }); it('resolve a publicKey for a did:key', async () => { const kid = 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y#z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y'; const did = 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y'; const didDocumentResolver = mock(); const didKeyResolver = new DidPublicKeyResolver(didDocumentResolver); const expectedPublicKey = { kty: 'EC', crv: 'P-256', x: 'gFBYByibyPMs-lCnMUPiQ7k5AlqXtKyfTOzP9GHwQK0', y: 'FSM7awyWDKq5pkE8rTqtt3rfS7Wq8YHloBCGSlh3g-A', }; didDocumentResolver.resolveDid.mockResolvedValue({ '@context': [ 'https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1', ], assertionMethod: [ 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y#z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y', ], authentication: [ 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y#z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y', ], capabilityDelegation: [ 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y#z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y', ], capabilityInvocation: [ 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y#z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y', ], id: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y', verificationMethod: [ { controller: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y', id: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y#z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbrgH4EauuBEZ3b9RYym6bwWZSC8i4JVtGgYDKku9YHfxzDBYXe9CxiQS8CADBJB44rq3LzCk1eKuNTRyEnnML8iQydfxQA5nPFMJ1QhS4htJSVQy6rQMaUEv1vVnJ5thP8Y', publicKeyJwk: { crv: 'P-256', kty: 'EC', x: 'gFBYByibyPMs-lCnMUPiQ7k5AlqXtKyfTOzP9GHwQK0', y: 'FSM7awyWDKq5pkE8rTqtt3rfS7Wq8YHloBCGSlh3g-A', }, type: 'JsonWebKey2020', }, ], } as ResolvedValue); const publicKey = await didKeyResolver.getPublicKeyJwk(kid); expect(didDocumentResolver.resolveDid).toHaveBeenCalledWith(did, undefined); expect(publicKey).toEqual(expectedPublicKey); }); });