@bitgo-beta/sdk-lib-mpc 8.2.1-alpha.46 → 8.2.1-alpha.460

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 (96) 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 +69 -0
  47. package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts.map +1 -0
  48. package/dist/src/tss/ecdsa-dkls/commsLayer.js +268 -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 +334 -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 +271 -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/eddsa-mps/commsLayer.d.ts +30 -0
  65. package/dist/src/tss/eddsa-mps/commsLayer.d.ts.map +1 -0
  66. package/dist/src/tss/eddsa-mps/commsLayer.js +96 -0
  67. package/dist/src/tss/eddsa-mps/dkg.d.ts +104 -0
  68. package/dist/src/tss/eddsa-mps/dkg.d.ts.map +1 -0
  69. package/dist/src/tss/eddsa-mps/dkg.js +293 -0
  70. package/dist/src/tss/eddsa-mps/dsg.d.ts +90 -0
  71. package/dist/src/tss/eddsa-mps/dsg.d.ts.map +1 -0
  72. package/dist/src/tss/eddsa-mps/dsg.js +278 -0
  73. package/dist/src/tss/eddsa-mps/index.d.ts +6 -0
  74. package/dist/src/tss/eddsa-mps/index.d.ts.map +1 -0
  75. package/dist/src/tss/eddsa-mps/index.js +42 -0
  76. package/dist/src/tss/eddsa-mps/types.d.ts +63 -0
  77. package/dist/src/tss/eddsa-mps/types.d.ts.map +1 -0
  78. package/dist/src/tss/eddsa-mps/types.js +105 -0
  79. package/dist/src/tss/eddsa-mps/util.d.ts +18 -0
  80. package/dist/src/tss/eddsa-mps/util.d.ts.map +1 -0
  81. package/dist/src/tss/eddsa-mps/util.js +60 -0
  82. package/dist/src/tss/index.d.ts +2 -0
  83. package/dist/src/tss/index.d.ts.map +1 -1
  84. package/dist/src/tss/index.js +8 -2
  85. package/dist/src/types.d.ts +0 -1
  86. package/dist/src/types.d.ts.map +1 -1
  87. package/dist/src/util.d.ts +0 -1
  88. package/dist/src/util.d.ts.map +1 -1
  89. package/dist/src/util.js +21 -22
  90. package/dist/tsconfig.tsbuildinfo +1 -1
  91. package/package.json +28 -5
  92. package/.eslintignore +0 -5
  93. package/CHANGELOG.md +0 -180
  94. package/dist/src/openssl/opensslbytes.d.ts +0 -4
  95. package/dist/src/openssl/opensslbytes.d.ts.map +0 -1
  96. package/dist/src/openssl/opensslbytes.js +0 -20
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DSG = void 0;
7
+ const assert_1 = __importDefault(require("assert"));
8
+ const wasm_mps_1 = require("@bitgo/wasm-mps");
9
+ const types_1 = require("./types");
10
+ /**
11
+ * EdDSA Distributed Sign Generation (DSG) implementation using @bitgo/wasm-mps.
12
+ *
13
+ * State is explicit: each WASM round function returns
14
+ * `{ msg, state }` bytes; the state bytes are stored between rounds and passed to the
15
+ * next round function (this is what a server would persist to a database between API
16
+ * rounds).
17
+ *
18
+ * The protocol is hard-coded 2-of-3: each signing party communicates with exactly one
19
+ * counterpart. `handleIncomingMessages` accepts both messages (own + counterpart), and
20
+ * filters own out internally.
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const dsg = new DSG(0); // partyIdx 0
25
+ * dsg.initDsg(keyShare, message, 'm', 2); // counterpart is party 2
26
+ * const msg1 = dsg.getFirstMessage();
27
+ * const msg2 = dsg.handleIncomingMessages([msg1, peerMsg1]); // emits SignMsg2
28
+ * const msg3 = dsg.handleIncomingMessages([msg2[0], peerMsg2]); // emits SignMsg3
29
+ * dsg.handleIncomingMessages([msg3[0], peerMsg3]); // completes DSG
30
+ * const signature = dsg.getSignature(); // 64-byte Ed25519 signature
31
+ * ```
32
+ */
33
+ class DSG {
34
+ constructor(partyIdx) {
35
+ this.otherPartyIdx = null;
36
+ /** Opaque bincode-serialised Keyshare from a prior DKG */
37
+ this.keyShare = null;
38
+ /** Raw message bytes to sign (Ed25519 hashes internally; no prehashing required) */
39
+ this.message = null;
40
+ /** BIP-32-style derivation path, e.g. "m" or "m/0/1". Folded in via Keyshare::derive_with_offset */
41
+ this.derivationPath = null;
42
+ /** Serialised round state bytes returned by the previous round function */
43
+ this.dsgStateBytes = null;
44
+ /** Final 64-byte Ed25519 signature, available after WaitMsg3 -> Complete */
45
+ this.signature = null;
46
+ this.dsgState = types_1.DsgState.Uninitialized;
47
+ this.partyIdx = partyIdx;
48
+ }
49
+ getState() {
50
+ return this.dsgState;
51
+ }
52
+ /**
53
+ * Initialises the DSG session. The keyshare must come from a prior DKG run, and
54
+ * `otherPartyIdx` must be the single counterpart who will co-sign with this party.
55
+ *
56
+ * @param keyShare - Opaque bincode-serialised Keyshare bytes from `DKG.getKeyShare()`.
57
+ * @param message - Raw message bytes to sign (no prehashing).
58
+ * @param derivationPath - BIP-32-style derivation path. Use `"m"` for the root key.
59
+ * @param otherPartyIdx - Party index of the single counterpart in this signing session.
60
+ * Must differ from this party's own `partyIdx` and be in `[0, 2]`.
61
+ */
62
+ initDsg(keyShare, message, derivationPath, otherPartyIdx) {
63
+ if (!keyShare || keyShare.length === 0) {
64
+ throw Error('Missing or invalid keyShare');
65
+ }
66
+ if (!message || message.length === 0) {
67
+ throw Error('Missing or invalid message');
68
+ }
69
+ if (this.partyIdx < 0 || this.partyIdx > 2) {
70
+ throw Error(`Invalid partyIdx ${this.partyIdx}: must be in [0, 2]`);
71
+ }
72
+ if (otherPartyIdx < 0 || otherPartyIdx > 2 || otherPartyIdx === this.partyIdx) {
73
+ throw Error(`Invalid otherPartyIdx ${otherPartyIdx}: must be in [0, 2] and != partyIdx`);
74
+ }
75
+ this.keyShare = keyShare;
76
+ this.message = message;
77
+ this.derivationPath = derivationPath;
78
+ this.otherPartyIdx = otherPartyIdx;
79
+ this.dsgState = types_1.DsgState.Init;
80
+ }
81
+ /**
82
+ * Runs round 0 of the DSG protocol. Returns this party's broadcast message
83
+ * (a `SignMsg1` containing the commitment to `R_i`). Stores the round state
84
+ * bytes internally for the next round.
85
+ */
86
+ getFirstMessage() {
87
+ if (this.dsgState !== types_1.DsgState.Init) {
88
+ throw Error('DSG session not initialized');
89
+ }
90
+ (0, assert_1.default)(this.keyShare, 'keyShare must be set after initDsg');
91
+ (0, assert_1.default)(this.derivationPath !== null, 'derivationPath must be set after initDsg');
92
+ (0, assert_1.default)(this.message, 'message must be set after initDsg');
93
+ let result;
94
+ try {
95
+ result = (0, wasm_mps_1.ed25519_dsg_round0_process)(this.keyShare, this.derivationPath, this.message);
96
+ }
97
+ catch (err) {
98
+ throw new Error(`Error while creating the first message from party ${this.partyIdx}: ${err}`);
99
+ }
100
+ this.dsgStateBytes = Buffer.from(result.state);
101
+ this.dsgState = types_1.DsgState.WaitMsg1;
102
+ return { payload: new Uint8Array(result.msg), from: this.partyIdx };
103
+ }
104
+ /**
105
+ * Handles incoming messages for the current round and advances the protocol.
106
+ *
107
+ * - In `WaitMsg1`: runs round 1, returns this party's `SignMsg2` broadcast.
108
+ * - In `WaitMsg2`: runs round 2 (which internally fuses two Silence Labs transitions),
109
+ * returns this party's `SignMsg3` broadcast (partial signature).
110
+ * - In `WaitMsg3`: runs round 3, completes DSG, returns `[]`.
111
+ *
112
+ * The caller passes both messages (own + counterpart) for symmetry with
113
+ * `DKG.handleIncomingMessages`. Own message is filtered out internally; only the
114
+ * counterpart's payload is forwarded to the WASM round function.
115
+ *
116
+ * @param messagesForIthRound - Both messages for this round (own + counterpart).
117
+ */
118
+ handleIncomingMessages(messagesForIthRound) {
119
+ if (this.dsgState === types_1.DsgState.Complete) {
120
+ throw Error('DSG session already completed');
121
+ }
122
+ if (this.dsgState === types_1.DsgState.Uninitialized) {
123
+ throw Error('DSG session not initialized');
124
+ }
125
+ if (this.dsgState === types_1.DsgState.Init) {
126
+ throw Error('DSG session must call getFirstMessage() before handling incoming messages. Call getFirstMessage() first.');
127
+ }
128
+ if (messagesForIthRound.length !== 2) {
129
+ throw Error('Invalid number of messages for the round. Expected 2 messages (own + counterpart) for 2-of-3 DSG');
130
+ }
131
+ const peerMessages = messagesForIthRound.filter((m) => m.from !== this.partyIdx);
132
+ if (peerMessages.length !== 1) {
133
+ throw Error(`Expected exactly 1 counterpart message; got ${peerMessages.length}`);
134
+ }
135
+ const peerMsg = peerMessages[0];
136
+ if (peerMsg.from !== this.otherPartyIdx) {
137
+ throw Error(`Unexpected counterpart party index: got ${peerMsg.from}, expected ${this.otherPartyIdx}`);
138
+ }
139
+ const peerPayload = Buffer.from(peerMsg.payload);
140
+ if (this.dsgState === types_1.DsgState.WaitMsg1) {
141
+ (0, assert_1.default)(this.dsgStateBytes, 'dsgStateBytes must be set in WaitMsg1');
142
+ let result;
143
+ try {
144
+ result = (0, wasm_mps_1.ed25519_dsg_round1_process)(peerPayload, this.dsgStateBytes);
145
+ }
146
+ catch (err) {
147
+ throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dsgState}: ${err}`);
148
+ }
149
+ this.dsgStateBytes = Buffer.from(result.state);
150
+ this.dsgState = types_1.DsgState.WaitMsg2;
151
+ return [{ payload: new Uint8Array(result.msg), from: this.partyIdx }];
152
+ }
153
+ if (this.dsgState === types_1.DsgState.WaitMsg2) {
154
+ (0, assert_1.default)(this.dsgStateBytes, 'dsgStateBytes must be set in WaitMsg2');
155
+ let result;
156
+ try {
157
+ result = (0, wasm_mps_1.ed25519_dsg_round2_process)(peerPayload, this.dsgStateBytes);
158
+ }
159
+ catch (err) {
160
+ throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dsgState}: ${err}`);
161
+ }
162
+ this.dsgStateBytes = Buffer.from(result.state);
163
+ this.dsgState = types_1.DsgState.WaitMsg3;
164
+ return [{ payload: new Uint8Array(result.msg), from: this.partyIdx }];
165
+ }
166
+ if (this.dsgState === types_1.DsgState.WaitMsg3) {
167
+ (0, assert_1.default)(this.dsgStateBytes, 'dsgStateBytes must be set in WaitMsg3');
168
+ let sigBytes;
169
+ try {
170
+ sigBytes = (0, wasm_mps_1.ed25519_dsg_round3_process)(peerPayload, this.dsgStateBytes);
171
+ }
172
+ catch (err) {
173
+ throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dsgState}: ${err}`);
174
+ }
175
+ this.signature = Buffer.from(sigBytes);
176
+ this.dsgStateBytes = null;
177
+ this.dsgState = types_1.DsgState.Complete;
178
+ return [];
179
+ }
180
+ throw Error('Unexpected DSG state');
181
+ }
182
+ /**
183
+ * Returns the final 64-byte Ed25519 signature produced by round 3.
184
+ * Only available once the protocol reaches `Complete`.
185
+ */
186
+ getSignature() {
187
+ if (!this.signature) {
188
+ throw Error('DSG session has not produced a signature yet');
189
+ }
190
+ return this.signature;
191
+ }
192
+ /**
193
+ * Exports the current session state as a JSON string for persistence.
194
+ * Includes the opaque round state bytes plus everything needed to re-enter the
195
+ * protocol after a restart (keyshare, message, derivation path, counterpart).
196
+ */
197
+ getSession() {
198
+ if (this.dsgState === types_1.DsgState.Complete) {
199
+ throw Error('DSG session is complete. Exporting the session is not allowed.');
200
+ }
201
+ if (this.dsgState === types_1.DsgState.Uninitialized) {
202
+ throw Error('DSG session not initialized');
203
+ }
204
+ if (this.dsgState === types_1.DsgState.Init) {
205
+ throw Error('DSG session must produce its first message before exporting.');
206
+ }
207
+ return JSON.stringify({
208
+ dsgStateBytes: this.dsgStateBytes?.toString('base64') ?? null,
209
+ dsgRound: this.dsgState,
210
+ keyShare: this.keyShare?.toString('base64') ?? null,
211
+ message: this.message?.toString('base64') ?? null,
212
+ derivationPath: this.derivationPath,
213
+ partyIdx: this.partyIdx,
214
+ otherPartyIdx: this.otherPartyIdx,
215
+ });
216
+ }
217
+ /**
218
+ * Restores a previously exported session. Allows the protocol to continue from
219
+ * where it left off, as if the round state was loaded from a database.
220
+ */
221
+ restoreSession(session) {
222
+ const data = JSON.parse(session);
223
+ if (!Object.values(types_1.DsgState).includes(data.dsgRound)) {
224
+ throw Error(`Invalid dsgRound in session: ${data.dsgRound}`);
225
+ }
226
+ if (data.dsgRound === types_1.DsgState.Uninitialized || data.dsgRound === types_1.DsgState.Init) {
227
+ throw Error(`Cannot restore DSG session in state ${data.dsgRound}`);
228
+ }
229
+ if (data.dsgRound === types_1.DsgState.Complete) {
230
+ throw Error('DSG session is complete. Restoring the session is not allowed.');
231
+ }
232
+ if (typeof data.partyIdx !== 'number' || data.partyIdx < 0 || data.partyIdx > 2) {
233
+ throw Error(`Invalid partyIdx in session: ${data.partyIdx}`);
234
+ }
235
+ if (typeof data.otherPartyIdx !== 'number' ||
236
+ data.otherPartyIdx < 0 ||
237
+ data.otherPartyIdx > 2 ||
238
+ data.otherPartyIdx === data.partyIdx) {
239
+ throw Error(`Invalid otherPartyIdx in session: ${data.otherPartyIdx}`);
240
+ }
241
+ if (this.partyIdx !== data.partyIdx) {
242
+ throw Error(`Session partyIdx ${data.partyIdx} does not match instance ${this.partyIdx}`);
243
+ }
244
+ if (typeof data.dsgStateBytes !== 'string' || data.dsgStateBytes.length === 0) {
245
+ throw Error(`Round ${data.dsgRound} requires dsgStateBytes`);
246
+ }
247
+ if (typeof data.keyShare !== 'string' || data.keyShare.length === 0) {
248
+ throw Error('Restored session missing keyShare');
249
+ }
250
+ if (typeof data.message !== 'string' || data.message.length === 0) {
251
+ throw Error('Restored session missing message');
252
+ }
253
+ if (typeof data.derivationPath !== 'string') {
254
+ throw Error('Restored session missing derivationPath');
255
+ }
256
+ const dsgStateBytes = Buffer.from(data.dsgStateBytes, 'base64');
257
+ const keyShare = Buffer.from(data.keyShare, 'base64');
258
+ const message = Buffer.from(data.message, 'base64');
259
+ if (dsgStateBytes.length === 0) {
260
+ throw Error(`Round ${data.dsgRound} requires dsgStateBytes`);
261
+ }
262
+ if (keyShare.length === 0) {
263
+ throw Error('Restored session missing keyShare');
264
+ }
265
+ if (message.length === 0) {
266
+ throw Error('Restored session missing message');
267
+ }
268
+ this.dsgStateBytes = dsgStateBytes;
269
+ this.dsgState = data.dsgRound;
270
+ this.keyShare = keyShare;
271
+ this.message = message;
272
+ this.derivationPath = data.derivationPath;
273
+ this.partyIdx = data.partyIdx;
274
+ this.otherPartyIdx = data.otherPartyIdx;
275
+ }
276
+ }
277
+ exports.DSG = DSG;
278
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHNnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9lZGRzYS1tcHMvZHNnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUE0QjtBQUM1Qiw4Q0FLeUI7QUFDekIsbUNBQThFO0FBRTlFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBYSxHQUFHO0lBa0JkLFlBQVksUUFBZ0I7UUFoQmxCLGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQUU5QywwREFBMEQ7UUFDbEQsYUFBUSxHQUFrQixJQUFJLENBQUM7UUFDdkMsb0ZBQW9GO1FBQzVFLFlBQU8sR0FBa0IsSUFBSSxDQUFDO1FBQ3RDLG9HQUFvRztRQUM1RixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFFN0MsMkVBQTJFO1FBQ25FLGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQUM1Qyw0RUFBNEU7UUFDcEUsY0FBUyxHQUFrQixJQUFJLENBQUM7UUFFOUIsYUFBUSxHQUFhLGdCQUFRLENBQUMsYUFBYSxDQUFDO1FBR3BELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxPQUFPLENBQUMsUUFBZ0IsRUFBRSxPQUFlLEVBQUUsY0FBc0IsRUFBRSxhQUFxQjtRQUN0RixJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkMsTUFBTSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUNELElBQUksSUFBSSxD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LENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzFDLENBQUM7Q0FDRjtBQXpRRCxrQkF5UUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge1xuICBlZDI1NTE5X2RzZ19yb3VuZDBfcHJvY2VzcyxcbiAgZWQyNTUxOV9kc2dfcm91bmQxX3Byb2Nlc3MsXG4gIGVkMjU1MTlfZHNnX3JvdW5kMl9wcm9jZXNzLFxuICBlZDI1NTE5X2RzZ19yb3VuZDNfcHJvY2Vzcyxcbn0gZnJvbSAnQGJpdGdvL3dhc20tbXBzJztcbmltcG9ydCB7IERlc2VyaWFsaXplZE1lc3NhZ2UsIERlc2VyaWFsaXplZE1lc3NhZ2VzLCBEc2dTdGF0ZSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIEVkRFNBIERpc3RyaWJ1dGVkIFNpZ24gR2VuZXJhdGlvbiAoRFNHKSBpbXBsZW1lbnRhdGlvbiB1c2luZyBAYml0Z28vd2FzbS1tcHMuXG4gKlxuICogU3RhdGUgaXMgZXhwbGljaXQ6IGVhY2ggV0FTTSByb3VuZCBmdW5jdGlvbiByZXR1cm5zXG4gKiBgeyBtc2csIHN0YXRlIH1gIGJ5dGVzOyB0aGUgc3RhdGUgYnl0ZXMgYXJlIHN0b3JlZCBiZXR3ZWVuIHJvdW5kcyBhbmQgcGFzc2VkIHRvIHRoZVxuICogbmV4dCByb3VuZCBmdW5jdGlvbiAodGhpcyBpcyB3aGF0IGEgc2VydmVyIHdvdWxkIHBlcnNpc3QgdG8gYSBkYXRhYmFzZSBiZXR3ZWVuIEFQSVxuICogcm91bmRzKS5cbiAqXG4gKiBUaGUgcHJvdG9jb2wgaXMgaGFyZC1jb2RlZCAyLW9mLTM6IGVhY2ggc2lnbmluZyBwYXJ0eSBjb21tdW5pY2F0ZXMgd2l0aCBleGFjdGx5IG9uZVxuICogY291bnRlcnBhcnQuIGBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzYCBhY2NlcHRzIGJvdGggbWVzc2FnZXMgKG93biArIGNvdW50ZXJwYXJ0KSwgYW5kXG4gKiBmaWx0ZXJzIG93biBvdXQgaW50ZXJuYWxseS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZHNnID0gbmV3IERTRygwKTsgIC8vIHBhcnR5SWR4IDBcbiAqIGRzZy5pbml0RHNnKGtleVNoYXJlLCBtZXNzYWdlLCAnbScsIDIpOyAgLy8gY291bnRlcnBhcnQgaXMgcGFydHkgMlxuICogY29uc3QgbXNnMSA9IGRzZy5nZXRGaXJzdE1lc3NhZ2UoKTtcbiAqIGNvbnN0IG1zZzIgPSBkc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbbXNnMSwgcGVlck1zZzFdKTsgIC8vIGVtaXRzIFNpZ25Nc2cyXG4gKiBjb25zdCBtc2czID0gZHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW21zZzJbMF0sIHBlZXJNc2cyXSk7ICAvLyBlbWl0cyBTaWduTXNnM1xuICogZHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW21zZzNbMF0sIHBlZXJNc2czXSk7ICAvLyBjb21wbGV0ZXMgRFNHXG4gKiBjb25zdCBzaWduYXR1cmUgPSBkc2cuZ2V0U2lnbmF0dXJlKCk7ICAvLyA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIERTRyB7XG4gIHByb3RlY3RlZCBwYXJ0eUlkeDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgb3RoZXJQYXJ0eUlkeDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIE9wYXF1ZSBiaW5jb2RlLXNlcmlhbGlzZWQgS2V5c2hhcmUgZnJvbSBhIHByaW9yIERLRyAqL1xuICBwcml2YXRlIGtleVNoYXJlOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFJhdyBtZXNzYWdlIGJ5dGVzIHRvIHNpZ24gKEVkMjU1MTkgaGFzaGVzIGludGVybmFsbHk7IG5vIHByZWhhc2hpbmcgcmVxdWlyZWQpICovXG4gIHByaXZhdGUgbWVzc2FnZTogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBCSVAtMzItc3R5bGUgZGVyaXZhdGlvbiBwYXRoLCBlLmcuIFwibVwiIG9yIFwibS8wLzFcIi4gRm9sZGVkIGluIHZpYSBLZXlzaGFyZTo6ZGVyaXZlX3dpdGhfb2Zmc2V0ICovXG4gIHByaXZhdGUgZGVyaXZhdGlvblBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBTZXJpYWxpc2VkIHJvdW5kIHN0YXRlIGJ5dGVzIHJldHVybmVkIGJ5IHRoZSBwcmV2aW91cyByb3VuZCBmdW5jdGlvbiAqL1xuICBwcml2YXRlIGRzZ1N0YXRlQnl0ZXM6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuICAvKiogRmluYWwgNjQtYnl0ZSBFZDI1NTE5IHNpZ25hdHVyZSwgYXZhaWxhYmxlIGFmdGVyIFdhaXRNc2czIC0+IENvbXBsZXRlICovXG4gIHByaXZhdGUgc2lnbmF0dXJlOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgZHNnU3RhdGU6IERzZ1N0YXRlID0gRHNnU3RhdGUuVW5pbml0aWFsaXplZDtcblxuICBjb25zdHJ1Y3RvcihwYXJ0eUlkeDogbnVtYmVyKSB7XG4gICAgdGhpcy5wYXJ0eUlkeCA9IHBhcnR5SWR4O1xuICB9XG5cbiAgZ2V0U3RhdGUoKTogRHNnU3RhdGUge1xuICAgIHJldHVybiB0aGlzLmRzZ1N0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpc2VzIHRoZSBEU0cgc2Vzc2lvbi4gVGhlIGtleXNoYXJlIG11c3QgY29tZSBmcm9tIGEgcHJpb3IgREtHIHJ1biwgYW5kXG4gICAqIGBvdGhlclBhcnR5SWR4YCBtdXN0IGJlIHRoZSBzaW5nbGUgY291bnRlcnBhcnQgd2hvIHdpbGwgY28tc2lnbiB3aXRoIHRoaXMgcGFydHkuXG4gICAqXG4gICAqIEBwYXJhbSBrZXlTaGFyZSAtIE9wYXF1ZSBiaW5jb2RlLXNlcmlhbGlzZWQgS2V5c2hhcmUgYnl0ZXMgZnJvbSBgREtHLmdldEtleVNoYXJlKClgLlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFJhdyBtZXNzYWdlIGJ5dGVzIHRvIHNpZ24gKG5vIHByZWhhc2hpbmcpLlxuICAgKiBAcGFyYW0gZGVyaXZhdGlvblBhdGggLSBCSVAtMzItc3R5bGUgZGVyaXZhdGlvbiBwYXRoLiBVc2UgYFwibVwiYCBmb3IgdGhlIHJvb3Qga2V5LlxuICAgKiBAcGFyYW0gb3RoZXJQYXJ0eUlkeCAtIFBhcnR5IGluZGV4IG9mIHRoZSBzaW5nbGUgY291bnRlcnBhcnQgaW4gdGhpcyBzaWduaW5nIHNlc3Npb24uXG4gICAqICAgTXVzdCBkaWZmZXIgZnJvbSB0aGlzIHBhcnR5J3Mgb3duIGBwYXJ0eUlkeGAgYW5kIGJlIGluIGBbMCwgMl1gLlxuICAgKi9cbiAgaW5pdERzZyhrZXlTaGFyZTogQnVmZmVyLCBtZXNzYWdlOiBCdWZmZXIsIGRlcml2YXRpb25QYXRoOiBzdHJpbmcsIG90aGVyUGFydHlJZHg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICgha2V5U2hhcmUgfHwga2V5U2hhcmUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBvciBpbnZhbGlkIGtleVNoYXJlJyk7XG4gICAgfVxuICAgIGlmICghbWVzc2FnZSB8fCBtZXNzYWdlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ01pc3Npbmcgb3IgaW52YWxpZCBtZXNzYWdlJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcnR5SWR4IDwgMCB8fCB0aGlzLnBhcnR5SWR4ID4gMikge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgcGFydHlJZHggJHt0aGlzLnBhcnR5SWR4fTogbXVzdCBiZSBpbiBbMCwgMl1gKTtcbiAgICB9XG4gICAgaWYgKG90aGVyUGFydHlJZHggPCAwIHx8IG90aGVyUGFydHlJZHggPiAyIHx8IG90aGVyUGFydHlJZHggPT09IHRoaXMucGFydHlJZHgpIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIG90aGVyUGFydHlJZHggJHtvdGhlclBhcnR5SWR4fTogbXVzdCBiZSBpbiBbMCwgMl0gYW5kICE9IHBhcnR5SWR4YCk7XG4gICAgfVxuXG4gICAgdGhpcy5rZXlTaGFyZSA9IGtleVNoYXJlO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5kZXJpdmF0aW9uUGF0aCA9IGRlcml2YXRpb25QYXRoO1xuICAgIHRoaXMub3RoZXJQYXJ0eUlkeCA9IG90aGVyUGFydHlJZHg7XG4gICAgdGhpcy5kc2dTdGF0ZSA9IERzZ1N0YXRlLkluaXQ7XG4gIH1cblxuICAvKipcbiAgICogUnVucyByb3VuZCAwIG9mIHRoZSBEU0cgcHJvdG9jb2wuIFJldHVybnMgdGhpcyBwYXJ0eSdzIGJyb2FkY2FzdCBtZXNzYWdlXG4gICAqIChhIGBTaWduTXNnMWAgY29udGFpbmluZyB0aGUgY29tbWl0bWVudCB0byBgUl9pYCkuIFN0b3JlcyB0aGUgcm91bmQgc3RhdGVcbiAgICogYnl0ZXMgaW50ZXJuYWxseSBmb3IgdGhlIG5leHQgcm91bmQuXG4gICAqL1xuICBnZXRGaXJzdE1lc3NhZ2UoKTogRGVzZXJpYWxpemVkTWVzc2FnZSB7XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgIT09IERzZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgYXNzZXJ0KHRoaXMua2V5U2hhcmUsICdrZXlTaGFyZSBtdXN0IGJlIHNldCBhZnRlciBpbml0RHNnJyk7XG4gICAgYXNzZXJ0KHRoaXMuZGVyaXZhdGlvblBhdGggIT09IG51bGwsICdkZXJpdmF0aW9uUGF0aCBtdXN0IGJlIHNldCBhZnRlciBpbml0RHNnJyk7XG4gICAgYXNzZXJ0KHRoaXMubWVzc2FnZSwgJ21lc3NhZ2UgbXVzdCBiZSBzZXQgYWZ0ZXIgaW5pdERzZycpO1xuXG4gICAgbGV0IHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZWQyNTUxOV9kc2dfcm91bmQwX3Byb2Nlc3ModGhpcy5rZXlTaGFyZSwgdGhpcy5kZXJpdmF0aW9uUGF0aCwgdGhpcy5tZXNzYWdlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGZpcnN0IG1lc3NhZ2UgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9OiAke2Vycn1gKTtcbiAgICB9XG5cbiAgICB0aGlzLmRzZ1N0YXRlQnl0ZXMgPSBCdWZmZXIuZnJvbShyZXN1bHQuc3RhdGUpO1xuICAgIHRoaXMuZHNnU3RhdGUgPSBEc2dTdGF0ZS5XYWl0TXNnMTtcbiAgICByZXR1cm4geyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyZXN1bHQubXNnKSwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgaW5jb21pbmcgbWVzc2FnZXMgZm9yIHRoZSBjdXJyZW50IHJvdW5kIGFuZCBhZHZhbmNlcyB0aGUgcHJvdG9jb2wuXG4gICAqXG4gICAqIC0gSW4gYFdhaXRNc2cxYDogcnVucyByb3VuZCAxLCByZXR1cm5zIHRoaXMgcGFydHkncyBgU2lnbk1zZzJgIGJyb2FkY2FzdC5cbiAgICogLSBJbiBgV2FpdE1zZzJgOiBydW5zIHJvdW5kIDIgKHdoaWNoIGludGVybmFsbHkgZnVzZXMgdHdvIFNpbGVuY2UgTGFicyB0cmFuc2l0aW9ucyksXG4gICAqICAgcmV0dXJucyB0aGlzIHBhcnR5J3MgYFNpZ25Nc2czYCBicm9hZGNhc3QgKHBhcnRpYWwgc2lnbmF0dXJlKS5cbiAgICogLSBJbiBgV2FpdE1zZzNgOiBydW5zIHJvdW5kIDMsIGNvbXBsZXRlcyBEU0csIHJldHVybnMgYFtdYC5cbiAgICpcbiAgICogVGhlIGNhbGxlciBwYXNzZXMgYm90aCBtZXNzYWdlcyAob3duICsgY291bnRlcnBhcnQpIGZvciBzeW1tZXRyeSB3aXRoXG4gICAqIGBES0cuaGFuZGxlSW5jb21pbmdNZXNzYWdlc2AuIE93biBtZXNzYWdlIGlzIGZpbHRlcmVkIG91dCBpbnRlcm5hbGx5OyBvbmx5IHRoZVxuICAgKiBjb3VudGVycGFydCdzIHBheWxvYWQgaXMgZm9yd2FyZGVkIHRvIHRoZSBXQVNNIHJvdW5kIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZXNGb3JJdGhSb3VuZCAtIEJvdGggbWVzc2FnZXMgZm9yIHRoaXMgcm91bmQgKG93biArIGNvdW50ZXJwYXJ0KS5cbiAgICovXG4gIGhhbmRsZUluY29taW5nTWVzc2FnZXMobWVzc2FnZXNGb3JJdGhSb3VuZDogRGVzZXJpYWxpemVkTWVzc2FnZXMpOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyB7XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IERzZ1N0YXRlLkNvbXBsZXRlKSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gYWxyZWFkeSBjb21wbGV0ZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IERzZ1N0YXRlLlVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IERzZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAnRFNHIHNlc3Npb24gbXVzdCBjYWxsIGdldEZpcnN0TWVzc2FnZSgpIGJlZm9yZSBoYW5kbGluZyBpbmNvbWluZyBtZXNzYWdlcy4gQ2FsbCBnZXRGaXJzdE1lc3NhZ2UoKSBmaXJzdC4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZXNGb3JJdGhSb3VuZC5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIG51bWJlciBvZiBtZXNzYWdlcyBmb3IgdGhlIHJvdW5kLiBFeHBlY3RlZCAyIG1lc3NhZ2VzIChvd24gKyBjb3VudGVycGFydCkgZm9yIDItb2YtMyBEU0cnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwZWVyTWVzc2FnZXMgPSBtZXNzYWdlc0Zvckl0aFJvdW5kLmZpbHRlcigobSkgPT4gbS5mcm9tICE9PSB0aGlzLnBhcnR5SWR4KTtcbiAgICBpZiAocGVlck1lc3NhZ2VzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEV4cGVjdGVkIGV4YWN0bHkgMSBjb3VudGVycGFydCBtZXNzYWdlOyBnb3QgJHtwZWVyTWVzc2FnZXMubGVuZ3RofWApO1xuICAgIH1cbiAgICBjb25zdCBwZWVyTXNnID0gcGVlck1lc3NhZ2VzWzBdO1xuICAgIGlmIChwZWVyTXNnLmZyb20gIT09IHRoaXMub3RoZXJQYXJ0eUlkeCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFVuZXhwZWN0ZWQgY291bnRlcnBhcnQgcGFydHkgaW5kZXg6IGdvdCAke3BlZXJNc2cuZnJvbX0sIGV4cGVjdGVkICR7dGhpcy5vdGhlclBhcnR5SWR4fWApO1xuICAgIH1cbiAgICBjb25zdCBwZWVyUGF5bG9hZCA9IEJ1ZmZlci5mcm9tKHBlZXJNc2cucGF5bG9hZCk7XG5cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gRHNnU3RhdGUuV2FpdE1zZzEpIHtcbiAgICAgIGFzc2VydCh0aGlzLmRzZ1N0YXRlQnl0ZXMsICdkc2dTdGF0ZUJ5dGVzIG11c3QgYmUgc2V0IGluIFdhaXRNc2cxJyk7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZWQyNTUxOV9kc2dfcm91bmQxX3Byb2Nlc3MocGVlclBheWxvYWQsIHRoaXMuZHNnU3RhdGVCeXRlcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5kc2dTdGF0ZX06ICR7ZXJyfWApO1xuICAgICAgfVxuICAgICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20ocmVzdWx0LnN0YXRlKTtcbiAgICAgIHRoaXMuZHNnU3RhdGUgPSBEc2dTdGF0ZS5XYWl0TXNnMjtcbiAgICAgIHJldHVybiBbeyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyZXN1bHQubXNnKSwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gRHNnU3RhdGUuV2FpdE1zZzIpIHtcbiAgICAgIGFzc2VydCh0aGlzLmRzZ1N0YXRlQnl0ZXMsICdkc2dTdGF0ZUJ5dGVzIG11c3QgYmUgc2V0IGluIFdhaXRNc2cyJyk7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZWQyNTUxOV9kc2dfcm91bmQyX3Byb2Nlc3MocGVlclBheWxvYWQsIHRoaXMuZHNnU3RhdGVCeXRlcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5kc2dTdGF0ZX06ICR7ZXJyfWApO1xuICAgICAgfVxuICAgICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20ocmVzdWx0LnN0YXRlKTtcbiAgICAgIHRoaXMuZHNnU3RhdGUgPSBEc2dTdGF0ZS5XYWl0TXNnMztcbiAgICAgIHJldHVybiBbeyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyZXN1bHQubXNnKSwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gRHNnU3RhdGUuV2FpdE1zZzMpIHtcbiAgICAgIGFzc2VydCh0aGlzLmRzZ1N0YXRlQnl0ZXMsICdkc2dTdGF0ZUJ5dGVzIG11c3QgYmUgc2V0IGluIFdhaXRNc2czJyk7XG4gICAgICBsZXQgc2lnQnl0ZXM7XG4gICAgICB0cnkge1xuICAgICAgICBzaWdCeXRlcyA9IGVkMjU1MTlfZHNnX3JvdW5kM19wcm9jZXNzKHBlZXJQYXlsb2FkLCB0aGlzLmRzZ1N0YXRlQnl0ZXMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgbWVzc2FnZXMgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9LCByb3VuZCAke3RoaXMuZHNnU3RhdGV9OiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2lnbmF0dXJlID0gQnVmZmVyLmZyb20oc2lnQnl0ZXMpO1xuICAgICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gbnVsbDtcbiAgICAgIHRoaXMuZHNnU3RhdGUgPSBEc2dTdGF0ZS5Db21wbGV0ZTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB0aHJvdyBFcnJvcignVW5leHBlY3RlZCBEU0cgc3RhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaW5hbCA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlIHByb2R1Y2VkIGJ5IHJvdW5kIDMuXG4gICAqIE9ubHkgYXZhaWxhYmxlIG9uY2UgdGhlIHByb3RvY29sIHJlYWNoZXMgYENvbXBsZXRlYC5cbiAgICovXG4gIGdldFNpZ25hdHVyZSgpOiBCdWZmZXIge1xuICAgIGlmICghdGhpcy5zaWduYXR1cmUpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBoYXMgbm90IHByb2R1Y2VkIGEgc2lnbmF0dXJlIHlldCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaWduYXR1cmU7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0cyB0aGUgY3VycmVudCBzZXNzaW9uIHN0YXRlIGFzIGEgSlNPTiBzdHJpbmcgZm9yIHBlcnNpc3RlbmNlLlxuICAgKiBJbmNsdWRlcyB0aGUgb3BhcXVlIHJvdW5kIHN0YXRlIGJ5dGVzIHBsdXMgZXZlcnl0aGluZyBuZWVkZWQgdG8gcmUtZW50ZXIgdGhlXG4gICAqIHByb3RvY29sIGFmdGVyIGEgcmVzdGFydCAoa2V5c2hhcmUsIG1lc3NhZ2UsIGRlcml2YXRpb24gcGF0aCwgY291bnRlcnBhcnQpLlxuICAgKi9cbiAgZ2V0U2Vzc2lvbigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBEc2dTdGF0ZS5Db21wbGV0ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RTRyBzZXNzaW9uIGlzIGNvbXBsZXRlLiBFeHBvcnRpbmcgdGhlIHNlc3Npb24gaXMgbm90IGFsbG93ZWQuJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBEc2dTdGF0ZS5VbmluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBEc2dTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gbXVzdCBwcm9kdWNlIGl0cyBmaXJzdCBtZXNzYWdlIGJlZm9yZSBleHBvcnRpbmcuJyk7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBkc2dTdGF0ZUJ5dGVzOiB0aGlzLmRzZ1N0YXRlQnl0ZXM/LnRvU3RyaW5nKCdiYXNlNjQnKSA/PyBudWxsLFxuICAgICAgZHNnUm91bmQ6IHRoaXMuZHNnU3RhdGUsXG4gICAgICBrZXlTaGFyZTogdGhpcy5rZXlTaGFyZT8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2U/LnRvU3RyaW5nKCdiYXNlNjQnKSA/PyBudWxsLFxuICAgICAgZGVyaXZhdGlvblBhdGg6IHRoaXMuZGVyaXZhdGlvblBhdGgsXG4gICAgICBwYXJ0eUlkeDogdGhpcy5wYXJ0eUlkeCxcbiAgICAgIG90aGVyUGFydHlJZHg6IHRoaXMub3RoZXJQYXJ0eUlkeCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlcyBhIHByZXZpb3VzbHkgZXhwb3J0ZWQgc2Vzc2lvbi4gQWxsb3dzIHRoZSBwcm90b2NvbCB0byBjb250aW51ZSBmcm9tXG4gICAqIHdoZXJlIGl0IGxlZnQgb2ZmLCBhcyBpZiB0aGUgcm91bmQgc3RhdGUgd2FzIGxvYWRlZCBmcm9tIGEgZGF0YWJhc2UuXG4gICAqL1xuICByZXN0b3JlU2Vzc2lvbihzZXNzaW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShzZXNzaW9uKTtcbiAgICBpZiAoIU9iamVjdC52YWx1ZXMoRHNnU3RhdGUpLmluY2x1ZGVzKGRhdGEuZHNnUm91bmQpKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBkc2dSb3VuZCBpbiBzZXNzaW9uOiAke2RhdGEuZHNnUm91bmR9YCk7XG4gICAgfVxuICAgIGlmIChkYXRhLmRzZ1JvdW5kID09PSBEc2dTdGF0ZS5VbmluaXRpYWxpemVkIHx8IGRhdGEuZHNnUm91bmQgPT09IERzZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKGBDYW5ub3QgcmVzdG9yZSBEU0cgc2Vzc2lvbiBpbiBzdGF0ZSAke2RhdGEuZHNnUm91bmR9YCk7XG4gICAgfVxuICAgIGlmIChkYXRhLmRzZ1JvdW5kID09PSBEc2dTdGF0ZS5Db21wbGV0ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RTRyBzZXNzaW9uIGlzIGNvbXBsZXRlLiBSZXN0b3JpbmcgdGhlIHNlc3Npb24gaXMgbm90IGFsbG93ZWQuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YS5wYXJ0eUlkeCAhPT0gJ251bWJlcicgfHwgZGF0YS5wYXJ0eUlkeCA8IDAgfHwgZGF0YS5wYXJ0eUlkeCA+IDIpIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIHBhcnR5SWR4IGluIHNlc3Npb246ICR7ZGF0YS5wYXJ0eUlkeH1gKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGEub3RoZXJQYXJ0eUlkeCAhPT0gJ251bWJlcicgfHxcbiAgICAgIGRhdGEub3RoZXJQYXJ0eUlkeCA8IDAgfHxcbiAgICAgIGRhdGEub3RoZXJQYXJ0eUlkeCA+IDIgfHxcbiAgICAgIGRhdGEub3RoZXJQYXJ0eUlkeCA9PT0gZGF0YS5wYXJ0eUlkeFxuICAgICkge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgb3RoZXJQYXJ0eUlkeCBpbiBzZXNzaW9uOiAke2RhdGEub3RoZXJQYXJ0eUlkeH1gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFydHlJZHggIT09IGRhdGEucGFydHlJZHgpIHtcbiAgICAgIHRocm93IEVycm9yKGBTZXNzaW9uIHBhcnR5SWR4ICR7ZGF0YS5wYXJ0eUlkeH0gZG9lcyBub3QgbWF0Y2ggaW5zdGFuY2UgJHt0aGlzLnBhcnR5SWR4fWApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEuZHNnU3RhdGVCeXRlcyAhPT0gJ3N0cmluZycgfHwgZGF0YS5kc2dTdGF0ZUJ5dGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFJvdW5kICR7ZGF0YS5kc2dSb3VuZH0gcmVxdWlyZXMgZHNnU3RhdGVCeXRlc2ApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEua2V5U2hhcmUgIT09ICdzdHJpbmcnIHx8IGRhdGEua2V5U2hhcmUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignUmVzdG9yZWQgc2Vzc2lvbiBtaXNzaW5nIGtleVNoYXJlJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YS5tZXNzYWdlICE9PSAnc3RyaW5nJyB8fCBkYXRhLm1lc3NhZ2UubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignUmVzdG9yZWQgc2Vzc2lvbiBtaXNzaW5nIG1lc3NhZ2UnKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhLmRlcml2YXRpb25QYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBkZXJpdmF0aW9uUGF0aCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGRzZ1N0YXRlQnl0ZXMgPSBCdWZmZXIuZnJvbShkYXRhLmRzZ1N0YXRlQnl0ZXMsICdiYXNlNjQnKTtcbiAgICBjb25zdCBrZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKGRhdGEua2V5U2hhcmUsICdiYXNlNjQnKTtcbiAgICBjb25zdCBtZXNzYWdlID0gQnVmZmVyLmZyb20oZGF0YS5tZXNzYWdlLCAnYmFzZTY0Jyk7XG4gICAgaWYgKGRzZ1N0YXRlQnl0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcihgUm91bmQgJHtkYXRhLmRzZ1JvdW5kfSByZXF1aXJlcyBkc2dTdGF0ZUJ5dGVzYCk7XG4gICAgfVxuICAgIGlmIChrZXlTaGFyZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdSZXN0b3JlZCBzZXNzaW9uIG1pc3Npbmcga2V5U2hhcmUnKTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2UubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignUmVzdG9yZWQgc2Vzc2lvbiBtaXNzaW5nIG1lc3NhZ2UnKTtcbiAgICB9XG5cbiAgICB0aGlzLmRzZ1N0YXRlQnl0ZXMgPSBkc2dTdGF0ZUJ5dGVzO1xuICAgIHRoaXMuZHNnU3RhdGUgPSBkYXRhLmRzZ1JvdW5kO1xuICAgIHRoaXMua2V5U2hhcmUgPSBrZXlTaGFyZTtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuZGVyaXZhdGlvblBhdGggPSBkYXRhLmRlcml2YXRpb25QYXRoO1xuICAgIHRoaXMucGFydHlJZHggPSBkYXRhLnBhcnR5SWR4O1xuICAgIHRoaXMub3RoZXJQYXJ0eUlkeCA9IGRhdGEub3RoZXJQYXJ0eUlkeDtcbiAgfVxufVxuIl19
@@ -0,0 +1,6 @@
1
+ export * as EddsaMPSDkg from './dkg';
2
+ export * as EddsaMPSDsg from './dsg';
3
+ export * as MPSUtil from './util';
4
+ export * as MPSTypes from './types';
5
+ export * as MPSComms from './commsLayer';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,WAAW,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,OAAO,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,QAAQ,MAAM,SAAS,CAAC;AACpC,OAAO,KAAK,QAAQ,MAAM,cAAc,CAAC"}
@@ -0,0 +1,42 @@
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.MPSComms = exports.MPSTypes = exports.MPSUtil = exports.EddsaMPSDsg = exports.EddsaMPSDkg = void 0;
37
+ exports.EddsaMPSDkg = __importStar(require("./dkg"));
38
+ exports.EddsaMPSDsg = __importStar(require("./dsg"));
39
+ exports.MPSUtil = __importStar(require("./util"));
40
+ exports.MPSTypes = __importStar(require("./types"));
41
+ exports.MPSComms = __importStar(require("./commsLayer"));
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL2VkZHNhLW1wcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBcUM7QUFDckMscURBQXFDO0FBQ3JDLGtEQUFrQztBQUNsQyxvREFBb0M7QUFDcEMseURBQXlDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogYXMgRWRkc2FNUFNEa2cgZnJvbSAnLi9ka2cnO1xuZXhwb3J0ICogYXMgRWRkc2FNUFNEc2cgZnJvbSAnLi9kc2cnO1xuZXhwb3J0ICogYXMgTVBTVXRpbCBmcm9tICcuL3V0aWwnO1xuZXhwb3J0ICogYXMgTVBTVHlwZXMgZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgKiBhcyBNUFNDb21tcyBmcm9tICcuL2NvbW1zTGF5ZXInO1xuIl19
@@ -0,0 +1,63 @@
1
+ import * as t from 'io-ts';
2
+ export declare const ReducedKeyShareType: t.TypeC<{
3
+ keyShare: t.ArrayC<t.NumberC>;
4
+ pub: t.ArrayC<t.NumberC>;
5
+ rootChainCode: t.ArrayC<t.NumberC>;
6
+ }>;
7
+ export type EddsaReducedKeyShare = t.TypeOf<typeof ReducedKeyShareType>;
8
+ /**
9
+ * Represents the state of a DKG (Distributed Key Generation) session
10
+ */
11
+ export declare enum DkgState {
12
+ /** DKG session has not been initialized */
13
+ Uninitialized = "Uninitialized",
14
+ /** DKG session has been initialized (Init state in WASM) */
15
+ Init = "Init",
16
+ /** DKG session is waiting for first message (WaitMsg1 state in WASM) */
17
+ WaitMsg1 = "WaitMsg1",
18
+ /** DKG session is waiting for second message (WaitMsg2 state in WASM) */
19
+ WaitMsg2 = "WaitMsg2",
20
+ /** DKG session has generated key shares (Share state in WASM) */
21
+ Share = "Share",
22
+ /** DKG session has completed successfully and key shares are available */
23
+ Complete = "Complete"
24
+ }
25
+ /**
26
+ * Represents the state of a DSG (Distributed Sign Generation) session.
27
+ */
28
+ export declare enum DsgState {
29
+ /** DSG session has not been initialized */
30
+ Uninitialized = "Uninitialized",
31
+ /** initDsg() has been called; ready for getFirstMessage() */
32
+ Init = "Init",
33
+ /** R0 broadcast emitted; waiting for counterpart's R0 broadcast (SignMsg1) */
34
+ WaitMsg1 = "WaitMsg1",
35
+ /** R1 broadcast emitted; waiting for counterpart's R1 broadcast (SignMsg2) */
36
+ WaitMsg2 = "WaitMsg2",
37
+ /** R2 broadcast emitted; waiting for counterpart's R2 broadcast (SignMsg3, the partial sig) */
38
+ WaitMsg3 = "WaitMsg3",
39
+ /** Final 64-byte Ed25519 signature is available via getSignature() */
40
+ Complete = "Complete"
41
+ }
42
+ export interface Message<T> {
43
+ payload: T;
44
+ from: number;
45
+ }
46
+ export type SerializedMessage = Message<string>;
47
+ export type SerializedMessages = Message<string>[];
48
+ export type DeserializedMessage = Message<Uint8Array>;
49
+ export type DeserializedMessages = Message<Uint8Array>[];
50
+ export declare function serializeMessage(msg: DeserializedMessage): SerializedMessage;
51
+ export declare function deserializeMessage(msg: SerializedMessage): DeserializedMessage;
52
+ export declare function serializeMessages(msgs: DeserializedMessages): SerializedMessages;
53
+ export declare function deserializeMessages(msgs: SerializedMessages): DeserializedMessages;
54
+ /** A PGP detached-signed message by a party.
55
+ * `message` is the raw payload encoded as base64.
56
+ * `signature` is an armored PGP detached signature over those bytes.
57
+ */
58
+ export interface MPSSignedMessage {
59
+ message: string;
60
+ signature: string;
61
+ }
62
+ export declare function getDecodedReducedKeyShare(reducedKeyShare: Buffer | Uint8Array): EddsaReducedKeyShare;
63
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAE3B,eAAO,MAAM,mBAAmB;;;;EAI9B,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAExE;;GAEG;AACH,oBAAY,QAAQ;IAClB,2CAA2C;IAC3C,aAAa,kBAAkB;IAC/B,4DAA4D;IAC5D,IAAI,SAAS;IACb,wEAAwE;IACxE,QAAQ,aAAa;IACrB,yEAAyE;IACzE,QAAQ,aAAa;IACrB,iEAAiE;IACjE,KAAK,UAAU;IACf,0EAA0E;IAC1E,QAAQ,aAAa;CACtB;AAED;;GAEG;AACH,oBAAY,QAAQ;IAClB,2CAA2C;IAC3C,aAAa,kBAAkB;IAC/B,6DAA6D;IAC7D,IAAI,SAAS;IACb,8EAA8E;IAC9E,QAAQ,aAAa;IACrB,8EAA8E;IAC9E,QAAQ,aAAa;IACrB,+FAA+F;IAC/F,QAAQ,aAAa;IACrB,sEAAsE;IACtE,QAAQ,aAAa;CACtB;AAED,MAAM,WAAW,OAAO,CAAC,CAAC;IACxB,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAEhD,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;AAEnD,MAAM,MAAM,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtD,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;AAEzD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,mBAAmB,GAAG,iBAAiB,CAE5E;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG,mBAAmB,CAE9E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,oBAAoB,GAAG,kBAAkB,CAEhF;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,GAAG,oBAAoB,CAElF;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,yBAAyB,CAAC,eAAe,EAAE,MAAM,GAAG,UAAU,GAAG,oBAAoB,CAMpG"}
@@ -0,0 +1,105 @@
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.DsgState = exports.DkgState = exports.ReducedKeyShareType = void 0;
37
+ exports.serializeMessage = serializeMessage;
38
+ exports.deserializeMessage = deserializeMessage;
39
+ exports.serializeMessages = serializeMessages;
40
+ exports.deserializeMessages = deserializeMessages;
41
+ exports.getDecodedReducedKeyShare = getDecodedReducedKeyShare;
42
+ const cbor_x_1 = require("cbor-x");
43
+ const Either_1 = require("fp-ts/Either");
44
+ const t = __importStar(require("io-ts"));
45
+ exports.ReducedKeyShareType = t.type({
46
+ keyShare: t.array(t.number),
47
+ pub: t.array(t.number),
48
+ rootChainCode: t.array(t.number),
49
+ });
50
+ /**
51
+ * Represents the state of a DKG (Distributed Key Generation) session
52
+ */
53
+ var DkgState;
54
+ (function (DkgState) {
55
+ /** DKG session has not been initialized */
56
+ DkgState["Uninitialized"] = "Uninitialized";
57
+ /** DKG session has been initialized (Init state in WASM) */
58
+ DkgState["Init"] = "Init";
59
+ /** DKG session is waiting for first message (WaitMsg1 state in WASM) */
60
+ DkgState["WaitMsg1"] = "WaitMsg1";
61
+ /** DKG session is waiting for second message (WaitMsg2 state in WASM) */
62
+ DkgState["WaitMsg2"] = "WaitMsg2";
63
+ /** DKG session has generated key shares (Share state in WASM) */
64
+ DkgState["Share"] = "Share";
65
+ /** DKG session has completed successfully and key shares are available */
66
+ DkgState["Complete"] = "Complete";
67
+ })(DkgState || (exports.DkgState = DkgState = {}));
68
+ /**
69
+ * Represents the state of a DSG (Distributed Sign Generation) session.
70
+ */
71
+ var DsgState;
72
+ (function (DsgState) {
73
+ /** DSG session has not been initialized */
74
+ DsgState["Uninitialized"] = "Uninitialized";
75
+ /** initDsg() has been called; ready for getFirstMessage() */
76
+ DsgState["Init"] = "Init";
77
+ /** R0 broadcast emitted; waiting for counterpart's R0 broadcast (SignMsg1) */
78
+ DsgState["WaitMsg1"] = "WaitMsg1";
79
+ /** R1 broadcast emitted; waiting for counterpart's R1 broadcast (SignMsg2) */
80
+ DsgState["WaitMsg2"] = "WaitMsg2";
81
+ /** R2 broadcast emitted; waiting for counterpart's R2 broadcast (SignMsg3, the partial sig) */
82
+ DsgState["WaitMsg3"] = "WaitMsg3";
83
+ /** Final 64-byte Ed25519 signature is available via getSignature() */
84
+ DsgState["Complete"] = "Complete";
85
+ })(DsgState || (exports.DsgState = DsgState = {}));
86
+ function serializeMessage(msg) {
87
+ return { from: msg.from, payload: Buffer.from(msg.payload).toString('base64') };
88
+ }
89
+ function deserializeMessage(msg) {
90
+ return { from: msg.from, payload: Buffer.from(msg.payload, 'base64') };
91
+ }
92
+ function serializeMessages(msgs) {
93
+ return msgs.map(serializeMessage);
94
+ }
95
+ function deserializeMessages(msgs) {
96
+ return msgs.map(deserializeMessage);
97
+ }
98
+ function getDecodedReducedKeyShare(reducedKeyShare) {
99
+ const decoded = exports.ReducedKeyShareType.decode((0, cbor_x_1.decode)(reducedKeyShare));
100
+ if ((0, Either_1.isLeft)(decoded)) {
101
+ throw new Error(`Unable to parse reducedKeyShare: ${decoded.left}`);
102
+ }
103
+ return decoded.right;
104
+ }
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL2VkZHNhLW1wcy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE2REEsNENBRUM7QUFFRCxnREFFQztBQUVELDhDQUVDO0FBRUQsa0RBRUM7QUFXRCw4REFNQztBQTVGRCxtQ0FBZ0M7QUFDaEMseUNBQXNDO0FBQ3RDLHlDQUEyQjtBQUVkLFFBQUEsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN4QyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzNCLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDdEIsYUFBYSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztDQUNqQyxDQUFDLENBQUM7QUFJSDs7R0FFRztBQUNILElBQVksUUFhWDtBQWJELFdBQVksUUFBUTtJQUNsQiwyQ0FBMkM7SUFDM0MsMkNBQStCLENBQUE7SUFDL0IsNERBQTREO0lBQzVELHlCQUFhLENBQUE7SUFDYix3RUFBd0U7SUFDeEUsaUNBQXFCLENBQUE7SUFDckIseUVBQXlFO0lBQ3pFLGlDQUFxQixDQUFBO0lBQ3JCLGlFQUFpRTtJQUNqRSwyQkFBZSxDQUFBO0lBQ2YsMEVBQTBFO0lBQzFFLGlDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFiVyxRQUFRLHdCQUFSLFFBQVEsUUFhbkI7QUFFRDs7R0FFRztBQUNILElBQVksUUFhWDtBQWJELFdBQVksUUFBUTtJQUNsQiwyQ0FBMkM7SUFDM0MsMkNBQStCLENBQUE7SUFDL0IsNkRBQTZEO0lBQzdELHlCQUFhLENBQUE7SUFDYiw4RUFBOEU7SUFDOUUsaUNBQXFCLENBQUE7SUFDckIsOEVBQThFO0lBQzlFLGlDQUFxQixDQUFBO0lBQ3JCLCtGQUErRjtJQUMvRixpQ0FBcUIsQ0FBQTtJQUNyQixzRUFBc0U7SUFDdEUsaUNBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQWJXLFFBQVEsd0JBQVIsUUFBUSxRQWFuQjtBQWVELFNBQWdCLGdCQUFnQixDQUFDLEdBQXdCO0lBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7QUFDbEYsQ0FBQztBQUVELFNBQWdCLGtCQUFrQixDQUFDLEdBQXNCO0lBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7QUFDekUsQ0FBQztBQUVELFNBQWdCLGlCQUFpQixDQUFDLElBQTBCO0lBQzFELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRCxTQUFnQixtQkFBbUIsQ0FBQyxJQUF3QjtJQUMxRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBV0QsU0FBZ0IseUJBQXlCLENBQUMsZUFBb0M7SUFDNUUsTUFBTSxPQUFPLEdBQUcsMkJBQW1CLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBTSxFQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFDcEUsSUFBSSxJQUFBLGVBQU0sRUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlY29kZSB9IGZyb20gJ2Nib3IteCc7XG5pbXBvcnQgeyBpc0xlZnQgfSBmcm9tICdmcC10cy9FaXRoZXInO1xuaW1wb3J0ICogYXMgdCBmcm9tICdpby10cyc7XG5cbmV4cG9ydCBjb25zdCBSZWR1Y2VkS2V5U2hhcmVUeXBlID0gdC50eXBlKHtcbiAga2V5U2hhcmU6IHQuYXJyYXkodC5udW1iZXIpLFxuICBwdWI6IHQuYXJyYXkodC5udW1iZXIpLFxuICByb290Q2hhaW5Db2RlOiB0LmFycmF5KHQubnVtYmVyKSxcbn0pO1xuXG5leHBvcnQgdHlwZSBFZGRzYVJlZHVjZWRLZXlTaGFyZSA9IHQuVHlwZU9mPHR5cGVvZiBSZWR1Y2VkS2V5U2hhcmVUeXBlPjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiBhIERLRyAoRGlzdHJpYnV0ZWQgS2V5IEdlbmVyYXRpb24pIHNlc3Npb25cbiAqL1xuZXhwb3J0IGVudW0gRGtnU3RhdGUge1xuICAvKiogREtHIHNlc3Npb24gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkICovXG4gIFVuaW5pdGlhbGl6ZWQgPSAnVW5pbml0aWFsaXplZCcsXG4gIC8qKiBES0cgc2Vzc2lvbiBoYXMgYmVlbiBpbml0aWFsaXplZCAoSW5pdCBzdGF0ZSBpbiBXQVNNKSAqL1xuICBJbml0ID0gJ0luaXQnLFxuICAvKiogREtHIHNlc3Npb24gaXMgd2FpdGluZyBmb3IgZmlyc3QgbWVzc2FnZSAoV2FpdE1zZzEgc3RhdGUgaW4gV0FTTSkgKi9cbiAgV2FpdE1zZzEgPSAnV2FpdE1zZzEnLFxuICAvKiogREtHIHNlc3Npb24gaXMgd2FpdGluZyBmb3Igc2Vjb25kIG1lc3NhZ2UgKFdhaXRNc2cyIHN0YXRlIGluIFdBU00pICovXG4gIFdhaXRNc2cyID0gJ1dhaXRNc2cyJyxcbiAgLyoqIERLRyBzZXNzaW9uIGhhcyBnZW5lcmF0ZWQga2V5IHNoYXJlcyAoU2hhcmUgc3RhdGUgaW4gV0FTTSkgKi9cbiAgU2hhcmUgPSAnU2hhcmUnLFxuICAvKiogREtHIHNlc3Npb24gaGFzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgYW5kIGtleSBzaGFyZXMgYXJlIGF2YWlsYWJsZSAqL1xuICBDb21wbGV0ZSA9ICdDb21wbGV0ZScsXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgc3RhdGUgb2YgYSBEU0cgKERpc3RyaWJ1dGVkIFNpZ24gR2VuZXJhdGlvbikgc2Vzc2lvbi5cbiAqL1xuZXhwb3J0IGVudW0gRHNnU3RhdGUge1xuICAvKiogRFNHIHNlc3Npb24gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkICovXG4gIFVuaW5pdGlhbGl6ZWQgPSAnVW5pbml0aWFsaXplZCcsXG4gIC8qKiBpbml0RHNnKCkgaGFzIGJlZW4gY2FsbGVkOyByZWFkeSBmb3IgZ2V0Rmlyc3RNZXNzYWdlKCkgKi9cbiAgSW5pdCA9ICdJbml0JyxcbiAgLyoqIFIwIGJyb2FkY2FzdCBlbWl0dGVkOyB3YWl0aW5nIGZvciBjb3VudGVycGFydCdzIFIwIGJyb2FkY2FzdCAoU2lnbk1zZzEpICovXG4gIFdhaXRNc2cxID0gJ1dhaXRNc2cxJyxcbiAgLyoqIFIxIGJyb2FkY2FzdCBlbWl0dGVkOyB3YWl0aW5nIGZvciBjb3VudGVycGFydCdzIFIxIGJyb2FkY2FzdCAoU2lnbk1zZzIpICovXG4gIFdhaXRNc2cyID0gJ1dhaXRNc2cyJyxcbiAgLyoqIFIyIGJyb2FkY2FzdCBlbWl0dGVkOyB3YWl0aW5nIGZvciBjb3VudGVycGFydCdzIFIyIGJyb2FkY2FzdCAoU2lnbk1zZzMsIHRoZSBwYXJ0aWFsIHNpZykgKi9cbiAgV2FpdE1zZzMgPSAnV2FpdE1zZzMnLFxuICAvKiogRmluYWwgNjQtYnl0ZSBFZDI1NTE5IHNpZ25hdHVyZSBpcyBhdmFpbGFibGUgdmlhIGdldFNpZ25hdHVyZSgpICovXG4gIENvbXBsZXRlID0gJ0NvbXBsZXRlJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlPFQ+IHtcbiAgcGF5bG9hZDogVDtcbiAgZnJvbTogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBTZXJpYWxpemVkTWVzc2FnZSA9IE1lc3NhZ2U8c3RyaW5nPjtcblxuZXhwb3J0IHR5cGUgU2VyaWFsaXplZE1lc3NhZ2VzID0gTWVzc2FnZTxzdHJpbmc+W107XG5cbmV4cG9ydCB0eXBlIERlc2VyaWFsaXplZE1lc3NhZ2UgPSBNZXNzYWdlPFVpbnQ4QXJyYXk+O1xuXG5leHBvcnQgdHlwZSBEZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IE1lc3NhZ2U8VWludDhBcnJheT5bXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZU1lc3NhZ2UobXNnOiBEZXNlcmlhbGl6ZWRNZXNzYWdlKTogU2VyaWFsaXplZE1lc3NhZ2Uge1xuICByZXR1cm4geyBmcm9tOiBtc2cuZnJvbSwgcGF5bG9hZDogQnVmZmVyLmZyb20obXNnLnBheWxvYWQpLnRvU3RyaW5nKCdiYXNlNjQnKSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVNZXNzYWdlKG1zZzogU2VyaWFsaXplZE1lc3NhZ2UpOiBEZXNlcmlhbGl6ZWRNZXNzYWdlIHtcbiAgcmV0dXJuIHsgZnJvbTogbXNnLmZyb20sIHBheWxvYWQ6IEJ1ZmZlci5mcm9tKG1zZy5wYXlsb2FkLCAnYmFzZTY0JykgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZU1lc3NhZ2VzKG1zZ3M6IERlc2VyaWFsaXplZE1lc3NhZ2VzKTogU2VyaWFsaXplZE1lc3NhZ2VzIHtcbiAgcmV0dXJuIG1zZ3MubWFwKHNlcmlhbGl6ZU1lc3NhZ2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVNZXNzYWdlcyhtc2dzOiBTZXJpYWxpemVkTWVzc2FnZXMpOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyB7XG4gIHJldHVybiBtc2dzLm1hcChkZXNlcmlhbGl6ZU1lc3NhZ2UpO1xufVxuXG4vKiogQSBQR1AgZGV0YWNoZWQtc2lnbmVkIG1lc3NhZ2UgYnkgYSBwYXJ0eS5cbiAqIGBtZXNzYWdlYCBpcyB0aGUgcmF3IHBheWxvYWQgZW5jb2RlZCBhcyBiYXNlNjQuXG4gKiBgc2lnbmF0dXJlYCBpcyBhbiBhcm1vcmVkIFBHUCBkZXRhY2hlZCBzaWduYXR1cmUgb3ZlciB0aG9zZSBieXRlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNUFNTaWduZWRNZXNzYWdlIHtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBzaWduYXR1cmU6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlY29kZWRSZWR1Y2VkS2V5U2hhcmUocmVkdWNlZEtleVNoYXJlOiBCdWZmZXIgfCBVaW50OEFycmF5KTogRWRkc2FSZWR1Y2VkS2V5U2hhcmUge1xuICBjb25zdCBkZWNvZGVkID0gUmVkdWNlZEtleVNoYXJlVHlwZS5kZWNvZGUoZGVjb2RlKHJlZHVjZWRLZXlTaGFyZSkpO1xuICBpZiAoaXNMZWZ0KGRlY29kZWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgcmVkdWNlZEtleVNoYXJlOiAke2RlY29kZWQubGVmdH1gKTtcbiAgfVxuICByZXR1cm4gZGVjb2RlZC5yaWdodDtcbn1cbiJdfQ==
@@ -0,0 +1,18 @@
1
+ import { DKG } from './dkg';
2
+ /**
3
+ * Concatenates multiple Uint8Array instances into a single Uint8Array
4
+ * @param chunks - Array of Uint8Array instances to concatenate
5
+ * @returns Concatenated Uint8Array
6
+ */
7
+ export declare function concatBytes(chunks: Uint8Array[]): Uint8Array;
8
+ /**
9
+ * Per-party deterministic seed material. To use the same seed for both, pass it as both fields.
10
+ * `encKey` seeds the X25519 encryption key; `dkgSeed` seeds DKG round 0.
11
+ */
12
+ export interface EdDsaDKGPartySeed {
13
+ encKey?: Buffer;
14
+ dkgSeed?: Buffer;
15
+ }
16
+ /** See `EdDsaDKGPartySeed`. Mirrors `DklsUtils.generateDKGKeyShares` for ECDSA DKLS. */
17
+ export declare function generateEdDsaDKGKeyShares(seedUser?: EdDsaDKGPartySeed, seedBackup?: EdDsaDKGPartySeed, seedBitgo?: EdDsaDKGPartySeed): Promise<[DKG, DKG, DKG]>;
18
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/util.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAG5D;AAQD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAQD,wFAAwF;AACxF,wBAAsB,yBAAyB,CAC7C,QAAQ,CAAC,EAAE,iBAAiB,EAC5B,UAAU,CAAC,EAAE,iBAAiB,EAC9B,SAAS,CAAC,EAAE,iBAAiB,GAC5B,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAkC1B"}