@bitgo/sdk-lib-mpc 10.11.1 → 10.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -84,7 +84,9 @@ export declare class DKG {
84
84
  */
85
85
  getCommonKeychain(): string;
86
86
  /**
87
- * Returns a CBOR-encoded reduced representation containing the public key.
87
+ * Returns a CBOR-encoded ReducedKeyShare buffer containing the party's opaque
88
+ * signing key share in the `keyShare` field. This buffer is private key material.
89
+ * The caller encrypts it and stores it as `reducedEncryptedPrv` on the key card QR code.
88
90
  */
89
91
  getReducedKeyShare(): Buffer;
90
92
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"dkg.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/dkg.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,QAAQ,EAAwB,MAAM,SAAS,CAAC;AAIpG;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,GAAG;IACd,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE3B,sDAAsD;IACtD,OAAO,CAAC,aAAa,CAAuB;IAC5C,mGAAmG;IACnG,OAAO,CAAC,YAAY,CAAyB;IAC7C,2EAA2E;IAC3E,OAAO,CAAC,aAAa,CAAuB;IAC5C,qDAAqD;IACrD,OAAO,CAAC,QAAQ,CAAuB;IACvC,6CAA6C;IAC7C,OAAO,CAAC,OAAO,CAAuB;IACtC,qCAAqC;IACrC,OAAO,CAAC,cAAc,CAAuB;IAC7C,gCAAgC;IAChC,OAAO,CAAC,OAAO,CAAwB;IAEvC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAA0B;gBAE1C,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;YAMpC,WAAW;IAMzB,OAAO,CAAC,UAAU;IAOlB,QAAQ,IAAI,QAAQ;IAIpB;;;;;;;OAOG;IACG,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBjF;;;;;OAKG;IACH,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAmBtD;;;;;;;;;;;OAWG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;IAuDvF;;;OAGG;IACH,WAAW,IAAI,MAAM;IAOrB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAO3B;;;OAGG;IACH,iBAAiB,IAAI,MAAM;IAO3B;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAU5B;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAepB;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAOtC"}
1
+ {"version":3,"file":"dkg.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/dkg.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,QAAQ,EAAwB,MAAM,SAAS,CAAC;AAMpG;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,GAAG;IACd,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE3B,sDAAsD;IACtD,OAAO,CAAC,aAAa,CAAuB;IAC5C,mGAAmG;IACnG,OAAO,CAAC,YAAY,CAAyB;IAC7C,2EAA2E;IAC3E,OAAO,CAAC,aAAa,CAAuB;IAC5C,qDAAqD;IACrD,OAAO,CAAC,QAAQ,CAAuB;IACvC,6CAA6C;IAC7C,OAAO,CAAC,OAAO,CAAuB;IACtC,qCAAqC;IACrC,OAAO,CAAC,cAAc,CAAuB;IAC7C,gCAAgC;IAChC,OAAO,CAAC,OAAO,CAAwB;IAEvC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAA0B;gBAE1C,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;YAMpC,WAAW;IAoBzB,OAAO,CAAC,UAAU;IAOlB,QAAQ,IAAI,QAAQ;IAIpB;;;;;;;OAOG;IACG,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBjF;;;;;OAKG;IACH,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAmBtD;;;;;;;;;;;OAWG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;IAuDvF;;;OAGG;IACH,WAAW,IAAI,MAAM;IAOrB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAO3B;;;OAGG;IACH,iBAAiB,IAAI,MAAM;IAO3B;;;;OAIG;IACH,kBAAkB,IAAI,MAAM;IAY5B;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAepB;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAOtC"}
@@ -81,7 +81,20 @@ class DKG {
81
81
  }
82
82
  async loadWasmMps() {
83
83
  if (!this.wasmMps) {
84
- this.wasmMps = await Promise.resolve().then(() => __importStar(require('@bitgo/wasm-mps')));
84
+ if (typeof window !== 'undefined' &&
85
+ /* checks for electron processes */
86
+ !window.process &&
87
+ !window.process?.['type']) {
88
+ // Browser: web build has explicit init() — guaranteed ready after await
89
+ // eslint-disable-next-line import/no-internal-modules -- @bitgo/wasm-mps exposes environment-specific subpath exports.
90
+ const webWasm = await Promise.resolve().then(() => __importStar(require('@bitgo/wasm-mps/web')));
91
+ await webWasm.default();
92
+ this.wasmMps = webWasm;
93
+ }
94
+ else {
95
+ // Node.js: dynamic import() rewritten to require() by tsc → CJS build → readFileSync
96
+ this.wasmMps = await Promise.resolve().then(() => __importStar(require('@bitgo/wasm-mps')));
97
+ }
85
98
  }
86
99
  }
87
100
  getWasmMps() {
@@ -230,14 +243,18 @@ class DKG {
230
243
  return this.sharePk.toString('hex') + this.shareChaincode.toString('hex');
231
244
  }
232
245
  /**
233
- * Returns a CBOR-encoded reduced representation containing the public key.
246
+ * Returns a CBOR-encoded ReducedKeyShare buffer containing the party's opaque
247
+ * signing key share in the `keyShare` field. This buffer is private key material.
248
+ * The caller encrypts it and stores it as `reducedEncryptedPrv` on the key card QR code.
234
249
  */
235
250
  getReducedKeyShare() {
236
- if (!this.sharePk) {
251
+ if (!this.keyShare || !this.sharePk || !this.shareChaincode) {
237
252
  throw Error('DKG session not initialized');
238
253
  }
239
254
  const reducedKeyShare = {
255
+ keyShare: Array.from(this.keyShare),
240
256
  pub: Array.from(this.sharePk),
257
+ rootChainCode: Array.from(this.shareChaincode),
241
258
  };
242
259
  return Buffer.from((0, cbor_x_1.encode)(reducedKeyShare));
243
260
  }
@@ -273,4 +290,4 @@ class DKG {
273
290
  }
274
291
  }
275
292
  exports.DKG = DKG;
276
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGtnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9lZGRzYS1tcHMvZGtnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLG1DQUFnQztBQUNoQyxvREFBNEI7QUFDNUIsbUNBQW9HO0FBSXBHOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQWEsR0FBRztJQXNCZCxZQUFZLENBQVMsRUFBRSxDQUFTLEVBQUUsUUFBZ0I7UUFqQmxELHNEQUFzRDtRQUM5QyxrQkFBYSxHQUFrQixJQUFJLENBQUM7UUFDNUMsbUdBQW1HO1FBQzNGLGlCQUFZLEdBQW9CLElBQUksQ0FBQztRQUM3QywyRUFBMkU7UUFDbkUsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO1FBQzVDLHFEQUFxRDtRQUM3QyxhQUFRLEdBQWtCLElBQUksQ0FBQztRQUN2Qyw2Q0FBNkM7UUFDckMsWUFBTyxHQUFrQixJQUFJLENBQUM7UUFDdEMscUNBQXFDO1FBQzdCLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUM3QyxnQ0FBZ0M7UUFDeEIsWUFBTyxHQUFtQixJQUFJLENBQUM7UUFFN0IsYUFBUSxHQUFhLGdCQUFRLENBQUMsYUFBYSxDQUFDO1FBR3BELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQVc7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsT0FBTyxHQUFHLHdEQUFhLGlCQUFpQixHQUFDLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUM7SUFFTyxVQUFVO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFD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QUMsQ0FBQyxDQUFFLElBQUksQ0FBQyxZQUF5QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3RILENBQUM7Q0FDRjtBQTlPRCxrQkE4T0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE1zZ1N0YXRlLCBTaGFyZSB9IGZyb20gJ0BiaXRnby93YXNtLW1wcyc7XG5pbXBvcnQgeyBlbmNvZGUgfSBmcm9tICdjYm9yLXgnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVkTWVzc2FnZSwgRGVzZXJpYWxpemVkTWVzc2FnZXMsIERrZ1N0YXRlLCBFZGRzYVJlZHVjZWRLZXlTaGFyZSB9IGZyb20gJy4vdHlwZXMnO1xuXG50eXBlIFdhc21NcHMgPSB0eXBlb2YgaW1wb3J0KCdAYml0Z28vd2FzbS1tcHMnKTtcblxuLyoqXG4gKiBFZERTQSBEaXN0cmlidXRlZCBLZXkgR2VuZXJhdGlvbiAoREtHKSBpbXBsZW1lbnRhdGlvbiB1c2luZyBAYml0Z28vd2FzbS1tcHMuXG4gKlxuICogU3RhdGUgaXMgZXhwbGljaXQ6IGVhY2ggcm91bmQgZnVuY3Rpb24gcmV0dXJucyBgeyBtc2csIHN0YXRlIH1gIGJ5dGVzLlxuICogVGhlIHN0YXRlIGJ5dGVzIGFyZSBzdG9yZWQgYmV0d2VlbiByb3VuZHMgYW5kIHBhc3NlZCB0byB0aGUgbmV4dCByb3VuZCBmdW5jdGlvbixcbiAqIG1pcnJvcmluZyB0aGUgc2VydmVyLXNpZGUgcGVyc2lzdGVuY2UgcGF0dGVybiAoc3RhdGUgd291bGQgYmUgc2VyaWFsaXNlZCB0byBEQikuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRrZyA9IG5ldyBES0coMywgMiwgMCk7XG4gKiAvLyBYMjU1MTkga2V5cyBjb21lIGZyb20gR1BHIGVuY3J5cHRpb24gc3Via2V5cyAoZXh0cmFjdGVkIGJ5IHRoZSBvcmNoZXN0cmF0b3IpXG4gKiBhd2FpdCBka2cuaW5pdERrZyhteVgyNTUxOVByaXZLZXksIFtvdGhlclBhcnR5MVgyNTUxOVB1YktleSwgb3RoZXJQYXJ0eTJYMjU1MTlQdWJLZXldKTtcbiAqIGNvbnN0IG1zZzEgPSBka2cuZ2V0Rmlyc3RNZXNzYWdlKCk7XG4gKiBjb25zdCBtc2cycyA9IGRrZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKGFsbFRocmVlTXNnMXMpO1xuICogZGtnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoYWxsVGhyZWVNc2cycyk7ICAvLyBjb21wbGV0ZXMgREtHXG4gKiBjb25zdCBrZXlTaGFyZSA9IGRrZy5nZXRLZXlTaGFyZSgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBES0cge1xuICBwcm90ZWN0ZWQgbjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgdDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgcGFydHlJZHg6IG51bWJlcjtcblxuICAvKiogUHJpdmF0ZSBYMjU1MTkga2V5IChmcm9tIEdQRyBlbmNyeXB0aW9uIHN1YmtleSkgKi9cbiAgcHJpdmF0ZSBkZWNyeXB0aW9uS2V5OiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIE90aGVyIHBhcnRpZXMnIFgyNTUxOSBwdWJsaWMga2V5cyAoZnJvbSB0aGVpciBHUEcgZW5jcnlwdGlvbiBzdWJrZXlzKSwgc29ydGVkIGJ5IHBhcnR5IGluZGV4ICovXG4gIHByaXZhdGUgb3RoZXJQdWJLZXlzOiBCdWZmZXJbXSB8IG51bGwgPSBudWxsO1xuICAvKiogU2VyaWFsaXNlZCByb3VuZCBzdGF0ZSBieXRlcyByZXR1cm5lZCBieSB0aGUgcHJldmlvdXMgcm91bmQgZnVuY3Rpb24gKi9cbiAgcHJpdmF0ZSBka2dTdGF0ZUJ5dGVzOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIE9wYXF1ZSBiaW5jb2RlLXNlcmlhbGlzZWQga2V5c2hhcmUgZnJvbSByb3VuZDIgKi9cbiAgcHJpdmF0ZSBrZXlTaGFyZTogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiAzMi1ieXRlIEVkMjU1MTkgcHVibGljIGtleSBmcm9tIHJvdW5kMiAqL1xuICBwcml2YXRlIHNoYXJlUGs6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuICAvKiogMzItYnl0ZSBjaGFpbiBjb2RlIGZyb20gcm91bmQyICovXG4gIHByaXZhdGUgc2hhcmVDaGFpbmNvZGU6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuICAvKiogTGF6aWx5IGxvYWRlZCBXQVNNIG1vZHVsZSAqL1xuICBwcml2YXRlIHdhc21NcHM6IFdhc21NcHMgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgZGtnU3RhdGU6IERrZ1N0YXRlID0gRGtnU3RhdGUuVW5pbml0aWFsaXplZDtcblxuICBjb25zdHJ1Y3RvcihuOiBudW1iZXIsIHQ6IG51bWJlciwgcGFydHlJZHg6IG51bWJlcikge1xuICAgIHRoaXMubiA9IG47XG4gICAgdGhpcy50ID0gdDtcbiAgICB0aGlzLnBhcnR5SWR4ID0gcGFydHlJZHg7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRXYXNtTXBzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy53YXNtTXBzKSB7XG4gICAgICB0aGlzLndhc21NcHMgPSBhd2FpdCBpbXBvcnQoJ0BiaXRnby93YXNtLW1wcycpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0V2FzbU1wcygpOiBXYXNtTXBzIHtcbiAgICBpZiAoIXRoaXMud2FzbU1wcykge1xuICAgICAgdGhyb3cgRXJyb3IoJ1dBU00gbW9kdWxlIG5vdCBsb2FkZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2FzbU1wcztcbiAgfVxuXG4gIGdldFN0YXRlKCk6IERrZ1N0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5ka2dTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNlcyB0aGUgREtHIHNlc3Npb24gd2l0aCB0aGlzIHBhcnR5J3MgWDI1NTE5IHByaXZhdGUga2V5IGFuZCB0aGUgb3RoZXIgcGFydGllcydcbiAgICogWDI1NTE5IHB1YmxpYyBrZXlzLiBLZXlzIGFyZSBleHRyYWN0ZWQgZnJvbSBHUEcgZW5jcnlwdGlvbiBzdWJrZXlzIGJ5IHRoZSBvcmNoZXN0cmF0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBkZWNyeXB0aW9uS2V5IC0gVGhpcyBwYXJ0eSdzIDMyLWJ5dGUgWDI1NTE5IHByaXZhdGUga2V5IChHUEcgZW5jIHN1YmtleSBwcml2YXRlIHBhcnQpLlxuICAgKiBAcGFyYW0gb3RoZXJFbmNQdWJsaWNLZXlzIC0gT3RoZXIgcGFydGllcycgMzItYnl0ZSBYMjU1MTkgcHVibGljIGtleXMsIHNvcnRlZCBieSBhc2NlbmRpbmdcbiAgICogICBwYXJ0eSBpbmRleCAoZXhjbHVkaW5nIG93bikuIEZvciBhIDMtcGFydHkgc2V0dXAsIHRoaXMgaXMgW3BhcnR5X0FfcHViLCBwYXJ0eV9CX3B1Yl0uXG4gICAqL1xuICBhc3luYyBpbml0RGtnKGRlY3J5cHRpb25LZXk6IEJ1ZmZlciwgb3RoZXJFbmNQdWJsaWNLZXlzOiBCdWZmZXJbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubG9hZFdhc21NcHMoKTtcbiAgICBpZiAoIWRlY3J5cHRpb25LZXkgfHwgZGVjcnlwdGlvbktleS5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBvciBpbnZhbGlkIGRlY3J5cHRpb24ga2V5OiBtdXN0IGJlIDMyIGJ5dGVzJyk7XG4gICAgfVxuICAgIGlmICghb3RoZXJFbmNQdWJsaWNLZXlzIHx8IG90aGVyRW5jUHVibGljS2V5cy5sZW5ndGggIT09IHRoaXMubiAtIDEpIHtcbiAgICAgIHRocm93IEVycm9yKGBFeHBlY3RlZCAke3RoaXMubiAtIDF9IG90aGVyIHBhcnRpZXMnIHB1YmxpYyBrZXlzYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnQgPiB0aGlzLm4gfHwgdGhpcy5wYXJ0eUlkeCA+PSB0aGlzLm4pIHtcbiAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIHBhcmFtZXRlcnMgZm9yIERLRycpO1xuICAgIH1cblxuICAgIHRoaXMuZGVjcnlwdGlvbktleSA9IGRlY3J5cHRpb25LZXk7XG4gICAgdGhpcy5vdGhlclB1YktleXMgPSBvdGhlckVuY1B1YmxpY0tleXM7XG4gICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLkluaXQ7XG4gIH1cblxuICAvKipcbiAgICogUnVucyByb3VuZDAgb2YgdGhlIERLRyBwcm90b2NvbC4gUmV0dXJucyB0aGlzIHBhcnR5J3MgYnJvYWRjYXN0IG1lc3NhZ2UuXG4gICAqIFN0b3JlcyB0aGUgcm91bmQgc3RhdGUgYnl0ZXMgaW50ZXJuYWxseSBmb3IgdGhlIG5leHQgcm91bmQuXG4gICAqXG4gICAqIEBwYXJhbSBka2dTZWVkIC0gT3B0aW9uYWwgMzItYnl0ZSBzZWVkIGZvciBkZXRlcm1pbmlzdGljIERLRyBvdXRwdXQgKHRlc3Rpbmcgb25seSkuXG4gICAqL1xuICBnZXRGaXJzdE1lc3NhZ2UoZGtnU2VlZD86IEJ1ZmZlcik6IERlc2VyaWFsaXplZE1lc3NhZ2Uge1xuICAgIGlmICh0aGlzLmRrZ1N0YXRlICE9PSBEa2dTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcignREtHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VlZCA9IGRrZ1NlZWQgPz8gY3J5cHRvLnJhbmRvbUJ5dGVzKDMyKTtcbiAgICBjb25zdCB3YXNtID0gdGhpcy5nZXRXYXNtTXBzKCk7XG4gICAgbGV0IHJlc3VsdDogTXNnU3RhdGU7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IHdhc20uZWQyNTUxOV9ka2dfcm91bmQwX3Byb2Nlc3ModGhpcy5wYXJ0eUlkeCwgdGhpcy5kZWNyeXB0aW9uS2V5ISwgdGhpcy5vdGhlclB1YktleXMhLCBzZWVkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGZpcnN0IG1lc3NhZ2UgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9OiAke2Vycn1gKTtcbiAgICB9XG5cbiAgICB0aGlzLmRrZ1N0YXRlQnl0ZXMgPSBCdWZmZXIuZnJvbShyZXN1bHQuc3RhdGUpO1xuICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5XYWl0TXNnMTtcbiAgICByZXR1cm4geyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyZXN1bHQubXNnKSwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgaW5jb21pbmcgbWVzc2FnZXMgZnJvbSBhbGwgcGFydGllcyBhbmQgYWR2YW5jZXMgdGhlIHByb3RvY29sLlxuICAgKlxuICAgKiAtIEluIFdhaXRNc2cxOiBydW5zIHJvdW5kMSwgcmV0dXJucyB0aGlzIHBhcnR5J3Mgcm91bmQxIGJyb2FkY2FzdCBtZXNzYWdlLlxuICAgKiAtIEluIFdhaXRNc2cyOiBydW5zIHJvdW5kMiwgY29tcGxldGVzIERLRywgcmV0dXJucyBbXS5cbiAgICpcbiAgICogVGhlIGNhbGxlciBwYXNzZXMgYWxsIG4gbWVzc2FnZXMgKGluY2x1ZGluZyBvd24pOyBvd24gbWVzc2FnZSBpcyBmaWx0ZXJlZFxuICAgKiBvdXQgaW50ZXJuYWxseS4gT3RoZXIgcGFydGllcycgbWVzc2FnZXMgYXJlIHNvcnRlZCBieSBhc2NlbmRpbmcgcGFydHkgaW5kZXgsXG4gICAqIG1hdGNoaW5nIHRoZSBvcmRlcmluZyBleHBlY3RlZCBieSBAYml0Z28vd2FzbS1tcHMuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlc0Zvckl0aFJvdW5kIC0gQWxsIG4gbWVzc2FnZXMgZm9yIHRoaXMgcm91bmQgKGluY2x1ZGluZyBvd24pLlxuICAgKi9cbiAgaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhtZXNzYWdlc0Zvckl0aFJvdW5kOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyk6IERlc2VyaWFsaXplZE1lc3NhZ2VzIHtcbiAgICBpZiAodGhpcy5ka2dTdGF0ZSA9PT0gRGtnU3RhdGUuQ29tcGxldGUpIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBhbHJlYWR5IGNvbXBsZXRlZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5ka2dTdGF0ZSA9PT0gRGtnU3RhdGUuVW5pbml0aWFsaXplZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5ka2dTdGF0ZSA9PT0gRGtnU3RhdGUuSW5pdCkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICdES0cgc2Vzc2lvbiBtdXN0IGNhbGwgZ2V0Rmlyc3RNZXNzYWdlKCkgYmVmb3JlIGhhbmRsaW5nIGluY29taW5nIG1lc3NhZ2VzLiBDYWxsIGdldEZpcnN0TWVzc2FnZSgpIGZpcnN0LidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlc0Zvckl0aFJvdW5kLmxlbmd0aCAhPT0gdGhpcy5uKSB7XG4gICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBudW1iZXIgb2YgbWVzc2FnZXMgZm9yIHRoZSByb3VuZC4gTnVtYmVyIG9mIG1lc3NhZ2VzIHNob3VsZCBiZSBlcXVhbCB0byBOJyk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCBvdGhlciBwYXJ0aWVzJyBtZXNzYWdlcywgc29ydGVkIGJ5IHBhcnR5IGluZGV4IChhc2NlbmRpbmcpXG4gICAgY29uc3Qgb3RoZXJNc2dzID0gbWVzc2FnZXNGb3JJdGhSb3VuZFxuICAgICAgLmZpbHRlcigobSkgPT4gbS5mcm9tICE9PSB0aGlzLnBhcnR5SWR4KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEuZnJvbSAtIGIuZnJvbSlcbiAgICAgIC5tYXAoKG0pID0+IG0ucGF5bG9hZCk7XG5cbiAgICBjb25zdCB3YXNtID0gdGhpcy5nZXRXYXNtTXBzKCk7XG5cbiAgICBpZiAodGhpcy5ka2dTdGF0ZSA9PT0gRGtnU3RhdGUuV2FpdE1zZzEpIHtcbiAgICAgIGxldCByZXN1bHQ6IE1zZ1N0YXRlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gd2FzbS5lZDI1NTE5X2RrZ19yb3VuZDFfcHJvY2VzcyhvdGhlck1zZ3MsIHRoaXMuZGtnU3RhdGVCeXRlcyEpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgbWVzc2FnZXMgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9LCByb3VuZCAke3RoaXMuZGtnU3RhdGV9OiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICAgIC8vIFN0b3JlIG5ldyBzdGF0ZTsgdGhpcyBpcyB3aGF0IHdvdWxkIGJlIHBlcnNpc3RlZCB0byBEQiBiZXR3ZWVuIEFQSSByb3VuZHNcbiAgICAgIHRoaXMuZGtnU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGF0ZSk7XG4gICAgICB0aGlzLmRrZ1N0YXRlID0gRGtnU3RhdGUuV2FpdE1zZzI7XG4gICAgICByZXR1cm4gW3sgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmVzdWx0Lm1zZyksIGZyb206IHRoaXMucGFydHlJZHggfV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLldhaXRNc2cyKSB7XG4gICAgICBsZXQgc2hhcmU6IFNoYXJlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2hhcmUgPSB3YXNtLmVkMjU1MTlfZGtnX3JvdW5kMl9wcm9jZXNzKG90aGVyTXNncywgdGhpcy5ka2dTdGF0ZUJ5dGVzISk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5ka2dTdGF0ZX06ICR7ZXJyfWApO1xuICAgICAgfVxuICAgICAgdGhpcy5rZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKHNoYXJlLnNoYXJlKTtcbiAgICAgIHRoaXMuc2hhcmVQayA9IEJ1ZmZlci5mcm9tKHNoYXJlLnBrKTtcbiAgICAgIHRoaXMuc2hhcmVDaGFpbmNvZGUgPSBCdWZmZXIuZnJvbShzaGFyZS5jaGFpbmNvZGUpO1xuICAgICAgdGhpcy5ka2dTdGF0ZUJ5dGVzID0gbnVsbDtcbiAgICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5Db21wbGV0ZTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB0aHJvdyBFcnJvcignVW5leHBlY3RlZCBES0cgc3RhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvcGFxdWUgYmluY29kZS1zZXJpYWxpc2VkIGtleXNoYXJlIHByb2R1Y2VkIGJ5IHJvdW5kMi5cbiAgICogVGhpcyBpcyB1c2VkIGFzIGlucHV0IHRvIHRoZSBzaWduaW5nIHByb3RvY29sLlxuICAgKi9cbiAgZ2V0S2V5U2hhcmUoKTogQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMua2V5U2hhcmUpIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMua2V5U2hhcmU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgMzItYnl0ZSBFZDI1NTE5IHB1YmxpYyBrZXkgYWdyZWVkIGJ5IGFsbCBwYXJ0aWVzIGR1cmluZyBES0cuXG4gICAqL1xuICBnZXRTaGFyZVB1YmxpY0tleSgpOiBCdWZmZXIge1xuICAgIGlmICghdGhpcy5zaGFyZVBrKSB7XG4gICAgICB0aHJvdyBFcnJvcignREtHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNoYXJlUGs7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgMTI4LWNoYXIgaGV4IGNvbW1vbiBrZXljaGFpbjogNjQtY2hhciBwdWJsaWMga2V5ICsgNjQtY2hhciBjaGFpbiBjb2RlLlxuICAgKiBUaGlzIG1hdGNoZXMgdGhlIGZvcm1hdCBleHBlY3RlZCBieSBhZGRyZXNzIGRlcml2YXRpb24gKEVkZHNhLmRlcml2ZVVuaGFyZGVuZWQpLlxuICAgKi9cbiAgZ2V0Q29tbW9uS2V5Y2hhaW4oKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuc2hhcmVQayB8fCAhdGhpcy5zaGFyZUNoYWluY29kZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaGFyZVBrLnRvU3RyaW5nKCdoZXgnKSArIHRoaXMuc2hhcmVDaGFpbmNvZGUudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBDQk9SLWVuY29kZWQgcmVkdWNlZCByZXByZXNlbnRhdGlvbiBjb250YWluaW5nIHRoZSBwdWJsaWMga2V5LlxuICAgKi9cbiAgZ2V0UmVkdWNlZEtleVNoYXJlKCk6IEJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLnNoYXJlUGspIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgY29uc3QgcmVkdWNlZEtleVNoYXJlOiBFZGRzYVJlZHVjZWRLZXlTaGFyZSA9IHtcbiAgICAgIHB1YjogQXJyYXkuZnJvbSh0aGlzLnNoYXJlUGspLFxuICAgIH07XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGVuY29kZShyZWR1Y2VkS2V5U2hhcmUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBjdXJyZW50IHNlc3Npb24gc3RhdGUgYXMgYSBKU09OIHN0cmluZyBmb3IgcGVyc2lzdGVuY2UuXG4gICAqIEluY2x1ZGVzOiByb3VuZCBzdGF0ZSBieXRlcywgY3VycmVudCBES0cgcm91bmQsIGRlY3J5cHRpb24ga2V5LCBvdGhlciBwYXJ0aWVzJyBwdWIga2V5cy5cbiAgICogVGhpcyBtaXJyb3JzIHdoYXQgYSBzZXJ2ZXIgd291bGQgc3RvcmUgaW4gYSBkYXRhYmFzZSBiZXR3ZWVuIEFQSSByb3VuZHMuXG4gICAqL1xuICBnZXRTZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLkNvbXBsZXRlKSB7XG4gICAgICB0aHJvdyBFcnJvcignREtHIHNlc3Npb24gaXMgY29tcGxldGUuIEV4cG9ydGluZyB0aGUgc2Vzc2lvbiBpcyBub3QgYWxsb3dlZC4nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLlVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGRrZ1N0YXRlQnl0ZXM6IHRoaXMuZGtnU3RhdGVCeXRlcz8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBka2dSb3VuZDogdGhpcy5ka2dTdGF0ZSxcbiAgICAgIGRlY3J5cHRpb25LZXk6IHRoaXMuZGVjcnlwdGlvbktleT8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBvdGhlclB1YktleXM6IHRoaXMub3RoZXJQdWJLZXlzPy5tYXAoKGspID0+IGsudG9TdHJpbmcoJ2Jhc2U2NCcpKSA/PyBudWxsLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RvcmVzIGEgcHJldmlvdXNseSBleHBvcnRlZCBzZXNzaW9uLiBBbGxvd3MgdGhlIHByb3RvY29sIHRvIGNvbnRpbnVlXG4gICAqIGZyb20gd2hlcmUgaXQgbGVmdCBvZmYsIGFzIGlmIHRoZSByb3VuZCBzdGF0ZSB3YXMgbG9hZGVkIGZyb20gYSBkYXRhYmFzZS5cbiAgICovXG4gIHJlc3RvcmVTZXNzaW9uKHNlc3Npb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHNlc3Npb24pO1xuICAgIHRoaXMuZGtnU3RhdGVCeXRlcyA9IGRhdGEuZGtnU3RhdGVCeXRlcyA/IEJ1ZmZlci5mcm9tKGRhdGEuZGtnU3RhdGVCeXRlcywgJ2Jhc2U2NCcpIDogbnVsbDtcbiAgICB0aGlzLmRrZ1N0YXRlID0gZGF0YS5ka2dSb3VuZDtcbiAgICB0aGlzLmRlY3J5cHRpb25LZXkgPSBkYXRhLmRlY3J5cHRpb25LZXkgPyBCdWZmZXIuZnJvbShkYXRhLmRlY3J5cHRpb25LZXksICdiYXNlNjQnKSA6IG51bGw7XG4gICAgdGhpcy5vdGhlclB1YktleXMgPSBkYXRhLm90aGVyUHViS2V5cyA/IChkYXRhLm90aGVyUHViS2V5cyBhcyBzdHJpbmdbXSkubWFwKChrKSA9PiBCdWZmZXIuZnJvbShrLCAnYmFzZTY0JykpIDogbnVsbDtcbiAgfVxufVxuIl19
293
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGtnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9lZGRzYS1tcHMvZGtnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLG1DQUFnQztBQUNoQyxvREFBNEI7QUFDNUIsbUNBQW9HO0FBTXBHOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQWEsR0FBRztJQXNCZCxZQUFZLENBQVMsRUFBRSxDQUFTLEVBQUUsUUFBZ0I7UUFqQmxELHNEQUFzRDtRQUM5QyxrQkFBYSxHQUFrQixJQUFJLENBQUM7UUFDNUMsbUdBQW1HO1FBQzNGLGlCQUFZLEdBQW9CLElBQUksQ0FBQztRQUM3QywyRUFBMkU7UUFDbkUsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO1FBQzVDLHFEQUFxRDtRQUM3QyxhQUFRLEdBQWtCLElBQUksQ0FBQztRQUN2Qyw2Q0FBNkM7UUFDckMsWUFBTyxHQUFrQixJQUFJLENBQUM7UUFDdEMscUNBQXFDO1FBQzdCLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUM3QyxnQ0FBZ0M7UUFDeEIsWUFBTyxHQUFtQixJQUFJLENBQUM7UUFFN0IsYUFBUSxHQUFhLGdCQUFRLENBQUMsYUFBYSxDQUFDO1FBR3BELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQVc7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixJQUNFLE9BQU8sTUFBTSxLQUFLLFdBQVc7Z0JBQzdCLG1DQUFtQztnQkFDbkMsQ0FBQyxNQUFNLENBQUMsT0FBTztnQkFDZixDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFDekIs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Q0FBQyxDQUFDLElBQUksSUFBSTtTQUMxRSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLE9BQWU7UUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzNGLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzNGLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUUsSUFBSSxDQUFDLFlBQXlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdEgsQ0FBQztDQUNGO0FBaFFELGtCQWdRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTXNnU3RhdGUsIFNoYXJlIH0gZnJvbSAnQGJpdGdvL3dhc20tbXBzJztcbmltcG9ydCB7IGVuY29kZSB9IGZyb20gJ2Nib3IteCc7XG5pbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBEZXNlcmlhbGl6ZWRNZXNzYWdlLCBEZXNlcmlhbGl6ZWRNZXNzYWdlcywgRGtnU3RhdGUsIEVkZHNhUmVkdWNlZEtleVNoYXJlIH0gZnJvbSAnLi90eXBlcyc7XG5cbnR5cGUgTm9kZVdhc21lciA9IHR5cGVvZiBpbXBvcnQoJ0BiaXRnby93YXNtLW1wcycpO1xudHlwZSBXZWJXYXNtZXIgPSB0eXBlb2YgaW1wb3J0KCdAYml0Z28vd2FzbS1tcHMvd2ViJyk7XG50eXBlIFdhc21NcHMgPSBOb2RlV2FzbWVyIHwgV2ViV2FzbWVyO1xuXG4vKipcbiAqIEVkRFNBIERpc3RyaWJ1dGVkIEtleSBHZW5lcmF0aW9uIChES0cpIGltcGxlbWVudGF0aW9uIHVzaW5nIEBiaXRnby93YXNtLW1wcy5cbiAqXG4gKiBTdGF0ZSBpcyBleHBsaWNpdDogZWFjaCByb3VuZCBmdW5jdGlvbiByZXR1cm5zIGB7IG1zZywgc3RhdGUgfWAgYnl0ZXMuXG4gKiBUaGUgc3RhdGUgYnl0ZXMgYXJlIHN0b3JlZCBiZXR3ZWVuIHJvdW5kcyBhbmQgcGFzc2VkIHRvIHRoZSBuZXh0IHJvdW5kIGZ1bmN0aW9uLFxuICogbWlycm9yaW5nIHRoZSBzZXJ2ZXItc2lkZSBwZXJzaXN0ZW5jZSBwYXR0ZXJuIChzdGF0ZSB3b3VsZCBiZSBzZXJpYWxpc2VkIHRvIERCKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZGtnID0gbmV3IERLRygzLCAyLCAwKTtcbiAqIC8vIFgyNTUxOSBrZXlzIGNvbWUgZnJvbSBHUEcgZW5jcnlwdGlvbiBzdWJrZXlzIChleHRyYWN0ZWQgYnkgdGhlIG9yY2hlc3RyYXRvcilcbiAqIGF3YWl0IGRrZy5pbml0RGtnKG15WDI1NTE5UHJpdktleSwgW290aGVyUGFydHkxWDI1NTE5UHViS2V5LCBvdGhlclBhcnR5MlgyNTUxOVB1YktleV0pO1xuICogY29uc3QgbXNnMSA9IGRrZy5nZXRGaXJzdE1lc3NhZ2UoKTtcbiAqIGNvbnN0IG1zZzJzID0gZGtnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoYWxsVGhyZWVNc2cxcyk7XG4gKiBka2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhhbGxUaHJlZU1zZzJzKTsgIC8vIGNvbXBsZXRlcyBES0dcbiAqIGNvbnN0IGtleVNoYXJlID0gZGtnLmdldEtleVNoYXJlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIERLRyB7XG4gIHByb3RlY3RlZCBuOiBudW1iZXI7XG4gIHByb3RlY3RlZCB0OiBudW1iZXI7XG4gIHByb3RlY3RlZCBwYXJ0eUlkeDogbnVtYmVyO1xuXG4gIC8qKiBQcml2YXRlIFgyNTUxOSBrZXkgKGZyb20gR1BHIGVuY3J5cHRpb24gc3Via2V5KSAqL1xuICBwcml2YXRlIGRlY3J5cHRpb25LZXk6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuICAvKiogT3RoZXIgcGFydGllcycgWDI1NTE5IHB1YmxpYyBrZXlzIChmcm9tIHRoZWlyIEdQRyBlbmNyeXB0aW9uIHN1YmtleXMpLCBzb3J0ZWQgYnkgcGFydHkgaW5kZXggKi9cbiAgcHJpdmF0ZSBvdGhlclB1YktleXM6IEJ1ZmZlcltdIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBTZXJpYWxpc2VkIHJvdW5kIHN0YXRlIGJ5dGVzIHJldHVybmVkIGJ5IHRoZSBwcmV2aW91cyByb3VuZCBmdW5jdGlvbiAqL1xuICBwcml2YXRlIGRrZ1N0YXRlQnl0ZXM6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuICAvKiogT3BhcXVlIGJpbmNvZGUtc2VyaWFsaXNlZCBrZXlzaGFyZSBmcm9tIHJvdW5kMiAqL1xuICBwcml2YXRlIGtleVNoYXJlOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIDMyLWJ5dGUgRWQyNTUxOSBwdWJsaWMga2V5IGZyb20gcm91bmQyICovXG4gIHByaXZhdGUgc2hhcmVQazogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiAzMi1ieXRlIGNoYWluIGNvZGUgZnJvbSByb3VuZDIgKi9cbiAgcHJpdmF0ZSBzaGFyZUNoYWluY29kZTogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBMYXppbHkgbG9hZGVkIFdBU00gbW9kdWxlICovXG4gIHByaXZhdGUgd2FzbU1wczogV2FzbU1wcyB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCBka2dTdGF0ZTogRGtnU3RhdGUgPSBEa2dTdGF0ZS5VbmluaXRpYWxpemVkO1xuXG4gIGNvbnN0cnVjdG9yKG46IG51bWJlciwgdDogbnVtYmVyLCBwYXJ0eUlkeDogbnVtYmVyKSB7XG4gICAgdGhpcy5uID0gbjtcbiAgICB0aGlzLnQgPSB0O1xuICAgIHRoaXMucGFydHlJZHggPSBwYXJ0eUlkeDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFdhc21NcHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLndhc21NcHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgLyogY2hlY2tzIGZvciBlbGVjdHJvbiBwcm9jZXNzZXMgKi9cbiAgICAgICAgIXdpbmRvdy5wcm9jZXNzICYmXG4gICAgICAgICF3aW5kb3cucHJvY2Vzcz8uWyd0eXBlJ11cbiAgICAgICkge1xuICAgICAgICAvLyBCcm93c2VyOiB3ZWIgYnVpbGQgaGFzIGV4cGxpY2l0IGluaXQoKSDigJQgZ3VhcmFudGVlZCByZWFkeSBhZnRlciBhd2FpdFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWludGVybmFsLW1vZHVsZXMgLS0gQGJpdGdvL3dhc20tbXBzIGV4cG9zZXMgZW52aXJvbm1lbnQtc3BlY2lmaWMgc3VicGF0aCBleHBvcnRzLlxuICAgICAgICBjb25zdCB3ZWJXYXNtID0gYXdhaXQgaW1wb3J0KCdAYml0Z28vd2FzbS1tcHMvd2ViJyk7XG4gICAgICAgIGF3YWl0IHdlYldhc20uZGVmYXVsdCgpO1xuICAgICAgICB0aGlzLndhc21NcHMgPSB3ZWJXYXNtO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm9kZS5qczogZHluYW1pYyBpbXBvcnQoKSByZXdyaXR0ZW4gdG8gcmVxdWlyZSgpIGJ5IHRzYyDihpIgQ0pTIGJ1aWxkIOKGkiByZWFkRmlsZVN5bmNcbiAgICAgICAgdGhpcy53YXNtTXBzID0gYXdhaXQgaW1wb3J0KCdAYml0Z28vd2FzbS1tcHMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFdhc21NcHMoKTogV2FzbU1wcyB7XG4gICAgaWYgKCF0aGlzLndhc21NcHMpIHtcbiAgICAgIHRocm93IEVycm9yKCdXQVNNIG1vZHVsZSBub3QgbG9hZGVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLndhc21NcHM7XG4gIH1cblxuICBnZXRTdGF0ZSgpOiBEa2dTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuZGtnU3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGlzZXMgdGhlIERLRyBzZXNzaW9uIHdpdGggdGhpcyBwYXJ0eSdzIFgyNTUxOSBwcml2YXRlIGtleSBhbmQgdGhlIG90aGVyIHBhcnRpZXMnXG4gICAqIFgyNTUxOSBwdWJsaWMga2V5cy4gS2V5cyBhcmUgZXh0cmFjdGVkIGZyb20gR1BHIGVuY3J5cHRpb24gc3Via2V5cyBieSB0aGUgb3JjaGVzdHJhdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gZGVjcnlwdGlvbktleSAtIFRoaXMgcGFydHkncyAzMi1ieXRlIFgyNTUxOSBwcml2YXRlIGtleSAoR1BHIGVuYyBzdWJrZXkgcHJpdmF0ZSBwYXJ0KS5cbiAgICogQHBhcmFtIG90aGVyRW5jUHVibGljS2V5cyAtIE90aGVyIHBhcnRpZXMnIDMyLWJ5dGUgWDI1NTE5IHB1YmxpYyBrZXlzLCBzb3J0ZWQgYnkgYXNjZW5kaW5nXG4gICAqICAgcGFydHkgaW5kZXggKGV4Y2x1ZGluZyBvd24pLiBGb3IgYSAzLXBhcnR5IHNldHVwLCB0aGlzIGlzIFtwYXJ0eV9BX3B1YiwgcGFydHlfQl9wdWJdLlxuICAgKi9cbiAgYXN5bmMgaW5pdERrZyhkZWNyeXB0aW9uS2V5OiBCdWZmZXIsIG90aGVyRW5jUHVibGljS2V5czogQnVmZmVyW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvYWRXYXNtTXBzKCk7XG4gICAgaWYgKCFkZWNyeXB0aW9uS2V5IHx8IGRlY3J5cHRpb25LZXkubGVuZ3RoICE9PSAzMikge1xuICAgICAgdGhyb3cgRXJyb3IoJ01pc3Npbmcgb3IgaW52YWxpZCBkZWNyeXB0aW9uIGtleTogbXVzdCBiZSAzMiBieXRlcycpO1xuICAgIH1cbiAgICBpZiAoIW90aGVyRW5jUHVibGljS2V5cyB8fCBvdGhlckVuY1B1YmxpY0tleXMubGVuZ3RoICE9PSB0aGlzLm4gLSAxKSB7XG4gICAgICB0aHJvdyBFcnJvcihgRXhwZWN0ZWQgJHt0aGlzLm4gLSAxfSBvdGhlciBwYXJ0aWVzJyBwdWJsaWMga2V5c2ApO1xuICAgIH1cbiAgICBpZiAodGhpcy50ID4gdGhpcy5uIHx8IHRoaXMucGFydHlJZHggPj0gdGhpcy5uKSB7XG4gICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBwYXJhbWV0ZXJzIGZvciBES0cnKTtcbiAgICB9XG5cbiAgICB0aGlzLmRlY3J5cHRpb25LZXkgPSBkZWNyeXB0aW9uS2V5O1xuICAgIHRoaXMub3RoZXJQdWJLZXlzID0gb3RoZXJFbmNQdWJsaWNLZXlzO1xuICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5Jbml0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcm91bmQwIG9mIHRoZSBES0cgcHJvdG9jb2wuIFJldHVybnMgdGhpcyBwYXJ0eSdzIGJyb2FkY2FzdCBtZXNzYWdlLlxuICAgKiBTdG9yZXMgdGhlIHJvdW5kIHN0YXRlIGJ5dGVzIGludGVybmFsbHkgZm9yIHRoZSBuZXh0IHJvdW5kLlxuICAgKlxuICAgKiBAcGFyYW0gZGtnU2VlZCAtIE9wdGlvbmFsIDMyLWJ5dGUgc2VlZCBmb3IgZGV0ZXJtaW5pc3RpYyBES0cgb3V0cHV0ICh0ZXN0aW5nIG9ubHkpLlxuICAgKi9cbiAgZ2V0Rmlyc3RNZXNzYWdlKGRrZ1NlZWQ/OiBCdWZmZXIpOiBEZXNlcmlhbGl6ZWRNZXNzYWdlIHtcbiAgICBpZiAodGhpcy5ka2dTdGF0ZSAhPT0gRGtnU3RhdGUuSW5pdCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlZWQgPSBka2dTZWVkID8/IGNyeXB0by5yYW5kb21CeXRlcygzMik7XG4gICAgY29uc3Qgd2FzbSA9IHRoaXMuZ2V0V2FzbU1wcygpO1xuICAgIGxldCByZXN1bHQ6IE1zZ1N0YXRlO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSB3YXNtLmVkMjU1MTlfZGtnX3JvdW5kMF9wcm9jZXNzKHRoaXMucGFydHlJZHgsIHRoaXMuZGVjcnlwdGlvbktleSEsIHRoaXMub3RoZXJQdWJLZXlzISwgc2VlZCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBmaXJzdCBtZXNzYWdlIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fTogJHtlcnJ9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5ka2dTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20ocmVzdWx0LnN0YXRlKTtcbiAgICB0aGlzLmRrZ1N0YXRlID0gRGtnU3RhdGUuV2FpdE1zZzE7XG4gICAgcmV0dXJuIHsgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmVzdWx0Lm1zZyksIGZyb206IHRoaXMucGFydHlJZHggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGluY29taW5nIG1lc3NhZ2VzIGZyb20gYWxsIHBhcnRpZXMgYW5kIGFkdmFuY2VzIHRoZSBwcm90b2NvbC5cbiAgICpcbiAgICogLSBJbiBXYWl0TXNnMTogcnVucyByb3VuZDEsIHJldHVybnMgdGhpcyBwYXJ0eSdzIHJvdW5kMSBicm9hZGNhc3QgbWVzc2FnZS5cbiAgICogLSBJbiBXYWl0TXNnMjogcnVucyByb3VuZDIsIGNvbXBsZXRlcyBES0csIHJldHVybnMgW10uXG4gICAqXG4gICAqIFRoZSBjYWxsZXIgcGFzc2VzIGFsbCBuIG1lc3NhZ2VzIChpbmNsdWRpbmcgb3duKTsgb3duIG1lc3NhZ2UgaXMgZmlsdGVyZWRcbiAgICogb3V0IGludGVybmFsbHkuIE90aGVyIHBhcnRpZXMnIG1lc3NhZ2VzIGFyZSBzb3J0ZWQgYnkgYXNjZW5kaW5nIHBhcnR5IGluZGV4LFxuICAgKiBtYXRjaGluZyB0aGUgb3JkZXJpbmcgZXhwZWN0ZWQgYnkgQGJpdGdvL3dhc20tbXBzLlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZXNGb3JJdGhSb3VuZCAtIEFsbCBuIG1lc3NhZ2VzIGZvciB0aGlzIHJvdW5kIChpbmNsdWRpbmcgb3duKS5cbiAgICovXG4gIGhhbmRsZUluY29taW5nTWVzc2FnZXMobWVzc2FnZXNGb3JJdGhSb3VuZDogRGVzZXJpYWxpemVkTWVzc2FnZXMpOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyB7XG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLkNvbXBsZXRlKSB7XG4gICAgICB0aHJvdyBFcnJvcignREtHIHNlc3Npb24gYWxyZWFkeSBjb21wbGV0ZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLlVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAnREtHIHNlc3Npb24gbXVzdCBjYWxsIGdldEZpcnN0TWVzc2FnZSgpIGJlZm9yZSBoYW5kbGluZyBpbmNvbWluZyBtZXNzYWdlcy4gQ2FsbCBnZXRGaXJzdE1lc3NhZ2UoKSBmaXJzdC4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZXNGb3JJdGhSb3VuZC5sZW5ndGggIT09IHRoaXMubikge1xuICAgICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgbnVtYmVyIG9mIG1lc3NhZ2VzIGZvciB0aGUgcm91bmQuIE51bWJlciBvZiBtZXNzYWdlcyBzaG91bGQgYmUgZXF1YWwgdG8gTicpO1xuICAgIH1cblxuICAgIC8vIEV4dHJhY3Qgb3RoZXIgcGFydGllcycgbWVzc2FnZXMsIHNvcnRlZCBieSBwYXJ0eSBpbmRleCAoYXNjZW5kaW5nKVxuICAgIGNvbnN0IG90aGVyTXNncyA9IG1lc3NhZ2VzRm9ySXRoUm91bmRcbiAgICAgIC5maWx0ZXIoKG0pID0+IG0uZnJvbSAhPT0gdGhpcy5wYXJ0eUlkeClcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmZyb20gLSBiLmZyb20pXG4gICAgICAubWFwKChtKSA9PiBtLnBheWxvYWQpO1xuXG4gICAgY29uc3Qgd2FzbSA9IHRoaXMuZ2V0V2FzbU1wcygpO1xuXG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLldhaXRNc2cxKSB7XG4gICAgICBsZXQgcmVzdWx0OiBNc2dTdGF0ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IHdhc20uZWQyNTUxOV9ka2dfcm91bmQxX3Byb2Nlc3Mob3RoZXJNc2dzLCB0aGlzLmRrZ1N0YXRlQnl0ZXMhKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIG1lc3NhZ2VzIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fSwgcm91bmQgJHt0aGlzLmRrZ1N0YXRlfTogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgICAvLyBTdG9yZSBuZXcgc3RhdGU7IHRoaXMgaXMgd2hhdCB3b3VsZCBiZSBwZXJzaXN0ZWQgdG8gREIgYmV0d2VlbiBBUEkgcm91bmRzXG4gICAgICB0aGlzLmRrZ1N0YXRlQnl0ZXMgPSBCdWZmZXIuZnJvbShyZXN1bHQuc3RhdGUpO1xuICAgICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLldhaXRNc2cyO1xuICAgICAgcmV0dXJuIFt7IHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KHJlc3VsdC5tc2cpLCBmcm9tOiB0aGlzLnBhcnR5SWR4IH1dO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRrZ1N0YXRlID09PSBEa2dTdGF0ZS5XYWl0TXNnMikge1xuICAgICAgbGV0IHNoYXJlOiBTaGFyZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNoYXJlID0gd2FzbS5lZDI1NTE5X2RrZ19yb3VuZDJfcHJvY2VzcyhvdGhlck1zZ3MsIHRoaXMuZGtnU3RhdGVCeXRlcyEpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgbWVzc2FnZXMgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9LCByb3VuZCAke3RoaXMuZGtnU3RhdGV9OiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMua2V5U2hhcmUgPSBCdWZmZXIuZnJvbShzaGFyZS5zaGFyZSk7XG4gICAgICB0aGlzLnNoYXJlUGsgPSBCdWZmZXIuZnJvbShzaGFyZS5wayk7XG4gICAgICB0aGlzLnNoYXJlQ2hhaW5jb2RlID0gQnVmZmVyLmZyb20oc2hhcmUuY2hhaW5jb2RlKTtcbiAgICAgIHRoaXMuZGtnU3RhdGVCeXRlcyA9IG51bGw7XG4gICAgICB0aGlzLmRrZ1N0YXRlID0gRGtnU3RhdGUuQ29tcGxldGU7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdGhyb3cgRXJyb3IoJ1VuZXhwZWN0ZWQgREtHIHN0YXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb3BhcXVlIGJpbmNvZGUtc2VyaWFsaXNlZCBrZXlzaGFyZSBwcm9kdWNlZCBieSByb3VuZDIuXG4gICAqIFRoaXMgaXMgdXNlZCBhcyBpbnB1dCB0byB0aGUgc2lnbmluZyBwcm90b2NvbC5cbiAgICovXG4gIGdldEtleVNoYXJlKCk6IEJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLmtleVNoYXJlKSB7XG4gICAgICB0aHJvdyBFcnJvcignREtHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmtleVNoYXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIDMyLWJ5dGUgRWQyNTUxOSBwdWJsaWMga2V5IGFncmVlZCBieSBhbGwgcGFydGllcyBkdXJpbmcgREtHLlxuICAgKi9cbiAgZ2V0U2hhcmVQdWJsaWNLZXkoKTogQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMuc2hhcmVQaykge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaGFyZVBrO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIDEyOC1jaGFyIGhleCBjb21tb24ga2V5Y2hhaW46IDY0LWNoYXIgcHVibGljIGtleSArIDY0LWNoYXIgY2hhaW4gY29kZS5cbiAgICogVGhpcyBtYXRjaGVzIHRoZSBmb3JtYXQgZXhwZWN0ZWQgYnkgYWRkcmVzcyBkZXJpdmF0aW9uIChFZGRzYS5kZXJpdmVVbmhhcmRlbmVkKS5cbiAgICovXG4gIGdldENvbW1vbktleWNoYWluKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnNoYXJlUGsgfHwgIXRoaXMuc2hhcmVDaGFpbmNvZGUpIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVQay50b1N0cmluZygnaGV4JykgKyB0aGlzLnNoYXJlQ2hhaW5jb2RlLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgQ0JPUi1lbmNvZGVkIFJlZHVjZWRLZXlTaGFyZSBidWZmZXIgY29udGFpbmluZyB0aGUgcGFydHkncyBvcGFxdWVcbiAgICogc2lnbmluZyBrZXkgc2hhcmUgaW4gdGhlIGBrZXlTaGFyZWAgZmllbGQuIFRoaXMgYnVmZmVyIGlzIHByaXZhdGUga2V5IG1hdGVyaWFsLlxuICAgKiBUaGUgY2FsbGVyIGVuY3J5cHRzIGl0IGFuZCBzdG9yZXMgaXQgYXMgYHJlZHVjZWRFbmNyeXB0ZWRQcnZgIG9uIHRoZSBrZXkgY2FyZCBRUiBjb2RlLlxuICAgKi9cbiAgZ2V0UmVkdWNlZEtleVNoYXJlKCk6IEJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLmtleVNoYXJlIHx8ICF0aGlzLnNoYXJlUGsgfHwgIXRoaXMuc2hhcmVDaGFpbmNvZGUpIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgY29uc3QgcmVkdWNlZEtleVNoYXJlOiBFZGRzYVJlZHVjZWRLZXlTaGFyZSA9IHtcbiAgICAgIGtleVNoYXJlOiBBcnJheS5mcm9tKHRoaXMua2V5U2hhcmUpLFxuICAgICAgcHViOiBBcnJheS5mcm9tKHRoaXMuc2hhcmVQayksXG4gICAgICByb290Q2hhaW5Db2RlOiBBcnJheS5mcm9tKHRoaXMuc2hhcmVDaGFpbmNvZGUpLFxuICAgIH07XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGVuY29kZShyZWR1Y2VkS2V5U2hhcmUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBjdXJyZW50IHNlc3Npb24gc3RhdGUgYXMgYSBKU09OIHN0cmluZyBmb3IgcGVyc2lzdGVuY2UuXG4gICAqIEluY2x1ZGVzOiByb3VuZCBzdGF0ZSBieXRlcywgY3VycmVudCBES0cgcm91bmQsIGRlY3J5cHRpb24ga2V5LCBvdGhlciBwYXJ0aWVzJyBwdWIga2V5cy5cbiAgICogVGhpcyBtaXJyb3JzIHdoYXQgYSBzZXJ2ZXIgd291bGQgc3RvcmUgaW4gYSBkYXRhYmFzZSBiZXR3ZWVuIEFQSSByb3VuZHMuXG4gICAqL1xuICBnZXRTZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLkNvbXBsZXRlKSB7XG4gICAgICB0aHJvdyBFcnJvcignREtHIHNlc3Npb24gaXMgY29tcGxldGUuIEV4cG9ydGluZyB0aGUgc2Vzc2lvbiBpcyBub3QgYWxsb3dlZC4nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLlVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGRrZ1N0YXRlQnl0ZXM6IHRoaXMuZGtnU3RhdGVCeXRlcz8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBka2dSb3VuZDogdGhpcy5ka2dTdGF0ZSxcbiAgICAgIGRlY3J5cHRpb25LZXk6IHRoaXMuZGVjcnlwdGlvbktleT8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBvdGhlclB1YktleXM6IHRoaXMub3RoZXJQdWJLZXlzPy5tYXAoKGspID0+IGsudG9TdHJpbmcoJ2Jhc2U2NCcpKSA/PyBudWxsLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RvcmVzIGEgcHJldmlvdXNseSBleHBvcnRlZCBzZXNzaW9uLiBBbGxvd3MgdGhlIHByb3RvY29sIHRvIGNvbnRpbnVlXG4gICAqIGZyb20gd2hlcmUgaXQgbGVmdCBvZmYsIGFzIGlmIHRoZSByb3VuZCBzdGF0ZSB3YXMgbG9hZGVkIGZyb20gYSBkYXRhYmFzZS5cbiAgICovXG4gIHJlc3RvcmVTZXNzaW9uKHNlc3Npb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHNlc3Npb24pO1xuICAgIHRoaXMuZGtnU3RhdGVCeXRlcyA9IGRhdGEuZGtnU3RhdGVCeXRlcyA/IEJ1ZmZlci5mcm9tKGRhdGEuZGtnU3RhdGVCeXRlcywgJ2Jhc2U2NCcpIDogbnVsbDtcbiAgICB0aGlzLmRrZ1N0YXRlID0gZGF0YS5ka2dSb3VuZDtcbiAgICB0aGlzLmRlY3J5cHRpb25LZXkgPSBkYXRhLmRlY3J5cHRpb25LZXkgPyBCdWZmZXIuZnJvbShkYXRhLmRlY3J5cHRpb25LZXksICdiYXNlNjQnKSA6IG51bGw7XG4gICAgdGhpcy5vdGhlclB1YktleXMgPSBkYXRhLm90aGVyUHViS2V5cyA/IChkYXRhLm90aGVyUHViS2V5cyBhcyBzdHJpbmdbXSkubWFwKChrKSA9PiBCdWZmZXIuZnJvbShrLCAnYmFzZTY0JykpIDogbnVsbDtcbiAgfVxufVxuIl19
@@ -0,0 +1,92 @@
1
+ import { DeserializedMessage, DeserializedMessages, DsgState } from './types';
2
+ /**
3
+ * EdDSA Distributed Sign Generation (DSG) implementation using @bitgo/wasm-mps.
4
+ *
5
+ * State is explicit: each WASM round function returns
6
+ * `{ msg, state }` bytes; the state bytes are stored between rounds and passed to the
7
+ * next round function (this is what a server would persist to a database between API
8
+ * rounds).
9
+ *
10
+ * The protocol is hard-coded 2-of-3: each signing party communicates with exactly one
11
+ * counterpart. `handleIncomingMessages` accepts both messages (own + counterpart), and
12
+ * filters own out internally.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const dsg = new DSG(0); // partyIdx 0
17
+ * dsg.initDsg(keyShare, message, 'm', 2); // counterpart is party 2
18
+ * const msg1 = dsg.getFirstMessage();
19
+ * const msg2 = dsg.handleIncomingMessages([msg1, peerMsg1]); // emits SignMsg2
20
+ * const msg3 = dsg.handleIncomingMessages([msg2[0], peerMsg2]); // emits SignMsg3
21
+ * dsg.handleIncomingMessages([msg3[0], peerMsg3]); // completes DSG
22
+ * const signature = dsg.getSignature(); // 64-byte Ed25519 signature
23
+ * ```
24
+ */
25
+ export declare class DSG {
26
+ protected partyIdx: number;
27
+ protected otherPartyIdx: number | null;
28
+ /** Opaque bincode-serialised Keyshare from a prior DKG */
29
+ private keyShare;
30
+ /** Raw message bytes to sign (Ed25519 hashes internally; no prehashing required) */
31
+ private message;
32
+ /** BIP-32-style derivation path, e.g. "m" or "m/0/1". Folded in via Keyshare::derive_with_offset */
33
+ private derivationPath;
34
+ /** Serialised round state bytes returned by the previous round function */
35
+ private dsgStateBytes;
36
+ /** Final 64-byte Ed25519 signature, available after WaitMsg3 -> Complete */
37
+ private signature;
38
+ protected dsgState: DsgState;
39
+ constructor(partyIdx: number);
40
+ getState(): DsgState;
41
+ getPartyIdx(): number;
42
+ getOtherPartyIdx(): number | null;
43
+ /**
44
+ * Initialises the DSG session. The keyshare must come from a prior DKG run, and
45
+ * `otherPartyIdx` must be the single counterpart who will co-sign with this party.
46
+ *
47
+ * @param keyShare - Opaque bincode-serialised Keyshare bytes from `DKG.getKeyShare()`.
48
+ * @param message - Raw message bytes to sign (no prehashing).
49
+ * @param derivationPath - BIP-32-style derivation path. Use `"m"` for the root key.
50
+ * @param otherPartyIdx - Party index of the single counterpart in this signing session.
51
+ * Must differ from this party's own `partyIdx` and be in `[0, 2]`.
52
+ */
53
+ initDsg(keyShare: Buffer, message: Buffer, derivationPath: string, otherPartyIdx: number): void;
54
+ /**
55
+ * Runs round 0 of the DSG protocol. Returns this party's broadcast message
56
+ * (a `SignMsg1` containing the commitment to `R_i`). Stores the round state
57
+ * bytes internally for the next round.
58
+ */
59
+ getFirstMessage(): DeserializedMessage;
60
+ /**
61
+ * Handles incoming messages for the current round and advances the protocol.
62
+ *
63
+ * - In `WaitMsg1`: runs round 1, returns this party's `SignMsg2` broadcast.
64
+ * - In `WaitMsg2`: runs round 2 (which internally fuses two Silence Labs transitions),
65
+ * returns this party's `SignMsg3` broadcast (partial signature).
66
+ * - In `WaitMsg3`: runs round 3, completes DSG, returns `[]`.
67
+ *
68
+ * The caller passes both messages (own + counterpart) for symmetry with
69
+ * `DKG.handleIncomingMessages`. Own message is filtered out internally; only the
70
+ * counterpart's payload is forwarded to the WASM round function.
71
+ *
72
+ * @param messagesForIthRound - Both messages for this round (own + counterpart).
73
+ */
74
+ handleIncomingMessages(messagesForIthRound: DeserializedMessages): DeserializedMessages;
75
+ /**
76
+ * Returns the final 64-byte Ed25519 signature produced by round 3.
77
+ * Only available once the protocol reaches `Complete`.
78
+ */
79
+ getSignature(): Buffer;
80
+ /**
81
+ * Exports the current session state as a JSON string for persistence.
82
+ * Includes the opaque round state bytes plus everything needed to re-enter the
83
+ * protocol after a restart (keyshare, message, derivation path, counterpart).
84
+ */
85
+ getSession(): string;
86
+ /**
87
+ * Restores a previously exported session. Allows the protocol to continue from
88
+ * where it left off, as if the round state was loaded from a database.
89
+ */
90
+ restoreSession(session: string): void;
91
+ }
92
+ //# sourceMappingURL=dsg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsg.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/dsg.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE9E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,GAAG;IACd,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE9C,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAuB;IACvC,oFAAoF;IACpF,OAAO,CAAC,OAAO,CAAuB;IACtC,oGAAoG;IACpG,OAAO,CAAC,cAAc,CAAuB;IAE7C,2EAA2E;IAC3E,OAAO,CAAC,aAAa,CAAuB;IAC5C,4EAA4E;IAC5E,OAAO,CAAC,SAAS,CAAuB;IAExC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAA0B;gBAE1C,QAAQ,EAAE,MAAM;IAI5B,QAAQ,IAAI,QAAQ;IAIpB,WAAW,IAAI,MAAM;IAIrB,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAIjC;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAqB/F;;;;OAIG;IACH,eAAe,IAAI,mBAAmB;IAoBtC;;;;;;;;;;;;;OAaG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;IAqEvF;;;OAGG;IACH,YAAY,IAAI,MAAM;IAOtB;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAqBpB;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CA2DtC"}
@@ -0,0 +1,284 @@
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
+ getPartyIdx() {
53
+ return this.partyIdx;
54
+ }
55
+ getOtherPartyIdx() {
56
+ return this.otherPartyIdx;
57
+ }
58
+ /**
59
+ * Initialises the DSG session. The keyshare must come from a prior DKG run, and
60
+ * `otherPartyIdx` must be the single counterpart who will co-sign with this party.
61
+ *
62
+ * @param keyShare - Opaque bincode-serialised Keyshare bytes from `DKG.getKeyShare()`.
63
+ * @param message - Raw message bytes to sign (no prehashing).
64
+ * @param derivationPath - BIP-32-style derivation path. Use `"m"` for the root key.
65
+ * @param otherPartyIdx - Party index of the single counterpart in this signing session.
66
+ * Must differ from this party's own `partyIdx` and be in `[0, 2]`.
67
+ */
68
+ initDsg(keyShare, message, derivationPath, otherPartyIdx) {
69
+ if (!keyShare || keyShare.length === 0) {
70
+ throw Error('Missing or invalid keyShare');
71
+ }
72
+ if (!message || message.length === 0) {
73
+ throw Error('Missing or invalid message');
74
+ }
75
+ if (this.partyIdx < 0 || this.partyIdx > 2) {
76
+ throw Error(`Invalid partyIdx ${this.partyIdx}: must be in [0, 2]`);
77
+ }
78
+ if (otherPartyIdx < 0 || otherPartyIdx > 2 || otherPartyIdx === this.partyIdx) {
79
+ throw Error(`Invalid otherPartyIdx ${otherPartyIdx}: must be in [0, 2] and != partyIdx`);
80
+ }
81
+ this.keyShare = keyShare;
82
+ this.message = message;
83
+ this.derivationPath = derivationPath;
84
+ this.otherPartyIdx = otherPartyIdx;
85
+ this.dsgState = types_1.DsgState.Init;
86
+ }
87
+ /**
88
+ * Runs round 0 of the DSG protocol. Returns this party's broadcast message
89
+ * (a `SignMsg1` containing the commitment to `R_i`). Stores the round state
90
+ * bytes internally for the next round.
91
+ */
92
+ getFirstMessage() {
93
+ if (this.dsgState !== types_1.DsgState.Init) {
94
+ throw Error('DSG session not initialized');
95
+ }
96
+ (0, assert_1.default)(this.keyShare, 'keyShare must be set after initDsg');
97
+ (0, assert_1.default)(this.derivationPath !== null, 'derivationPath must be set after initDsg');
98
+ (0, assert_1.default)(this.message, 'message must be set after initDsg');
99
+ let result;
100
+ try {
101
+ result = (0, wasm_mps_1.ed25519_dsg_round0_process)(this.keyShare, this.derivationPath, this.message);
102
+ }
103
+ catch (err) {
104
+ throw new Error(`Error while creating the first message from party ${this.partyIdx}: ${err}`);
105
+ }
106
+ this.dsgStateBytes = Buffer.from(result.state);
107
+ this.dsgState = types_1.DsgState.WaitMsg1;
108
+ return { payload: new Uint8Array(result.msg), from: this.partyIdx };
109
+ }
110
+ /**
111
+ * Handles incoming messages for the current round and advances the protocol.
112
+ *
113
+ * - In `WaitMsg1`: runs round 1, returns this party's `SignMsg2` broadcast.
114
+ * - In `WaitMsg2`: runs round 2 (which internally fuses two Silence Labs transitions),
115
+ * returns this party's `SignMsg3` broadcast (partial signature).
116
+ * - In `WaitMsg3`: runs round 3, completes DSG, returns `[]`.
117
+ *
118
+ * The caller passes both messages (own + counterpart) for symmetry with
119
+ * `DKG.handleIncomingMessages`. Own message is filtered out internally; only the
120
+ * counterpart's payload is forwarded to the WASM round function.
121
+ *
122
+ * @param messagesForIthRound - Both messages for this round (own + counterpart).
123
+ */
124
+ handleIncomingMessages(messagesForIthRound) {
125
+ if (this.dsgState === types_1.DsgState.Complete) {
126
+ throw Error('DSG session already completed');
127
+ }
128
+ if (this.dsgState === types_1.DsgState.Uninitialized) {
129
+ throw Error('DSG session not initialized');
130
+ }
131
+ if (this.dsgState === types_1.DsgState.Init) {
132
+ throw Error('DSG session must call getFirstMessage() before handling incoming messages. Call getFirstMessage() first.');
133
+ }
134
+ if (messagesForIthRound.length !== 2) {
135
+ throw Error('Invalid number of messages for the round. Expected 2 messages (own + counterpart) for 2-of-3 DSG');
136
+ }
137
+ const peerMessages = messagesForIthRound.filter((m) => m.from !== this.partyIdx);
138
+ if (peerMessages.length !== 1) {
139
+ throw Error(`Expected exactly 1 counterpart message; got ${peerMessages.length}`);
140
+ }
141
+ const peerMsg = peerMessages[0];
142
+ if (peerMsg.from !== this.otherPartyIdx) {
143
+ throw Error(`Unexpected counterpart party index: got ${peerMsg.from}, expected ${this.otherPartyIdx}`);
144
+ }
145
+ const peerPayload = Buffer.from(peerMsg.payload);
146
+ if (this.dsgState === types_1.DsgState.WaitMsg1) {
147
+ (0, assert_1.default)(this.dsgStateBytes, 'dsgStateBytes must be set in WaitMsg1');
148
+ let result;
149
+ try {
150
+ result = (0, wasm_mps_1.ed25519_dsg_round1_process)(peerPayload, this.dsgStateBytes);
151
+ }
152
+ catch (err) {
153
+ throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dsgState}: ${err}`);
154
+ }
155
+ this.dsgStateBytes = Buffer.from(result.state);
156
+ this.dsgState = types_1.DsgState.WaitMsg2;
157
+ return [{ payload: new Uint8Array(result.msg), from: this.partyIdx }];
158
+ }
159
+ if (this.dsgState === types_1.DsgState.WaitMsg2) {
160
+ (0, assert_1.default)(this.dsgStateBytes, 'dsgStateBytes must be set in WaitMsg2');
161
+ let result;
162
+ try {
163
+ result = (0, wasm_mps_1.ed25519_dsg_round2_process)(peerPayload, this.dsgStateBytes);
164
+ }
165
+ catch (err) {
166
+ throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dsgState}: ${err}`);
167
+ }
168
+ this.dsgStateBytes = Buffer.from(result.state);
169
+ this.dsgState = types_1.DsgState.WaitMsg3;
170
+ return [{ payload: new Uint8Array(result.msg), from: this.partyIdx }];
171
+ }
172
+ if (this.dsgState === types_1.DsgState.WaitMsg3) {
173
+ (0, assert_1.default)(this.dsgStateBytes, 'dsgStateBytes must be set in WaitMsg3');
174
+ let sigBytes;
175
+ try {
176
+ sigBytes = (0, wasm_mps_1.ed25519_dsg_round3_process)(peerPayload, this.dsgStateBytes);
177
+ }
178
+ catch (err) {
179
+ throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dsgState}: ${err}`);
180
+ }
181
+ this.signature = Buffer.from(sigBytes);
182
+ this.dsgStateBytes = null;
183
+ this.dsgState = types_1.DsgState.Complete;
184
+ return [];
185
+ }
186
+ throw Error('Unexpected DSG state');
187
+ }
188
+ /**
189
+ * Returns the final 64-byte Ed25519 signature produced by round 3.
190
+ * Only available once the protocol reaches `Complete`.
191
+ */
192
+ getSignature() {
193
+ if (!this.signature) {
194
+ throw Error('DSG session has not produced a signature yet');
195
+ }
196
+ return this.signature;
197
+ }
198
+ /**
199
+ * Exports the current session state as a JSON string for persistence.
200
+ * Includes the opaque round state bytes plus everything needed to re-enter the
201
+ * protocol after a restart (keyshare, message, derivation path, counterpart).
202
+ */
203
+ getSession() {
204
+ if (this.dsgState === types_1.DsgState.Complete) {
205
+ throw Error('DSG session is complete. Exporting the session is not allowed.');
206
+ }
207
+ if (this.dsgState === types_1.DsgState.Uninitialized) {
208
+ throw Error('DSG session not initialized');
209
+ }
210
+ if (this.dsgState === types_1.DsgState.Init) {
211
+ throw Error('DSG session must produce its first message before exporting.');
212
+ }
213
+ return JSON.stringify({
214
+ dsgStateBytes: this.dsgStateBytes?.toString('base64') ?? null,
215
+ dsgRound: this.dsgState,
216
+ keyShare: this.keyShare?.toString('base64') ?? null,
217
+ message: this.message?.toString('base64') ?? null,
218
+ derivationPath: this.derivationPath,
219
+ partyIdx: this.partyIdx,
220
+ otherPartyIdx: this.otherPartyIdx,
221
+ });
222
+ }
223
+ /**
224
+ * Restores a previously exported session. Allows the protocol to continue from
225
+ * where it left off, as if the round state was loaded from a database.
226
+ */
227
+ restoreSession(session) {
228
+ const data = JSON.parse(session);
229
+ if (!Object.values(types_1.DsgState).includes(data.dsgRound)) {
230
+ throw Error(`Invalid dsgRound in session: ${data.dsgRound}`);
231
+ }
232
+ if (data.dsgRound === types_1.DsgState.Uninitialized || data.dsgRound === types_1.DsgState.Init) {
233
+ throw Error(`Cannot restore DSG session in state ${data.dsgRound}`);
234
+ }
235
+ if (data.dsgRound === types_1.DsgState.Complete) {
236
+ throw Error('DSG session is complete. Restoring the session is not allowed.');
237
+ }
238
+ if (typeof data.partyIdx !== 'number' || data.partyIdx < 0 || data.partyIdx > 2) {
239
+ throw Error(`Invalid partyIdx in session: ${data.partyIdx}`);
240
+ }
241
+ if (typeof data.otherPartyIdx !== 'number' ||
242
+ data.otherPartyIdx < 0 ||
243
+ data.otherPartyIdx > 2 ||
244
+ data.otherPartyIdx === data.partyIdx) {
245
+ throw Error(`Invalid otherPartyIdx in session: ${data.otherPartyIdx}`);
246
+ }
247
+ if (this.partyIdx !== data.partyIdx) {
248
+ throw Error(`Session partyIdx ${data.partyIdx} does not match instance ${this.partyIdx}`);
249
+ }
250
+ if (typeof data.dsgStateBytes !== 'string' || data.dsgStateBytes.length === 0) {
251
+ throw Error(`Round ${data.dsgRound} requires dsgStateBytes`);
252
+ }
253
+ if (typeof data.keyShare !== 'string' || data.keyShare.length === 0) {
254
+ throw Error('Restored session missing keyShare');
255
+ }
256
+ if (typeof data.message !== 'string' || data.message.length === 0) {
257
+ throw Error('Restored session missing message');
258
+ }
259
+ if (typeof data.derivationPath !== 'string') {
260
+ throw Error('Restored session missing derivationPath');
261
+ }
262
+ const dsgStateBytes = Buffer.from(data.dsgStateBytes, 'base64');
263
+ const keyShare = Buffer.from(data.keyShare, 'base64');
264
+ const message = Buffer.from(data.message, 'base64');
265
+ if (dsgStateBytes.length === 0) {
266
+ throw Error(`Round ${data.dsgRound} requires dsgStateBytes`);
267
+ }
268
+ if (keyShare.length === 0) {
269
+ throw Error('Restored session missing keyShare');
270
+ }
271
+ if (message.length === 0) {
272
+ throw Error('Restored session missing message');
273
+ }
274
+ this.dsgStateBytes = dsgStateBytes;
275
+ this.dsgState = data.dsgRound;
276
+ this.keyShare = keyShare;
277
+ this.message = message;
278
+ this.derivationPath = data.derivationPath;
279
+ this.partyIdx = data.partyIdx;
280
+ this.otherPartyIdx = data.otherPartyIdx;
281
+ }
282
+ }
283
+ exports.DSG = DSG;
284
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHNnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9lZGRzYS1tcHMvZHNnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUE0QjtBQUM1Qiw4Q0FLeUI7QUFDekIsbUNBQThFO0FBRTlFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBYSxHQUFHO0lBa0JkLFlBQVksUUFBZ0I7UUFoQmxCLGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQUU5QywwREFBMEQ7UUFDbEQsYUFBUSxHQUFrQixJQUFJLENBQUM7UUFDdkMsb0ZBQW9GO1FBQzVFLFlBQU8sR0FBa0IsSUFBSSxDQUFDO1FBQ3RDLG9HQUFvRztRQUM1RixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFFN0MsMkVBQTJFO1FBQ25FLGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQUM1Qyw0RUFBNEU7UUFDcEUsY0FBUyxHQUFrQixJQUFJLENBQUM7UUFFOUIsYUFBUSxHQUFhLGdCQUFRLENBQUMsYUFBYSxDQUFDO1FBR3BELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILE9BQU8sQ0FBQyxRQUFnQixFQUFFLE9BQWUsRUFBRSxjQUFzQixFQUFFLGFBQXFCO1FBQ3RGLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxJ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RyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDMUMsQ0FBQztDQUNGO0FBalJELGtCQWlSQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7XG4gIGVkMjU1MTlfZHNnX3JvdW5kMF9wcm9jZXNzLFxuICBlZDI1NTE5X2RzZ19yb3VuZDFfcHJvY2VzcyxcbiAgZWQyNTUxOV9kc2dfcm91bmQyX3Byb2Nlc3MsXG4gIGVkMjU1MTlfZHNnX3JvdW5kM19wcm9jZXNzLFxufSBmcm9tICdAYml0Z28vd2FzbS1tcHMnO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVkTWVzc2FnZSwgRGVzZXJpYWxpemVkTWVzc2FnZXMsIERzZ1N0YXRlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogRWREU0EgRGlzdHJpYnV0ZWQgU2lnbiBHZW5lcmF0aW9uIChEU0cpIGltcGxlbWVudGF0aW9uIHVzaW5nIEBiaXRnby93YXNtLW1wcy5cbiAqXG4gKiBTdGF0ZSBpcyBleHBsaWNpdDogZWFjaCBXQVNNIHJvdW5kIGZ1bmN0aW9uIHJldHVybnNcbiAqIGB7IG1zZywgc3RhdGUgfWAgYnl0ZXM7IHRoZSBzdGF0ZSBieXRlcyBhcmUgc3RvcmVkIGJldHdlZW4gcm91bmRzIGFuZCBwYXNzZWQgdG8gdGhlXG4gKiBuZXh0IHJvdW5kIGZ1bmN0aW9uICh0aGlzIGlzIHdoYXQgYSBzZXJ2ZXIgd291bGQgcGVyc2lzdCB0byBhIGRhdGFiYXNlIGJldHdlZW4gQVBJXG4gKiByb3VuZHMpLlxuICpcbiAqIFRoZSBwcm90b2NvbCBpcyBoYXJkLWNvZGVkIDItb2YtMzogZWFjaCBzaWduaW5nIHBhcnR5IGNvbW11bmljYXRlcyB3aXRoIGV4YWN0bHkgb25lXG4gKiBjb3VudGVycGFydC4gYGhhbmRsZUluY29taW5nTWVzc2FnZXNgIGFjY2VwdHMgYm90aCBtZXNzYWdlcyAob3duICsgY291bnRlcnBhcnQpLCBhbmRcbiAqIGZpbHRlcnMgb3duIG91dCBpbnRlcm5hbGx5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBkc2cgPSBuZXcgRFNHKDApOyAgLy8gcGFydHlJZHggMFxuICogZHNnLmluaXREc2coa2V5U2hhcmUsIG1lc3NhZ2UsICdtJywgMik7ICAvLyBjb3VudGVycGFydCBpcyBwYXJ0eSAyXG4gKiBjb25zdCBtc2cxID0gZHNnLmdldEZpcnN0TWVzc2FnZSgpO1xuICogY29uc3QgbXNnMiA9IGRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFttc2cxLCBwZWVyTXNnMV0pOyAgLy8gZW1pdHMgU2lnbk1zZzJcbiAqIGNvbnN0IG1zZzMgPSBkc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbbXNnMlswXSwgcGVlck1zZzJdKTsgIC8vIGVtaXRzIFNpZ25Nc2czXG4gKiBkc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbbXNnM1swXSwgcGVlck1zZzNdKTsgIC8vIGNvbXBsZXRlcyBEU0dcbiAqIGNvbnN0IHNpZ25hdHVyZSA9IGRzZy5nZXRTaWduYXR1cmUoKTsgIC8vIDY0LWJ5dGUgRWQyNTUxOSBzaWduYXR1cmVcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRFNHIHtcbiAgcHJvdGVjdGVkIHBhcnR5SWR4OiBudW1iZXI7XG4gIHByb3RlY3RlZCBvdGhlclBhcnR5SWR4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvKiogT3BhcXVlIGJpbmNvZGUtc2VyaWFsaXNlZCBLZXlzaGFyZSBmcm9tIGEgcHJpb3IgREtHICovXG4gIHByaXZhdGUga2V5U2hhcmU6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuICAvKiogUmF3IG1lc3NhZ2UgYnl0ZXMgdG8gc2lnbiAoRWQyNTUxOSBoYXNoZXMgaW50ZXJuYWxseTsgbm8gcHJlaGFzaGluZyByZXF1aXJlZCkgKi9cbiAgcHJpdmF0ZSBtZXNzYWdlOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIEJJUC0zMi1zdHlsZSBkZXJpdmF0aW9uIHBhdGgsIGUuZy4gXCJtXCIgb3IgXCJtLzAvMVwiLiBGb2xkZWQgaW4gdmlhIEtleXNoYXJlOjpkZXJpdmVfd2l0aF9vZmZzZXQgKi9cbiAgcHJpdmF0ZSBkZXJpdmF0aW9uUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFNlcmlhbGlzZWQgcm91bmQgc3RhdGUgYnl0ZXMgcmV0dXJuZWQgYnkgdGhlIHByZXZpb3VzIHJvdW5kIGZ1bmN0aW9uICovXG4gIHByaXZhdGUgZHNnU3RhdGVCeXRlczogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBGaW5hbCA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlLCBhdmFpbGFibGUgYWZ0ZXIgV2FpdE1zZzMgLT4gQ29tcGxldGUgKi9cbiAgcHJpdmF0ZSBzaWduYXR1cmU6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCBkc2dTdGF0ZTogRHNnU3RhdGUgPSBEc2dTdGF0ZS5VbmluaXRpYWxpemVkO1xuXG4gIGNvbnN0cnVjdG9yKHBhcnR5SWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLnBhcnR5SWR4ID0gcGFydHlJZHg7XG4gIH1cblxuICBnZXRTdGF0ZSgpOiBEc2dTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuZHNnU3RhdGU7XG4gIH1cblxuICBnZXRQYXJ0eUlkeCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcnR5SWR4O1xuICB9XG5cbiAgZ2V0T3RoZXJQYXJ0eUlkeCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5vdGhlclBhcnR5SWR4O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpc2VzIHRoZSBEU0cgc2Vzc2lvbi4gVGhlIGtleXNoYXJlIG11c3QgY29tZSBmcm9tIGEgcHJpb3IgREtHIHJ1biwgYW5kXG4gICAqIGBvdGhlclBhcnR5SWR4YCBtdXN0IGJlIHRoZSBzaW5nbGUgY291bnRlcnBhcnQgd2hvIHdpbGwgY28tc2lnbiB3aXRoIHRoaXMgcGFydHkuXG4gICAqXG4gICAqIEBwYXJhbSBrZXlTaGFyZSAtIE9wYXF1ZSBiaW5jb2RlLXNlcmlhbGlzZWQgS2V5c2hhcmUgYnl0ZXMgZnJvbSBgREtHLmdldEtleVNoYXJlKClgLlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFJhdyBtZXNzYWdlIGJ5dGVzIHRvIHNpZ24gKG5vIHByZWhhc2hpbmcpLlxuICAgKiBAcGFyYW0gZGVyaXZhdGlvblBhdGggLSBCSVAtMzItc3R5bGUgZGVyaXZhdGlvbiBwYXRoLiBVc2UgYFwibVwiYCBmb3IgdGhlIHJvb3Qga2V5LlxuICAgKiBAcGFyYW0gb3RoZXJQYXJ0eUlkeCAtIFBhcnR5IGluZGV4IG9mIHRoZSBzaW5nbGUgY291bnRlcnBhcnQgaW4gdGhpcyBzaWduaW5nIHNlc3Npb24uXG4gICAqICAgTXVzdCBkaWZmZXIgZnJvbSB0aGlzIHBhcnR5J3Mgb3duIGBwYXJ0eUlkeGAgYW5kIGJlIGluIGBbMCwgMl1gLlxuICAgKi9cbiAgaW5pdERzZyhrZXlTaGFyZTogQnVmZmVyLCBtZXNzYWdlOiBCdWZmZXIsIGRlcml2YXRpb25QYXRoOiBzdHJpbmcsIG90aGVyUGFydHlJZHg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICgha2V5U2hhcmUgfHwga2V5U2hhcmUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBvciBpbnZhbGlkIGtleVNoYXJlJyk7XG4gICAgfVxuICAgIGlmICghbWVzc2FnZSB8fCBtZXNzYWdlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ01pc3Npbmcgb3IgaW52YWxpZCBtZXNzYWdlJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcnR5SWR4IDwgMCB8fCB0aGlzLnBhcnR5SWR4ID4gMikge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgcGFydHlJZHggJHt0aGlzLnBhcnR5SWR4fTogbXVzdCBiZSBpbiBbMCwgMl1gKTtcbiAgICB9XG4gICAgaWYgKG90aGVyUGFydHlJZHggPCAwIHx8IG90aGVyUGFydHlJZHggPiAyIHx8IG90aGVyUGFydHlJZHggPT09IHRoaXMucGFydHlJZHgpIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIG90aGVyUGFydHlJZHggJHtvdGhlclBhcnR5SWR4fTogbXVzdCBiZSBpbiBbMCwgMl0gYW5kICE9IHBhcnR5SWR4YCk7XG4gICAgfVxuXG4gICAgdGhpcy5rZXlTaGFyZSA9IGtleVNoYXJlO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5kZXJpdmF0aW9uUGF0aCA9IGRlcml2YXRpb25QYXRoO1xuICAgIHRoaXMub3RoZXJQYXJ0eUlkeCA9IG90aGVyUGFydHlJZHg7XG4gICAgdGhpcy5kc2dTdGF0ZSA9IERzZ1N0YXRlLkluaXQ7XG4gIH1cblxuICAvKipcbiAgICogUnVucyByb3VuZCAwIG9mIHRoZSBEU0cgcHJvdG9jb2wuIFJldHVybnMgdGhpcyBwYXJ0eSdzIGJyb2FkY2FzdCBtZXNzYWdlXG4gICAqIChhIGBTaWduTXNnMWAgY29udGFpbmluZyB0aGUgY29tbWl0bWVudCB0byBgUl9pYCkuIFN0b3JlcyB0aGUgcm91bmQgc3RhdGVcbiAgICogYnl0ZXMgaW50ZXJuYWxseSBmb3IgdGhlIG5leHQgcm91bmQuXG4gICAqL1xuICBnZXRGaXJzdE1lc3NhZ2UoKTogRGVzZXJpYWxpemVkTWVzc2FnZSB7XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgIT09IERzZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgYXNzZXJ0KHRoaXMua2V5U2hhcmUsICdrZXlTaGFyZSBtdXN0IGJlIHNldCBhZnRlciBpbml0RHNnJyk7XG4gICAgYXNzZXJ0KHRoaXMuZGVyaXZhdGlvblBhdGggIT09IG51bGwsICdkZXJpdmF0aW9uUGF0aCBtdXN0IGJlIHNldCBhZnRlciBpbml0RHNnJyk7XG4gICAgYXNzZXJ0KHRoaXMubWVzc2FnZSwgJ21lc3NhZ2UgbXVzdCBiZSBzZXQgYWZ0ZXIgaW5pdERzZycpO1xuXG4gICAgbGV0IHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZWQyNTUxOV9kc2dfcm91bmQwX3Byb2Nlc3ModGhpcy5rZXlTaGFyZSwgdGhpcy5kZXJpdmF0aW9uUGF0aCwgdGhpcy5tZXNzYWdlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGZpcnN0IG1lc3NhZ2UgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9OiAke2Vycn1gKTtcbiAgICB9XG5cbiAgICB0aGlzLmRzZ1N0YXRlQnl0ZXMgPSBCdWZmZXIuZnJvbShyZXN1bHQuc3RhdGUpO1xuICAgIHRoaXMuZHNnU3RhdGUgPSBEc2dTdGF0ZS5XYWl0TXNnMTtcbiAgICByZXR1cm4geyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyZXN1bHQubXNnKSwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgaW5jb21pbmcgbWVzc2FnZXMgZm9yIHRoZSBjdXJyZW50IHJvdW5kIGFuZCBhZHZhbmNlcyB0aGUgcHJvdG9jb2wuXG4gICAqXG4gICAqIC0gSW4gYFdhaXRNc2cxYDogcnVucyByb3VuZCAxLCByZXR1cm5zIHRoaXMgcGFydHkncyBgU2lnbk1zZzJgIGJyb2FkY2FzdC5cbiAgICogLSBJbiBgV2FpdE1zZzJgOiBydW5zIHJvdW5kIDIgKHdoaWNoIGludGVybmFsbHkgZnVzZXMgdHdvIFNpbGVuY2UgTGFicyB0cmFuc2l0aW9ucyksXG4gICAqICAgcmV0dXJucyB0aGlzIHBhcnR5J3MgYFNpZ25Nc2czYCBicm9hZGNhc3QgKHBhcnRpYWwgc2lnbmF0dXJlKS5cbiAgICogLSBJbiBgV2FpdE1zZzNgOiBydW5zIHJvdW5kIDMsIGNvbXBsZXRlcyBEU0csIHJldHVybnMgYFtdYC5cbiAgICpcbiAgICogVGhlIGNhbGxlciBwYXNzZXMgYm90aCBtZXNzYWdlcyAob3duICsgY291bnRlcnBhcnQpIGZvciBzeW1tZXRyeSB3aXRoXG4gICAqIGBES0cuaGFuZGxlSW5jb21pbmdNZXNzYWdlc2AuIE93biBtZXNzYWdlIGlzIGZpbHRlcmVkIG91dCBpbnRlcm5hbGx5OyBvbmx5IHRoZVxuICAgKiBjb3VudGVycGFydCdzIHBheWxvYWQgaXMgZm9yd2FyZGVkIHRvIHRoZSBXQVNNIHJvdW5kIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZXNGb3JJdGhSb3VuZCAtIEJvdGggbWVzc2FnZXMgZm9yIHRoaXMgcm91bmQgKG93biArIGNvdW50ZXJwYXJ0KS5cbiAgICovXG4gIGhhbmRsZUluY29taW5nTWVzc2FnZXMobWVzc2FnZXNGb3JJdGhSb3VuZDogRGVzZXJpYWxpemVkTWVzc2FnZXMpOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyB7XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IERzZ1N0YXRlLkNvbXBsZXRlKSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gYWxyZWFkeSBjb21wbGV0ZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IERzZ1N0YXRlLlVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IERzZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAnRFNHIHNlc3Npb24gbXVzdCBjYWxsIGdldEZpcnN0TWVzc2FnZSgpIGJlZm9yZSBoYW5kbGluZyBpbmNvbWluZyBtZXNzYWdlcy4gQ2FsbCBnZXRGaXJzdE1lc3NhZ2UoKSBmaXJzdC4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZXNGb3JJdGhSb3VuZC5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIG51bWJlciBvZiBtZXNzYWdlcyBmb3IgdGhlIHJvdW5kLiBFeHBlY3RlZCAyIG1lc3NhZ2VzIChvd24gKyBjb3VudGVycGFydCkgZm9yIDItb2YtMyBEU0cnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwZWVyTWVzc2FnZXMgPSBtZXNzYWdlc0Zvckl0aFJvdW5kLmZpbHRlcigobSkgPT4gbS5mcm9tICE9PSB0aGlzLnBhcnR5SWR4KTtcbiAgICBpZiAocGVlck1lc3NhZ2VzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEV4cGVjdGVkIGV4YWN0bHkgMSBjb3VudGVycGFydCBtZXNzYWdlOyBnb3QgJHtwZWVyTWVzc2FnZXMubGVuZ3RofWApO1xuICAgIH1cbiAgICBjb25zdCBwZWVyTXNnID0gcGVlck1lc3NhZ2VzWzBdO1xuICAgIGlmIChwZWVyTXNnLmZyb20gIT09IHRoaXMub3RoZXJQYXJ0eUlkeCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFVuZXhwZWN0ZWQgY291bnRlcnBhcnQgcGFydHkgaW5kZXg6IGdvdCAke3BlZXJNc2cuZnJvbX0sIGV4cGVjdGVkICR7dGhpcy5vdGhlclBhcnR5SWR4fWApO1xuICAgIH1cbiAgICBjb25zdCBwZWVyUGF5bG9hZCA9IEJ1ZmZlci5mcm9tKHBlZXJNc2cucGF5bG9hZCk7XG5cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gRHNnU3RhdGUuV2FpdE1zZzEpIHtcbiAgICAgIGFzc2VydCh0aGlzLmRzZ1N0YXRlQnl0ZXMsICdkc2dTdGF0ZUJ5dGVzIG11c3QgYmUgc2V0IGluIFdhaXRNc2cxJyk7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZWQyNTUxOV9kc2dfcm91bmQxX3Byb2Nlc3MocGVlclBheWxvYWQsIHRoaXMuZHNnU3RhdGVCeXRlcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5kc2dTdGF0ZX06ICR7ZXJyfWApO1xuICAgICAgfVxuICAgICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20ocmVzdWx0LnN0YXRlKTtcbiAgICAgIHRoaXMuZHNnU3RhdGUgPSBEc2dTdGF0ZS5XYWl0TXNnMjtcbiAgICAgIHJldHVybiBbeyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyZXN1bHQubXNnKSwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gRHNnU3RhdGUuV2FpdE1zZzIpIHtcbiAgICAgIGFzc2VydCh0aGlzLmRzZ1N0YXRlQnl0ZXMsICdkc2dTdGF0ZUJ5dGVzIG11c3QgYmUgc2V0IGluIFdhaXRNc2cyJyk7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZWQyNTUxOV9kc2dfcm91bmQyX3Byb2Nlc3MocGVlclBheWxvYWQsIHRoaXMuZHNnU3RhdGVCeXRlcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5kc2dTdGF0ZX06ICR7ZXJyfWApO1xuICAgICAgfVxuICAgICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20ocmVzdWx0LnN0YXRlKTtcbiAgICAgIHRoaXMuZHNnU3RhdGUgPSBEc2dTdGF0ZS5XYWl0TXNnMztcbiAgICAgIHJldHVybiBbeyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyZXN1bHQubXNnKSwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gRHNnU3RhdGUuV2FpdE1zZzMpIHtcbiAgICAgIGFzc2VydCh0aGlzLmRzZ1N0YXRlQnl0ZXMsICdkc2dTdGF0ZUJ5dGVzIG11c3QgYmUgc2V0IGluIFdhaXRNc2czJyk7XG4gICAgICBsZXQgc2lnQnl0ZXM7XG4gICAgICB0cnkge1xuICAgICAgICBzaWdCeXRlcyA9IGVkMjU1MTlfZHNnX3JvdW5kM19wcm9jZXNzKHBlZXJQYXlsb2FkLCB0aGlzLmRzZ1N0YXRlQnl0ZXMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgbWVzc2FnZXMgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9LCByb3VuZCAke3RoaXMuZHNnU3RhdGV9OiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2lnbmF0dXJlID0gQnVmZmVyLmZyb20oc2lnQnl0ZXMpO1xuICAgICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gbnVsbDtcbiAgICAgIHRoaXMuZHNnU3RhdGUgPSBEc2dTdGF0ZS5Db21wbGV0ZTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB0aHJvdyBFcnJvcignVW5leHBlY3RlZCBEU0cgc3RhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaW5hbCA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlIHByb2R1Y2VkIGJ5IHJvdW5kIDMuXG4gICAqIE9ubHkgYXZhaWxhYmxlIG9uY2UgdGhlIHByb3RvY29sIHJlYWNoZXMgYENvbXBsZXRlYC5cbiAgICovXG4gIGdldFNpZ25hdHVyZSgpOiBCdWZmZXIge1xuICAgIGlmICghdGhpcy5zaWduYXR1cmUpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBoYXMgbm90IHByb2R1Y2VkIGEgc2lnbmF0dXJlIHlldCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaWduYXR1cmU7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0cyB0aGUgY3VycmVudCBzZXNzaW9uIHN0YXRlIGFzIGEgSlNPTiBzdHJpbmcgZm9yIHBlcnNpc3RlbmNlLlxuICAgKiBJbmNsdWRlcyB0aGUgb3BhcXVlIHJvdW5kIHN0YXRlIGJ5dGVzIHBsdXMgZXZlcnl0aGluZyBuZWVkZWQgdG8gcmUtZW50ZXIgdGhlXG4gICAqIHByb3RvY29sIGFmdGVyIGEgcmVzdGFydCAoa2V5c2hhcmUsIG1lc3NhZ2UsIGRlcml2YXRpb24gcGF0aCwgY291bnRlcnBhcnQpLlxuICAgKi9cbiAgZ2V0U2Vzc2lvbigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBEc2dTdGF0ZS5Db21wbGV0ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RTRyBzZXNzaW9uIGlzIGNvbXBsZXRlLiBFeHBvcnRpbmcgdGhlIHNlc3Npb24gaXMgbm90IGFsbG93ZWQuJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBEc2dTdGF0ZS5VbmluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBEc2dTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gbXVzdCBwcm9kdWNlIGl0cyBmaXJzdCBtZXNzYWdlIGJlZm9yZSBleHBvcnRpbmcuJyk7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBkc2dTdGF0ZUJ5dGVzOiB0aGlzLmRzZ1N0YXRlQnl0ZXM/LnRvU3RyaW5nKCdiYXNlNjQnKSA/PyBudWxsLFxuICAgICAgZHNnUm91bmQ6IHRoaXMuZHNnU3RhdGUsXG4gICAgICBrZXlTaGFyZTogdGhpcy5rZXlTaGFyZT8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2U/LnRvU3RyaW5nKCdiYXNlNjQnKSA/PyBudWxsLFxuICAgICAgZGVyaXZhdGlvblBhdGg6IHRoaXMuZGVyaXZhdGlvblBhdGgsXG4gICAgICBwYXJ0eUlkeDogdGhpcy5wYXJ0eUlkeCxcbiAgICAgIG90aGVyUGFydHlJZHg6IHRoaXMub3RoZXJQYXJ0eUlkeCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlcyBhIHByZXZpb3VzbHkgZXhwb3J0ZWQgc2Vzc2lvbi4gQWxsb3dzIHRoZSBwcm90b2NvbCB0byBjb250aW51ZSBmcm9tXG4gICAqIHdoZXJlIGl0IGxlZnQgb2ZmLCBhcyBpZiB0aGUgcm91bmQgc3RhdGUgd2FzIGxvYWRlZCBmcm9tIGEgZGF0YWJhc2UuXG4gICAqL1xuICByZXN0b3JlU2Vzc2lvbihzZXNzaW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShzZXNzaW9uKTtcbiAgICBpZiAoIU9iamVjdC52YWx1ZXMoRHNnU3RhdGUpLmluY2x1ZGVzKGRhdGEuZHNnUm91bmQpKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBkc2dSb3VuZCBpbiBzZXNzaW9uOiAke2RhdGEuZHNnUm91bmR9YCk7XG4gICAgfVxuICAgIGlmIChkYXRhLmRzZ1JvdW5kID09PSBEc2dTdGF0ZS5VbmluaXRpYWxpemVkIHx8IGRhdGEuZHNnUm91bmQgPT09IERzZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKGBDYW5ub3QgcmVzdG9yZSBEU0cgc2Vzc2lvbiBpbiBzdGF0ZSAke2RhdGEuZHNnUm91bmR9YCk7XG4gICAgfVxuICAgIGlmIChkYXRhLmRzZ1JvdW5kID09PSBEc2dTdGF0ZS5Db21wbGV0ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RTRyBzZXNzaW9uIGlzIGNvbXBsZXRlLiBSZXN0b3JpbmcgdGhlIHNlc3Npb24gaXMgbm90IGFsbG93ZWQuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YS5wYXJ0eUlkeCAhPT0gJ251bWJlcicgfHwgZGF0YS5wYXJ0eUlkeCA8IDAgfHwgZGF0YS5wYXJ0eUlkeCA+IDIpIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIHBhcnR5SWR4IGluIHNlc3Npb246ICR7ZGF0YS5wYXJ0eUlkeH1gKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGEub3RoZXJQYXJ0eUlkeCAhPT0gJ251bWJlcicgfHxcbiAgICAgIGRhdGEub3RoZXJQYXJ0eUlkeCA8IDAgfHxcbiAgICAgIGRhdGEub3RoZXJQYXJ0eUlkeCA+IDIgfHxcbiAgICAgIGRhdGEub3RoZXJQYXJ0eUlkeCA9PT0gZGF0YS5wYXJ0eUlkeFxuICAgICkge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgb3RoZXJQYXJ0eUlkeCBpbiBzZXNzaW9uOiAke2RhdGEub3RoZXJQYXJ0eUlkeH1gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFydHlJZHggIT09IGRhdGEucGFydHlJZHgpIHtcbiAgICAgIHRocm93IEVycm9yKGBTZXNzaW9uIHBhcnR5SWR4ICR7ZGF0YS5wYXJ0eUlkeH0gZG9lcyBub3QgbWF0Y2ggaW5zdGFuY2UgJHt0aGlzLnBhcnR5SWR4fWApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEuZHNnU3RhdGVCeXRlcyAhPT0gJ3N0cmluZycgfHwgZGF0YS5kc2dTdGF0ZUJ5dGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFJvdW5kICR7ZGF0YS5kc2dSb3VuZH0gcmVxdWlyZXMgZHNnU3RhdGVCeXRlc2ApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEua2V5U2hhcmUgIT09ICdzdHJpbmcnIHx8IGRhdGEua2V5U2hhcmUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignUmVzdG9yZWQgc2Vzc2lvbiBtaXNzaW5nIGtleVNoYXJlJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YS5tZXNzYWdlICE9PSAnc3RyaW5nJyB8fCBkYXRhLm1lc3NhZ2UubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignUmVzdG9yZWQgc2Vzc2lvbiBtaXNzaW5nIG1lc3NhZ2UnKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhLmRlcml2YXRpb25QYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBkZXJpdmF0aW9uUGF0aCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGRzZ1N0YXRlQnl0ZXMgPSBCdWZmZXIuZnJvbShkYXRhLmRzZ1N0YXRlQnl0ZXMsICdiYXNlNjQnKTtcbiAgICBjb25zdCBrZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKGRhdGEua2V5U2hhcmUsICdiYXNlNjQnKTtcbiAgICBjb25zdCBtZXNzYWdlID0gQnVmZmVyLmZyb20oZGF0YS5tZXNzYWdlLCAnYmFzZTY0Jyk7XG4gICAgaWYgKGRzZ1N0YXRlQnl0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcihgUm91bmQgJHtkYXRhLmRzZ1JvdW5kfSByZXF1aXJlcyBkc2dTdGF0ZUJ5dGVzYCk7XG4gICAgfVxuICAgIGlmIChrZXlTaGFyZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdSZXN0b3JlZCBzZXNzaW9uIG1pc3Npbmcga2V5U2hhcmUnKTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2UubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignUmVzdG9yZWQgc2Vzc2lvbiBtaXNzaW5nIG1lc3NhZ2UnKTtcbiAgICB9XG5cbiAgICB0aGlzLmRzZ1N0YXRlQnl0ZXMgPSBkc2dTdGF0ZUJ5dGVzO1xuICAgIHRoaXMuZHNnU3RhdGUgPSBkYXRhLmRzZ1JvdW5kO1xuICAgIHRoaXMua2V5U2hhcmUgPSBrZXlTaGFyZTtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuZGVyaXZhdGlvblBhdGggPSBkYXRhLmRlcml2YXRpb25QYXRoO1xuICAgIHRoaXMucGFydHlJZHggPSBkYXRhLnBhcnR5SWR4O1xuICAgIHRoaXMub3RoZXJQYXJ0eUlkeCA9IGRhdGEub3RoZXJQYXJ0eUlkeDtcbiAgfVxufVxuIl19
@@ -1,4 +1,5 @@
1
1
  export * as EddsaMPSDkg from './dkg';
2
+ export * as EddsaMPSDsg from './dsg';
2
3
  export * as MPSUtil from './util';
3
4
  export * as MPSTypes from './types';
4
5
  export * as MPSComms from './commsLayer';
@@ -1 +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,OAAO,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,QAAQ,MAAM,SAAS,CAAC;AACpC,OAAO,KAAK,QAAQ,MAAM,cAAc,CAAC"}
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"}