@bitgo-beta/sdk-lib-mpc 8.2.0-beta.167 → 8.2.0-beta.1671

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 (78) hide show
  1. package/dist/src/curves/ed25519.d.ts +0 -1
  2. package/dist/src/curves/ed25519.d.ts.map +1 -1
  3. package/dist/src/curves/ed25519.js +12 -12
  4. package/dist/src/curves/ed25519Bip32HdTree.js +14 -14
  5. package/dist/src/curves/index.js +6 -2
  6. package/dist/src/curves/secp256k1.d.ts +0 -1
  7. package/dist/src/curves/secp256k1.d.ts.map +1 -1
  8. package/dist/src/curves/secp256k1.js +22 -38
  9. package/dist/src/curves/secp256k1Bip32HdTree.js +10 -10
  10. package/dist/src/curves/types.d.ts +2 -3
  11. package/dist/src/curves/types.d.ts.map +1 -1
  12. package/dist/src/curves/util.d.ts +2 -0
  13. package/dist/src/curves/util.d.ts.map +1 -1
  14. package/dist/src/curves/util.js +34 -3
  15. package/dist/src/hashCommitment.d.ts +0 -1
  16. package/dist/src/hashCommitment.d.ts.map +1 -1
  17. package/dist/src/hashCommitment.js +7 -8
  18. package/dist/src/index.d.ts +1 -1
  19. package/dist/src/index.d.ts.map +1 -1
  20. package/dist/src/index.js +24 -10
  21. package/dist/src/openssl/index.js +6 -2
  22. package/dist/src/openssl/openssl.d.ts +1 -2
  23. package/dist/src/openssl/openssl.d.ts.map +1 -1
  24. package/dist/src/openssl/openssl.js +4 -12
  25. package/dist/src/safePrime.d.ts +3 -0
  26. package/dist/src/safePrime.d.ts.map +1 -0
  27. package/dist/src/safePrime.js +19 -0
  28. package/dist/src/schnorrProof.d.ts +0 -1
  29. package/dist/src/schnorrProof.d.ts.map +1 -1
  30. package/dist/src/schnorrProof.js +8 -9
  31. package/dist/src/shamir/index.js +6 -2
  32. package/dist/src/shamir/shamir.js +2 -2
  33. package/dist/src/shamir/types.d.ts +1 -1
  34. package/dist/src/shamir/types.d.ts.map +1 -1
  35. package/dist/src/tss/ecdsa/index.js +23 -9
  36. package/dist/src/tss/ecdsa/paillierproof.js +10 -10
  37. package/dist/src/tss/ecdsa/rangeproof.d.ts +1 -2
  38. package/dist/src/tss/ecdsa/rangeproof.d.ts.map +1 -1
  39. package/dist/src/tss/ecdsa/rangeproof.js +108 -118
  40. package/dist/src/tss/ecdsa/types.d.ts +28 -17
  41. package/dist/src/tss/ecdsa/types.d.ts.map +1 -1
  42. package/dist/src/tss/ecdsa/types.js +29 -31
  43. package/dist/src/tss/ecdsa/zkVProof.d.ts +0 -1
  44. package/dist/src/tss/ecdsa/zkVProof.d.ts.map +1 -1
  45. package/dist/src/tss/ecdsa/zkVProof.js +9 -10
  46. package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts +42 -0
  47. package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts.map +1 -0
  48. package/dist/src/tss/ecdsa-dkls/commsLayer.js +235 -0
  49. package/dist/src/tss/ecdsa-dkls/dkg.d.ts +62 -0
  50. package/dist/src/tss/ecdsa-dkls/dkg.d.ts.map +1 -0
  51. package/dist/src/tss/ecdsa-dkls/dkg.js +326 -0
  52. package/dist/src/tss/ecdsa-dkls/dsg.d.ts +47 -0
  53. package/dist/src/tss/ecdsa-dkls/dsg.d.ts.map +1 -0
  54. package/dist/src/tss/ecdsa-dkls/dsg.js +266 -0
  55. package/dist/src/tss/ecdsa-dkls/index.d.ts +6 -0
  56. package/dist/src/tss/ecdsa-dkls/index.d.ts.map +1 -0
  57. package/dist/src/tss/ecdsa-dkls/index.js +42 -0
  58. package/dist/src/tss/ecdsa-dkls/types.d.ts +128 -0
  59. package/dist/src/tss/ecdsa-dkls/types.d.ts.map +1 -0
  60. package/dist/src/tss/ecdsa-dkls/types.js +175 -0
  61. package/dist/src/tss/ecdsa-dkls/util.d.ts +26 -0
  62. package/dist/src/tss/ecdsa-dkls/util.d.ts.map +1 -0
  63. package/dist/src/tss/ecdsa-dkls/util.js +276 -0
  64. package/dist/src/tss/index.d.ts +1 -0
  65. package/dist/src/tss/index.d.ts.map +1 -1
  66. package/dist/src/tss/index.js +7 -2
  67. package/dist/src/types.d.ts +0 -1
  68. package/dist/src/types.d.ts.map +1 -1
  69. package/dist/src/util.d.ts +0 -1
  70. package/dist/src/util.d.ts.map +1 -1
  71. package/dist/src/util.js +21 -22
  72. package/dist/tsconfig.tsbuildinfo +1 -1
  73. package/package.json +27 -5
  74. package/.eslintignore +0 -5
  75. package/CHANGELOG.md +0 -228
  76. package/dist/src/openssl/opensslbytes.d.ts +0 -4
  77. package/dist/src/openssl/opensslbytes.d.ts.map +0 -1
  78. package/dist/src/openssl/opensslbytes.js +0 -20
@@ -0,0 +1,326 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Dkg = void 0;
37
+ const cbor_x_1 = require("cbor-x");
38
+ const curves_1 = require("../../curves");
39
+ const util_1 = require("../../util");
40
+ const types_1 = require("./types");
41
+ class Dkg {
42
+ constructor(n, t, partyIdx, seed, retrofitData, dklsWasm) {
43
+ this.dkgState = types_1.DkgState.Uninitialized;
44
+ this.n = n;
45
+ this.t = t;
46
+ this.partyIdx = partyIdx;
47
+ this.chainCodeCommitment = undefined;
48
+ this.retrofitData = retrofitData;
49
+ this.seed = seed;
50
+ this.dklsWasm = dklsWasm ?? null;
51
+ }
52
+ async loadDklsWasm() {
53
+ if (!this.dklsWasm) {
54
+ this.dklsWasm = await Promise.resolve().then(() => __importStar(require('@silencelaboratories/dkls-wasm-ll-node')));
55
+ }
56
+ }
57
+ getDklsWasm() {
58
+ if (!this.dklsWasm) {
59
+ throw Error('DKLS wasm not loaded');
60
+ }
61
+ return this.dklsWasm;
62
+ }
63
+ _restoreSession() {
64
+ if (!this.dkgSession) {
65
+ this.dkgSession = this.getDklsWasm().KeygenSession.fromBytes(this.dkgSessionBytes);
66
+ }
67
+ }
68
+ _createDKLsRetrofitKeyShare() {
69
+ if (this.retrofitData) {
70
+ if (!this.retrofitData.xShare.y || !this.retrofitData.xShare.chaincode || !this.retrofitData.xShare.x) {
71
+ throw Error('xShare must have a public key, private share value, and a chaincode.');
72
+ }
73
+ const xiList = [];
74
+ for (let i = 0; i < this.n; i++) {
75
+ xiList.push(Array.from((0, util_1.bigIntToBufferBE)(BigInt(i + 1), 32)));
76
+ }
77
+ const secp256k1 = new curves_1.Secp256k1Curve();
78
+ const dklsKeyShare = {
79
+ total_parties: this.n,
80
+ threshold: this.t,
81
+ rank_list: new Array(this.n).fill(0),
82
+ party_id: this.partyIdx,
83
+ public_key: Array.from(Buffer.from(this.retrofitData.xShare.y, 'hex')),
84
+ root_chain_code: Array.from(Buffer.from(this.retrofitData.xShare.chaincode, 'hex')),
85
+ final_session_id: Array(32).fill(0),
86
+ seed_ot_receivers: new Array(this.n - 1).fill(Array(32832).fill(0)),
87
+ seed_ot_senders: new Array(this.n - 1).fill(Array(32768).fill(0)),
88
+ sent_seed_list: [Array(32).fill(0)],
89
+ rec_seed_list: [Array(32).fill(0)],
90
+ s_i: Array.from(Buffer.from(this.retrofitData.xShare.x, 'hex')),
91
+ // big_s_list is now created internally during the protocol so isn't needed here, however a valid KeyShare object needs to have it.
92
+ // a dummy public key is used to fill big_s_list.
93
+ big_s_list: new Array(this.n).fill(Array.from((0, util_1.bigIntToBufferBE)(secp256k1.basePointMult(BigInt('0x' + this.retrofitData.xShare.x))))),
94
+ x_i_list: this.retrofitData.xiList ? this.retrofitData.xiList : xiList,
95
+ };
96
+ this.dklsKeyShareRetrofitObject = this.getDklsWasm().Keyshare.fromBytes((0, cbor_x_1.encode)(dklsKeyShare));
97
+ }
98
+ }
99
+ _deserializeState() {
100
+ if (!this.dkgSession) {
101
+ throw Error('Session not intialized');
102
+ }
103
+ const round = (0, cbor_x_1.decode)(this.dkgSession.toBytes()).round;
104
+ switch (round) {
105
+ case 'WaitMsg1':
106
+ this.dkgState = types_1.DkgState.Round1;
107
+ break;
108
+ case 'WaitMsg2':
109
+ this.dkgState = types_1.DkgState.Round2;
110
+ break;
111
+ case 'WaitMsg3':
112
+ this.dkgState = types_1.DkgState.Round3;
113
+ break;
114
+ case 'WaitMsg4':
115
+ this.dkgState = types_1.DkgState.Round4;
116
+ break;
117
+ case 'Ended':
118
+ this.dkgState = types_1.DkgState.Complete;
119
+ break;
120
+ default:
121
+ this.dkgState = types_1.DkgState.InvalidState;
122
+ throw Error(`Invalid State: ${round}`);
123
+ }
124
+ }
125
+ async initDkg() {
126
+ if (!this.dklsWasm) {
127
+ await this.loadDklsWasm();
128
+ }
129
+ if (this.t > this.n || this.partyIdx >= this.n) {
130
+ throw Error('Invalid parameters for DKG');
131
+ }
132
+ if (this.dkgState != types_1.DkgState.Uninitialized) {
133
+ throw Error('DKG session already initialized');
134
+ }
135
+ if (typeof window !== 'undefined' &&
136
+ /* checks for electron processes */
137
+ !window.process &&
138
+ !window.process?.['type']) {
139
+ /* This is only needed for browsers/web because it uses fetch to resolve the wasm asset for the web */
140
+ const initDkls = await Promise.resolve().then(() => __importStar(require('@silencelaboratories/dkls-wasm-ll-web')));
141
+ await initDkls.default();
142
+ }
143
+ this._createDKLsRetrofitKeyShare();
144
+ if (this.seed && this.seed.length !== 32) {
145
+ throw Error(`Seed should be 32 bytes, got ${this.seed.length}.`);
146
+ }
147
+ const { KeygenSession } = this.getDklsWasm();
148
+ if (this.dklsKeyShareRetrofitObject) {
149
+ this.dkgSession = this.seed
150
+ ? KeygenSession.initKeyRotation(this.dklsKeyShareRetrofitObject, new Uint8Array(this.seed))
151
+ : KeygenSession.initKeyRotation(this.dklsKeyShareRetrofitObject);
152
+ }
153
+ else {
154
+ this.dkgSession = this.seed
155
+ ? new KeygenSession(this.n, this.t, this.partyIdx, new Uint8Array(this.seed))
156
+ : new KeygenSession(this.n, this.t, this.partyIdx);
157
+ }
158
+ try {
159
+ const payload = this.dkgSession.createFirstMessage().payload;
160
+ this.dkgSessionBytes = this.dkgSession.toBytes();
161
+ this._deserializeState();
162
+ return {
163
+ payload: payload,
164
+ from: this.partyIdx,
165
+ };
166
+ }
167
+ catch (e) {
168
+ throw Error(`Error while creating the first message from party ${this.partyIdx}: ${e}`);
169
+ }
170
+ }
171
+ getKeyShare() {
172
+ if (!this.keyShareBuff) {
173
+ throw Error('Can not get key share, DKG is not complete yet.');
174
+ }
175
+ return this.keyShareBuff;
176
+ }
177
+ /**
178
+ * Returns a CBOR-encoded ReducedKeyShare buffer containing the party's private
179
+ * scalar (s_i) in the `prv` field. This buffer is private key material.
180
+ * The caller encrypts it and stores it as `reducedEncryptedPrv` on the key card QR code.
181
+ */
182
+ getReducedKeyShare() {
183
+ if (!this.keyShareBuff) {
184
+ throw Error('Can not get key share, DKG is not complete yet.');
185
+ }
186
+ const decodedKeyshare = (0, cbor_x_1.decode)(this.keyShareBuff);
187
+ const reducedKeyShare = {
188
+ bigSList: decodedKeyshare.big_s_list,
189
+ xList: decodedKeyshare.x_i_list,
190
+ rootChainCode: decodedKeyshare.root_chain_code,
191
+ prv: decodedKeyshare.s_i,
192
+ pub: decodedKeyshare.public_key,
193
+ };
194
+ const encodedKeyShare = (0, cbor_x_1.encode)(reducedKeyShare);
195
+ return encodedKeyShare;
196
+ }
197
+ handleIncomingMessages(messagesForIthRound) {
198
+ let nextRoundMessages = [];
199
+ let nextRoundDeserializedMessages = { broadcastMessages: [], p2pMessages: [] };
200
+ this._restoreSession();
201
+ if (!this.dkgSession) {
202
+ throw Error('Session not initialized');
203
+ }
204
+ const { Message } = this.getDklsWasm();
205
+ try {
206
+ if (this.dkgState === types_1.DkgState.Round3) {
207
+ const commitmentsUnsorted = messagesForIthRound.p2pMessages
208
+ .map((m) => {
209
+ return { from: m.from, commitment: m.commitment };
210
+ })
211
+ .concat([{ from: this.partyIdx, commitment: this.chainCodeCommitment }]);
212
+ const commitmentsSorted = commitmentsUnsorted
213
+ .sort((a, b) => {
214
+ return a.from - b.from;
215
+ })
216
+ .map((c) => c.commitment);
217
+ nextRoundMessages = this.dkgSession.handleMessages(messagesForIthRound.broadcastMessages
218
+ .map((m) => new Message(m.payload, m.from, undefined))
219
+ .concat(messagesForIthRound.p2pMessages.map((m) => new Message(m.payload, m.from, m.to))), commitmentsSorted);
220
+ }
221
+ else {
222
+ nextRoundMessages = this.dkgSession.handleMessages(messagesForIthRound.broadcastMessages
223
+ .map((m) => new Message(m.payload, m.from, undefined))
224
+ .concat(messagesForIthRound.p2pMessages.map((m) => new Message(m.payload, m.from, m.to))), undefined);
225
+ }
226
+ if (this.dkgState === types_1.DkgState.Round4) {
227
+ this.dkgKeyShare = this.dkgSession.keyshare();
228
+ this.keyShareBuff = Buffer.from(this.dkgKeyShare.toBytes());
229
+ this.dkgKeyShare.free();
230
+ if (this.dklsKeyShareRetrofitObject) {
231
+ this.dklsKeyShareRetrofitObject.free();
232
+ }
233
+ this.dkgState = types_1.DkgState.Complete;
234
+ return { broadcastMessages: [], p2pMessages: [] };
235
+ }
236
+ else {
237
+ // Update round data.
238
+ this._deserializeState();
239
+ }
240
+ if (this.dkgState === types_1.DkgState.Round2) {
241
+ this.chainCodeCommitment = this.dkgSession.calculateChainCodeCommitment();
242
+ }
243
+ nextRoundDeserializedMessages = {
244
+ p2pMessages: nextRoundMessages
245
+ .filter((m) => m.to_id !== undefined)
246
+ .map((m) => {
247
+ const p2pReturn = {
248
+ payload: m.payload,
249
+ from: m.from_id,
250
+ to: m.to_id,
251
+ commitment: this.chainCodeCommitment,
252
+ };
253
+ return p2pReturn;
254
+ }),
255
+ broadcastMessages: nextRoundMessages
256
+ .filter((m) => m.to_id === undefined)
257
+ .map((m) => {
258
+ const broadcastReturn = {
259
+ payload: m.payload,
260
+ from: m.from_id,
261
+ };
262
+ return broadcastReturn;
263
+ }),
264
+ };
265
+ }
266
+ catch (e) {
267
+ throw Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dkgState}: ${e}`);
268
+ }
269
+ finally {
270
+ nextRoundMessages.forEach((m) => m.free());
271
+ // Session is freed when keyshare is called.
272
+ if (this.dkgState !== types_1.DkgState.Complete) {
273
+ this.dkgSessionBytes = this.dkgSession.toBytes();
274
+ this.dkgSession = undefined;
275
+ }
276
+ }
277
+ return nextRoundDeserializedMessages;
278
+ }
279
+ /**
280
+ * Get the current session data that can be used to restore the session later
281
+ * @returns The current session data
282
+ */
283
+ getSessionData() {
284
+ const sessionData = {
285
+ dkgSessionBytes: this.dkgSessionBytes,
286
+ dkgState: this.dkgState,
287
+ };
288
+ if (this.chainCodeCommitment) {
289
+ sessionData.chainCodeCommitment = this.chainCodeCommitment;
290
+ }
291
+ if (this.keyShareBuff) {
292
+ sessionData.keyShareBuff = this.keyShareBuff;
293
+ }
294
+ return sessionData;
295
+ }
296
+ /**
297
+ * Restore a DKG session from previous session data
298
+ * Note: This should not be used for Round 1 as that's the initialization phase
299
+ * @param n Number of parties
300
+ * @param t Threshold
301
+ * @param partyIdx Party index
302
+ * @param sessionData Previous session data
303
+ * @param seed Optional seed
304
+ * @param retrofitData Optional retrofit data
305
+ * @param dklsWasm Optional DKLS wasm instance
306
+ * @returns A new DKG instance with the restored session
307
+ */
308
+ static async restoreSession(n, t, partyIdx, sessionData, seed, retrofitData, dklsWasm) {
309
+ const dkg = new Dkg(n, t, partyIdx, seed, retrofitData, dklsWasm);
310
+ if (!dkg.dklsWasm) {
311
+ await dkg.loadDklsWasm();
312
+ }
313
+ dkg.dkgSessionBytes = sessionData.dkgSessionBytes;
314
+ dkg.dkgState = sessionData.dkgState;
315
+ if (sessionData.chainCodeCommitment) {
316
+ dkg.chainCodeCommitment = sessionData.chainCodeCommitment;
317
+ }
318
+ if (sessionData.keyShareBuff) {
319
+ dkg.keyShareBuff = sessionData.keyShareBuff;
320
+ }
321
+ dkg._restoreSession();
322
+ return dkg;
323
+ }
324
+ }
325
+ exports.Dkg = Dkg;
326
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGtnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9lY2RzYS1ka2xzL2RrZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxtQ0FBd0M7QUFDeEMseUNBQThDO0FBQzlDLHFDQUE4QztBQUM5QyxtQ0FBc0g7QUFldEgsTUFBYSxHQUFHO0lBZWQsWUFDRSxDQUFTLEVBQ1QsQ0FBUyxFQUNULFFBQWdCLEVBQ2hCLElBQWEsRUFDYixZQUEyQixFQUMzQixRQUF3QjtRQVhoQixhQUFRLEdBQWEsZ0JBQVEsQ0FBQyxhQUFhLENBQUM7UUFhcEQsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUM7UUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLElBQUksSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFFTyxLQUFLLENBQUMsWUFBWTtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsd0RBQWEsd0NBQXdDLEdBQUMsQ0FBQztRQUN6RSxDQUFDO0lBQ0gsQ0FBQztJQUVPLFdBQVc7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixNQUFNLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxDQUFD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Q2IsWUFBMkIsRUFDM0IsUUFBd0I7UUFFeEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVsRSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFFRCxHQUFHLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUM7UUFDbEQsR0FBRyxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO1FBRXBDLElBQUksV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDcEMsR0FBRyxDQUFDLG1CQUFtQixHQUFHLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQztRQUM1RCxDQUFDO1FBRUQsSUFBSSxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDN0IsR0FBRyxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDO1FBQzlDLENBQUM7UUFFRCxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdEIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0Y7QUEvVUQsa0JBK1VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBLZXlnZW5TZXNzaW9uLCBLZXlzaGFyZSwgTWVzc2FnZSB9IGZyb20gJ0BzaWxlbmNlbGFib3JhdG9yaWVzL2RrbHMtd2FzbS1sbC1ub2RlJztcbmltcG9ydCB7IGRlY29kZSwgZW5jb2RlIH0gZnJvbSAnY2Jvci14JztcbmltcG9ydCB7IFNlY3AyNTZrMUN1cnZlIH0gZnJvbSAnLi4vLi4vY3VydmVzJztcbmltcG9ydCB7IGJpZ0ludFRvQnVmZmVyQkUgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IERlc2VyaWFsaXplZEJyb2FkY2FzdE1lc3NhZ2UsIERlc2VyaWFsaXplZE1lc3NhZ2VzLCBEa2dTdGF0ZSwgUmVkdWNlZEtleVNoYXJlLCBSZXRyb2ZpdERhdGEgfSBmcm9tICcuL3R5cGVzJztcblxudHlwZSBOb2RlV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQHNpbGVuY2VsYWJvcmF0b3JpZXMvZGtscy13YXNtLWxsLW5vZGUnKTtcbnR5cGUgV2ViV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQHNpbGVuY2VsYWJvcmF0b3JpZXMvZGtscy13YXNtLWxsLXdlYicpO1xudHlwZSBCdW5kbGVyV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQHNpbGVuY2VsYWJvcmF0b3JpZXMvZGtscy13YXNtLWxsLWJ1bmRsZXInKTtcblxudHlwZSBEa2xzV2FzbSA9IE5vZGVXYXNtZXIgfCBXZWJXYXNtZXIgfCBCdW5kbGVyV2FzbWVyO1xuXG5leHBvcnQgaW50ZXJmYWNlIERrZ1Nlc3Npb25EYXRhIHtcbiAgZGtnU2Vzc2lvbkJ5dGVzOiBVaW50OEFycmF5O1xuICBka2dTdGF0ZTogRGtnU3RhdGU7XG4gIGNoYWluQ29kZUNvbW1pdG1lbnQ/OiBVaW50OEFycmF5O1xuICBrZXlTaGFyZUJ1ZmY/OiBCdWZmZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBEa2cge1xuICBwcm90ZWN0ZWQgZGtnU2Vzc2lvbjogS2V5Z2VuU2Vzc2lvbiB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGRrZ1Nlc3Npb25CeXRlczogVWludDhBcnJheTtcbiAgcHJvdGVjdGVkIGRrZ0tleVNoYXJlOiBLZXlzaGFyZTtcbiAgcHJvdGVjdGVkIGtleVNoYXJlQnVmZjogQnVmZmVyO1xuICBwcm90ZWN0ZWQgbjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgdDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgc2VlZDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgY2hhaW5Db2RlQ29tbWl0bWVudDogVWludDhBcnJheSB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHBhcnR5SWR4OiBudW1iZXI7XG4gIHByb3RlY3RlZCBka2dTdGF0ZTogRGtnU3RhdGUgPSBEa2dTdGF0ZS5VbmluaXRpYWxpemVkO1xuICBwcm90ZWN0ZWQgZGtsc0tleVNoYXJlUmV0cm9maXRPYmplY3Q6IEtleXNoYXJlIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmV0cm9maXREYXRhOiBSZXRyb2ZpdERhdGEgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBka2xzV2FzbTogRGtsc1dhc20gfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG46IG51bWJlcixcbiAgICB0OiBudW1iZXIsXG4gICAgcGFydHlJZHg6IG51bWJlcixcbiAgICBzZWVkPzogQnVmZmVyLFxuICAgIHJldHJvZml0RGF0YT86IFJldHJvZml0RGF0YSxcbiAgICBka2xzV2FzbT86IEJ1bmRsZXJXYXNtZXJcbiAgKSB7XG4gICAgdGhpcy5uID0gbjtcbiAgICB0aGlzLnQgPSB0O1xuICAgIHRoaXMucGFydHlJZHggPSBwYXJ0eUlkeDtcbiAgICB0aGlzLmNoYWluQ29kZUNvbW1pdG1lbnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZXRyb2ZpdERhdGEgPSByZXRyb2ZpdERhdGE7XG4gICAgdGhpcy5zZWVkID0gc2VlZDtcbiAgICB0aGlzLmRrbHNXYXNtID0gZGtsc1dhc20gPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZERrbHNXYXNtKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5ka2xzV2FzbSkge1xuICAgICAgdGhpcy5ka2xzV2FzbSA9IGF3YWl0IGltcG9ydCgnQHNpbGVuY2VsYWJvcmF0b3JpZXMvZGtscy13YXNtLWxsLW5vZGUnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldERrbHNXYXNtKCkge1xuICAgIGlmICghdGhpcy5ka2xzV2FzbSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLTFMgd2FzbSBub3QgbG9hZGVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGtsc1dhc207XG4gIH1cblxuICBwcml2YXRlIF9yZXN0b3JlU2Vzc2lvbigpIHtcbiAgICBpZiAoIXRoaXMuZGtnU2Vzc2lvbikge1xuICAgICAgdGhpcy5ka2dTZXNzaW9uID0gdGhpcy5nZXREa2xzV2FzbSgpLktleWdlblNlc3Npb24uZnJvbUJ5dGVzKHRoaXMuZGtnU2Vzc2lvbkJ5dGVzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVES0xzUmV0cm9maXRLZXlTaGFyZSgpIHtcbiAgICBpZiAodGhpcy5yZXRyb2ZpdERhdGEpIHtcbiAgICAgIGlmICghdGhpcy5yZXRyb2ZpdERhdGEueFNoYXJlLnkgfHwgIXRoaXMucmV0cm9maXREYXRhLnhTaGFyZS5jaGFpbmNvZGUgfHwgIXRoaXMucmV0cm9maXREYXRhLnhTaGFyZS54KSB7XG4gICAgICAgIHRocm93IEVycm9yKCd4U2hhcmUgbXVzdCBoYXZlIGEgcHVibGljIGtleSwgcHJpdmF0ZSBzaGFyZSB2YWx1ZSwgYW5kIGEgY2hhaW5jb2RlLicpO1xuICAgICAgfVxuICAgICAgY29uc3QgeGlMaXN0OiBBcnJheTxBcnJheTxudW1iZXI+PiA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm47IGkrKykge1xuICAgICAgICB4aUxpc3QucHVzaChBcnJheS5mcm9tKGJpZ0ludFRvQnVmZmVyQkUoQmlnSW50KGkgKyAxKSwgMzIpKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBzZWNwMjU2azEgPSBuZXcgU2VjcDI1NmsxQ3VydmUoKTtcbiAgICAgIGNvbnN0IGRrbHNLZXlTaGFyZSA9IHtcbiAgICAgICAgdG90YWxfcGFydGllczogdGhpcy5uLFxuICAgICAgICB0aHJlc2hvbGQ6IHRoaXMudCxcbiAgICAgICAgcmFua19saXN0OiBuZXcgQXJyYXkodGhpcy5uKS5maWxsKDApLFxuICAgICAgICBwYXJ0eV9pZDogdGhpcy5wYXJ0eUlkeCxcbiAgICAgICAgcHVibGljX2tleTogQXJyYXkuZnJvbShCdWZmZXIuZnJvbSh0aGlzLnJldHJvZml0RGF0YS54U2hhcmUueSwgJ2hleCcpKSxcbiAgICAgICAgcm9vdF9jaGFpbl9jb2RlOiBBcnJheS5mcm9tKEJ1ZmZlci5mcm9tKHRoaXMucmV0cm9maXREYXRhLnhTaGFyZS5jaGFpbmNvZGUsICdoZXgnKSksXG4gICAgICAgIGZpbmFsX3Nlc3Npb25faWQ6IEFycmF5KDMyKS5maWxsKDApLFxuICAgICAgICBzZWVkX290X3JlY2VpdmVyczogbmV3IEFycmF5KHRoaXMubiAtIDEpLmZpbGwoQXJyYXkoMzI4MzIpLmZpbGwoMCkpLFxuICAgICAgICBzZWVkX290X3NlbmRlcnM6IG5ldyBBcnJheSh0aGlzLm4gLSAxKS5maWxsKEFycmF5KDMyNzY4KS5maWxsKDApKSxcbiAgICAgICAgc2VudF9zZWVkX2xpc3Q6IFtBcnJheSgzMikuZmlsbCgwKV0sXG4gICAgICAgIHJlY19zZWVkX2xpc3Q6IFtBcnJheSgzMikuZmlsbCgwKV0sXG4gICAgICAgIHNfaTogQXJyYXkuZnJvbShCdWZmZXIuZnJvbSh0aGlzLnJldHJvZml0RGF0YS54U2hhcmUueCwgJ2hleCcpKSxcbiAgICAgICAgLy8gYmlnX3NfbGlzdCBpcyBub3cgY3JlYXRlZCBpbnRlcm5hbGx5IGR1cmluZyB0aGUgcHJvdG9jb2wgc28gaXNuJ3QgbmVlZGVkIGhlcmUsIGhvd2V2ZXIgYSB2YWxpZCBLZXlTaGFyZSBvYmplY3QgbmVlZHMgdG8gaGF2ZSBpdC5cbiAgICAgICAgLy8gYSBkdW1teSBwdWJsaWMga2V5IGlzIHVzZWQgdG8gZmlsbCBiaWdfc19saXN0LlxuICAgICAgICBiaWdfc19saXN0OiBuZXcgQXJyYXkodGhpcy5uKS5maWxsKFxuICAgICAgICAgIEFycmF5LmZyb20oYmlnSW50VG9CdWZmZXJCRShzZWNwMjU2azEuYmFzZVBvaW50TXVsdChCaWdJbnQoJzB4JyArIHRoaXMucmV0cm9maXREYXRhLnhTaGFyZS54KSkpKVxuICAgICAgICApLFxuICAgICAgICB4X2lfbGlzdDogdGhpcy5yZXRyb2ZpdERhdGEueGlMaXN0ID8gdGhpcy5yZXRyb2ZpdERhdGEueGlMaXN0IDogeGlMaXN0LFxuICAgICAgfTtcbiAgICAgIHRoaXMuZGtsc0tleVNoYXJlUmV0cm9maXRPYmplY3QgPSB0aGlzLmdldERrbHNXYXNtKCkuS2V5c2hhcmUuZnJvbUJ5dGVzKGVuY29kZShka2xzS2V5U2hhcmUpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kZXNlcmlhbGl6ZVN0YXRlKCkge1xuICAgIGlmICghdGhpcy5ka2dTZXNzaW9uKSB7XG4gICAgICB0aHJvdyBFcnJvcignU2Vzc2lvbiBub3QgaW50aWFsaXplZCcpO1xuICAgIH1cbiAgICBjb25zdCByb3VuZCA9IGRlY29kZSh0aGlzLmRrZ1Nlc3Npb24udG9CeXRlcygpKS5yb3VuZDtcbiAgICBzd2l0Y2ggKHJvdW5kKSB7XG4gICAgICBjYXNlICdXYWl0TXNnMSc6XG4gICAgICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5Sb3VuZDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnV2FpdE1zZzInOlxuICAgICAgICB0aGlzLmRrZ1N0YXRlID0gRGtnU3RhdGUuUm91bmQyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1dhaXRNc2czJzpcbiAgICAgICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLlJvdW5kMztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdXYWl0TXNnNCc6XG4gICAgICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5Sb3VuZDQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRW5kZWQnOlxuICAgICAgICB0aGlzLmRrZ1N0YXRlID0gRGtnU3RhdGUuQ29tcGxldGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLkludmFsaWRTdGF0ZTtcbiAgICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgU3RhdGU6ICR7cm91bmR9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdERrZygpOiBQcm9taXNlPERlc2VyaWFsaXplZEJyb2FkY2FzdE1lc3NhZ2U+IHtcbiAgICBpZiAoIXRoaXMuZGtsc1dhc20pIHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZERrbHNXYXNtKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnQgPiB0aGlzLm4gfHwgdGhpcy5wYXJ0eUlkeCA+PSB0aGlzLm4pIHtcbiAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIHBhcmFtZXRlcnMgZm9yIERLRycpO1xuICAgIH1cbiAgICBpZiAodGhpcy5ka2dTdGF0ZSAhPSBEa2dTdGF0ZS5VbmluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignREtHIHNlc3Npb24gYWxyZWFkeSBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgLyogY2hlY2tzIGZvciBlbGVjdHJvbiBwcm9jZXNzZXMgKi9cbiAgICAgICF3aW5kb3cucHJvY2VzcyAmJlxuICAgICAgIXdpbmRvdy5wcm9jZXNzPy5bJ3R5cGUnXVxuICAgICkge1xuICAgICAgLyogVGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgYnJvd3NlcnMvd2ViIGJlY2F1c2UgaXQgdXNlcyBmZXRjaCB0byByZXNvbHZlIHRoZSB3YXNtIGFzc2V0IGZvciB0aGUgd2ViICovXG4gICAgICBjb25zdCBpbml0RGtscyA9IGF3YWl0IGltcG9ydCgnQHNpbGVuY2VsYWJvcmF0b3JpZXMvZGtscy13YXNtLWxsLXdlYicpO1xuICAgICAgYXdhaXQgaW5pdERrbHMuZGVmYXVsdCgpO1xuICAgIH1cbiAgICB0aGlzLl9jcmVhdGVES0xzUmV0cm9maXRLZXlTaGFyZSgpO1xuICAgIGlmICh0aGlzLnNlZWQgJiYgdGhpcy5zZWVkLmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IEVycm9yKGBTZWVkIHNob3VsZCBiZSAzMiBieXRlcywgZ290ICR7dGhpcy5zZWVkLmxlbmd0aH0uYCk7XG4gICAgfVxuICAgIGNvbnN0IHsgS2V5Z2VuU2Vzc2lvbiB9ID0gdGhpcy5nZXREa2xzV2FzbSgpO1xuICAgIGlmICh0aGlzLmRrbHNLZXlTaGFyZVJldHJvZml0T2JqZWN0KSB7XG4gICAgICB0aGlzLmRrZ1Nlc3Npb24gPSB0aGlzLnNlZWRcbiAgICAgICAgPyBLZXlnZW5TZXNzaW9uLmluaXRLZXlSb3RhdGlvbih0aGlzLmRrbHNLZXlTaGFyZVJldHJvZml0T2JqZWN0LCBuZXcgVWludDhBcnJheSh0aGlzLnNlZWQpKVxuICAgICAgICA6IEtleWdlblNlc3Npb24uaW5pdEtleVJvdGF0aW9uKHRoaXMuZGtsc0tleVNoYXJlUmV0cm9maXRPYmplY3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRrZ1Nlc3Npb24gPSB0aGlzLnNlZWRcbiAgICAgICAgPyBuZXcgS2V5Z2VuU2Vzc2lvbih0aGlzLm4sIHRoaXMudCwgdGhpcy5wYXJ0eUlkeCwgbmV3IFVpbnQ4QXJyYXkodGhpcy5zZWVkKSlcbiAgICAgICAgOiBuZXcgS2V5Z2VuU2Vzc2lvbih0aGlzLm4sIHRoaXMudCwgdGhpcy5wYXJ0eUlkeCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5ka2dTZXNzaW9uLmNyZWF0ZUZpcnN0TWVzc2FnZSgpLnBheWxvYWQ7XG4gICAgICB0aGlzLmRrZ1Nlc3Npb25CeXRlcyA9IHRoaXMuZGtnU2Vzc2lvbi50b0J5dGVzKCk7XG4gICAgICB0aGlzLl9kZXNlcmlhbGl6ZVN0YXRlKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgICBmcm9tOiB0aGlzLnBhcnR5SWR4LFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGZpcnN0IG1lc3NhZ2UgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9OiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0S2V5U2hhcmUoKTogQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMua2V5U2hhcmVCdWZmKSB7XG4gICAgICB0aHJvdyBFcnJvcignQ2FuIG5vdCBnZXQga2V5IHNoYXJlLCBES0cgaXMgbm90IGNvbXBsZXRlIHlldC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMua2V5U2hhcmVCdWZmO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBDQk9SLWVuY29kZWQgUmVkdWNlZEtleVNoYXJlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBwYXJ0eSdzIHByaXZhdGVcbiAgICogc2NhbGFyIChzX2kpIGluIHRoZSBgcHJ2YCBmaWVsZC4gVGhpcyBidWZmZXIgaXMgcHJpdmF0ZSBrZXkgbWF0ZXJpYWwuXG4gICAqIFRoZSBjYWxsZXIgZW5jcnlwdHMgaXQgYW5kIHN0b3JlcyBpdCBhcyBgcmVkdWNlZEVuY3J5cHRlZFBydmAgb24gdGhlIGtleSBjYXJkIFFSIGNvZGUuXG4gICAqL1xuICBnZXRSZWR1Y2VkS2V5U2hhcmUoKTogQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMua2V5U2hhcmVCdWZmKSB7XG4gICAgICB0aHJvdyBFcnJvcignQ2FuIG5vdCBnZXQga2V5IHNoYXJlLCBES0cgaXMgbm90IGNvbXBsZXRlIHlldC4nKTtcbiAgICB9XG4gICAgY29uc3QgZGVjb2RlZEtleXNoYXJlID0gZGVjb2RlKHRoaXMua2V5U2hhcmVCdWZmKTtcbiAgICBjb25zdCByZWR1Y2VkS2V5U2hhcmU6IFJlZHVjZWRLZXlTaGFyZSA9IHtcbiAgICAgIGJpZ1NMaXN0OiBkZWNvZGVkS2V5c2hhcmUuYmlnX3NfbGlzdCxcbiAgICAgIHhMaXN0OiBkZWNvZGVkS2V5c2hhcmUueF9pX2xpc3QsXG4gICAgICByb290Q2hhaW5Db2RlOiBkZWNvZGVkS2V5c2hhcmUucm9vdF9jaGFpbl9jb2RlLFxuICAgICAgcHJ2OiBkZWNvZGVkS2V5c2hhcmUuc19pLFxuICAgICAgcHViOiBkZWNvZGVkS2V5c2hhcmUucHVibGljX2tleSxcbiAgICB9O1xuICAgIGNvbnN0IGVuY29kZWRLZXlTaGFyZSA9IGVuY29kZShyZWR1Y2VkS2V5U2hhcmUpO1xuICAgIHJldHVybiBlbmNvZGVkS2V5U2hhcmU7XG4gIH1cblxuICBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2VzRm9ySXRoUm91bmQ6IERlc2VyaWFsaXplZE1lc3NhZ2VzKTogRGVzZXJpYWxpemVkTWVzc2FnZXMge1xuICAgIGxldCBuZXh0Um91bmRNZXNzYWdlczogTWVzc2FnZVtdID0gW107XG4gICAgbGV0IG5leHRSb3VuZERlc2VyaWFsaXplZE1lc3NhZ2VzOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLCBwMnBNZXNzYWdlczogW10gfTtcbiAgICB0aGlzLl9yZXN0b3JlU2Vzc2lvbigpO1xuICAgIGlmICghdGhpcy5ka2dTZXNzaW9uKSB7XG4gICAgICB0aHJvdyBFcnJvcignU2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgY29uc3QgeyBNZXNzYWdlIH0gPSB0aGlzLmdldERrbHNXYXNtKCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmRrZ1N0YXRlID09PSBEa2dTdGF0ZS5Sb3VuZDMpIHtcbiAgICAgICAgY29uc3QgY29tbWl0bWVudHNVbnNvcnRlZCA9IG1lc3NhZ2VzRm9ySXRoUm91bmQucDJwTWVzc2FnZXNcbiAgICAgICAgICAubWFwKChtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyBmcm9tOiBtLmZyb20sIGNvbW1pdG1lbnQ6IG0uY29tbWl0bWVudCB9O1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNvbmNhdChbeyBmcm9tOiB0aGlzLnBhcnR5SWR4LCBjb21taXRtZW50OiB0aGlzLmNoYWluQ29kZUNvbW1pdG1lbnQgfV0pO1xuICAgICAgICBjb25zdCBjb21taXRtZW50c1NvcnRlZCA9IGNvbW1pdG1lbnRzVW5zb3J0ZWRcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGEuZnJvbSAtIGIuZnJvbTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5tYXAoKGMpID0+IGMuY29tbWl0bWVudCk7XG4gICAgICAgIG5leHRSb3VuZE1lc3NhZ2VzID0gdGhpcy5ka2dTZXNzaW9uLmhhbmRsZU1lc3NhZ2VzKFxuICAgICAgICAgIG1lc3NhZ2VzRm9ySXRoUm91bmQuYnJvYWRjYXN0TWVzc2FnZXNcbiAgICAgICAgICAgIC5tYXAoKG0pID0+IG5ldyBNZXNzYWdlKG0ucGF5bG9hZCwgbS5mcm9tLCB1bmRlZmluZWQpKVxuICAgICAgICAgICAgLmNvbmNhdChtZXNzYWdlc0Zvckl0aFJvdW5kLnAycE1lc3NhZ2VzLm1hcCgobSkgPT4gbmV3IE1lc3NhZ2UobS5wYXlsb2FkLCBtLmZyb20sIG0udG8pKSksXG4gICAgICAgICAgY29tbWl0bWVudHNTb3J0ZWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRSb3VuZE1lc3NhZ2VzID0gdGhpcy5ka2dTZXNzaW9uLmhhbmRsZU1lc3NhZ2VzKFxuICAgICAgICAgIG1lc3NhZ2VzRm9ySXRoUm91bmQuYnJvYWRjYXN0TWVzc2FnZXNcbiAgICAgICAgICAgIC5tYXAoKG0pID0+IG5ldyBNZXNzYWdlKG0ucGF5bG9hZCwgbS5mcm9tLCB1bmRlZmluZWQpKVxuICAgICAgICAgICAgLmNvbmNhdChtZXNzYWdlc0Zvckl0aFJvdW5kLnAycE1lc3NhZ2VzLm1hcCgobSkgPT4gbmV3IE1lc3NhZ2UobS5wYXlsb2FkLCBtLmZyb20sIG0udG8pKSksXG4gICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ka2dTdGF0ZSA9PT0gRGtnU3RhdGUuUm91bmQ0KSB7XG4gICAgICAgIHRoaXMuZGtnS2V5U2hhcmUgPSB0aGlzLmRrZ1Nlc3Npb24ua2V5c2hhcmUoKTtcbiAgICAgICAgdGhpcy5rZXlTaGFyZUJ1ZmYgPSBCdWZmZXIuZnJvbSh0aGlzLmRrZ0tleVNoYXJlLnRvQnl0ZXMoKSk7XG4gICAgICAgIHRoaXMuZGtnS2V5U2hhcmUuZnJlZSgpO1xuICAgICAgICBpZiAodGhpcy5ka2xzS2V5U2hhcmVSZXRyb2ZpdE9iamVjdCkge1xuICAgICAgICAgIHRoaXMuZGtsc0tleVNoYXJlUmV0cm9maXRPYmplY3QuZnJlZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5Db21wbGV0ZTtcbiAgICAgICAgcmV0dXJuIHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLCBwMnBNZXNzYWdlczogW10gfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVwZGF0ZSByb3VuZCBkYXRhLlxuICAgICAgICB0aGlzLl9kZXNlcmlhbGl6ZVN0YXRlKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ka2dTdGF0ZSA9PT0gRGtnU3RhdGUuUm91bmQyKSB7XG4gICAgICAgIHRoaXMuY2hhaW5Db2RlQ29tbWl0bWVudCA9IHRoaXMuZGtnU2Vzc2lvbi5jYWxjdWxhdGVDaGFpbkNvZGVDb21taXRtZW50KCk7XG4gICAgICB9XG4gICAgICBuZXh0Um91bmREZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IHtcbiAgICAgICAgcDJwTWVzc2FnZXM6IG5leHRSb3VuZE1lc3NhZ2VzXG4gICAgICAgICAgLmZpbHRlcigobSkgPT4gbS50b19pZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIC5tYXAoKG0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHAycFJldHVybiA9IHtcbiAgICAgICAgICAgICAgcGF5bG9hZDogbS5wYXlsb2FkLFxuICAgICAgICAgICAgICBmcm9tOiBtLmZyb21faWQsXG4gICAgICAgICAgICAgIHRvOiBtLnRvX2lkISxcbiAgICAgICAgICAgICAgY29tbWl0bWVudDogdGhpcy5jaGFpbkNvZGVDb21taXRtZW50LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBwMnBSZXR1cm47XG4gICAgICAgICAgfSksXG4gICAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBuZXh0Um91bmRNZXNzYWdlc1xuICAgICAgICAgIC5maWx0ZXIoKG0pID0+IG0udG9faWQgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAubWFwKChtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBicm9hZGNhc3RSZXR1cm4gPSB7XG4gICAgICAgICAgICAgIHBheWxvYWQ6IG0ucGF5bG9hZCxcbiAgICAgICAgICAgICAgZnJvbTogbS5mcm9tX2lkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBicm9hZGNhc3RSZXR1cm47XG4gICAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5ka2dTdGF0ZX06ICR7ZX1gKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgbmV4dFJvdW5kTWVzc2FnZXMuZm9yRWFjaCgobSkgPT4gbS5mcmVlKCkpO1xuICAgICAgLy8gU2Vzc2lvbiBpcyBmcmVlZCB3aGVuIGtleXNoYXJlIGlzIGNhbGxlZC5cbiAgICAgIGlmICh0aGlzLmRrZ1N0YXRlICE9PSBEa2dTdGF0ZS5Db21wbGV0ZSkge1xuICAgICAgICB0aGlzLmRrZ1Nlc3Npb25CeXRlcyA9IHRoaXMuZGtnU2Vzc2lvbi50b0J5dGVzKCk7XG4gICAgICAgIHRoaXMuZGtnU2Vzc2lvbiA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5leHRSb3VuZERlc2VyaWFsaXplZE1lc3NhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBzZXNzaW9uIGRhdGEgdGhhdCBjYW4gYmUgdXNlZCB0byByZXN0b3JlIHRoZSBzZXNzaW9uIGxhdGVyXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHNlc3Npb24gZGF0YVxuICAgKi9cbiAgZ2V0U2Vzc2lvbkRhdGEoKTogRGtnU2Vzc2lvbkRhdGEge1xuICAgIGNvbnN0IHNlc3Npb25EYXRhOiBEa2dTZXNzaW9uRGF0YSA9IHtcbiAgICAgIGRrZ1Nlc3Npb25CeXRlczogdGhpcy5ka2dTZXNzaW9uQnl0ZXMsXG4gICAgICBka2dTdGF0ZTogdGhpcy5ka2dTdGF0ZSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuY2hhaW5Db2RlQ29tbWl0bWVudCkge1xuICAgICAgc2Vzc2lvbkRhdGEuY2hhaW5Db2RlQ29tbWl0bWVudCA9IHRoaXMuY2hhaW5Db2RlQ29tbWl0bWVudDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5rZXlTaGFyZUJ1ZmYpIHtcbiAgICAgIHNlc3Npb25EYXRhLmtleVNoYXJlQnVmZiA9IHRoaXMua2V5U2hhcmVCdWZmO1xuICAgIH1cblxuICAgIHJldHVybiBzZXNzaW9uRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIGEgREtHIHNlc3Npb24gZnJvbSBwcmV2aW91cyBzZXNzaW9uIGRhdGFcbiAgICogTm90ZTogVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIFJvdW5kIDEgYXMgdGhhdCdzIHRoZSBpbml0aWFsaXphdGlvbiBwaGFzZVxuICAgKiBAcGFyYW0gbiBOdW1iZXIgb2YgcGFydGllc1xuICAgKiBAcGFyYW0gdCBUaHJlc2hvbGRcbiAgICogQHBhcmFtIHBhcnR5SWR4IFBhcnR5IGluZGV4XG4gICAqIEBwYXJhbSBzZXNzaW9uRGF0YSBQcmV2aW91cyBzZXNzaW9uIGRhdGFcbiAgICogQHBhcmFtIHNlZWQgT3B0aW9uYWwgc2VlZFxuICAgKiBAcGFyYW0gcmV0cm9maXREYXRhIE9wdGlvbmFsIHJldHJvZml0IGRhdGFcbiAgICogQHBhcmFtIGRrbHNXYXNtIE9wdGlvbmFsIERLTFMgd2FzbSBpbnN0YW5jZVxuICAgKiBAcmV0dXJucyBBIG5ldyBES0cgaW5zdGFuY2Ugd2l0aCB0aGUgcmVzdG9yZWQgc2Vzc2lvblxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlc3RvcmVTZXNzaW9uKFxuICAgIG46IG51bWJlcixcbiAgICB0OiBudW1iZXIsXG4gICAgcGFydHlJZHg6IG51bWJlcixcbiAgICBzZXNzaW9uRGF0YTogRGtnU2Vzc2lvbkRhdGEsXG4gICAgc2VlZD86IEJ1ZmZlcixcbiAgICByZXRyb2ZpdERhdGE/OiBSZXRyb2ZpdERhdGEsXG4gICAgZGtsc1dhc20/OiBCdW5kbGVyV2FzbWVyXG4gICk6IFByb21pc2U8RGtnPiB7XG4gICAgY29uc3QgZGtnID0gbmV3IERrZyhuLCB0LCBwYXJ0eUlkeCwgc2VlZCwgcmV0cm9maXREYXRhLCBka2xzV2FzbSk7XG5cbiAgICBpZiAoIWRrZy5ka2xzV2FzbSkge1xuICAgICAgYXdhaXQgZGtnLmxvYWREa2xzV2FzbSgpO1xuICAgIH1cblxuICAgIGRrZy5ka2dTZXNzaW9uQnl0ZXMgPSBzZXNzaW9uRGF0YS5ka2dTZXNzaW9uQnl0ZXM7XG4gICAgZGtnLmRrZ1N0YXRlID0gc2Vzc2lvbkRhdGEuZGtnU3RhdGU7XG5cbiAgICBpZiAoc2Vzc2lvbkRhdGEuY2hhaW5Db2RlQ29tbWl0bWVudCkge1xuICAgICAgZGtnLmNoYWluQ29kZUNvbW1pdG1lbnQgPSBzZXNzaW9uRGF0YS5jaGFpbkNvZGVDb21taXRtZW50O1xuICAgIH1cblxuICAgIGlmIChzZXNzaW9uRGF0YS5rZXlTaGFyZUJ1ZmYpIHtcbiAgICAgIGRrZy5rZXlTaGFyZUJ1ZmYgPSBzZXNzaW9uRGF0YS5rZXlTaGFyZUJ1ZmY7XG4gICAgfVxuXG4gICAgZGtnLl9yZXN0b3JlU2Vzc2lvbigpO1xuICAgIHJldHVybiBka2c7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,47 @@
1
+ import { SignSessionOTVariant } from '@silencelaboratories/dkls-wasm-ll-node';
2
+ import { DeserializedBroadcastMessage, DeserializedDklsSignature, DeserializedMessages, DsgState } from './types';
3
+ type NodeWasmer = typeof import('@silencelaboratories/dkls-wasm-ll-node');
4
+ type WebWasmer = typeof import('@silencelaboratories/dkls-wasm-ll-web');
5
+ type BundlerWasmer = typeof import('@silencelaboratories/dkls-wasm-ll-bundler');
6
+ type DklsWasm = NodeWasmer | WebWasmer | BundlerWasmer;
7
+ export declare class Dsg {
8
+ protected dsgSession: SignSessionOTVariant | undefined;
9
+ protected dsgSessionBytes: Uint8Array;
10
+ private _signature;
11
+ protected keyShareBytes: Buffer;
12
+ protected messageHash: Buffer;
13
+ protected derivationPath: string;
14
+ protected partyIdx: number;
15
+ protected dsgState: DsgState;
16
+ protected dklsWasm: DklsWasm | null;
17
+ constructor(keyShare: Buffer, partyIdx: number, derivationPath: string, messageHash: Buffer, dklsWasm?: BundlerWasmer);
18
+ private _restoreSession;
19
+ private _deserializeState;
20
+ private loadDklsWasm;
21
+ private getDklsWasm;
22
+ /**
23
+ * Returns the current DSG session as a base64 string.
24
+ * @returns {string} - base64 string of the current DSG session
25
+ */
26
+ getSession(): string;
27
+ /**
28
+ * Sets the DSG session from a base64 string.
29
+ * @param {string} session - base64 string of the DSG session
30
+ */
31
+ setSession(session: string): Promise<void>;
32
+ init(): Promise<DeserializedBroadcastMessage>;
33
+ get signature(): DeserializedDklsSignature;
34
+ /**
35
+ * Ends the DSG session by freeing any heap allocations from wasm. Note that the session is freed if a signature is produced.
36
+ */
37
+ endSession(): void;
38
+ /**
39
+ * Proccesses incoming messages to this party in the DKLs DSG protocol and
40
+ * produces messages from this party to other parties for the next round.
41
+ * @param messagesForIthRound - messages to process the current round
42
+ * @returns {DeserializedMessages} - messages to send to other parties for the next round
43
+ */
44
+ handleIncomingMessages(messagesForIthRound: DeserializedMessages): DeserializedMessages;
45
+ }
46
+ export {};
47
+ //# sourceMappingURL=dsg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsg.d.ts","sourceRoot":"","sources":["../../../../src/tss/ecdsa-dkls/dsg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,4BAA4B,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGlH,KAAK,UAAU,GAAG,cAAc,wCAAwC,CAAC,CAAC;AAC1E,KAAK,SAAS,GAAG,cAAc,uCAAuC,CAAC,CAAC;AACxE,KAAK,aAAa,GAAG,cAAc,2CAA2C,CAAC,CAAC;AAEhF,KAAK,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,CAAC;AAEvD,qBAAa,GAAG;IACd,SAAS,CAAC,UAAU,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACvD,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC;IACtC,OAAO,CAAC,UAAU,CAAwC;IAC1D,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC;IACjC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAA0B;IACtD,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;gBAGlC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,aAAa;IAS1B,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,iBAAiB;YAwBX,YAAY;IAM1B,OAAO,CAAC,WAAW;IAQnB;;;OAGG;IACH,UAAU,IAAI,MAAM;IAIpB;;;OAGG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B1C,IAAI,IAAI,OAAO,CAAC,4BAA4B,CAAC;IAqCnD,IAAI,SAAS,IAAI,yBAAyB,CAKzC;IAED;;OAEG;IACH,UAAU,IAAI,IAAI;IAUlB;;;;;OAKG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;CAoFxF"}