@docknetwork/wallet-sdk-relay-service 0.4.22 → 1.4.0
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/_rollupPluginBabelHelpers-4923c894.js +464 -0
- package/lib/_rollupPluginBabelHelpers-78739aa5.js +458 -0
- package/lib/did/dids.js +45 -0
- package/lib/did/dids.mjs +41 -0
- package/lib/didcomm.js +639 -0
- package/lib/didcomm.mjs +588 -0
- package/lib/index.js +492 -0
- package/lib/index.mjs +480 -0
- package/lib/payloads.js +146 -0
- package/lib/payloads.mjs +132 -0
- package/package.json +2 -2
- package/src/didcomm.js +43 -17
- package/tests/relay-service.e2e.test.js +2 -2
- package/src/did/did-resolver.js +0 -35
package/lib/payloads.mjs
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { _ as _asyncToGenerator, a as _regeneratorRuntime, d as _createForOfIteratorHelper } from './_rollupPluginBabelHelpers-78739aa5.js';
|
|
2
|
+
import VerifiableCredential from '@docknetwork/sdk/verifiable-credential';
|
|
3
|
+
import { cryptoWaitReady } from '@polkadot/util-crypto';
|
|
4
|
+
import { getSuiteFromKeyDoc } from '@docknetwork/sdk/utils/vc/helpers';
|
|
5
|
+
import { getKeypairFromDoc } from '@docknetwork/universal-wallet/methods/keypairs';
|
|
6
|
+
import assert from 'assert';
|
|
7
|
+
import base64url from 'base64url';
|
|
8
|
+
|
|
9
|
+
// 1 year
|
|
10
|
+
var DEFAULT_EXPIRATION = 86400 * 1000 * 365;
|
|
11
|
+
var isDIDDockRegex = /did:dock/gi;
|
|
12
|
+
function ensureDIDDockFragment(keyDoc) {
|
|
13
|
+
if (!isDIDDockRegex.test(keyDoc.id)) {
|
|
14
|
+
return keyDoc;
|
|
15
|
+
}
|
|
16
|
+
keyDoc.id = keyDoc.id.replace(/#.+/, '');
|
|
17
|
+
keyDoc.id = "".concat(keyDoc.id, "#keys-1");
|
|
18
|
+
return keyDoc;
|
|
19
|
+
}
|
|
20
|
+
function generateSignedPayload(_x, _x2) {
|
|
21
|
+
return _generateSignedPayload.apply(this, arguments);
|
|
22
|
+
}
|
|
23
|
+
function _generateSignedPayload() {
|
|
24
|
+
_generateSignedPayload = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(keyPairDoc, subject) {
|
|
25
|
+
var cred, keyPair, suite;
|
|
26
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
27
|
+
while (1) switch (_context.prev = _context.next) {
|
|
28
|
+
case 0:
|
|
29
|
+
assert(!!keyPairDoc, 'keyPairDoc is required');
|
|
30
|
+
assert(!!subject, 'subject is required');
|
|
31
|
+
_context.next = 4;
|
|
32
|
+
return cryptoWaitReady();
|
|
33
|
+
case 4:
|
|
34
|
+
keyPairDoc = ensureDIDDockFragment(keyPairDoc);
|
|
35
|
+
cred = new VerifiableCredential('dock:relay');
|
|
36
|
+
cred.setContext(['https://www.w3.org/2018/credentials/v1', {
|
|
37
|
+
dk: 'https://ld.dock.io/credentials#',
|
|
38
|
+
RelayAuthCredential: 'dk:RelayAuthCredential',
|
|
39
|
+
token: 'dk:token',
|
|
40
|
+
limit: 'dk:limit',
|
|
41
|
+
to: 'dk:to',
|
|
42
|
+
msg: 'dk:msg'
|
|
43
|
+
}]);
|
|
44
|
+
cred.setIssuanceDate(new Date().toISOString());
|
|
45
|
+
cred.setExpirationDate(new Date(Date.now() + DEFAULT_EXPIRATION).toISOString());
|
|
46
|
+
cred.setSubject(subject);
|
|
47
|
+
cred.setIssuer(keyPairDoc.controller);
|
|
48
|
+
cred.addType('RelayAuthCredential');
|
|
49
|
+
keyPair = getKeypairFromDoc(keyPairDoc);
|
|
50
|
+
keyPair.signer = keyPair.signer();
|
|
51
|
+
_context.next = 16;
|
|
52
|
+
return getSuiteFromKeyDoc(keyPair);
|
|
53
|
+
case 16:
|
|
54
|
+
suite = _context.sent;
|
|
55
|
+
_context.next = 19;
|
|
56
|
+
return cred.sign(suite);
|
|
57
|
+
case 19:
|
|
58
|
+
return _context.abrupt("return", {
|
|
59
|
+
payload: [subject, cred.issuanceDate, cred.expirationDate, cred.toJSON().proof],
|
|
60
|
+
did: keyPairDoc.controller
|
|
61
|
+
});
|
|
62
|
+
case 20:
|
|
63
|
+
case "end":
|
|
64
|
+
return _context.stop();
|
|
65
|
+
}
|
|
66
|
+
}, _callee);
|
|
67
|
+
}));
|
|
68
|
+
return _generateSignedPayload.apply(this, arguments);
|
|
69
|
+
}
|
|
70
|
+
function generateSignedPayloadFromList(_x3, _x4) {
|
|
71
|
+
return _generateSignedPayloadFromList.apply(this, arguments);
|
|
72
|
+
}
|
|
73
|
+
function _generateSignedPayloadFromList() {
|
|
74
|
+
_generateSignedPayloadFromList = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(keyPairDocs, subject) {
|
|
75
|
+
var payload, dids, _iterator, _step, keyPairDoc, _yield$generateSigned, signedPayload, did;
|
|
76
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
77
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
78
|
+
case 0:
|
|
79
|
+
payload = [];
|
|
80
|
+
dids = [];
|
|
81
|
+
_iterator = _createForOfIteratorHelper(keyPairDocs);
|
|
82
|
+
_context2.prev = 3;
|
|
83
|
+
_iterator.s();
|
|
84
|
+
case 5:
|
|
85
|
+
if ((_step = _iterator.n()).done) {
|
|
86
|
+
_context2.next = 16;
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
keyPairDoc = _step.value;
|
|
90
|
+
_context2.next = 9;
|
|
91
|
+
return generateSignedPayload(keyPairDoc, subject);
|
|
92
|
+
case 9:
|
|
93
|
+
_yield$generateSigned = _context2.sent;
|
|
94
|
+
signedPayload = _yield$generateSigned.payload;
|
|
95
|
+
did = _yield$generateSigned.did;
|
|
96
|
+
payload.push(signedPayload);
|
|
97
|
+
dids.push(did);
|
|
98
|
+
case 14:
|
|
99
|
+
_context2.next = 5;
|
|
100
|
+
break;
|
|
101
|
+
case 16:
|
|
102
|
+
_context2.next = 21;
|
|
103
|
+
break;
|
|
104
|
+
case 18:
|
|
105
|
+
_context2.prev = 18;
|
|
106
|
+
_context2.t0 = _context2["catch"](3);
|
|
107
|
+
_iterator.e(_context2.t0);
|
|
108
|
+
case 21:
|
|
109
|
+
_context2.prev = 21;
|
|
110
|
+
_iterator.f();
|
|
111
|
+
return _context2.finish(21);
|
|
112
|
+
case 24:
|
|
113
|
+
return _context2.abrupt("return", {
|
|
114
|
+
payload: payload,
|
|
115
|
+
dids: dids
|
|
116
|
+
});
|
|
117
|
+
case 25:
|
|
118
|
+
case "end":
|
|
119
|
+
return _context2.stop();
|
|
120
|
+
}
|
|
121
|
+
}, _callee2, null, [[3, 18, 21, 24]]);
|
|
122
|
+
}));
|
|
123
|
+
return _generateSignedPayloadFromList.apply(this, arguments);
|
|
124
|
+
}
|
|
125
|
+
function toBase64(payload) {
|
|
126
|
+
return base64url.encode(JSON.stringify(payload));
|
|
127
|
+
}
|
|
128
|
+
function fromBase64(payload) {
|
|
129
|
+
return JSON.parse(base64url.decode(payload));
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export { ensureDIDDockFragment, fromBase64, generateSignedPayload, generateSignedPayloadFromList, toBase64 };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@docknetwork/wallet-sdk-relay-service",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"license": "https://github.com/docknetwork/react-native-sdk/LICENSE",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"uuid": "^9.0.0",
|
|
15
15
|
"@docknetwork/minimal-cipher": "^5.2.1",
|
|
16
16
|
"@docknetwork/sdk": "8.6.0",
|
|
17
|
-
"@docknetwork/wallet-sdk-wasm": "
|
|
17
|
+
"@docknetwork/wallet-sdk-wasm": "1.4.0"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
20
|
"jest": "29.1.0",
|
package/src/didcomm.js
CHANGED
|
@@ -4,6 +4,7 @@ import {Ed25519VerificationKey2020} from '@digitalbazaar/ed25519-verification-ke
|
|
|
4
4
|
import {Cipher} from '@docknetwork/minimal-cipher';
|
|
5
5
|
import {v1 as uuidv1} from 'uuid';
|
|
6
6
|
import base64url from 'base64url';
|
|
7
|
+
import * as bs58 from 'base58-universal';
|
|
7
8
|
|
|
8
9
|
import {resolveDID} from './did/dids';
|
|
9
10
|
|
|
@@ -180,15 +181,27 @@ export function isDerivableKey(keyDoc) {
|
|
|
180
181
|
);
|
|
181
182
|
}
|
|
182
183
|
|
|
184
|
+
function getDIDKeydocsFromDIDDocument(didDocument) {
|
|
185
|
+
return [
|
|
186
|
+
...potentialToArray(didDocument.verificationMethod),
|
|
187
|
+
...potentialToArray(didDocument.keyAgreement),
|
|
188
|
+
...potentialToArray(didDocument.publicKey),
|
|
189
|
+
];
|
|
190
|
+
}
|
|
191
|
+
|
|
183
192
|
export async function getAgreementKeydocFromDID(did) {
|
|
184
193
|
if (!did) {
|
|
185
194
|
return undefined;
|
|
186
195
|
}
|
|
187
196
|
|
|
197
|
+
// Early out for polygon DIDs as they dont support this
|
|
198
|
+
if (did.startsWith('did:polygon')) {
|
|
199
|
+
throw new Error('PolygonID DIDs cannot be used for DIDComm purposes');
|
|
200
|
+
}
|
|
201
|
+
|
|
188
202
|
// Resolve actual DID document and get key agreement keys
|
|
189
203
|
const isDIDUrl = did.indexOf('#') !== -1;
|
|
190
204
|
const didDocument = await resolveDID(did);
|
|
191
|
-
|
|
192
205
|
const keyAgreements = didDocument.keyAgreement
|
|
193
206
|
? Array.isArray(didDocument.keyAgreement)
|
|
194
207
|
? didDocument.keyAgreement
|
|
@@ -214,11 +227,7 @@ export async function getAgreementKeydocFromDID(did) {
|
|
|
214
227
|
}
|
|
215
228
|
|
|
216
229
|
// No valid key agreement found on resolution, lets derive one from a ED25519 key if we can
|
|
217
|
-
const publicKeys = didDocument
|
|
218
|
-
? Array.isArray(didDocument.publicKey)
|
|
219
|
-
? didDocument.publicKey
|
|
220
|
-
: [didDocument.publicKey]
|
|
221
|
-
: [];
|
|
230
|
+
const publicKeys = getDIDKeydocsFromDIDDocument(didDocument);
|
|
222
231
|
|
|
223
232
|
// See if DID document has any derivable keys
|
|
224
233
|
const derivableKey = publicKeys.filter(isDerivableKey)[0];
|
|
@@ -231,26 +240,43 @@ export async function getAgreementKeydocFromDID(did) {
|
|
|
231
240
|
);
|
|
232
241
|
}
|
|
233
242
|
|
|
243
|
+
export const MULTIBASE_BASE58BTC_HEADER = 'z';
|
|
244
|
+
export const MULTICODEC_ED25519_PRIV_HEADER = new Uint8Array([0x80, 0x26]);
|
|
245
|
+
export const MULTICODEC_ED25519_PUB_HEADER = new Uint8Array([0xed, 0x01]);
|
|
246
|
+
export function encodeMbKey(header, key) {
|
|
247
|
+
const mbKey = new Uint8Array(header.length + key.length);
|
|
248
|
+
mbKey.set(header);
|
|
249
|
+
mbKey.set(key, header.length);
|
|
250
|
+
return MULTIBASE_BASE58BTC_HEADER + bs58.encode(mbKey);
|
|
251
|
+
}
|
|
252
|
+
|
|
234
253
|
export async function getDerivedAgreementKey(derivableKey) {
|
|
235
254
|
if (!isDerivableKey(derivableKey)) {
|
|
236
255
|
throw new Error(`Cannot derive X25519 KAK from type: ${derivableKey.type}`);
|
|
237
256
|
}
|
|
238
257
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
258
|
+
const publicKeyMultibase = derivableKey.publicKeyBase58
|
|
259
|
+
? encodeMbKey(
|
|
260
|
+
MULTICODEC_ED25519_PUB_HEADER,
|
|
261
|
+
bs58.decode(derivableKey.publicKeyBase58),
|
|
262
|
+
)
|
|
263
|
+
: derivableKey.publicKeyMultibase;
|
|
264
|
+
const privateKeyMultibase =
|
|
265
|
+
(derivableKey.privateKeyBase58
|
|
266
|
+
? encodeMbKey(
|
|
267
|
+
MULTICODEC_ED25519_PRIV_HEADER,
|
|
268
|
+
bs58.decode(derivableKey.privateKeyBase58),
|
|
269
|
+
)
|
|
270
|
+
: undefined) || derivableKey.privateKeyMultibase;
|
|
248
271
|
|
|
249
272
|
// Convert ed25519 2020 verification key into a key agreement key
|
|
250
273
|
const derivedKeyAgreement =
|
|
251
274
|
X25519KeyAgreementKey2020.fromEd25519VerificationKey2020({
|
|
252
|
-
keyPair:
|
|
253
|
-
|
|
275
|
+
keyPair: {
|
|
276
|
+
publicKeyMultibase,
|
|
277
|
+
privateKeyMultibase,
|
|
278
|
+
controller: derivableKey.controller,
|
|
279
|
+
},
|
|
254
280
|
});
|
|
255
281
|
return derivedKeyAgreement;
|
|
256
282
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
+
import {dockService} from '@docknetwork/wallet-sdk-wasm/src/services/dock';
|
|
1
2
|
import {RelayService} from '../lib';
|
|
2
|
-
import {dock} from '../lib/did/did-resolver';
|
|
3
3
|
import {ALICE_KEY_PAIR_DOC, BOB_KEY_PAIR_DOC} from './mock-data';
|
|
4
4
|
|
|
5
5
|
describe('Relay service', () => {
|
|
6
6
|
const messageContent = `Test message ${Date.now()}`;
|
|
7
7
|
|
|
8
8
|
beforeAll(async () => {
|
|
9
|
-
await
|
|
9
|
+
await dockService.init({
|
|
10
10
|
address: 'wss://knox-1.dock.io',
|
|
11
11
|
});
|
|
12
12
|
});
|
package/src/did/did-resolver.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DockResolver,
|
|
3
|
-
DIDKeyResolver,
|
|
4
|
-
WildcardMultiResolver,
|
|
5
|
-
UniversalResolver,
|
|
6
|
-
} from '@docknetwork/sdk/resolver';
|
|
7
|
-
import dock from '@docknetwork/sdk';
|
|
8
|
-
|
|
9
|
-
// Create a resolver in order to lookup DIDs for verifying
|
|
10
|
-
export const universalResolverUrl = 'https://uniresolver.io';
|
|
11
|
-
|
|
12
|
-
// class WalletSDKResolver extends WildcardMultiResolver {
|
|
13
|
-
// static PREFIX = WILDCARD;
|
|
14
|
-
// static METHOD = WILDCARD;
|
|
15
|
-
|
|
16
|
-
// async resolve(did) {
|
|
17
|
-
// const trimmedDID = did.split('#')[0];
|
|
18
|
-
// const document = await super.resolve(trimmedDID);
|
|
19
|
-
// return document;
|
|
20
|
-
// }
|
|
21
|
-
// }
|
|
22
|
-
|
|
23
|
-
export const resolver = new WildcardMultiResolver(
|
|
24
|
-
// {
|
|
25
|
-
// dock: new DockResolver(dock), // Prebuilt resolver
|
|
26
|
-
// key: new DIDKeyResolver(), // did:key resolution
|
|
27
|
-
// },
|
|
28
|
-
[
|
|
29
|
-
new DockResolver(dock),
|
|
30
|
-
new DIDKeyResolver(),
|
|
31
|
-
new UniversalResolver(universalResolverUrl),
|
|
32
|
-
],
|
|
33
|
-
);
|
|
34
|
-
|
|
35
|
-
export {dock};
|