@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.
- package/lib/{account-3c88155a.js → account-bf00e5c0.js} +5 -5
- package/lib/{account-8f5cbc4d.js → account-e48dc9b6.js} +5 -5
- package/lib/core/polkadot-utils.js +18 -4
- package/lib/core/polkadot-utils.mjs +15 -2
- package/lib/index.js +14 -17
- package/lib/index.mjs +14 -17
- package/lib/modules/account.js +9 -5
- package/lib/modules/account.mjs +9 -5
- package/lib/modules/accounts.js +9 -5
- package/lib/modules/accounts.mjs +9 -5
- package/lib/modules/network-manager.js +4 -2
- package/lib/modules/network-manager.mjs +4 -2
- package/lib/modules/wallet.js +12 -8
- package/lib/modules/wallet.mjs +12 -8
- package/lib/rpc-server.js +14 -17
- package/lib/rpc-server.mjs +14 -17
- package/lib/services/blockchain/configs.js +7 -0
- package/lib/services/blockchain/configs.mjs +3 -0
- package/lib/services/{dock → blockchain}/index.android.js +3 -4
- package/lib/services/{dock → blockchain}/index.android.mjs +3 -4
- package/lib/services/{dock → blockchain}/index.ios.js +3 -4
- package/lib/services/{dock → blockchain}/index.ios.mjs +3 -4
- package/lib/services/blockchain/index.js +30 -0
- package/lib/services/blockchain/index.mjs +22 -0
- package/lib/services/{dock → blockchain}/service-rpc.js +5 -7
- package/lib/services/{dock → blockchain}/service-rpc.mjs +5 -7
- package/lib/services/blockchain/service.js +212 -0
- package/lib/services/blockchain/service.mjs +206 -0
- package/lib/services/credential/bbs-revocation.js +33 -61
- package/lib/services/credential/bbs-revocation.mjs +34 -62
- package/lib/services/credential/bound-check.js +0 -8
- package/lib/services/credential/bound-check.mjs +1 -5
- package/lib/services/credential/index.js +20 -23
- package/lib/services/credential/index.mjs +20 -23
- package/lib/services/credential/pex-helpers.js +134 -34
- package/lib/services/credential/pex-helpers.mjs +133 -35
- package/lib/services/credential/service.js +54 -55
- package/lib/services/credential/service.mjs +43 -41
- package/lib/services/credential/utils.js +12 -18
- package/lib/services/credential/utils.mjs +11 -14
- package/lib/services/dids/config.js +8 -0
- package/lib/services/dids/config.mjs +8 -0
- package/lib/services/dids/index.js +8 -7
- package/lib/services/dids/index.mjs +8 -7
- package/lib/services/dids/service-rpc.js +2 -2
- package/lib/services/dids/service-rpc.mjs +2 -2
- package/lib/services/dids/service.js +22 -32
- package/lib/services/dids/service.mjs +22 -32
- package/lib/services/edv/hmac.js +5 -0
- package/lib/services/edv/hmac.mjs +5 -0
- package/lib/services/edv/index.js +10 -8
- package/lib/services/edv/index.mjs +10 -8
- package/lib/services/edv/service-rpc.js +4 -0
- package/lib/services/edv/service-rpc.mjs +4 -0
- package/lib/services/edv/service.js +26 -10
- package/lib/services/edv/service.mjs +25 -10
- package/lib/services/example/service.js +3 -1
- package/lib/services/example/service.mjs +3 -1
- package/lib/services/index.js +12 -15
- package/lib/services/index.mjs +12 -15
- package/lib/services/keyring/configs.js +12 -0
- package/lib/services/keyring/configs.mjs +12 -0
- package/lib/services/keyring/service.js +5 -0
- package/lib/services/keyring/service.mjs +5 -0
- package/lib/services/pex/service.js +17 -15
- package/lib/services/pex/service.mjs +17 -15
- package/lib/services/substrate/api-utils.js +18 -6
- package/lib/services/substrate/api-utils.mjs +18 -6
- package/lib/services/substrate/index.js +13 -6
- package/lib/services/substrate/index.mjs +13 -6
- package/lib/services/substrate/service.js +16 -9
- package/lib/services/substrate/service.mjs +16 -9
- package/lib/services/test-utils.js +27 -18
- package/lib/services/test-utils.mjs +27 -18
- package/lib/services/trust-registry/index.js +16 -5
- package/lib/services/trust-registry/index.mjs +16 -5
- package/lib/services/trust-registry/service.js +26 -10
- package/lib/services/trust-registry/service.mjs +26 -10
- package/lib/services/util-crypto/configs.js +3 -0
- package/lib/services/util-crypto/configs.mjs +3 -0
- package/lib/services/util-crypto/service-rpc.js +6 -0
- package/lib/services/util-crypto/service-rpc.mjs +6 -0
- package/lib/services/util-crypto/service.js +5 -0
- package/lib/services/util-crypto/service.mjs +6 -1
- package/lib/setup-nodejs.js +14 -17
- package/lib/setup-nodejs.mjs +14 -17
- package/lib/setup-tests.js +14 -17
- package/lib/setup-tests.mjs +14 -17
- package/lib/src/core/polkadot-utils.d.ts +1 -0
- package/lib/src/core/polkadot-utils.d.ts.map +1 -1
- package/lib/src/modules/network-manager.d.ts +1 -0
- package/lib/src/modules/network-manager.d.ts.map +1 -1
- package/lib/src/services/blockchain/configs.d.ts +8 -0
- package/lib/src/services/blockchain/configs.d.ts.map +1 -0
- package/lib/src/services/blockchain/index.d.ts +2 -0
- package/lib/src/services/blockchain/index.d.ts.map +1 -0
- package/lib/src/services/{dock → blockchain}/service.d.ts +12 -11
- package/lib/src/services/blockchain/service.d.ts.map +1 -0
- package/lib/src/services/credential/bbs-revocation.d.ts.map +1 -1
- package/lib/src/services/credential/bound-check.d.ts +0 -4
- package/lib/src/services/credential/bound-check.d.ts.map +1 -1
- package/lib/src/services/credential/index.d.ts +2 -7
- package/lib/src/services/credential/index.d.ts.map +1 -1
- package/lib/src/services/credential/pex-helpers.d.ts +5 -3
- package/lib/src/services/credential/pex-helpers.d.ts.map +1 -1
- package/lib/src/services/credential/service.d.ts +2 -7
- package/lib/src/services/credential/service.d.ts.map +1 -1
- package/lib/src/services/credential/utils.d.ts.map +1 -1
- package/lib/src/services/dids/config.d.ts +5 -0
- package/lib/src/services/dids/config.d.ts.map +1 -1
- package/lib/src/services/dids/service-rpc.d.ts +1 -1
- package/lib/src/services/dids/service-rpc.d.ts.map +1 -1
- package/lib/src/services/dids/service.d.ts +9 -7
- package/lib/src/services/dids/service.d.ts.map +1 -1
- package/lib/src/services/edv/hmac.d.ts +1 -0
- package/lib/src/services/edv/hmac.d.ts.map +1 -1
- package/lib/src/services/edv/service.d.ts +5 -0
- package/lib/src/services/edv/service.d.ts.map +1 -1
- package/lib/src/services/example/service.d.ts.map +1 -1
- package/lib/src/services/keyring/configs.d.ts +6 -0
- package/lib/src/services/keyring/configs.d.ts.map +1 -1
- package/lib/src/services/pex/service.d.ts.map +1 -1
- package/lib/src/services/trust-registry/service.d.ts.map +1 -1
- package/lib/src/services/util-crypto/configs.d.ts +1 -0
- package/lib/src/services/util-crypto/configs.d.ts.map +1 -1
- package/lib/src/services/util-crypto/service.d.ts +1 -0
- package/lib/src/services/util-crypto/service.d.ts.map +1 -1
- package/lib/test/setup-test-state.js +10 -6
- package/lib/test/setup-test-state.mjs +10 -6
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -7
- package/src/core/polkadot-utils.js +14 -3
- package/src/modules/network-manager.ts +5 -2
- package/src/modules/wallet.ts +5 -5
- package/src/services/blockchain/configs.ts +11 -0
- package/src/services/blockchain/index.android.js +3 -0
- package/src/services/blockchain/index.ios.js +3 -0
- package/src/services/blockchain/index.js +1 -0
- package/src/services/blockchain/index.test.js +34 -0
- package/src/services/{dock → blockchain}/service-rpc.js +5 -6
- package/src/services/blockchain/service.ts +261 -0
- package/src/services/credential/bbs-revocation.ts +42 -90
- package/src/services/credential/bound-check.test.ts +2 -5
- package/src/services/credential/bound-check.ts +0 -5
- package/src/services/credential/index.test.js +148 -7
- package/src/services/credential/pex-helpers.js +132 -34
- package/src/services/credential/pex-helpers.test.js +284 -27
- package/src/services/credential/service.ts +44 -27
- package/src/services/credential/utils.js +5 -14
- package/src/services/dids/config.ts +15 -0
- package/src/services/dids/index.test.js +5 -46
- package/src/services/dids/service-rpc.ts +2 -2
- package/src/services/dids/service.ts +17 -34
- package/src/services/edv/hmac.ts +13 -0
- package/src/services/edv/index.test.js +22 -0
- package/src/services/edv/service-rpc.js +4 -0
- package/src/services/edv/service.ts +22 -0
- package/src/services/example/service.ts +3 -1
- package/src/services/index.js +2 -2
- package/src/services/keyring/configs.ts +21 -0
- package/src/services/keyring/service.ts +13 -0
- package/src/services/pex/service.ts +29 -18
- package/src/services/pex/tests/pex-service.test.js +163 -6
- package/src/services/substrate/api-utils.test.js +7 -7
- package/src/services/substrate/api-utils.ts +3 -3
- package/src/services/substrate/service.ts +6 -6
- package/src/services/test-utils.js +13 -11
- package/src/services/trust-registry/index.test.js +6 -4
- package/src/services/trust-registry/service.ts +13 -7
- package/src/services/util-crypto/configs.ts +4 -0
- package/src/services/util-crypto/service-rpc.js +6 -0
- package/src/services/util-crypto/service.ts +8 -0
- package/src/test/setup-test-state.js +2 -2
- package/lib/services/dock/configs.js +0 -18
- package/lib/services/dock/configs.mjs +0 -10
- package/lib/services/dock/index.js +0 -18
- package/lib/services/dock/index.mjs +0 -10
- package/lib/services/dock/service.js +0 -136
- package/lib/services/dock/service.mjs +0 -128
- package/lib/src/services/dock/configs.d.ts +0 -7
- package/lib/src/services/dock/configs.d.ts.map +0 -1
- package/lib/src/services/dock/index.d.ts +0 -2
- package/lib/src/services/dock/index.d.ts.map +0 -1
- package/lib/src/services/dock/service.d.ts.map +0 -1
- package/src/services/dock/configs.ts +0 -12
- package/src/services/dock/index.android.js +0 -3
- package/src/services/dock/index.ios.js +0 -3
- package/src/services/dock/index.js +0 -1
- package/src/services/dock/index.test.js +0 -48
- package/src/services/dock/service.ts +0 -159
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import {assertRpcService
|
|
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 {
|
|
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
|
|
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
|
-
|
|
22
|
-
return this.call('
|
|
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 {
|
|
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,
|
|
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.
|
|
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 =
|
|
146
|
-
const result = await
|
|
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();
|
package/src/services/edv/hmac.ts
CHANGED
|
@@ -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
|
});
|
|
@@ -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
|
}
|
package/src/services/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {keyringService} from './keyring/service';
|
|
2
|
-
import {
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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 (!
|
|
53
|
-
|
|
63
|
+
if (!clonedPresentationDefinition.id) {
|
|
64
|
+
clonedPresentationDefinition.id = 'id';
|
|
54
65
|
}
|
|
55
66
|
|
|
56
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
});
|