@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.
@@ -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": "0.4.22",
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": "0.4.19"
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.publicKey
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
- if (!derivableKey.publicKeyMultibase) {
240
- derivableKey.publicKeyMultibase = derivableKey.publicKeyBase58;
241
- }
242
-
243
- // Convert derivable key into latest 2020 format
244
- const ed2020VerificationKey = await Ed25519VerificationKey2020.from({
245
- keyPair: derivableKey,
246
- ...derivableKey,
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: ed2020VerificationKey,
253
- ...ed2020VerificationKey,
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 dock.init({
9
+ await dockService.init({
10
10
  address: 'wss://knox-1.dock.io',
11
11
  });
12
12
  });
@@ -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};