@docknetwork/wallet-sdk-wasm 1.4.0 → 1.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/lib/{account-3c88155a.js → account-bf00e5c0.js} +5 -5
  2. package/lib/{account-8f5cbc4d.js → account-e48dc9b6.js} +5 -5
  3. package/lib/core/polkadot-utils.js +18 -4
  4. package/lib/core/polkadot-utils.mjs +15 -2
  5. package/lib/index.js +14 -17
  6. package/lib/index.mjs +14 -17
  7. package/lib/modules/account.js +9 -5
  8. package/lib/modules/account.mjs +9 -5
  9. package/lib/modules/accounts.js +9 -5
  10. package/lib/modules/accounts.mjs +9 -5
  11. package/lib/modules/network-manager.js +4 -2
  12. package/lib/modules/network-manager.mjs +4 -2
  13. package/lib/modules/wallet.js +12 -8
  14. package/lib/modules/wallet.mjs +12 -8
  15. package/lib/rpc-server.js +14 -17
  16. package/lib/rpc-server.mjs +14 -17
  17. package/lib/services/blockchain/configs.js +7 -0
  18. package/lib/services/blockchain/configs.mjs +3 -0
  19. package/lib/services/{dock → blockchain}/index.android.js +3 -4
  20. package/lib/services/{dock → blockchain}/index.android.mjs +3 -4
  21. package/lib/services/{dock → blockchain}/index.ios.js +3 -4
  22. package/lib/services/{dock → blockchain}/index.ios.mjs +3 -4
  23. package/lib/services/blockchain/index.js +30 -0
  24. package/lib/services/blockchain/index.mjs +22 -0
  25. package/lib/services/{dock → blockchain}/service-rpc.js +5 -7
  26. package/lib/services/{dock → blockchain}/service-rpc.mjs +5 -7
  27. package/lib/services/blockchain/service.js +212 -0
  28. package/lib/services/blockchain/service.mjs +206 -0
  29. package/lib/services/credential/bbs-revocation.js +33 -61
  30. package/lib/services/credential/bbs-revocation.mjs +34 -62
  31. package/lib/services/credential/bound-check.js +0 -8
  32. package/lib/services/credential/bound-check.mjs +1 -5
  33. package/lib/services/credential/index.js +20 -23
  34. package/lib/services/credential/index.mjs +20 -23
  35. package/lib/services/credential/pex-helpers.js +134 -34
  36. package/lib/services/credential/pex-helpers.mjs +133 -35
  37. package/lib/services/credential/service.js +54 -55
  38. package/lib/services/credential/service.mjs +43 -41
  39. package/lib/services/credential/utils.js +12 -18
  40. package/lib/services/credential/utils.mjs +11 -14
  41. package/lib/services/dids/config.js +8 -0
  42. package/lib/services/dids/config.mjs +8 -0
  43. package/lib/services/dids/index.js +8 -7
  44. package/lib/services/dids/index.mjs +8 -7
  45. package/lib/services/dids/service-rpc.js +2 -2
  46. package/lib/services/dids/service-rpc.mjs +2 -2
  47. package/lib/services/dids/service.js +22 -32
  48. package/lib/services/dids/service.mjs +22 -32
  49. package/lib/services/edv/hmac.js +5 -0
  50. package/lib/services/edv/hmac.mjs +5 -0
  51. package/lib/services/edv/index.js +10 -8
  52. package/lib/services/edv/index.mjs +10 -8
  53. package/lib/services/edv/service-rpc.js +4 -0
  54. package/lib/services/edv/service-rpc.mjs +4 -0
  55. package/lib/services/edv/service.js +26 -10
  56. package/lib/services/edv/service.mjs +25 -10
  57. package/lib/services/example/service.js +3 -1
  58. package/lib/services/example/service.mjs +3 -1
  59. package/lib/services/index.js +12 -15
  60. package/lib/services/index.mjs +12 -15
  61. package/lib/services/keyring/configs.js +12 -0
  62. package/lib/services/keyring/configs.mjs +12 -0
  63. package/lib/services/keyring/service.js +5 -0
  64. package/lib/services/keyring/service.mjs +5 -0
  65. package/lib/services/pex/service.js +17 -15
  66. package/lib/services/pex/service.mjs +17 -15
  67. package/lib/services/substrate/api-utils.js +18 -6
  68. package/lib/services/substrate/api-utils.mjs +18 -6
  69. package/lib/services/substrate/index.js +13 -6
  70. package/lib/services/substrate/index.mjs +13 -6
  71. package/lib/services/substrate/service.js +16 -9
  72. package/lib/services/substrate/service.mjs +16 -9
  73. package/lib/services/test-utils.js +27 -18
  74. package/lib/services/test-utils.mjs +27 -18
  75. package/lib/services/trust-registry/index.js +16 -5
  76. package/lib/services/trust-registry/index.mjs +16 -5
  77. package/lib/services/trust-registry/service.js +26 -10
  78. package/lib/services/trust-registry/service.mjs +26 -10
  79. package/lib/services/util-crypto/configs.js +3 -0
  80. package/lib/services/util-crypto/configs.mjs +3 -0
  81. package/lib/services/util-crypto/service-rpc.js +6 -0
  82. package/lib/services/util-crypto/service-rpc.mjs +6 -0
  83. package/lib/services/util-crypto/service.js +5 -0
  84. package/lib/services/util-crypto/service.mjs +6 -1
  85. package/lib/setup-nodejs.js +14 -17
  86. package/lib/setup-nodejs.mjs +14 -17
  87. package/lib/setup-tests.js +14 -17
  88. package/lib/setup-tests.mjs +14 -17
  89. package/lib/src/core/polkadot-utils.d.ts +1 -0
  90. package/lib/src/core/polkadot-utils.d.ts.map +1 -1
  91. package/lib/src/modules/network-manager.d.ts +1 -0
  92. package/lib/src/modules/network-manager.d.ts.map +1 -1
  93. package/lib/src/services/blockchain/configs.d.ts +8 -0
  94. package/lib/src/services/blockchain/configs.d.ts.map +1 -0
  95. package/lib/src/services/blockchain/index.d.ts +2 -0
  96. package/lib/src/services/blockchain/index.d.ts.map +1 -0
  97. package/lib/src/services/{dock → blockchain}/service.d.ts +12 -11
  98. package/lib/src/services/blockchain/service.d.ts.map +1 -0
  99. package/lib/src/services/credential/bbs-revocation.d.ts.map +1 -1
  100. package/lib/src/services/credential/bound-check.d.ts +0 -4
  101. package/lib/src/services/credential/bound-check.d.ts.map +1 -1
  102. package/lib/src/services/credential/index.d.ts +2 -7
  103. package/lib/src/services/credential/index.d.ts.map +1 -1
  104. package/lib/src/services/credential/pex-helpers.d.ts +5 -3
  105. package/lib/src/services/credential/pex-helpers.d.ts.map +1 -1
  106. package/lib/src/services/credential/service.d.ts +2 -7
  107. package/lib/src/services/credential/service.d.ts.map +1 -1
  108. package/lib/src/services/credential/utils.d.ts.map +1 -1
  109. package/lib/src/services/dids/config.d.ts +5 -0
  110. package/lib/src/services/dids/config.d.ts.map +1 -1
  111. package/lib/src/services/dids/service-rpc.d.ts +1 -1
  112. package/lib/src/services/dids/service-rpc.d.ts.map +1 -1
  113. package/lib/src/services/dids/service.d.ts +9 -7
  114. package/lib/src/services/dids/service.d.ts.map +1 -1
  115. package/lib/src/services/edv/hmac.d.ts +1 -0
  116. package/lib/src/services/edv/hmac.d.ts.map +1 -1
  117. package/lib/src/services/edv/service.d.ts +5 -0
  118. package/lib/src/services/edv/service.d.ts.map +1 -1
  119. package/lib/src/services/example/service.d.ts.map +1 -1
  120. package/lib/src/services/keyring/configs.d.ts +6 -0
  121. package/lib/src/services/keyring/configs.d.ts.map +1 -1
  122. package/lib/src/services/pex/service.d.ts.map +1 -1
  123. package/lib/src/services/trust-registry/service.d.ts.map +1 -1
  124. package/lib/src/services/util-crypto/configs.d.ts +1 -0
  125. package/lib/src/services/util-crypto/configs.d.ts.map +1 -1
  126. package/lib/src/services/util-crypto/service.d.ts +1 -0
  127. package/lib/src/services/util-crypto/service.d.ts.map +1 -1
  128. package/lib/test/setup-test-state.js +10 -6
  129. package/lib/test/setup-test-state.mjs +10 -6
  130. package/lib/tsconfig.tsbuildinfo +1 -1
  131. package/package.json +9 -7
  132. package/src/core/polkadot-utils.js +14 -3
  133. package/src/modules/network-manager.ts +5 -2
  134. package/src/modules/wallet.ts +5 -5
  135. package/src/services/blockchain/configs.ts +11 -0
  136. package/src/services/blockchain/index.android.js +3 -0
  137. package/src/services/blockchain/index.ios.js +3 -0
  138. package/src/services/blockchain/index.js +1 -0
  139. package/src/services/blockchain/index.test.js +34 -0
  140. package/src/services/{dock → blockchain}/service-rpc.js +5 -6
  141. package/src/services/blockchain/service.ts +261 -0
  142. package/src/services/credential/bbs-revocation.ts +42 -90
  143. package/src/services/credential/bound-check.test.ts +2 -5
  144. package/src/services/credential/bound-check.ts +0 -5
  145. package/src/services/credential/index.test.js +148 -7
  146. package/src/services/credential/pex-helpers.js +132 -34
  147. package/src/services/credential/pex-helpers.test.js +284 -27
  148. package/src/services/credential/service.ts +44 -27
  149. package/src/services/credential/utils.js +5 -14
  150. package/src/services/dids/config.ts +15 -0
  151. package/src/services/dids/index.test.js +5 -46
  152. package/src/services/dids/service-rpc.ts +2 -2
  153. package/src/services/dids/service.ts +17 -34
  154. package/src/services/edv/hmac.ts +13 -0
  155. package/src/services/edv/index.test.js +22 -0
  156. package/src/services/edv/service-rpc.js +4 -0
  157. package/src/services/edv/service.ts +22 -0
  158. package/src/services/example/service.ts +3 -1
  159. package/src/services/index.js +2 -2
  160. package/src/services/keyring/configs.ts +21 -0
  161. package/src/services/keyring/service.ts +13 -0
  162. package/src/services/pex/service.ts +29 -18
  163. package/src/services/pex/tests/pex-service.test.js +163 -6
  164. package/src/services/substrate/api-utils.test.js +7 -7
  165. package/src/services/substrate/api-utils.ts +3 -3
  166. package/src/services/substrate/service.ts +6 -6
  167. package/src/services/test-utils.js +13 -11
  168. package/src/services/trust-registry/index.test.js +6 -4
  169. package/src/services/trust-registry/service.ts +13 -7
  170. package/src/services/util-crypto/configs.ts +4 -0
  171. package/src/services/util-crypto/service-rpc.js +6 -0
  172. package/src/services/util-crypto/service.ts +8 -0
  173. package/src/test/setup-test-state.js +2 -2
  174. package/lib/services/dock/configs.js +0 -18
  175. package/lib/services/dock/configs.mjs +0 -10
  176. package/lib/services/dock/index.js +0 -18
  177. package/lib/services/dock/index.mjs +0 -10
  178. package/lib/services/dock/service.js +0 -136
  179. package/lib/services/dock/service.mjs +0 -128
  180. package/lib/src/services/dock/configs.d.ts +0 -7
  181. package/lib/src/services/dock/configs.d.ts.map +0 -1
  182. package/lib/src/services/dock/index.d.ts +0 -2
  183. package/lib/src/services/dock/index.d.ts.map +0 -1
  184. package/lib/src/services/dock/service.d.ts.map +0 -1
  185. package/src/services/dock/configs.ts +0 -12
  186. package/src/services/dock/index.android.js +0 -3
  187. package/src/services/dock/index.ios.js +0 -3
  188. package/src/services/dock/index.js +0 -1
  189. package/src/services/dock/index.test.js +0 -48
  190. package/src/services/dock/service.ts +0 -159
@@ -1,12 +1,10 @@
1
- import {assertRpcService, getPromiseError} from '../test-utils';
1
+ import {assertRpcService} from '../test-utils';
2
2
  import {DIDServiceRPC} from './service-rpc';
3
3
  import {didService as service} from './service';
4
4
  import {validation} from './config';
5
5
  import {DIDKeyManager} from '@docknetwork/wallet-sdk-dids/src';
6
- import {TestFixtures} from '../../fixtures';
7
6
  import {getTestWallet} from '../../test/setup-test-state';
8
- import {dockService, getDock} from '../dock/service';
9
- import {DockDid} from '@docknetwork/credential-sdk/types';
7
+ import {blockchainService} from '../blockchain/service';
10
8
 
11
9
  describe('DID Service', () => {
12
10
  beforeAll(async () => {
@@ -99,50 +97,11 @@ describe('DID Service', () => {
99
97
  spy.mockReset();
100
98
  });
101
99
 
102
- it('expect to register did dock', async () => {
103
- dockService.modules = {
104
- did: {
105
- dockOnly: {
106
- rawTx: {
107
- newOnchain: jest.fn(),
108
- },
109
- },
110
- },
111
- };
112
-
113
- jest.spyOn(DockDid, 'fromQualifiedString').mockReturnValueOnce('');
114
-
115
- const result = await service.registerDidDock(
116
- TestFixtures.account1.getKeyring().toJson(''),
117
- );
118
- expect(result.dockDID).toBeDefined();
119
- expect(result.keyPairWalletId).toBeDefined();
120
- });
121
-
122
- it('expect to fail to register did dock', async () => {
123
- dockService.modules = {
124
- did: {
125
- dockOnly: {
126
- rawTx: {
127
- newOnchain: () => {
128
- throw new Error('');
129
- },
130
- },
131
- },
132
- },
133
- };
134
-
135
- const error = await getPromiseError(() =>
136
- service.registerDidDock(
137
- TestFixtures.noBalanceAccount.getKeyring().toJson(''),
138
- ),
139
- );
140
- expect(error.message).toBeDefined();
141
- });
142
-
143
100
  it('expect to get did document', async () => {
144
101
  const document = 'document';
145
- jest.spyOn(getDock().did, 'getDocument').mockResolvedValue(document);
102
+ jest
103
+ .spyOn(blockchainService.didModule, 'getDocument')
104
+ .mockResolvedValue(document);
146
105
 
147
106
  const result = await service.getDidDockDocument(
148
107
  'did:dock:5HL5XB7CHcHT2ZUKjY2SCJvDAK11qoa1exgfVnVTHRbmjJQi',
@@ -18,8 +18,8 @@ export class DIDServiceRPC extends RpcService {
18
18
  generateKeyDoc(params) {
19
19
  return this.call('generateKeyDoc', params);
20
20
  }
21
- registerDidDock(keyPair) {
22
- return this.call('registerDidDock', keyPair);
21
+ deriveKeyDoc(params) {
22
+ return this.call('deriveKeyDoc', params);
23
23
  }
24
24
  getDidDockDocument(did) {
25
25
  return this.call('getDidDockDocument', did);
@@ -9,7 +9,7 @@ import {
9
9
  import {keyringService} from '../keyring/service';
10
10
  import {utilCryptoService} from '../util-crypto/service';
11
11
  import assert from 'assert';
12
- import {dockService, getDock} from '../dock/service';
12
+ import {blockchainService, getDock} from '../blockchain/service';
13
13
 
14
14
  import {
15
15
  DidKey,
@@ -28,27 +28,9 @@ import {
28
28
  EcdsaSecp256k1Signature2019,
29
29
  } from '@docknetwork/credential-sdk/vc/crypto';
30
30
 
31
- async function createDockDID({keyPair}) {
32
- const dockDID = DockDid.random();
33
- const dockController = dockDID.toString();
34
- const publicKey = keyPair.publicKey();
35
- const verRels = new VerificationRelationship();
36
- const didKey = new DidKey(publicKey, verRels);
37
-
38
- await dockService.modules.did.dockOnly.rawTx.newOnchain(
39
- dockDID.did,
40
- [didKey],
41
- dockController === dockDID.toString()
42
- ? []
43
- : [DockDid.fromQualifiedString(dockController)],
44
- );
45
-
46
- return {did: dockDID.toString(), controller: dockController};
47
- }
48
-
49
31
  async function getSignerKeypair(privateKeyDoc) {
50
32
  const privateKey =
51
- privateKeyDoc.keypair || keyDocToKeypair(privateKeyDoc, dockService.dock);
33
+ privateKeyDoc.keypair || keyDocToKeypair(privateKeyDoc, blockchainService.dock);
52
34
 
53
35
  if (!privateKey.signer && privateKey.sign) {
54
36
  privateKey.signer = () => ({sign: ({data}) => privateKey.sign(data)});
@@ -84,7 +66,7 @@ class DIDService {
84
66
  DIDService.prototype.keypairToDIDKeyDocument,
85
67
  DIDService.prototype.getDIDResolution,
86
68
  DIDService.prototype.generateKeyDoc,
87
- DIDService.prototype.registerDidDock,
69
+ DIDService.prototype.deriveKeyDoc,
88
70
  DIDService.prototype.getDidDockDocument,
89
71
  DIDService.prototype.createSignedJWT,
90
72
  ];
@@ -120,6 +102,18 @@ class DIDService {
120
102
  return polkadotToKeydoc(keyring, params.controller);
121
103
  }
122
104
 
105
+ async deriveKeyDoc(params) {
106
+ validation.deriveKeyDoc(params);
107
+ const { pair, type = 'ed25519' } = params;
108
+
109
+ const keyring = keyringService.createFromPair({
110
+ pair,
111
+ type,
112
+ });
113
+
114
+ return polkadotToKeydoc(keyring, params.controller);
115
+ }
116
+
123
117
  async createSignedJWT({payload, privateKeyDoc, headerInput}) {
124
118
  const privateKey = await getSignerKeypair(privateKeyDoc);
125
119
  const {sign} =
@@ -142,21 +136,10 @@ class DIDService {
142
136
 
143
137
  async getDidDockDocument(did) {
144
138
  assert(!!did, 'DID is required');
145
- const dock = getDock();
146
- const result = await dock.did.getDocument(did);
139
+ const dock = blockchainService.dock;
140
+ const result = await blockchainService.didModule.getDocument(did);
147
141
  return result;
148
142
  }
149
-
150
- async registerDidDock(keyPairJSON) {
151
- assert(!!keyPairJSON, 'keyPair is required');
152
- const keyPair = Ed25519Keypair.random();
153
- const dockDID = await createDockDID({keyPair});
154
-
155
- return {
156
- dockDID,
157
- keyPairWalletId: keyPairJSON.address,
158
- };
159
- }
160
143
  }
161
144
 
162
145
  export const didService = new DIDService();
@@ -1,5 +1,6 @@
1
1
  import * as base64url from 'base64url-universal';
2
2
  import crypto from '@docknetwork/universal-wallet/crypto';
3
+ import {hexToU8a} from '@polkadot/util';
3
4
 
4
5
  export default class HMAC {
5
6
  key: CryptoKey;
@@ -37,6 +38,18 @@ export default class HMAC {
37
38
  return key;
38
39
  }
39
40
 
41
+ static async deriveKey(baseKey: string) {
42
+ const key = await crypto.subtle.importKey(
43
+ 'raw',
44
+ hexToU8a(baseKey),
45
+ {name: 'HMAC', hash: {name: 'SHA-256'}},
46
+ true,
47
+ ['sign', 'verify'],
48
+ );
49
+
50
+ return key;
51
+ }
52
+
40
53
  static async exportKey(key: CryptoKey) {
41
54
  const rawKey = await crypto.subtle.exportKey('raw', key);
42
55
  return base64url.encode(Buffer.from(rawKey));
@@ -20,5 +20,27 @@ describe('EDVService', () => {
20
20
  expect(keys.verificationKey).toBeDefined();
21
21
  });
22
22
  });
23
+
24
+ describe('deriveKeys', () => {
25
+ it('should derive EDV keys', async () => {
26
+ const testMasterKey = '0O+9vxwb3Zo/9AVcQfVeQ59wvgcYUVH/mTye6islspM=';
27
+ const derivedTestAgreementKey =
28
+ '{"id":"did:key:z6Mkt1paLGw6VqRCTmqjpbiP9fxLVHJb8k97zERL6TcWr9Ru#z6LSojEubzYtAGCBE7Mwwks7J3Gttsrd1c9EXcDuNjthwVQj","controller":"did:key:z6Mkt1paLGw6VqRCTmqjpbiP9fxLVHJb8k97zERL6TcWr9Ru","type":"X25519KeyAgreementKey2020","publicKeyMultibase":"z6LSojEubzYtAGCBE7Mwwks7J3Gttsrd1c9EXcDuNjthwVQj","privateKeyMultibase":"z3weoV5H5DppQ7pjABoopaiDFN6zH3SokESte2Jte87YNXgg"}';
29
+ const derivedTestHmacKey = 'AAkACzAAmgwPDgWQAMAAAAAOYAAAAA';
30
+ const derivedTestVerificationKey =
31
+ '{"id":"did:key:z6Mkt1paLGw6VqRCTmqjpbiP9fxLVHJb8k97zERL6TcWr9Ru#z6Mkt1paLGw6VqRCTmqjpbiP9fxLVHJb8k97zERL6TcWr9Ru","controller":"did:key:z6Mkt1paLGw6VqRCTmqjpbiP9fxLVHJb8k97zERL6TcWr9Ru","type":"Ed25519VerificationKey2018","publicKeyBase58":"EZZXk2gfAHvjMH1392kYJaQLfi2jirtmJDWQGBeVvveX","privateKeyBase58":"5BHUEjDDbDzQKnveM9qXXXmRqwTtmBvumTY2xZXN61x8dvZHgzsDaTpkVqkE4LSoMLcV6yDRhxcv7mMTzdaJ21pX"}';
32
+ const {agreementKey, hmacKey, verificationKey} =
33
+ await service.deriveKeys(testMasterKey);
34
+
35
+ expect(hmacKey).toBeDefined();
36
+ expect(hmacKey).toBe(derivedTestHmacKey);
37
+ expect(verificationKey).toBeDefined();
38
+ expect(JSON.stringify(verificationKey)).toBe(
39
+ derivedTestVerificationKey,
40
+ );
41
+ expect(agreementKey).toBeDefined();
42
+ expect(JSON.stringify(agreementKey)).toBe(derivedTestAgreementKey);
43
+ });
44
+ });
23
45
  });
24
46
  });
@@ -15,6 +15,10 @@ export class EDVServiceRpc extends RpcService {
15
15
  return this.call('generateKeys');
16
16
  }
17
17
 
18
+ deriveKeys() {
19
+ return this.call('deriveKeys');
20
+ }
21
+
18
22
  find(params: any) {
19
23
  return this.call('find', params);
20
24
  }
@@ -3,11 +3,14 @@ import {InitializeEDVParams, serviceName} from './configs';
3
3
  import EDVHTTPStorageInterface from '@docknetwork/universal-wallet/storage/edv-http-storage';
4
4
  import HMAC from './hmac';
5
5
  import {Ed25519VerificationKey2018} from '@digitalbazaar/ed25519-verification-key-2018';
6
+ import {Ed25519VerificationKey2020} from '@digitalbazaar/ed25519-verification-key-2020';
6
7
  import {X25519KeyAgreementKey2020} from '@digitalbazaar/x25519-key-agreement-key-2020';
7
8
  import {getKeypairFromDoc} from '@docknetwork/universal-wallet/methods/keypairs';
8
9
  import {logger} from '@docknetwork/wallet-sdk-data-store/src/logger';
9
10
  import {didService} from '@docknetwork/wallet-sdk-wasm/src/services/dids/service';
10
11
  import {keyringService} from '@docknetwork/wallet-sdk-wasm/src/services/keyring';
12
+ import {ed25519PairFromSeed} from '@polkadot/util-crypto';
13
+ import base64url from 'base64url-universal';
11
14
 
12
15
  /**
13
16
  * EDVService
@@ -19,6 +22,7 @@ export class EDVService {
19
22
 
20
23
  rpcMethods = [
21
24
  EDVService.prototype.generateKeys,
25
+ EDVService.prototype.deriveKeys,
22
26
  EDVService.prototype.initialize,
23
27
  EDVService.prototype.find,
24
28
  EDVService.prototype.update,
@@ -109,6 +113,24 @@ export class EDVService {
109
113
  return {verificationKey, agreementKey, hmacKey};
110
114
  }
111
115
 
116
+ async deriveKeys(masterKey: any) {
117
+ await keyringService.initialize({
118
+ ss58Format: 22,
119
+ });
120
+ const pair = ed25519PairFromSeed(base64url.decode(masterKey));
121
+
122
+ const keyPair = await didService.deriveKeyDoc({ pair });
123
+
124
+ const verificationKey = await Ed25519VerificationKey2018.from(keyPair);
125
+
126
+ const verificationKey2020 = await Ed25519VerificationKey2020.fromEd25519VerificationKey2018({ keyPair });
127
+ const agreementKey = await X25519KeyAgreementKey2020.fromEd25519VerificationKey2020({ keyPair: verificationKey2020 });
128
+
129
+ const hmacKey = await HMAC.exportKey(await HMAC.deriveKey(masterKey));
130
+
131
+ return { verificationKey, agreementKey, hmacKey };
132
+ }
133
+
112
134
  find(params: any) {
113
135
  return this.storageInterface.find(params);
114
136
  }
@@ -4,7 +4,9 @@ import {SumParams, validation} from './configs';
4
4
  export class ExampleService {
5
5
  rpcMethods = [ExampleService.prototype.sum];
6
6
 
7
- constructor() {}
7
+ constructor() {
8
+ this.name = 'example';
9
+ }
8
10
 
9
11
  sum(params: SumParams) {
10
12
  validation.sum(params);
@@ -1,5 +1,5 @@
1
1
  import {keyringService} from './keyring/service';
2
- import {dockService} from './dock/service';
2
+ import {blockchainService} from './blockchain/service';
3
3
  import {substrateService} from './substrate/service';
4
4
  import {walletService} from './wallet/service';
5
5
  import {polkadotService} from './polkadot/service';
@@ -14,7 +14,7 @@ import {edvService} from './edv/service';
14
14
 
15
15
  export default [
16
16
  keyringService,
17
- dockService,
17
+ blockchainService,
18
18
  substrateService,
19
19
  walletService,
20
20
  polkadotService,
@@ -47,6 +47,21 @@ export const validation = {
47
47
  assert(typeof meta === 'object', 'invalid meta');
48
48
  }
49
49
  },
50
+ createFromPair(params: CreateFromPairParams) {
51
+ const {pair, meta, type} = params;
52
+
53
+ assert(typeof pair === 'object', 'invalid pair');
54
+ assert(pair.publicKey instanceof Uint8Array, 'invalid publicKey');
55
+ assert(pair.secretKey instanceof Uint8Array, 'invalid secretKey');
56
+
57
+ if (type) {
58
+ assertKeyType(type);
59
+ }
60
+
61
+ if (meta) {
62
+ assert(typeof meta === 'object', 'invalid meta');
63
+ }
64
+ },
50
65
 
51
66
  signData(params: SignDataParams) {
52
67
  assert(!!params.keyPair, 'invalid keypair');
@@ -65,6 +80,12 @@ export type GetKeyringParams = {
65
80
  derivePath?: string,
66
81
  };
67
82
 
83
+ export type CreateFromPairParams = {
84
+ pair: any,
85
+ meta?: any,
86
+ type?: string,
87
+ }
88
+
68
89
  export type AddressFromUriParams = GetKeyringParams;
69
90
 
70
91
  export type AddFromJsonParams = {
@@ -5,6 +5,7 @@ import {
5
5
  AddFromJsonParams,
6
6
  AddFromMnemonicParams,
7
7
  CreateFromUriParams,
8
+ CreateFromPairParams,
8
9
  InitializeParams,
9
10
  serviceName,
10
11
  validation,
@@ -86,6 +87,18 @@ export class KeyringService {
86
87
  );
87
88
  }
88
89
 
90
+ createFromPair(params: CreateFromPairParams): KeyringPair {
91
+ validation.createFromPair(params);
92
+
93
+ const {pair, meta, type} = params;
94
+
95
+ return this.keyring.createFromPair(
96
+ pair,
97
+ meta,
98
+ type,
99
+ );
100
+ }
101
+
89
102
  getKeyringPairJSON(params: CreateFromUriParams): KeyringPair {
90
103
  return this.getKeyringPair(params).toJson();
91
104
  }
@@ -18,30 +18,41 @@ const pex: PEX = new PEX();
18
18
  * This is a temporary workaround until the issue is fixed in the @sphereon/pex library
19
19
  **/
20
20
  export function removeOptionalAttribute(presentationDefinition) {
21
- presentationDefinition.input_descriptors.forEach(inputDescriptor => {
21
+ // Deep clone the presentationDefinition to avoid mutating the original
22
+ const clonedPresentationDefinition = JSON.parse(
23
+ JSON.stringify(presentationDefinition),
24
+ );
25
+
26
+ clonedPresentationDefinition.input_descriptors.forEach(inputDescriptor => {
22
27
  if (!inputDescriptor.constraints?.fields?.length) {
23
28
  return;
24
29
  }
30
+
25
31
  // Filter the optional fields
26
- // If we include those fields, it might exclude few credentials from the resulsts
27
- // e.g: Expiration date as optional, a credenntial without expiration date should be included
28
32
  inputDescriptor.constraints.fields =
29
33
  inputDescriptor.constraints.fields.filter(
30
34
  field => field.optional !== true,
31
35
  );
32
36
 
33
- // Removes the optinal attributes from the fields
34
- // It applies in case optional: false
35
- // The field is required, but pex doesn't support the attribute
36
- inputDescriptor.constraints.fields.forEach(field => {
37
- if (field.optional !== undefined) {
38
- delete field.optional;
39
- }
40
- });
41
-
42
- // There is a case where ALL fields are optional
43
- // If we remove all fields, it will cause an error with PEX
44
- // So, we add a placeholder field to avoid the error
37
+ inputDescriptor.constraints.fields = inputDescriptor.constraints.fields.map(
38
+ field => {
39
+ const updatedField = {...field};
40
+
41
+ // Remove the optional attribute if it exists
42
+ if (updatedField.optional !== undefined) {
43
+ delete updatedField.optional;
44
+ }
45
+
46
+ // Remove the did format attribute if it exists
47
+ if (updatedField.filter?.format === 'did') {
48
+ delete updatedField.filter.format;
49
+ }
50
+
51
+ return updatedField;
52
+ },
53
+ );
54
+
55
+ // Handle case where all fields are optional
45
56
  if (inputDescriptor.constraints.fields.length === 0) {
46
57
  inputDescriptor.constraints.fields.push({
47
58
  path: ['$.id'],
@@ -49,11 +60,11 @@ export function removeOptionalAttribute(presentationDefinition) {
49
60
  }
50
61
  });
51
62
 
52
- if (!presentationDefinition.id) {
53
- presentationDefinition.id = 'id';
63
+ if (!clonedPresentationDefinition.id) {
64
+ clonedPresentationDefinition.id = 'id';
54
65
  }
55
66
 
56
- return presentationDefinition;
67
+ return clonedPresentationDefinition;
57
68
  }
58
69
 
59
70
  class PEXService {
@@ -371,6 +371,114 @@ describe('Pex Examples', () => {
371
371
  expect(results.verifiableCredential).toBeTruthy();
372
372
  });
373
373
 
374
+ it('should handle DID format filter', () => {
375
+ const presentationDefinition = {
376
+ id: 'df3d2615-7955-4f9d-b2df-ef5c6202bdaf',
377
+ input_descriptors: [
378
+ {
379
+ id: 'Credential 1',
380
+ name: 'Validate Test Credential',
381
+ purpose: 'verify Test credential',
382
+ constraints: {
383
+ fields: [
384
+ {
385
+ path: [
386
+ '$.issuer.id',
387
+ '$.issuer',
388
+ '$.vc.issuer.id',
389
+ '$.vc.issuer',
390
+ '$.iss',
391
+ ],
392
+ filter: {
393
+ const:
394
+ 'did:dock:5HPb8aoNXNQv5XxbupZRorHyc7CdBUYWFFxeczHxqVgeGPjT',
395
+ format: 'did',
396
+ },
397
+ optional: false,
398
+ predicate: 'required',
399
+ },
400
+ ],
401
+ },
402
+ },
403
+ ],
404
+ };
405
+
406
+ const credentials = [
407
+ {
408
+ '@context': [
409
+ 'https://www.w3.org/2018/credentials/v1',
410
+ 'https://ld.dock.io/credentials/extensions-v1',
411
+ 'https://ld.dock.io/security/bbs23/v1',
412
+ {
413
+ age: 'dk:age',
414
+ dk: 'https://ld.dock.io/credentials#',
415
+ grade: 'dk:grade',
416
+ graduated: 'dk:graduated',
417
+ },
418
+ ],
419
+ credentialStatus: {
420
+ id: 'dock:accumulator:0xfa7403ff3a3f3546a1fe443bf08a094492e08fa8c358c8abdda334598f68b52c',
421
+ type: 'DockVBAccumulator2022',
422
+ revocationCheck: 'membership',
423
+ revocationId: '17',
424
+ },
425
+ id: 'https://creds-testnet.dock.io/74c3a74fbad2fea4f7bb991092165a29de9fc7fb556ee71074755f7804bfaf0e',
426
+ type: ['VerifiableCredential', 'UniversityDegree'],
427
+ credentialSubject: {
428
+ graduated: true,
429
+ grade: 12,
430
+ age: 31,
431
+ },
432
+ issuanceDate: '2024-11-29T11:39:01.959Z',
433
+ issuer: {
434
+ name: 'Test',
435
+ description: ' ',
436
+ logo: 'https://img.dock.io/b1026229cdb6a2fbd59605ba7228db0a',
437
+ id: 'did:dock:5HPb8aoNXNQv5XxbupZRorHyc7CdBUYWFFxeczHxqVgeGPjT',
438
+ },
439
+ credentialSchema: {
440
+ id: 'https://schema.dock.io/Test-V2-1731009346611.json',
441
+ type: 'JsonSchemaValidator2018',
442
+ details:
443
+ '{"jsonSchema":{"$id":"https://schema.dock.io/Test-V2-1731009346611.json","$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":true,"description":"","name":"test University Degree","properties":{"@context":{"type":"string"},"credentialSchema":{"properties":{"details":{"type":"string"},"id":{"type":"string"},"type":{"type":"string"},"version":{"type":"string"}},"type":"object"},"credentialStatus":{"properties":{"id":{"type":"string"},"revocationCheck":{"type":"string"},"revocationId":{"type":"string"},"type":{"type":"string"}},"type":"object"},"credentialSubject":{"properties":{"age":{"description":"","title":"Age","type":"number"},"grade":{"title":"Grade","type":"number"},"graduated":{"default":false,"title":"Graduated","type":"boolean"}},"required":["graduated","age"],"type":"object"},"cryptoVersion":{"type":"string"},"id":{"type":"string"},"issuanceDate":{"format":"date-time","type":"string"},"issuer":{"properties":{"description":{"type":"string"},"id":{"type":"string"},"logo":{"type":"string"},"name":{"type":"string"}},"type":"object"},"name":{"type":"string"},"proof":{"properties":{"@context":{"items":[{"properties":{"proof":{"properties":{"@container":{"type":"string"},"@id":{"type":"string"},"@type":{"type":"string"}},"type":"object"},"sec":{"type":"string"}},"type":"object"},{"type":"string"}],"type":"array"},"created":{"format":"date-time","type":"string"},"proofPurpose":{"type":"string"},"type":{"type":"string"},"verificationMethod":{"type":"string"}},"type":"object"},"type":{"type":"string"}},"type":"object"},"parsingOptions":{"defaultDecimalPlaces":4,"defaultMinimumDate":-17592186044415,"defaultMinimumInteger":-4294967295,"useDefaults":true}}',
444
+ version: '0.4.0',
445
+ },
446
+ name: 'Test University Degree',
447
+ cryptoVersion: '0.6.0',
448
+ proof: {
449
+ '@context': [
450
+ {
451
+ sec: 'https://w3id.org/security#',
452
+ proof: {
453
+ '@id': 'sec:proof',
454
+ '@type': '@id',
455
+ '@container': '@graph',
456
+ },
457
+ },
458
+ 'https://ld.dock.io/security/bbs23/v1',
459
+ ],
460
+ type: 'Bls12381BBSSignatureDock2023',
461
+ created: '2024-11-29T11:39:15Z',
462
+ verificationMethod:
463
+ 'did:dock:5HPb8aoNXNQv5XxbupZRorHyc7CdBUYWFFxeczHxqVgeGPjT#keys-2',
464
+ proofPurpose: 'assertionMethod',
465
+ proofValue:
466
+ 'z2e9knFyNq7RPasmUbAASyQ5uALQHHdQsVTXQuLvQTRao6RNbkcyjTcAVBVpMTAZvdm2rW8qZFTCr8ATA1HMuAbZGJD2EM9gtyPFzXHfRUssKuo',
467
+ },
468
+ $$accum__witness$$:
469
+ '{"blockNo":9950875,"witness":"0x975eb3fa6bb302f0679103f187aa6cdb6732739eda6b0254b9a37573a684a5a1c27230f9b1a7a9b472db547b5a180ac7"}',
470
+ },
471
+ ];
472
+
473
+ const results = pexService.filterCredentials({
474
+ credentials,
475
+ presentationDefinition,
476
+ });
477
+
478
+ expect(results.verifiableCredential).toBeTruthy();
479
+ expect(results.verifiableCredential.length).toBe(1);
480
+ });
481
+
374
482
  describe('removeOptionalAttribute', () => {
375
483
  const getFieldsWithOptionalAttributes = template => {
376
484
  return template.input_descriptors[0].constraints.fields.filter(
@@ -410,8 +518,12 @@ describe('Pex Examples', () => {
410
518
  let result = removeOptionalAttribute(template);
411
519
  expect(getFieldsWithOptionalAttributes(result)).toBe(0);
412
520
  expect(result.input_descriptors[0].constraints.fields.length).toBe(1);
521
+ expect(result).not.toBe(template); // Ensure immutability
522
+ expect(template.input_descriptors[0].constraints.fields.length).toBe(2); // Original remains unchanged
523
+ });
413
524
 
414
- template = {
525
+ it('should handle fields with unsupported formats', () => {
526
+ let template = {
415
527
  id: 'income_test',
416
528
  input_descriptors: [
417
529
  {
@@ -422,6 +534,9 @@ describe('Pex Examples', () => {
422
534
  fields: [
423
535
  {
424
536
  path: ['$.credentialSubject.id'],
537
+ filter: {
538
+ format: 'did',
539
+ },
425
540
  },
426
541
  {
427
542
  path: ['$.type[*]'],
@@ -438,11 +553,17 @@ describe('Pex Examples', () => {
438
553
 
439
554
  expect(getFieldsWithOptionalAttributes(template)).toBe(1);
440
555
 
441
- result = removeOptionalAttribute(template);
556
+ let result = removeOptionalAttribute(template);
442
557
  expect(getFieldsWithOptionalAttributes(result)).toBe(0);
443
558
  expect(result.input_descriptors[0].constraints.fields.length).toBe(1);
559
+ expect(
560
+ result.input_descriptors[0].constraints.fields[0].filter?.format,
561
+ ).toBeUndefined();
562
+ expect(result).not.toBe(template); // Ensure immutability
563
+ });
444
564
 
445
- template = {
565
+ it('should handle templates with no optional attributes', () => {
566
+ let template = {
446
567
  id: 'income_test',
447
568
  input_descriptors: [
448
569
  {
@@ -461,11 +582,16 @@ describe('Pex Examples', () => {
461
582
  };
462
583
 
463
584
  expect(getFieldsWithOptionalAttributes(template)).toBe(0);
464
- result = removeOptionalAttribute(template);
585
+
586
+ let result = removeOptionalAttribute(template);
465
587
  expect(getFieldsWithOptionalAttributes(result)).toBe(0);
466
588
  expect(result.input_descriptors[0].constraints.fields.length).toBe(1);
589
+ // Ensure immutability
590
+ expect(result).not.toBe(template);
591
+ });
467
592
 
468
- template = {
593
+ it('should handle templates where all fields are optional', () => {
594
+ let template = {
469
595
  id: 'income_test',
470
596
  input_descriptors: [
471
597
  {
@@ -485,9 +611,40 @@ describe('Pex Examples', () => {
485
611
  };
486
612
 
487
613
  expect(getFieldsWithOptionalAttributes(template)).toBe(1);
488
- result = removeOptionalAttribute(template);
614
+
615
+ let result = removeOptionalAttribute(template);
489
616
  expect(getFieldsWithOptionalAttributes(result)).toBe(0);
490
617
  expect(result.input_descriptors[0].constraints.fields.length).toBe(1);
618
+ expect(result.input_descriptors[0].constraints.fields[0].path).toEqual([
619
+ '$.id',
620
+ ]);
621
+ expect(result).not.toBe(template); // Ensure immutability
622
+ });
623
+
624
+ it('should add a placeholder field if all fields are removed', () => {
625
+ let template = {
626
+ id: 'income_test',
627
+ input_descriptors: [
628
+ {
629
+ id: 'Credential 1',
630
+ constraints: {
631
+ fields: [
632
+ {
633
+ path: ['$.type[*]'],
634
+ optional: true,
635
+ },
636
+ ],
637
+ },
638
+ },
639
+ ],
640
+ };
641
+
642
+ let result = removeOptionalAttribute(template);
643
+ expect(result.input_descriptors[0].constraints.fields.length).toBe(1);
644
+ expect(result.input_descriptors[0].constraints.fields[0].path).toEqual([
645
+ '$.id',
646
+ ]);
647
+ expect(result).not.toBe(template); // Ensure immutability
491
648
  });
492
649
  });
493
650
  });