@bitgo-beta/sdk-lib-mpc 8.2.0-beta.212 → 8.2.0-beta.2120

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 (147) hide show
  1. package/dist/src/curves/ed25519.d.ts +0 -1
  2. package/dist/src/curves/ed25519.d.ts.map +1 -1
  3. package/dist/src/curves/ed25519.js +12 -12
  4. package/dist/src/curves/ed25519Bip32HdTree.js +14 -14
  5. package/dist/src/curves/index.js +6 -2
  6. package/dist/src/curves/secp256k1.d.ts +0 -1
  7. package/dist/src/curves/secp256k1.d.ts.map +1 -1
  8. package/dist/src/curves/secp256k1.js +22 -38
  9. package/dist/src/curves/secp256k1Bip32HdTree.js +10 -10
  10. package/dist/src/curves/types.d.ts +2 -3
  11. package/dist/src/curves/types.d.ts.map +1 -1
  12. package/dist/src/curves/util.d.ts +2 -0
  13. package/dist/src/curves/util.d.ts.map +1 -1
  14. package/dist/src/curves/util.js +34 -3
  15. package/dist/src/hashCommitment.d.ts +0 -1
  16. package/dist/src/hashCommitment.d.ts.map +1 -1
  17. package/dist/src/hashCommitment.js +7 -8
  18. package/dist/src/index.d.ts +1 -1
  19. package/dist/src/index.d.ts.map +1 -1
  20. package/dist/src/index.js +24 -10
  21. package/dist/src/openssl/index.js +6 -2
  22. package/dist/src/openssl/openssl.d.ts +1 -2
  23. package/dist/src/openssl/openssl.d.ts.map +1 -1
  24. package/dist/src/openssl/openssl.js +4 -12
  25. package/dist/src/safePrime.d.ts +3 -0
  26. package/dist/src/safePrime.d.ts.map +1 -0
  27. package/dist/src/safePrime.js +19 -0
  28. package/dist/src/schnorrProof.d.ts +0 -1
  29. package/dist/src/schnorrProof.d.ts.map +1 -1
  30. package/dist/src/schnorrProof.js +8 -9
  31. package/dist/src/shamir/index.js +6 -2
  32. package/dist/src/shamir/shamir.js +2 -2
  33. package/dist/src/shamir/types.d.ts +1 -1
  34. package/dist/src/shamir/types.d.ts.map +1 -1
  35. package/dist/src/tss/dkls-vrf/dkg.d.ts +91 -0
  36. package/dist/src/tss/dkls-vrf/dkg.d.ts.map +1 -0
  37. package/dist/src/tss/dkls-vrf/dkg.js +278 -0
  38. package/dist/src/tss/dkls-vrf/index.d.ts +4 -0
  39. package/dist/src/tss/dkls-vrf/index.d.ts.map +1 -0
  40. package/dist/src/tss/dkls-vrf/index.js +40 -0
  41. package/dist/src/tss/dkls-vrf/types.d.ts +28 -0
  42. package/dist/src/tss/dkls-vrf/types.d.ts.map +1 -0
  43. package/dist/src/tss/dkls-vrf/types.js +23 -0
  44. package/dist/src/tss/dkls-vrf/util.d.ts +63 -0
  45. package/dist/src/tss/dkls-vrf/util.d.ts.map +1 -0
  46. package/dist/src/tss/dkls-vrf/util.js +200 -0
  47. package/dist/src/tss/ecdsa/index.js +23 -9
  48. package/dist/src/tss/ecdsa/paillierproof.js +10 -10
  49. package/dist/src/tss/ecdsa/rangeproof.d.ts +1 -2
  50. package/dist/src/tss/ecdsa/rangeproof.d.ts.map +1 -1
  51. package/dist/src/tss/ecdsa/rangeproof.js +108 -118
  52. package/dist/src/tss/ecdsa/types.d.ts +28 -17
  53. package/dist/src/tss/ecdsa/types.d.ts.map +1 -1
  54. package/dist/src/tss/ecdsa/types.js +29 -31
  55. package/dist/src/tss/ecdsa/zkVProof.d.ts +0 -1
  56. package/dist/src/tss/ecdsa/zkVProof.d.ts.map +1 -1
  57. package/dist/src/tss/ecdsa/zkVProof.js +9 -10
  58. package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts +69 -0
  59. package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts.map +1 -0
  60. package/dist/src/tss/ecdsa-dkls/commsLayer.js +268 -0
  61. package/dist/src/tss/ecdsa-dkls/derive.d.ts +111 -0
  62. package/dist/src/tss/ecdsa-dkls/derive.d.ts.map +1 -0
  63. package/dist/src/tss/ecdsa-dkls/derive.js +329 -0
  64. package/dist/src/tss/ecdsa-dkls/dkg.d.ts +64 -0
  65. package/dist/src/tss/ecdsa-dkls/dkg.d.ts.map +1 -0
  66. package/dist/src/tss/ecdsa-dkls/dkg.js +309 -0
  67. package/dist/src/tss/ecdsa-dkls/dsg.d.ts +47 -0
  68. package/dist/src/tss/ecdsa-dkls/dsg.d.ts.map +1 -0
  69. package/dist/src/tss/ecdsa-dkls/dsg.js +271 -0
  70. package/dist/src/tss/ecdsa-dkls/index.d.ts +7 -0
  71. package/dist/src/tss/ecdsa-dkls/index.d.ts.map +1 -0
  72. package/dist/src/tss/ecdsa-dkls/index.js +43 -0
  73. package/dist/src/tss/ecdsa-dkls/types.d.ts +163 -0
  74. package/dist/src/tss/ecdsa-dkls/types.d.ts.map +1 -0
  75. package/dist/src/tss/ecdsa-dkls/types.js +215 -0
  76. package/dist/src/tss/ecdsa-dkls/util.d.ts +26 -0
  77. package/dist/src/tss/ecdsa-dkls/util.d.ts.map +1 -0
  78. package/dist/src/tss/ecdsa-dkls/util.js +276 -0
  79. package/dist/src/tss/eddsa-mps/commsLayer.d.ts +30 -0
  80. package/dist/src/tss/eddsa-mps/commsLayer.d.ts.map +1 -0
  81. package/dist/src/tss/eddsa-mps/commsLayer.js +96 -0
  82. package/dist/src/tss/eddsa-mps/derive.d.ts +34 -0
  83. package/dist/src/tss/eddsa-mps/derive.d.ts.map +1 -0
  84. package/dist/src/tss/eddsa-mps/derive.js +198 -0
  85. package/dist/src/tss/eddsa-mps/dkg.d.ts +109 -0
  86. package/dist/src/tss/eddsa-mps/dkg.d.ts.map +1 -0
  87. package/dist/src/tss/eddsa-mps/dkg.js +304 -0
  88. package/dist/src/tss/eddsa-mps/dsg.d.ts +96 -0
  89. package/dist/src/tss/eddsa-mps/dsg.d.ts.map +1 -0
  90. package/dist/src/tss/eddsa-mps/dsg.js +346 -0
  91. package/dist/src/tss/eddsa-mps/index.d.ts +8 -0
  92. package/dist/src/tss/eddsa-mps/index.d.ts.map +1 -0
  93. package/dist/src/tss/eddsa-mps/index.js +43 -0
  94. package/dist/src/tss/eddsa-mps/types.d.ts +76 -0
  95. package/dist/src/tss/eddsa-mps/types.d.ts.map +1 -0
  96. package/dist/src/tss/eddsa-mps/types.js +105 -0
  97. package/dist/src/tss/eddsa-mps/util.d.ts +33 -0
  98. package/dist/src/tss/eddsa-mps/util.d.ts.map +1 -0
  99. package/dist/src/tss/eddsa-mps/util.js +94 -0
  100. package/dist/src/tss/eddsa-mps-vrf/dkg.d.ts +65 -0
  101. package/dist/src/tss/eddsa-mps-vrf/dkg.d.ts.map +1 -0
  102. package/dist/src/tss/eddsa-mps-vrf/dkg.js +246 -0
  103. package/dist/src/tss/eddsa-mps-vrf/index.d.ts +4 -0
  104. package/dist/src/tss/eddsa-mps-vrf/index.d.ts.map +1 -0
  105. package/dist/src/tss/eddsa-mps-vrf/index.js +40 -0
  106. package/dist/src/tss/eddsa-mps-vrf/types.d.ts +31 -0
  107. package/dist/src/tss/eddsa-mps-vrf/types.d.ts.map +1 -0
  108. package/dist/src/tss/eddsa-mps-vrf/types.js +97 -0
  109. package/dist/src/tss/eddsa-mps-vrf/util.d.ts +29 -0
  110. package/dist/src/tss/eddsa-mps-vrf/util.d.ts.map +1 -0
  111. package/dist/src/tss/eddsa-mps-vrf/util.js +75 -0
  112. package/dist/src/tss/index.d.ts +5 -0
  113. package/dist/src/tss/index.d.ts.map +1 -1
  114. package/dist/src/tss/index.js +11 -2
  115. package/dist/src/tss/redpallas-mps/commsLayer.d.ts +34 -0
  116. package/dist/src/tss/redpallas-mps/commsLayer.d.ts.map +1 -0
  117. package/dist/src/tss/redpallas-mps/commsLayer.js +100 -0
  118. package/dist/src/tss/redpallas-mps/dkg.d.ts +103 -0
  119. package/dist/src/tss/redpallas-mps/dkg.d.ts.map +1 -0
  120. package/dist/src/tss/redpallas-mps/dkg.js +285 -0
  121. package/dist/src/tss/redpallas-mps/dsg.d.ts +130 -0
  122. package/dist/src/tss/redpallas-mps/dsg.d.ts.map +1 -0
  123. package/dist/src/tss/redpallas-mps/dsg.js +376 -0
  124. package/dist/src/tss/redpallas-mps/index.d.ts +8 -0
  125. package/dist/src/tss/redpallas-mps/index.d.ts.map +1 -0
  126. package/dist/src/tss/redpallas-mps/index.js +43 -0
  127. package/dist/src/tss/redpallas-mps/rerand.d.ts +110 -0
  128. package/dist/src/tss/redpallas-mps/rerand.d.ts.map +1 -0
  129. package/dist/src/tss/redpallas-mps/rerand.js +330 -0
  130. package/dist/src/tss/redpallas-mps/types.d.ts +120 -0
  131. package/dist/src/tss/redpallas-mps/types.d.ts.map +1 -0
  132. package/dist/src/tss/redpallas-mps/types.js +133 -0
  133. package/dist/src/tss/redpallas-mps/util.d.ts +56 -0
  134. package/dist/src/tss/redpallas-mps/util.d.ts.map +1 -0
  135. package/dist/src/tss/redpallas-mps/util.js +173 -0
  136. package/dist/src/types.d.ts +0 -1
  137. package/dist/src/types.d.ts.map +1 -1
  138. package/dist/src/util.d.ts +0 -1
  139. package/dist/src/util.d.ts.map +1 -1
  140. package/dist/src/util.js +21 -22
  141. package/dist/tsconfig.tsbuildinfo +1 -1
  142. package/package.json +42 -5
  143. package/.eslintignore +0 -5
  144. package/CHANGELOG.md +0 -356
  145. package/dist/src/openssl/opensslbytes.d.ts +0 -4
  146. package/dist/src/openssl/opensslbytes.d.ts.map +0 -1
  147. package/dist/src/openssl/opensslbytes.js +0 -20
@@ -0,0 +1,330 @@
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.RedPallasRerand = void 0;
40
+ const assert_1 = __importDefault(require("assert"));
41
+ const types_1 = require("./types");
42
+ /**
43
+ * RedPallas (Zcash Ironwood) key re-randomization implementation using @bitgo/wasm-mps.
44
+ *
45
+ * As of `@bitgo/wasm-mps` 1.17.0, key re-randomization has moved out of DSG and into
46
+ * this separate `rerand` protocol: DSG no longer randomizes the key it signs with.
47
+ * A rerand session MUST run before every RedPallas DSG, between the same 2 parties
48
+ * that will then sign:
49
+ *
50
+ * - Round 0 (local): each party commits to a fresh random randomizer.
51
+ * - Round 1 (commit): each party broadcasts its commitment.
52
+ * - Round 2 (open): each party broadcasts its randomizer and blind, bound to the
53
+ * session id. Both parties then locally verify the openings and apply the same
54
+ * tweak `alpha = hash(Σ randomizers)`: `d_i += alpha`, `pk += G·alpha`.
55
+ *
56
+ * The output `RedPallasRerandShare` is a rerandomized keyshare (`share`), the
57
+ * rerandomized public key (`pk`) and the tweak scalar (`alpha`). `share` is what
58
+ * goes into `RedPallasDSG.initDsg`; the resulting DSG signature verifies under
59
+ * `rk == pk`, and `alpha` is only available here — not from the DSG result.
60
+ *
61
+ * Signing a stored DKG keyshare directly (without rerand) still yields a valid
62
+ * signature, but under the bare DKG public key with the same `rk` every time; the
63
+ * rerand → DSG sequence is the supported path.
64
+ *
65
+ * Mirrors the structure of `RedPallasDSG` (see `./dsg.ts`): lazy web/node WASM
66
+ * loading, explicit round state bytes persisted between rounds, hard-coded 2-of-3
67
+ * with a single counterpart, and the same 2-message `handleIncomingMessages`
68
+ * contract (own + counterpart; own is filtered out internally).
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * const rerand = new RedPallasRerand(0); // partyIdx 0
73
+ * await rerand.initRerand(keyShare, 2); // counterpart is party 2
74
+ * const msg1 = rerand.getFirstMessage();
75
+ * const msg2 = rerand.handleIncomingMessages([msg1, peerMsg1]); // emits rerand msg2
76
+ * rerand.handleIncomingMessages([msg2[0], peerMsg2]); // completes rerand
77
+ * const { keyShare, pk, alpha } = rerand.getRerandomizedKeyShare();
78
+ * const dsg = new RedPallasDSG(0);
79
+ * await dsg.initDsg(keyShare, message, 2); // DSG verifies under rk == pk
80
+ * ```
81
+ */
82
+ class RedPallasRerand {
83
+ constructor(partyIdx) {
84
+ this.otherPartyIdx = null;
85
+ /** Opaque bincode-serialised Keyshare from a prior DKG (already derived, if applicable) */
86
+ this.keyShare = null;
87
+ /** Serialised round state bytes returned by the previous round function */
88
+ this.rerandStateBytes = null;
89
+ /** Final rerandomized share bundle, available after WaitMsg2 -> Complete */
90
+ this.rerandResult = null;
91
+ /** Lazily loaded WASM module */
92
+ this.wasmMps = null;
93
+ this.rerandState = types_1.RedPallasRerandState.Uninitialized;
94
+ this.partyIdx = partyIdx;
95
+ }
96
+ getState() {
97
+ return this.rerandState;
98
+ }
99
+ getPartyIdx() {
100
+ return this.partyIdx;
101
+ }
102
+ getOtherPartyIdx() {
103
+ return this.otherPartyIdx;
104
+ }
105
+ async loadWasmMps() {
106
+ if (!this.wasmMps) {
107
+ if (typeof window !== 'undefined' &&
108
+ /* checks for electron processes */
109
+ !window.process &&
110
+ !window.process?.['type']) {
111
+ // Browser: web build has explicit init() — guaranteed ready after await
112
+ // eslint-disable-next-line import/no-internal-modules -- @bitgo/wasm-mps exposes environment-specific subpath exports.
113
+ const webWasm = await Promise.resolve().then(() => __importStar(require('@bitgo/wasm-mps/web')));
114
+ await webWasm.default();
115
+ this.wasmMps = webWasm;
116
+ }
117
+ else {
118
+ // Node.js: dynamic import() rewritten to require() by tsc → CJS build → readFileSync
119
+ this.wasmMps = await Promise.resolve().then(() => __importStar(require('@bitgo/wasm-mps')));
120
+ }
121
+ }
122
+ }
123
+ getWasmMps() {
124
+ if (!this.wasmMps) {
125
+ throw Error('WASM module not loaded');
126
+ }
127
+ return this.wasmMps;
128
+ }
129
+ /**
130
+ * Initialises the rerand session. The keyshare must come from a prior DKG run (and,
131
+ * if a derived key is being used, from the subsequent platform-side derivation
132
+ * process), and `otherPartyIdx` must be the single counterpart who will then co-sign
133
+ * (via DSG) with this party. Rerand and DSG must use the same 2 parties.
134
+ *
135
+ * @param keyShare - Opaque bincode-serialised Keyshare bytes from `RedPallasDKG.getKeyShare()`.
136
+ * @param otherPartyIdx - Party index of the single counterpart in this rerand session.
137
+ * Must differ from this party's own `partyIdx` and be in `[0, 2]`.
138
+ */
139
+ async initRerand(keyShare, otherPartyIdx) {
140
+ await this.loadWasmMps();
141
+ if (!keyShare || keyShare.length === 0) {
142
+ throw Error('Missing or invalid keyShare');
143
+ }
144
+ if (this.partyIdx < 0 || this.partyIdx > 2) {
145
+ throw Error(`Invalid partyIdx ${this.partyIdx}: must be in [0, 2]`);
146
+ }
147
+ if (otherPartyIdx < 0 || otherPartyIdx > 2 || otherPartyIdx === this.partyIdx) {
148
+ throw Error(`Invalid otherPartyIdx ${otherPartyIdx}: must be in [0, 2] and != partyIdx`);
149
+ }
150
+ this.keyShare = keyShare;
151
+ this.otherPartyIdx = otherPartyIdx;
152
+ this.rerandState = types_1.RedPallasRerandState.Init;
153
+ }
154
+ /**
155
+ * Runs round 0 of the rerand protocol (local). Returns this party's broadcast
156
+ * message (a commitment to a fresh random randomizer). Stores the round state
157
+ * bytes internally for the next round.
158
+ */
159
+ getFirstMessage() {
160
+ if (this.rerandState !== types_1.RedPallasRerandState.Init) {
161
+ throw Error('Rerand session not initialized');
162
+ }
163
+ (0, assert_1.default)(this.keyShare, 'keyShare must be set after initRerand');
164
+ const wasm = this.getWasmMps();
165
+ let result;
166
+ try {
167
+ result = wasm.redpallas_rerand_round0_process(this.keyShare);
168
+ }
169
+ catch (err) {
170
+ throw new Error(`Error while creating the first message from party ${this.partyIdx}: ${err}`);
171
+ }
172
+ this.rerandStateBytes = Buffer.from(result.state);
173
+ this.rerandState = types_1.RedPallasRerandState.WaitMsg1;
174
+ return { payload: new Uint8Array(result.msg), from: this.partyIdx };
175
+ }
176
+ /**
177
+ * Handles incoming messages for the current round and advances the protocol.
178
+ *
179
+ * - In `WaitMsg1`: runs round 1 (commit), returns this party's round 2 broadcast
180
+ * (its randomizer and blind).
181
+ * - In `WaitMsg2`: runs round 2 (open + local tweak), completes rerand, returns `[]`.
182
+ *
183
+ * The caller passes both messages (own + counterpart) for symmetry with
184
+ * `RedPallasDSG.handleIncomingMessages`. Own message is filtered out internally;
185
+ * only the counterpart's payload is forwarded to the WASM round function.
186
+ *
187
+ * @param messagesForIthRound - Both messages for this round (own + counterpart).
188
+ */
189
+ handleIncomingMessages(messagesForIthRound) {
190
+ if (this.rerandState === types_1.RedPallasRerandState.Complete) {
191
+ throw Error('Rerand session already completed');
192
+ }
193
+ if (this.rerandState === types_1.RedPallasRerandState.Uninitialized) {
194
+ throw Error('Rerand session not initialized');
195
+ }
196
+ if (this.rerandState === types_1.RedPallasRerandState.Init) {
197
+ throw Error('Rerand session must call getFirstMessage() before handling incoming messages. Call getFirstMessage() first.');
198
+ }
199
+ if (messagesForIthRound.length !== 2) {
200
+ throw Error('Invalid number of messages for the round. Expected 2 messages (own + counterpart) for 2-of-3 rerand');
201
+ }
202
+ const peerMessages = messagesForIthRound.filter((m) => m.from !== this.partyIdx);
203
+ if (peerMessages.length !== 1) {
204
+ throw Error(`Expected exactly 1 counterpart message; got ${peerMessages.length}`);
205
+ }
206
+ const peerMsg = peerMessages[0];
207
+ if (peerMsg.from !== this.otherPartyIdx) {
208
+ throw Error(`Unexpected counterpart party index: got ${peerMsg.from}, expected ${this.otherPartyIdx}`);
209
+ }
210
+ const peerPayload = Buffer.from(peerMsg.payload);
211
+ const wasm = this.getWasmMps();
212
+ if (this.rerandState === types_1.RedPallasRerandState.WaitMsg1) {
213
+ (0, assert_1.default)(this.rerandStateBytes, 'rerandStateBytes must be set in WaitMsg1');
214
+ let result;
215
+ try {
216
+ result = wasm.redpallas_rerand_round1_process(peerPayload, this.rerandStateBytes);
217
+ }
218
+ catch (err) {
219
+ throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.rerandState}: ${err}`);
220
+ }
221
+ this.rerandStateBytes = Buffer.from(result.state);
222
+ this.rerandState = types_1.RedPallasRerandState.WaitMsg2;
223
+ return [{ payload: new Uint8Array(result.msg), from: this.partyIdx }];
224
+ }
225
+ if (this.rerandState === types_1.RedPallasRerandState.WaitMsg2) {
226
+ (0, assert_1.default)(this.rerandStateBytes, 'rerandStateBytes must be set in WaitMsg2');
227
+ let result;
228
+ try {
229
+ result = wasm.redpallas_rerand_round2_process(peerPayload, this.rerandStateBytes);
230
+ }
231
+ catch (err) {
232
+ throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.rerandState}: ${err}`);
233
+ }
234
+ this.rerandResult = {
235
+ keyShare: Buffer.from(result.share),
236
+ pk: Buffer.from(result.pk),
237
+ alpha: Buffer.from(result.alpha),
238
+ };
239
+ this.rerandStateBytes = null;
240
+ this.rerandState = types_1.RedPallasRerandState.Complete;
241
+ return [];
242
+ }
243
+ throw Error('Unexpected rerand state');
244
+ }
245
+ /**
246
+ * Returns the rerandomized share bundle produced by round 2: the rerandomized
247
+ * keyshare `keyShare` (to be passed to `RedPallasDSG.initDsg`), the rerandomized
248
+ * public key `pk` (the DSG result's `rk` equals it), and the 32-byte tweak scalar
249
+ * `alpha` (fresh per rerand session, identical on both parties).
250
+ */
251
+ getRerandomizedKeyShare() {
252
+ if (!this.rerandResult) {
253
+ throw Error('Rerand session has not produced a rerandomized key share yet');
254
+ }
255
+ return this.rerandResult;
256
+ }
257
+ /**
258
+ * Exports the current session state as a JSON string for persistence.
259
+ * Includes the opaque round state bytes plus everything needed to re-enter the
260
+ * protocol after a restart (keyshare, counterpart).
261
+ */
262
+ getSession() {
263
+ if (this.rerandState === types_1.RedPallasRerandState.Complete) {
264
+ throw Error('Rerand session is complete. Exporting the session is not allowed.');
265
+ }
266
+ if (this.rerandState === types_1.RedPallasRerandState.Uninitialized) {
267
+ throw Error('Rerand session not initialized');
268
+ }
269
+ if (this.rerandState === types_1.RedPallasRerandState.Init) {
270
+ throw Error('Rerand session must produce its first message before exporting.');
271
+ }
272
+ return JSON.stringify({
273
+ rerandStateBytes: this.rerandStateBytes?.toString('base64') ?? null,
274
+ rerandRound: this.rerandState,
275
+ keyShare: this.keyShare?.toString('base64') ?? null,
276
+ partyIdx: this.partyIdx,
277
+ otherPartyIdx: this.otherPartyIdx,
278
+ });
279
+ }
280
+ /**
281
+ * Restores a previously exported session. Allows the protocol to continue from
282
+ * where it left off, as if the round state was loaded from a database.
283
+ */
284
+ async restoreSession(session) {
285
+ await this.loadWasmMps();
286
+ const data = JSON.parse(session);
287
+ if (!Object.values(types_1.RedPallasRerandState).includes(data.rerandRound)) {
288
+ throw Error(`Invalid rerandRound in session: ${data.rerandRound}`);
289
+ }
290
+ if (data.rerandRound === types_1.RedPallasRerandState.Uninitialized || data.rerandRound === types_1.RedPallasRerandState.Init) {
291
+ throw Error(`Cannot restore rerand session in state ${data.rerandRound}`);
292
+ }
293
+ if (data.rerandRound === types_1.RedPallasRerandState.Complete) {
294
+ throw Error('Rerand session is complete. Restoring the session is not allowed.');
295
+ }
296
+ if (typeof data.partyIdx !== 'number' || data.partyIdx < 0 || data.partyIdx > 2) {
297
+ throw Error(`Invalid partyIdx in session: ${data.partyIdx}`);
298
+ }
299
+ if (typeof data.otherPartyIdx !== 'number' ||
300
+ data.otherPartyIdx < 0 ||
301
+ data.otherPartyIdx > 2 ||
302
+ data.otherPartyIdx === data.partyIdx) {
303
+ throw Error(`Invalid otherPartyIdx in session: ${data.otherPartyIdx}`);
304
+ }
305
+ if (this.partyIdx !== data.partyIdx) {
306
+ throw Error(`Session partyIdx ${data.partyIdx} does not match instance ${this.partyIdx}`);
307
+ }
308
+ if (typeof data.rerandStateBytes !== 'string' || data.rerandStateBytes.length === 0) {
309
+ throw Error(`Round ${data.rerandRound} requires rerandStateBytes`);
310
+ }
311
+ if (typeof data.keyShare !== 'string' || data.keyShare.length === 0) {
312
+ throw Error('Restored session missing keyShare');
313
+ }
314
+ const rerandStateBytes = Buffer.from(data.rerandStateBytes, 'base64');
315
+ const keyShare = Buffer.from(data.keyShare, 'base64');
316
+ if (rerandStateBytes.length === 0) {
317
+ throw Error(`Round ${data.rerandRound} requires rerandStateBytes`);
318
+ }
319
+ if (keyShare.length === 0) {
320
+ throw Error('Restored session missing keyShare');
321
+ }
322
+ this.rerandStateBytes = rerandStateBytes;
323
+ this.rerandState = data.rerandRound;
324
+ this.keyShare = keyShare;
325
+ this.partyIdx = data.partyIdx;
326
+ this.otherPartyIdx = data.otherPartyIdx;
327
+ }
328
+ }
329
+ exports.RedPallasRerand = RedPallasRerand;
330
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVyYW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9yZWRwYWxsYXMtbXBzL3JlcmFuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsbUNBQWlIO0FBTWpIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Q0c7QUFDSCxNQUFhLGVBQWU7SUFnQjFCLFlBQVksUUFBZ0I7UUFkbEIsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO1FBRTlDLDJGQUEyRjtRQUNuRixhQUFRLEdBQWtCLElBQUksQ0FBQztRQUV2QywyRUFBMkU7UUFDbkUscUJBQWdCLEdBQWtCLElBQUksQ0FBQztRQUMvQyw0RUFBNEU7UUFDcEUsaUJBQVksR0FBaUMsSUFBSSxDQUFDO1FBQzFELGdDQUFnQztRQUN4QixZQUFPLEdBQW1CLElBQUksQ0FBQztRQUU3QixnQkFBVyxHQUF5Qiw0QkFBb0IsQ0FBQyxhQUFhLENBQUM7UUFHL0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQVc7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixJQUNFLE9BQU8sTUFBTSxLQUFLLFdBQVc7Z0JBQzdCLG1DQUFtQztnQkFDbkMsQ0FBQyxNQUFNLENBQUMsT0FBTztnQkFDZixDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFDekIsQ0FBQztnQkFDRCx3RUFBd0U7Z0JBQ3hFLHVIQUF1SDtnQkFDdkgsTUFBTSxPQUFPLEdBQUcsd0RBQWEscUJBQXFCLEdBQUMsQ0FBQztnQkFDcEQsTUFBTSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ3pCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixxRkFBcUY7Z0JBQ3JGLElBQUksQ0FBQyxPQUFPLEdBQUcsd0RBQWEsaUJBQWlCLEdBQUMsQ0FBQztZQUNqRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxVQUFVO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQWdCLEVBQUUsYUFBcUI7UUFDdEQsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQyxNQUFNLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLFFBQVEscUJBQXFCLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsSUFBSSxhQUFhLEdBQUcsQ0FBQyxJQUFJLGFBQWEsR0FBRyxDQUFDLElBQUksYUFBYSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM5RSxNQUFNLEtBQUssQ0FBQyx5QkFBeUIsYUFBYSxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzNGLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLDRCQUFvQixDQUFDLElBQUksQ0FBQztJQUMvQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssNEJBQW9CLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkQsTUFBTSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBQSxnQkFBTSxFQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsdUNBQXVDLENBQUMsQ0FBQztRQUUvRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBSSxNQUFnQixDQUFDO1FBQ3JCLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsSUFBSSxDQUFDLFFBQVEsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2hHLENBQUM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFdBQVcsR0FBRyw0QkFBb0IsQ0FBQyxRQUFRLENBQUM7UUFDakQsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN0RSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsc0JBQXNCLENBQUMsbUJBQXlDO1FBQzlELElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyw0QkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2RCxNQUFNLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssNEJBQW9CLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDNUQsTUFBTSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLDRCQUFvQixDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25ELE1BQU0sS0FBSyxDQUNULDZHQUE2RyxDQUM5RyxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksbUJBQW1CLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sS0FBSyxDQUNULHFHQUFxRyxDQUN0RyxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakYsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sS0FBSyxDQUFDLCtDQUErQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEMsTUFBTSxLQUFLLENBQUMsMkNBQTJDLE9BQU8sQ0FBQyxJQUFJLGNBQWMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDekcsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUUvQixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssNEJBQW9CLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdkQsSUFBQSxnQkFBTSxFQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSwwQ0FBMEMsQ0FBQyxDQUFDO1lBQzFFLElBQUksTUFBZ0IsQ0FBQztZQUNyQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDcEYsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsSUFBSSxDQUFDLFFBQVEsV0FBVyxJQUFJLENBQUMsV0FBVyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDbEgsQ0FBQztZQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsV0FBVyxHQUFHLDRCQUFvQixDQUFDLFFBQVEsQ0FBQztZQUNqRCxPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLDRCQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZELElBQUEsZ0JBQU0sRUFBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsMENBQTBDLENBQUMsQ0FBQztZQUMxRSxJQUFJLE1BQTRCLENBQUM7WUFDakMsSUFBSSxDQUFDO2dCQUNILE1BQU0sR0FBRyxJQUFJLENBQUMsK0JBQStCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3BGLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLElBQUksQ0FBQyxRQUFRLFdBQVcsSUFBSSxDQUFDLFdBQVcsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ2xILENBQUM7WUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHO2dCQUNsQixRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUNuQyxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUMxQixLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ2pDLENBQUM7WUFDRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsNEJBQW9CLENBQUMsUUFBUSxDQUFDO1lBQ2pELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELE1BQU0sS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsdUJBQXVCO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdkIsTUFBTSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsVUFBVTtRQUNSLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyw0QkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2RCxNQUFNLEtBQUssQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO1FBQ25GLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssNEJBQW9CLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDNUQsTUFBTSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLDRCQUFvQixDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25ELE1BQU0sS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFDakYsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNwQixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUk7WUFDbkUsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJO1lBQ25ELFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7U0FDbEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBZTtRQUNsQyxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLDRCQUFvQixDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3BFLE1BQU0sS0FBSyxDQUFDLG1DQUFtQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLDRCQUFvQixDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLDRCQUFvQixDQUFDLElBQUksRUFBRSxDQUFDO1lBQzlHLE1BQU0sS0FBSyxDQUFDLDBDQUEwQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLDRCQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZELE1BQU0sS0FBSyxDQUFDLG1FQUFtRSxDQUFDLENBQUM7UUFDbkYsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hGLE1BQU0sS0FBSyxDQUFDLGdDQUFnQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsSUFDRSxPQUFPLElBQUksQ0FBQyxhQUFhLEtBQUssUUFBUTtZQUN0QyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUM7WUFDdEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFDcEMsQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDLHFDQUFxQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxNQUFNLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLFFBQVEsNEJBQTRCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFDRCxJQUFJLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BGLE1BQU0sS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLFdBQVcsNEJBQTRCLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BFLE1BQU0sS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdEUsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RELElBQUksZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLFdBQVcsNEJBQTRCLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUMxQyxDQUFDO0NBQ0Y7QUFuUkQsMENBbVJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHR5cGUgeyBNc2dTdGF0ZSwgUmVkUGFsbGFzUmVyYW5kU2hhcmUgfSBmcm9tICdAYml0Z28vd2FzbS1tcHMnO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVkTWVzc2FnZSwgRGVzZXJpYWxpemVkTWVzc2FnZXMsIFJlZFBhbGxhc1JlcmFuZFJlc3VsdCwgUmVkUGFsbGFzUmVyYW5kU3RhdGUgfSBmcm9tICcuL3R5cGVzJztcblxudHlwZSBOb2RlV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQGJpdGdvL3dhc20tbXBzJyk7XG50eXBlIFdlYldhc21lciA9IHR5cGVvZiBpbXBvcnQoJ0BiaXRnby93YXNtLW1wcy93ZWInKTtcbnR5cGUgV2FzbU1wcyA9IE5vZGVXYXNtZXIgfCBXZWJXYXNtZXI7XG5cbi8qKlxuICogUmVkUGFsbGFzIChaY2FzaCBJcm9ud29vZCkga2V5IHJlLXJhbmRvbWl6YXRpb24gaW1wbGVtZW50YXRpb24gdXNpbmcgQGJpdGdvL3dhc20tbXBzLlxuICpcbiAqIEFzIG9mIGBAYml0Z28vd2FzbS1tcHNgIDEuMTcuMCwga2V5IHJlLXJhbmRvbWl6YXRpb24gaGFzIG1vdmVkIG91dCBvZiBEU0cgYW5kIGludG9cbiAqIHRoaXMgc2VwYXJhdGUgYHJlcmFuZGAgcHJvdG9jb2w6IERTRyBubyBsb25nZXIgcmFuZG9taXplcyB0aGUga2V5IGl0IHNpZ25zIHdpdGguXG4gKiBBIHJlcmFuZCBzZXNzaW9uIE1VU1QgcnVuIGJlZm9yZSBldmVyeSBSZWRQYWxsYXMgRFNHLCBiZXR3ZWVuIHRoZSBzYW1lIDIgcGFydGllc1xuICogdGhhdCB3aWxsIHRoZW4gc2lnbjpcbiAqXG4gKiAtIFJvdW5kIDAgKGxvY2FsKTogZWFjaCBwYXJ0eSBjb21taXRzIHRvIGEgZnJlc2ggcmFuZG9tIHJhbmRvbWl6ZXIuXG4gKiAtIFJvdW5kIDEgKGNvbW1pdCk6IGVhY2ggcGFydHkgYnJvYWRjYXN0cyBpdHMgY29tbWl0bWVudC5cbiAqIC0gUm91bmQgMiAob3Blbik6IGVhY2ggcGFydHkgYnJvYWRjYXN0cyBpdHMgcmFuZG9taXplciBhbmQgYmxpbmQsIGJvdW5kIHRvIHRoZVxuICogICBzZXNzaW9uIGlkLiBCb3RoIHBhcnRpZXMgdGhlbiBsb2NhbGx5IHZlcmlmeSB0aGUgb3BlbmluZ3MgYW5kIGFwcGx5IHRoZSBzYW1lXG4gKiAgIHR3ZWFrIGBhbHBoYSA9IGhhc2gozqMgcmFuZG9taXplcnMpYDogYGRfaSArPSBhbHBoYWAsIGBwayArPSBHwrdhbHBoYWAuXG4gKlxuICogVGhlIG91dHB1dCBgUmVkUGFsbGFzUmVyYW5kU2hhcmVgIGlzIGEgcmVyYW5kb21pemVkIGtleXNoYXJlIChgc2hhcmVgKSwgdGhlXG4gKiByZXJhbmRvbWl6ZWQgcHVibGljIGtleSAoYHBrYCkgYW5kIHRoZSB0d2VhayBzY2FsYXIgKGBhbHBoYWApLiBgc2hhcmVgIGlzIHdoYXRcbiAqIGdvZXMgaW50byBgUmVkUGFsbGFzRFNHLmluaXREc2dgOyB0aGUgcmVzdWx0aW5nIERTRyBzaWduYXR1cmUgdmVyaWZpZXMgdW5kZXJcbiAqIGByayA9PSBwa2AsIGFuZCBgYWxwaGFgIGlzIG9ubHkgYXZhaWxhYmxlIGhlcmUg4oCUIG5vdCBmcm9tIHRoZSBEU0cgcmVzdWx0LlxuICpcbiAqIFNpZ25pbmcgYSBzdG9yZWQgREtHIGtleXNoYXJlIGRpcmVjdGx5ICh3aXRob3V0IHJlcmFuZCkgc3RpbGwgeWllbGRzIGEgdmFsaWRcbiAqIHNpZ25hdHVyZSwgYnV0IHVuZGVyIHRoZSBiYXJlIERLRyBwdWJsaWMga2V5IHdpdGggdGhlIHNhbWUgYHJrYCBldmVyeSB0aW1lOyB0aGVcbiAqIHJlcmFuZCDihpIgRFNHIHNlcXVlbmNlIGlzIHRoZSBzdXBwb3J0ZWQgcGF0aC5cbiAqXG4gKiBNaXJyb3JzIHRoZSBzdHJ1Y3R1cmUgb2YgYFJlZFBhbGxhc0RTR2AgKHNlZSBgLi9kc2cudHNgKTogbGF6eSB3ZWIvbm9kZSBXQVNNXG4gKiBsb2FkaW5nLCBleHBsaWNpdCByb3VuZCBzdGF0ZSBieXRlcyBwZXJzaXN0ZWQgYmV0d2VlbiByb3VuZHMsIGhhcmQtY29kZWQgMi1vZi0zXG4gKiB3aXRoIGEgc2luZ2xlIGNvdW50ZXJwYXJ0LCBhbmQgdGhlIHNhbWUgMi1tZXNzYWdlIGBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzYFxuICogY29udHJhY3QgKG93biArIGNvdW50ZXJwYXJ0OyBvd24gaXMgZmlsdGVyZWQgb3V0IGludGVybmFsbHkpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXJhbmQgPSBuZXcgUmVkUGFsbGFzUmVyYW5kKDApOyAgLy8gcGFydHlJZHggMFxuICogYXdhaXQgcmVyYW5kLmluaXRSZXJhbmQoa2V5U2hhcmUsIDIpOyAgLy8gY291bnRlcnBhcnQgaXMgcGFydHkgMlxuICogY29uc3QgbXNnMSA9IHJlcmFuZC5nZXRGaXJzdE1lc3NhZ2UoKTtcbiAqIGNvbnN0IG1zZzIgPSByZXJhbmQuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbbXNnMSwgcGVlck1zZzFdKTsgIC8vIGVtaXRzIHJlcmFuZCBtc2cyXG4gKiByZXJhbmQuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbbXNnMlswXSwgcGVlck1zZzJdKTsgIC8vIGNvbXBsZXRlcyByZXJhbmRcbiAqIGNvbnN0IHsga2V5U2hhcmUsIHBrLCBhbHBoYSB9ID0gcmVyYW5kLmdldFJlcmFuZG9taXplZEtleVNoYXJlKCk7XG4gKiBjb25zdCBkc2cgPSBuZXcgUmVkUGFsbGFzRFNHKDApO1xuICogYXdhaXQgZHNnLmluaXREc2coa2V5U2hhcmUsIG1lc3NhZ2UsIDIpOyAgLy8gRFNHIHZlcmlmaWVzIHVuZGVyIHJrID09IHBrXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZFBhbGxhc1JlcmFuZCB7XG4gIHByb3RlY3RlZCBwYXJ0eUlkeDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgb3RoZXJQYXJ0eUlkeDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIE9wYXF1ZSBiaW5jb2RlLXNlcmlhbGlzZWQgS2V5c2hhcmUgZnJvbSBhIHByaW9yIERLRyAoYWxyZWFkeSBkZXJpdmVkLCBpZiBhcHBsaWNhYmxlKSAqL1xuICBwcml2YXRlIGtleVNoYXJlOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcblxuICAvKiogU2VyaWFsaXNlZCByb3VuZCBzdGF0ZSBieXRlcyByZXR1cm5lZCBieSB0aGUgcHJldmlvdXMgcm91bmQgZnVuY3Rpb24gKi9cbiAgcHJpdmF0ZSByZXJhbmRTdGF0ZUJ5dGVzOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIEZpbmFsIHJlcmFuZG9taXplZCBzaGFyZSBidW5kbGUsIGF2YWlsYWJsZSBhZnRlciBXYWl0TXNnMiAtPiBDb21wbGV0ZSAqL1xuICBwcml2YXRlIHJlcmFuZFJlc3VsdDogUmVkUGFsbGFzUmVyYW5kUmVzdWx0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBMYXppbHkgbG9hZGVkIFdBU00gbW9kdWxlICovXG4gIHByaXZhdGUgd2FzbU1wczogV2FzbU1wcyB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCByZXJhbmRTdGF0ZTogUmVkUGFsbGFzUmVyYW5kU3RhdGUgPSBSZWRQYWxsYXNSZXJhbmRTdGF0ZS5VbmluaXRpYWxpemVkO1xuXG4gIGNvbnN0cnVjdG9yKHBhcnR5SWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLnBhcnR5SWR4ID0gcGFydHlJZHg7XG4gIH1cblxuICBnZXRTdGF0ZSgpOiBSZWRQYWxsYXNSZXJhbmRTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMucmVyYW5kU3RhdGU7XG4gIH1cblxuICBnZXRQYXJ0eUlkeCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcnR5SWR4O1xuICB9XG5cbiAgZ2V0T3RoZXJQYXJ0eUlkeCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5vdGhlclBhcnR5SWR4O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkV2FzbU1wcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMud2FzbU1wcykge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAvKiBjaGVja3MgZm9yIGVsZWN0cm9uIHByb2Nlc3NlcyAqL1xuICAgICAgICAhd2luZG93LnByb2Nlc3MgJiZcbiAgICAgICAgIXdpbmRvdy5wcm9jZXNzPy5bJ3R5cGUnXVxuICAgICAgKSB7XG4gICAgICAgIC8vIEJyb3dzZXI6IHdlYiBidWlsZCBoYXMgZXhwbGljaXQgaW5pdCgpIOKAlCBndWFyYW50ZWVkIHJlYWR5IGFmdGVyIGF3YWl0XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8taW50ZXJuYWwtbW9kdWxlcyAtLSBAYml0Z28vd2FzbS1tcHMgZXhwb3NlcyBlbnZpcm9ubWVudC1zcGVjaWZpYyBzdWJwYXRoIGV4cG9ydHMuXG4gICAgICAgIGNvbnN0IHdlYldhc20gPSBhd2FpdCBpbXBvcnQoJ0BiaXRnby93YXNtLW1wcy93ZWInKTtcbiAgICAgICAgYXdhaXQgd2ViV2FzbS5kZWZhdWx0KCk7XG4gICAgICAgIHRoaXMud2FzbU1wcyA9IHdlYldhc207XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb2RlLmpzOiBkeW5hbWljIGltcG9ydCgpIHJld3JpdHRlbiB0byByZXF1aXJlKCkgYnkgdHNjIOKGkiBDSlMgYnVpbGQg4oaSIHJlYWRGaWxlU3luY1xuICAgICAgICB0aGlzLndhc21NcHMgPSBhd2FpdCBpbXBvcnQoJ0BiaXRnby93YXNtLW1wcycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0V2FzbU1wcygpOiBXYXNtTXBzIHtcbiAgICBpZiAoIXRoaXMud2FzbU1wcykge1xuICAgICAgdGhyb3cgRXJyb3IoJ1dBU00gbW9kdWxlIG5vdCBsb2FkZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2FzbU1wcztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNlcyB0aGUgcmVyYW5kIHNlc3Npb24uIFRoZSBrZXlzaGFyZSBtdXN0IGNvbWUgZnJvbSBhIHByaW9yIERLRyBydW4gKGFuZCxcbiAgICogaWYgYSBkZXJpdmVkIGtleSBpcyBiZWluZyB1c2VkLCBmcm9tIHRoZSBzdWJzZXF1ZW50IHBsYXRmb3JtLXNpZGUgZGVyaXZhdGlvblxuICAgKiBwcm9jZXNzKSwgYW5kIGBvdGhlclBhcnR5SWR4YCBtdXN0IGJlIHRoZSBzaW5nbGUgY291bnRlcnBhcnQgd2hvIHdpbGwgdGhlbiBjby1zaWduXG4gICAqICh2aWEgRFNHKSB3aXRoIHRoaXMgcGFydHkuIFJlcmFuZCBhbmQgRFNHIG11c3QgdXNlIHRoZSBzYW1lIDIgcGFydGllcy5cbiAgICpcbiAgICogQHBhcmFtIGtleVNoYXJlIC0gT3BhcXVlIGJpbmNvZGUtc2VyaWFsaXNlZCBLZXlzaGFyZSBieXRlcyBmcm9tIGBSZWRQYWxsYXNES0cuZ2V0S2V5U2hhcmUoKWAuXG4gICAqIEBwYXJhbSBvdGhlclBhcnR5SWR4IC0gUGFydHkgaW5kZXggb2YgdGhlIHNpbmdsZSBjb3VudGVycGFydCBpbiB0aGlzIHJlcmFuZCBzZXNzaW9uLlxuICAgKiAgIE11c3QgZGlmZmVyIGZyb20gdGhpcyBwYXJ0eSdzIG93biBgcGFydHlJZHhgIGFuZCBiZSBpbiBgWzAsIDJdYC5cbiAgICovXG4gIGFzeW5jIGluaXRSZXJhbmQoa2V5U2hhcmU6IEJ1ZmZlciwgb3RoZXJQYXJ0eUlkeDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5sb2FkV2FzbU1wcygpO1xuICAgIGlmICgha2V5U2hhcmUgfHwga2V5U2hhcmUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBvciBpbnZhbGlkIGtleVNoYXJlJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcnR5SWR4IDwgMCB8fCB0aGlzLnBhcnR5SWR4ID4gMikge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgcGFydHlJZHggJHt0aGlzLnBhcnR5SWR4fTogbXVzdCBiZSBpbiBbMCwgMl1gKTtcbiAgICB9XG4gICAgaWYgKG90aGVyUGFydHlJZHggPCAwIHx8IG90aGVyUGFydHlJZHggPiAyIHx8IG90aGVyUGFydHlJZHggPT09IHRoaXMucGFydHlJZHgpIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIG90aGVyUGFydHlJZHggJHtvdGhlclBhcnR5SWR4fTogbXVzdCBiZSBpbiBbMCwgMl0gYW5kICE9IHBhcnR5SWR4YCk7XG4gICAgfVxuXG4gICAgdGhpcy5rZXlTaGFyZSA9IGtleVNoYXJlO1xuICAgIHRoaXMub3RoZXJQYXJ0eUlkeCA9IG90aGVyUGFydHlJZHg7XG4gICAgdGhpcy5yZXJhbmRTdGF0ZSA9IFJlZFBhbGxhc1JlcmFuZFN0YXRlLkluaXQ7XG4gIH1cblxuICAvKipcbiAgICogUnVucyByb3VuZCAwIG9mIHRoZSByZXJhbmQgcHJvdG9jb2wgKGxvY2FsKS4gUmV0dXJucyB0aGlzIHBhcnR5J3MgYnJvYWRjYXN0XG4gICAqIG1lc3NhZ2UgKGEgY29tbWl0bWVudCB0byBhIGZyZXNoIHJhbmRvbSByYW5kb21pemVyKS4gU3RvcmVzIHRoZSByb3VuZCBzdGF0ZVxuICAgKiBieXRlcyBpbnRlcm5hbGx5IGZvciB0aGUgbmV4dCByb3VuZC5cbiAgICovXG4gIGdldEZpcnN0TWVzc2FnZSgpOiBEZXNlcmlhbGl6ZWRNZXNzYWdlIHtcbiAgICBpZiAodGhpcy5yZXJhbmRTdGF0ZSAhPT0gUmVkUGFsbGFzUmVyYW5kU3RhdGUuSW5pdCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1JlcmFuZCBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBhc3NlcnQodGhpcy5rZXlTaGFyZSwgJ2tleVNoYXJlIG11c3QgYmUgc2V0IGFmdGVyIGluaXRSZXJhbmQnKTtcblxuICAgIGNvbnN0IHdhc20gPSB0aGlzLmdldFdhc21NcHMoKTtcbiAgICBsZXQgcmVzdWx0OiBNc2dTdGF0ZTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gd2FzbS5yZWRwYWxsYXNfcmVyYW5kX3JvdW5kMF9wcm9jZXNzKHRoaXMua2V5U2hhcmUpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgZmlyc3QgbWVzc2FnZSBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH06ICR7ZXJyfWApO1xuICAgIH1cblxuICAgIHRoaXMucmVyYW5kU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGF0ZSk7XG4gICAgdGhpcy5yZXJhbmRTdGF0ZSA9IFJlZFBhbGxhc1JlcmFuZFN0YXRlLldhaXRNc2cxO1xuICAgIHJldHVybiB7IHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KHJlc3VsdC5tc2cpLCBmcm9tOiB0aGlzLnBhcnR5SWR4IH07XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBpbmNvbWluZyBtZXNzYWdlcyBmb3IgdGhlIGN1cnJlbnQgcm91bmQgYW5kIGFkdmFuY2VzIHRoZSBwcm90b2NvbC5cbiAgICpcbiAgICogLSBJbiBgV2FpdE1zZzFgOiBydW5zIHJvdW5kIDEgKGNvbW1pdCksIHJldHVybnMgdGhpcyBwYXJ0eSdzIHJvdW5kIDIgYnJvYWRjYXN0XG4gICAqICAgKGl0cyByYW5kb21pemVyIGFuZCBibGluZCkuXG4gICAqIC0gSW4gYFdhaXRNc2cyYDogcnVucyByb3VuZCAyIChvcGVuICsgbG9jYWwgdHdlYWspLCBjb21wbGV0ZXMgcmVyYW5kLCByZXR1cm5zIGBbXWAuXG4gICAqXG4gICAqIFRoZSBjYWxsZXIgcGFzc2VzIGJvdGggbWVzc2FnZXMgKG93biArIGNvdW50ZXJwYXJ0KSBmb3Igc3ltbWV0cnkgd2l0aFxuICAgKiBgUmVkUGFsbGFzRFNHLmhhbmRsZUluY29taW5nTWVzc2FnZXNgLiBPd24gbWVzc2FnZSBpcyBmaWx0ZXJlZCBvdXQgaW50ZXJuYWxseTtcbiAgICogb25seSB0aGUgY291bnRlcnBhcnQncyBwYXlsb2FkIGlzIGZvcndhcmRlZCB0byB0aGUgV0FTTSByb3VuZCBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2VzRm9ySXRoUm91bmQgLSBCb3RoIG1lc3NhZ2VzIGZvciB0aGlzIHJvdW5kIChvd24gKyBjb3VudGVycGFydCkuXG4gICAqL1xuICBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2VzRm9ySXRoUm91bmQ6IERlc2VyaWFsaXplZE1lc3NhZ2VzKTogRGVzZXJpYWxpemVkTWVzc2FnZXMge1xuICAgIGlmICh0aGlzLnJlcmFuZFN0YXRlID09PSBSZWRQYWxsYXNSZXJhbmRTdGF0ZS5Db21wbGV0ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1JlcmFuZCBzZXNzaW9uIGFscmVhZHkgY29tcGxldGVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlcmFuZFN0YXRlID09PSBSZWRQYWxsYXNSZXJhbmRTdGF0ZS5VbmluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignUmVyYW5kIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlcmFuZFN0YXRlID09PSBSZWRQYWxsYXNSZXJhbmRTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgJ1JlcmFuZCBzZXNzaW9uIG11c3QgY2FsbCBnZXRGaXJzdE1lc3NhZ2UoKSBiZWZvcmUgaGFuZGxpbmcgaW5jb21pbmcgbWVzc2FnZXMuIENhbGwgZ2V0Rmlyc3RNZXNzYWdlKCkgZmlyc3QuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2VzRm9ySXRoUm91bmQubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgbnVtYmVyIG9mIG1lc3NhZ2VzIGZvciB0aGUgcm91bmQuIEV4cGVjdGVkIDIgbWVzc2FnZXMgKG93biArIGNvdW50ZXJwYXJ0KSBmb3IgMi1vZi0zIHJlcmFuZCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGVlck1lc3NhZ2VzID0gbWVzc2FnZXNGb3JJdGhSb3VuZC5maWx0ZXIoKG0pID0+IG0uZnJvbSAhPT0gdGhpcy5wYXJ0eUlkeCk7XG4gICAgaWYgKHBlZXJNZXNzYWdlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IEVycm9yKGBFeHBlY3RlZCBleGFjdGx5IDEgY291bnRlcnBhcnQgbWVzc2FnZTsgZ290ICR7cGVlck1lc3NhZ2VzLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgY29uc3QgcGVlck1zZyA9IHBlZXJNZXNzYWdlc1swXTtcbiAgICBpZiAocGVlck1zZy5mcm9tICE9PSB0aGlzLm90aGVyUGFydHlJZHgpIHtcbiAgICAgIHRocm93IEVycm9yKGBVbmV4cGVjdGVkIGNvdW50ZXJwYXJ0IHBhcnR5IGluZGV4OiBnb3QgJHtwZWVyTXNnLmZyb219LCBleHBlY3RlZCAke3RoaXMub3RoZXJQYXJ0eUlkeH1gKTtcbiAgICB9XG4gICAgY29uc3QgcGVlclBheWxvYWQgPSBCdWZmZXIuZnJvbShwZWVyTXNnLnBheWxvYWQpO1xuICAgIGNvbnN0IHdhc20gPSB0aGlzLmdldFdhc21NcHMoKTtcblxuICAgIGlmICh0aGlzLnJlcmFuZFN0YXRlID09PSBSZWRQYWxsYXNSZXJhbmRTdGF0ZS5XYWl0TXNnMSkge1xuICAgICAgYXNzZXJ0KHRoaXMucmVyYW5kU3RhdGVCeXRlcywgJ3JlcmFuZFN0YXRlQnl0ZXMgbXVzdCBiZSBzZXQgaW4gV2FpdE1zZzEnKTtcbiAgICAgIGxldCByZXN1bHQ6IE1zZ1N0YXRlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gd2FzbS5yZWRwYWxsYXNfcmVyYW5kX3JvdW5kMV9wcm9jZXNzKHBlZXJQYXlsb2FkLCB0aGlzLnJlcmFuZFN0YXRlQnl0ZXMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgbWVzc2FnZXMgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9LCByb3VuZCAke3RoaXMucmVyYW5kU3RhdGV9OiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVyYW5kU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGF0ZSk7XG4gICAgICB0aGlzLnJlcmFuZFN0YXRlID0gUmVkUGFsbGFzUmVyYW5kU3RhdGUuV2FpdE1zZzI7XG4gICAgICByZXR1cm4gW3sgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmVzdWx0Lm1zZyksIGZyb206IHRoaXMucGFydHlJZHggfV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVyYW5kU3RhdGUgPT09IFJlZFBhbGxhc1JlcmFuZFN0YXRlLldhaXRNc2cyKSB7XG4gICAgICBhc3NlcnQodGhpcy5yZXJhbmRTdGF0ZUJ5dGVzLCAncmVyYW5kU3RhdGVCeXRlcyBtdXN0IGJlIHNldCBpbiBXYWl0TXNnMicpO1xuICAgICAgbGV0IHJlc3VsdDogUmVkUGFsbGFzUmVyYW5kU2hhcmU7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSB3YXNtLnJlZHBhbGxhc19yZXJhbmRfcm91bmQyX3Byb2Nlc3MocGVlclBheWxvYWQsIHRoaXMucmVyYW5kU3RhdGVCeXRlcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5yZXJhbmRTdGF0ZX06ICR7ZXJyfWApO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXJhbmRSZXN1bHQgPSB7XG4gICAgICAgIGtleVNoYXJlOiBCdWZmZXIuZnJvbShyZXN1bHQuc2hhcmUpLFxuICAgICAgICBwazogQnVmZmVyLmZyb20ocmVzdWx0LnBrKSxcbiAgICAgICAgYWxwaGE6IEJ1ZmZlci5mcm9tKHJlc3VsdC5hbHBoYSksXG4gICAgICB9O1xuICAgICAgdGhpcy5yZXJhbmRTdGF0ZUJ5dGVzID0gbnVsbDtcbiAgICAgIHRoaXMucmVyYW5kU3RhdGUgPSBSZWRQYWxsYXNSZXJhbmRTdGF0ZS5Db21wbGV0ZTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB0aHJvdyBFcnJvcignVW5leHBlY3RlZCByZXJhbmQgc3RhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZXJhbmRvbWl6ZWQgc2hhcmUgYnVuZGxlIHByb2R1Y2VkIGJ5IHJvdW5kIDI6IHRoZSByZXJhbmRvbWl6ZWRcbiAgICoga2V5c2hhcmUgYGtleVNoYXJlYCAodG8gYmUgcGFzc2VkIHRvIGBSZWRQYWxsYXNEU0cuaW5pdERzZ2ApLCB0aGUgcmVyYW5kb21pemVkXG4gICAqIHB1YmxpYyBrZXkgYHBrYCAodGhlIERTRyByZXN1bHQncyBgcmtgIGVxdWFscyBpdCksIGFuZCB0aGUgMzItYnl0ZSB0d2VhayBzY2FsYXJcbiAgICogYGFscGhhYCAoZnJlc2ggcGVyIHJlcmFuZCBzZXNzaW9uLCBpZGVudGljYWwgb24gYm90aCBwYXJ0aWVzKS5cbiAgICovXG4gIGdldFJlcmFuZG9taXplZEtleVNoYXJlKCk6IFJlZFBhbGxhc1JlcmFuZFJlc3VsdCB7XG4gICAgaWYgKCF0aGlzLnJlcmFuZFJlc3VsdCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1JlcmFuZCBzZXNzaW9uIGhhcyBub3QgcHJvZHVjZWQgYSByZXJhbmRvbWl6ZWQga2V5IHNoYXJlIHlldCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXJhbmRSZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0cyB0aGUgY3VycmVudCBzZXNzaW9uIHN0YXRlIGFzIGEgSlNPTiBzdHJpbmcgZm9yIHBlcnNpc3RlbmNlLlxuICAgKiBJbmNsdWRlcyB0aGUgb3BhcXVlIHJvdW5kIHN0YXRlIGJ5dGVzIHBsdXMgZXZlcnl0aGluZyBuZWVkZWQgdG8gcmUtZW50ZXIgdGhlXG4gICAqIHByb3RvY29sIGFmdGVyIGEgcmVzdGFydCAoa2V5c2hhcmUsIGNvdW50ZXJwYXJ0KS5cbiAgICovXG4gIGdldFNlc3Npb24oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5yZXJhbmRTdGF0ZSA9PT0gUmVkUGFsbGFzUmVyYW5kU3RhdGUuQ29tcGxldGUpIHtcbiAgICAgIHRocm93IEVycm9yKCdSZXJhbmQgc2Vzc2lvbiBpcyBjb21wbGV0ZS4gRXhwb3J0aW5nIHRoZSBzZXNzaW9uIGlzIG5vdCBhbGxvd2VkLicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZXJhbmRTdGF0ZSA9PT0gUmVkUGFsbGFzUmVyYW5kU3RhdGUuVW5pbml0aWFsaXplZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1JlcmFuZCBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZXJhbmRTdGF0ZSA9PT0gUmVkUGFsbGFzUmVyYW5kU3RhdGUuSW5pdCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1JlcmFuZCBzZXNzaW9uIG11c3QgcHJvZHVjZSBpdHMgZmlyc3QgbWVzc2FnZSBiZWZvcmUgZXhwb3J0aW5nLicpO1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgcmVyYW5kU3RhdGVCeXRlczogdGhpcy5yZXJhbmRTdGF0ZUJ5dGVzPy50b1N0cmluZygnYmFzZTY0JykgPz8gbnVsbCxcbiAgICAgIHJlcmFuZFJvdW5kOiB0aGlzLnJlcmFuZFN0YXRlLFxuICAgICAga2V5U2hhcmU6IHRoaXMua2V5U2hhcmU/LnRvU3RyaW5nKCdiYXNlNjQnKSA/PyBudWxsLFxuICAgICAgcGFydHlJZHg6IHRoaXMucGFydHlJZHgsXG4gICAgICBvdGhlclBhcnR5SWR4OiB0aGlzLm90aGVyUGFydHlJZHgsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZXMgYSBwcmV2aW91c2x5IGV4cG9ydGVkIHNlc3Npb24uIEFsbG93cyB0aGUgcHJvdG9jb2wgdG8gY29udGludWUgZnJvbVxuICAgKiB3aGVyZSBpdCBsZWZ0IG9mZiwgYXMgaWYgdGhlIHJvdW5kIHN0YXRlIHdhcyBsb2FkZWQgZnJvbSBhIGRhdGFiYXNlLlxuICAgKi9cbiAgYXN5bmMgcmVzdG9yZVNlc3Npb24oc2Vzc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5sb2FkV2FzbU1wcygpO1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHNlc3Npb24pO1xuICAgIGlmICghT2JqZWN0LnZhbHVlcyhSZWRQYWxsYXNSZXJhbmRTdGF0ZSkuaW5jbHVkZXMoZGF0YS5yZXJhbmRSb3VuZCkpIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIHJlcmFuZFJvdW5kIGluIHNlc3Npb246ICR7ZGF0YS5yZXJhbmRSb3VuZH1gKTtcbiAgICB9XG4gICAgaWYgKGRhdGEucmVyYW5kUm91bmQgPT09IFJlZFBhbGxhc1JlcmFuZFN0YXRlLlVuaW5pdGlhbGl6ZWQgfHwgZGF0YS5yZXJhbmRSb3VuZCA9PT0gUmVkUGFsbGFzUmVyYW5kU3RhdGUuSW5pdCkge1xuICAgICAgdGhyb3cgRXJyb3IoYENhbm5vdCByZXN0b3JlIHJlcmFuZCBzZXNzaW9uIGluIHN0YXRlICR7ZGF0YS5yZXJhbmRSb3VuZH1gKTtcbiAgICB9XG4gICAgaWYgKGRhdGEucmVyYW5kUm91bmQgPT09IFJlZFBhbGxhc1JlcmFuZFN0YXRlLkNvbXBsZXRlKSB7XG4gICAgICB0aHJvdyBFcnJvcignUmVyYW5kIHNlc3Npb24gaXMgY29tcGxldGUuIFJlc3RvcmluZyB0aGUgc2Vzc2lvbiBpcyBub3QgYWxsb3dlZC4nKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhLnBhcnR5SWR4ICE9PSAnbnVtYmVyJyB8fCBkYXRhLnBhcnR5SWR4IDwgMCB8fCBkYXRhLnBhcnR5SWR4ID4gMikge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgcGFydHlJZHggaW4gc2Vzc2lvbjogJHtkYXRhLnBhcnR5SWR4fWApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGF0YS5vdGhlclBhcnR5SWR4ICE9PSAnbnVtYmVyJyB8fFxuICAgICAgZGF0YS5vdGhlclBhcnR5SWR4IDwgMCB8fFxuICAgICAgZGF0YS5vdGhlclBhcnR5SWR4ID4gMiB8fFxuICAgICAgZGF0YS5vdGhlclBhcnR5SWR4ID09PSBkYXRhLnBhcnR5SWR4XG4gICAgKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBvdGhlclBhcnR5SWR4IGluIHNlc3Npb246ICR7ZGF0YS5vdGhlclBhcnR5SWR4fWApO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXJ0eUlkeCAhPT0gZGF0YS5wYXJ0eUlkeCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFNlc3Npb24gcGFydHlJZHggJHtkYXRhLnBhcnR5SWR4fSBkb2VzIG5vdCBtYXRjaCBpbnN0YW5jZSAke3RoaXMucGFydHlJZHh9YCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YS5yZXJhbmRTdGF0ZUJ5dGVzICE9PSAnc3RyaW5nJyB8fCBkYXRhLnJlcmFuZFN0YXRlQnl0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcihgUm91bmQgJHtkYXRhLnJlcmFuZFJvdW5kfSByZXF1aXJlcyByZXJhbmRTdGF0ZUJ5dGVzYCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YS5rZXlTaGFyZSAhPT0gJ3N0cmluZycgfHwgZGF0YS5rZXlTaGFyZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdSZXN0b3JlZCBzZXNzaW9uIG1pc3Npbmcga2V5U2hhcmUnKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXJhbmRTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20oZGF0YS5yZXJhbmRTdGF0ZUJ5dGVzLCAnYmFzZTY0Jyk7XG4gICAgY29uc3Qga2V5U2hhcmUgPSBCdWZmZXIuZnJvbShkYXRhLmtleVNoYXJlLCAnYmFzZTY0Jyk7XG4gICAgaWYgKHJlcmFuZFN0YXRlQnl0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcihgUm91bmQgJHtkYXRhLnJlcmFuZFJvdW5kfSByZXF1aXJlcyByZXJhbmRTdGF0ZUJ5dGVzYCk7XG4gICAgfVxuICAgIGlmIChrZXlTaGFyZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdSZXN0b3JlZCBzZXNzaW9uIG1pc3Npbmcga2V5U2hhcmUnKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlcmFuZFN0YXRlQnl0ZXMgPSByZXJhbmRTdGF0ZUJ5dGVzO1xuICAgIHRoaXMucmVyYW5kU3RhdGUgPSBkYXRhLnJlcmFuZFJvdW5kO1xuICAgIHRoaXMua2V5U2hhcmUgPSBrZXlTaGFyZTtcbiAgICB0aGlzLnBhcnR5SWR4ID0gZGF0YS5wYXJ0eUlkeDtcbiAgICB0aGlzLm90aGVyUGFydHlJZHggPSBkYXRhLm90aGVyUGFydHlJZHg7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,120 @@
1
+ import * as t from 'io-ts';
2
+ export declare const RedPallasReducedKeyShareType: t.TypeC<{
3
+ keyShare: t.ArrayC<t.NumberC>;
4
+ pub: t.ArrayC<t.NumberC>;
5
+ }>;
6
+ export type RedPallasReducedKeyShare = t.TypeOf<typeof RedPallasReducedKeyShareType>;
7
+ /**
8
+ * Represents the state of a RedPallas DKG (Distributed Key Generation) session.
9
+ *
10
+ * Unlike the EdDSA MPS `DkgState`, there is no `Share` state: `redpallas_dkg_round2_process`
11
+ * returns a `MsgDerivationInit` (msg/pk/share/state) directly, completing the DKG session in
12
+ * one step. Key derivation (ask/nk/rivk/ivks) is a separate, subsequent, platform-side-only
13
+ * process (`redpallas_derivation_process`) not modelled here.
14
+ */
15
+ export declare enum RedPallasDkgState {
16
+ /** DKG session has not been initialized */
17
+ Uninitialized = "Uninitialized",
18
+ /** DKG session has been initialized (Init state in WASM) */
19
+ Init = "Init",
20
+ /** DKG session is waiting for first message (WaitMsg1 state in WASM) */
21
+ WaitMsg1 = "WaitMsg1",
22
+ /** DKG session is waiting for second message (WaitMsg2 state in WASM) */
23
+ WaitMsg2 = "WaitMsg2",
24
+ /** DKG session has completed successfully and key shares are available */
25
+ Complete = "Complete"
26
+ }
27
+ /**
28
+ * Represents the state of a RedPallas DSG (Distributed Sign Generation) session.
29
+ *
30
+ * Mirrors the EdDSA MPS `DsgState`, except `redpallas_dsg_round0_process` does not take a
31
+ * derivation path: RedPallas key derivation (ask/nk/rivk/ivks) happens separately, upstream,
32
+ * as part of DKG (see `RedPallasDkgState`); the DSG round functions only ever operate on an
33
+ * already-derived (or root) `Keyshare`. The keyshare passed to DSG must come from a prior
34
+ * `RedPallasRerand` session (see `RedPallasRerandState`).
35
+ */
36
+ export declare enum RedPallasDsgState {
37
+ /** DSG session has not been initialized */
38
+ Uninitialized = "Uninitialized",
39
+ /** initDsg() has been called; ready for getFirstMessage() */
40
+ Init = "Init",
41
+ /** R0 broadcast emitted; waiting for counterpart's R0 broadcast (SignMsg1) */
42
+ WaitMsg1 = "WaitMsg1",
43
+ /** R1 broadcast emitted; waiting for counterpart's R1 broadcast (SignMsg2) */
44
+ WaitMsg2 = "WaitMsg2",
45
+ /** R2 broadcast emitted; waiting for counterpart's R2 broadcast (SignMsg3, the partial sig) */
46
+ WaitMsg3 = "WaitMsg3",
47
+ /** Final RedPallas signature (signature/rk) is available via getSignature() */
48
+ Complete = "Complete"
49
+ }
50
+ /**
51
+ * Represents the state of a RedPallas rerand (key re-randomization) session.
52
+ *
53
+ * A rerand session must run before every RedPallas DSG, between the same 2 parties
54
+ * that will then sign. Since `@bitgo/wasm-mps` 1.17.0, DSG no longer randomizes the
55
+ * key it signs with; the randomizer (`alpha`) is produced here instead.
56
+ */
57
+ export declare enum RedPallasRerandState {
58
+ /** Rerand session has not been initialized */
59
+ Uninitialized = "Uninitialized",
60
+ /** initRerand() has been called; ready for getFirstMessage() */
61
+ Init = "Init",
62
+ /** R0 (local commitment) emitted; waiting for counterpart's R0 broadcast (commitment) */
63
+ WaitMsg1 = "WaitMsg1",
64
+ /** R1 broadcast emitted; waiting for counterpart's R1 broadcast (randomizer + blind opening) */
65
+ WaitMsg2 = "WaitMsg2",
66
+ /** Rerandomized key share (keyShare/pk/alpha) is available via getRerandomizedKeyShare() */
67
+ Complete = "Complete"
68
+ }
69
+ /**
70
+ * The final output of a RedPallas rerand session.
71
+ *
72
+ * - `keyShare` is the rerandomized keyshare to be passed to `RedPallasDSG.initDsg`.
73
+ * - `pk` is the rerandomized public key; the DSG result's `rk` equals it, and the DSG
74
+ * signature verifies under it.
75
+ * - `alpha` is the 32-byte tweak scalar applied to both the DKG keyshares and the DKG
76
+ * public key (`pk = pk_dkg + [alpha]G`). It is fresh per rerand session and identical
77
+ * on both parties. Since the rerand protocol moved out of DSG (wasm-mps 1.17.0), this
78
+ * is the only place `alpha` is exposed.
79
+ */
80
+ export interface RedPallasRerandResult {
81
+ keyShare: Buffer;
82
+ pk: Buffer;
83
+ alpha: Buffer;
84
+ }
85
+ /**
86
+ * The final output of a RedPallas DSG session.
87
+ *
88
+ * - `signature` is the 64-byte raw Schnorr (RedPallas) signature.
89
+ * - `rk` is the rerandomized verification key that the signature must be verified against
90
+ * (i.e. `redpallas_verify(rk, signature, message)`), not the DKG public key. DSG does
91
+ * not randomize the key it signs with: `rk` equals the `pk` of the rerandomized
92
+ * keyshare the DSG session was initialized with (see `RedPallasRerandResult`), and
93
+ * the corresponding `alpha` is available from that rerand result.
94
+ */
95
+ export interface RedPallasSignatureResult {
96
+ signature: Buffer;
97
+ rk: Buffer;
98
+ }
99
+ /** A PGP detached-signed message by a party.
100
+ * `message` is the raw payload encoded as base64.
101
+ * `signature` is an armored PGP detached signature over those bytes.
102
+ */
103
+ export interface MPSSignedMessage {
104
+ message: string;
105
+ signature: string;
106
+ }
107
+ export interface Message<T> {
108
+ payload: T;
109
+ from: number;
110
+ }
111
+ export type SerializedMessage = Message<string>;
112
+ export type SerializedMessages = Message<string>[];
113
+ export type DeserializedMessage = Message<Uint8Array>;
114
+ export type DeserializedMessages = Message<Uint8Array>[];
115
+ export declare function serializeMessage(msg: DeserializedMessage): SerializedMessage;
116
+ export declare function deserializeMessage(msg: SerializedMessage): DeserializedMessage;
117
+ export declare function serializeMessages(msgs: DeserializedMessages): SerializedMessages;
118
+ export declare function deserializeMessages(msgs: SerializedMessages): DeserializedMessages;
119
+ export declare function getDecodedReducedKeyShare(reducedKeyShare: Buffer | Uint8Array): RedPallasReducedKeyShare;
120
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/tss/redpallas-mps/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAE3B,eAAO,MAAM,4BAA4B;;;EAGvC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAErF;;;;;;;GAOG;AACH,oBAAY,iBAAiB;IAC3B,2CAA2C;IAC3C,aAAa,kBAAkB;IAC/B,4DAA4D;IAC5D,IAAI,SAAS;IACb,wEAAwE;IACxE,QAAQ,aAAa;IACrB,yEAAyE;IACzE,QAAQ,aAAa;IACrB,0EAA0E;IAC1E,QAAQ,aAAa;CACtB;AAED;;;;;;;;GAQG;AACH,oBAAY,iBAAiB;IAC3B,2CAA2C;IAC3C,aAAa,kBAAkB;IAC/B,6DAA6D;IAC7D,IAAI,SAAS;IACb,8EAA8E;IAC9E,QAAQ,aAAa;IACrB,8EAA8E;IAC9E,QAAQ,aAAa;IACrB,+FAA+F;IAC/F,QAAQ,aAAa;IACrB,+EAA+E;IAC/E,QAAQ,aAAa;CACtB;AAED;;;;;;GAMG;AACH,oBAAY,oBAAoB;IAC9B,8CAA8C;IAC9C,aAAa,kBAAkB;IAC/B,gEAAgE;IAChE,IAAI,SAAS;IACb,yFAAyF;IACzF,QAAQ,aAAa;IACrB,gGAAgG;IAChG,QAAQ,aAAa;IACrB,4FAA4F;IAC5F,QAAQ,aAAa;CACtB;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,OAAO,CAAC,CAAC;IACxB,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAEhD,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;AAEnD,MAAM,MAAM,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtD,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;AAEzD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,mBAAmB,GAAG,iBAAiB,CAE5E;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG,mBAAmB,CAE9E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,oBAAoB,GAAG,kBAAkB,CAEhF;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,GAAG,oBAAoB,CAElF;AAED,wBAAgB,yBAAyB,CAAC,eAAe,EAAE,MAAM,GAAG,UAAU,GAAG,wBAAwB,CAMxG"}