@bitgo-beta/sdk-lib-mpc 8.2.0-beta.213 → 8.2.0-beta.2131
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/curves/ed25519.d.ts +0 -1
- package/dist/src/curves/ed25519.d.ts.map +1 -1
- package/dist/src/curves/ed25519.js +12 -12
- package/dist/src/curves/ed25519Bip32HdTree.js +14 -14
- package/dist/src/curves/index.js +6 -2
- package/dist/src/curves/secp256k1.d.ts +0 -1
- package/dist/src/curves/secp256k1.d.ts.map +1 -1
- package/dist/src/curves/secp256k1.js +22 -38
- package/dist/src/curves/secp256k1Bip32HdTree.js +10 -10
- package/dist/src/curves/types.d.ts +2 -3
- package/dist/src/curves/types.d.ts.map +1 -1
- package/dist/src/curves/util.d.ts +2 -0
- package/dist/src/curves/util.d.ts.map +1 -1
- package/dist/src/curves/util.js +34 -3
- package/dist/src/hashCommitment.d.ts +0 -1
- package/dist/src/hashCommitment.d.ts.map +1 -1
- package/dist/src/hashCommitment.js +7 -8
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +24 -10
- package/dist/src/openssl/index.js +6 -2
- package/dist/src/openssl/openssl.d.ts +1 -2
- package/dist/src/openssl/openssl.d.ts.map +1 -1
- package/dist/src/openssl/openssl.js +4 -12
- package/dist/src/safePrime.d.ts +3 -0
- package/dist/src/safePrime.d.ts.map +1 -0
- package/dist/src/safePrime.js +19 -0
- package/dist/src/schnorrProof.d.ts +0 -1
- package/dist/src/schnorrProof.d.ts.map +1 -1
- package/dist/src/schnorrProof.js +8 -9
- package/dist/src/shamir/index.js +6 -2
- package/dist/src/shamir/shamir.js +2 -2
- package/dist/src/shamir/types.d.ts +1 -1
- package/dist/src/shamir/types.d.ts.map +1 -1
- package/dist/src/tss/dkls-vrf/dkg.d.ts +91 -0
- package/dist/src/tss/dkls-vrf/dkg.d.ts.map +1 -0
- package/dist/src/tss/dkls-vrf/dkg.js +278 -0
- package/dist/src/tss/dkls-vrf/index.d.ts +4 -0
- package/dist/src/tss/dkls-vrf/index.d.ts.map +1 -0
- package/dist/src/tss/dkls-vrf/index.js +40 -0
- package/dist/src/tss/dkls-vrf/types.d.ts +28 -0
- package/dist/src/tss/dkls-vrf/types.d.ts.map +1 -0
- package/dist/src/tss/dkls-vrf/types.js +23 -0
- package/dist/src/tss/dkls-vrf/util.d.ts +63 -0
- package/dist/src/tss/dkls-vrf/util.d.ts.map +1 -0
- package/dist/src/tss/dkls-vrf/util.js +200 -0
- package/dist/src/tss/ecdsa/index.js +23 -9
- package/dist/src/tss/ecdsa/paillierproof.js +10 -10
- package/dist/src/tss/ecdsa/rangeproof.d.ts +1 -2
- package/dist/src/tss/ecdsa/rangeproof.d.ts.map +1 -1
- package/dist/src/tss/ecdsa/rangeproof.js +108 -118
- package/dist/src/tss/ecdsa/types.d.ts +28 -17
- package/dist/src/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/tss/ecdsa/types.js +29 -31
- package/dist/src/tss/ecdsa/zkVProof.d.ts +0 -1
- package/dist/src/tss/ecdsa/zkVProof.d.ts.map +1 -1
- package/dist/src/tss/ecdsa/zkVProof.js +9 -10
- package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts +69 -0
- package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/commsLayer.js +268 -0
- package/dist/src/tss/ecdsa-dkls/derive.d.ts +111 -0
- package/dist/src/tss/ecdsa-dkls/derive.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/derive.js +329 -0
- package/dist/src/tss/ecdsa-dkls/dkg.d.ts +64 -0
- package/dist/src/tss/ecdsa-dkls/dkg.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/dkg.js +309 -0
- package/dist/src/tss/ecdsa-dkls/dsg.d.ts +47 -0
- package/dist/src/tss/ecdsa-dkls/dsg.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/dsg.js +271 -0
- package/dist/src/tss/ecdsa-dkls/index.d.ts +7 -0
- package/dist/src/tss/ecdsa-dkls/index.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/index.js +43 -0
- package/dist/src/tss/ecdsa-dkls/types.d.ts +163 -0
- package/dist/src/tss/ecdsa-dkls/types.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/types.js +215 -0
- package/dist/src/tss/ecdsa-dkls/util.d.ts +26 -0
- package/dist/src/tss/ecdsa-dkls/util.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/util.js +276 -0
- package/dist/src/tss/eddsa-mps/commsLayer.d.ts +30 -0
- package/dist/src/tss/eddsa-mps/commsLayer.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps/commsLayer.js +96 -0
- package/dist/src/tss/eddsa-mps/derive.d.ts +34 -0
- package/dist/src/tss/eddsa-mps/derive.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps/derive.js +198 -0
- package/dist/src/tss/eddsa-mps/dkg.d.ts +109 -0
- package/dist/src/tss/eddsa-mps/dkg.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps/dkg.js +304 -0
- package/dist/src/tss/eddsa-mps/dsg.d.ts +96 -0
- package/dist/src/tss/eddsa-mps/dsg.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps/dsg.js +346 -0
- package/dist/src/tss/eddsa-mps/index.d.ts +8 -0
- package/dist/src/tss/eddsa-mps/index.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps/index.js +43 -0
- package/dist/src/tss/eddsa-mps/types.d.ts +76 -0
- package/dist/src/tss/eddsa-mps/types.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps/types.js +105 -0
- package/dist/src/tss/eddsa-mps/util.d.ts +33 -0
- package/dist/src/tss/eddsa-mps/util.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps/util.js +94 -0
- package/dist/src/tss/eddsa-mps-vrf/dkg.d.ts +65 -0
- package/dist/src/tss/eddsa-mps-vrf/dkg.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps-vrf/dkg.js +246 -0
- package/dist/src/tss/eddsa-mps-vrf/index.d.ts +4 -0
- package/dist/src/tss/eddsa-mps-vrf/index.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps-vrf/index.js +40 -0
- package/dist/src/tss/eddsa-mps-vrf/types.d.ts +31 -0
- package/dist/src/tss/eddsa-mps-vrf/types.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps-vrf/types.js +97 -0
- package/dist/src/tss/eddsa-mps-vrf/util.d.ts +29 -0
- package/dist/src/tss/eddsa-mps-vrf/util.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps-vrf/util.js +75 -0
- package/dist/src/tss/index.d.ts +5 -0
- package/dist/src/tss/index.d.ts.map +1 -1
- package/dist/src/tss/index.js +11 -2
- package/dist/src/tss/redpallas-mps/commsLayer.d.ts +34 -0
- package/dist/src/tss/redpallas-mps/commsLayer.d.ts.map +1 -0
- package/dist/src/tss/redpallas-mps/commsLayer.js +100 -0
- package/dist/src/tss/redpallas-mps/dkg.d.ts +103 -0
- package/dist/src/tss/redpallas-mps/dkg.d.ts.map +1 -0
- package/dist/src/tss/redpallas-mps/dkg.js +285 -0
- package/dist/src/tss/redpallas-mps/dsg.d.ts +130 -0
- package/dist/src/tss/redpallas-mps/dsg.d.ts.map +1 -0
- package/dist/src/tss/redpallas-mps/dsg.js +376 -0
- package/dist/src/tss/redpallas-mps/index.d.ts +8 -0
- package/dist/src/tss/redpallas-mps/index.d.ts.map +1 -0
- package/dist/src/tss/redpallas-mps/index.js +43 -0
- package/dist/src/tss/redpallas-mps/rerand.d.ts +110 -0
- package/dist/src/tss/redpallas-mps/rerand.d.ts.map +1 -0
- package/dist/src/tss/redpallas-mps/rerand.js +330 -0
- package/dist/src/tss/redpallas-mps/types.d.ts +120 -0
- package/dist/src/tss/redpallas-mps/types.d.ts.map +1 -0
- package/dist/src/tss/redpallas-mps/types.js +133 -0
- package/dist/src/tss/redpallas-mps/util.d.ts +56 -0
- package/dist/src/tss/redpallas-mps/util.d.ts.map +1 -0
- package/dist/src/tss/redpallas-mps/util.js +173 -0
- package/dist/src/types.d.ts +0 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/util.d.ts +0 -1
- package/dist/src/util.d.ts.map +1 -1
- package/dist/src/util.js +21 -22
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +42 -5
- package/.eslintignore +0 -5
- package/CHANGELOG.md +0 -356
- package/dist/src/openssl/opensslbytes.d.ts +0 -4
- package/dist/src/openssl/opensslbytes.d.ts.map +0 -1
- package/dist/src/openssl/opensslbytes.js +0 -20
|
@@ -0,0 +1,376 @@
|
|
|
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.RedPallasDSG = void 0;
|
|
40
|
+
const assert_1 = __importDefault(require("assert"));
|
|
41
|
+
const types_1 = require("./types");
|
|
42
|
+
/**
|
|
43
|
+
* RedPallas (Zcash Ironwood) Distributed Sign Generation (DSG) implementation using
|
|
44
|
+
* @bitgo/wasm-mps.
|
|
45
|
+
*
|
|
46
|
+
* Mirrors the structure of the EdDSA MPS `DSG` class (see `../eddsa-mps/dsg.ts`), but wraps
|
|
47
|
+
* the `redpallas_dsg_*` WASM bindings. Unlike the EdDSA version:
|
|
48
|
+
*
|
|
49
|
+
* - `redpallas_dsg_round0_process` does not take a derivation path: RedPallas key derivation
|
|
50
|
+
* (ask/nk/rivk/ivks) happens upstream, as part of DKG (`redpallas_dkg_round2_process` +
|
|
51
|
+
* the platform-side-only `redpallas_derivation_process`); DSG only ever operates on an
|
|
52
|
+
* already-derived (or root) opaque `Keyshare`.
|
|
53
|
+
* - DSG does not randomize the key it signs with: since `@bitgo/wasm-mps` 1.17.0, key
|
|
54
|
+
* re-randomization is a separate `rerand` protocol (see `./rerand.ts`, `RedPallasRerand`)
|
|
55
|
+
* that must run before every DSG, between the same 2 parties. The keyshare passed to
|
|
56
|
+
* `initDsg` must be the `keyShare` from that rerand result.
|
|
57
|
+
* - Round3 does not return a raw signature; it returns a `RedPallasSignature` bundle of
|
|
58
|
+
* `signature` (64 raw bytes) and `rk` (the rerandomized verification key the signature
|
|
59
|
+
* verifies against — NOT the DKG public key). `rk` equals the `pk` of the rerand result
|
|
60
|
+
* the DSG session was initialized with. See `RedPallasSignatureResult`.
|
|
61
|
+
*
|
|
62
|
+
* Signing a stored DKG keyshare directly (without rerand) still produces a valid
|
|
63
|
+
* signature — under the bare DKG public key, with the same `rk` every spend — but the
|
|
64
|
+
* supported, tested path is rerand → DSG.
|
|
65
|
+
*
|
|
66
|
+
* State is explicit: each WASM round function returns `{ msg, state }` bytes; the state
|
|
67
|
+
* bytes are stored between rounds and passed to the next round function (this is what a
|
|
68
|
+
* server would persist to a database between API rounds).
|
|
69
|
+
*
|
|
70
|
+
* The protocol is hard-coded 2-of-3: each signing party communicates with exactly one
|
|
71
|
+
* counterpart. `handleIncomingMessages` accepts both messages (own + counterpart), and
|
|
72
|
+
* filters own out internally.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```typescript
|
|
76
|
+
* // Rerand first — same 2 parties that will sign (see RedPallasRerand).
|
|
77
|
+
* const rerand = new RedPallasRerand(0);
|
|
78
|
+
* await rerand.initRerand(dkgKeyShare, 2);
|
|
79
|
+
* const rerandMsg1 = rerand.getFirstMessage();
|
|
80
|
+
* const rerandMsg2 = rerand.handleIncomingMessages([rerandMsg1, peerRerandMsg1]);
|
|
81
|
+
* rerand.handleIncomingMessages([rerandMsg2[0], peerRerandMsg2]);
|
|
82
|
+
* const { keyShare, pk, alpha } = rerand.getRerandomizedKeyShare();
|
|
83
|
+
*
|
|
84
|
+
* const dsg = new RedPallasDSG(0); // partyIdx 0
|
|
85
|
+
* await dsg.initDsg(keyShare, message, 2); // counterpart is party 2
|
|
86
|
+
* const msg1 = dsg.getFirstMessage();
|
|
87
|
+
* const msg2 = dsg.handleIncomingMessages([msg1, peerMsg1]); // emits SignMsg2
|
|
88
|
+
* const msg3 = dsg.handleIncomingMessages([msg2[0], peerMsg2]); // emits SignMsg3
|
|
89
|
+
* dsg.handleIncomingMessages([msg3[0], peerMsg3]); // completes DSG
|
|
90
|
+
* const { signature, rk } = dsg.getSignature(); // verifies under rk == pk
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
class RedPallasDSG {
|
|
94
|
+
constructor(partyIdx) {
|
|
95
|
+
this.otherPartyIdx = null;
|
|
96
|
+
/** Opaque bincode-serialised Keyshare from a prior DKG (already derived, if applicable) */
|
|
97
|
+
this.keyShare = null;
|
|
98
|
+
/** Raw message bytes to sign */
|
|
99
|
+
this.message = null;
|
|
100
|
+
/** Serialised round state bytes returned by the previous round function */
|
|
101
|
+
this.dsgStateBytes = null;
|
|
102
|
+
/** Final signature bundle, available after WaitMsg3 -> Complete */
|
|
103
|
+
this.signatureResult = null;
|
|
104
|
+
/** Lazily loaded WASM module */
|
|
105
|
+
this.wasmMps = null;
|
|
106
|
+
this.dsgState = types_1.RedPallasDsgState.Uninitialized;
|
|
107
|
+
this.partyIdx = partyIdx;
|
|
108
|
+
}
|
|
109
|
+
getState() {
|
|
110
|
+
return this.dsgState;
|
|
111
|
+
}
|
|
112
|
+
getPartyIdx() {
|
|
113
|
+
return this.partyIdx;
|
|
114
|
+
}
|
|
115
|
+
getOtherPartyIdx() {
|
|
116
|
+
return this.otherPartyIdx;
|
|
117
|
+
}
|
|
118
|
+
async loadWasmMps() {
|
|
119
|
+
if (!this.wasmMps) {
|
|
120
|
+
if (typeof window !== 'undefined' &&
|
|
121
|
+
/* checks for electron processes */
|
|
122
|
+
!window.process &&
|
|
123
|
+
!window.process?.['type']) {
|
|
124
|
+
// Browser: web build has explicit init() — guaranteed ready after await
|
|
125
|
+
// eslint-disable-next-line import/no-internal-modules -- @bitgo/wasm-mps exposes environment-specific subpath exports.
|
|
126
|
+
const webWasm = await Promise.resolve().then(() => __importStar(require('@bitgo/wasm-mps/web')));
|
|
127
|
+
await webWasm.default();
|
|
128
|
+
this.wasmMps = webWasm;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// Node.js: dynamic import() rewritten to require() by tsc → CJS build → readFileSync
|
|
132
|
+
this.wasmMps = await Promise.resolve().then(() => __importStar(require('@bitgo/wasm-mps')));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
getWasmMps() {
|
|
137
|
+
if (!this.wasmMps) {
|
|
138
|
+
throw Error('WASM module not loaded');
|
|
139
|
+
}
|
|
140
|
+
return this.wasmMps;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Initialises the DSG session. The keyshare must be the rerandomized `keyShare` from
|
|
144
|
+
* a prior `RedPallasRerand` run with the same counterpart (which itself takes the
|
|
145
|
+
* opaque Keyshare from DKG — already derived, if applicable). Signing a bare DKG
|
|
146
|
+
* keyshare produces a valid but non-rerandomized signature under the DKG public key;
|
|
147
|
+
* use rerand → DSG instead. `otherPartyIdx` must be the single counterpart who ran
|
|
148
|
+
* that rerand session and will co-sign with this party.
|
|
149
|
+
*
|
|
150
|
+
* @param keyShare - Opaque bincode-serialised rerandomized Keyshare bytes from
|
|
151
|
+
* `RedPallasRerand.getRerandomizedKeyShare().keyShare`.
|
|
152
|
+
* @param message - Raw message bytes to sign.
|
|
153
|
+
* @param otherPartyIdx - Party index of the single counterpart in this signing session.
|
|
154
|
+
* Must differ from this party's own `partyIdx` and be in `[0, 2]`, and match the
|
|
155
|
+
* counterpart of the preceding rerand session.
|
|
156
|
+
*/
|
|
157
|
+
async initDsg(keyShare, message, otherPartyIdx) {
|
|
158
|
+
await this.loadWasmMps();
|
|
159
|
+
if (!keyShare || keyShare.length === 0) {
|
|
160
|
+
throw Error('Missing or invalid keyShare');
|
|
161
|
+
}
|
|
162
|
+
if (!message || message.length === 0) {
|
|
163
|
+
throw Error('Missing or invalid message');
|
|
164
|
+
}
|
|
165
|
+
if (this.partyIdx < 0 || this.partyIdx > 2) {
|
|
166
|
+
throw Error(`Invalid partyIdx ${this.partyIdx}: must be in [0, 2]`);
|
|
167
|
+
}
|
|
168
|
+
if (otherPartyIdx < 0 || otherPartyIdx > 2 || otherPartyIdx === this.partyIdx) {
|
|
169
|
+
throw Error(`Invalid otherPartyIdx ${otherPartyIdx}: must be in [0, 2] and != partyIdx`);
|
|
170
|
+
}
|
|
171
|
+
this.keyShare = keyShare;
|
|
172
|
+
this.message = message;
|
|
173
|
+
this.otherPartyIdx = otherPartyIdx;
|
|
174
|
+
this.dsgState = types_1.RedPallasDsgState.Init;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Runs round 0 of the DSG protocol. Returns this party's broadcast message
|
|
178
|
+
* (a `SignMsg1` containing the commitment to `R_i`). Stores the round state
|
|
179
|
+
* bytes internally for the next round.
|
|
180
|
+
*/
|
|
181
|
+
getFirstMessage() {
|
|
182
|
+
if (this.dsgState !== types_1.RedPallasDsgState.Init) {
|
|
183
|
+
throw Error('DSG session not initialized');
|
|
184
|
+
}
|
|
185
|
+
(0, assert_1.default)(this.keyShare, 'keyShare must be set after initDsg');
|
|
186
|
+
(0, assert_1.default)(this.message, 'message must be set after initDsg');
|
|
187
|
+
const wasm = this.getWasmMps();
|
|
188
|
+
let result;
|
|
189
|
+
try {
|
|
190
|
+
result = wasm.redpallas_dsg_round0_process(this.keyShare, this.message);
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
throw new Error(`Error while creating the first message from party ${this.partyIdx}: ${err}`);
|
|
194
|
+
}
|
|
195
|
+
this.dsgStateBytes = Buffer.from(result.state);
|
|
196
|
+
this.dsgState = types_1.RedPallasDsgState.WaitMsg1;
|
|
197
|
+
return { payload: new Uint8Array(result.msg), from: this.partyIdx };
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Handles incoming messages for the current round and advances the protocol.
|
|
201
|
+
*
|
|
202
|
+
* - In `WaitMsg1`: runs round 1, returns this party's `SignMsg2` broadcast.
|
|
203
|
+
* - In `WaitMsg2`: runs round 2 (which internally fuses two Silence Labs transitions),
|
|
204
|
+
* returns this party's `SignMsg3` broadcast (partial signature).
|
|
205
|
+
* - In `WaitMsg3`: runs round 3, completes DSG, returns `[]`.
|
|
206
|
+
*
|
|
207
|
+
* The caller passes both messages (own + counterpart) for symmetry with
|
|
208
|
+
* `RedPallasDKG.handleIncomingMessages`. Own message is filtered out internally; only the
|
|
209
|
+
* counterpart's payload is forwarded to the WASM round function.
|
|
210
|
+
*
|
|
211
|
+
* @param messagesForIthRound - Both messages for this round (own + counterpart).
|
|
212
|
+
*/
|
|
213
|
+
handleIncomingMessages(messagesForIthRound) {
|
|
214
|
+
if (this.dsgState === types_1.RedPallasDsgState.Complete) {
|
|
215
|
+
throw Error('DSG session already completed');
|
|
216
|
+
}
|
|
217
|
+
if (this.dsgState === types_1.RedPallasDsgState.Uninitialized) {
|
|
218
|
+
throw Error('DSG session not initialized');
|
|
219
|
+
}
|
|
220
|
+
if (this.dsgState === types_1.RedPallasDsgState.Init) {
|
|
221
|
+
throw Error('DSG session must call getFirstMessage() before handling incoming messages. Call getFirstMessage() first.');
|
|
222
|
+
}
|
|
223
|
+
if (messagesForIthRound.length !== 2) {
|
|
224
|
+
throw Error('Invalid number of messages for the round. Expected 2 messages (own + counterpart) for 2-of-3 DSG');
|
|
225
|
+
}
|
|
226
|
+
const peerMessages = messagesForIthRound.filter((m) => m.from !== this.partyIdx);
|
|
227
|
+
if (peerMessages.length !== 1) {
|
|
228
|
+
throw Error(`Expected exactly 1 counterpart message; got ${peerMessages.length}`);
|
|
229
|
+
}
|
|
230
|
+
const peerMsg = peerMessages[0];
|
|
231
|
+
if (peerMsg.from !== this.otherPartyIdx) {
|
|
232
|
+
throw Error(`Unexpected counterpart party index: got ${peerMsg.from}, expected ${this.otherPartyIdx}`);
|
|
233
|
+
}
|
|
234
|
+
const peerPayload = Buffer.from(peerMsg.payload);
|
|
235
|
+
const wasm = this.getWasmMps();
|
|
236
|
+
if (this.dsgState === types_1.RedPallasDsgState.WaitMsg1) {
|
|
237
|
+
(0, assert_1.default)(this.dsgStateBytes, 'dsgStateBytes must be set in WaitMsg1');
|
|
238
|
+
let result;
|
|
239
|
+
try {
|
|
240
|
+
result = wasm.redpallas_dsg_round1_process(peerPayload, this.dsgStateBytes);
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dsgState}: ${err}`);
|
|
244
|
+
}
|
|
245
|
+
this.dsgStateBytes = Buffer.from(result.state);
|
|
246
|
+
this.dsgState = types_1.RedPallasDsgState.WaitMsg2;
|
|
247
|
+
return [{ payload: new Uint8Array(result.msg), from: this.partyIdx }];
|
|
248
|
+
}
|
|
249
|
+
if (this.dsgState === types_1.RedPallasDsgState.WaitMsg2) {
|
|
250
|
+
(0, assert_1.default)(this.dsgStateBytes, 'dsgStateBytes must be set in WaitMsg2');
|
|
251
|
+
let result;
|
|
252
|
+
try {
|
|
253
|
+
result = wasm.redpallas_dsg_round2_process(peerPayload, this.dsgStateBytes);
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dsgState}: ${err}`);
|
|
257
|
+
}
|
|
258
|
+
this.dsgStateBytes = Buffer.from(result.state);
|
|
259
|
+
this.dsgState = types_1.RedPallasDsgState.WaitMsg3;
|
|
260
|
+
return [{ payload: new Uint8Array(result.msg), from: this.partyIdx }];
|
|
261
|
+
}
|
|
262
|
+
if (this.dsgState === types_1.RedPallasDsgState.WaitMsg3) {
|
|
263
|
+
(0, assert_1.default)(this.dsgStateBytes, 'dsgStateBytes must be set in WaitMsg3');
|
|
264
|
+
let result;
|
|
265
|
+
try {
|
|
266
|
+
result = wasm.redpallas_dsg_round3_process(peerPayload, this.dsgStateBytes);
|
|
267
|
+
}
|
|
268
|
+
catch (err) {
|
|
269
|
+
throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dsgState}: ${err}`);
|
|
270
|
+
}
|
|
271
|
+
this.signatureResult = {
|
|
272
|
+
signature: Buffer.from(result.signature),
|
|
273
|
+
rk: Buffer.from(result.rk),
|
|
274
|
+
};
|
|
275
|
+
this.dsgStateBytes = null;
|
|
276
|
+
this.dsgState = types_1.RedPallasDsgState.Complete;
|
|
277
|
+
return [];
|
|
278
|
+
}
|
|
279
|
+
throw Error('Unexpected DSG state');
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Returns the final signature bundle produced by round 3: the 64-byte raw RedPallas
|
|
283
|
+
* signature and the rerandomized verification key `rk` it must be verified against
|
|
284
|
+
* (via `redpallas_verify(rk, signature, message)` — NOT the DKG public key). `rk`
|
|
285
|
+
* equals the `pk` of the rerand result this session was initialized with; the
|
|
286
|
+
* corresponding `alpha` is available from `RedPallasRerand.getRerandomizedKeyShare()`.
|
|
287
|
+
*/
|
|
288
|
+
getSignature() {
|
|
289
|
+
if (!this.signatureResult) {
|
|
290
|
+
throw Error('DSG session has not produced a signature yet');
|
|
291
|
+
}
|
|
292
|
+
return this.signatureResult;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Exports the current session state as a JSON string for persistence.
|
|
296
|
+
* Includes the opaque round state bytes plus everything needed to re-enter the
|
|
297
|
+
* protocol after a restart (keyshare, message, counterpart).
|
|
298
|
+
*/
|
|
299
|
+
getSession() {
|
|
300
|
+
if (this.dsgState === types_1.RedPallasDsgState.Complete) {
|
|
301
|
+
throw Error('DSG session is complete. Exporting the session is not allowed.');
|
|
302
|
+
}
|
|
303
|
+
if (this.dsgState === types_1.RedPallasDsgState.Uninitialized) {
|
|
304
|
+
throw Error('DSG session not initialized');
|
|
305
|
+
}
|
|
306
|
+
if (this.dsgState === types_1.RedPallasDsgState.Init) {
|
|
307
|
+
throw Error('DSG session must produce its first message before exporting.');
|
|
308
|
+
}
|
|
309
|
+
return JSON.stringify({
|
|
310
|
+
dsgStateBytes: this.dsgStateBytes?.toString('base64') ?? null,
|
|
311
|
+
dsgRound: this.dsgState,
|
|
312
|
+
keyShare: this.keyShare?.toString('base64') ?? null,
|
|
313
|
+
message: this.message?.toString('base64') ?? null,
|
|
314
|
+
partyIdx: this.partyIdx,
|
|
315
|
+
otherPartyIdx: this.otherPartyIdx,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Restores a previously exported session. Allows the protocol to continue from
|
|
320
|
+
* where it left off, as if the round state was loaded from a database.
|
|
321
|
+
*/
|
|
322
|
+
async restoreSession(session) {
|
|
323
|
+
await this.loadWasmMps();
|
|
324
|
+
const data = JSON.parse(session);
|
|
325
|
+
if (!Object.values(types_1.RedPallasDsgState).includes(data.dsgRound)) {
|
|
326
|
+
throw Error(`Invalid dsgRound in session: ${data.dsgRound}`);
|
|
327
|
+
}
|
|
328
|
+
if (data.dsgRound === types_1.RedPallasDsgState.Uninitialized || data.dsgRound === types_1.RedPallasDsgState.Init) {
|
|
329
|
+
throw Error(`Cannot restore DSG session in state ${data.dsgRound}`);
|
|
330
|
+
}
|
|
331
|
+
if (data.dsgRound === types_1.RedPallasDsgState.Complete) {
|
|
332
|
+
throw Error('DSG session is complete. Restoring the session is not allowed.');
|
|
333
|
+
}
|
|
334
|
+
if (typeof data.partyIdx !== 'number' || data.partyIdx < 0 || data.partyIdx > 2) {
|
|
335
|
+
throw Error(`Invalid partyIdx in session: ${data.partyIdx}`);
|
|
336
|
+
}
|
|
337
|
+
if (typeof data.otherPartyIdx !== 'number' ||
|
|
338
|
+
data.otherPartyIdx < 0 ||
|
|
339
|
+
data.otherPartyIdx > 2 ||
|
|
340
|
+
data.otherPartyIdx === data.partyIdx) {
|
|
341
|
+
throw Error(`Invalid otherPartyIdx in session: ${data.otherPartyIdx}`);
|
|
342
|
+
}
|
|
343
|
+
if (this.partyIdx !== data.partyIdx) {
|
|
344
|
+
throw Error(`Session partyIdx ${data.partyIdx} does not match instance ${this.partyIdx}`);
|
|
345
|
+
}
|
|
346
|
+
if (typeof data.dsgStateBytes !== 'string' || data.dsgStateBytes.length === 0) {
|
|
347
|
+
throw Error(`Round ${data.dsgRound} requires dsgStateBytes`);
|
|
348
|
+
}
|
|
349
|
+
if (typeof data.keyShare !== 'string' || data.keyShare.length === 0) {
|
|
350
|
+
throw Error('Restored session missing keyShare');
|
|
351
|
+
}
|
|
352
|
+
if (typeof data.message !== 'string' || data.message.length === 0) {
|
|
353
|
+
throw Error('Restored session missing message');
|
|
354
|
+
}
|
|
355
|
+
const dsgStateBytes = Buffer.from(data.dsgStateBytes, 'base64');
|
|
356
|
+
const keyShare = Buffer.from(data.keyShare, 'base64');
|
|
357
|
+
const message = Buffer.from(data.message, 'base64');
|
|
358
|
+
if (dsgStateBytes.length === 0) {
|
|
359
|
+
throw Error(`Round ${data.dsgRound} requires dsgStateBytes`);
|
|
360
|
+
}
|
|
361
|
+
if (keyShare.length === 0) {
|
|
362
|
+
throw Error('Restored session missing keyShare');
|
|
363
|
+
}
|
|
364
|
+
if (message.length === 0) {
|
|
365
|
+
throw Error('Restored session missing message');
|
|
366
|
+
}
|
|
367
|
+
this.dsgStateBytes = dsgStateBytes;
|
|
368
|
+
this.dsgState = data.dsgRound;
|
|
369
|
+
this.keyShare = keyShare;
|
|
370
|
+
this.message = message;
|
|
371
|
+
this.partyIdx = data.partyIdx;
|
|
372
|
+
this.otherPartyIdx = data.otherPartyIdx;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
exports.RedPallasDSG = RedPallasDSG;
|
|
376
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHNnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9yZWRwYWxsYXMtbXBzL2RzZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsbUNBQWlIO0FBTWpIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERztBQUNILE1BQWEsWUFBWTtJQWtCdkIsWUFBWSxRQUFnQjtRQWhCbEIsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO1FBRTlDLDJGQUEyRjtRQUNuRixhQUFRLEdBQWtCLElBQUksQ0FBQztRQUN2QyxnQ0FBZ0M7UUFDeEIsWUFBTyxHQUFrQixJQUFJLENBQUM7UUFFdEMsMkVBQTJFO1FBQ25FLGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQUM1QyxtRUFBbUU7UUFDM0Qsb0JBQWUsR0FBb0MsSUFBSSxDQUFDO1FBQ2hFLGdDQUFnQztRQUN4QixZQUFPLEdBQW1CLElBQUksQ0FBQztRQUU3QixhQUFRLEdBQXNCLHlCQUFpQixDQUFDLGFBQWEsQ0FBQztRQUd0RSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFTyxLQUFLLENBQUMsV0FBVztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLElBQ0UsT0FBTyxNQUFNLEtBQUssV0FBVztnQkFDN0IsbUNBQW1DO2dCQUNuQyxDQUFDLE1BQU0sQ0FBQyxPQUFPO2dCQUNmLENBQUMsTUFB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bXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgdHlwZSB7IE1zZ1N0YXRlLCBSZWRQYWxsYXNTaWduYXR1cmUgfSBmcm9tICdAYml0Z28vd2FzbS1tcHMnO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVkTWVzc2FnZSwgRGVzZXJpYWxpemVkTWVzc2FnZXMsIFJlZFBhbGxhc0RzZ1N0YXRlLCBSZWRQYWxsYXNTaWduYXR1cmVSZXN1bHQgfSBmcm9tICcuL3R5cGVzJztcblxudHlwZSBOb2RlV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQGJpdGdvL3dhc20tbXBzJyk7XG50eXBlIFdlYldhc21lciA9IHR5cGVvZiBpbXBvcnQoJ0BiaXRnby93YXNtLW1wcy93ZWInKTtcbnR5cGUgV2FzbU1wcyA9IE5vZGVXYXNtZXIgfCBXZWJXYXNtZXI7XG5cbi8qKlxuICogUmVkUGFsbGFzIChaY2FzaCBJcm9ud29vZCkgRGlzdHJpYnV0ZWQgU2lnbiBHZW5lcmF0aW9uIChEU0cpIGltcGxlbWVudGF0aW9uIHVzaW5nXG4gKiBAYml0Z28vd2FzbS1tcHMuXG4gKlxuICogTWlycm9ycyB0aGUgc3RydWN0dXJlIG9mIHRoZSBFZERTQSBNUFMgYERTR2AgY2xhc3MgKHNlZSBgLi4vZWRkc2EtbXBzL2RzZy50c2ApLCBidXQgd3JhcHNcbiAqIHRoZSBgcmVkcGFsbGFzX2RzZ18qYCBXQVNNIGJpbmRpbmdzLiBVbmxpa2UgdGhlIEVkRFNBIHZlcnNpb246XG4gKlxuICogLSBgcmVkcGFsbGFzX2RzZ19yb3VuZDBfcHJvY2Vzc2AgZG9lcyBub3QgdGFrZSBhIGRlcml2YXRpb24gcGF0aDogUmVkUGFsbGFzIGtleSBkZXJpdmF0aW9uXG4gKiAgIChhc2svbmsvcml2ay9pdmtzKSBoYXBwZW5zIHVwc3RyZWFtLCBhcyBwYXJ0IG9mIERLRyAoYHJlZHBhbGxhc19ka2dfcm91bmQyX3Byb2Nlc3NgICtcbiAqICAgdGhlIHBsYXRmb3JtLXNpZGUtb25seSBgcmVkcGFsbGFzX2Rlcml2YXRpb25fcHJvY2Vzc2ApOyBEU0cgb25seSBldmVyIG9wZXJhdGVzIG9uIGFuXG4gKiAgIGFscmVhZHktZGVyaXZlZCAob3Igcm9vdCkgb3BhcXVlIGBLZXlzaGFyZWAuXG4gKiAtIERTRyBkb2VzIG5vdCByYW5kb21pemUgdGhlIGtleSBpdCBzaWducyB3aXRoOiBzaW5jZSBgQGJpdGdvL3dhc20tbXBzYCAxLjE3LjAsIGtleVxuICogICByZS1yYW5kb21pemF0aW9uIGlzIGEgc2VwYXJhdGUgYHJlcmFuZGAgcHJvdG9jb2wgKHNlZSBgLi9yZXJhbmQudHNgLCBgUmVkUGFsbGFzUmVyYW5kYClcbiAqICAgdGhhdCBtdXN0IHJ1biBiZWZvcmUgZXZlcnkgRFNHLCBiZXR3ZWVuIHRoZSBzYW1lIDIgcGFydGllcy4gVGhlIGtleXNoYXJlIHBhc3NlZCB0b1xuICogICBgaW5pdERzZ2AgbXVzdCBiZSB0aGUgYGtleVNoYXJlYCBmcm9tIHRoYXQgcmVyYW5kIHJlc3VsdC5cbiAqIC0gUm91bmQzIGRvZXMgbm90IHJldHVybiBhIHJhdyBzaWduYXR1cmU7IGl0IHJldHVybnMgYSBgUmVkUGFsbGFzU2lnbmF0dXJlYCBidW5kbGUgb2ZcbiAqICAgYHNpZ25hdHVyZWAgKDY0IHJhdyBieXRlcykgYW5kIGBya2AgKHRoZSByZXJhbmRvbWl6ZWQgdmVyaWZpY2F0aW9uIGtleSB0aGUgc2lnbmF0dXJlXG4gKiAgIHZlcmlmaWVzIGFnYWluc3Qg4oCUIE5PVCB0aGUgREtHIHB1YmxpYyBrZXkpLiBgcmtgIGVxdWFscyB0aGUgYHBrYCBvZiB0aGUgcmVyYW5kIHJlc3VsdFxuICogICB0aGUgRFNHIHNlc3Npb24gd2FzIGluaXRpYWxpemVkIHdpdGguIFNlZSBgUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0YC5cbiAqXG4gKiBTaWduaW5nIGEgc3RvcmVkIERLRyBrZXlzaGFyZSBkaXJlY3RseSAod2l0aG91dCByZXJhbmQpIHN0aWxsIHByb2R1Y2VzIGEgdmFsaWRcbiAqIHNpZ25hdHVyZSDigJQgdW5kZXIgdGhlIGJhcmUgREtHIHB1YmxpYyBrZXksIHdpdGggdGhlIHNhbWUgYHJrYCBldmVyeSBzcGVuZCDigJQgYnV0IHRoZVxuICogc3VwcG9ydGVkLCB0ZXN0ZWQgcGF0aCBpcyByZXJhbmQg4oaSIERTRy5cbiAqXG4gKiBTdGF0ZSBpcyBleHBsaWNpdDogZWFjaCBXQVNNIHJvdW5kIGZ1bmN0aW9uIHJldHVybnMgYHsgbXNnLCBzdGF0ZSB9YCBieXRlczsgdGhlIHN0YXRlXG4gKiBieXRlcyBhcmUgc3RvcmVkIGJldHdlZW4gcm91bmRzIGFuZCBwYXNzZWQgdG8gdGhlIG5leHQgcm91bmQgZnVuY3Rpb24gKHRoaXMgaXMgd2hhdCBhXG4gKiBzZXJ2ZXIgd291bGQgcGVyc2lzdCB0byBhIGRhdGFiYXNlIGJldHdlZW4gQVBJIHJvdW5kcykuXG4gKlxuICogVGhlIHByb3RvY29sIGlzIGhhcmQtY29kZWQgMi1vZi0zOiBlYWNoIHNpZ25pbmcgcGFydHkgY29tbXVuaWNhdGVzIHdpdGggZXhhY3RseSBvbmVcbiAqIGNvdW50ZXJwYXJ0LiBgaGFuZGxlSW5jb21pbmdNZXNzYWdlc2AgYWNjZXB0cyBib3RoIG1lc3NhZ2VzIChvd24gKyBjb3VudGVycGFydCksIGFuZFxuICogZmlsdGVycyBvd24gb3V0IGludGVybmFsbHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFJlcmFuZCBmaXJzdCDigJQgc2FtZSAyIHBhcnRpZXMgdGhhdCB3aWxsIHNpZ24gKHNlZSBSZWRQYWxsYXNSZXJhbmQpLlxuICogY29uc3QgcmVyYW5kID0gbmV3IFJlZFBhbGxhc1JlcmFuZCgwKTtcbiAqIGF3YWl0IHJlcmFuZC5pbml0UmVyYW5kKGRrZ0tleVNoYXJlLCAyKTtcbiAqIGNvbnN0IHJlcmFuZE1zZzEgPSByZXJhbmQuZ2V0Rmlyc3RNZXNzYWdlKCk7XG4gKiBjb25zdCByZXJhbmRNc2cyID0gcmVyYW5kLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3JlcmFuZE1zZzEsIHBlZXJSZXJhbmRNc2cxXSk7XG4gKiByZXJhbmQuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbcmVyYW5kTXNnMlswXSwgcGVlclJlcmFuZE1zZzJdKTtcbiAqIGNvbnN0IHsga2V5U2hhcmUsIHBrLCBhbHBoYSB9ID0gcmVyYW5kLmdldFJlcmFuZG9taXplZEtleVNoYXJlKCk7XG4gKlxuICogY29uc3QgZHNnID0gbmV3IFJlZFBhbGxhc0RTRygwKTsgIC8vIHBhcnR5SWR4IDBcbiAqIGF3YWl0IGRzZy5pbml0RHNnKGtleVNoYXJlLCBtZXNzYWdlLCAyKTsgIC8vIGNvdW50ZXJwYXJ0IGlzIHBhcnR5IDJcbiAqIGNvbnN0IG1zZzEgPSBkc2cuZ2V0Rmlyc3RNZXNzYWdlKCk7XG4gKiBjb25zdCBtc2cyID0gZHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW21zZzEsIHBlZXJNc2cxXSk7ICAvLyBlbWl0cyBTaWduTXNnMlxuICogY29uc3QgbXNnMyA9IGRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFttc2cyWzBdLCBwZWVyTXNnMl0pOyAgLy8gZW1pdHMgU2lnbk1zZzNcbiAqIGRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFttc2czWzBdLCBwZWVyTXNnM10pOyAgLy8gY29tcGxldGVzIERTR1xuICogY29uc3QgeyBzaWduYXR1cmUsIHJrIH0gPSBkc2cuZ2V0U2lnbmF0dXJlKCk7ICAvLyB2ZXJpZmllcyB1bmRlciByayA9PSBwa1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWRQYWxsYXNEU0cge1xuICBwcm90ZWN0ZWQgcGFydHlJZHg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIG90aGVyUGFydHlJZHg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBPcGFxdWUgYmluY29kZS1zZXJpYWxpc2VkIEtleXNoYXJlIGZyb20gYSBwcmlvciBES0cgKGFscmVhZHkgZGVyaXZlZCwgaWYgYXBwbGljYWJsZSkgKi9cbiAgcHJpdmF0ZSBrZXlTaGFyZTogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBSYXcgbWVzc2FnZSBieXRlcyB0byBzaWduICovXG4gIHByaXZhdGUgbWVzc2FnZTogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFNlcmlhbGlzZWQgcm91bmQgc3RhdGUgYnl0ZXMgcmV0dXJuZWQgYnkgdGhlIHByZXZpb3VzIHJvdW5kIGZ1bmN0aW9uICovXG4gIHByaXZhdGUgZHNnU3RhdGVCeXRlczogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBGaW5hbCBzaWduYXR1cmUgYnVuZGxlLCBhdmFpbGFibGUgYWZ0ZXIgV2FpdE1zZzMgLT4gQ29tcGxldGUgKi9cbiAgcHJpdmF0ZSBzaWduYXR1cmVSZXN1bHQ6IFJlZFBhbGxhc1NpZ25hdHVyZVJlc3VsdCB8IG51bGwgPSBudWxsO1xuICAvKiogTGF6aWx5IGxvYWRlZCBXQVNNIG1vZHVsZSAqL1xuICBwcml2YXRlIHdhc21NcHM6IFdhc21NcHMgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgZHNnU3RhdGU6IFJlZFBhbGxhc0RzZ1N0YXRlID0gUmVkUGFsbGFzRHNnU3RhdGUuVW5pbml0aWFsaXplZDtcblxuICBjb25zdHJ1Y3RvcihwYXJ0eUlkeDogbnVtYmVyKSB7XG4gICAgdGhpcy5wYXJ0eUlkeCA9IHBhcnR5SWR4O1xuICB9XG5cbiAgZ2V0U3RhdGUoKTogUmVkUGFsbGFzRHNnU3RhdGUge1xuICAgIHJldHVybiB0aGlzLmRzZ1N0YXRlO1xuICB9XG5cbiAgZ2V0UGFydHlJZHgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJ0eUlkeDtcbiAgfVxuXG4gIGdldE90aGVyUGFydHlJZHgoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMub3RoZXJQYXJ0eUlkeDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFdhc21NcHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLndhc21NcHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgLyogY2hlY2tzIGZvciBlbGVjdHJvbiBwcm9jZXNzZXMgKi9cbiAgICAgICAgIXdpbmRvdy5wcm9jZXNzICYmXG4gICAgICAgICF3aW5kb3cucHJvY2Vzcz8uWyd0eXBlJ11cbiAgICAgICkge1xuICAgICAgICAvLyBCcm93c2VyOiB3ZWIgYnVpbGQgaGFzIGV4cGxpY2l0IGluaXQoKSDigJQgZ3VhcmFudGVlZCByZWFkeSBhZnRlciBhd2FpdFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWludGVybmFsLW1vZHVsZXMgLS0gQGJpdGdvL3dhc20tbXBzIGV4cG9zZXMgZW52aXJvbm1lbnQtc3BlY2lmaWMgc3VicGF0aCBleHBvcnRzLlxuICAgICAgICBjb25zdCB3ZWJXYXNtID0gYXdhaXQgaW1wb3J0KCdAYml0Z28vd2FzbS1tcHMvd2ViJyk7XG4gICAgICAgIGF3YWl0IHdlYldhc20uZGVmYXVsdCgpO1xuICAgICAgICB0aGlzLndhc21NcHMgPSB3ZWJXYXNtO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm9kZS5qczogZHluYW1pYyBpbXBvcnQoKSByZXdyaXR0ZW4gdG8gcmVxdWlyZSgpIGJ5IHRzYyDihpIgQ0pTIGJ1aWxkIOKGkiByZWFkRmlsZVN5bmNcbiAgICAgICAgdGhpcy53YXNtTXBzID0gYXdhaXQgaW1wb3J0KCdAYml0Z28vd2FzbS1tcHMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFdhc21NcHMoKTogV2FzbU1wcyB7XG4gICAgaWYgKCF0aGlzLndhc21NcHMpIHtcbiAgICAgIHRocm93IEVycm9yKCdXQVNNIG1vZHVsZSBub3QgbG9hZGVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLndhc21NcHM7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGlzZXMgdGhlIERTRyBzZXNzaW9uLiBUaGUga2V5c2hhcmUgbXVzdCBiZSB0aGUgcmVyYW5kb21pemVkIGBrZXlTaGFyZWAgZnJvbVxuICAgKiBhIHByaW9yIGBSZWRQYWxsYXNSZXJhbmRgIHJ1biB3aXRoIHRoZSBzYW1lIGNvdW50ZXJwYXJ0ICh3aGljaCBpdHNlbGYgdGFrZXMgdGhlXG4gICAqIG9wYXF1ZSBLZXlzaGFyZSBmcm9tIERLRyDigJQgYWxyZWFkeSBkZXJpdmVkLCBpZiBhcHBsaWNhYmxlKS4gU2lnbmluZyBhIGJhcmUgREtHXG4gICAqIGtleXNoYXJlIHByb2R1Y2VzIGEgdmFsaWQgYnV0IG5vbi1yZXJhbmRvbWl6ZWQgc2lnbmF0dXJlIHVuZGVyIHRoZSBES0cgcHVibGljIGtleTtcbiAgICogdXNlIHJlcmFuZCDihpIgRFNHIGluc3RlYWQuIGBvdGhlclBhcnR5SWR4YCBtdXN0IGJlIHRoZSBzaW5nbGUgY291bnRlcnBhcnQgd2hvIHJhblxuICAgKiB0aGF0IHJlcmFuZCBzZXNzaW9uIGFuZCB3aWxsIGNvLXNpZ24gd2l0aCB0aGlzIHBhcnR5LlxuICAgKlxuICAgKiBAcGFyYW0ga2V5U2hhcmUgLSBPcGFxdWUgYmluY29kZS1zZXJpYWxpc2VkIHJlcmFuZG9taXplZCBLZXlzaGFyZSBieXRlcyBmcm9tXG4gICAqICAgYFJlZFBhbGxhc1JlcmFuZC5nZXRSZXJhbmRvbWl6ZWRLZXlTaGFyZSgpLmtleVNoYXJlYC5cbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBSYXcgbWVzc2FnZSBieXRlcyB0byBzaWduLlxuICAgKiBAcGFyYW0gb3RoZXJQYXJ0eUlkeCAtIFBhcnR5IGluZGV4IG9mIHRoZSBzaW5nbGUgY291bnRlcnBhcnQgaW4gdGhpcyBzaWduaW5nIHNlc3Npb24uXG4gICAqICAgTXVzdCBkaWZmZXIgZnJvbSB0aGlzIHBhcnR5J3Mgb3duIGBwYXJ0eUlkeGAgYW5kIGJlIGluIGBbMCwgMl1gLCBhbmQgbWF0Y2ggdGhlXG4gICAqICAgY291bnRlcnBhcnQgb2YgdGhlIHByZWNlZGluZyByZXJhbmQgc2Vzc2lvbi5cbiAgICovXG4gIGFzeW5jIGluaXREc2coa2V5U2hhcmU6IEJ1ZmZlciwgbWVzc2FnZTogQnVmZmVyLCBvdGhlclBhcnR5SWR4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvYWRXYXNtTXBzKCk7XG4gICAgaWYgKCFrZXlTaGFyZSB8fCBrZXlTaGFyZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIG9yIGludmFsaWQga2V5U2hhcmUnKTtcbiAgICB9XG4gICAgaWYgKCFtZXNzYWdlIHx8IG1lc3NhZ2UubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBvciBpbnZhbGlkIG1lc3NhZ2UnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFydHlJZHggPCAwIHx8IHRoaXMucGFydHlJZHggPiAyKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBwYXJ0eUlkeCAke3RoaXMucGFydHlJZHh9OiBtdXN0IGJlIGluIFswLCAyXWApO1xuICAgIH1cbiAgICBpZiAob3RoZXJQYXJ0eUlkeCA8IDAgfHwgb3RoZXJQYXJ0eUlkeCA+IDIgfHwgb3RoZXJQYXJ0eUlkeCA9PT0gdGhpcy5wYXJ0eUlkeCkge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgb3RoZXJQYXJ0eUlkeCAke290aGVyUGFydHlJZHh9OiBtdXN0IGJlIGluIFswLCAyXSBhbmQgIT0gcGFydHlJZHhgKTtcbiAgICB9XG5cbiAgICB0aGlzLmtleVNoYXJlID0ga2V5U2hhcmU7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLm90aGVyUGFydHlJZHggPSBvdGhlclBhcnR5SWR4O1xuICAgIHRoaXMuZHNnU3RhdGUgPSBSZWRQYWxsYXNEc2dTdGF0ZS5Jbml0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcm91bmQgMCBvZiB0aGUgRFNHIHByb3RvY29sLiBSZXR1cm5zIHRoaXMgcGFydHkncyBicm9hZGNhc3QgbWVzc2FnZVxuICAgKiAoYSBgU2lnbk1zZzFgIGNvbnRhaW5pbmcgdGhlIGNvbW1pdG1lbnQgdG8gYFJfaWApLiBTdG9yZXMgdGhlIHJvdW5kIHN0YXRlXG4gICAqIGJ5dGVzIGludGVybmFsbHkgZm9yIHRoZSBuZXh0IHJvdW5kLlxuICAgKi9cbiAgZ2V0Rmlyc3RNZXNzYWdlKCk6IERlc2VyaWFsaXplZE1lc3NhZ2Uge1xuICAgIGlmICh0aGlzLmRzZ1N0YXRlICE9PSBSZWRQYWxsYXNEc2dTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIGFzc2VydCh0aGlzLmtleVNoYXJlLCAna2V5U2hhcmUgbXVzdCBiZSBzZXQgYWZ0ZXIgaW5pdERzZycpO1xuICAgIGFzc2VydCh0aGlzLm1lc3NhZ2UsICdtZXNzYWdlIG11c3QgYmUgc2V0IGFmdGVyIGluaXREc2cnKTtcblxuICAgIGNvbnN0IHdhc20gPSB0aGlzLmdldFdhc21NcHMoKTtcbiAgICBsZXQgcmVzdWx0OiBNc2dTdGF0ZTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gd2FzbS5yZWRwYWxsYXNfZHNnX3JvdW5kMF9wcm9jZXNzKHRoaXMua2V5U2hhcmUsIHRoaXMubWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBmaXJzdCBtZXNzYWdlIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fTogJHtlcnJ9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20ocmVzdWx0LnN0YXRlKTtcbiAgICB0aGlzLmRzZ1N0YXRlID0gUmVkUGFsbGFzRHNnU3RhdGUuV2FpdE1zZzE7XG4gICAgcmV0dXJuIHsgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmVzdWx0Lm1zZyksIGZyb206IHRoaXMucGFydHlJZHggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGluY29taW5nIG1lc3NhZ2VzIGZvciB0aGUgY3VycmVudCByb3VuZCBhbmQgYWR2YW5jZXMgdGhlIHByb3RvY29sLlxuICAgKlxuICAgKiAtIEluIGBXYWl0TXNnMWA6IHJ1bnMgcm91bmQgMSwgcmV0dXJucyB0aGlzIHBhcnR5J3MgYFNpZ25Nc2cyYCBicm9hZGNhc3QuXG4gICAqIC0gSW4gYFdhaXRNc2cyYDogcnVucyByb3VuZCAyICh3aGljaCBpbnRlcm5hbGx5IGZ1c2VzIHR3byBTaWxlbmNlIExhYnMgdHJhbnNpdGlvbnMpLFxuICAgKiAgIHJldHVybnMgdGhpcyBwYXJ0eSdzIGBTaWduTXNnM2AgYnJvYWRjYXN0IChwYXJ0aWFsIHNpZ25hdHVyZSkuXG4gICAqIC0gSW4gYFdhaXRNc2czYDogcnVucyByb3VuZCAzLCBjb21wbGV0ZXMgRFNHLCByZXR1cm5zIGBbXWAuXG4gICAqXG4gICAqIFRoZSBjYWxsZXIgcGFzc2VzIGJvdGggbWVzc2FnZXMgKG93biArIGNvdW50ZXJwYXJ0KSBmb3Igc3ltbWV0cnkgd2l0aFxuICAgKiBgUmVkUGFsbGFzREtHLmhhbmRsZUluY29taW5nTWVzc2FnZXNgLiBPd24gbWVzc2FnZSBpcyBmaWx0ZXJlZCBvdXQgaW50ZXJuYWxseTsgb25seSB0aGVcbiAgICogY291bnRlcnBhcnQncyBwYXlsb2FkIGlzIGZvcndhcmRlZCB0byB0aGUgV0FTTSByb3VuZCBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2VzRm9ySXRoUm91bmQgLSBCb3RoIG1lc3NhZ2VzIGZvciB0aGlzIHJvdW5kIChvd24gKyBjb3VudGVycGFydCkuXG4gICAqL1xuICBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2VzRm9ySXRoUm91bmQ6IERlc2VyaWFsaXplZE1lc3NhZ2VzKTogRGVzZXJpYWxpemVkTWVzc2FnZXMge1xuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBSZWRQYWxsYXNEc2dTdGF0ZS5Db21wbGV0ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RTRyBzZXNzaW9uIGFscmVhZHkgY29tcGxldGVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBSZWRQYWxsYXNEc2dTdGF0ZS5VbmluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBSZWRQYWxsYXNEc2dTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgJ0RTRyBzZXNzaW9uIG11c3QgY2FsbCBnZXRGaXJzdE1lc3NhZ2UoKSBiZWZvcmUgaGFuZGxpbmcgaW5jb21pbmcgbWVzc2FnZXMuIENhbGwgZ2V0Rmlyc3RNZXNzYWdlKCkgZmlyc3QuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2VzRm9ySXRoUm91bmQubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBudW1iZXIgb2YgbWVzc2FnZXMgZm9yIHRoZSByb3VuZC4gRXhwZWN0ZWQgMiBtZXNzYWdlcyAob3duICsgY291bnRlcnBhcnQpIGZvciAyLW9mLTMgRFNHJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGVlck1lc3NhZ2VzID0gbWVzc2FnZXNGb3JJdGhSb3VuZC5maWx0ZXIoKG0pID0+IG0uZnJvbSAhPT0gdGhpcy5wYXJ0eUlkeCk7XG4gICAgaWYgKHBlZXJNZXNzYWdlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IEVycm9yKGBFeHBlY3RlZCBleGFjdGx5IDEgY291bnRlcnBhcnQgbWVzc2FnZTsgZ290ICR7cGVlck1lc3NhZ2VzLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgY29uc3QgcGVlck1zZyA9IHBlZXJNZXNzYWdlc1swXTtcbiAgICBpZiAocGVlck1zZy5mcm9tICE9PSB0aGlzLm90aGVyUGFydHlJZHgpIHtcbiAgICAgIHRocm93IEVycm9yKGBVbmV4cGVjdGVkIGNvdW50ZXJwYXJ0IHBhcnR5IGluZGV4OiBnb3QgJHtwZWVyTXNnLmZyb219LCBleHBlY3RlZCAke3RoaXMub3RoZXJQYXJ0eUlkeH1gKTtcbiAgICB9XG4gICAgY29uc3QgcGVlclBheWxvYWQgPSBCdWZmZXIuZnJvbShwZWVyTXNnLnBheWxvYWQpO1xuICAgIGNvbnN0IHdhc20gPSB0aGlzLmdldFdhc21NcHMoKTtcblxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBSZWRQYWxsYXNEc2dTdGF0ZS5XYWl0TXNnMSkge1xuICAgICAgYXNzZXJ0KHRoaXMuZHNnU3RhdGVCeXRlcywgJ2RzZ1N0YXRlQnl0ZXMgbXVzdCBiZSBzZXQgaW4gV2FpdE1zZzEnKTtcbiAgICAgIGxldCByZXN1bHQ6IE1zZ1N0YXRlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gd2FzbS5yZWRwYWxsYXNfZHNnX3JvdW5kMV9wcm9jZXNzKHBlZXJQYXlsb2FkLCB0aGlzLmRzZ1N0YXRlQnl0ZXMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgbWVzc2FnZXMgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9LCByb3VuZCAke3RoaXMuZHNnU3RhdGV9OiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZHNnU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGF0ZSk7XG4gICAgICB0aGlzLmRzZ1N0YXRlID0gUmVkUGFsbGFzRHNnU3RhdGUuV2FpdE1zZzI7XG4gICAgICByZXR1cm4gW3sgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmVzdWx0Lm1zZyksIGZyb206IHRoaXMucGFydHlJZHggfV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLldhaXRNc2cyKSB7XG4gICAgICBhc3NlcnQodGhpcy5kc2dTdGF0ZUJ5dGVzLCAnZHNnU3RhdGVCeXRlcyBtdXN0IGJlIHNldCBpbiBXYWl0TXNnMicpO1xuICAgICAgbGV0IHJlc3VsdDogTXNnU3RhdGU7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSB3YXNtLnJlZHBhbGxhc19kc2dfcm91bmQyX3Byb2Nlc3MocGVlclBheWxvYWQsIHRoaXMuZHNnU3RhdGVCeXRlcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5kc2dTdGF0ZX06ICR7ZXJyfWApO1xuICAgICAgfVxuICAgICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20ocmVzdWx0LnN0YXRlKTtcbiAgICAgIHRoaXMuZHNnU3RhdGUgPSBSZWRQYWxsYXNEc2dTdGF0ZS5XYWl0TXNnMztcbiAgICAgIHJldHVybiBbeyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyZXN1bHQubXNnKSwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuV2FpdE1zZzMpIHtcbiAgICAgIGFzc2VydCh0aGlzLmRzZ1N0YXRlQnl0ZXMsICdkc2dTdGF0ZUJ5dGVzIG11c3QgYmUgc2V0IGluIFdhaXRNc2czJyk7XG4gICAgICBsZXQgcmVzdWx0OiBSZWRQYWxsYXNTaWduYXR1cmU7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSB3YXNtLnJlZHBhbGxhc19kc2dfcm91bmQzX3Byb2Nlc3MocGVlclBheWxvYWQsIHRoaXMuZHNnU3RhdGVCeXRlcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5kc2dTdGF0ZX06ICR7ZXJyfWApO1xuICAgICAgfVxuICAgICAgdGhpcy5zaWduYXR1cmVSZXN1bHQgPSB7XG4gICAgICAgIHNpZ25hdHVyZTogQnVmZmVyLmZyb20ocmVzdWx0LnNpZ25hdHVyZSksXG4gICAgICAgIHJrOiBCdWZmZXIuZnJvbShyZXN1bHQucmspLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZHNnU3RhdGVCeXRlcyA9IG51bGw7XG4gICAgICB0aGlzLmRzZ1N0YXRlID0gUmVkUGFsbGFzRHNnU3RhdGUuQ29tcGxldGU7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdGhyb3cgRXJyb3IoJ1VuZXhwZWN0ZWQgRFNHIHN0YXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmluYWwgc2lnbmF0dXJlIGJ1bmRsZSBwcm9kdWNlZCBieSByb3VuZCAzOiB0aGUgNjQtYnl0ZSByYXcgUmVkUGFsbGFzXG4gICAqIHNpZ25hdHVyZSBhbmQgdGhlIHJlcmFuZG9taXplZCB2ZXJpZmljYXRpb24ga2V5IGBya2AgaXQgbXVzdCBiZSB2ZXJpZmllZCBhZ2FpbnN0XG4gICAqICh2aWEgYHJlZHBhbGxhc192ZXJpZnkocmssIHNpZ25hdHVyZSwgbWVzc2FnZSlgIOKAlCBOT1QgdGhlIERLRyBwdWJsaWMga2V5KS4gYHJrYFxuICAgKiBlcXVhbHMgdGhlIGBwa2Agb2YgdGhlIHJlcmFuZCByZXN1bHQgdGhpcyBzZXNzaW9uIHdhcyBpbml0aWFsaXplZCB3aXRoOyB0aGVcbiAgICogY29ycmVzcG9uZGluZyBgYWxwaGFgIGlzIGF2YWlsYWJsZSBmcm9tIGBSZWRQYWxsYXNSZXJhbmQuZ2V0UmVyYW5kb21pemVkS2V5U2hhcmUoKWAuXG4gICAqL1xuICBnZXRTaWduYXR1cmUoKTogUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0IHtcbiAgICBpZiAoIXRoaXMuc2lnbmF0dXJlUmVzdWx0KSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gaGFzIG5vdCBwcm9kdWNlZCBhIHNpZ25hdHVyZSB5ZXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2lnbmF0dXJlUmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBzdGF0ZSBhcyBhIEpTT04gc3RyaW5nIGZvciBwZXJzaXN0ZW5jZS5cbiAgICogSW5jbHVkZXMgdGhlIG9wYXF1ZSByb3VuZCBzdGF0ZSBieXRlcyBwbHVzIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIHJlLWVudGVyIHRoZVxuICAgKiBwcm90b2NvbCBhZnRlciBhIHJlc3RhcnQgKGtleXNoYXJlLCBtZXNzYWdlLCBjb3VudGVycGFydCkuXG4gICAqL1xuICBnZXRTZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLkNvbXBsZXRlKSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gaXMgY29tcGxldGUuIEV4cG9ydGluZyB0aGUgc2Vzc2lvbiBpcyBub3QgYWxsb3dlZC4nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLlVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBtdXN0IHByb2R1Y2UgaXRzIGZpcnN0IG1lc3NhZ2UgYmVmb3JlIGV4cG9ydGluZy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGRzZ1N0YXRlQnl0ZXM6IHRoaXMuZHNnU3RhdGVCeXRlcz8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBkc2dSb3VuZDogdGhpcy5kc2dTdGF0ZSxcbiAgICAgIGtleVNoYXJlOiB0aGlzLmtleVNoYXJlPy50b1N0cmluZygnYmFzZTY0JykgPz8gbnVsbCxcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZT8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBwYXJ0eUlkeDogdGhpcy5wYXJ0eUlkeCxcbiAgICAgIG90aGVyUGFydHlJZHg6IHRoaXMub3RoZXJQYXJ0eUlkeCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlcyBhIHByZXZpb3VzbHkgZXhwb3J0ZWQgc2Vzc2lvbi4gQWxsb3dzIHRoZSBwcm90b2NvbCB0byBjb250aW51ZSBmcm9tXG4gICAqIHdoZXJlIGl0IGxlZnQgb2ZmLCBhcyBpZiB0aGUgcm91bmQgc3RhdGUgd2FzIGxvYWRlZCBmcm9tIGEgZGF0YWJhc2UuXG4gICAqL1xuICBhc3luYyByZXN0b3JlU2Vzc2lvbihzZXNzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvYWRXYXNtTXBzKCk7XG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2Uoc2Vzc2lvbik7XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKFJlZFBhbGxhc0RzZ1N0YXRlKS5pbmNsdWRlcyhkYXRhLmRzZ1JvdW5kKSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgZHNnUm91bmQgaW4gc2Vzc2lvbjogJHtkYXRhLmRzZ1JvdW5kfWApO1xuICAgIH1cbiAgICBpZiAoZGF0YS5kc2dSb3VuZCA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuVW5pbml0aWFsaXplZCB8fCBkYXRhLmRzZ1JvdW5kID09PSBSZWRQYWxsYXNEc2dTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcihgQ2Fubm90IHJlc3RvcmUgRFNHIHNlc3Npb24gaW4gc3RhdGUgJHtkYXRhLmRzZ1JvdW5kfWApO1xuICAgIH1cbiAgICBpZiAoZGF0YS5kc2dSb3VuZCA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuQ29tcGxldGUpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBpcyBjb21wbGV0ZS4gUmVzdG9yaW5nIHRoZSBzZXNzaW9uIGlzIG5vdCBhbGxvd2VkLicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEucGFydHlJZHggIT09ICdudW1iZXInIHx8IGRhdGEucGFydHlJZHggPCAwIHx8IGRhdGEucGFydHlJZHggPiAyKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBwYXJ0eUlkeCBpbiBzZXNzaW9uOiAke2RhdGEucGFydHlJZHh9YCk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBkYXRhLm90aGVyUGFydHlJZHggIT09ICdudW1iZXInIHx8XG4gICAgICBkYXRhLm90aGVyUGFydHlJZHggPCAwIHx8XG4gICAgICBkYXRhLm90aGVyUGFydHlJZHggPiAyIHx8XG4gICAgICBkYXRhLm90aGVyUGFydHlJZHggPT09IGRhdGEucGFydHlJZHhcbiAgICApIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIG90aGVyUGFydHlJZHggaW4gc2Vzc2lvbjogJHtkYXRhLm90aGVyUGFydHlJZHh9YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcnR5SWR4ICE9PSBkYXRhLnBhcnR5SWR4KSB7XG4gICAgICB0aHJvdyBFcnJvcihgU2Vzc2lvbiBwYXJ0eUlkeCAke2RhdGEucGFydHlJZHh9IGRvZXMgbm90IG1hdGNoIGluc3RhbmNlICR7dGhpcy5wYXJ0eUlkeH1gKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhLmRzZ1N0YXRlQnl0ZXMgIT09ICdzdHJpbmcnIHx8IGRhdGEuZHNnU3RhdGVCeXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKGBSb3VuZCAke2RhdGEuZHNnUm91bmR9IHJlcXVpcmVzIGRzZ1N0YXRlQnl0ZXNgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhLmtleVNoYXJlICE9PSAnc3RyaW5nJyB8fCBkYXRhLmtleVNoYXJlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBrZXlTaGFyZScpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEubWVzc2FnZSAhPT0gJ3N0cmluZycgfHwgZGF0YS5tZXNzYWdlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBtZXNzYWdlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZHNnU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKGRhdGEuZHNnU3RhdGVCeXRlcywgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IGtleVNoYXJlID0gQnVmZmVyLmZyb20oZGF0YS5rZXlTaGFyZSwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBCdWZmZXIuZnJvbShkYXRhLm1lc3NhZ2UsICdiYXNlNjQnKTtcbiAgICBpZiAoZHNnU3RhdGVCeXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKGBSb3VuZCAke2RhdGEuZHNnUm91bmR9IHJlcXVpcmVzIGRzZ1N0YXRlQnl0ZXNgKTtcbiAgICB9XG4gICAgaWYgKGtleVNoYXJlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBrZXlTaGFyZScpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdSZXN0b3JlZCBzZXNzaW9uIG1pc3NpbmcgbWVzc2FnZScpO1xuICAgIH1cblxuICAgIHRoaXMuZHNnU3RhdGVCeXRlcyA9IGRzZ1N0YXRlQnl0ZXM7XG4gICAgdGhpcy5kc2dTdGF0ZSA9IGRhdGEuZHNnUm91bmQ7XG4gICAgdGhpcy5rZXlTaGFyZSA9IGtleVNoYXJlO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5wYXJ0eUlkeCA9IGRhdGEucGFydHlJZHg7XG4gICAgdGhpcy5vdGhlclBhcnR5SWR4ID0gZGF0YS5vdGhlclBhcnR5SWR4O1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * as RedPallasMPSDkg from './dkg';
|
|
2
|
+
export * as RedPallasMPSDsg from './dsg';
|
|
3
|
+
export * as RedPallasMPSRerand from './rerand';
|
|
4
|
+
export * as RedPallasMPSUtil from './util';
|
|
5
|
+
export * as RedPallasMPSTypes from './types';
|
|
6
|
+
export * as RedPallasMPSComms from './commsLayer';
|
|
7
|
+
export type { RedPallasRerandResult, RedPallasSignatureResult } from './types';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tss/redpallas-mps/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,eAAe,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,eAAe,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,kBAAkB,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,gBAAgB,MAAM,QAAQ,CAAC;AAC3C,OAAO,KAAK,iBAAiB,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,iBAAiB,MAAM,cAAc,CAAC;AAClD,YAAY,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
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.RedPallasMPSComms = exports.RedPallasMPSTypes = exports.RedPallasMPSUtil = exports.RedPallasMPSRerand = exports.RedPallasMPSDsg = exports.RedPallasMPSDkg = void 0;
|
|
37
|
+
exports.RedPallasMPSDkg = __importStar(require("./dkg"));
|
|
38
|
+
exports.RedPallasMPSDsg = __importStar(require("./dsg"));
|
|
39
|
+
exports.RedPallasMPSRerand = __importStar(require("./rerand"));
|
|
40
|
+
exports.RedPallasMPSUtil = __importStar(require("./util"));
|
|
41
|
+
exports.RedPallasMPSTypes = __importStar(require("./types"));
|
|
42
|
+
exports.RedPallasMPSComms = __importStar(require("./commsLayer"));
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL3JlZHBhbGxhcy1tcHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseURBQXlDO0FBQ3pDLHlEQUF5QztBQUN6QywrREFBK0M7QUFDL0MsMkRBQTJDO0FBQzNDLDZEQUE2QztBQUM3QyxrRUFBa0QiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBhcyBSZWRQYWxsYXNNUFNEa2cgZnJvbSAnLi9ka2cnO1xuZXhwb3J0ICogYXMgUmVkUGFsbGFzTVBTRHNnIGZyb20gJy4vZHNnJztcbmV4cG9ydCAqIGFzIFJlZFBhbGxhc01QU1JlcmFuZCBmcm9tICcuL3JlcmFuZCc7XG5leHBvcnQgKiBhcyBSZWRQYWxsYXNNUFNVdGlsIGZyb20gJy4vdXRpbCc7XG5leHBvcnQgKiBhcyBSZWRQYWxsYXNNUFNUeXBlcyBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCAqIGFzIFJlZFBhbGxhc01QU0NvbW1zIGZyb20gJy4vY29tbXNMYXllcic7XG5leHBvcnQgdHlwZSB7IFJlZFBhbGxhc1JlcmFuZFJlc3VsdCwgUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0IH0gZnJvbSAnLi90eXBlcyc7XG4iXX0=
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { DeserializedMessage, DeserializedMessages, RedPallasRerandResult, RedPallasRerandState } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* RedPallas (Zcash Ironwood) key re-randomization implementation using @bitgo/wasm-mps.
|
|
4
|
+
*
|
|
5
|
+
* As of `@bitgo/wasm-mps` 1.17.0, key re-randomization has moved out of DSG and into
|
|
6
|
+
* this separate `rerand` protocol: DSG no longer randomizes the key it signs with.
|
|
7
|
+
* A rerand session MUST run before every RedPallas DSG, between the same 2 parties
|
|
8
|
+
* that will then sign:
|
|
9
|
+
*
|
|
10
|
+
* - Round 0 (local): each party commits to a fresh random randomizer.
|
|
11
|
+
* - Round 1 (commit): each party broadcasts its commitment.
|
|
12
|
+
* - Round 2 (open): each party broadcasts its randomizer and blind, bound to the
|
|
13
|
+
* session id. Both parties then locally verify the openings and apply the same
|
|
14
|
+
* tweak `alpha = hash(Σ randomizers)`: `d_i += alpha`, `pk += G·alpha`.
|
|
15
|
+
*
|
|
16
|
+
* The output `RedPallasRerandShare` is a rerandomized keyshare (`share`), the
|
|
17
|
+
* rerandomized public key (`pk`) and the tweak scalar (`alpha`). `share` is what
|
|
18
|
+
* goes into `RedPallasDSG.initDsg`; the resulting DSG signature verifies under
|
|
19
|
+
* `rk == pk`, and `alpha` is only available here — not from the DSG result.
|
|
20
|
+
*
|
|
21
|
+
* Signing a stored DKG keyshare directly (without rerand) still yields a valid
|
|
22
|
+
* signature, but under the bare DKG public key with the same `rk` every time; the
|
|
23
|
+
* rerand → DSG sequence is the supported path.
|
|
24
|
+
*
|
|
25
|
+
* Mirrors the structure of `RedPallasDSG` (see `./dsg.ts`): lazy web/node WASM
|
|
26
|
+
* loading, explicit round state bytes persisted between rounds, hard-coded 2-of-3
|
|
27
|
+
* with a single counterpart, and the same 2-message `handleIncomingMessages`
|
|
28
|
+
* contract (own + counterpart; own is filtered out internally).
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* const rerand = new RedPallasRerand(0); // partyIdx 0
|
|
33
|
+
* await rerand.initRerand(keyShare, 2); // counterpart is party 2
|
|
34
|
+
* const msg1 = rerand.getFirstMessage();
|
|
35
|
+
* const msg2 = rerand.handleIncomingMessages([msg1, peerMsg1]); // emits rerand msg2
|
|
36
|
+
* rerand.handleIncomingMessages([msg2[0], peerMsg2]); // completes rerand
|
|
37
|
+
* const { keyShare, pk, alpha } = rerand.getRerandomizedKeyShare();
|
|
38
|
+
* const dsg = new RedPallasDSG(0);
|
|
39
|
+
* await dsg.initDsg(keyShare, message, 2); // DSG verifies under rk == pk
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare class RedPallasRerand {
|
|
43
|
+
protected partyIdx: number;
|
|
44
|
+
protected otherPartyIdx: number | null;
|
|
45
|
+
/** Opaque bincode-serialised Keyshare from a prior DKG (already derived, if applicable) */
|
|
46
|
+
private keyShare;
|
|
47
|
+
/** Serialised round state bytes returned by the previous round function */
|
|
48
|
+
private rerandStateBytes;
|
|
49
|
+
/** Final rerandomized share bundle, available after WaitMsg2 -> Complete */
|
|
50
|
+
private rerandResult;
|
|
51
|
+
/** Lazily loaded WASM module */
|
|
52
|
+
private wasmMps;
|
|
53
|
+
protected rerandState: RedPallasRerandState;
|
|
54
|
+
constructor(partyIdx: number);
|
|
55
|
+
getState(): RedPallasRerandState;
|
|
56
|
+
getPartyIdx(): number;
|
|
57
|
+
getOtherPartyIdx(): number | null;
|
|
58
|
+
private loadWasmMps;
|
|
59
|
+
private getWasmMps;
|
|
60
|
+
/**
|
|
61
|
+
* Initialises the rerand session. The keyshare must come from a prior DKG run (and,
|
|
62
|
+
* if a derived key is being used, from the subsequent platform-side derivation
|
|
63
|
+
* process), and `otherPartyIdx` must be the single counterpart who will then co-sign
|
|
64
|
+
* (via DSG) with this party. Rerand and DSG must use the same 2 parties.
|
|
65
|
+
*
|
|
66
|
+
* @param keyShare - Opaque bincode-serialised Keyshare bytes from `RedPallasDKG.getKeyShare()`.
|
|
67
|
+
* @param otherPartyIdx - Party index of the single counterpart in this rerand session.
|
|
68
|
+
* Must differ from this party's own `partyIdx` and be in `[0, 2]`.
|
|
69
|
+
*/
|
|
70
|
+
initRerand(keyShare: Buffer, otherPartyIdx: number): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Runs round 0 of the rerand protocol (local). Returns this party's broadcast
|
|
73
|
+
* message (a commitment to a fresh random randomizer). Stores the round state
|
|
74
|
+
* bytes internally for the next round.
|
|
75
|
+
*/
|
|
76
|
+
getFirstMessage(): DeserializedMessage;
|
|
77
|
+
/**
|
|
78
|
+
* Handles incoming messages for the current round and advances the protocol.
|
|
79
|
+
*
|
|
80
|
+
* - In `WaitMsg1`: runs round 1 (commit), returns this party's round 2 broadcast
|
|
81
|
+
* (its randomizer and blind).
|
|
82
|
+
* - In `WaitMsg2`: runs round 2 (open + local tweak), completes rerand, returns `[]`.
|
|
83
|
+
*
|
|
84
|
+
* The caller passes both messages (own + counterpart) for symmetry with
|
|
85
|
+
* `RedPallasDSG.handleIncomingMessages`. Own message is filtered out internally;
|
|
86
|
+
* only the counterpart's payload is forwarded to the WASM round function.
|
|
87
|
+
*
|
|
88
|
+
* @param messagesForIthRound - Both messages for this round (own + counterpart).
|
|
89
|
+
*/
|
|
90
|
+
handleIncomingMessages(messagesForIthRound: DeserializedMessages): DeserializedMessages;
|
|
91
|
+
/**
|
|
92
|
+
* Returns the rerandomized share bundle produced by round 2: the rerandomized
|
|
93
|
+
* keyshare `keyShare` (to be passed to `RedPallasDSG.initDsg`), the rerandomized
|
|
94
|
+
* public key `pk` (the DSG result's `rk` equals it), and the 32-byte tweak scalar
|
|
95
|
+
* `alpha` (fresh per rerand session, identical on both parties).
|
|
96
|
+
*/
|
|
97
|
+
getRerandomizedKeyShare(): RedPallasRerandResult;
|
|
98
|
+
/**
|
|
99
|
+
* Exports the current session state as a JSON string for persistence.
|
|
100
|
+
* Includes the opaque round state bytes plus everything needed to re-enter the
|
|
101
|
+
* protocol after a restart (keyshare, counterpart).
|
|
102
|
+
*/
|
|
103
|
+
getSession(): string;
|
|
104
|
+
/**
|
|
105
|
+
* Restores a previously exported session. Allows the protocol to continue from
|
|
106
|
+
* where it left off, as if the round state was loaded from a database.
|
|
107
|
+
*/
|
|
108
|
+
restoreSession(session: string): Promise<void>;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=rerand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rerand.d.ts","sourceRoot":"","sources":["../../../../src/tss/redpallas-mps/rerand.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAMjH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,qBAAa,eAAe;IAC1B,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE9C,2FAA2F;IAC3F,OAAO,CAAC,QAAQ,CAAuB;IAEvC,2EAA2E;IAC3E,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,4EAA4E;IAC5E,OAAO,CAAC,YAAY,CAAsC;IAC1D,gCAAgC;IAChC,OAAO,CAAC,OAAO,CAAwB;IAEvC,SAAS,CAAC,WAAW,EAAE,oBAAoB,CAAsC;gBAErE,QAAQ,EAAE,MAAM;IAI5B,QAAQ,IAAI,oBAAoB;IAIhC,WAAW,IAAI,MAAM;IAIrB,gBAAgB,IAAI,MAAM,GAAG,IAAI;YAInB,WAAW;IAoBzB,OAAO,CAAC,UAAU;IAOlB;;;;;;;;;OASG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxE;;;;OAIG;IACH,eAAe,IAAI,mBAAmB;IAmBtC;;;;;;;;;;;;OAYG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;IA+DvF;;;;;OAKG;IACH,uBAAuB,IAAI,qBAAqB;IAOhD;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAmBpB;;;OAGG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAgDrD"}
|