Skip to content

Commit ed69dac

Browse files
karimStekelenburgTimoGlastra
authored andcommitted
feat: fetch verification method types by proof type (#913)
Signed-off-by: Karim <karim@animo.id>
1 parent 93f3c93 commit ed69dac

File tree

8 files changed

+137
-31
lines changed

8 files changed

+137
-31
lines changed

packages/core/src/modules/dids/domain/key-type/__tests__/ed25519.test.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,10 @@ describe('ed25519', () => {
5252
})
5353

5454
it('supports Ed25519VerificationKey2018 verification method type', () => {
55-
expect(keyDidEd25519.supportedVerificationMethodTypes).toMatchObject(['Ed25519VerificationKey2018'])
55+
expect(keyDidEd25519.supportedVerificationMethodTypes).toMatchObject([
56+
'Ed25519VerificationKey2018',
57+
'Ed25519VerificationKey2020',
58+
])
5659
})
5760

5861
it('returns key for Ed25519VerificationKey2018 verification method', () => {
@@ -63,6 +66,22 @@ describe('ed25519', () => {
6366
expect(key.fingerprint).toBe(TEST_ED25519_FINGERPRINT)
6467
})
6568

69+
it('returns key for Ed25519VerificationKey2020 verification method', () => {
70+
const verificationMethod = JsonTransformer.fromJSON(
71+
{
72+
id: 'did:example:123',
73+
type: 'Ed25519VerificationKey2020',
74+
controller: 'did:example:123',
75+
publicKeyMultibase: 'z6MkkBWg1AnNxxWiq77gJDeHsLhGN6JV9Y3d6WiTifUs1sZi',
76+
},
77+
VerificationMethod
78+
)
79+
80+
const key = keyDidEd25519.getKeyFromVerificationMethod(verificationMethod)
81+
82+
expect(key.publicKeyBase58).toBe('6jFdQvXwdR2FicGycegT2F9GYX2djeoGQVoXtPWr6enL')
83+
})
84+
6685
it('throws an error if an invalid verification method is passed', () => {
6786
const verificationMethod = JsonTransformer.fromJSON(didKeyEd25519Fixture.verificationMethod[0], VerificationMethod)
6887

packages/core/src/modules/dids/domain/key-type/bls12381g2.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { KeyDidMapping } from './keyDidMapping'
44
import { KeyType } from '../../../../crypto'
55
import { Key } from '../../../../crypto/Key'
66

7-
const VERIFICATION_METHOD_TYPE_BLS12381G2_KEY_2020 = 'Bls12381G2Key2020'
7+
export const VERIFICATION_METHOD_TYPE_BLS12381G2_KEY_2020 = 'Bls12381G2Key2020'
88

99
export function getBls12381g2VerificationMethod(did: string, key: Key) {
1010
return {

packages/core/src/modules/dids/domain/key-type/ed25519.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import { convertPublicKeyToX25519 } from '@stablelib/ed25519'
66
import { KeyType } from '../../../../crypto'
77
import { Key } from '../../../../crypto/Key'
88

9-
const VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2018 = 'Ed25519VerificationKey2018'
9+
export const VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2018 = 'Ed25519VerificationKey2018'
10+
export const VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2020 = 'Ed25519VerificationKey2020'
1011

1112
export function getEd25519VerificationMethod({ key, id, controller }: { id: string; key: Key; controller: string }) {
1213
return {
@@ -18,19 +19,28 @@ export function getEd25519VerificationMethod({ key, id, controller }: { id: stri
1819
}
1920

2021
export const keyDidEd25519: KeyDidMapping = {
21-
supportedVerificationMethodTypes: [VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2018],
22+
supportedVerificationMethodTypes: [
23+
VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2018,
24+
VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2020,
25+
],
2226
getVerificationMethods: (did, key) => [
2327
getEd25519VerificationMethod({ id: `${did}#${key.fingerprint}`, key, controller: did }),
2428
],
2529
getKeyFromVerificationMethod: (verificationMethod: VerificationMethod) => {
2630
if (
27-
verificationMethod.type !== VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2018 ||
28-
!verificationMethod.publicKeyBase58
31+
verificationMethod.type === VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2018 &&
32+
verificationMethod.publicKeyBase58
33+
) {
34+
return Key.fromPublicKeyBase58(verificationMethod.publicKeyBase58, KeyType.Ed25519)
35+
}
36+
if (
37+
verificationMethod.type === VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2020 &&
38+
verificationMethod.publicKeyMultibase
2939
) {
30-
throw new Error('Invalid verification method passed')
40+
return Key.fromFingerprint(verificationMethod.publicKeyMultibase)
3141
}
3242

33-
return Key.fromPublicKeyBase58(verificationMethod.publicKeyBase58, KeyType.Ed25519)
43+
throw new Error('Invalid verification method passed')
3444
},
3545
}
3646

packages/core/src/modules/vc/SignatureSuiteRegistry.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ export const SignatureSuiteToken = Symbol('SignatureSuiteToken')
1111
export interface SuiteInfo {
1212
suiteClass: typeof LinkedDataSignature
1313
proofType: string
14-
requiredKeyType: string
15-
keyType: string
14+
verificationMethodTypes: string[]
15+
keyTypes: KeyType[]
1616
}
1717

1818
@injectable()
@@ -27,8 +27,12 @@ export class SignatureSuiteRegistry {
2727
return this.suiteMapping.map((x) => x.proofType)
2828
}
2929

30+
public getByVerificationMethodType(verificationMethodType: string) {
31+
return this.suiteMapping.find((x) => x.verificationMethodTypes.includes(verificationMethodType))
32+
}
33+
3034
public getByKeyType(keyType: KeyType) {
31-
return this.suiteMapping.find((x) => x.keyType === keyType)
35+
return this.suiteMapping.find((x) => x.keyTypes.includes(keyType))
3236
}
3337

3438
public getByProofType(proofType: string) {
@@ -40,4 +44,14 @@ export class SignatureSuiteRegistry {
4044

4145
return suiteInfo
4246
}
47+
48+
public getVerificationMethodTypesByProofType(proofType: string): string[] {
49+
const suiteInfo = this.suiteMapping.find((suiteInfo) => suiteInfo.proofType === proofType)
50+
51+
if (!suiteInfo) {
52+
throw new AriesFrameworkError(`No verification method type found for proof type: ${proofType}`)
53+
}
54+
55+
return suiteInfo.verificationMethodTypes
56+
}
4357
}

packages/core/src/modules/vc/W3cCredentialService.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export class W3cCredentialService {
6363
const signingKey = await this.getPublicKeyFromVerificationMethod(agentContext, options.verificationMethod)
6464
const suiteInfo = this.suiteRegistry.getByProofType(options.proofType)
6565

66-
if (signingKey.keyType !== suiteInfo.keyType) {
66+
if (!suiteInfo.keyTypes.includes(signingKey.keyType)) {
6767
throw new AriesFrameworkError('The key type of the verification method does not match the suite')
6868
}
6969

@@ -169,7 +169,7 @@ export class W3cCredentialService {
169169

170170
const signingKey = await this.getPublicKeyFromVerificationMethod(agentContext, options.verificationMethod)
171171

172-
if (signingKey.keyType !== suiteInfo.keyType) {
172+
if (!suiteInfo.keyTypes.includes(signingKey.keyType)) {
173173
throw new AriesFrameworkError('The key type of the verification method does not match the suite')
174174
}
175175

@@ -379,6 +379,14 @@ export class W3cCredentialService {
379379
return result.map((record) => record.credential)
380380
}
381381

382+
public getVerificationMethodTypesByProofType(proofType: string): string[] {
383+
return this.suiteRegistry.getByProofType(proofType).verificationMethodTypes
384+
}
385+
386+
public getKeyTypesByProofType(proofType: string): string[] {
387+
return this.suiteRegistry.getByProofType(proofType).keyTypes
388+
}
389+
382390
public async findCredentialRecordByQuery(
383391
agentContext: AgentContext,
384392
query: Query<W3cCredentialRecord>

packages/core/src/modules/vc/W3cVcModule.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import type { DependencyManager, Module } from '../../plugins'
22

33
import { KeyType } from '../../crypto'
4+
import { VERIFICATION_METHOD_TYPE_BLS12381G2_KEY_2020 } from '../dids/domain/key-type/bls12381g2'
5+
import {
6+
VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2018,
7+
VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2020,
8+
} from '../dids/domain/key-type/ed25519'
49

510
import { SignatureSuiteRegistry, SignatureSuiteToken } from './SignatureSuiteRegistry'
611
import { W3cCredentialService } from './W3cCredentialService'
@@ -19,22 +24,25 @@ export class W3cVcModule implements Module {
1924
dependencyManager.registerInstance(SignatureSuiteToken, {
2025
suiteClass: Ed25519Signature2018,
2126
proofType: 'Ed25519Signature2018',
22-
requiredKeyType: 'Ed25519VerificationKey2018',
23-
keyType: KeyType.Ed25519,
27+
verificationMethodTypes: [
28+
VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2018,
29+
VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2020,
30+
],
31+
keyTypes: [KeyType.Ed25519],
2432
})
2533

2634
// This will be moved out of core into the bbs module
2735
dependencyManager.registerInstance(SignatureSuiteToken, {
2836
suiteClass: BbsBlsSignature2020,
2937
proofType: 'BbsBlsSignature2020',
30-
requiredKeyType: 'BbsBlsSignatureProof2020',
31-
keyType: KeyType.Bls12381g2,
38+
verificationMethodTypes: [VERIFICATION_METHOD_TYPE_BLS12381G2_KEY_2020],
39+
keyTypes: [KeyType.Bls12381g2],
3240
})
3341
dependencyManager.registerInstance(SignatureSuiteToken, {
3442
suiteClass: BbsBlsSignatureProof2020,
3543
proofType: 'BbsBlsSignatureProof2020',
36-
requiredKeyType: 'BbsBlsSignatureProof2020',
37-
keyType: KeyType.Bls12381g2,
44+
verificationMethodTypes: [VERIFICATION_METHOD_TYPE_BLS12381G2_KEY_2020],
45+
keyTypes: [KeyType.Bls12381g2],
3846
})
3947
}
4048
}

packages/core/src/modules/vc/__tests__/W3cCredentialService.test.ts

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ import { JsonTransformer } from '../../../utils/JsonTransformer'
88
import { IndyWallet } from '../../../wallet/IndyWallet'
99
import { WalletError } from '../../../wallet/error'
1010
import { DidKey, DidResolverService } from '../../dids'
11+
import { VERIFICATION_METHOD_TYPE_BLS12381G2_KEY_2020 } from '../../dids/domain/key-type/bls12381g2'
12+
import {
13+
VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2018,
14+
VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2020,
15+
} from '../../dids/domain/key-type/ed25519'
1116
import { SignatureSuiteRegistry } from '../SignatureSuiteRegistry'
1217
import { W3cCredentialService } from '../W3cCredentialService'
1318
import { orArrayToArray } from '../jsonldUtil'
@@ -29,20 +34,24 @@ const signatureSuiteRegistry = new SignatureSuiteRegistry([
2934
{
3035
suiteClass: Ed25519Signature2018,
3136
proofType: 'Ed25519Signature2018',
32-
requiredKeyType: 'Ed25519VerificationKey2018',
33-
keyType: KeyType.Ed25519,
37+
38+
verificationMethodTypes: [
39+
VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2018,
40+
VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2020,
41+
],
42+
keyTypes: [KeyType.Ed25519],
3443
},
3544
{
3645
suiteClass: BbsBlsSignature2020,
3746
proofType: 'BbsBlsSignature2020',
38-
requiredKeyType: 'BbsBlsSignatureProof2020',
39-
keyType: KeyType.Bls12381g2,
47+
verificationMethodTypes: [VERIFICATION_METHOD_TYPE_BLS12381G2_KEY_2020],
48+
keyTypes: [KeyType.Bls12381g2],
4049
},
4150
{
4251
suiteClass: BbsBlsSignatureProof2020,
4352
proofType: 'BbsBlsSignatureProof2020',
44-
requiredKeyType: 'BbsBlsSignatureProof2020',
45-
keyType: KeyType.Bls12381g2,
53+
verificationMethodTypes: [VERIFICATION_METHOD_TYPE_BLS12381G2_KEY_2020],
54+
keyTypes: [KeyType.Bls12381g2],
4655
},
4756
])
4857

@@ -94,6 +103,44 @@ describe('W3cCredentialService', () => {
94103
await wallet.delete()
95104
})
96105

106+
describe('Utility methods', () => {
107+
describe('getKeyTypesByProofType', () => {
108+
it('should return the correct key types for Ed25519Signature2018 proof type', async () => {
109+
const keyTypes = w3cCredentialService.getKeyTypesByProofType('Ed25519Signature2018')
110+
expect(keyTypes).toEqual([KeyType.Ed25519])
111+
})
112+
it('should return the correct key types for BbsBlsSignature2020 proof type', async () => {
113+
const keyTypes = w3cCredentialService.getKeyTypesByProofType('BbsBlsSignature2020')
114+
expect(keyTypes).toEqual([KeyType.Bls12381g2])
115+
})
116+
it('should return the correct key types for BbsBlsSignatureProof2020 proof type', async () => {
117+
const keyTypes = w3cCredentialService.getKeyTypesByProofType('BbsBlsSignatureProof2020')
118+
expect(keyTypes).toEqual([KeyType.Bls12381g2])
119+
})
120+
})
121+
122+
describe('getVerificationMethodTypesByProofType', () => {
123+
it('should return the correct key types for Ed25519Signature2018 proof type', async () => {
124+
const verificationMethodTypes =
125+
w3cCredentialService.getVerificationMethodTypesByProofType('Ed25519Signature2018')
126+
expect(verificationMethodTypes).toEqual([
127+
VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2018,
128+
VERIFICATION_METHOD_TYPE_ED25519_VERIFICATION_KEY_2020,
129+
])
130+
})
131+
it('should return the correct key types for BbsBlsSignature2020 proof type', async () => {
132+
const verificationMethodTypes =
133+
w3cCredentialService.getVerificationMethodTypesByProofType('BbsBlsSignature2020')
134+
expect(verificationMethodTypes).toEqual([VERIFICATION_METHOD_TYPE_BLS12381G2_KEY_2020])
135+
})
136+
it('should return the correct key types for BbsBlsSignatureProof2020 proof type', async () => {
137+
const verificationMethodTypes =
138+
w3cCredentialService.getVerificationMethodTypesByProofType('BbsBlsSignatureProof2020')
139+
expect(verificationMethodTypes).toEqual([VERIFICATION_METHOD_TYPE_BLS12381G2_KEY_2020])
140+
})
141+
})
142+
})
143+
97144
describe('Ed25519Signature2018', () => {
98145
let issuerDidKey: DidKey
99146
let verificationMethod: string

packages/core/src/modules/vc/__tests__/W3cVcModule.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,23 @@ describe('W3cVcModule', () => {
2424
expect(dependencyManager.registerInstance).toHaveBeenCalledTimes(3)
2525
expect(dependencyManager.registerInstance).toHaveBeenCalledWith(SignatureSuiteToken, {
2626
suiteClass: Ed25519Signature2018,
27+
verificationMethodTypes: ['Ed25519VerificationKey2018', 'Ed25519VerificationKey2020'],
2728
proofType: 'Ed25519Signature2018',
28-
requiredKeyType: 'Ed25519VerificationKey2018',
29-
keyType: KeyType.Ed25519,
29+
keyTypes: [KeyType.Ed25519],
3030
})
3131

3232
expect(dependencyManager.registerInstance).toHaveBeenCalledWith(SignatureSuiteToken, {
3333
suiteClass: BbsBlsSignature2020,
34+
verificationMethodTypes: ['Bls12381G2Key2020'],
3435
proofType: 'BbsBlsSignature2020',
35-
requiredKeyType: 'BbsBlsSignatureProof2020',
36-
keyType: KeyType.Bls12381g2,
36+
keyTypes: [KeyType.Bls12381g2],
3737
})
3838

3939
expect(dependencyManager.registerInstance).toHaveBeenCalledWith(SignatureSuiteToken, {
4040
suiteClass: BbsBlsSignatureProof2020,
4141
proofType: 'BbsBlsSignatureProof2020',
42-
requiredKeyType: 'BbsBlsSignatureProof2020',
43-
keyType: KeyType.Bls12381g2,
42+
verificationMethodTypes: ['Bls12381G2Key2020'],
43+
keyTypes: [KeyType.Bls12381g2],
4444
})
4545
})
4646
})

0 commit comments

Comments
 (0)