@bitgo-beta/sdk-lib-mpc 8.2.1-alpha.467 → 8.2.1-alpha.469

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/src/tss/dkls-vrf/dkg.d.ts +91 -0
  2. package/dist/src/tss/dkls-vrf/dkg.d.ts.map +1 -0
  3. package/dist/src/tss/dkls-vrf/dkg.js +278 -0
  4. package/dist/src/tss/dkls-vrf/index.d.ts +4 -0
  5. package/dist/src/tss/dkls-vrf/index.d.ts.map +1 -0
  6. package/dist/src/tss/dkls-vrf/index.js +40 -0
  7. package/dist/src/tss/dkls-vrf/types.d.ts +28 -0
  8. package/dist/src/tss/dkls-vrf/types.d.ts.map +1 -0
  9. package/dist/src/tss/dkls-vrf/types.js +23 -0
  10. package/dist/src/tss/dkls-vrf/util.d.ts +29 -0
  11. package/dist/src/tss/dkls-vrf/util.d.ts.map +1 -0
  12. package/dist/src/tss/dkls-vrf/util.js +113 -0
  13. package/dist/src/tss/ecdsa-dkls/derive.d.ts +111 -0
  14. package/dist/src/tss/ecdsa-dkls/derive.d.ts.map +1 -0
  15. package/dist/src/tss/ecdsa-dkls/derive.js +329 -0
  16. package/dist/src/tss/ecdsa-dkls/dkg.d.ts +3 -1
  17. package/dist/src/tss/ecdsa-dkls/dkg.d.ts.map +1 -1
  18. package/dist/src/tss/ecdsa-dkls/dkg.js +1 -1
  19. package/dist/src/tss/ecdsa-dkls/index.d.ts +1 -0
  20. package/dist/src/tss/ecdsa-dkls/index.d.ts.map +1 -1
  21. package/dist/src/tss/ecdsa-dkls/index.js +3 -2
  22. package/dist/src/tss/eddsa-mps/derive.d.ts +34 -0
  23. package/dist/src/tss/eddsa-mps/derive.d.ts.map +1 -0
  24. package/dist/src/tss/eddsa-mps/derive.js +198 -0
  25. package/dist/src/tss/eddsa-mps/dkg.d.ts +7 -2
  26. package/dist/src/tss/eddsa-mps/dkg.d.ts.map +1 -1
  27. package/dist/src/tss/eddsa-mps/dkg.js +13 -3
  28. package/dist/src/tss/eddsa-mps/index.d.ts +2 -0
  29. package/dist/src/tss/eddsa-mps/index.d.ts.map +1 -1
  30. package/dist/src/tss/eddsa-mps/index.js +3 -2
  31. package/dist/src/tss/eddsa-mps/types.d.ts +13 -0
  32. package/dist/src/tss/eddsa-mps/types.d.ts.map +1 -1
  33. package/dist/src/tss/eddsa-mps/types.js +1 -1
  34. package/dist/src/tss/eddsa-mps/util.d.ts +2 -2
  35. package/dist/src/tss/eddsa-mps/util.d.ts.map +1 -1
  36. package/dist/src/tss/eddsa-mps/util.js +5 -5
  37. package/dist/src/tss/eddsa-mps-vrf/dkg.d.ts +65 -0
  38. package/dist/src/tss/eddsa-mps-vrf/dkg.d.ts.map +1 -0
  39. package/dist/src/tss/eddsa-mps-vrf/dkg.js +246 -0
  40. package/dist/src/tss/eddsa-mps-vrf/index.d.ts +4 -0
  41. package/dist/src/tss/eddsa-mps-vrf/index.d.ts.map +1 -0
  42. package/dist/src/tss/eddsa-mps-vrf/index.js +40 -0
  43. package/dist/src/tss/eddsa-mps-vrf/types.d.ts +31 -0
  44. package/dist/src/tss/eddsa-mps-vrf/types.d.ts.map +1 -0
  45. package/dist/src/tss/eddsa-mps-vrf/types.js +97 -0
  46. package/dist/src/tss/eddsa-mps-vrf/util.d.ts +9 -0
  47. package/dist/src/tss/eddsa-mps-vrf/util.d.ts.map +1 -0
  48. package/dist/src/tss/eddsa-mps-vrf/util.js +36 -0
  49. package/dist/src/tss/index.d.ts +3 -0
  50. package/dist/src/tss/index.d.ts.map +1 -1
  51. package/dist/src/tss/index.js +4 -1
  52. package/dist/src/tss/redpallas-mps/commsLayer.d.ts +34 -0
  53. package/dist/src/tss/redpallas-mps/commsLayer.d.ts.map +1 -0
  54. package/dist/src/tss/redpallas-mps/commsLayer.js +100 -0
  55. package/dist/src/tss/redpallas-mps/dkg.d.ts +103 -0
  56. package/dist/src/tss/redpallas-mps/dkg.d.ts.map +1 -0
  57. package/dist/src/tss/redpallas-mps/dkg.js +285 -0
  58. package/dist/src/tss/redpallas-mps/dsg.d.ts +108 -0
  59. package/dist/src/tss/redpallas-mps/dsg.d.ts.map +1 -0
  60. package/dist/src/tss/redpallas-mps/dsg.js +355 -0
  61. package/dist/src/tss/redpallas-mps/index.d.ts +7 -0
  62. package/dist/src/tss/redpallas-mps/index.d.ts.map +1 -0
  63. package/dist/src/tss/redpallas-mps/index.js +42 -0
  64. package/dist/src/tss/redpallas-mps/types.d.ts +85 -0
  65. package/dist/src/tss/redpallas-mps/types.d.ts.map +1 -0
  66. package/dist/src/tss/redpallas-mps/types.js +112 -0
  67. package/dist/src/tss/redpallas-mps/util.d.ts +43 -0
  68. package/dist/src/tss/redpallas-mps/util.d.ts.map +1 -0
  69. package/dist/src/tss/redpallas-mps/util.js +147 -0
  70. package/dist/tsconfig.tsbuildinfo +1 -1
  71. package/package.json +20 -6
@@ -0,0 +1,112 @@
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.RedPallasDsgState = exports.RedPallasDkgState = exports.RedPallasReducedKeyShareType = void 0;
37
+ exports.serializeMessage = serializeMessage;
38
+ exports.deserializeMessage = deserializeMessage;
39
+ exports.serializeMessages = serializeMessages;
40
+ exports.deserializeMessages = deserializeMessages;
41
+ exports.getDecodedReducedKeyShare = getDecodedReducedKeyShare;
42
+ const cbor_x_1 = require("cbor-x");
43
+ const Either_1 = require("fp-ts/Either");
44
+ const t = __importStar(require("io-ts"));
45
+ exports.RedPallasReducedKeyShareType = t.type({
46
+ keyShare: t.array(t.number),
47
+ pub: t.array(t.number),
48
+ });
49
+ /**
50
+ * Represents the state of a RedPallas DKG (Distributed Key Generation) session.
51
+ *
52
+ * Unlike the EdDSA MPS `DkgState`, there is no `Share` state: `redpallas_dkg_round2_process`
53
+ * returns a `MsgDerivationInit` (msg/pk/share/state) directly, completing the DKG session in
54
+ * one step. Key derivation (ask/nk/rivk/ivks) is a separate, subsequent, platform-side-only
55
+ * process (`redpallas_derivation_process`) not modelled here.
56
+ */
57
+ var RedPallasDkgState;
58
+ (function (RedPallasDkgState) {
59
+ /** DKG session has not been initialized */
60
+ RedPallasDkgState["Uninitialized"] = "Uninitialized";
61
+ /** DKG session has been initialized (Init state in WASM) */
62
+ RedPallasDkgState["Init"] = "Init";
63
+ /** DKG session is waiting for first message (WaitMsg1 state in WASM) */
64
+ RedPallasDkgState["WaitMsg1"] = "WaitMsg1";
65
+ /** DKG session is waiting for second message (WaitMsg2 state in WASM) */
66
+ RedPallasDkgState["WaitMsg2"] = "WaitMsg2";
67
+ /** DKG session has completed successfully and key shares are available */
68
+ RedPallasDkgState["Complete"] = "Complete";
69
+ })(RedPallasDkgState || (exports.RedPallasDkgState = RedPallasDkgState = {}));
70
+ /**
71
+ * Represents the state of a RedPallas DSG (Distributed Sign Generation) session.
72
+ *
73
+ * Mirrors the EdDSA MPS `DsgState`, except `redpallas_dsg_round0_process` does not take a
74
+ * derivation path: RedPallas key derivation (ask/nk/rivk/ivks) happens separately, upstream,
75
+ * as part of DKG (see `RedPallasDkgState`); the DSG round functions only ever operate on an
76
+ * already-derived (or root) `Keyshare`.
77
+ */
78
+ var RedPallasDsgState;
79
+ (function (RedPallasDsgState) {
80
+ /** DSG session has not been initialized */
81
+ RedPallasDsgState["Uninitialized"] = "Uninitialized";
82
+ /** initDsg() has been called; ready for getFirstMessage() */
83
+ RedPallasDsgState["Init"] = "Init";
84
+ /** R0 broadcast emitted; waiting for counterpart's R0 broadcast (SignMsg1) */
85
+ RedPallasDsgState["WaitMsg1"] = "WaitMsg1";
86
+ /** R1 broadcast emitted; waiting for counterpart's R1 broadcast (SignMsg2) */
87
+ RedPallasDsgState["WaitMsg2"] = "WaitMsg2";
88
+ /** R2 broadcast emitted; waiting for counterpart's R2 broadcast (SignMsg3, the partial sig) */
89
+ RedPallasDsgState["WaitMsg3"] = "WaitMsg3";
90
+ /** Final RedPallas signature (signature/rk/alpha) is available via getSignature() */
91
+ RedPallasDsgState["Complete"] = "Complete";
92
+ })(RedPallasDsgState || (exports.RedPallasDsgState = RedPallasDsgState = {}));
93
+ function serializeMessage(msg) {
94
+ return { from: msg.from, payload: Buffer.from(msg.payload).toString('base64') };
95
+ }
96
+ function deserializeMessage(msg) {
97
+ return { from: msg.from, payload: Buffer.from(msg.payload, 'base64') };
98
+ }
99
+ function serializeMessages(msgs) {
100
+ return msgs.map(serializeMessage);
101
+ }
102
+ function deserializeMessages(msgs) {
103
+ return msgs.map(deserializeMessage);
104
+ }
105
+ function getDecodedReducedKeyShare(reducedKeyShare) {
106
+ const decoded = exports.RedPallasReducedKeyShareType.decode((0, cbor_x_1.decode)(reducedKeyShare));
107
+ if ((0, Either_1.isLeft)(decoded)) {
108
+ throw new Error(`Unable to parse reducedKeyShare: ${decoded.left}`);
109
+ }
110
+ return decoded.right;
111
+ }
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL3JlZHBhbGxhcy1tcHMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkZBLDRDQUVDO0FBRUQsZ0RBRUM7QUFFRCw4Q0FFQztBQUVELGtEQUVDO0FBRUQsOERBTUM7QUFuSEQsbUNBQWdDO0FBQ2hDLHlDQUFzQztBQUN0Qyx5Q0FBMkI7QUFFZCxRQUFBLDRCQUE0QixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDakQsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMzQixHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0NBQ3ZCLENBQUMsQ0FBQztBQUlIOzs7Ozs7O0dBT0c7QUFDSCxJQUFZLGlCQVdYO0FBWEQsV0FBWSxpQkFBaUI7SUFDM0IsMkNBQTJDO0lBQzNDLG9EQUErQixDQUFBO0lBQy9CLDREQUE0RDtJQUM1RCxrQ0FBYSxDQUFBO0lBQ2Isd0VBQXdFO0lBQ3hFLDBDQUFxQixDQUFBO0lBQ3JCLHlFQUF5RTtJQUN6RSwwQ0FBcUIsQ0FBQTtJQUNyQiwwRUFBMEU7SUFDMUUsMENBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQVhXLGlCQUFpQixpQ0FBakIsaUJBQWlCLFFBVzVCO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILElBQVksaUJBYVg7QUFiRCxXQUFZLGlCQUFpQjtJQUMzQiwyQ0FBMkM7SUFDM0Msb0RBQStCLENBQUE7SUFDL0IsNkRBQTZEO0lBQzdELGtDQUFhLENBQUE7SUFDYiw4RUFBOEU7SUFDOUUsMENBQXFCLENBQUE7SUFDckIsOEVBQThFO0lBQzlFLDBDQUFxQixDQUFBO0lBQ3JCLCtGQUErRjtJQUMvRiwwQ0FBcUIsQ0FBQTtJQUNyQixxRkFBcUY7SUFDckYsMENBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQWJXLGlCQUFpQixpQ0FBakIsaUJBQWlCLFFBYTVCO0FBd0NELFNBQWdCLGdCQUFnQixDQUFDLEdBQXdCO0lBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7QUFDbEYsQ0FBQztBQUVELFNBQWdCLGtCQUFrQixDQUFDLEdBQXNCO0lBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7QUFDekUsQ0FBQztBQUVELFNBQWdCLGlCQUFpQixDQUFDLElBQTBCO0lBQzFELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRCxTQUFnQixtQkFBbUIsQ0FBQyxJQUF3QjtJQUMxRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBRUQsU0FBZ0IseUJBQXlCLENBQUMsZUFBb0M7SUFDNUUsTUFBTSxPQUFPLEdBQUcsb0NBQTRCLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBTSxFQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFDN0UsSUFBSSxJQUFBLGVBQU0sRUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlY29kZSB9IGZyb20gJ2Nib3IteCc7XG5pbXBvcnQgeyBpc0xlZnQgfSBmcm9tICdmcC10cy9FaXRoZXInO1xuaW1wb3J0ICogYXMgdCBmcm9tICdpby10cyc7XG5cbmV4cG9ydCBjb25zdCBSZWRQYWxsYXNSZWR1Y2VkS2V5U2hhcmVUeXBlID0gdC50eXBlKHtcbiAga2V5U2hhcmU6IHQuYXJyYXkodC5udW1iZXIpLFxuICBwdWI6IHQuYXJyYXkodC5udW1iZXIpLFxufSk7XG5cbmV4cG9ydCB0eXBlIFJlZFBhbGxhc1JlZHVjZWRLZXlTaGFyZSA9IHQuVHlwZU9mPHR5cGVvZiBSZWRQYWxsYXNSZWR1Y2VkS2V5U2hhcmVUeXBlPjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiBhIFJlZFBhbGxhcyBES0cgKERpc3RyaWJ1dGVkIEtleSBHZW5lcmF0aW9uKSBzZXNzaW9uLlxuICpcbiAqIFVubGlrZSB0aGUgRWREU0EgTVBTIGBEa2dTdGF0ZWAsIHRoZXJlIGlzIG5vIGBTaGFyZWAgc3RhdGU6IGByZWRwYWxsYXNfZGtnX3JvdW5kMl9wcm9jZXNzYFxuICogcmV0dXJucyBhIGBNc2dEZXJpdmF0aW9uSW5pdGAgKG1zZy9way9zaGFyZS9zdGF0ZSkgZGlyZWN0bHksIGNvbXBsZXRpbmcgdGhlIERLRyBzZXNzaW9uIGluXG4gKiBvbmUgc3RlcC4gS2V5IGRlcml2YXRpb24gKGFzay9uay9yaXZrL2l2a3MpIGlzIGEgc2VwYXJhdGUsIHN1YnNlcXVlbnQsIHBsYXRmb3JtLXNpZGUtb25seVxuICogcHJvY2VzcyAoYHJlZHBhbGxhc19kZXJpdmF0aW9uX3Byb2Nlc3NgKSBub3QgbW9kZWxsZWQgaGVyZS5cbiAqL1xuZXhwb3J0IGVudW0gUmVkUGFsbGFzRGtnU3RhdGUge1xuICAvKiogREtHIHNlc3Npb24gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkICovXG4gIFVuaW5pdGlhbGl6ZWQgPSAnVW5pbml0aWFsaXplZCcsXG4gIC8qKiBES0cgc2Vzc2lvbiBoYXMgYmVlbiBpbml0aWFsaXplZCAoSW5pdCBzdGF0ZSBpbiBXQVNNKSAqL1xuICBJbml0ID0gJ0luaXQnLFxuICAvKiogREtHIHNlc3Npb24gaXMgd2FpdGluZyBmb3IgZmlyc3QgbWVzc2FnZSAoV2FpdE1zZzEgc3RhdGUgaW4gV0FTTSkgKi9cbiAgV2FpdE1zZzEgPSAnV2FpdE1zZzEnLFxuICAvKiogREtHIHNlc3Npb24gaXMgd2FpdGluZyBmb3Igc2Vjb25kIG1lc3NhZ2UgKFdhaXRNc2cyIHN0YXRlIGluIFdBU00pICovXG4gIFdhaXRNc2cyID0gJ1dhaXRNc2cyJyxcbiAgLyoqIERLRyBzZXNzaW9uIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCBrZXkgc2hhcmVzIGFyZSBhdmFpbGFibGUgKi9cbiAgQ29tcGxldGUgPSAnQ29tcGxldGUnLFxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIGEgUmVkUGFsbGFzIERTRyAoRGlzdHJpYnV0ZWQgU2lnbiBHZW5lcmF0aW9uKSBzZXNzaW9uLlxuICpcbiAqIE1pcnJvcnMgdGhlIEVkRFNBIE1QUyBgRHNnU3RhdGVgLCBleGNlcHQgYHJlZHBhbGxhc19kc2dfcm91bmQwX3Byb2Nlc3NgIGRvZXMgbm90IHRha2UgYVxuICogZGVyaXZhdGlvbiBwYXRoOiBSZWRQYWxsYXMga2V5IGRlcml2YXRpb24gKGFzay9uay9yaXZrL2l2a3MpIGhhcHBlbnMgc2VwYXJhdGVseSwgdXBzdHJlYW0sXG4gKiBhcyBwYXJ0IG9mIERLRyAoc2VlIGBSZWRQYWxsYXNEa2dTdGF0ZWApOyB0aGUgRFNHIHJvdW5kIGZ1bmN0aW9ucyBvbmx5IGV2ZXIgb3BlcmF0ZSBvbiBhblxuICogYWxyZWFkeS1kZXJpdmVkIChvciByb290KSBgS2V5c2hhcmVgLlxuICovXG5leHBvcnQgZW51bSBSZWRQYWxsYXNEc2dTdGF0ZSB7XG4gIC8qKiBEU0cgc2Vzc2lvbiBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgKi9cbiAgVW5pbml0aWFsaXplZCA9ICdVbmluaXRpYWxpemVkJyxcbiAgLyoqIGluaXREc2coKSBoYXMgYmVlbiBjYWxsZWQ7IHJlYWR5IGZvciBnZXRGaXJzdE1lc3NhZ2UoKSAqL1xuICBJbml0ID0gJ0luaXQnLFxuICAvKiogUjAgYnJvYWRjYXN0IGVtaXR0ZWQ7IHdhaXRpbmcgZm9yIGNvdW50ZXJwYXJ0J3MgUjAgYnJvYWRjYXN0IChTaWduTXNnMSkgKi9cbiAgV2FpdE1zZzEgPSAnV2FpdE1zZzEnLFxuICAvKiogUjEgYnJvYWRjYXN0IGVtaXR0ZWQ7IHdhaXRpbmcgZm9yIGNvdW50ZXJwYXJ0J3MgUjEgYnJvYWRjYXN0IChTaWduTXNnMikgKi9cbiAgV2FpdE1zZzIgPSAnV2FpdE1zZzInLFxuICAvKiogUjIgYnJvYWRjYXN0IGVtaXR0ZWQ7IHdhaXRpbmcgZm9yIGNvdW50ZXJwYXJ0J3MgUjIgYnJvYWRjYXN0IChTaWduTXNnMywgdGhlIHBhcnRpYWwgc2lnKSAqL1xuICBXYWl0TXNnMyA9ICdXYWl0TXNnMycsXG4gIC8qKiBGaW5hbCBSZWRQYWxsYXMgc2lnbmF0dXJlIChzaWduYXR1cmUvcmsvYWxwaGEpIGlzIGF2YWlsYWJsZSB2aWEgZ2V0U2lnbmF0dXJlKCkgKi9cbiAgQ29tcGxldGUgPSAnQ29tcGxldGUnLFxufVxuXG4vKipcbiAqIFRoZSBmaW5hbCBvdXRwdXQgb2YgYSBSZWRQYWxsYXMgRFNHIHNlc3Npb24uXG4gKlxuICogLSBgc2lnbmF0dXJlYCBpcyB0aGUgNjQtYnl0ZSByYXcgU2Nobm9yciAoUmVkUGFsbGFzKSBzaWduYXR1cmUuXG4gKiAtIGBya2AgaXMgdGhlIHJhbmRvbWl6ZWQgdmVyaWZpY2F0aW9uIGtleSB0aGF0IHRoZSBzaWduYXR1cmUgbXVzdCBiZSB2ZXJpZmllZCBhZ2FpbnN0XG4gKiAgIChpLmUuIGByZWRwYWxsYXNfdmVyaWZ5KHJrLCBzaWduYXR1cmUsIG1lc3NhZ2UpYCksIG5vdCB0aGUgb3JpZ2luYWwgREtHIHB1YmxpYyBrZXkuXG4gKiAtIGBhbHBoYWAgaXMgdGhlIDMyLWJ5dGUgcmFuZG9taXplciBzY2FsYXIgdXNlZCB0byByZS1yYW5kb21pemUgdGhlIERLRyBwdWJsaWMga2V5IGludG9cbiAqICAgYHJrYCAoYHJrID0gcGsgKyBbYWxwaGFdR2ApLiBDYWxsZXJzIHRoYXQgbmVlZCB0byBpbmRlcGVuZGVudGx5IHJlLWRlcml2ZS92ZXJpZnkgYHJrYFxuICogICBmcm9tIHRoZSBES0cgcHVibGljIGtleSBjYW4gdXNlIGBhbHBoYWAgdG8gZG8gc28uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0IHtcbiAgc2lnbmF0dXJlOiBCdWZmZXI7XG4gIHJrOiBCdWZmZXI7XG4gIGFscGhhOiBCdWZmZXI7XG59XG5cbi8qKiBBIFBHUCBkZXRhY2hlZC1zaWduZWQgbWVzc2FnZSBieSBhIHBhcnR5LlxuICogYG1lc3NhZ2VgIGlzIHRoZSByYXcgcGF5bG9hZCBlbmNvZGVkIGFzIGJhc2U2NC5cbiAqIGBzaWduYXR1cmVgIGlzIGFuIGFybW9yZWQgUEdQIGRldGFjaGVkIHNpZ25hdHVyZSBvdmVyIHRob3NlIGJ5dGVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1QU1NpZ25lZE1lc3NhZ2Uge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHNpZ25hdHVyZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2U8VD4ge1xuICBwYXlsb2FkOiBUO1xuICBmcm9tOiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRNZXNzYWdlID0gTWVzc2FnZTxzdHJpbmc+O1xuXG5leHBvcnQgdHlwZSBTZXJpYWxpemVkTWVzc2FnZXMgPSBNZXNzYWdlPHN0cmluZz5bXTtcblxuZXhwb3J0IHR5cGUgRGVzZXJpYWxpemVkTWVzc2FnZSA9IE1lc3NhZ2U8VWludDhBcnJheT47XG5cbmV4cG9ydCB0eXBlIERlc2VyaWFsaXplZE1lc3NhZ2VzID0gTWVzc2FnZTxVaW50OEFycmF5PltdO1xuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplTWVzc2FnZShtc2c6IERlc2VyaWFsaXplZE1lc3NhZ2UpOiBTZXJpYWxpemVkTWVzc2FnZSB7XG4gIHJldHVybiB7IGZyb206IG1zZy5mcm9tLCBwYXlsb2FkOiBCdWZmZXIuZnJvbShtc2cucGF5bG9hZCkudG9TdHJpbmcoJ2Jhc2U2NCcpIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZU1lc3NhZ2UobXNnOiBTZXJpYWxpemVkTWVzc2FnZSk6IERlc2VyaWFsaXplZE1lc3NhZ2Uge1xuICByZXR1cm4geyBmcm9tOiBtc2cuZnJvbSwgcGF5bG9hZDogQnVmZmVyLmZyb20obXNnLnBheWxvYWQsICdiYXNlNjQnKSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplTWVzc2FnZXMobXNnczogRGVzZXJpYWxpemVkTWVzc2FnZXMpOiBTZXJpYWxpemVkTWVzc2FnZXMge1xuICByZXR1cm4gbXNncy5tYXAoc2VyaWFsaXplTWVzc2FnZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZU1lc3NhZ2VzKG1zZ3M6IFNlcmlhbGl6ZWRNZXNzYWdlcyk6IERlc2VyaWFsaXplZE1lc3NhZ2VzIHtcbiAgcmV0dXJuIG1zZ3MubWFwKGRlc2VyaWFsaXplTWVzc2FnZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWNvZGVkUmVkdWNlZEtleVNoYXJlKHJlZHVjZWRLZXlTaGFyZTogQnVmZmVyIHwgVWludDhBcnJheSk6IFJlZFBhbGxhc1JlZHVjZWRLZXlTaGFyZSB7XG4gIGNvbnN0IGRlY29kZWQgPSBSZWRQYWxsYXNSZWR1Y2VkS2V5U2hhcmVUeXBlLmRlY29kZShkZWNvZGUocmVkdWNlZEtleVNoYXJlKSk7XG4gIGlmIChpc0xlZnQoZGVjb2RlZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBwYXJzZSByZWR1Y2VkS2V5U2hhcmU6ICR7ZGVjb2RlZC5sZWZ0fWApO1xuICB9XG4gIHJldHVybiBkZWNvZGVkLnJpZ2h0O1xufVxuIl19
@@ -0,0 +1,43 @@
1
+ import { RedPallasDKG } from './dkg';
2
+ import { RedPallasDSG } from './dsg';
3
+ import { DeserializedMessages, RedPallasSignatureResult } from './types';
4
+ /**
5
+ * Per-party deterministic seed material. To use the same seed for both, pass it as both fields.
6
+ * `encKey` seeds the X25519 encryption key; `dkgSeed` seeds DKG round 0.
7
+ */
8
+ export interface RedPallasDKGPartySeed {
9
+ encKey?: Buffer;
10
+ dkgSeed?: Buffer;
11
+ }
12
+ /**
13
+ * Runs a full 3-party (2-of-3) RedPallas DKG in-process. See `RedPallasDKGPartySeed`.
14
+ * Mirrors `generateEdDsaDKGKeyShares` in `../eddsa-mps/util.ts`.
15
+ */
16
+ export declare function generateRedPallasDKGKeyShares(seedUser?: RedPallasDKGPartySeed, seedBackup?: RedPallasDKGPartySeed, seedBitgo?: RedPallasDKGPartySeed): Promise<[RedPallasDKG, RedPallasDKG, RedPallasDKG]>;
17
+ /**
18
+ * Initializes two RedPallas DSG parties and drives them through the protocol until the
19
+ * specified round. Mirrors `executeTillRound` in `../eddsa-mps/util.ts`, minus the
20
+ * derivation path (RedPallas DSG operates on an already-(root-or-derived) keyshare; there
21
+ * is no per-signing-session derivation path).
22
+ *
23
+ * @param round - Round to execute until (1–3). Returns intermediate message arrays for 1–2,
24
+ * or the final `RedPallasSignatureResult` (signature/rk/alpha) for 3.
25
+ * @param party1Dsg - First DSG party (`new RedPallasDSG(partyIdx)`), not yet initialized.
26
+ * @param party2Dsg - Second DSG party (`new RedPallasDSG(partyIdx)`), not yet initialized.
27
+ * @param keyShare1 - Key share for the first party.
28
+ * @param keyShare2 - Key share for the second party.
29
+ * @param message - Raw message bytes to sign.
30
+ */
31
+ export declare function executeTillRound(round: number, party1Dsg: RedPallasDSG, party2Dsg: RedPallasDSG, keyShare1: Buffer, keyShare2: Buffer, message: Buffer): Promise<DeserializedMessages[] | RedPallasSignatureResult>;
32
+ /**
33
+ * Verifies a `RedPallasSignatureResult` against the raw message.
34
+ *
35
+ * IMPORTANT: unlike EdDSA, RedPallas signatures must be verified against `rk` — the
36
+ * randomized verification key produced alongside the signature by DSG round3 — and NOT
37
+ * against the DKG (or derived) public key directly. `rk = pk + [alpha]G`; `alpha` is
38
+ * included in `RedPallasSignatureResult` for callers that need to independently confirm
39
+ * the relationship between `rk` and a known `pk`, but is not required to verify the
40
+ * signature itself.
41
+ */
42
+ export declare function verifyRedPallasSignature(signatureResult: RedPallasSignatureResult, message: Buffer): Promise<boolean>;
43
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/tss/redpallas-mps/util.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAQzE;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAQD;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,QAAQ,CAAC,EAAE,qBAAqB,EAChC,UAAU,CAAC,EAAE,qBAAqB,EAClC,SAAS,CAAC,EAAE,qBAAqB,GAChC,OAAO,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAiCrD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,YAAY,EACvB,SAAS,EAAE,YAAY,EACvB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,oBAAoB,EAAE,GAAG,wBAAwB,CAAC,CA0B5D;AAED;;;;;;;;;GASG;AACH,wBAAsB,wBAAwB,CAC5C,eAAe,EAAE,wBAAwB,EACzC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAUlB"}
@@ -0,0 +1,147 @@
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.generateRedPallasDKGKeyShares = generateRedPallasDKGKeyShares;
40
+ exports.executeTillRound = executeTillRound;
41
+ exports.verifyRedPallasSignature = verifyRedPallasSignature;
42
+ const crypto_1 = __importDefault(require("crypto"));
43
+ const assert_1 = __importDefault(require("assert"));
44
+ const ed25519_1 = require("@noble/curves/ed25519");
45
+ const dkg_1 = require("./dkg");
46
+ function generateX25519Keypair(seed) {
47
+ const privKey = seed ? seed.subarray(0, 32) : crypto_1.default.randomBytes(32);
48
+ const pubKey = Buffer.from(ed25519_1.x25519.getPublicKey(privKey));
49
+ return { privKey: Buffer.from(privKey), pubKey };
50
+ }
51
+ function validateSeed(seed) {
52
+ (0, assert_1.default)(!seed?.encKey || seed.encKey.length >= 32, 'encKey must be at least 32 bytes');
53
+ (0, assert_1.default)(!seed?.dkgSeed || seed.dkgSeed.length >= 32, 'dkgSeed must be at least 32 bytes');
54
+ return seed ?? {};
55
+ }
56
+ /**
57
+ * Runs a full 3-party (2-of-3) RedPallas DKG in-process. See `RedPallasDKGPartySeed`.
58
+ * Mirrors `generateEdDsaDKGKeyShares` in `../eddsa-mps/util.ts`.
59
+ */
60
+ async function generateRedPallasDKGKeyShares(seedUser, seedBackup, seedBitgo) {
61
+ const { encKey: userEncKey, dkgSeed: userDkgSeed } = validateSeed(seedUser);
62
+ const { encKey: backupEncKey, dkgSeed: backupDkgSeed } = validateSeed(seedBackup);
63
+ const { encKey: bitgoEncKey, dkgSeed: bitgoDkgSeed } = validateSeed(seedBitgo);
64
+ const user = new dkg_1.RedPallasDKG(3, 2, 0);
65
+ const backup = new dkg_1.RedPallasDKG(3, 2, 1);
66
+ const bitgo = new dkg_1.RedPallasDKG(3, 2, 2);
67
+ const userKP = generateX25519Keypair(userEncKey);
68
+ const backupKP = generateX25519Keypair(backupEncKey);
69
+ const bitgoKP = generateX25519Keypair(bitgoEncKey);
70
+ await user.initDkg(userKP.privKey, [backupKP.pubKey, bitgoKP.pubKey]);
71
+ await backup.initDkg(backupKP.privKey, [userKP.pubKey, bitgoKP.pubKey]);
72
+ await bitgo.initDkg(bitgoKP.privKey, [userKP.pubKey, backupKP.pubKey]);
73
+ const r1Messages = [
74
+ user.getFirstMessage(userDkgSeed),
75
+ backup.getFirstMessage(backupDkgSeed),
76
+ bitgo.getFirstMessage(bitgoDkgSeed),
77
+ ];
78
+ const r2Messages = [
79
+ ...user.handleIncomingMessages(r1Messages),
80
+ ...backup.handleIncomingMessages(r1Messages),
81
+ ...bitgo.handleIncomingMessages(r1Messages),
82
+ ];
83
+ user.handleIncomingMessages(r2Messages);
84
+ backup.handleIncomingMessages(r2Messages);
85
+ bitgo.handleIncomingMessages(r2Messages);
86
+ return [user, backup, bitgo];
87
+ }
88
+ /**
89
+ * Initializes two RedPallas DSG parties and drives them through the protocol until the
90
+ * specified round. Mirrors `executeTillRound` in `../eddsa-mps/util.ts`, minus the
91
+ * derivation path (RedPallas DSG operates on an already-(root-or-derived) keyshare; there
92
+ * is no per-signing-session derivation path).
93
+ *
94
+ * @param round - Round to execute until (1–3). Returns intermediate message arrays for 1–2,
95
+ * or the final `RedPallasSignatureResult` (signature/rk/alpha) for 3.
96
+ * @param party1Dsg - First DSG party (`new RedPallasDSG(partyIdx)`), not yet initialized.
97
+ * @param party2Dsg - Second DSG party (`new RedPallasDSG(partyIdx)`), not yet initialized.
98
+ * @param keyShare1 - Key share for the first party.
99
+ * @param keyShare2 - Key share for the second party.
100
+ * @param message - Raw message bytes to sign.
101
+ */
102
+ async function executeTillRound(round, party1Dsg, party2Dsg, keyShare1, keyShare2, message) {
103
+ if (round < 1 || round > 3) {
104
+ throw Error('Invalid round number');
105
+ }
106
+ await party1Dsg.initDsg(keyShare1, message, party2Dsg.getPartyIdx());
107
+ await party2Dsg.initDsg(keyShare2, message, party1Dsg.getPartyIdx());
108
+ const party1Round0Message = party1Dsg.getFirstMessage();
109
+ const party2Round0Message = party2Dsg.getFirstMessage();
110
+ const [party2Round1Messages] = party2Dsg.handleIncomingMessages([party1Round0Message, party2Round0Message]);
111
+ const [party1Round1Messages] = party1Dsg.handleIncomingMessages([party1Round0Message, party2Round0Message]);
112
+ if (round === 1)
113
+ return [[party1Round1Messages], [party2Round1Messages]];
114
+ const [party1Round2Messages] = party1Dsg.handleIncomingMessages([party1Round1Messages, party2Round1Messages]);
115
+ const [party2Round2Messages] = party2Dsg.handleIncomingMessages([party1Round1Messages, party2Round1Messages]);
116
+ if (round === 2)
117
+ return [[party1Round2Messages], [party2Round2Messages]];
118
+ party1Dsg.handleIncomingMessages([party1Round2Messages, party2Round2Messages]);
119
+ party2Dsg.handleIncomingMessages([party1Round2Messages, party2Round2Messages]);
120
+ const sig1 = party1Dsg.getSignature();
121
+ const sig2 = party2Dsg.getSignature();
122
+ (0, assert_1.default)(sig1.signature.toString('hex') === sig2.signature.toString('hex'));
123
+ (0, assert_1.default)(sig1.rk.toString('hex') === sig2.rk.toString('hex'));
124
+ (0, assert_1.default)(sig1.alpha.toString('hex') === sig2.alpha.toString('hex'));
125
+ return sig1;
126
+ }
127
+ /**
128
+ * Verifies a `RedPallasSignatureResult` against the raw message.
129
+ *
130
+ * IMPORTANT: unlike EdDSA, RedPallas signatures must be verified against `rk` — the
131
+ * randomized verification key produced alongside the signature by DSG round3 — and NOT
132
+ * against the DKG (or derived) public key directly. `rk = pk + [alpha]G`; `alpha` is
133
+ * included in `RedPallasSignatureResult` for callers that need to independently confirm
134
+ * the relationship between `rk` and a known `pk`, but is not required to verify the
135
+ * signature itself.
136
+ */
137
+ async function verifyRedPallasSignature(signatureResult, message) {
138
+ const wasm = typeof window !== 'undefined' && !window.process && !window.process?.['type']
139
+ ? // eslint-disable-next-line import/no-internal-modules -- @bitgo/wasm-mps exposes environment-specific subpath exports.
140
+ await Promise.resolve().then(() => __importStar(require('@bitgo/wasm-mps/web'))).then(async (webWasm) => {
141
+ await webWasm.default();
142
+ return webWasm;
143
+ })
144
+ : await Promise.resolve().then(() => __importStar(require('@bitgo/wasm-mps')));
145
+ return wasm.redpallas_verify(signatureResult.rk, signatureResult.signature, message);
146
+ }
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90c3MvcmVkcGFsbGFzLW1wcy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NBLHNFQXFDQztBQWdCRCw0Q0FpQ0M7QUFZRCw0REFhQztBQS9JRCxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLG1EQUErQztBQUMvQywrQkFBcUM7QUFJckMsU0FBUyxxQkFBcUIsQ0FBQyxJQUFhO0lBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDbkQsQ0FBQztBQVdELFNBQVMsWUFBWSxDQUFDLElBQTRCO0lBQ2hELElBQUEsZ0JBQU0sRUFBQyxDQUFDLElBQUksRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFLGtDQUFrQyxDQUFDLENBQUM7SUFDdEYsSUFBQSxnQkFBTSxFQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztJQUN6RixPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7QUFDcEIsQ0FBQztBQUVEOzs7R0FHRztBQUNJLEtBQUssVUFBVSw2QkFBNkIsQ0FDakQsUUFB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bSAnY3J5cHRvJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IHgyNTUxOSB9IGZyb20gJ0Bub2JsZS9jdXJ2ZXMvZWQyNTUxOSc7XG5pbXBvcnQgeyBSZWRQYWxsYXNES0cgfSBmcm9tICcuL2RrZyc7XG5pbXBvcnQgeyBSZWRQYWxsYXNEU0cgfSBmcm9tICcuL2RzZyc7XG5pbXBvcnQgeyBEZXNlcmlhbGl6ZWRNZXNzYWdlcywgUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0IH0gZnJvbSAnLi90eXBlcyc7XG5cbmZ1bmN0aW9uIGdlbmVyYXRlWDI1NTE5S2V5cGFpcihzZWVkPzogQnVmZmVyKTogeyBwcml2S2V5OiBCdWZmZXI7IHB1YktleTogQnVmZmVyIH0ge1xuICBjb25zdCBwcml2S2V5ID0gc2VlZCA/IHNlZWQuc3ViYXJyYXkoMCwgMzIpIDogY3J5cHRvLnJhbmRvbUJ5dGVzKDMyKTtcbiAgY29uc3QgcHViS2V5ID0gQnVmZmVyLmZyb20oeDI1NTE5LmdldFB1YmxpY0tleShwcml2S2V5KSk7XG4gIHJldHVybiB7IHByaXZLZXk6IEJ1ZmZlci5mcm9tKHByaXZLZXkpLCBwdWJLZXkgfTtcbn1cblxuLyoqXG4gKiBQZXItcGFydHkgZGV0ZXJtaW5pc3RpYyBzZWVkIG1hdGVyaWFsLiBUbyB1c2UgdGhlIHNhbWUgc2VlZCBmb3IgYm90aCwgcGFzcyBpdCBhcyBib3RoIGZpZWxkcy5cbiAqIGBlbmNLZXlgIHNlZWRzIHRoZSBYMjU1MTkgZW5jcnlwdGlvbiBrZXk7IGBka2dTZWVkYCBzZWVkcyBES0cgcm91bmQgMC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRQYWxsYXNES0dQYXJ0eVNlZWQge1xuICBlbmNLZXk/OiBCdWZmZXI7XG4gIGRrZ1NlZWQ/OiBCdWZmZXI7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU2VlZChzZWVkPzogUmVkUGFsbGFzREtHUGFydHlTZWVkKTogUmVkUGFsbGFzREtHUGFydHlTZWVkIHtcbiAgYXNzZXJ0KCFzZWVkPy5lbmNLZXkgfHwgc2VlZC5lbmNLZXkubGVuZ3RoID49IDMyLCAnZW5jS2V5IG11c3QgYmUgYXQgbGVhc3QgMzIgYnl0ZXMnKTtcbiAgYXNzZXJ0KCFzZWVkPy5ka2dTZWVkIHx8IHNlZWQuZGtnU2VlZC5sZW5ndGggPj0gMzIsICdka2dTZWVkIG11c3QgYmUgYXQgbGVhc3QgMzIgYnl0ZXMnKTtcbiAgcmV0dXJuIHNlZWQgPz8ge307XG59XG5cbi8qKlxuICogUnVucyBhIGZ1bGwgMy1wYXJ0eSAoMi1vZi0zKSBSZWRQYWxsYXMgREtHIGluLXByb2Nlc3MuIFNlZSBgUmVkUGFsbGFzREtHUGFydHlTZWVkYC5cbiAqIE1pcnJvcnMgYGdlbmVyYXRlRWREc2FES0dLZXlTaGFyZXNgIGluIGAuLi9lZGRzYS1tcHMvdXRpbC50c2AuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlZFBhbGxhc0RLR0tleVNoYXJlcyhcbiAgc2VlZFVzZXI/OiBSZWRQYWxsYXNES0dQYXJ0eVNlZWQsXG4gIHNlZWRCYWNrdXA/OiBSZWRQYWxsYXNES0dQYXJ0eVNlZWQsXG4gIHNlZWRCaXRnbz86IFJlZFBhbGxhc0RLR1BhcnR5U2VlZFxuKTogUHJvbWlzZTxbUmVkUGFsbGFzREtHLCBSZWRQYWxsYXNES0csIFJlZFBhbGxhc0RLR10+IHtcbiAgY29uc3QgeyBlbmNLZXk6IHVzZXJFbmNLZXksIGRrZ1NlZWQ6IHVzZXJEa2dTZWVkIH0gPSB2YWxpZGF0ZVNlZWQoc2VlZFVzZXIpO1xuICBjb25zdCB7IGVuY0tleTogYmFja3VwRW5jS2V5LCBka2dTZWVkOiBiYWNrdXBEa2dTZWVkIH0gPSB2YWxpZGF0ZVNlZWQoc2VlZEJhY2t1cCk7XG4gIGNvbnN0IHsgZW5jS2V5OiBiaXRnb0VuY0tleSwgZGtnU2VlZDogYml0Z29Ea2dTZWVkIH0gPSB2YWxpZGF0ZVNlZWQoc2VlZEJpdGdvKTtcblxuICBjb25zdCB1c2VyID0gbmV3IFJlZFBhbGxhc0RLRygzLCAyLCAwKTtcbiAgY29uc3QgYmFja3VwID0gbmV3IFJlZFBhbGxhc0RLRygzLCAyLCAxKTtcbiAgY29uc3QgYml0Z28gPSBuZXcgUmVkUGFsbGFzREtHKDMsIDIsIDIpO1xuXG4gIGNvbnN0IHVzZXJLUCA9IGdlbmVyYXRlWDI1NTE5S2V5cGFpcih1c2VyRW5jS2V5KTtcbiAgY29uc3QgYmFja3VwS1AgPSBnZW5lcmF0ZVgyNTUxOUtleXBhaXIoYmFja3VwRW5jS2V5KTtcbiAgY29uc3QgYml0Z29LUCA9IGdlbmVyYXRlWDI1NTE5S2V5cGFpcihiaXRnb0VuY0tleSk7XG5cbiAgYXdhaXQgdXNlci5pbml0RGtnKHVzZXJLUC5wcml2S2V5LCBbYmFja3VwS1AucHViS2V5LCBiaXRnb0tQLnB1YktleV0pO1xuICBhd2FpdCBiYWNrdXAuaW5pdERrZyhiYWNrdXBLUC5wcml2S2V5LCBbdXNlcktQLnB1YktleSwgYml0Z29LUC5wdWJLZXldKTtcbiAgYXdhaXQgYml0Z28uaW5pdERrZyhiaXRnb0tQLnByaXZLZXksIFt1c2VyS1AucHViS2V5LCBiYWNrdXBLUC5wdWJLZXldKTtcblxuICBjb25zdCByMU1lc3NhZ2VzID0gW1xuICAgIHVzZXIuZ2V0Rmlyc3RNZXNzYWdlKHVzZXJEa2dTZWVkKSxcbiAgICBiYWNrdXAuZ2V0Rmlyc3RNZXNzYWdlKGJhY2t1cERrZ1NlZWQpLFxuICAgIGJpdGdvLmdldEZpcnN0TWVzc2FnZShiaXRnb0RrZ1NlZWQpLFxuICBdO1xuXG4gIGNvbnN0IHIyTWVzc2FnZXMgPSBbXG4gICAgLi4udXNlci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHIxTWVzc2FnZXMpLFxuICAgIC4uLmJhY2t1cC5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHIxTWVzc2FnZXMpLFxuICAgIC4uLmJpdGdvLmhhbmRsZUluY29taW5nTWVzc2FnZXMocjFNZXNzYWdlcyksXG4gIF07XG5cbiAgdXNlci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHIyTWVzc2FnZXMpO1xuICBiYWNrdXAuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhyMk1lc3NhZ2VzKTtcbiAgYml0Z28uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhyMk1lc3NhZ2VzKTtcbiAgcmV0dXJuIFt1c2VyLCBiYWNrdXAsIGJpdGdvXTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyB0d28gUmVkUGFsbGFzIERTRyBwYXJ0aWVzIGFuZCBkcml2ZXMgdGhlbSB0aHJvdWdoIHRoZSBwcm90b2NvbCB1bnRpbCB0aGVcbiAqIHNwZWNpZmllZCByb3VuZC4gTWlycm9ycyBgZXhlY3V0ZVRpbGxSb3VuZGAgaW4gYC4uL2VkZHNhLW1wcy91dGlsLnRzYCwgbWludXMgdGhlXG4gKiBkZXJpdmF0aW9uIHBhdGggKFJlZFBhbGxhcyBEU0cgb3BlcmF0ZXMgb24gYW4gYWxyZWFkeS0ocm9vdC1vci1kZXJpdmVkKSBrZXlzaGFyZTsgdGhlcmVcbiAqIGlzIG5vIHBlci1zaWduaW5nLXNlc3Npb24gZGVyaXZhdGlvbiBwYXRoKS5cbiAqXG4gKiBAcGFyYW0gcm91bmQgLSBSb3VuZCB0byBleGVjdXRlIHVudGlsICgx4oCTMykuIFJldHVybnMgaW50ZXJtZWRpYXRlIG1lc3NhZ2UgYXJyYXlzIGZvciAx4oCTMixcbiAqICAgb3IgdGhlIGZpbmFsIGBSZWRQYWxsYXNTaWduYXR1cmVSZXN1bHRgIChzaWduYXR1cmUvcmsvYWxwaGEpIGZvciAzLlxuICogQHBhcmFtIHBhcnR5MURzZyAtIEZpcnN0IERTRyBwYXJ0eSAoYG5ldyBSZWRQYWxsYXNEU0cocGFydHlJZHgpYCksIG5vdCB5ZXQgaW5pdGlhbGl6ZWQuXG4gKiBAcGFyYW0gcGFydHkyRHNnIC0gU2Vjb25kIERTRyBwYXJ0eSAoYG5ldyBSZWRQYWxsYXNEU0cocGFydHlJZHgpYCksIG5vdCB5ZXQgaW5pdGlhbGl6ZWQuXG4gKiBAcGFyYW0ga2V5U2hhcmUxIC0gS2V5IHNoYXJlIGZvciB0aGUgZmlyc3QgcGFydHkuXG4gKiBAcGFyYW0ga2V5U2hhcmUyIC0gS2V5IHNoYXJlIGZvciB0aGUgc2Vjb25kIHBhcnR5LlxuICogQHBhcmFtIG1lc3NhZ2UgLSBSYXcgbWVzc2FnZSBieXRlcyB0byBzaWduLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVRpbGxSb3VuZChcbiAgcm91bmQ6IG51bWJlcixcbiAgcGFydHkxRHNnOiBSZWRQYWxsYXNEU0csXG4gIHBhcnR5MkRzZzogUmVkUGFsbGFzRFNHLFxuICBrZXlTaGFyZTE6IEJ1ZmZlcixcbiAga2V5U2hhcmUyOiBCdWZmZXIsXG4gIG1lc3NhZ2U6IEJ1ZmZlclxuKTogUHJvbWlzZTxEZXNlcmlhbGl6ZWRNZXNzYWdlc1tdIHwgUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0PiB7XG4gIGlmIChyb3VuZCA8IDEgfHwgcm91bmQgPiAzKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgcm91bmQgbnVtYmVyJyk7XG4gIH1cbiAgYXdhaXQgcGFydHkxRHNnLmluaXREc2coa2V5U2hhcmUxLCBtZXNzYWdlLCBwYXJ0eTJEc2cuZ2V0UGFydHlJZHgoKSk7XG4gIGF3YWl0IHBhcnR5MkRzZy5pbml0RHNnKGtleVNoYXJlMiwgbWVzc2FnZSwgcGFydHkxRHNnLmdldFBhcnR5SWR4KCkpO1xuICBjb25zdCBwYXJ0eTFSb3VuZDBNZXNzYWdlID0gcGFydHkxRHNnLmdldEZpcnN0TWVzc2FnZSgpO1xuICBjb25zdCBwYXJ0eTJSb3VuZDBNZXNzYWdlID0gcGFydHkyRHNnLmdldEZpcnN0TWVzc2FnZSgpO1xuXG4gIGNvbnN0IFtwYXJ0eTJSb3VuZDFNZXNzYWdlc10gPSBwYXJ0eTJEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbcGFydHkxUm91bmQwTWVzc2FnZSwgcGFydHkyUm91bmQwTWVzc2FnZV0pO1xuICBjb25zdCBbcGFydHkxUm91bmQxTWVzc2FnZXNdID0gcGFydHkxRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3BhcnR5MVJvdW5kME1lc3NhZ2UsIHBhcnR5MlJvdW5kME1lc3NhZ2VdKTtcbiAgaWYgKHJvdW5kID09PSAxKSByZXR1cm4gW1twYXJ0eTFSb3VuZDFNZXNzYWdlc10sIFtwYXJ0eTJSb3VuZDFNZXNzYWdlc11dO1xuXG4gIGNvbnN0IFtwYXJ0eTFSb3VuZDJNZXNzYWdlc10gPSBwYXJ0eTFEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbcGFydHkxUm91bmQxTWVzc2FnZXMsIHBhcnR5MlJvdW5kMU1lc3NhZ2VzXSk7XG4gIGNvbnN0IFtwYXJ0eTJSb3VuZDJNZXNzYWdlc10gPSBwYXJ0eTJEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbcGFydHkxUm91bmQxTWVzc2FnZXMsIHBhcnR5MlJvdW5kMU1lc3NhZ2VzXSk7XG4gIGlmIChyb3VuZCA9PT0gMikgcmV0dXJuIFtbcGFydHkxUm91bmQyTWVzc2FnZXNdLCBbcGFydHkyUm91bmQyTWVzc2FnZXNdXTtcblxuICBwYXJ0eTFEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbcGFydHkxUm91bmQyTWVzc2FnZXMsIHBhcnR5MlJvdW5kMk1lc3NhZ2VzXSk7XG4gIHBhcnR5MkRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFtwYXJ0eTFSb3VuZDJNZXNzYWdlcywgcGFydHkyUm91bmQyTWVzc2FnZXNdKTtcblxuICBjb25zdCBzaWcxID0gcGFydHkxRHNnLmdldFNpZ25hdHVyZSgpO1xuICBjb25zdCBzaWcyID0gcGFydHkyRHNnLmdldFNpZ25hdHVyZSgpO1xuICBhc3NlcnQoc2lnMS5zaWduYXR1cmUudG9TdHJpbmcoJ2hleCcpID09PSBzaWcyLnNpZ25hdHVyZS50b1N0cmluZygnaGV4JykpO1xuICBhc3NlcnQoc2lnMS5yay50b1N0cmluZygnaGV4JykgPT09IHNpZzIucmsudG9TdHJpbmcoJ2hleCcpKTtcbiAgYXNzZXJ0KHNpZzEuYWxwaGEudG9TdHJpbmcoJ2hleCcpID09PSBzaWcyLmFscGhhLnRvU3RyaW5nKCdoZXgnKSk7XG4gIHJldHVybiBzaWcxO1xufVxuXG4vKipcbiAqIFZlcmlmaWVzIGEgYFJlZFBhbGxhc1NpZ25hdHVyZVJlc3VsdGAgYWdhaW5zdCB0aGUgcmF3IG1lc3NhZ2UuXG4gKlxuICogSU1QT1JUQU5UOiB1bmxpa2UgRWREU0EsIFJlZFBhbGxhcyBzaWduYXR1cmVzIG11c3QgYmUgdmVyaWZpZWQgYWdhaW5zdCBgcmtgIOKAlCB0aGVcbiAqIHJhbmRvbWl6ZWQgdmVyaWZpY2F0aW9uIGtleSBwcm9kdWNlZCBhbG9uZ3NpZGUgdGhlIHNpZ25hdHVyZSBieSBEU0cgcm91bmQzIOKAlCBhbmQgTk9UXG4gKiBhZ2FpbnN0IHRoZSBES0cgKG9yIGRlcml2ZWQpIHB1YmxpYyBrZXkgZGlyZWN0bHkuIGByayA9IHBrICsgW2FscGhhXUdgOyBgYWxwaGFgIGlzXG4gKiBpbmNsdWRlZCBpbiBgUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0YCBmb3IgY2FsbGVycyB0aGF0IG5lZWQgdG8gaW5kZXBlbmRlbnRseSBjb25maXJtXG4gKiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYHJrYCBhbmQgYSBrbm93biBgcGtgLCBidXQgaXMgbm90IHJlcXVpcmVkIHRvIHZlcmlmeSB0aGVcbiAqIHNpZ25hdHVyZSBpdHNlbGYuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlSZWRQYWxsYXNTaWduYXR1cmUoXG4gIHNpZ25hdHVyZVJlc3VsdDogUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0LFxuICBtZXNzYWdlOiBCdWZmZXJcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB3YXNtID1cbiAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAhd2luZG93LnByb2Nlc3MgJiYgIXdpbmRvdy5wcm9jZXNzPy5bJ3R5cGUnXVxuICAgICAgPyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWludGVybmFsLW1vZHVsZXMgLS0gQGJpdGdvL3dhc20tbXBzIGV4cG9zZXMgZW52aXJvbm1lbnQtc3BlY2lmaWMgc3VicGF0aCBleHBvcnRzLlxuICAgICAgICBhd2FpdCBpbXBvcnQoJ0BiaXRnby93YXNtLW1wcy93ZWInKS50aGVuKGFzeW5jICh3ZWJXYXNtKSA9PiB7XG4gICAgICAgICAgYXdhaXQgd2ViV2FzbS5kZWZhdWx0KCk7XG4gICAgICAgICAgcmV0dXJuIHdlYldhc207XG4gICAgICAgIH0pXG4gICAgICA6IGF3YWl0IGltcG9ydCgnQGJpdGdvL3dhc20tbXBzJyk7XG4gIHJldHVybiB3YXNtLnJlZHBhbGxhc192ZXJpZnkoc2lnbmF0dXJlUmVzdWx0LnJrLCBzaWduYXR1cmVSZXN1bHQuc2lnbmF0dXJlLCBtZXNzYWdlKTtcbn1cbiJdfQ==