@bitgo-beta/sdk-lib-mpc 8.2.0-beta.2032 → 8.2.0-beta.2034
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/tss/dkls-vrf/dkg.js +1 -1
- package/dist/src/tss/eddsa-mps-vrf/dkg.d.ts +65 -0
- package/dist/src/tss/eddsa-mps-vrf/dkg.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps-vrf/dkg.js +246 -0
- package/dist/src/tss/eddsa-mps-vrf/index.d.ts +4 -0
- package/dist/src/tss/eddsa-mps-vrf/index.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps-vrf/index.js +40 -0
- package/dist/src/tss/eddsa-mps-vrf/types.d.ts +31 -0
- package/dist/src/tss/eddsa-mps-vrf/types.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps-vrf/types.js +97 -0
- package/dist/src/tss/eddsa-mps-vrf/util.d.ts +9 -0
- package/dist/src/tss/eddsa-mps-vrf/util.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps-vrf/util.js +36 -0
- package/dist/src/tss/index.d.ts +1 -0
- package/dist/src/tss/index.d.ts.map +1 -1
- package/dist/src/tss/index.js +2 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -275,4 +275,4 @@ class VrfDkg {
|
|
|
275
275
|
}
|
|
276
276
|
}
|
|
277
277
|
exports.VrfDkg = VrfDkg;
|
|
278
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGtnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9ka2xzLXZyZi9ka2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTUEsbUNBQWdDO0FBQ2hDLG1DQUFnQztBQUVoQyxtQ0FBeUQ7QUFZekQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBYSxNQUFNO0lBZWpCLFlBQVksQ0FBUyxFQUFFLENBQVMsRUFBRSxRQUFnQixFQUFFLElBQWEsRUFBRSxPQUEwQjtRQUhuRixhQUFRLEdBQWdCLG1CQUFXLENBQUMsYUFBYSxDQUFDO1FBSTFELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxJQUFJLENBQUM7SUFDakMsQ0FBQztJQUVPLEtBQUssQ0FBQyxXQUFXO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyx3REFBYSw0Q0FBNEMsR0FBQyxDQUFDO1FBQzVFLENBQUM7SUFDSCxDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLGdC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QUcsV0FBVyxDQUFDLGVBQWUsQ0FBQztRQUNyRCxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekIsTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0IsSUFBSSxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDN0IsTUFBTSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDO1FBQ2pELENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0Y7QUEvUEQsd0JBK1BDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBNZXNzYWdlIGFzIFZyZldhc21NZXNzYWdlLFxuICBWcmZLZXlnZW5TZXNzaW9uLFxuICBWcmZLZXlzaGFyZSBhcyBEa2xzVnJmS2V5c2hhcmUsXG59IGZyb20gJ0BzaWxlbmNlbGFib3JhdG9yaWVzL2RrbHMtd2FzbS1sbC12cmYtbm9kZSc7XG5pbXBvcnQgdHlwZSB7IFZyZktleWdlblNlc3Npb24gYXMgVnJmV2ViS2V5Z2VuU2Vzc2lvbiB9IGZyb20gJ0BzaWxlbmNlbGFib3JhdG9yaWVzL2RrbHMtd2FzbS1sbC12cmYtd2ViJztcbmltcG9ydCB7IGRlY29kZSB9IGZyb20gJ2Nib3IteCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVkTWVzc2FnZXMgfSBmcm9tICcuLi9lY2RzYS1ka2xzL3R5cGVzJztcbmltcG9ydCB7IFZyZkRrZ1Nlc3Npb25EYXRhLCBWcmZEa2dTdGF0ZSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vLyBQbGF0Zm9ybS1zcGVjaWZpYyBtb2R1bGVzIHRoYXQgZG8gbm90IGV4aXN0IGV2ZXJ5d2hlcmU6IHRoZSBub2RlL3dlYi9idW5kbGVyIHdhc21cbi8vIHZhcmlhbnRzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgYW5kIHNlbGVjdGVkIGF0IHJ1bnRpbWUgKG5vZGUgcHJvY2VzcyB2cyBicm93c2VyIHZzXG4vLyBidW5kbGVyKS4gU3RhdGljIGltcG9ydHMgd291bGQgbG9hZCB0aGUgd3JvbmcgcGxhdGZvcm0ncyB3YXNtIGJpbmRpbmcsIHNvIGJvdGggdGhlXG4vLyB0eXBlIGFsaWFzZXMgYmVsb3cgYW5kIHRoZSBsYXp5IGBhd2FpdCBpbXBvcnQoKWAgY2FsbHMgYXJlIGRlbGliZXJhdGUuXG50eXBlIE5vZGVWcmZXYXNtZXIgPSB0eXBlb2YgaW1wb3J0KCdAc2lsZW5jZWxhYm9yYXRvcmllcy9ka2xzLXdhc20tbGwtdnJmLW5vZGUnKTtcbnR5cGUgV2ViVnJmV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQHNpbGVuY2VsYWJvcmF0b3JpZXMvZGtscy13YXNtLWxsLXZyZi13ZWInKTtcbnR5cGUgQnVuZGxlclZyZldhc21lciA9IHR5cGVvZiBpbXBvcnQoJ0BzaWxlbmNlbGFib3JhdG9yaWVzL2RrbHMtd2FzbS1sbC12cmYtYnVuZGxlcicpO1xuXG50eXBlIFZyZldhc20gPSBOb2RlVnJmV2FzbWVyIHwgV2ViVnJmV2FzbWVyIHwgQnVuZGxlclZyZldhc21lcjtcblxuLyoqXG4gKiBSb3VuZCBkcml2ZXIgZm9yIHRoZSBES0xTIFZSRiBES0csIHdoaWNoIHByb2R1Y2VzIGEgUmlzdHJldHRvIFZSRiBrZXlzaGFyZS5cbiAqXG4gKiBUd28gcm91bmRzLCBhbGwgYnJvYWRjYXN0OiByb3VuZCAxIGV4Y2hhbmdlcyBjb21taXRtZW50cyAoVnJmS2V5Z2VuTXNnMSksIHJvdW5kIDJcbiAqIGV4Y2hhbmdlcyBvcGVuaW5ncyAoVnJmS2V5Z2VuTXNnMiwgZW1pdHRlZCBwZXIgcmVjaXBpZW50KSBhbmQgdGhlIERLRyBmaW5hbGl6ZXNcbiAqIGxvY2FsbHkuIFRoZXJlIGlzIG5vIGNoYWluLWNvZGUgY29tbWl0bWVudCBzdGVwLCB1bmxpa2UgdGhlIHNpZ25pbmcgREtHLlxuICpcbiAqIENhbGxlcnMgcGFzcyBldmVyeSBtZXNzYWdlIHRoZXkgaG9sZDsgdGhpcyBjbGFzcyByb3V0ZXMgdGhlbSBpbnRlcm5hbGx5LiBSb3VuZCAxXG4gKiBtdXN0IGV4Y2x1ZGUgdGhlIHBhcnR5J3Mgb3duIGNvbW1pdG1lbnQgKHRoZSB3YXNtIHJlamVjdHMgYSBzZW5kZXIgc2V0IGNvbnRhaW5pbmdcbiAqIGl0KSBhbmQgcm91bmQgMiBjb25zdW1lcyB0aGUgb3BlbmluZ3MgYWRkcmVzc2VkIHRvIHRoaXMgcGFydHksIG93biBpbmNsdWRlZC5cbiAqXG4gKiBQYXJ0eSBpbmRpY2VzIGZvbGxvdyB0aGUgTVBDdjIgY29udmVudGlvbjogMCA9IHVzZXIsIDEgPSBiYWNrdXAsIDIgPSBiaXRnby5cbiAqL1xuZXhwb3J0IGNsYXNzIFZyZkRrZyB7XG4gIHByb3RlY3RlZCB2cmZTZXNzaW9uOiBWcmZLZXlnZW5TZXNzaW9uIHwgVnJmV2ViS2V5Z2VuU2Vzc2lvbiB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHZyZlNlc3Npb25CeXRlczogVWludDhBcnJheTtcbiAgcHJvdGVjdGVkIHZyZktleVNoYXJlOiBEa2xzVnJmS2V5c2hhcmUgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBrZXlTaGFyZUJ1ZmY6IEJ1ZmZlciB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHB1YmxpY0tleTogQnVmZmVyIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQga2V5SWQ6IEJ1ZmZlciB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHJvb3RDaGFpbkNvZGU6IEJ1ZmZlciB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIG46IG51bWJlcjtcbiAgcHJvdGVjdGVkIHQ6IG51bWJlcjtcbiAgcHJvdGVjdGVkIHBhcnR5SWR4OiBudW1iZXI7XG4gIHByb3RlY3RlZCBzZWVkOiBCdWZmZXIgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCB2cmZTdGF0ZTogVnJmRGtnU3RhdGUgPSBWcmZEa2dTdGF0ZS5VbmluaXRpYWxpemVkO1xuICBwcm90ZWN0ZWQgdnJmV2FzbTogVnJmV2FzbSB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IobjogbnVtYmVyLCB0OiBudW1iZXIsIHBhcnR5SWR4OiBudW1iZXIsIHNlZWQ/OiBCdWZmZXIsIHZyZldhc20/OiBCdW5kbGVyVnJmV2FzbWVyKSB7XG4gICAgdGhpcy5uID0gbjtcbiAgICB0aGlzLnQgPSB0O1xuICAgIHRoaXMucGFydHlJZHggPSBwYXJ0eUlkeDtcbiAgICB0aGlzLnNlZWQgPSBzZWVkO1xuICAgIHRoaXMudnJmV2FzbSA9IHZyZldhc20gPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFZyZldhc20oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnZyZldhc20pIHtcbiAgICAgIHRoaXMudnJmV2FzbSA9IGF3YWl0IGltcG9ydCgnQHNpbGVuY2VsYWJvcmF0b3JpZXMvZGtscy13YXNtLWxsLXZyZi1ub2RlJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRWcmZXYXNtKCkge1xuICAgIGlmICghdGhpcy52cmZXYXNtKSB7XG4gICAgICB0aHJvdyBFcnJvcignVlJGIHdhc20gbm90IGxvYWRlZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52cmZXYXNtO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzdG9yZVNlc3Npb24oKSB7XG4gICAgaWYgKCF0aGlzLnZyZlNlc3Npb24pIHtcbiAgICAgIHRoaXMudnJmU2Vzc2lvbiA9IHRoaXMuZ2V0VnJmV2FzbSgpLlZyZktleWdlblNlc3Npb24uZnJvbUJ5dGVzKHRoaXMudnJmU2Vzc2lvbkJ5dGVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmUtZGVyaXZlIHRoZSByb3VuZCBzdGF0ZSBmcm9tIHRoZSB3YXNtIHNlc3Npb24gYnl0ZXMgaW5zdGVhZCBvZiB0cnVzdGluZyBhXG4gICAqIGNhbGxlci1zdXBwbGllZCBlbnVtLiBUaGUgd2FzbSBlbWJlZHMgYSByb3VuZCB0YWcgZm9yIGV4YWN0bHkgdGhpcyByZWFzb247IHRoaXNcbiAgICogaXMgd2hhdCBsZXRzIGEgc3RhdGVsZXNzIHNlcnZlciByZXN1bWUgbWlkLXByb3RvY29sLlxuICAgKi9cbiAgcHJpdmF0ZSBfZGVzZXJpYWxpemVTdGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMudnJmU2Vzc2lvbikge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Nlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHJvdW5kID0gZGVjb2RlKHRoaXMudnJmU2Vzc2lvbi50b0J5dGVzKCkpLnJvdW5kO1xuICAgIGlmIChyb3VuZCA9PT0gJ0luaXQnKSB7XG4gICAgICB0aGlzLnZyZlN0YXRlID0gVnJmRGtnU3RhdGUuVW5pbml0aWFsaXplZDtcbiAgICB9IGVsc2UgaWYgKHJvdW5kID09PSAnV2FpdE1zZzEnKSB7XG4gICAgICB0aGlzLnZyZlN0YXRlID0gVnJmRGtnU3RhdGUuUm91bmQxO1xuICAgIH0gZWxzZSBpZiAocm91bmQgPT09ICdXYWl0TXNnMicpIHtcbiAgICAgIHRoaXMudnJmU3RhdGUgPSBWcmZEa2dTdGF0ZS5Sb3VuZDI7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygcm91bmQgPT09ICdvYmplY3QnICYmIHJvdW5kICE9PSBudWxsICYmICdTaGFyZScgaW4gcm91bmQpIHtcbiAgICAgIHRoaXMudnJmU3RhdGUgPSBWcmZEa2dTdGF0ZS5Db21wbGV0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52cmZTdGF0ZSA9IFZyZkRrZ1N0YXRlLkludmFsaWRTdGF0ZTtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIFN0YXRlOiAke0pTT04uc3RyaW5naWZ5KHJvdW5kKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoaXMgcGFydHkncyBWUkYgREtHIGNvbW1pdG1lbnQgKFZyZktleWdlbk1zZzEsIGJyb2FkY2FzdCkuXG4gICAqL1xuICBhc3luYyBpbml0RGtnKCk6IFByb21pc2U8RGVzZXJpYWxpemVkTWVzc2FnZXM+IHtcbiAgICBpZiAoIXRoaXMudnJmV2FzbSkge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkVnJmV2FzbSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ID4gdGhpcy5uIHx8IHRoaXMucGFydHlJZHggPj0gdGhpcy5uKSB7XG4gICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBwYXJhbWV0ZXJzIGZvciBWUkYgREtHJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnZyZlN0YXRlICE9IFZyZkRrZ1N0YXRlLlVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdWUkYgREtHIHNlc3Npb24gYWxyZWFkeSBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgLyogY2hlY2tzIGZvciBlbGVjdHJvbiBwcm9jZXNzZXMgKi9cbiAgICAgICF3aW5kb3cucHJvY2VzcyAmJlxuICAgICAgIXdpbmRvdy5wcm9jZXNzPy5bJ3R5cGUnXVxuICAgICkge1xuICAgICAgLyogVGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgYnJvd3NlcnMvd2ViIGJlY2F1c2UgaXQgdXNlcyBmZXRjaCB0byByZXNvbHZlIHRoZSB3YXNtIGFzc2V0IGZvciB0aGUgd2ViICovXG4gICAgICBjb25zdCBpbml0VnJmID0gYXdhaXQgaW1wb3J0KCdAc2lsZW5jZWxhYm9yYXRvcmllcy9ka2xzLXdhc20tbGwtdnJmLXdlYicpO1xuICAgICAgYXdhaXQgaW5pdFZyZi5kZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlZWQgJiYgdGhpcy5zZWVkLmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IEVycm9yKGBTZWVkIHNob3VsZCBiZSAzMiBieXRlcywgZ290ICR7dGhpcy5zZWVkLmxlbmd0aH0uYCk7XG4gICAgfVxuICAgIGNvbnN0IHsgVnJmS2V5Z2VuU2Vzc2lvbiB9ID0gdGhpcy5nZXRWcmZXYXNtKCk7XG4gICAgdGhpcy52cmZTZXNzaW9uID0gdGhpcy5zZWVkXG4gICAgICA/IG5ldyBWcmZLZXlnZW5TZXNzaW9uKHRoaXMubiwgdGhpcy50LCB0aGlzLnBhcnR5SWR4LCBuZXcgVWludDhBcnJheSh0aGlzLnNlZWQpKVxuICAgICAgOiBuZXcgVnJmS2V5Z2VuU2Vzc2lvbih0aGlzLm4sIHRoaXMudCwgdGhpcy5wYXJ0eUlkeCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnZyZlNlc3Npb24uY3JlYXRlRmlyc3RNZXNzYWdlKCk7XG4gICAgICAvLyBDb3B5IHRoZSBwYXlsb2FkIG91dCBiZWZvcmUgZnJlZWluZyB0aGUgd2FzbSBtZXNzYWdlIG9iamVjdC5cbiAgICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgVWludDhBcnJheShtZXNzYWdlLnBheWxvYWQpO1xuICAgICAgbWVzc2FnZS5mcmVlKCk7XG4gICAgICB0aGlzLnZyZlNlc3Npb25CeXRlcyA9IHRoaXMudnJmU2Vzc2lvbi50b0J5dGVzKCk7XG4gICAgICB0aGlzLl9kZXNlcmlhbGl6ZVN0YXRlKCk7XG4gICAgICByZXR1cm4geyBicm9hZGNhc3RNZXNzYWdlczogW3sgcGF5bG9hZCwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9XSwgcDJwTWVzc2FnZXM6IFtdIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBmaXJzdCBWUkYgbWVzc2FnZSBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH06ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyB0aGUgbWVzc2FnZXMgdGhpcyBwYXJ0eSBob2xkcyBmb3IgdGhlIGN1cnJlbnQgcm91bmQgYW5kIHJldHVybiB0aGlzXG4gICAqIHBhcnR5J3MgbWVzc2FnZXMgZm9yIHRoZSBuZXh0IHJvdW5kLiBDYWxsZXJzIHBhc3MgZXZlcnl0aGluZyB0aGV5IGhvbGQ7IHRoZVxuICAgKiByb3VuZCByb3V0aW5nIGhhcHBlbnMgaGVyZTpcbiAgICpcbiAgICogLSBSb3VuZCAxIChXYWl0TXNnMSk6IGNvbnN1bWVzIHRoZSBvdGhlciBwYXJ0aWVzJyBjb21taXRtZW50cyAob3duIGV4Y2x1ZGVkIOKAlFxuICAgKiAgIHRoZSB3YXNtIHJlamVjdHMgYSBzZW5kZXIgc2V0IGNvbnRhaW5pbmcgdGhlIHBhcnR5J3Mgb3duIE1zZzEpIGFuZCBlbWl0cyB0aGlzXG4gICAqICAgcGFydHkncyBvcGVuaW5ncyAoVnJmS2V5Z2VuTXNnMiksIG9uZSBicm9hZGNhc3QgbWVzc2FnZSBwZXIgcmVjaXBpZW50LlxuICAgKiAtIFJvdW5kIDIgKFdhaXRNc2cyKTogY29uc3VtZXMgdGhlIG9wZW5pbmdzIGFkZHJlc3NlZCB0byB0aGlzIHBhcnR5IChvd25cbiAgICogICBzZWxmLWFkZHJlc3NlZCBvcGVuaW5nIGluY2x1ZGVkKSBhbmQgZmluYWxpemVzIHRoZSBES0csIHJldHVybmluZyBubyBtZXNzYWdlcy5cbiAgICovXG4gIGFzeW5jIGhhbmRsZUluY29taW5nTWVzc2FnZXMobWVzc2FnZXNGb3JJdGhSb3VuZDogRGVzZXJpYWxpemVkTWVzc2FnZXMpOiBQcm9taXNlPERlc2VyaWFsaXplZE1lc3NhZ2VzPiB7XG4gICAgdGhpcy5fcmVzdG9yZVNlc3Npb24oKTtcbiAgICBpZiAoIXRoaXMudnJmU2Vzc2lvbikge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Nlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHsgTWVzc2FnZTogVnJmTWVzc2FnZSB9ID0gdGhpcy5nZXRWcmZXYXNtKCk7XG4gICAgbGV0IG5leHRSb3VuZE1lc3NhZ2VzOiBWcmZXYXNtTWVzc2FnZVtdID0gW107XG4gICAgY29uc3QgbmV4dFJvdW5kRGVzZXJpYWxpemVkTWVzc2FnZXM6IERlc2VyaWFsaXplZE1lc3NhZ2VzID0geyBicm9hZGNhc3RNZXNzYWdlczogW10sIHAycE1lc3NhZ2VzOiBbXSB9O1xuICAgIHRyeSB7XG4gICAgICBzd2l0Y2ggKHRoaXMudnJmU3RhdGUpIHtcbiAgICAgICAgY2FzZSBWcmZEa2dTdGF0ZS5Sb3VuZDE6IHtcbiAgICAgICAgICBjb25zdCBvdGhlcnNDb21taXRtZW50cyA9IG1lc3NhZ2VzRm9ySXRoUm91bmQuYnJvYWRjYXN0TWVzc2FnZXMuZmlsdGVyKChtKSA9PiBtLmZyb20gIT09IHRoaXMucGFydHlJZHgpO1xuICAgICAgICAgIG5leHRSb3VuZE1lc3NhZ2VzID0gdGhpcy52cmZTZXNzaW9uLmhhbmRsZU1lc3NhZ2VzKFxuICAgICAgICAgICAgb3RoZXJzQ29tbWl0bWVudHMubWFwKChtKSA9PiBuZXcgVnJmTWVzc2FnZShtLnBheWxvYWQsIG0uZnJvbSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9kZXNlcmlhbGl6ZVN0YXRlKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBWcmZEa2dTdGF0ZS5Sb3VuZDI6IHtcbiAgICAgICAgICBjb25zdCBvcGVuaW5nc0Zvck1lID0gbWVzc2FnZXNGb3JJdGhSb3VuZC5wMnBNZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0udG8gPT09IHRoaXMucGFydHlJZHgpO1xuICAgICAgICAgIG5leHRSb3VuZE1lc3NhZ2VzID0gdGhpcy52cmZTZXNzaW9uLmhhbmRsZU1lc3NhZ2VzKFxuICAgICAgICAgICAgb3BlbmluZ3NGb3JNZS5tYXAoKG0pID0+IG5ldyBWcmZNZXNzYWdlKG0ucGF5bG9hZCwgbS5mcm9tLCBtLnRvKSlcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIHZyZktleXNoYXJlKCkgY29uc3VtZXMgKGFuZCBkZWFsbG9jYXRlcykgdGhlIHNlc3Npb24gaW4gYWxsIGNhc2VzLlxuICAgICAgICAgIGNvbnN0IHZyZktleVNoYXJlID0gdGhpcy52cmZTZXNzaW9uLnZyZktleXNoYXJlKCk7XG4gICAgICAgICAgdGhpcy52cmZLZXlTaGFyZSA9IHZyZktleVNoYXJlO1xuICAgICAgICAgIHRoaXMua2V5U2hhcmVCdWZmID0gQnVmZmVyLmZyb20odnJmS2V5U2hhcmUudG9CeXRlcygpKTtcbiAgICAgICAgICB0aGlzLnB1YmxpY0tleSA9IEJ1ZmZlci5mcm9tKHZyZktleVNoYXJlLnB1YmxpY0tleSk7XG4gICAgICAgICAgdGhpcy5rZXlJZCA9IEJ1ZmZlci5mcm9tKHZyZktleVNoYXJlLmtleUlkKTtcbiAgICAgICAgICB0aGlzLnJvb3RDaGFpbkNvZGUgPSBCdWZmZXIuZnJvbSh2cmZLZXlTaGFyZS5yb290Q2hhaW5Db2RlKTtcbiAgICAgICAgICB2cmZLZXlTaGFyZS5mcmVlKCk7XG4gICAgICAgICAgdGhpcy52cmZTdGF0ZSA9IFZyZkRrZ1N0YXRlLkNvbXBsZXRlO1xuICAgICAgICAgIHJldHVybiBuZXh0Um91bmREZXNlcmlhbGl6ZWRNZXNzYWdlcztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIFZSRiBES0cgc3RhdGU6ICR7dGhpcy52cmZTdGF0ZX1gKTtcbiAgICAgIH1cblxuICAgICAgbmV4dFJvdW5kRGVzZXJpYWxpemVkTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMgPSBuZXh0Um91bmRNZXNzYWdlc1xuICAgICAgICAuZmlsdGVyKChtKSA9PiBtLnRvX2lkID09PSB1bmRlZmluZWQpXG4gICAgICAgIC5tYXAoKG0pID0+ICh7IHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KG0ucGF5bG9hZCksIGZyb206IG0uZnJvbV9pZCB9KSk7XG4gICAgICBuZXh0Um91bmREZXNlcmlhbGl6ZWRNZXNzYWdlcy5wMnBNZXNzYWdlcyA9IG5leHRSb3VuZE1lc3NhZ2VzXG4gICAgICAgIC5maWx0ZXIoKG0pID0+IG0udG9faWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgLm1hcCgobSkgPT4gKHsgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkobS5wYXlsb2FkKSwgZnJvbTogbS5mcm9tX2lkLCB0bzogbS50b19pZCEgfSkpO1xuICAgICAgcmV0dXJuIG5leHRSb3VuZERlc2VyaWFsaXplZE1lc3NhZ2VzO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBWUkYgbWVzc2FnZXMgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9LCBzdGF0ZSAke3RoaXMudnJmU3RhdGV9OiAke2V9YCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG5leHRSb3VuZE1lc3NhZ2VzLmZvckVhY2goKG0pID0+IG0uZnJlZSgpKTtcbiAgICAgIGlmICh0aGlzLnZyZlN0YXRlICE9PSBWcmZEa2dTdGF0ZS5Db21wbGV0ZSkge1xuICAgICAgICB0aGlzLnZyZlNlc3Npb25CeXRlcyA9IHRoaXMudnJmU2Vzc2lvbi50b0J5dGVzKCk7XG4gICAgICAgIHRoaXMudnJmU2Vzc2lvbiA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBWUkYga2V5c2hhcmUgYnl0ZXMgKENCT1IgVnJmS2V5c2hhcmUpIG9uY2UgdGhlIERLRyBpcyBjb21wbGV0ZS5cbiAgICogVGhpcyBidWZmZXIgaXMgcHJpdmF0ZSBrZXkgbWF0ZXJpYWwuXG4gICAqL1xuICBnZXRLZXlTaGFyZSgpOiBCdWZmZXIge1xuICAgIGlmICghdGhpcy5rZXlTaGFyZUJ1ZmYpIHtcbiAgICAgIHRocm93IEVycm9yKCdDYW4gbm90IGdldCBrZXkgc2hhcmUsIFZSRiBES0cgaXMgbm90IGNvbXBsZXRlIHlldC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMua2V5U2hhcmVCdWZmO1xuICB9XG5cbiAgLyoqIDMyLWJ5dGUgY29tcHJlc3NlZCBSaXN0cmV0dG8gVlJGIHB1YmxpYyBrZXksIGF2YWlsYWJsZSBvbmNlIHRoZSBES0cgaXMgY29tcGxldGUuICovXG4gIGdldFB1YmxpY0tleSgpOiBCdWZmZXIge1xuICAgIGlmICghdGhpcy5wdWJsaWNLZXkpIHtcbiAgICAgIHRocm93IEVycm9yKCdDYW4gbm90IGdldCBwdWJsaWMga2V5LCBWUkYgREtHIGlzIG5vdCBjb21wbGV0ZSB5ZXQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnB1YmxpY0tleTtcbiAgfVxuXG4gIC8qKiAzMi1ieXRlIFZSRiBrZXkgaWRlbnRpZmllciwgYXZhaWxhYmxlIG9uY2UgdGhlIERLRyBpcyBjb21wbGV0ZS4gKi9cbiAgZ2V0S2V5SWQoKTogQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMua2V5SWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdDYW4gbm90IGdldCBrZXkgaWQsIFZSRiBES0cgaXMgbm90IGNvbXBsZXRlIHlldC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMua2V5SWQ7XG4gIH1cblxuICAvKiogMzItYnl0ZSBWUkYgcm9vdCBjaGFpbiBjb2RlLCBhdmFpbGFibGUgb25jZSB0aGUgREtHIGlzIGNvbXBsZXRlLiAqL1xuICBnZXRSb290Q2hhaW5Db2RlKCk6IEJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLnJvb3RDaGFpbkNvZGUpIHtcbiAgICAgIHRocm93IEVycm9yKCdDYW4gbm90IGdldCByb290IGNoYWluIGNvZGUsIFZSRiBES0cgaXMgbm90IGNvbXBsZXRlIHlldC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucm9vdENoYWluQ29kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgc2Vzc2lvbiBkYXRhIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVzdG9yZSB0aGUgc2Vzc2lvbiBsYXRlci5cbiAgICpcbiAgICogVGhlIHJldHVybmVkIHNlc3Npb24gYnl0ZXMgYXJlIHNlY3JldCBrZXkgbWF0ZXJpYWwg4oCUIHRoZXkgY2FycnkgdGhpcyBwYXJ0eSdzXG4gICAqIHNlY3JldCBwb2x5bm9taWFsIHNoYXJlLiBUaGV5IG11c3QgbmV2ZXIgYmUgbG9nZ2VkIG9yIHBlcnNpc3RlZCBpbiB0aGUgY2xlYXI7XG4gICAqIHRoZSBjYWxsZXIgZW5jcnlwdHMgdGhlbSBleGFjdGx5IGxpa2UgdGhlIGtleSBzaGFyZSBpdHNlbGYuXG4gICAqL1xuICBnZXRTZXNzaW9uRGF0YSgpOiBWcmZEa2dTZXNzaW9uRGF0YSB7XG4gICAgY29uc3Qgc2Vzc2lvbkRhdGE6IFZyZkRrZ1Nlc3Npb25EYXRhID0ge1xuICAgICAgdnJmU2Vzc2lvbkJ5dGVzOiB0aGlzLnZyZlNlc3Npb25CeXRlcyxcbiAgICAgIHZyZlN0YXRlOiB0aGlzLnZyZlN0YXRlLFxuICAgIH07XG4gICAgaWYgKHRoaXMua2V5U2hhcmVCdWZmKSB7XG4gICAgICBzZXNzaW9uRGF0YS5rZXlTaGFyZUJ1ZmYgPSB0aGlzLmtleVNoYXJlQnVmZjtcbiAgICB9XG4gICAgcmV0dXJuIHNlc3Npb25EYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RvcmUgYSBWUkYgREtHIHNlc3Npb24gZnJvbSBwcmV2aW91cyBzZXNzaW9uIGRhdGEuXG4gICAqIE5vdGU6IFRoaXMgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBSb3VuZCAxIGFzIHRoYXQncyB0aGUgaW5pdGlhbGl6YXRpb24gcGhhc2UuXG4gICAqIFRoZSByb3VuZCBzdGF0ZSBpcyByZS1kZXJpdmVkIGZyb20gdGhlIHdhc20gc2Vzc2lvbiBieXRlcywgbm90IHRydXN0ZWQgZnJvbSB0aGVcbiAgICogY2FsbGVyLXN1cHBsaWVkIGVudW0sIHNvIGEgdGFtcGVyZWQgYHZyZlN0YXRlYCBjYW5ub3Qgc3RlZXIgdGhlIHByb3RvY29sLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlc3RvcmVTZXNzaW9uKFxuICAgIG46IG51bWJlcixcbiAgICB0OiBudW1iZXIsXG4gICAgcGFydHlJZHg6IG51bWJlcixcbiAgICBzZXNzaW9uRGF0YTogVnJmRGtnU2Vzc2lvbkRhdGEsXG4gICAgc2VlZD86IEJ1ZmZlcixcbiAgICB2cmZXYXNtPzogQnVuZGxlclZyZldhc21lclxuICApOiBQcm9taXNlPFZyZkRrZz4ge1xuICAgIGNvbnN0IHZyZkRrZyA9IG5ldyBWcmZEa2cobiwgdCwgcGFydHlJZHgsIHNlZWQsIHZyZldhc20pO1xuICAgIGlmICghdnJmRGtnLnZyZldhc20pIHtcbiAgICAgIGF3YWl0IHZyZkRrZy5sb2FkVnJmV2FzbSgpO1xuICAgIH1cbiAgICB2cmZEa2cudnJmU2Vzc2lvbkJ5dGVzID0gc2Vzc2lvbkRhdGEudnJmU2Vzc2lvbkJ5dGVzO1xuICAgIHZyZkRrZy5fcmVzdG9yZVNlc3Npb24oKTtcbiAgICB2cmZEa2cuX2Rlc2VyaWFsaXplU3RhdGUoKTtcbiAgICBpZiAoc2Vzc2lvbkRhdGEua2V5U2hhcmVCdWZmKSB7XG4gICAgICB2cmZEa2cua2V5U2hhcmVCdWZmID0gc2Vzc2lvbkRhdGEua2V5U2hhcmVCdWZmO1xuICAgIH1cbiAgICByZXR1cm4gdnJmRGtnO1xuICB9XG59XG4iXX0=
|
|
278
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGtnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9ka2xzLXZyZi9ka2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTUEsbUNBQWdDO0FBQ2hDLG1DQUFnQztBQUVoQyxtQ0FBeUQ7QUFZekQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBYSxNQUFNO0lBZWpCLFlBQVksQ0FBUyxFQUFFLENBQVMsRUFBRSxRQUFnQixFQUFFLElBQWEsRUFBRSxPQUEwQjtRQUhuRixhQUFRLEdBQWdCLG1CQUFXLENBQUMsYUFBYSxDQUFDO1FBSTFELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxJQUFJLENBQUM7SUFDakMsQ0FBQztJQUVPLEtBQUssQ0FBQyxXQUFXO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyx3REFBYSw0Q0FBNEMsR0FBQyxDQUFDO1FBQzVFLENBQUM7SUFDSCxDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLGdC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QUFHLFdBQVcsQ0FBQyxlQUFlLENBQUM7UUFDckQsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzNCLElBQUksV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQztRQUNqRCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBL1BELHdCQStQQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgTWVzc2FnZSBhcyBWcmZXYXNtTWVzc2FnZSxcbiAgVnJmS2V5Z2VuU2Vzc2lvbixcbiAgVnJmS2V5c2hhcmUgYXMgRGtsc1ZyZktleXNoYXJlLFxufSBmcm9tICdAc2lsZW5jZWxhYm9yYXRvcmllcy9ka2xzLXdhc20tbGwtdnJmLW5vZGUnO1xuaW1wb3J0IHR5cGUgeyBWcmZLZXlnZW5TZXNzaW9uIGFzIFZyZldlYktleWdlblNlc3Npb24gfSBmcm9tICdAc2lsZW5jZWxhYm9yYXRvcmllcy9ka2xzLXdhc20tbGwtdnJmLXdlYic7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdjYm9yLXgnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IERlc2VyaWFsaXplZE1lc3NhZ2VzIH0gZnJvbSAnLi4vZWNkc2EtZGtscy90eXBlcyc7XG5pbXBvcnQgeyBWcmZEa2dTZXNzaW9uRGF0YSwgVnJmRGtnU3RhdGUgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gUGxhdGZvcm0tc3BlY2lmaWMgbW9kdWxlcyB0aGF0IGRvIG5vdCBleGlzdCBldmVyeXdoZXJlOiB0aGUgbm9kZS93ZWIvYnVuZGxlciB3YXNtXG4vLyB2YXJpYW50cyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIGFuZCBzZWxlY3RlZCBhdCBydW50aW1lIChub2RlIHByb2Nlc3MgdnMgYnJvd3NlciB2c1xuLy8gYnVuZGxlcikuIFN0YXRpYyBpbXBvcnRzIHdvdWxkIGxvYWQgdGhlIHdyb25nIHBsYXRmb3JtJ3Mgd2FzbSBiaW5kaW5nLCBzbyBib3RoIHRoZVxuLy8gdHlwZSBhbGlhc2VzIGJlbG93IGFuZCB0aGUgbGF6eSBgYXdhaXQgaW1wb3J0KClgIGNhbGxzIGFyZSBkZWxpYmVyYXRlLlxudHlwZSBOb2RlVnJmV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQHNpbGVuY2VsYWJvcmF0b3JpZXMvZGtscy13YXNtLWxsLXZyZi1ub2RlJyk7XG50eXBlIFdlYlZyZldhc21lciA9IHR5cGVvZiBpbXBvcnQoJ0BzaWxlbmNlbGFib3JhdG9yaWVzL2RrbHMtd2FzbS1sbC12cmYtd2ViJyk7XG50eXBlIEJ1bmRsZXJWcmZXYXNtZXIgPSB0eXBlb2YgaW1wb3J0KCdAc2lsZW5jZWxhYm9yYXRvcmllcy9ka2xzLXdhc20tbGwtdnJmLWJ1bmRsZXInKTtcblxudHlwZSBWcmZXYXNtID0gTm9kZVZyZldhc21lciB8IFdlYlZyZldhc21lciB8IEJ1bmRsZXJWcmZXYXNtZXI7XG5cbi8qKlxuICogUm91bmQgZHJpdmVyIGZvciB0aGUgREtMUyBWUkYgREtHLCB3aGljaCBwcm9kdWNlcyBhIFJpc3RyZXR0byBWUkYga2V5c2hhcmUuXG4gKlxuICogVHdvIHJvdW5kcywgYWxsIGJyb2FkY2FzdDogcm91bmQgMSBleGNoYW5nZXMgY29tbWl0bWVudHMgKFZyZktleWdlbk1zZzEpLCByb3VuZCAyXG4gKiBleGNoYW5nZXMgb3BlbmluZ3MgKFZyZktleWdlbk1zZzIsIGVtaXR0ZWQgcGVyIHJlY2lwaWVudCkgYW5kIHRoZSBES0cgZmluYWxpemVzXG4gKiBsb2NhbGx5LiBUaGVyZSBpcyBubyBjaGFpbi1jb2RlIGNvbW1pdG1lbnQgc3RlcCwgdW5saWtlIHRoZSBzaWduaW5nIERLRy5cbiAqXG4gKiBDYWxsZXJzIHBhc3MgZXZlcnkgbWVzc2FnZSB0aGV5IGhvbGQ7IHRoaXMgY2xhc3Mgcm91dGVzIHRoZW0gaW50ZXJuYWxseS4gUm91bmQgMVxuICogbXVzdCBleGNsdWRlIHRoZSBwYXJ0eSdzIG93biBjb21taXRtZW50ICh0aGUgd2FzbSByZWplY3RzIGEgc2VuZGVyIHNldCBjb250YWluaW5nXG4gKiBpdCkgYW5kIHJvdW5kIDIgY29uc3VtZXMgdGhlIG9wZW5pbmdzIGFkZHJlc3NlZCB0byB0aGlzIHBhcnR5LCBvd24gaW5jbHVkZWQuXG4gKlxuICogUGFydHkgaW5kaWNlcyBmb2xsb3cgdGhlIE1QQ3YyIGNvbnZlbnRpb246IDAgPSB1c2VyLCAxID0gYmFja3VwLCAyID0gYml0Z28uXG4gKi9cbmV4cG9ydCBjbGFzcyBWcmZEa2cge1xuICBwcm90ZWN0ZWQgdnJmU2Vzc2lvbjogVnJmS2V5Z2VuU2Vzc2lvbiB8IFZyZldlYktleWdlblNlc3Npb24gfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCB2cmZTZXNzaW9uQnl0ZXM6IFVpbnQ4QXJyYXk7XG4gIHByb3RlY3RlZCB2cmZLZXlTaGFyZTogRGtsc1ZyZktleXNoYXJlIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQga2V5U2hhcmVCdWZmOiBCdWZmZXIgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBwdWJsaWNLZXk6IEJ1ZmZlciB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGtleUlkOiBCdWZmZXIgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCByb290Q2hhaW5Db2RlOiBCdWZmZXIgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBuOiBudW1iZXI7XG4gIHByb3RlY3RlZCB0OiBudW1iZXI7XG4gIHByb3RlY3RlZCBwYXJ0eUlkeDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgc2VlZDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgdnJmU3RhdGU6IFZyZkRrZ1N0YXRlID0gVnJmRGtnU3RhdGUuVW5pbml0aWFsaXplZDtcbiAgcHJvdGVjdGVkIHZyZldhc206IFZyZldhc20gfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKG46IG51bWJlciwgdDogbnVtYmVyLCBwYXJ0eUlkeDogbnVtYmVyLCBzZWVkPzogQnVmZmVyLCB2cmZXYXNtPzogQnVuZGxlclZyZldhc21lcikge1xuICAgIHRoaXMubiA9IG47XG4gICAgdGhpcy50ID0gdDtcbiAgICB0aGlzLnBhcnR5SWR4ID0gcGFydHlJZHg7XG4gICAgdGhpcy5zZWVkID0gc2VlZDtcbiAgICB0aGlzLnZyZldhc20gPSB2cmZXYXNtID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRWcmZXYXNtKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy52cmZXYXNtKSB7XG4gICAgICB0aGlzLnZyZldhc20gPSBhd2FpdCBpbXBvcnQoJ0BzaWxlbmNlbGFib3JhdG9yaWVzL2RrbHMtd2FzbS1sbC12cmYtbm9kZScpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VnJmV2FzbSgpIHtcbiAgICBpZiAoIXRoaXMudnJmV2FzbSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1ZSRiB3YXNtIG5vdCBsb2FkZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudnJmV2FzbTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc3RvcmVTZXNzaW9uKCkge1xuICAgIGlmICghdGhpcy52cmZTZXNzaW9uKSB7XG4gICAgICB0aGlzLnZyZlNlc3Npb24gPSB0aGlzLmdldFZyZldhc20oKS5WcmZLZXlnZW5TZXNzaW9uLmZyb21CeXRlcyh0aGlzLnZyZlNlc3Npb25CeXRlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlLWRlcml2ZSB0aGUgcm91bmQgc3RhdGUgZnJvbSB0aGUgd2FzbSBzZXNzaW9uIGJ5dGVzIGluc3RlYWQgb2YgdHJ1c3RpbmcgYVxuICAgKiBjYWxsZXItc3VwcGxpZWQgZW51bS4gVGhlIHdhc20gZW1iZWRzIGEgcm91bmQgdGFnIGZvciBleGFjdGx5IHRoaXMgcmVhc29uOyB0aGlzXG4gICAqIGlzIHdoYXQgbGV0cyBhIHN0YXRlbGVzcyBzZXJ2ZXIgcmVzdW1lIG1pZC1wcm90b2NvbC5cbiAgICovXG4gIHByaXZhdGUgX2Rlc2VyaWFsaXplU3RhdGUoKSB7XG4gICAgaWYgKCF0aGlzLnZyZlNlc3Npb24pIHtcbiAgICAgIHRocm93IEVycm9yKCdTZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBjb25zdCByb3VuZCA9IGRlY29kZSh0aGlzLnZyZlNlc3Npb24udG9CeXRlcygpKS5yb3VuZDtcbiAgICBpZiAocm91bmQgPT09ICdJbml0Jykge1xuICAgICAgdGhpcy52cmZTdGF0ZSA9IFZyZkRrZ1N0YXRlLlVuaW5pdGlhbGl6ZWQ7XG4gICAgfSBlbHNlIGlmIChyb3VuZCA9PT0gJ1dhaXRNc2cxJykge1xuICAgICAgdGhpcy52cmZTdGF0ZSA9IFZyZkRrZ1N0YXRlLlJvdW5kMTtcbiAgICB9IGVsc2UgaWYgKHJvdW5kID09PSAnV2FpdE1zZzInKSB7XG4gICAgICB0aGlzLnZyZlN0YXRlID0gVnJmRGtnU3RhdGUuUm91bmQyO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJvdW5kID09PSAnb2JqZWN0JyAmJiByb3VuZCAhPT0gbnVsbCAmJiAnU2hhcmUnIGluIHJvdW5kKSB7XG4gICAgICB0aGlzLnZyZlN0YXRlID0gVnJmRGtnU3RhdGUuQ29tcGxldGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudnJmU3RhdGUgPSBWcmZEa2dTdGF0ZS5JbnZhbGlkU3RhdGU7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBTdGF0ZTogJHtKU09OLnN0cmluZ2lmeShyb3VuZCl9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGlzIHBhcnR5J3MgVlJGIERLRyBjb21taXRtZW50IChWcmZLZXlnZW5Nc2cxLCBicm9hZGNhc3QpLlxuICAgKi9cbiAgYXN5bmMgaW5pdERrZygpOiBQcm9taXNlPERlc2VyaWFsaXplZE1lc3NhZ2VzPiB7XG4gICAgaWYgKCF0aGlzLnZyZldhc20pIHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZFZyZldhc20oKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudCA+IHRoaXMubiB8fCB0aGlzLnBhcnR5SWR4ID49IHRoaXMubikge1xuICAgICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgcGFyYW1ldGVycyBmb3IgVlJGIERLRycpO1xuICAgIH1cbiAgICBpZiAodGhpcy52cmZTdGF0ZSAhPSBWcmZEa2dTdGF0ZS5VbmluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignVlJGIERLRyBzZXNzaW9uIGFscmVhZHkgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIC8qIGNoZWNrcyBmb3IgZWxlY3Ryb24gcHJvY2Vzc2VzICovXG4gICAgICAhd2luZG93LnByb2Nlc3MgJiZcbiAgICAgICF3aW5kb3cucHJvY2Vzcz8uWyd0eXBlJ11cbiAgICApIHtcbiAgICAgIC8qIFRoaXMgaXMgb25seSBuZWVkZWQgZm9yIGJyb3dzZXJzL3dlYiBiZWNhdXNlIGl0IHVzZXMgZmV0Y2ggdG8gcmVzb2x2ZSB0aGUgd2FzbSBhc3NldCBmb3IgdGhlIHdlYiAqL1xuICAgICAgY29uc3QgaW5pdFZyZiA9IGF3YWl0IGltcG9ydCgnQHNpbGVuY2VsYWJvcmF0b3JpZXMvZGtscy13YXNtLWxsLXZyZi13ZWInKTtcbiAgICAgIGF3YWl0IGluaXRWcmYuZGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWVkICYmIHRoaXMuc2VlZC5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBFcnJvcihgU2VlZCBzaG91bGQgYmUgMzIgYnl0ZXMsIGdvdCAke3RoaXMuc2VlZC5sZW5ndGh9LmApO1xuICAgIH1cbiAgICBjb25zdCB7IFZyZktleWdlblNlc3Npb24gfSA9IHRoaXMuZ2V0VnJmV2FzbSgpO1xuICAgIHRoaXMudnJmU2Vzc2lvbiA9IHRoaXMuc2VlZFxuICAgICAgPyBuZXcgVnJmS2V5Z2VuU2Vzc2lvbih0aGlzLm4sIHRoaXMudCwgdGhpcy5wYXJ0eUlkeCwgbmV3IFVpbnQ4QXJyYXkodGhpcy5zZWVkKSlcbiAgICAgIDogbmV3IFZyZktleWdlblNlc3Npb24odGhpcy5uLCB0aGlzLnQsIHRoaXMucGFydHlJZHgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy52cmZTZXNzaW9uLmNyZWF0ZUZpcnN0TWVzc2FnZSgpO1xuICAgICAgLy8gQ29weSB0aGUgcGF5bG9hZCBvdXQgYmVmb3JlIGZyZWVpbmcgdGhlIHdhc20gbWVzc2FnZSBvYmplY3QuXG4gICAgICBjb25zdCBwYXlsb2FkID0gbmV3IFVpbnQ4QXJyYXkobWVzc2FnZS5wYXlsb2FkKTtcbiAgICAgIG1lc3NhZ2UuZnJlZSgpO1xuICAgICAgdGhpcy52cmZTZXNzaW9uQnl0ZXMgPSB0aGlzLnZyZlNlc3Npb24udG9CeXRlcygpO1xuICAgICAgdGhpcy5fZGVzZXJpYWxpemVTdGF0ZSgpO1xuICAgICAgcmV0dXJuIHsgYnJvYWRjYXN0TWVzc2FnZXM6IFt7IHBheWxvYWQsIGZyb206IHRoaXMucGFydHlJZHggfV0sIHAycE1lc3NhZ2VzOiBbXSB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgZmlyc3QgVlJGIG1lc3NhZ2UgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9OiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgdGhlIG1lc3NhZ2VzIHRoaXMgcGFydHkgaG9sZHMgZm9yIHRoZSBjdXJyZW50IHJvdW5kIGFuZCByZXR1cm4gdGhpc1xuICAgKiBwYXJ0eSdzIG1lc3NhZ2VzIGZvciB0aGUgbmV4dCByb3VuZC4gQ2FsbGVycyBwYXNzIGV2ZXJ5dGhpbmcgdGhleSBob2xkOyB0aGVcbiAgICogcm91bmQgcm91dGluZyBoYXBwZW5zIGhlcmU6XG4gICAqXG4gICAqIC0gUm91bmQgMSAoV2FpdE1zZzEpOiBjb25zdW1lcyB0aGUgb3RoZXIgcGFydGllcycgY29tbWl0bWVudHMgKG93biBleGNsdWRlZCDigJRcbiAgICogICB0aGUgd2FzbSByZWplY3RzIGEgc2VuZGVyIHNldCBjb250YWluaW5nIHRoZSBwYXJ0eSdzIG93biBNc2cxKSBhbmQgZW1pdHMgdGhpc1xuICAgKiAgIHBhcnR5J3Mgb3BlbmluZ3MgKFZyZktleWdlbk1zZzIpLCBvbmUgYnJvYWRjYXN0IG1lc3NhZ2UgcGVyIHJlY2lwaWVudC5cbiAgICogLSBSb3VuZCAyIChXYWl0TXNnMik6IGNvbnN1bWVzIHRoZSBvcGVuaW5ncyBhZGRyZXNzZWQgdG8gdGhpcyBwYXJ0eSAob3duXG4gICAqICAgc2VsZi1hZGRyZXNzZWQgb3BlbmluZyBpbmNsdWRlZCkgYW5kIGZpbmFsaXplcyB0aGUgREtHLCByZXR1cm5pbmcgbm8gbWVzc2FnZXMuXG4gICAqL1xuICBhc3luYyBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2VzRm9ySXRoUm91bmQ6IERlc2VyaWFsaXplZE1lc3NhZ2VzKTogUHJvbWlzZTxEZXNlcmlhbGl6ZWRNZXNzYWdlcz4ge1xuICAgIHRoaXMuX3Jlc3RvcmVTZXNzaW9uKCk7XG4gICAgaWYgKCF0aGlzLnZyZlNlc3Npb24pIHtcbiAgICAgIHRocm93IEVycm9yKCdTZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBjb25zdCB7IE1lc3NhZ2U6IFZyZk1lc3NhZ2UgfSA9IHRoaXMuZ2V0VnJmV2FzbSgpO1xuICAgIGxldCBuZXh0Um91bmRNZXNzYWdlczogVnJmV2FzbU1lc3NhZ2VbXSA9IFtdO1xuICAgIGNvbnN0IG5leHRSb3VuZERlc2VyaWFsaXplZE1lc3NhZ2VzOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLCBwMnBNZXNzYWdlczogW10gfTtcbiAgICB0cnkge1xuICAgICAgc3dpdGNoICh0aGlzLnZyZlN0YXRlKSB7XG4gICAgICAgIGNhc2UgVnJmRGtnU3RhdGUuUm91bmQxOiB7XG4gICAgICAgICAgY29uc3Qgb3RoZXJzQ29tbWl0bWVudHMgPSBtZXNzYWdlc0Zvckl0aFJvdW5kLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS5mcm9tICE9PSB0aGlzLnBhcnR5SWR4KTtcbiAgICAgICAgICBuZXh0Um91bmRNZXNzYWdlcyA9IHRoaXMudnJmU2Vzc2lvbi5oYW5kbGVNZXNzYWdlcyhcbiAgICAgICAgICAgIG90aGVyc0NvbW1pdG1lbnRzLm1hcCgobSkgPT4gbmV3IFZyZk1lc3NhZ2UobS5wYXlsb2FkLCBtLmZyb20pKVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fZGVzZXJpYWxpemVTdGF0ZSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgVnJmRGtnU3RhdGUuUm91bmQyOiB7XG4gICAgICAgICAgY29uc3Qgb3BlbmluZ3NGb3JNZSA9IG1lc3NhZ2VzRm9ySXRoUm91bmQucDJwTWVzc2FnZXMuZmlsdGVyKChtKSA9PiBtLnRvID09PSB0aGlzLnBhcnR5SWR4KTtcbiAgICAgICAgICBuZXh0Um91bmRNZXNzYWdlcyA9IHRoaXMudnJmU2Vzc2lvbi5oYW5kbGVNZXNzYWdlcyhcbiAgICAgICAgICAgIG9wZW5pbmdzRm9yTWUubWFwKChtKSA9PiBuZXcgVnJmTWVzc2FnZShtLnBheWxvYWQsIG0uZnJvbSwgbS50bykpXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyB2cmZLZXlzaGFyZSgpIGNvbnN1bWVzIChhbmQgZGVhbGxvY2F0ZXMpIHRoZSBzZXNzaW9uIGluIGFsbCBjYXNlcy5cbiAgICAgICAgICBjb25zdCB2cmZLZXlTaGFyZSA9IHRoaXMudnJmU2Vzc2lvbi52cmZLZXlzaGFyZSgpO1xuICAgICAgICAgIHRoaXMudnJmS2V5U2hhcmUgPSB2cmZLZXlTaGFyZTtcbiAgICAgICAgICB0aGlzLmtleVNoYXJlQnVmZiA9IEJ1ZmZlci5mcm9tKHZyZktleVNoYXJlLnRvQnl0ZXMoKSk7XG4gICAgICAgICAgdGhpcy5wdWJsaWNLZXkgPSBCdWZmZXIuZnJvbSh2cmZLZXlTaGFyZS5wdWJsaWNLZXkpO1xuICAgICAgICAgIHRoaXMua2V5SWQgPSBCdWZmZXIuZnJvbSh2cmZLZXlTaGFyZS5rZXlJZCk7XG4gICAgICAgICAgdGhpcy5yb290Q2hhaW5Db2RlID0gQnVmZmVyLmZyb20odnJmS2V5U2hhcmUucm9vdENoYWluQ29kZSk7XG4gICAgICAgICAgdnJmS2V5U2hhcmUuZnJlZSgpO1xuICAgICAgICAgIHRoaXMudnJmU3RhdGUgPSBWcmZEa2dTdGF0ZS5Db21wbGV0ZTtcbiAgICAgICAgICByZXR1cm4gbmV4dFJvdW5kRGVzZXJpYWxpemVkTWVzc2FnZXM7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBWUkYgREtHIHN0YXRlOiAke3RoaXMudnJmU3RhdGV9YCk7XG4gICAgICB9XG5cbiAgICAgIG5leHRSb3VuZERlc2VyaWFsaXplZE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzID0gbmV4dFJvdW5kTWVzc2FnZXNcbiAgICAgICAgLmZpbHRlcigobSkgPT4gbS50b19pZCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAubWFwKChtKSA9PiAoeyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShtLnBheWxvYWQpLCBmcm9tOiBtLmZyb21faWQgfSkpO1xuICAgICAgbmV4dFJvdW5kRGVzZXJpYWxpemVkTWVzc2FnZXMucDJwTWVzc2FnZXMgPSBuZXh0Um91bmRNZXNzYWdlc1xuICAgICAgICAuZmlsdGVyKChtKTogbSBpcyBWcmZXYXNtTWVzc2FnZSAmIHsgdG9faWQ6IG51bWJlciB9ID0+IG0udG9faWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgLm1hcCgobSkgPT4gKHsgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkobS5wYXlsb2FkKSwgZnJvbTogbS5mcm9tX2lkLCB0bzogbS50b19pZCB9KSk7XG4gICAgICByZXR1cm4gbmV4dFJvdW5kRGVzZXJpYWxpemVkTWVzc2FnZXM7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIFZSRiBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHN0YXRlICR7dGhpcy52cmZTdGF0ZX06ICR7ZX1gKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgbmV4dFJvdW5kTWVzc2FnZXMuZm9yRWFjaCgobSkgPT4gbS5mcmVlKCkpO1xuICAgICAgaWYgKHRoaXMudnJmU3RhdGUgIT09IFZyZkRrZ1N0YXRlLkNvbXBsZXRlKSB7XG4gICAgICAgIHRoaXMudnJmU2Vzc2lvbkJ5dGVzID0gdGhpcy52cmZTZXNzaW9uLnRvQnl0ZXMoKTtcbiAgICAgICAgdGhpcy52cmZTZXNzaW9uID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFZSRiBrZXlzaGFyZSBieXRlcyAoQ0JPUiBWcmZLZXlzaGFyZSkgb25jZSB0aGUgREtHIGlzIGNvbXBsZXRlLlxuICAgKiBUaGlzIGJ1ZmZlciBpcyBwcml2YXRlIGtleSBtYXRlcmlhbC5cbiAgICovXG4gIGdldEtleVNoYXJlKCk6IEJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLmtleVNoYXJlQnVmZikge1xuICAgICAgdGhyb3cgRXJyb3IoJ0NhbiBub3QgZ2V0IGtleSBzaGFyZSwgVlJGIERLRyBpcyBub3QgY29tcGxldGUgeWV0LicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5rZXlTaGFyZUJ1ZmY7XG4gIH1cblxuICAvKiogMzItYnl0ZSBjb21wcmVzc2VkIFJpc3RyZXR0byBWUkYgcHVibGljIGtleSwgYXZhaWxhYmxlIG9uY2UgdGhlIERLRyBpcyBjb21wbGV0ZS4gKi9cbiAgZ2V0UHVibGljS2V5KCk6IEJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLnB1YmxpY0tleSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0NhbiBub3QgZ2V0IHB1YmxpYyBrZXksIFZSRiBES0cgaXMgbm90IGNvbXBsZXRlIHlldC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucHVibGljS2V5O1xuICB9XG5cbiAgLyoqIDMyLWJ5dGUgVlJGIGtleSBpZGVudGlmaWVyLCBhdmFpbGFibGUgb25jZSB0aGUgREtHIGlzIGNvbXBsZXRlLiAqL1xuICBnZXRLZXlJZCgpOiBCdWZmZXIge1xuICAgIGlmICghdGhpcy5rZXlJZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0NhbiBub3QgZ2V0IGtleSBpZCwgVlJGIERLRyBpcyBub3QgY29tcGxldGUgeWV0LicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5rZXlJZDtcbiAgfVxuXG4gIC8qKiAzMi1ieXRlIFZSRiByb290IGNoYWluIGNvZGUsIGF2YWlsYWJsZSBvbmNlIHRoZSBES0cgaXMgY29tcGxldGUuICovXG4gIGdldFJvb3RDaGFpbkNvZGUoKTogQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMucm9vdENoYWluQ29kZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0NhbiBub3QgZ2V0IHJvb3QgY2hhaW4gY29kZSwgVlJGIERLRyBpcyBub3QgY29tcGxldGUgeWV0LicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yb290Q2hhaW5Db2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBzZXNzaW9uIGRhdGEgdGhhdCBjYW4gYmUgdXNlZCB0byByZXN0b3JlIHRoZSBzZXNzaW9uIGxhdGVyLlxuICAgKlxuICAgKiBUaGUgcmV0dXJuZWQgc2Vzc2lvbiBieXRlcyBhcmUgc2VjcmV0IGtleSBtYXRlcmlhbCDigJQgdGhleSBjYXJyeSB0aGlzIHBhcnR5J3NcbiAgICogc2VjcmV0IHBvbHlub21pYWwgc2hhcmUuIFRoZXkgbXVzdCBuZXZlciBiZSBsb2dnZWQgb3IgcGVyc2lzdGVkIGluIHRoZSBjbGVhcjtcbiAgICogdGhlIGNhbGxlciBlbmNyeXB0cyB0aGVtIGV4YWN0bHkgbGlrZSB0aGUga2V5IHNoYXJlIGl0c2VsZi5cbiAgICovXG4gIGdldFNlc3Npb25EYXRhKCk6IFZyZkRrZ1Nlc3Npb25EYXRhIHtcbiAgICBjb25zdCBzZXNzaW9uRGF0YTogVnJmRGtnU2Vzc2lvbkRhdGEgPSB7XG4gICAgICB2cmZTZXNzaW9uQnl0ZXM6IHRoaXMudnJmU2Vzc2lvbkJ5dGVzLFxuICAgICAgdnJmU3RhdGU6IHRoaXMudnJmU3RhdGUsXG4gICAgfTtcbiAgICBpZiAodGhpcy5rZXlTaGFyZUJ1ZmYpIHtcbiAgICAgIHNlc3Npb25EYXRhLmtleVNoYXJlQnVmZiA9IHRoaXMua2V5U2hhcmVCdWZmO1xuICAgIH1cbiAgICByZXR1cm4gc2Vzc2lvbkRhdGE7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBhIFZSRiBES0cgc2Vzc2lvbiBmcm9tIHByZXZpb3VzIHNlc3Npb24gZGF0YS5cbiAgICogTm90ZTogVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIFJvdW5kIDEgYXMgdGhhdCdzIHRoZSBpbml0aWFsaXphdGlvbiBwaGFzZS5cbiAgICogVGhlIHJvdW5kIHN0YXRlIGlzIHJlLWRlcml2ZWQgZnJvbSB0aGUgd2FzbSBzZXNzaW9uIGJ5dGVzLCBub3QgdHJ1c3RlZCBmcm9tIHRoZVxuICAgKiBjYWxsZXItc3VwcGxpZWQgZW51bSwgc28gYSB0YW1wZXJlZCBgdnJmU3RhdGVgIGNhbm5vdCBzdGVlciB0aGUgcHJvdG9jb2wuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVzdG9yZVNlc3Npb24oXG4gICAgbjogbnVtYmVyLFxuICAgIHQ6IG51bWJlcixcbiAgICBwYXJ0eUlkeDogbnVtYmVyLFxuICAgIHNlc3Npb25EYXRhOiBWcmZEa2dTZXNzaW9uRGF0YSxcbiAgICBzZWVkPzogQnVmZmVyLFxuICAgIHZyZldhc20/OiBCdW5kbGVyVnJmV2FzbWVyXG4gICk6IFByb21pc2U8VnJmRGtnPiB7XG4gICAgY29uc3QgdnJmRGtnID0gbmV3IFZyZkRrZyhuLCB0LCBwYXJ0eUlkeCwgc2VlZCwgdnJmV2FzbSk7XG4gICAgaWYgKCF2cmZEa2cudnJmV2FzbSkge1xuICAgICAgYXdhaXQgdnJmRGtnLmxvYWRWcmZXYXNtKCk7XG4gICAgfVxuICAgIHZyZkRrZy52cmZTZXNzaW9uQnl0ZXMgPSBzZXNzaW9uRGF0YS52cmZTZXNzaW9uQnl0ZXM7XG4gICAgdnJmRGtnLl9yZXN0b3JlU2Vzc2lvbigpO1xuICAgIHZyZkRrZy5fZGVzZXJpYWxpemVTdGF0ZSgpO1xuICAgIGlmIChzZXNzaW9uRGF0YS5rZXlTaGFyZUJ1ZmYpIHtcbiAgICAgIHZyZkRrZy5rZXlTaGFyZUJ1ZmYgPSBzZXNzaW9uRGF0YS5rZXlTaGFyZUJ1ZmY7XG4gICAgfVxuICAgIHJldHVybiB2cmZEa2c7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Buffer } from 'buffer';
|
|
2
|
+
import { DeserializedMessages } from '../ecdsa-dkls/types';
|
|
3
|
+
import { VrfDkgSessionData, VrfDkgState } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* Round driver for the EdDSA MPS VRF DKG, which produces a Ristretto VRF keyshare.
|
|
6
|
+
*
|
|
7
|
+
* Two message exchanges: round 0 broadcasts VrfKeygenMsg1, round 1 emits per-recipient
|
|
8
|
+
* VrfKeygenMsg2 as p2p messages, round 2 returns the VrfShare. There is no chain-code
|
|
9
|
+
* commitment step, unlike the signing DKG.
|
|
10
|
+
*
|
|
11
|
+
* Callers pass every message they hold; this class routes them internally. Round 1
|
|
12
|
+
* must exclude the party's own commitment (the wasm rejects a sender set containing
|
|
13
|
+
* it) and round 2 consumes the openings addressed to this party.
|
|
14
|
+
*
|
|
15
|
+
* Party indices follow the MPCv2 convention: 0 = user, 1 = backup, 2 = bitgo.
|
|
16
|
+
* `VrfShare` exposes only share bytes — no public key, key id, or root chain code.
|
|
17
|
+
*/
|
|
18
|
+
export declare class VrfDkg {
|
|
19
|
+
protected n: number;
|
|
20
|
+
protected t: number;
|
|
21
|
+
protected partyIdx: number;
|
|
22
|
+
protected seed: Buffer | undefined;
|
|
23
|
+
/** Opaque wasm round-state bytes. Secret key material. */
|
|
24
|
+
protected vrfStateBytes: Buffer | undefined;
|
|
25
|
+
protected keyShareBuff: Buffer | undefined;
|
|
26
|
+
protected vrfState: VrfDkgState;
|
|
27
|
+
private wasmMps;
|
|
28
|
+
constructor(n: number, t: number, partyIdx: number, seed?: Buffer);
|
|
29
|
+
private loadWasmMps;
|
|
30
|
+
private getWasmMps;
|
|
31
|
+
private getVrfStateBytes;
|
|
32
|
+
getState(): VrfDkgState;
|
|
33
|
+
/**
|
|
34
|
+
* Create this party's VRF DKG commitment (VrfKeygenMsg1, broadcast).
|
|
35
|
+
*/
|
|
36
|
+
initDkg(): Promise<DeserializedMessages>;
|
|
37
|
+
/**
|
|
38
|
+
* Process the messages this party holds for the current round and return this
|
|
39
|
+
* party's messages for the next round. Callers pass everything they hold; the
|
|
40
|
+
* round routing happens here:
|
|
41
|
+
*
|
|
42
|
+
* - Round 1: consumes the other parties' commitments (own excluded) and emits
|
|
43
|
+
* per-recipient openings (VrfKeygenMsg2) as p2p messages.
|
|
44
|
+
* - Round 2: consumes the openings addressed to this party and finalizes the DKG.
|
|
45
|
+
*/
|
|
46
|
+
handleIncomingMessages(messagesForIthRound: DeserializedMessages): Promise<DeserializedMessages>;
|
|
47
|
+
/**
|
|
48
|
+
* Get the VRF keyshare bytes once the DKG is complete.
|
|
49
|
+
* This buffer is private key material.
|
|
50
|
+
*/
|
|
51
|
+
getKeyShare(): Buffer;
|
|
52
|
+
/**
|
|
53
|
+
* Get the current session data that can be used to restore the session later.
|
|
54
|
+
*
|
|
55
|
+
* The returned state bytes are secret key material — they carry this party's
|
|
56
|
+
* secret VRF share. They must never be logged or persisted in the clear.
|
|
57
|
+
*/
|
|
58
|
+
getSessionData(): VrfDkgSessionData;
|
|
59
|
+
/**
|
|
60
|
+
* Restore a VRF DKG session from previous session data.
|
|
61
|
+
* MPS wasm state bytes have no round tag, so the persisted `vrfState` is used.
|
|
62
|
+
*/
|
|
63
|
+
static restoreSession(n: number, t: number, partyIdx: number, sessionData: unknown): Promise<VrfDkg>;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=dkg.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dkg.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps-vrf/dkg.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAiE,iBAAiB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAMxH;;;;;;;;;;;;;GAaG;AACH,qBAAa,MAAM;IACjB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,0DAA0D;IAC1D,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,SAAS,CAAC,QAAQ,EAAE,WAAW,CAA6B;IAC5D,OAAO,CAAC,OAAO,CAAwB;gBAE3B,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;YAOnD,WAAW;IAgBzB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,gBAAgB;IAOxB,QAAQ,IAAI,WAAW;IAIvB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,oBAAoB,CAAC;IA0B9C;;;;;;;;OAQG;IACG,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA4DtG;;;OAGG;IACH,WAAW,IAAI,MAAM;IAOrB;;;;;OAKG;IACH,cAAc,IAAI,iBAAiB;IAcnC;;;OAGG;WACU,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;CAuB3G"}
|
|
@@ -0,0 +1,246 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.VrfDkg = void 0;
|
|
40
|
+
const buffer_1 = require("buffer");
|
|
41
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
42
|
+
const types_1 = require("./types");
|
|
43
|
+
/**
|
|
44
|
+
* Round driver for the EdDSA MPS VRF DKG, which produces a Ristretto VRF keyshare.
|
|
45
|
+
*
|
|
46
|
+
* Two message exchanges: round 0 broadcasts VrfKeygenMsg1, round 1 emits per-recipient
|
|
47
|
+
* VrfKeygenMsg2 as p2p messages, round 2 returns the VrfShare. There is no chain-code
|
|
48
|
+
* commitment step, unlike the signing DKG.
|
|
49
|
+
*
|
|
50
|
+
* Callers pass every message they hold; this class routes them internally. Round 1
|
|
51
|
+
* must exclude the party's own commitment (the wasm rejects a sender set containing
|
|
52
|
+
* it) and round 2 consumes the openings addressed to this party.
|
|
53
|
+
*
|
|
54
|
+
* Party indices follow the MPCv2 convention: 0 = user, 1 = backup, 2 = bitgo.
|
|
55
|
+
* `VrfShare` exposes only share bytes — no public key, key id, or root chain code.
|
|
56
|
+
*/
|
|
57
|
+
class VrfDkg {
|
|
58
|
+
constructor(n, t, partyIdx, seed) {
|
|
59
|
+
this.vrfState = types_1.VrfDkgState.Uninitialized;
|
|
60
|
+
this.wasmMps = null;
|
|
61
|
+
this.n = n;
|
|
62
|
+
this.t = t;
|
|
63
|
+
this.partyIdx = partyIdx;
|
|
64
|
+
this.seed = seed;
|
|
65
|
+
}
|
|
66
|
+
async loadWasmMps() {
|
|
67
|
+
if (!this.wasmMps) {
|
|
68
|
+
// Electron renderer sets process.type and must use the node wasm build.
|
|
69
|
+
if (typeof window !== 'undefined' && window.process?.['type'] !== 'renderer') {
|
|
70
|
+
// Browser: web build has explicit init() — guaranteed ready after await
|
|
71
|
+
// eslint-disable-next-line import/no-internal-modules -- @bitgo/wasm-mps exposes environment-specific subpath exports.
|
|
72
|
+
const webWasm = await Promise.resolve().then(() => __importStar(require('@bitgo/wasm-mps/web')));
|
|
73
|
+
await webWasm.default();
|
|
74
|
+
this.wasmMps = webWasm;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
// Node.js: dynamic import() rewritten to require() by tsc → CJS build → readFileSync
|
|
78
|
+
this.wasmMps = await Promise.resolve().then(() => __importStar(require('@bitgo/wasm-mps')));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
getWasmMps() {
|
|
83
|
+
if (!this.wasmMps) {
|
|
84
|
+
throw Error('WASM module not loaded');
|
|
85
|
+
}
|
|
86
|
+
return this.wasmMps;
|
|
87
|
+
}
|
|
88
|
+
getVrfStateBytes() {
|
|
89
|
+
if (!this.vrfStateBytes) {
|
|
90
|
+
throw Error(`VRF DKG state bytes missing in state ${this.vrfState}`);
|
|
91
|
+
}
|
|
92
|
+
return this.vrfStateBytes;
|
|
93
|
+
}
|
|
94
|
+
getState() {
|
|
95
|
+
return this.vrfState;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Create this party's VRF DKG commitment (VrfKeygenMsg1, broadcast).
|
|
99
|
+
*/
|
|
100
|
+
async initDkg() {
|
|
101
|
+
await this.loadWasmMps();
|
|
102
|
+
if (this.t > this.n || this.partyIdx >= this.n) {
|
|
103
|
+
throw Error('Invalid parameters for VRF DKG');
|
|
104
|
+
}
|
|
105
|
+
if (this.seed && this.seed.length !== 32) {
|
|
106
|
+
throw Error(`Seed should be 32 bytes, got ${this.seed.length}.`);
|
|
107
|
+
}
|
|
108
|
+
if (this.vrfState !== types_1.VrfDkgState.Uninitialized) {
|
|
109
|
+
throw Error('VRF DKG session already initialized');
|
|
110
|
+
}
|
|
111
|
+
const wasm = this.getWasmMps();
|
|
112
|
+
let result;
|
|
113
|
+
try {
|
|
114
|
+
result = wasm.ed25519_vrf_dkg_round0_process(this.partyIdx, this.seed ?? crypto_1.default.randomBytes(32));
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
throw new Error(`Error while creating the first VRF message from party ${this.partyIdx}: ${err}`);
|
|
118
|
+
}
|
|
119
|
+
const payload = new Uint8Array(result.msg);
|
|
120
|
+
this.vrfStateBytes = buffer_1.Buffer.from(result.state);
|
|
121
|
+
result.free();
|
|
122
|
+
this.vrfState = types_1.VrfDkgState.Round1;
|
|
123
|
+
return { broadcastMessages: [{ payload, from: this.partyIdx }], p2pMessages: [] };
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Process the messages this party holds for the current round and return this
|
|
127
|
+
* party's messages for the next round. Callers pass everything they hold; the
|
|
128
|
+
* round routing happens here:
|
|
129
|
+
*
|
|
130
|
+
* - Round 1: consumes the other parties' commitments (own excluded) and emits
|
|
131
|
+
* per-recipient openings (VrfKeygenMsg2) as p2p messages.
|
|
132
|
+
* - Round 2: consumes the openings addressed to this party and finalizes the DKG.
|
|
133
|
+
*/
|
|
134
|
+
async handleIncomingMessages(messagesForIthRound) {
|
|
135
|
+
await this.loadWasmMps();
|
|
136
|
+
if (this.vrfState === types_1.VrfDkgState.Complete) {
|
|
137
|
+
throw Error('VRF DKG session already completed');
|
|
138
|
+
}
|
|
139
|
+
if (this.vrfState === types_1.VrfDkgState.Uninitialized) {
|
|
140
|
+
throw Error('VRF DKG session not initialized');
|
|
141
|
+
}
|
|
142
|
+
const wasm = this.getWasmMps();
|
|
143
|
+
switch (this.vrfState) {
|
|
144
|
+
case types_1.VrfDkgState.Round1: {
|
|
145
|
+
const othersCommitments = messagesForIthRound.broadcastMessages
|
|
146
|
+
.filter((m) => m.from !== this.partyIdx)
|
|
147
|
+
.sort((a, b) => a.from - b.from)
|
|
148
|
+
.map((m) => m.payload);
|
|
149
|
+
let result;
|
|
150
|
+
try {
|
|
151
|
+
result = wasm.ed25519_vrf_dkg_round1_process(othersCommitments, this.getVrfStateBytes());
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
throw new Error(`Error while creating VRF messages from party ${this.partyIdx}, state ${this.vrfState}: ${err}`);
|
|
155
|
+
}
|
|
156
|
+
const openings = Object.entries((0, types_1.decodeVrfRound1MsgMap)(result.msg)).map(([recipient, payload]) => ({
|
|
157
|
+
payload: new Uint8Array(payload),
|
|
158
|
+
from: this.partyIdx,
|
|
159
|
+
to: (0, types_1.decodePartyId)(recipient),
|
|
160
|
+
}));
|
|
161
|
+
this.vrfStateBytes = buffer_1.Buffer.from(result.state);
|
|
162
|
+
result.free();
|
|
163
|
+
this.vrfState = types_1.VrfDkgState.Round2;
|
|
164
|
+
return { broadcastMessages: [], p2pMessages: openings };
|
|
165
|
+
}
|
|
166
|
+
case types_1.VrfDkgState.Round2: {
|
|
167
|
+
const openingsForMe = messagesForIthRound.p2pMessages
|
|
168
|
+
.filter((m) => m.to === this.partyIdx)
|
|
169
|
+
.sort((a, b) => a.from - b.from)
|
|
170
|
+
.map((m) => m.payload);
|
|
171
|
+
let share;
|
|
172
|
+
try {
|
|
173
|
+
share = wasm.ed25519_vrf_dkg_round2_process(openingsForMe, this.getVrfStateBytes());
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
throw new Error(`Error while creating VRF messages from party ${this.partyIdx}, state ${this.vrfState}: ${err}`);
|
|
177
|
+
}
|
|
178
|
+
this.keyShareBuff = buffer_1.Buffer.from(share.share);
|
|
179
|
+
share.free();
|
|
180
|
+
this.vrfStateBytes = undefined;
|
|
181
|
+
this.vrfState = types_1.VrfDkgState.Complete;
|
|
182
|
+
return { broadcastMessages: [], p2pMessages: [] };
|
|
183
|
+
}
|
|
184
|
+
default:
|
|
185
|
+
throw Error(`Invalid VRF DKG state: ${this.vrfState}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get the VRF keyshare bytes once the DKG is complete.
|
|
190
|
+
* This buffer is private key material.
|
|
191
|
+
*/
|
|
192
|
+
getKeyShare() {
|
|
193
|
+
if (!this.keyShareBuff) {
|
|
194
|
+
throw Error('Can not get key share, VRF DKG is not complete yet.');
|
|
195
|
+
}
|
|
196
|
+
return this.keyShareBuff;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get the current session data that can be used to restore the session later.
|
|
200
|
+
*
|
|
201
|
+
* The returned state bytes are secret key material — they carry this party's
|
|
202
|
+
* secret VRF share. They must never be logged or persisted in the clear.
|
|
203
|
+
*/
|
|
204
|
+
getSessionData() {
|
|
205
|
+
if (this.vrfState === types_1.VrfDkgState.Uninitialized) {
|
|
206
|
+
throw Error('VRF DKG session not initialized');
|
|
207
|
+
}
|
|
208
|
+
const sessionData = { vrfState: this.vrfState };
|
|
209
|
+
if (this.vrfStateBytes) {
|
|
210
|
+
sessionData.vrfStateBytes = this.vrfStateBytes;
|
|
211
|
+
}
|
|
212
|
+
if (this.keyShareBuff) {
|
|
213
|
+
sessionData.keyShareBuff = this.keyShareBuff;
|
|
214
|
+
}
|
|
215
|
+
return sessionData;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Restore a VRF DKG session from previous session data.
|
|
219
|
+
* MPS wasm state bytes have no round tag, so the persisted `vrfState` is used.
|
|
220
|
+
*/
|
|
221
|
+
static async restoreSession(n, t, partyIdx, sessionData) {
|
|
222
|
+
const data = (0, types_1.decodeVrfDkgSessionData)(sessionData);
|
|
223
|
+
const vrfDkg = new VrfDkg(n, t, partyIdx);
|
|
224
|
+
switch (data.vrfState) {
|
|
225
|
+
case types_1.VrfDkgState.Round1:
|
|
226
|
+
case types_1.VrfDkgState.Round2:
|
|
227
|
+
if (!data.vrfStateBytes) {
|
|
228
|
+
throw Error(`Cannot restore VRF DKG session in state ${data.vrfState} without state bytes`);
|
|
229
|
+
}
|
|
230
|
+
vrfDkg.vrfStateBytes = buffer_1.Buffer.from(data.vrfStateBytes);
|
|
231
|
+
break;
|
|
232
|
+
case types_1.VrfDkgState.Complete:
|
|
233
|
+
if (!data.keyShareBuff) {
|
|
234
|
+
throw Error('Cannot restore a completed VRF DKG session without a key share');
|
|
235
|
+
}
|
|
236
|
+
vrfDkg.keyShareBuff = data.keyShareBuff;
|
|
237
|
+
break;
|
|
238
|
+
default:
|
|
239
|
+
throw Error(`Invalid VRF DKG state: ${data.vrfState}`);
|
|
240
|
+
}
|
|
241
|
+
vrfDkg.vrfState = data.vrfState;
|
|
242
|
+
return vrfDkg;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
exports.VrfDkg = VrfDkg;
|
|
246
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGtnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9lZGRzYS1tcHMtdnJmL2RrZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxtQ0FBZ0M7QUFDaEMsb0RBQTRCO0FBRTVCLG1DQUF3SDtBQU14SDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBYSxNQUFNO0lBV2pCLFlBQVksQ0FBUyxFQUFFLENBQVMsRUFBRSxRQUFnQixFQUFFLElBQWE7UUFIdkQsYUFBUSxHQUFnQixtQkFBVyxDQUFDLGFBQWEsQ0FBQztRQUNwRCxZQUFPLEdBQW1CLElBQUksQ0FBQztRQUdyQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVPLEtBQUssQ0FBQyxXQUFXO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsd0VBQXdFO1lBQ3hFLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDN0Usd0VBQXdFO2dCQUN4RSx1SEFBdUg7Z0JBQ3ZILE1BQU0sT0FBTyxHQUFHLHdEQUFhLHFCQUFxQixHQUFDLENBQUM7Z0JBQ3BELE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUN6QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04scUZBQXFGO2dCQUNyRixJQUFJLENBQUMsT0FBTyxHQUFHLHdEQUFhLGlCQUFpQixHQUFDLENBQUM7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QUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxRQUFnQixFQUFFLFdBQW9CO1FBQ3RGLE1BQU0sSUFBSSxHQUFHLElBQUEsK0JBQXVCLEVBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMxQyxRQUFRLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN0QixLQUFLLG1CQUFXLENBQUMsTUFBTSxDQUFDO1lBQ3hCLEtBQUssbUJBQVcsQ0FBQyxNQUFNO2dCQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUN4QixNQUFNLEtBQUssQ0FBQywyQ0FBMkMsSUFBSSxDQUFDLFFBQVEsc0JBQXNCLENBQUMsQ0FBQztnQkFDOUYsQ0FBQztnQkFDRCxNQUFNLENBQUMsYUFBYSxHQUFHLGVBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUN2RCxNQUFNO1lBQ1IsS0FBSyxtQkFBVyxDQUFDLFFBQVE7Z0JBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3ZCLE1BQU0sS0FBSyxDQUFDLGdFQUFnRSxDQUFDLENBQUM7Z0JBQ2hGLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO2dCQUN4QyxNQUFNO1lBQ1I7Z0JBQ0UsTUFBTSxLQUFLLENBQUMsMEJBQTBCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDaEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBaE5ELHdCQWdOQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTXNnU3RhdGUsIE1zZ1N0YXRlTWFwLCBWcmZTaGFyZSB9IGZyb20gJ0BiaXRnby93YXNtLW1wcyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVkTWVzc2FnZXMgfSBmcm9tICcuLi9lY2RzYS1ka2xzL3R5cGVzJztcbmltcG9ydCB7IGRlY29kZVBhcnR5SWQsIGRlY29kZVZyZkRrZ1Nlc3Npb25EYXRhLCBkZWNvZGVWcmZSb3VuZDFNc2dNYXAsIFZyZkRrZ1Nlc3Npb25EYXRhLCBWcmZEa2dTdGF0ZSB9IGZyb20gJy4vdHlwZXMnO1xuXG50eXBlIE5vZGVXYXNtZXIgPSB0eXBlb2YgaW1wb3J0KCdAYml0Z28vd2FzbS1tcHMnKTtcbnR5cGUgV2ViV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQGJpdGdvL3dhc20tbXBzL3dlYicpO1xudHlwZSBXYXNtTXBzID0gTm9kZVdhc21lciB8IFdlYldhc21lcjtcblxuLyoqXG4gKiBSb3VuZCBkcml2ZXIgZm9yIHRoZSBFZERTQSBNUFMgVlJGIERLRywgd2hpY2ggcHJvZHVjZXMgYSBSaXN0cmV0dG8gVlJGIGtleXNoYXJlLlxuICpcbiAqIFR3byBtZXNzYWdlIGV4Y2hhbmdlczogcm91bmQgMCBicm9hZGNhc3RzIFZyZktleWdlbk1zZzEsIHJvdW5kIDEgZW1pdHMgcGVyLXJlY2lwaWVudFxuICogVnJmS2V5Z2VuTXNnMiBhcyBwMnAgbWVzc2FnZXMsIHJvdW5kIDIgcmV0dXJucyB0aGUgVnJmU2hhcmUuIFRoZXJlIGlzIG5vIGNoYWluLWNvZGVcbiAqIGNvbW1pdG1lbnQgc3RlcCwgdW5saWtlIHRoZSBzaWduaW5nIERLRy5cbiAqXG4gKiBDYWxsZXJzIHBhc3MgZXZlcnkgbWVzc2FnZSB0aGV5IGhvbGQ7IHRoaXMgY2xhc3Mgcm91dGVzIHRoZW0gaW50ZXJuYWxseS4gUm91bmQgMVxuICogbXVzdCBleGNsdWRlIHRoZSBwYXJ0eSdzIG93biBjb21taXRtZW50ICh0aGUgd2FzbSByZWplY3RzIGEgc2VuZGVyIHNldCBjb250YWluaW5nXG4gKiBpdCkgYW5kIHJvdW5kIDIgY29uc3VtZXMgdGhlIG9wZW5pbmdzIGFkZHJlc3NlZCB0byB0aGlzIHBhcnR5LlxuICpcbiAqIFBhcnR5IGluZGljZXMgZm9sbG93IHRoZSBNUEN2MiBjb252ZW50aW9uOiAwID0gdXNlciwgMSA9IGJhY2t1cCwgMiA9IGJpdGdvLlxuICogYFZyZlNoYXJlYCBleHBvc2VzIG9ubHkgc2hhcmUgYnl0ZXMg4oCUIG5vIHB1YmxpYyBrZXksIGtleSBpZCwgb3Igcm9vdCBjaGFpbiBjb2RlLlxuICovXG5leHBvcnQgY2xhc3MgVnJmRGtnIHtcbiAgcHJvdGVjdGVkIG46IG51bWJlcjtcbiAgcHJvdGVjdGVkIHQ6IG51bWJlcjtcbiAgcHJvdGVjdGVkIHBhcnR5SWR4OiBudW1iZXI7XG4gIHByb3RlY3RlZCBzZWVkOiBCdWZmZXIgfCB1bmRlZmluZWQ7XG4gIC8qKiBPcGFxdWUgd2FzbSByb3VuZC1zdGF0ZSBieXRlcy4gU2VjcmV0IGtleSBtYXRlcmlhbC4gKi9cbiAgcHJvdGVjdGVkIHZyZlN0YXRlQnl0ZXM6IEJ1ZmZlciB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGtleVNoYXJlQnVmZjogQnVmZmVyIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgdnJmU3RhdGU6IFZyZkRrZ1N0YXRlID0gVnJmRGtnU3RhdGUuVW5pbml0aWFsaXplZDtcbiAgcHJpdmF0ZSB3YXNtTXBzOiBXYXNtTXBzIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IobjogbnVtYmVyLCB0OiBudW1iZXIsIHBhcnR5SWR4OiBudW1iZXIsIHNlZWQ/OiBCdWZmZXIpIHtcbiAgICB0aGlzLm4gPSBuO1xuICAgIHRoaXMudCA9IHQ7XG4gICAgdGhpcy5wYXJ0eUlkeCA9IHBhcnR5SWR4O1xuICAgIHRoaXMuc2VlZCA9IHNlZWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRXYXNtTXBzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy53YXNtTXBzKSB7XG4gICAgICAvLyBFbGVjdHJvbiByZW5kZXJlciBzZXRzIHByb2Nlc3MudHlwZSBhbmQgbXVzdCB1c2UgdGhlIG5vZGUgd2FzbSBidWlsZC5cbiAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucHJvY2Vzcz8uWyd0eXBlJ10gIT09ICdyZW5kZXJlcicpIHtcbiAgICAgICAgLy8gQnJvd3Nlcjogd2ViIGJ1aWxkIGhhcyBleHBsaWNpdCBpbml0KCkg4oCUIGd1YXJhbnRlZWQgcmVhZHkgYWZ0ZXIgYXdhaXRcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzIC0tIEBiaXRnby93YXNtLW1wcyBleHBvc2VzIGVudmlyb25tZW50LXNwZWNpZmljIHN1YnBhdGggZXhwb3J0cy5cbiAgICAgICAgY29uc3Qgd2ViV2FzbSA9IGF3YWl0IGltcG9ydCgnQGJpdGdvL3dhc20tbXBzL3dlYicpO1xuICAgICAgICBhd2FpdCB3ZWJXYXNtLmRlZmF1bHQoKTtcbiAgICAgICAgdGhpcy53YXNtTXBzID0gd2ViV2FzbTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vZGUuanM6IGR5bmFtaWMgaW1wb3J0KCkgcmV3cml0dGVuIHRvIHJlcXVpcmUoKSBieSB0c2Mg4oaSIENKUyBidWlsZCDihpIgcmVhZEZpbGVTeW5jXG4gICAgICAgIHRoaXMud2FzbU1wcyA9IGF3YWl0IGltcG9ydCgnQGJpdGdvL3dhc20tbXBzJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRXYXNtTXBzKCk6IFdhc21NcHMge1xuICAgIGlmICghdGhpcy53YXNtTXBzKSB7XG4gICAgICB0aHJvdyBFcnJvcignV0FTTSBtb2R1bGUgbm90IGxvYWRlZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy53YXNtTXBzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRWcmZTdGF0ZUJ5dGVzKCk6IEJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLnZyZlN0YXRlQnl0ZXMpIHtcbiAgICAgIHRocm93IEVycm9yKGBWUkYgREtHIHN0YXRlIGJ5dGVzIG1pc3NpbmcgaW4gc3RhdGUgJHt0aGlzLnZyZlN0YXRlfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52cmZTdGF0ZUJ5dGVzO1xuICB9XG5cbiAgZ2V0U3RhdGUoKTogVnJmRGtnU3RhdGUge1xuICAgIHJldHVybiB0aGlzLnZyZlN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGlzIHBhcnR5J3MgVlJGIERLRyBjb21taXRtZW50IChWcmZLZXlnZW5Nc2cxLCBicm9hZGNhc3QpLlxuICAgKi9cbiAgYXN5bmMgaW5pdERrZygpOiBQcm9taXNlPERlc2VyaWFsaXplZE1lc3NhZ2VzPiB7XG4gICAgYXdhaXQgdGhpcy5sb2FkV2FzbU1wcygpO1xuICAgIGlmICh0aGlzLnQgPiB0aGlzLm4gfHwgdGhpcy5wYXJ0eUlkeCA+PSB0aGlzLm4pIHtcbiAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIHBhcmFtZXRlcnMgZm9yIFZSRiBES0cnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VlZCAmJiB0aGlzLnNlZWQubGVuZ3RoICE9PSAzMikge1xuICAgICAgdGhyb3cgRXJyb3IoYFNlZWQgc2hvdWxkIGJlIDMyIGJ5dGVzLCBnb3QgJHt0aGlzLnNlZWQubGVuZ3RofS5gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudnJmU3RhdGUgIT09IFZyZkRrZ1N0YXRlLlVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdWUkYgREtHIHNlc3Npb24gYWxyZWFkeSBpbml0aWFsaXplZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHdhc20gPSB0aGlzLmdldFdhc21NcHMoKTtcbiAgICBsZXQgcmVzdWx0OiBNc2dTdGF0ZTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gd2FzbS5lZDI1NTE5X3ZyZl9ka2dfcm91bmQwX3Byb2Nlc3ModGhpcy5wYXJ0eUlkeCwgdGhpcy5zZWVkID8/IGNyeXB0by5yYW5kb21CeXRlcygzMikpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgZmlyc3QgVlJGIG1lc3NhZ2UgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9OiAke2Vycn1gKTtcbiAgICB9XG4gICAgY29uc3QgcGF5bG9hZCA9IG5ldyBVaW50OEFycmF5KHJlc3VsdC5tc2cpO1xuICAgIHRoaXMudnJmU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGF0ZSk7XG4gICAgcmVzdWx0LmZyZWUoKTtcbiAgICB0aGlzLnZyZlN0YXRlID0gVnJmRGtnU3RhdGUuUm91bmQxO1xuICAgIHJldHVybiB7IGJyb2FkY2FzdE1lc3NhZ2VzOiBbeyBwYXlsb2FkLCBmcm9tOiB0aGlzLnBhcnR5SWR4IH1dLCBwMnBNZXNzYWdlczogW10gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHRoZSBtZXNzYWdlcyB0aGlzIHBhcnR5IGhvbGRzIGZvciB0aGUgY3VycmVudCByb3VuZCBhbmQgcmV0dXJuIHRoaXNcbiAgICogcGFydHkncyBtZXNzYWdlcyBmb3IgdGhlIG5leHQgcm91bmQuIENhbGxlcnMgcGFzcyBldmVyeXRoaW5nIHRoZXkgaG9sZDsgdGhlXG4gICAqIHJvdW5kIHJvdXRpbmcgaGFwcGVucyBoZXJlOlxuICAgKlxuICAgKiAtIFJvdW5kIDE6IGNvbnN1bWVzIHRoZSBvdGhlciBwYXJ0aWVzJyBjb21taXRtZW50cyAob3duIGV4Y2x1ZGVkKSBhbmQgZW1pdHNcbiAgICogICBwZXItcmVjaXBpZW50IG9wZW5pbmdzIChWcmZLZXlnZW5Nc2cyKSBhcyBwMnAgbWVzc2FnZXMuXG4gICAqIC0gUm91bmQgMjogY29uc3VtZXMgdGhlIG9wZW5pbmdzIGFkZHJlc3NlZCB0byB0aGlzIHBhcnR5IGFuZCBmaW5hbGl6ZXMgdGhlIERLRy5cbiAgICovXG4gIGFzeW5jIGhhbmRsZUluY29taW5nTWVzc2FnZXMobWVzc2FnZXNGb3JJdGhSb3VuZDogRGVzZXJpYWxpemVkTWVzc2FnZXMpOiBQcm9taXNlPERlc2VyaWFsaXplZE1lc3NhZ2VzPiB7XG4gICAgYXdhaXQgdGhpcy5sb2FkV2FzbU1wcygpO1xuICAgIGlmICh0aGlzLnZyZlN0YXRlID09PSBWcmZEa2dTdGF0ZS5Db21wbGV0ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1ZSRiBES0cgc2Vzc2lvbiBhbHJlYWR5IGNvbXBsZXRlZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy52cmZTdGF0ZSA9PT0gVnJmRGtnU3RhdGUuVW5pbml0aWFsaXplZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1ZSRiBES0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgY29uc3Qgd2FzbSA9IHRoaXMuZ2V0V2FzbU1wcygpO1xuXG4gICAgc3dpdGNoICh0aGlzLnZyZlN0YXRlKSB7XG4gICAgICBjYXNlIFZyZkRrZ1N0YXRlLlJvdW5kMToge1xuICAgICAgICBjb25zdCBvdGhlcnNDb21taXRtZW50cyA9IG1lc3NhZ2VzRm9ySXRoUm91bmQuYnJvYWRjYXN0TWVzc2FnZXNcbiAgICAgICAgICAuZmlsdGVyKChtKSA9PiBtLmZyb20gIT09IHRoaXMucGFydHlJZHgpXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuZnJvbSAtIGIuZnJvbSlcbiAgICAgICAgICAubWFwKChtKSA9PiBtLnBheWxvYWQpO1xuICAgICAgICBsZXQgcmVzdWx0OiBNc2dTdGF0ZU1hcDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXN1bHQgPSB3YXNtLmVkMjU1MTlfdnJmX2RrZ19yb3VuZDFfcHJvY2VzcyhvdGhlcnNDb21taXRtZW50cywgdGhpcy5nZXRWcmZTdGF0ZUJ5dGVzKCkpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3Igd2hpbGUgY3JlYXRpbmcgVlJGIG1lc3NhZ2VzIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fSwgc3RhdGUgJHt0aGlzLnZyZlN0YXRlfTogJHtlcnJ9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3BlbmluZ3MgPSBPYmplY3QuZW50cmllcyhkZWNvZGVWcmZSb3VuZDFNc2dNYXAocmVzdWx0Lm1zZykpLm1hcCgoW3JlY2lwaWVudCwgcGF5bG9hZF0pID0+ICh7XG4gICAgICAgICAgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocGF5bG9hZCksXG4gICAgICAgICAgZnJvbTogdGhpcy5wYXJ0eUlkeCxcbiAgICAgICAgICB0bzogZGVjb2RlUGFydHlJZChyZWNpcGllbnQpLFxuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMudnJmU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGF0ZSk7XG4gICAgICAgIHJlc3VsdC5mcmVlKCk7XG4gICAgICAgIHRoaXMudnJmU3RhdGUgPSBWcmZEa2dTdGF0ZS5Sb3VuZDI7XG4gICAgICAgIHJldHVybiB7IGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSwgcDJwTWVzc2FnZXM6IG9wZW5pbmdzIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVnJmRGtnU3RhdGUuUm91bmQyOiB7XG4gICAgICAgIGNvbnN0IG9wZW5pbmdzRm9yTWUgPSBtZXNzYWdlc0Zvckl0aFJvdW5kLnAycE1lc3NhZ2VzXG4gICAgICAgICAgLmZpbHRlcigobSkgPT4gbS50byA9PT0gdGhpcy5wYXJ0eUlkeClcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5mcm9tIC0gYi5mcm9tKVxuICAgICAgICAgIC5tYXAoKG0pID0+IG0ucGF5bG9hZCk7XG4gICAgICAgIGxldCBzaGFyZTogVnJmU2hhcmU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc2hhcmUgPSB3YXNtLmVkMjU1MTlfdnJmX2RrZ19yb3VuZDJfcHJvY2VzcyhvcGVuaW5nc0Zvck1lLCB0aGlzLmdldFZyZlN0YXRlQnl0ZXMoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFcnJvciB3aGlsZSBjcmVhdGluZyBWUkYgbWVzc2FnZXMgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9LCBzdGF0ZSAke3RoaXMudnJmU3RhdGV9OiAke2Vycn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmtleVNoYXJlQnVmZiA9IEJ1ZmZlci5mcm9tKHNoYXJlLnNoYXJlKTtcbiAgICAgICAgc2hhcmUuZnJlZSgpO1xuICAgICAgICB0aGlzLnZyZlN0YXRlQnl0ZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudnJmU3RhdGUgPSBWcmZEa2dTdGF0ZS5Db21wbGV0ZTtcbiAgICAgICAgcmV0dXJuIHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLCBwMnBNZXNzYWdlczogW10gfTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgVlJGIERLRyBzdGF0ZTogJHt0aGlzLnZyZlN0YXRlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFZSRiBrZXlzaGFyZSBieXRlcyBvbmNlIHRoZSBES0cgaXMgY29tcGxldGUuXG4gICAqIFRoaXMgYnVmZmVyIGlzIHByaXZhdGUga2V5IG1hdGVyaWFsLlxuICAgKi9cbiAgZ2V0S2V5U2hhcmUoKTogQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMua2V5U2hhcmVCdWZmKSB7XG4gICAgICB0aHJvdyBFcnJvcignQ2FuIG5vdCBnZXQga2V5IHNoYXJlLCBWUkYgREtHIGlzIG5vdCBjb21wbGV0ZSB5ZXQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmtleVNoYXJlQnVmZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgc2Vzc2lvbiBkYXRhIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVzdG9yZSB0aGUgc2Vzc2lvbiBsYXRlci5cbiAgICpcbiAgICogVGhlIHJldHVybmVkIHN0YXRlIGJ5dGVzIGFyZSBzZWNyZXQga2V5IG1hdGVyaWFsIOKAlCB0aGV5IGNhcnJ5IHRoaXMgcGFydHknc1xuICAgKiBzZWNyZXQgVlJGIHNoYXJlLiBUaGV5IG11c3QgbmV2ZXIgYmUgbG9nZ2VkIG9yIHBlcnNpc3RlZCBpbiB0aGUgY2xlYXIuXG4gICAqL1xuICBnZXRTZXNzaW9uRGF0YSgpOiBWcmZEa2dTZXNzaW9uRGF0YSB7XG4gICAgaWYgKHRoaXMudnJmU3RhdGUgPT09IFZyZkRrZ1N0YXRlLlVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdWUkYgREtHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHNlc3Npb25EYXRhOiBWcmZEa2dTZXNzaW9uRGF0YSA9IHsgdnJmU3RhdGU6IHRoaXMudnJmU3RhdGUgfTtcbiAgICBpZiAodGhpcy52cmZTdGF0ZUJ5dGVzKSB7XG4gICAgICBzZXNzaW9uRGF0YS52cmZTdGF0ZUJ5dGVzID0gdGhpcy52cmZTdGF0ZUJ5dGVzO1xuICAgIH1cbiAgICBpZiAodGhpcy5rZXlTaGFyZUJ1ZmYpIHtcbiAgICAgIHNlc3Npb25EYXRhLmtleVNoYXJlQnVmZiA9IHRoaXMua2V5U2hhcmVCdWZmO1xuICAgIH1cbiAgICByZXR1cm4gc2Vzc2lvbkRhdGE7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBhIFZSRiBES0cgc2Vzc2lvbiBmcm9tIHByZXZpb3VzIHNlc3Npb24gZGF0YS5cbiAgICogTVBTIHdhc20gc3RhdGUgYnl0ZXMgaGF2ZSBubyByb3VuZCB0YWcsIHNvIHRoZSBwZXJzaXN0ZWQgYHZyZlN0YXRlYCBpcyB1c2VkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlc3RvcmVTZXNzaW9uKG46IG51bWJlciwgdDogbnVtYmVyLCBwYXJ0eUlkeDogbnVtYmVyLCBzZXNzaW9uRGF0YTogdW5rbm93bik6IFByb21pc2U8VnJmRGtnPiB7XG4gICAgY29uc3QgZGF0YSA9IGRlY29kZVZyZkRrZ1Nlc3Npb25EYXRhKHNlc3Npb25EYXRhKTtcbiAgICBjb25zdCB2cmZEa2cgPSBuZXcgVnJmRGtnKG4sIHQsIHBhcnR5SWR4KTtcbiAgICBzd2l0Y2ggKGRhdGEudnJmU3RhdGUpIHtcbiAgICAgIGNhc2UgVnJmRGtnU3RhdGUuUm91bmQxOlxuICAgICAgY2FzZSBWcmZEa2dTdGF0ZS5Sb3VuZDI6XG4gICAgICAgIGlmICghZGF0YS52cmZTdGF0ZUJ5dGVzKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoYENhbm5vdCByZXN0b3JlIFZSRiBES0cgc2Vzc2lvbiBpbiBzdGF0ZSAke2RhdGEudnJmU3RhdGV9IHdpdGhvdXQgc3RhdGUgYnl0ZXNgKTtcbiAgICAgICAgfVxuICAgICAgICB2cmZEa2cudnJmU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKGRhdGEudnJmU3RhdGVCeXRlcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWcmZEa2dTdGF0ZS5Db21wbGV0ZTpcbiAgICAgICAgaWYgKCFkYXRhLmtleVNoYXJlQnVmZikge1xuICAgICAgICAgIHRocm93IEVycm9yKCdDYW5ub3QgcmVzdG9yZSBhIGNvbXBsZXRlZCBWUkYgREtHIHNlc3Npb24gd2l0aG91dCBhIGtleSBzaGFyZScpO1xuICAgICAgICB9XG4gICAgICAgIHZyZkRrZy5rZXlTaGFyZUJ1ZmYgPSBkYXRhLmtleVNoYXJlQnVmZjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBWUkYgREtHIHN0YXRlOiAke2RhdGEudnJmU3RhdGV9YCk7XG4gICAgfVxuICAgIHZyZkRrZy52cmZTdGF0ZSA9IGRhdGEudnJmU3RhdGU7XG4gICAgcmV0dXJuIHZyZkRrZztcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps-vrf/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,OAAO,CAAC;AAChC,OAAO,KAAK,WAAW,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,WAAW,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
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.MpsVrfUtils = exports.MpsVrfTypes = exports.MpsVrf = void 0;
|
|
37
|
+
exports.MpsVrf = __importStar(require("./dkg"));
|
|
38
|
+
exports.MpsVrfTypes = __importStar(require("./types"));
|
|
39
|
+
exports.MpsVrfUtils = __importStar(require("./util"));
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL2VkZHNhLW1wcy12cmYvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQWdDO0FBQ2hDLHVEQUF1QztBQUN2QyxzREFBc0MiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBhcyBNcHNWcmYgZnJvbSAnLi9ka2cnO1xuZXhwb3J0ICogYXMgTXBzVnJmVHlwZXMgZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgKiBhcyBNcHNWcmZVdGlscyBmcm9tICcuL3V0aWwnO1xuIl19
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Buffer } from 'buffer';
|
|
2
|
+
/**
|
|
3
|
+
* States of the VRF DKG state machine. Kept separate from `eddsa-mps`'s signing
|
|
4
|
+
* `DkgState` because the round counts differ. MPS wasm state bytes have no round
|
|
5
|
+
* tag, so the round is tracked here and carried in `VrfDkgSessionData`.
|
|
6
|
+
*/
|
|
7
|
+
export declare enum VrfDkgState {
|
|
8
|
+
Uninitialized = 0,
|
|
9
|
+
/** Commitment created and broadcast; waiting for the other parties' VrfKeygenMsg1. */
|
|
10
|
+
Round1 = 1,
|
|
11
|
+
/** Openings created; waiting for the VrfKeygenMsg2 entries addressed to this party. */
|
|
12
|
+
Round2 = 2,
|
|
13
|
+
Complete = 3,
|
|
14
|
+
InvalidState = 4
|
|
15
|
+
}
|
|
16
|
+
export interface VrfDkgSessionData {
|
|
17
|
+
/**
|
|
18
|
+
* Serialized wasm round state. Secret key material — it carries this party's
|
|
19
|
+
* secret VRF share. Never log it or persist it in the clear.
|
|
20
|
+
*/
|
|
21
|
+
vrfStateBytes?: Uint8Array;
|
|
22
|
+
vrfState: VrfDkgState;
|
|
23
|
+
keyShareBuff?: Buffer;
|
|
24
|
+
}
|
|
25
|
+
/** Decode a wasm round-1 map key as a party index. */
|
|
26
|
+
export declare function decodePartyId(recipient: string): number;
|
|
27
|
+
/** Decode the wasm round-1 recipient → bytes map. */
|
|
28
|
+
export declare function decodeVrfRound1MsgMap(msg: unknown): Record<string, Uint8Array>;
|
|
29
|
+
/** Decode persisted VRF DKG session data. */
|
|
30
|
+
export declare function decodeVrfDkgSessionData(sessionData: unknown): VrfDkgSessionData;
|
|
31
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps-vrf/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC;;;;GAIG;AACH,oBAAY,WAAW;IACrB,aAAa,IAAI;IACjB,sFAAsF;IACtF,MAAM,IAAA;IACN,uFAAuF;IACvF,MAAM,IAAA;IACN,QAAQ,IAAA;IACR,YAAY,IAAA;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,QAAQ,EAAE,WAAW,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAgCD,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED,qDAAqD;AACrD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAM9E;AAED,6CAA6C;AAC7C,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,OAAO,GAAG,iBAAiB,CAM/E"}
|