@bitgo-beta/sdk-lib-mpc 8.2.1-alpha.462 → 8.2.1-alpha.464

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitgo-beta/sdk-lib-mpc",
3
- "version": "8.2.1-alpha.462",
3
+ "version": "8.2.1-alpha.464",
4
4
  "description": "library functions for BitGo's MPC solution",
5
5
  "main": "./dist/src/index.js",
6
6
  "types": "./dist/src/index.d.ts",
@@ -53,8 +53,8 @@
53
53
  "secp256k1": "5.0.1"
54
54
  },
55
55
  "devDependencies": {
56
- "@bitgo-beta/sdk-opensslbytes": "1.0.1-alpha.326",
57
- "@bitgo-beta/sjcl": "1.0.1-alpha.456",
56
+ "@bitgo-beta/sdk-opensslbytes": "1.0.1-alpha.328",
57
+ "@bitgo-beta/sjcl": "1.0.1-alpha.458",
58
58
  "@silencelaboratories/dkls-wasm-ll-bundler": "1.2.0-pre.4",
59
59
  "@types/lodash": "^4.14.151",
60
60
  "@types/node": "^24.10.9",
@@ -71,5 +71,5 @@
71
71
  "files": [
72
72
  "dist"
73
73
  ],
74
- "gitHead": "7fe98694b99ad786c1711c2ddaa3082417d60b10"
74
+ "gitHead": "57546fc19ca5a7162cf58f0ed3981fea374e562b"
75
75
  }
@@ -1,118 +0,0 @@
1
- /**
2
- * Two-party BIP-340 Schnorr threshold signing (SchnorrDsg).
3
- *
4
- * Works with the Shamir keyshares produced by `DklsDkg` (DKLS23 key generation).
5
- * No new WASM is required: key material is read directly from the CBOR-encoded
6
- * keyshare, Lagrange interpolation is computed in TypeScript, and BIP-340 Schnorr
7
- * algebra is performed with `@noble/curves/secp256k1`.
8
- *
9
- * Protocol (2 broadcast rounds):
10
- *
11
- * Round 1 init()
12
- * • Each party generates a random nonce scalar k_i.
13
- * • Broadcasts the nonce point R_i = k_i * G (33-byte compressed).
14
- *
15
- * Round 2 handleIncomingMessages([R_j])
16
- * • Compute combined nonce R = R_i + R_j.
17
- * • If R.y is odd, negate k_i (BIP-340 requires even-y R).
18
- * • Compute BIP-340 challenge e = H("BIP0340/challenge", R.x ‖ P.x ‖ msg).
19
- * • Compute partial signature s_i = k_i + e · λ_i · priv_i (mod n).
20
- * • Broadcasts s_i as 32-byte big-endian scalar.
21
- *
22
- * Combine handleIncomingMessages([s_j])
23
- * • s = s_i + s_j mod n.
24
- * • signature = Buffer.concat([R.x_32, s_32]) — 64-byte BIP-340 Schnorr.
25
- *
26
- * BIP-32 non-hardened derivation is supported. For path `m/a/b/...`, the total
27
- * IL scalar (sum of per-level HMAC-SHA512 left halves) is computed from the
28
- * shared public key / chaincode. The party with the smallest index in
29
- * `signingPartyIndices` absorbs the entire IL adjustment so that Lagrange
30
- * interpolation still reconstructs the correct child private key.
31
- *
32
- * References:
33
- * BIP-340 https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
34
- * FROST https://eprint.iacr.org/2020/852
35
- */
36
- import { DeserializedBroadcastMessage, DeserializedMessages } from '../ecdsa-dkls/types';
37
- /** 64-byte BIP-340 Schnorr signature `(R.x_32 ‖ s_32)`. */
38
- export type SchnorrDklsSignature = {
39
- /** 32-byte x-coordinate of the nonce point R. */
40
- R: Uint8Array;
41
- /** 32-byte Schnorr scalar s. */
42
- S: Uint8Array;
43
- };
44
- export declare enum SchnorrDsgState {
45
- Uninitialized = 0,
46
- Round1 = 1,// waiting to receive the other party's nonce point R_j
47
- Round2 = 2,// waiting to receive the other party's partial scalar s_j
48
- Complete = 3
49
- }
50
- /**
51
- * Two-party BIP-340 Schnorr threshold signing session.
52
- *
53
- * Compatible with keyshares produced by `DklsDkg.Dkg` (DKLS23 key generation).
54
- *
55
- * @example
56
- * ```ts
57
- * // Party 0 (HSM / BitGo) and party 1 (user), 2-of-2 DKG keyshares.
58
- * const party0 = new SchnorrDsg(ks0, 0, [0, 1], 'm/0', hash32);
59
- * const party1 = new SchnorrDsg(ks1, 1, [0, 1], 'm/0', hash32);
60
- *
61
- * const r0 = await party0.init(); // Round 1
62
- * const r1 = await party1.init();
63
- *
64
- * const s0 = party0.handleIncomingMessages({ broadcastMessages: [r1], p2pMessages: [] }); // Round 2
65
- * const s1 = party1.handleIncomingMessages({ broadcastMessages: [r0], p2pMessages: [] });
66
- *
67
- * party0.handleIncomingMessages({ broadcastMessages: s1.broadcastMessages, p2pMessages: [] }); // Combine
68
- * // party0.signature ← 64-byte BIP-340 Schnorr sig
69
- * ```
70
- */
71
- export declare class SchnorrDsg {
72
- private readonly partyIdx;
73
- private readonly signingPartyIndices;
74
- private readonly messageHash;
75
- private readonly derivationPath;
76
- private state;
77
- private _signature;
78
- private readonly effectivePriv;
79
- private readonly pubKeyX;
80
- private ki;
81
- private Ri;
82
- private R_combined;
83
- private si;
84
- /**
85
- * @param keyShare CBOR-encoded DKLS keyshare (full or reduced format).
86
- * @param partyIdx This party's index in the DKG (0-based, must be in `signingPartyIndices`).
87
- * @param signingPartyIndices Indices of ALL parties participating in this signing session.
88
- * Must contain `partyIdx`. The Lagrange coefficients are computed
89
- * for this subset.
90
- * @param derivationPath BIP-32 non-hardened path (e.g. `'m/0'`). Defaults to root `'m'`.
91
- * @param messageHash 32-byte message hash to sign.
92
- */
93
- constructor(keyShare: Buffer, partyIdx: number, signingPartyIndices: number[], derivationPath: string, messageHash: Buffer);
94
- /** The combined 64-byte BIP-340 Schnorr signature `(R.x_32 ‖ s_32)`. Available after `Complete`. */
95
- get signature(): SchnorrDklsSignature;
96
- get dsgState(): SchnorrDsgState;
97
- /**
98
- * Round 1: generate a fresh ephemeral nonce and broadcast the nonce point R_i.
99
- * @returns Broadcast message containing the 33-byte compressed nonce point.
100
- */
101
- init(): Promise<DeserializedBroadcastMessage>;
102
- /**
103
- * Process incoming messages for the current round:
104
- *
105
- * - Round 1 → receives nonce point `R_j` → returns partial scalar `s_i`.
106
- * - Round 2 → receives partial scalar `s_j` → produces final signature.
107
- */
108
- handleIncomingMessages(messages: DeserializedMessages): DeserializedMessages;
109
- /**
110
- * Round 1: receive R_j, compute combined R, apply BIP-340 parity, compute s_i.
111
- */
112
- private _handleRound1;
113
- /**
114
- * Round 2 (combine): receive s_j, produce the final BIP-340 Schnorr signature.
115
- */
116
- private _handleRound2;
117
- }
118
- //# sourceMappingURL=dsg.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dsg.d.ts","sourceRoot":"","sources":["../../../../src/tss/schnorr-dkls/dsg.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAKH,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AA+IzF,2DAA2D;AAC3D,MAAM,MAAM,oBAAoB,GAAG;IACjC,iDAAiD;IACjD,CAAC,EAAE,UAAU,CAAC;IACd,gCAAgC;IAChC,CAAC,EAAE,UAAU,CAAC;CACf,CAAC;AAEF,oBAAY,eAAe;IACzB,aAAa,IAAI;IACjB,MAAM,IAAA,CAAE,uDAAuD;IAC/D,MAAM,IAAA,CAAE,0DAA0D;IAClE,QAAQ,IAAA;CACT;AAID;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAW;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,KAAK,CAAkD;IAC/D,OAAO,CAAC,UAAU,CAAmC;IAGrD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAGjC,OAAO,CAAC,EAAE,CAAa;IACvB,OAAO,CAAC,EAAE,CAAmE;IAG7E,OAAO,CAAC,UAAU,CAAmE;IACrF,OAAO,CAAC,EAAE,CAAa;IAEvB;;;;;;;;OAQG;gBAED,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,mBAAmB,EAAE,MAAM,EAAE,EAC7B,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM;IA8ErB,oGAAoG;IACpG,IAAI,SAAS,IAAI,oBAAoB,CAKpC;IAED,IAAI,QAAQ,IAAI,eAAe,CAE9B;IAED;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,4BAA4B,CAAC;IAqBnD;;;;;OAKG;IACH,sBAAsB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,oBAAoB;IAY5E;;OAEG;IACH,OAAO,CAAC,aAAa;IAuCrB;;OAEG;IACH,OAAO,CAAC,aAAa;CAiBtB"}
@@ -1,374 +0,0 @@
1
- "use strict";
2
- /**
3
- * Two-party BIP-340 Schnorr threshold signing (SchnorrDsg).
4
- *
5
- * Works with the Shamir keyshares produced by `DklsDkg` (DKLS23 key generation).
6
- * No new WASM is required: key material is read directly from the CBOR-encoded
7
- * keyshare, Lagrange interpolation is computed in TypeScript, and BIP-340 Schnorr
8
- * algebra is performed with `@noble/curves/secp256k1`.
9
- *
10
- * Protocol (2 broadcast rounds):
11
- *
12
- * Round 1 init()
13
- * • Each party generates a random nonce scalar k_i.
14
- * • Broadcasts the nonce point R_i = k_i * G (33-byte compressed).
15
- *
16
- * Round 2 handleIncomingMessages([R_j])
17
- * • Compute combined nonce R = R_i + R_j.
18
- * • If R.y is odd, negate k_i (BIP-340 requires even-y R).
19
- * • Compute BIP-340 challenge e = H("BIP0340/challenge", R.x ‖ P.x ‖ msg).
20
- * • Compute partial signature s_i = k_i + e · λ_i · priv_i (mod n).
21
- * • Broadcasts s_i as 32-byte big-endian scalar.
22
- *
23
- * Combine handleIncomingMessages([s_j])
24
- * • s = s_i + s_j mod n.
25
- * • signature = Buffer.concat([R.x_32, s_32]) — 64-byte BIP-340 Schnorr.
26
- *
27
- * BIP-32 non-hardened derivation is supported. For path `m/a/b/...`, the total
28
- * IL scalar (sum of per-level HMAC-SHA512 left halves) is computed from the
29
- * shared public key / chaincode. The party with the smallest index in
30
- * `signingPartyIndices` absorbs the entire IL adjustment so that Lagrange
31
- * interpolation still reconstructs the correct child private key.
32
- *
33
- * References:
34
- * BIP-340 https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
35
- * FROST https://eprint.iacr.org/2020/852
36
- */
37
- Object.defineProperty(exports, "__esModule", { value: true });
38
- exports.SchnorrDsg = exports.SchnorrDsgState = void 0;
39
- const secp256k1_1 = require("@noble/curves/secp256k1");
40
- const crypto_1 = require("crypto");
41
- const cbor_x_1 = require("cbor-x");
42
- // ── Curve constants ────────────────────────────────────────────────────────────
43
- const N = secp256k1_1.secp256k1.CURVE.n; // secp256k1 order
44
- const G = secp256k1_1.secp256k1.ProjectivePoint.BASE;
45
- // ── Scalar arithmetic helpers ──────────────────────────────────────────────────
46
- /** Reduce `x` into [0, N). */
47
- function scalarMod(x) {
48
- return ((x % N) + N) % N;
49
- }
50
- /** Modular inverse via extended Euclidean algorithm. */
51
- function scalarInvert(a) {
52
- let [r, rp] = [N, scalarMod(a)];
53
- let [s, sp] = [BigInt(0), BigInt(1)];
54
- while (rp !== BigInt(0)) {
55
- const q = r / rp;
56
- [r, rp] = [rp, r - q * rp];
57
- [s, sp] = [sp, s - q * sp];
58
- }
59
- if (r !== BigInt(1))
60
- throw new Error('scalarInvert: input has no inverse mod N');
61
- return scalarMod(s);
62
- }
63
- /** Big-endian `Buffer | Uint8Array` → `bigint`. */
64
- function bigFromBuf(b) {
65
- const hex = Buffer.from(b).toString('hex');
66
- return hex ? BigInt('0x' + hex) : BigInt(0);
67
- }
68
- /** `bigint` → 32-byte big-endian `Buffer`. */
69
- function buf32(n) {
70
- return Buffer.from(scalarMod(n).toString(16).padStart(64, '0'), 'hex');
71
- }
72
- // ── BIP-340 tagged hash ────────────────────────────────────────────────────────
73
- /**
74
- * H_tag(data...) = SHA256( SHA256(tag) ‖ SHA256(tag) ‖ data... )
75
- * as specified in BIP-340.
76
- */
77
- function taggedHash(tag, ...data) {
78
- const tagHash = (0, crypto_1.createHash)('sha256').update(tag).digest();
79
- const h = (0, crypto_1.createHash)('sha256');
80
- h.update(tagHash);
81
- h.update(tagHash);
82
- for (const d of data)
83
- h.update(d);
84
- return h.digest();
85
- }
86
- // ── Lagrange coefficient ────────────────────────────────────────────────────────
87
- /**
88
- * Compute the Lagrange coefficient λ_i for party `partyIdx` evaluated at x=0,
89
- * using only the x-coordinates of the parties in `signingPartyIndices`.
90
- *
91
- * λ_i = ∏_{j≠i, j∈S} x_j / (x_j − x_i) mod N
92
- *
93
- * @param xList Full `x_i_list` from the DKLS keyshare (one 32-byte array per party).
94
- * @param partyIdx This party's index (0-based in the global party list).
95
- * @param signingPartyIndices Indices of ALL parties participating in this signing session.
96
- */
97
- function computeLagrangeCoeff(xList, partyIdx, signingPartyIndices) {
98
- const xi = bigFromBuf(Buffer.from(xList[partyIdx]));
99
- let num = BigInt(1);
100
- let den = BigInt(1);
101
- for (const j of signingPartyIndices) {
102
- if (j === partyIdx)
103
- continue;
104
- const xj = bigFromBuf(Buffer.from(xList[j]));
105
- num = scalarMod(num * xj);
106
- den = scalarMod(den * scalarMod(xj - xi));
107
- }
108
- return scalarMod(num * scalarInvert(den));
109
- }
110
- // ── BIP-32 non-hardened derivation ─────────────────────────────────────────────
111
- /**
112
- * Parse a derivation path string (`'m/0/1/2'`) into an array of child indices.
113
- * Hardened paths (`'m/44'/0'`) are not supported.
114
- */
115
- function parsePath(path) {
116
- if (path === 'm' || path === '')
117
- return [];
118
- const parts = path.replace(/^m\/?/, '').split('/');
119
- return parts.map((p) => {
120
- if (p.endsWith("'"))
121
- throw new Error('Hardened derivation is not supported for Schnorr threshold signing.');
122
- const idx = parseInt(p, 10);
123
- if (isNaN(idx) || idx < 0 || idx >= 0x80000000)
124
- throw new Error(`Invalid path component: ${p}`);
125
- return idx;
126
- });
127
- }
128
- /**
129
- * Derive the total IL scalar and final chaincode for a non-hardened BIP-32 path.
130
- *
131
- * BIP-32 non-hardened child key update:
132
- * I = HMAC-SHA512(key=chainCode, data=compressedPubKey ‖ ser32(index))
133
- * childPriv = parentPriv + IL (mod N)
134
- * childPubKey = parentPubKey + IL * G
135
- * childChainCode = IR
136
- *
137
- * For threshold signing, the IL scalars are additive, so the total private-key
138
- * adjustment is `totalIL = Σ IL_k`. The caller is responsible for applying this
139
- * to the right party's share.
140
- *
141
- * @returns `{ totalIL, finalChainCode, finalPubKey }` for the derived child.
142
- */
143
- function derivePath(rootPubKey, rootChainCode, path) {
144
- let pub = rootPubKey; // 33-byte compressed
145
- let cc = rootChainCode; // 32-byte chaincode
146
- let totalIL = BigInt(0);
147
- for (const index of path) {
148
- const indexBuf = Buffer.alloc(4);
149
- indexBuf.writeUInt32BE(index, 0);
150
- const I = Buffer.from((0, crypto_1.createHmac)('sha512', cc).update(pub).update(indexBuf).digest());
151
- const IL = bigFromBuf(I.slice(0, 32));
152
- const IR = I.slice(32);
153
- if (IL >= N)
154
- throw new Error('BIP-32 derived IL >= N; this path is invalid (astronomically unlikely).');
155
- totalIL = scalarMod(totalIL + IL);
156
- cc = IR;
157
- // Advance the public key to the child level.
158
- const pubPoint = secp256k1_1.secp256k1.ProjectivePoint.fromHex(pub.toString('hex'));
159
- const childPoint = pubPoint.add(G.multiply(IL));
160
- pub = Buffer.from(childPoint.toRawBytes(true));
161
- }
162
- return { totalIL, finalChainCode: cc, finalPubKey: pub };
163
- }
164
- var SchnorrDsgState;
165
- (function (SchnorrDsgState) {
166
- SchnorrDsgState[SchnorrDsgState["Uninitialized"] = 0] = "Uninitialized";
167
- SchnorrDsgState[SchnorrDsgState["Round1"] = 1] = "Round1";
168
- SchnorrDsgState[SchnorrDsgState["Round2"] = 2] = "Round2";
169
- SchnorrDsgState[SchnorrDsgState["Complete"] = 3] = "Complete";
170
- })(SchnorrDsgState || (exports.SchnorrDsgState = SchnorrDsgState = {}));
171
- // ── SchnorrDsg ─────────────────────────────────────────────────────────────────
172
- /**
173
- * Two-party BIP-340 Schnorr threshold signing session.
174
- *
175
- * Compatible with keyshares produced by `DklsDkg.Dkg` (DKLS23 key generation).
176
- *
177
- * @example
178
- * ```ts
179
- * // Party 0 (HSM / BitGo) and party 1 (user), 2-of-2 DKG keyshares.
180
- * const party0 = new SchnorrDsg(ks0, 0, [0, 1], 'm/0', hash32);
181
- * const party1 = new SchnorrDsg(ks1, 1, [0, 1], 'm/0', hash32);
182
- *
183
- * const r0 = await party0.init(); // Round 1
184
- * const r1 = await party1.init();
185
- *
186
- * const s0 = party0.handleIncomingMessages({ broadcastMessages: [r1], p2pMessages: [] }); // Round 2
187
- * const s1 = party1.handleIncomingMessages({ broadcastMessages: [r0], p2pMessages: [] });
188
- *
189
- * party0.handleIncomingMessages({ broadcastMessages: s1.broadcastMessages, p2pMessages: [] }); // Combine
190
- * // party0.signature ← 64-byte BIP-340 Schnorr sig
191
- * ```
192
- */
193
- class SchnorrDsg {
194
- /**
195
- * @param keyShare CBOR-encoded DKLS keyshare (full or reduced format).
196
- * @param partyIdx This party's index in the DKG (0-based, must be in `signingPartyIndices`).
197
- * @param signingPartyIndices Indices of ALL parties participating in this signing session.
198
- * Must contain `partyIdx`. The Lagrange coefficients are computed
199
- * for this subset.
200
- * @param derivationPath BIP-32 non-hardened path (e.g. `'m/0'`). Defaults to root `'m'`.
201
- * @param messageHash 32-byte message hash to sign.
202
- */
203
- constructor(keyShare, partyIdx, signingPartyIndices, derivationPath, messageHash) {
204
- this.state = SchnorrDsgState.Uninitialized;
205
- // Set in init()
206
- this.ki = BigInt(0); // ephemeral nonce scalar
207
- this.si = BigInt(0); // partial signature scalar
208
- if (messageHash.length !== 32) {
209
- throw new Error(`messageHash must be 32 bytes, got ${messageHash.length}`);
210
- }
211
- if (!signingPartyIndices.includes(partyIdx)) {
212
- throw new Error(`partyIdx ${partyIdx} must be included in signingPartyIndices`);
213
- }
214
- if (signingPartyIndices.length < 2) {
215
- throw new Error('signingPartyIndices must contain at least 2 parties');
216
- }
217
- this.partyIdx = partyIdx;
218
- this.signingPartyIndices = signingPartyIndices;
219
- this.messageHash = messageHash;
220
- this.derivationPath = derivationPath;
221
- const ks = (0, cbor_x_1.decode)(keyShare);
222
- // Support both full keyshare (s_i / x_i_list / public_key / root_chain_code)
223
- // and reduced keyshare (prv / xList / pub) as produced by Dkg.getReducedKeyShare().
224
- const privBytes = ks.s_i ?? ks.prv;
225
- const pubBytes = ks.public_key ?? ks.pub;
226
- const ccBytes = ks.root_chain_code ?? ks.rootChainCode;
227
- const xList = ks.x_i_list ?? ks.xList;
228
- const si = bigFromBuf(Buffer.from(privBytes));
229
- const rootPub = Buffer.from(pubBytes); // 33-byte compressed
230
- const rootCC = Buffer.from(ccBytes); // 32-byte chaincode
231
- // ── BIP-32 derivation ──────────────────────────────────────────────────
232
- const path = parsePath(derivationPath);
233
- let finalPubKey = rootPub;
234
- let totalIL = BigInt(0);
235
- if (path.length > 0) {
236
- const derived = derivePath(rootPub, rootCC, path);
237
- totalIL = derived.totalIL;
238
- finalPubKey = derived.finalPubKey;
239
- }
240
- // ── Lagrange coefficient ───────────────────────────────────────────────
241
- const li = computeLagrangeCoeff(xList, partyIdx, signingPartyIndices);
242
- // ── BIP-340 public key parity adjustment ───────────────────────────────
243
- // BIP-340 uses the x-only public key; the "canonical" key has even y.
244
- // If the final derived public key has odd y, negate the private key.
245
- const pYIsOdd = finalPubKey[0] === 0x03;
246
- this.pubKeyX = finalPubKey.slice(1); // 32-byte x-only
247
- // ── Effective private share ────────────────────────────────────────────
248
- // Base share contribution: λ_i · s_i
249
- let eff = scalarMod(li * si);
250
- // BIP-32 IL adjustment: the party with the smallest index in the signing
251
- // set absorbs the entire totalIL so that Lagrange interpolation over the
252
- // adjusted shares reconstructs the correct child private key.
253
- //
254
- // sum_{k∈S} λ_k · s_k_adj = d_root + totalIL (= d_child)
255
- //
256
- // where s_min_adj = s_min + totalIL · λ_min^{-1}, s_k_adj = s_k (k≠min).
257
- //
258
- // From this party's perspective, the effective contribution is:
259
- // if this is the min party: λ_min · s_min_adj = λ_min·s_min + totalIL
260
- // otherwise: λ_k · s_k (unchanged)
261
- const isMinParty = partyIdx === Math.min(...signingPartyIndices);
262
- if (isMinParty && totalIL !== BigInt(0)) {
263
- eff = scalarMod(eff + totalIL);
264
- }
265
- // If P.y is odd, negate the effective contribution.
266
- if (pYIsOdd) {
267
- eff = scalarMod(N - eff);
268
- }
269
- this.effectivePriv = eff;
270
- }
271
- /** The combined 64-byte BIP-340 Schnorr signature `(R.x_32 ‖ s_32)`. Available after `Complete`. */
272
- get signature() {
273
- if (!this._signature) {
274
- throw new Error('Signature not produced yet.');
275
- }
276
- return this._signature;
277
- }
278
- get dsgState() {
279
- return this.state;
280
- }
281
- /**
282
- * Round 1: generate a fresh ephemeral nonce and broadcast the nonce point R_i.
283
- * @returns Broadcast message containing the 33-byte compressed nonce point.
284
- */
285
- async init() {
286
- if (this.state !== SchnorrDsgState.Uninitialized) {
287
- throw new Error('SchnorrDsg session already initialized.');
288
- }
289
- // Sample a random nonce scalar k_i in [1, N).
290
- let kiBuf;
291
- do {
292
- kiBuf = Buffer.from((0, crypto_1.randomBytes)(32));
293
- this.ki = bigFromBuf(kiBuf);
294
- } while (this.ki === BigInt(0) || this.ki >= N);
295
- this.Ri = G.multiply(this.ki);
296
- this.state = SchnorrDsgState.Round1;
297
- return {
298
- payload: new Uint8Array(Buffer.from(this.Ri.toRawBytes(true))), // 33 bytes compressed
299
- from: this.partyIdx,
300
- };
301
- }
302
- /**
303
- * Process incoming messages for the current round:
304
- *
305
- * - Round 1 → receives nonce point `R_j` → returns partial scalar `s_i`.
306
- * - Round 2 → receives partial scalar `s_j` → produces final signature.
307
- */
308
- handleIncomingMessages(messages) {
309
- if (this.state === SchnorrDsgState.Round1) {
310
- return this._handleRound1(messages);
311
- }
312
- if (this.state === SchnorrDsgState.Round2) {
313
- return this._handleRound2(messages);
314
- }
315
- throw new Error(`handleIncomingMessages called in unexpected state: ${SchnorrDsgState[this.state]}`);
316
- }
317
- // ── Private round handlers ────────────────────────────────────────────────────
318
- /**
319
- * Round 1: receive R_j, compute combined R, apply BIP-340 parity, compute s_i.
320
- */
321
- _handleRound1(messages) {
322
- if (messages.broadcastMessages.length !== 1) {
323
- throw new Error(`Round 1: expected 1 broadcast message (R_j), got ${messages.broadcastMessages.length}`);
324
- }
325
- if (!this.Ri)
326
- throw new Error('Nonce point not set — call init() first.');
327
- const Rj = secp256k1_1.secp256k1.ProjectivePoint.fromHex(Buffer.from(messages.broadcastMessages[0].payload).toString('hex'));
328
- // Combine: R = R_i + R_j
329
- const R_raw = this.Ri.add(Rj);
330
- // BIP-340: R.y must be even. If odd, negate k_i (both parties will agree on
331
- // the sign since they both see the same R = R_i + R_j).
332
- const R_yIsOdd = R_raw.y % BigInt(2) === BigInt(1);
333
- if (R_yIsOdd) {
334
- this.ki = scalarMod(N - this.ki);
335
- }
336
- // Store the parity-normalised R (even y).
337
- this.R_combined = R_yIsOdd ? R_raw.negate() : R_raw;
338
- // BIP-340 challenge: e = H_tag("BIP0340/challenge", R.x_32 ‖ P.x_32 ‖ msg)
339
- const Rx = buf32(this.R_combined.x);
340
- const e = bigFromBuf(taggedHash('BIP0340/challenge', Rx, this.pubKeyX, this.messageHash));
341
- // Partial signature: s_i = k_i + e · effectivePriv_i (mod N)
342
- this.si = scalarMod(this.ki + scalarMod(e * this.effectivePriv));
343
- this.state = SchnorrDsgState.Round2;
344
- return {
345
- broadcastMessages: [
346
- {
347
- payload: new Uint8Array(buf32(this.si)), // 32 bytes
348
- from: this.partyIdx,
349
- },
350
- ],
351
- p2pMessages: [],
352
- };
353
- }
354
- /**
355
- * Round 2 (combine): receive s_j, produce the final BIP-340 Schnorr signature.
356
- */
357
- _handleRound2(messages) {
358
- if (messages.broadcastMessages.length !== 1) {
359
- throw new Error(`Round 2: expected 1 broadcast message (s_j), got ${messages.broadcastMessages.length}`);
360
- }
361
- if (!this.R_combined)
362
- throw new Error('R_combined not set — handleRound1 must run first.');
363
- const sj = bigFromBuf(Buffer.from(messages.broadcastMessages[0].payload));
364
- const s = scalarMod(this.si + sj);
365
- this._signature = {
366
- R: new Uint8Array(buf32(this.R_combined.x)),
367
- S: new Uint8Array(buf32(s)),
368
- };
369
- this.state = SchnorrDsgState.Complete;
370
- return { broadcastMessages: [], p2pMessages: [] };
371
- }
372
- }
373
- exports.SchnorrDsg = SchnorrDsg;
374
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHNnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9zY2hub3JyLWRrbHMvZHNnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtDRzs7O0FBRUgsdURBQWlFO0FBQ2pFLG1DQUE2RDtBQUM3RCxtQ0FBZ0M7QUFHaEMsa0ZBQWtGO0FBRWxGLE1BQU0sQ0FBQyxHQUFHLHFCQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQjtBQUMvQyxNQUFNLENBQUMsR0FBRyxxQkFBUyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7QUFFekMsa0ZBQWtGO0FBRWxGLDhCQUE4QjtBQUM5QixTQUFTLFNBQVMsQ0FBQyxDQUFTO0lBQzFCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUVELHdEQUF3RDtBQUN4RCxTQUFTLFlBQVksQ0FBQyxDQUFTO0lBQzdCLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxPQUFPLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxD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LENBQUMsQ0FBQztRQUVsQyxJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2hCLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQyxDQUFDLEVBQUUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVCLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUM7UUFFdEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDcEQsQ0FBQztDQUNGO0FBck9ELGdDQXFPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHdvLXBhcnR5IEJJUC0zNDAgU2Nobm9yciB0aHJlc2hvbGQgc2lnbmluZyAoU2Nobm9yckRzZykuXG4gKlxuICogV29ya3Mgd2l0aCB0aGUgU2hhbWlyIGtleXNoYXJlcyBwcm9kdWNlZCBieSBgRGtsc0RrZ2AgKERLTFMyMyBrZXkgZ2VuZXJhdGlvbikuXG4gKiBObyBuZXcgV0FTTSBpcyByZXF1aXJlZDoga2V5IG1hdGVyaWFsIGlzIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgQ0JPUi1lbmNvZGVkXG4gKiBrZXlzaGFyZSwgTGFncmFuZ2UgaW50ZXJwb2xhdGlvbiBpcyBjb21wdXRlZCBpbiBUeXBlU2NyaXB0LCBhbmQgQklQLTM0MCBTY2hub3JyXG4gKiBhbGdlYnJhIGlzIHBlcmZvcm1lZCB3aXRoIGBAbm9ibGUvY3VydmVzL3NlY3AyNTZrMWAuXG4gKlxuICogUHJvdG9jb2wgKDIgYnJvYWRjYXN0IHJvdW5kcyk6XG4gKlxuICogICBSb3VuZCAxICBpbml0KClcbiAqICAgICDigKIgRWFjaCBwYXJ0eSBnZW5lcmF0ZXMgYSByYW5kb20gbm9uY2Ugc2NhbGFyIGtfaS5cbiAqICAgICDigKIgQnJvYWRjYXN0cyB0aGUgbm9uY2UgcG9pbnQgUl9pID0ga19pICogRyAgKDMzLWJ5dGUgY29tcHJlc3NlZCkuXG4gKlxuICogICBSb3VuZCAyICBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFtSX2pdKVxuICogICAgIOKAoiBDb21wdXRlIGNvbWJpbmVkIG5vbmNlIFIgPSBSX2kgKyBSX2ouXG4gKiAgICAg4oCiIElmIFIueSBpcyBvZGQsIG5lZ2F0ZSBrX2kgIChCSVAtMzQwIHJlcXVpcmVzIGV2ZW4teSBSKS5cbiAqICAgICDigKIgQ29tcHV0ZSBCSVAtMzQwIGNoYWxsZW5nZSAgZSA9IEgoXCJCSVAwMzQwL2NoYWxsZW5nZVwiLCBSLngg4oCWIFAueCDigJYgbXNnKS5cbiAqICAgICDigKIgQ29tcHV0ZSBwYXJ0aWFsIHNpZ25hdHVyZSAgc19pID0ga19pICsgZSDCtyDOu19pIMK3IHByaXZfaSAgIChtb2QgbikuXG4gKiAgICAg4oCiIEJyb2FkY2FzdHMgc19pIGFzIDMyLWJ5dGUgYmlnLWVuZGlhbiBzY2FsYXIuXG4gKlxuICogICBDb21iaW5lICBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFtzX2pdKVxuICogICAgIOKAoiBzID0gc19pICsgc19qICBtb2Qgbi5cbiAqICAgICDigKIgc2lnbmF0dXJlID0gQnVmZmVyLmNvbmNhdChbUi54XzMyLCBzXzMyXSkgIOKAlCA2NC1ieXRlIEJJUC0zNDAgU2Nobm9yci5cbiAqXG4gKiBCSVAtMzIgbm9uLWhhcmRlbmVkIGRlcml2YXRpb24gaXMgc3VwcG9ydGVkLiAgRm9yIHBhdGggYG0vYS9iLy4uLmAsIHRoZSB0b3RhbFxuICogSUwgc2NhbGFyIChzdW0gb2YgcGVyLWxldmVsIEhNQUMtU0hBNTEyIGxlZnQgaGFsdmVzKSBpcyBjb21wdXRlZCBmcm9tIHRoZVxuICogc2hhcmVkIHB1YmxpYyBrZXkgLyBjaGFpbmNvZGUuICBUaGUgcGFydHkgd2l0aCB0aGUgc21hbGxlc3QgaW5kZXggaW5cbiAqIGBzaWduaW5nUGFydHlJbmRpY2VzYCBhYnNvcmJzIHRoZSBlbnRpcmUgSUwgYWRqdXN0bWVudCBzbyB0aGF0IExhZ3JhbmdlXG4gKiBpbnRlcnBvbGF0aW9uIHN0aWxsIHJlY29uc3RydWN0cyB0aGUgY29ycmVjdCBjaGlsZCBwcml2YXRlIGtleS5cbiAqXG4gKiBSZWZlcmVuY2VzOlxuICogICBCSVAtMzQwICBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXBzL2Jsb2IvbWFzdGVyL2JpcC0wMzQwLm1lZGlhd2lraVxuICogICBGUk9TVCAgICBodHRwczovL2VwcmludC5pYWNyLm9yZy8yMDIwLzg1MlxuICovXG5cbmltcG9ydCB7IHNlY3AyNTZrMSBhcyBub2JsZVNlY3AgfSBmcm9tICdAbm9ibGUvY3VydmVzL3NlY3AyNTZrMSc7XG5pbXBvcnQgeyBjcmVhdGVIbWFjLCByYW5kb21CeXRlcywgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdjYm9yLXgnO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVkQnJvYWRjYXN0TWVzc2FnZSwgRGVzZXJpYWxpemVkTWVzc2FnZXMgfSBmcm9tICcuLi9lY2RzYS1ka2xzL3R5cGVzJztcblxuLy8g4pSA4pSAIEN1cnZlIGNvbnN0YW50cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuY29uc3QgTiA9IG5vYmxlU2VjcC5DVVJWRS5uOyAvLyBzZWNwMjU2azEgb3JkZXJcbmNvbnN0IEcgPSBub2JsZVNlY3AuUHJvamVjdGl2ZVBvaW50LkJBU0U7XG5cbi8vIOKUgOKUgCBTY2FsYXIgYXJpdGhtZXRpYyBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogUmVkdWNlIGB4YCBpbnRvIFswLCBOKS4gKi9cbmZ1bmN0aW9uIHNjYWxhck1vZCh4OiBiaWdpbnQpOiBiaWdpbnQge1xuICByZXR1cm4gKCh4ICUgTikgKyBOKSAlIE47XG59XG5cbi8qKiBNb2R1bGFyIGludmVyc2UgdmlhIGV4dGVuZGVkIEV1Y2xpZGVhbiBhbGdvcml0aG0uICovXG5mdW5jdGlvbiBzY2FsYXJJbnZlcnQoYTogYmlnaW50KTogYmlnaW50IHtcbiAgbGV0IFtyLCBycF0gPSBbTiwgc2NhbGFyTW9kKGEpXTtcbiAgbGV0IFtzLCBzcF0gPSBbQmlnSW50KDApLCBCaWdJbnQoMSldO1xuICB3aGlsZSAocnAgIT09IEJpZ0ludCgwKSkge1xuICAgIGNvbnN0IHEgPSByIC8gcnA7XG4gICAgW3IsIHJwXSA9IFtycCwgciAtIHEgKiBycF07XG4gICAgW3MsIHNwXSA9IFtzcCwgcyAtIHEgKiBzcF07XG4gIH1cbiAgaWYgKHIgIT09IEJpZ0ludCgxKSkgdGhyb3cgbmV3IEVycm9yKCdzY2FsYXJJbnZlcnQ6IGlucHV0IGhhcyBubyBpbnZlcnNlIG1vZCBOJyk7XG4gIHJldHVybiBzY2FsYXJNb2Qocyk7XG59XG5cbi8qKiBCaWctZW5kaWFuIGBCdWZmZXIgfCBVaW50OEFycmF5YCDihpIgYGJpZ2ludGAuICovXG5mdW5jdGlvbiBiaWdGcm9tQnVmKGI6IEJ1ZmZlciB8IFVpbnQ4QXJyYXkpOiBiaWdpbnQge1xuICBjb25zdCBoZXggPSBCdWZmZXIuZnJvbShiKS50b1N0cmluZygnaGV4Jyk7XG4gIHJldHVybiBoZXggPyBCaWdJbnQoJzB4JyArIGhleCkgOiBCaWdJbnQoMCk7XG59XG5cbi8qKiBgYmlnaW50YCDihpIgMzItYnl0ZSBiaWctZW5kaWFuIGBCdWZmZXJgLiAqL1xuZnVuY3Rpb24gYnVmMzIobjogYmlnaW50KTogQnVmZmVyIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHNjYWxhck1vZChuKS50b1N0cmluZygxNikucGFkU3RhcnQoNjQsICcwJyksICdoZXgnKTtcbn1cblxuLy8g4pSA4pSAIEJJUC0zNDAgdGFnZ2VkIGhhc2gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogSF90YWcoZGF0YS4uLikgPSBTSEEyNTYoIFNIQTI1Nih0YWcpIOKAliBTSEEyNTYodGFnKSDigJYgZGF0YS4uLiApXG4gKiBhcyBzcGVjaWZpZWQgaW4gQklQLTM0MC5cbiAqL1xuZnVuY3Rpb24gdGFnZ2VkSGFzaCh0YWc6IHN0cmluZywgLi4uZGF0YTogQnVmZmVyW10pOiBCdWZmZXIge1xuICBjb25zdCB0YWdIYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHRhZykuZGlnZXN0KCk7XG4gIGNvbnN0IGggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcbiAgaC51cGRhdGUodGFnSGFzaCk7XG4gIGgudXBkYXRlKHRhZ0hhc2gpO1xuICBmb3IgKGNvbnN0IGQgb2YgZGF0YSkgaC51cGRhdGUoZCk7XG4gIHJldHVybiBoLmRpZ2VzdCgpO1xufVxuXG4vLyDilIDilIAgTGFncmFuZ2UgY29lZmZpY2llbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgTGFncmFuZ2UgY29lZmZpY2llbnQgzrtfaSBmb3IgcGFydHkgYHBhcnR5SWR4YCBldmFsdWF0ZWQgYXQgeD0wLFxuICogdXNpbmcgb25seSB0aGUgeC1jb29yZGluYXRlcyBvZiB0aGUgcGFydGllcyBpbiBgc2lnbmluZ1BhcnR5SW5kaWNlc2AuXG4gKlxuICogzrtfaSA9IOKIj197auKJoGksIGriiIhTfSAgeF9qIC8gKHhfaiDiiJIgeF9pKSAgIG1vZCBOXG4gKlxuICogQHBhcmFtIHhMaXN0ICAgICAgIEZ1bGwgYHhfaV9saXN0YCBmcm9tIHRoZSBES0xTIGtleXNoYXJlIChvbmUgMzItYnl0ZSBhcnJheSBwZXIgcGFydHkpLlxuICogQHBhcmFtIHBhcnR5SWR4ICAgIFRoaXMgcGFydHkncyBpbmRleCAoMC1iYXNlZCBpbiB0aGUgZ2xvYmFsIHBhcnR5IGxpc3QpLlxuICogQHBhcmFtIHNpZ25pbmdQYXJ0eUluZGljZXMgIEluZGljZXMgb2YgQUxMIHBhcnRpZXMgcGFydGljaXBhdGluZyBpbiB0aGlzIHNpZ25pbmcgc2Vzc2lvbi5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUxhZ3JhbmdlQ29lZmYoeExpc3Q6IG51bWJlcltdW10sIHBhcnR5SWR4OiBudW1iZXIsIHNpZ25pbmdQYXJ0eUluZGljZXM6IG51bWJlcltdKTogYmlnaW50IHtcbiAgY29uc3QgeGkgPSBiaWdGcm9tQnVmKEJ1ZmZlci5mcm9tKHhMaXN0W3BhcnR5SWR4XSkpO1xuICBsZXQgbnVtID0gQmlnSW50KDEpO1xuICBsZXQgZGVuID0gQmlnSW50KDEpO1xuICBmb3IgKGNvbnN0IGogb2Ygc2lnbmluZ1BhcnR5SW5kaWNlcykge1xuICAgIGlmIChqID09PSBwYXJ0eUlkeCkgY29udGludWU7XG4gICAgY29uc3QgeGogPSBiaWdGcm9tQnVmKEJ1ZmZlci5mcm9tKHhMaXN0W2pdKSk7XG4gICAgbnVtID0gc2NhbGFyTW9kKG51bSAqIHhqKTtcbiAgICBkZW4gPSBzY2FsYXJNb2QoZGVuICogc2NhbGFyTW9kKHhqIC0geGkpKTtcbiAgfVxuICByZXR1cm4gc2NhbGFyTW9kKG51bSAqIHNjYWxhckludmVydChkZW4pKTtcbn1cblxuLy8g4pSA4pSAIEJJUC0zMiBub24taGFyZGVuZWQgZGVyaXZhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBQYXJzZSBhIGRlcml2YXRpb24gcGF0aCBzdHJpbmcgKGAnbS8wLzEvMidgKSBpbnRvIGFuIGFycmF5IG9mIGNoaWxkIGluZGljZXMuXG4gKiBIYXJkZW5lZCBwYXRocyAoYCdtLzQ0Jy8wJ2ApIGFyZSBub3Qgc3VwcG9ydGVkLlxuICovXG5mdW5jdGlvbiBwYXJzZVBhdGgocGF0aDogc3RyaW5nKTogbnVtYmVyW10ge1xuICBpZiAocGF0aCA9PT0gJ20nIHx8IHBhdGggPT09ICcnKSByZXR1cm4gW107XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5yZXBsYWNlKC9ebVxcLz8vLCAnJykuc3BsaXQoJy8nKTtcbiAgcmV0dXJuIHBhcnRzLm1hcCgocCkgPT4ge1xuICAgIGlmIChwLmVuZHNXaXRoKFwiJ1wiKSkgdGhyb3cgbmV3IEVycm9yKCdIYXJkZW5lZCBkZXJpdmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFNjaG5vcnIgdGhyZXNob2xkIHNpZ25pbmcuJyk7XG4gICAgY29uc3QgaWR4ID0gcGFyc2VJbnQocCwgMTApO1xuICAgIGlmIChpc05hTihpZHgpIHx8IGlkeCA8IDAgfHwgaWR4ID49IDB4ODAwMDAwMDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXRoIGNvbXBvbmVudDogJHtwfWApO1xuICAgIHJldHVybiBpZHg7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlcml2ZSB0aGUgdG90YWwgSUwgc2NhbGFyIGFuZCBmaW5hbCBjaGFpbmNvZGUgZm9yIGEgbm9uLWhhcmRlbmVkIEJJUC0zMiBwYXRoLlxuICpcbiAqIEJJUC0zMiBub24taGFyZGVuZWQgY2hpbGQga2V5IHVwZGF0ZTpcbiAqICAgSSA9IEhNQUMtU0hBNTEyKGtleT1jaGFpbkNvZGUsIGRhdGE9Y29tcHJlc3NlZFB1YktleSDigJYgc2VyMzIoaW5kZXgpKVxuICogICBjaGlsZFByaXYgICAgPSBwYXJlbnRQcml2ICsgSUwgICAobW9kIE4pXG4gKiAgIGNoaWxkUHViS2V5ICA9IHBhcmVudFB1YktleSArIElMICogR1xuICogICBjaGlsZENoYWluQ29kZSA9IElSXG4gKlxuICogRm9yIHRocmVzaG9sZCBzaWduaW5nLCB0aGUgSUwgc2NhbGFycyBhcmUgYWRkaXRpdmUsIHNvIHRoZSB0b3RhbCBwcml2YXRlLWtleVxuICogYWRqdXN0bWVudCBpcyBgdG90YWxJTCA9IM6jIElMX2tgLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYXBwbHlpbmcgdGhpc1xuICogdG8gdGhlIHJpZ2h0IHBhcnR5J3Mgc2hhcmUuXG4gKlxuICogQHJldHVybnMgYHsgdG90YWxJTCwgZmluYWxDaGFpbkNvZGUsIGZpbmFsUHViS2V5IH1gIGZvciB0aGUgZGVyaXZlZCBjaGlsZC5cbiAqL1xuZnVuY3Rpb24gZGVyaXZlUGF0aChcbiAgcm9vdFB1YktleTogQnVmZmVyLFxuICByb290Q2hhaW5Db2RlOiBCdWZmZXIsXG4gIHBhdGg6IG51bWJlcltdXG4pOiB7IHRvdGFsSUw6IGJpZ2ludDsgZmluYWxDaGFpbkNvZGU6IEJ1ZmZlcjsgZmluYWxQdWJLZXk6IEJ1ZmZlciB9IHtcbiAgbGV0IHB1YiA9IHJvb3RQdWJLZXk7IC8vIDMzLWJ5dGUgY29tcHJlc3NlZFxuICBsZXQgY2MgPSByb290Q2hhaW5Db2RlOyAvLyAzMi1ieXRlIGNoYWluY29kZVxuICBsZXQgdG90YWxJTCA9IEJpZ0ludCgwKTtcblxuICBmb3IgKGNvbnN0IGluZGV4IG9mIHBhdGgpIHtcbiAgICBjb25zdCBpbmRleEJ1ZiA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICBpbmRleEJ1Zi53cml0ZVVJbnQzMkJFKGluZGV4LCAwKTtcblxuICAgIGNvbnN0IEkgPSBCdWZmZXIuZnJvbShjcmVhdGVIbWFjKCdzaGE1MTInLCBjYykudXBkYXRlKHB1YikudXBkYXRlKGluZGV4QnVmKS5kaWdlc3QoKSk7XG4gICAgY29uc3QgSUwgPSBiaWdGcm9tQnVmKEkuc2xpY2UoMCwgMzIpKTtcbiAgICBjb25zdCBJUiA9IEkuc2xpY2UoMzIpO1xuXG4gICAgaWYgKElMID49IE4pIHRocm93IG5ldyBFcnJvcignQklQLTMyIGRlcml2ZWQgSUwgPj0gTjsgdGhpcyBwYXRoIGlzIGludmFsaWQgKGFzdHJvbm9taWNhbGx5IHVubGlrZWx5KS4nKTtcblxuICAgIHRvdGFsSUwgPSBzY2FsYXJNb2QodG90YWxJTCArIElMKTtcbiAgICBjYyA9IElSO1xuXG4gICAgLy8gQWR2YW5jZSB0aGUgcHVibGljIGtleSB0byB0aGUgY2hpbGQgbGV2ZWwuXG4gICAgY29uc3QgcHViUG9pbnQgPSBub2JsZVNlY3AuUHJvamVjdGl2ZVBvaW50LmZyb21IZXgocHViLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgY29uc3QgY2hpbGRQb2ludCA9IHB1YlBvaW50LmFkZChHLm11bHRpcGx5KElMKSk7XG4gICAgcHViID0gQnVmZmVyLmZyb20oY2hpbGRQb2ludC50b1Jhd0J5dGVzKHRydWUpKTtcbiAgfVxuXG4gIHJldHVybiB7IHRvdGFsSUwsIGZpbmFsQ2hhaW5Db2RlOiBjYywgZmluYWxQdWJLZXk6IHB1YiB9O1xufVxuXG4vLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiA2NC1ieXRlIEJJUC0zNDAgU2Nobm9yciBzaWduYXR1cmUgYChSLnhfMzIg4oCWIHNfMzIpYC4gKi9cbmV4cG9ydCB0eXBlIFNjaG5vcnJEa2xzU2lnbmF0dXJlID0ge1xuICAvKiogMzItYnl0ZSB4LWNvb3JkaW5hdGUgb2YgdGhlIG5vbmNlIHBvaW50IFIuICovXG4gIFI6IFVpbnQ4QXJyYXk7XG4gIC8qKiAzMi1ieXRlIFNjaG5vcnIgc2NhbGFyIHMuICovXG4gIFM6IFVpbnQ4QXJyYXk7XG59O1xuXG5leHBvcnQgZW51bSBTY2hub3JyRHNnU3RhdGUge1xuICBVbmluaXRpYWxpemVkID0gMCxcbiAgUm91bmQxLCAvLyB3YWl0aW5nIHRvIHJlY2VpdmUgdGhlIG90aGVyIHBhcnR5J3Mgbm9uY2UgcG9pbnQgUl9qXG4gIFJvdW5kMiwgLy8gd2FpdGluZyB0byByZWNlaXZlIHRoZSBvdGhlciBwYXJ0eSdzIHBhcnRpYWwgc2NhbGFyIHNfalxuICBDb21wbGV0ZSxcbn1cblxuLy8g4pSA4pSAIFNjaG5vcnJEc2cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogVHdvLXBhcnR5IEJJUC0zNDAgU2Nobm9yciB0aHJlc2hvbGQgc2lnbmluZyBzZXNzaW9uLlxuICpcbiAqIENvbXBhdGlibGUgd2l0aCBrZXlzaGFyZXMgcHJvZHVjZWQgYnkgYERrbHNEa2cuRGtnYCAoREtMUzIzIGtleSBnZW5lcmF0aW9uKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIFBhcnR5IDAgKEhTTSAvIEJpdEdvKSBhbmQgcGFydHkgMSAodXNlciksIDItb2YtMiBES0cga2V5c2hhcmVzLlxuICogY29uc3QgcGFydHkwID0gbmV3IFNjaG5vcnJEc2coa3MwLCAwLCBbMCwgMV0sICdtLzAnLCBoYXNoMzIpO1xuICogY29uc3QgcGFydHkxID0gbmV3IFNjaG5vcnJEc2coa3MxLCAxLCBbMCwgMV0sICdtLzAnLCBoYXNoMzIpO1xuICpcbiAqIGNvbnN0IHIwID0gYXdhaXQgcGFydHkwLmluaXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUm91bmQgMVxuICogY29uc3QgcjEgPSBhd2FpdCBwYXJ0eTEuaW5pdCgpO1xuICpcbiAqIGNvbnN0IHMwID0gcGFydHkwLmhhbmRsZUluY29taW5nTWVzc2FnZXMoeyBicm9hZGNhc3RNZXNzYWdlczogW3IxXSwgcDJwTWVzc2FnZXM6IFtdIH0pOyAvLyBSb3VuZCAyXG4gKiBjb25zdCBzMSA9IHBhcnR5MS5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtyMF0sIHAycE1lc3NhZ2VzOiBbXSB9KTtcbiAqXG4gKiBwYXJ0eTAuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7IGJyb2FkY2FzdE1lc3NhZ2VzOiBzMS5icm9hZGNhc3RNZXNzYWdlcywgcDJwTWVzc2FnZXM6IFtdIH0pOyAvLyBDb21iaW5lXG4gKiAvLyBwYXJ0eTAuc2lnbmF0dXJlICDihpAgNjQtYnl0ZSBCSVAtMzQwIFNjaG5vcnIgc2lnXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNjaG5vcnJEc2cge1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcnR5SWR4OiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2lnbmluZ1BhcnR5SW5kaWNlczogbnVtYmVyW107XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZUhhc2g6IEJ1ZmZlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXJpdmF0aW9uUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHN0YXRlOiBTY2hub3JyRHNnU3RhdGUgPSBTY2hub3JyRHNnU3RhdGUuVW5pbml0aWFsaXplZDtcbiAgcHJpdmF0ZSBfc2lnbmF0dXJlOiBTY2hub3JyRGtsc1NpZ25hdHVyZSB8IHVuZGVmaW5lZDtcblxuICAvLyBDb21wdXRlZCBpbiBjb25zdHJ1Y3RvclxuICBwcml2YXRlIHJlYWRvbmx5IGVmZmVjdGl2ZVByaXY6IGJpZ2ludDsgLy8gzrtfaSDCtyBwcml2X2kgKHBhcml0eS1hZGp1c3RlZCwgZGVyaXZhdGlvbi1hZGp1c3RlZClcbiAgcHJpdmF0ZSByZWFkb25seSBwdWJLZXlYOiBCdWZmZXI7IC8vIDMyLWJ5dGUgeC1vbmx5IGZpbmFsIHB1YmxpYyBrZXkgKGZvciBjaGFsbGVuZ2UgaGFzaClcblxuICAvLyBTZXQgaW4gaW5pdCgpXG4gIHByaXZhdGUga2kgPSBCaWdJbnQoMCk7IC8vIGVwaGVtZXJhbCBub25jZSBzY2FsYXJcbiAgcHJpdmF0ZSBSaTogUmV0dXJuVHlwZTx0eXBlb2Ygbm9ibGVTZWNwLlByb2plY3RpdmVQb2ludC5mcm9tSGV4PiB8IHVuZGVmaW5lZDtcblxuICAvLyBTZXQgaW4gcm91bmQtMSBoYW5kbGVyXG4gIHByaXZhdGUgUl9jb21iaW5lZDogUmV0dXJuVHlwZTx0eXBlb2Ygbm9ibGVTZWNwLlByb2plY3RpdmVQb2ludC5mcm9tSGV4PiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzaSA9IEJpZ0ludCgwKTsgLy8gcGFydGlhbCBzaWduYXR1cmUgc2NhbGFyXG5cbiAgLyoqXG4gICAqIEBwYXJhbSBrZXlTaGFyZSAgICAgICAgICAgIENCT1ItZW5jb2RlZCBES0xTIGtleXNoYXJlIChmdWxsIG9yIHJlZHVjZWQgZm9ybWF0KS5cbiAgICogQHBhcmFtIHBhcnR5SWR4ICAgICAgICAgICAgVGhpcyBwYXJ0eSdzIGluZGV4IGluIHRoZSBES0cgKDAtYmFzZWQsIG11c3QgYmUgaW4gYHNpZ25pbmdQYXJ0eUluZGljZXNgKS5cbiAgICogQHBhcmFtIHNpZ25pbmdQYXJ0eUluZGljZXMgSW5kaWNlcyBvZiBBTEwgcGFydGllcyBwYXJ0aWNpcGF0aW5nIGluIHRoaXMgc2lnbmluZyBzZXNzaW9uLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGNvbnRhaW4gYHBhcnR5SWR4YC4gIFRoZSBMYWdyYW5nZSBjb2VmZmljaWVudHMgYXJlIGNvbXB1dGVkXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIHN1YnNldC5cbiAgICogQHBhcmFtIGRlcml2YXRpb25QYXRoICAgICAgQklQLTMyIG5vbi1oYXJkZW5lZCBwYXRoIChlLmcuIGAnbS8wJ2ApLiAgRGVmYXVsdHMgdG8gcm9vdCBgJ20nYC5cbiAgICogQHBhcmFtIG1lc3NhZ2VIYXNoICAgICAgICAgMzItYnl0ZSBtZXNzYWdlIGhhc2ggdG8gc2lnbi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGtleVNoYXJlOiBCdWZmZXIsXG4gICAgcGFydHlJZHg6IG51bWJlcixcbiAgICBzaWduaW5nUGFydHlJbmRpY2VzOiBudW1iZXJbXSxcbiAgICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIG1lc3NhZ2VIYXNoOiBCdWZmZXJcbiAgKSB7XG4gICAgaWYgKG1lc3NhZ2VIYXNoLmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbWVzc2FnZUhhc2ggbXVzdCBiZSAzMiBieXRlcywgZ290ICR7bWVzc2FnZUhhc2gubGVuZ3RofWApO1xuICAgIH1cbiAgICBpZiAoIXNpZ25pbmdQYXJ0eUluZGljZXMuaW5jbHVkZXMocGFydHlJZHgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHBhcnR5SWR4ICR7cGFydHlJZHh9IG11c3QgYmUgaW5jbHVkZWQgaW4gc2lnbmluZ1BhcnR5SW5kaWNlc2ApO1xuICAgIH1cbiAgICBpZiAoc2lnbmluZ1BhcnR5SW5kaWNlcy5sZW5ndGggPCAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25pbmdQYXJ0eUluZGljZXMgbXVzdCBjb250YWluIGF0IGxlYXN0IDIgcGFydGllcycpO1xuICAgIH1cblxuICAgIHRoaXMucGFydHlJZHggPSBwYXJ0eUlkeDtcbiAgICB0aGlzLnNpZ25pbmdQYXJ0eUluZGljZXMgPSBzaWduaW5nUGFydHlJbmRpY2VzO1xuICAgIHRoaXMubWVzc2FnZUhhc2ggPSBtZXNzYWdlSGFzaDtcbiAgICB0aGlzLmRlcml2YXRpb25QYXRoID0gZGVyaXZhdGlvblBhdGg7XG5cbiAgICBjb25zdCBrcyA9IGRlY29kZShrZXlTaGFyZSk7XG5cbiAgICAvLyBTdXBwb3J0IGJvdGggZnVsbCBrZXlzaGFyZSAoc19pIC8geF9pX2xpc3QgLyBwdWJsaWNfa2V5IC8gcm9vdF9jaGFpbl9jb2RlKVxuICAgIC8vIGFuZCByZWR1Y2VkIGtleXNoYXJlIChwcnYgLyB4TGlzdCAvIHB1YikgYXMgcHJvZHVjZWQgYnkgRGtnLmdldFJlZHVjZWRLZXlTaGFyZSgpLlxuICAgIGNvbnN0IHByaXZCeXRlczogbnVtYmVyW10gPSBrcy5zX2kgPz8ga3MucHJ2O1xuICAgIGNvbnN0IHB1YkJ5dGVzOiBudW1iZXJbXSA9IGtzLnB1YmxpY19rZXkgPz8ga3MucHViO1xuICAgIGNvbnN0IGNjQnl0ZXM6IG51bWJlcltdID0ga3Mucm9vdF9jaGFpbl9jb2RlID8/IGtzLnJvb3RDaGFpbkNvZGU7XG4gICAgY29uc3QgeExpc3Q6IG51bWJlcltdW10gPSBrcy54X2lfbGlzdCA/PyBrcy54TGlzdDtcblxuICAgIGNvbnN0IHNpID0gYmlnRnJvbUJ1ZihCdWZmZXIuZnJvbShwcml2Qnl0ZXMpKTtcbiAgICBjb25zdCByb290UHViID0gQnVmZmVyLmZyb20ocHViQnl0ZXMpOyAvLyAzMy1ieXRlIGNvbXByZXNzZWRcbiAgICBjb25zdCByb290Q0MgPSBCdWZmZXIuZnJvbShjY0J5dGVzKTsgLy8gMzItYnl0ZSBjaGFpbmNvZGVcblxuICAgIC8vIOKUgOKUgCBCSVAtMzIgZGVyaXZhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBjb25zdCBwYXRoID0gcGFyc2VQYXRoKGRlcml2YXRpb25QYXRoKTtcbiAgICBsZXQgZmluYWxQdWJLZXkgPSByb290UHViO1xuICAgIGxldCB0b3RhbElMID0gQmlnSW50KDApO1xuXG4gICAgaWYgKHBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZGVyaXZlZCA9IGRlcml2ZVBhdGgocm9vdFB1Yiwgcm9vdENDLCBwYXRoKTtcbiAgICAgIHRvdGFsSUwgPSBkZXJpdmVkLnRvdGFsSUw7XG4gICAgICBmaW5hbFB1YktleSA9IGRlcml2ZWQuZmluYWxQdWJLZXk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIExhZ3JhbmdlIGNvZWZmaWNpZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGNvbnN0IGxpID0gY29tcHV0ZUxhZ3JhbmdlQ29lZmYoeExpc3QsIHBhcnR5SWR4LCBzaWduaW5nUGFydHlJbmRpY2VzKTtcblxuICAgIC8vIOKUgOKUgCBCSVAtMzQwIHB1YmxpYyBrZXkgcGFyaXR5IGFkanVzdG1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgLy8gQklQLTM0MCB1c2VzIHRoZSB4LW9ubHkgcHVibGljIGtleTsgdGhlIFwiY2Fub25pY2FsXCIga2V5IGhhcyBldmVuIHkuXG4gICAgLy8gSWYgdGhlIGZpbmFsIGRlcml2ZWQgcHVibGljIGtleSBoYXMgb2RkIHksIG5lZ2F0ZSB0aGUgcHJpdmF0ZSBrZXkuXG4gICAgY29uc3QgcFlJc09kZCA9IGZpbmFsUHViS2V5WzBdID09PSAweDAzO1xuICAgIHRoaXMucHViS2V5WCA9IGZpbmFsUHViS2V5LnNsaWNlKDEpOyAvLyAzMi1ieXRlIHgtb25seVxuXG4gICAgLy8g4pSA4pSAIEVmZmVjdGl2ZSBwcml2YXRlIHNoYXJlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIC8vIEJhc2Ugc2hhcmUgY29udHJpYnV0aW9uOiDOu19pIMK3IHNfaVxuICAgIGxldCBlZmYgPSBzY2FsYXJNb2QobGkgKiBzaSk7XG5cbiAgICAvLyBCSVAtMzIgSUwgYWRqdXN0bWVudDogdGhlIHBhcnR5IHdpdGggdGhlIHNtYWxsZXN0IGluZGV4IGluIHRoZSBzaWduaW5nXG4gICAgLy8gc2V0IGFic29yYnMgdGhlIGVudGlyZSB0b3RhbElMIHNvIHRoYXQgTGFncmFuZ2UgaW50ZXJwb2xhdGlvbiBvdmVyIHRoZVxuICAgIC8vIGFkanVzdGVkIHNoYXJlcyByZWNvbnN0cnVjdHMgdGhlIGNvcnJlY3QgY2hpbGQgcHJpdmF0ZSBrZXkuXG4gICAgLy9cbiAgICAvLyAgIHN1bV97a+KIiFN9IM67X2sgwrcgc19rX2FkaiA9IGRfcm9vdCArIHRvdGFsSUwgICg9IGRfY2hpbGQpXG4gICAgLy9cbiAgICAvLyB3aGVyZSBzX21pbl9hZGogPSBzX21pbiArIHRvdGFsSUwgwrcgzrtfbWluXnstMX0sICBzX2tfYWRqID0gc19rICAoa+KJoG1pbikuXG4gICAgLy9cbiAgICAvLyBGcm9tIHRoaXMgcGFydHkncyBwZXJzcGVjdGl2ZSwgdGhlIGVmZmVjdGl2ZSBjb250cmlidXRpb24gaXM6XG4gICAgLy8gICBpZiB0aGlzIGlzIHRoZSBtaW4gcGFydHk6IM67X21pbiDCtyBzX21pbl9hZGogPSDOu19taW7Ct3NfbWluICsgdG90YWxJTFxuICAgIC8vICAgb3RoZXJ3aXNlOiAgICAgICAgICAgICAgICDOu19rIMK3IHNfayAgICAgICAgICh1bmNoYW5nZWQpXG4gICAgY29uc3QgaXNNaW5QYXJ0eSA9IHBhcnR5SWR4ID09PSBNYXRoLm1pbiguLi5zaWduaW5nUGFydHlJbmRpY2VzKTtcbiAgICBpZiAoaXNNaW5QYXJ0eSAmJiB0b3RhbElMICE9PSBCaWdJbnQoMCkpIHtcbiAgICAgIGVmZiA9IHNjYWxhck1vZChlZmYgKyB0b3RhbElMKTtcbiAgICB9XG5cbiAgICAvLyBJZiBQLnkgaXMgb2RkLCBuZWdhdGUgdGhlIGVmZmVjdGl2ZSBjb250cmlidXRpb24uXG4gICAgaWYgKHBZSXNPZGQpIHtcbiAgICAgIGVmZiA9IHNjYWxhck1vZChOIC0gZWZmKTtcbiAgICB9XG5cbiAgICB0aGlzLmVmZmVjdGl2ZVByaXYgPSBlZmY7XG4gIH1cblxuICAvKiogVGhlIGNvbWJpbmVkIDY0LWJ5dGUgQklQLTM0MCBTY2hub3JyIHNpZ25hdHVyZSBgKFIueF8zMiDigJYgc18zMilgLiBBdmFpbGFibGUgYWZ0ZXIgYENvbXBsZXRlYC4gKi9cbiAgZ2V0IHNpZ25hdHVyZSgpOiBTY2hub3JyRGtsc1NpZ25hdHVyZSB7XG4gICAgaWYgKCF0aGlzLl9zaWduYXR1cmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2lnbmF0dXJlIG5vdCBwcm9kdWNlZCB5ZXQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zaWduYXR1cmU7XG4gIH1cblxuICBnZXQgZHNnU3RhdGUoKTogU2Nobm9yckRzZ1N0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3VuZCAxOiBnZW5lcmF0ZSBhIGZyZXNoIGVwaGVtZXJhbCBub25jZSBhbmQgYnJvYWRjYXN0IHRoZSBub25jZSBwb2ludCBSX2kuXG4gICAqIEByZXR1cm5zIEJyb2FkY2FzdCBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIDMzLWJ5dGUgY29tcHJlc3NlZCBub25jZSBwb2ludC5cbiAgICovXG4gIGFzeW5jIGluaXQoKTogUHJvbWlzZTxEZXNlcmlhbGl6ZWRCcm9hZGNhc3RNZXNzYWdlPiB7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09IFNjaG5vcnJEc2dTdGF0ZS5VbmluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NjaG5vcnJEc2cgc2Vzc2lvbiBhbHJlYWR5IGluaXRpYWxpemVkLicpO1xuICAgIH1cblxuICAgIC8vIFNhbXBsZSBhIHJhbmRvbSBub25jZSBzY2FsYXIga19pIGluIFsxLCBOKS5cbiAgICBsZXQga2lCdWY6IEJ1ZmZlcjtcbiAgICBkbyB7XG4gICAgICBraUJ1ZiA9IEJ1ZmZlci5mcm9tKHJhbmRvbUJ5dGVzKDMyKSk7XG4gICAgICB0aGlzLmtpID0gYmlnRnJvbUJ1ZihraUJ1Zik7XG4gICAgfSB3aGlsZSAodGhpcy5raSA9PT0gQmlnSW50KDApIHx8IHRoaXMua2kgPj0gTik7XG5cbiAgICB0aGlzLlJpID0gRy5tdWx0aXBseSh0aGlzLmtpKTtcbiAgICB0aGlzLnN0YXRlID0gU2Nobm9yckRzZ1N0YXRlLlJvdW5kMTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXlsb2FkOiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh0aGlzLlJpLnRvUmF3Qnl0ZXModHJ1ZSkpKSwgLy8gMzMgYnl0ZXMgY29tcHJlc3NlZFxuICAgICAgZnJvbTogdGhpcy5wYXJ0eUlkeCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgaW5jb21pbmcgbWVzc2FnZXMgZm9yIHRoZSBjdXJyZW50IHJvdW5kOlxuICAgKlxuICAgKiAtIFJvdW5kIDEg4oaSIHJlY2VpdmVzIG5vbmNlIHBvaW50IGBSX2pgIOKGkiByZXR1cm5zIHBhcnRpYWwgc2NhbGFyIGBzX2lgLlxuICAgKiAtIFJvdW5kIDIg4oaSIHJlY2VpdmVzIHBhcnRpYWwgc2NhbGFyIGBzX2pgIOKGkiBwcm9kdWNlcyBmaW5hbCBzaWduYXR1cmUuXG4gICAqL1xuICBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2VzOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyk6IERlc2VyaWFsaXplZE1lc3NhZ2VzIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gU2Nobm9yckRzZ1N0YXRlLlJvdW5kMSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZVJvdW5kMShtZXNzYWdlcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXRlID09PSBTY2hub3JyRHNnU3RhdGUuUm91bmQyKSB7XG4gICAgICByZXR1cm4gdGhpcy5faGFuZGxlUm91bmQyKG1lc3NhZ2VzKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzIGNhbGxlZCBpbiB1bmV4cGVjdGVkIHN0YXRlOiAke1NjaG5vcnJEc2dTdGF0ZVt0aGlzLnN0YXRlXX1gKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQcml2YXRlIHJvdW5kIGhhbmRsZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSb3VuZCAxOiByZWNlaXZlIFJfaiwgY29tcHV0ZSBjb21iaW5lZCBSLCBhcHBseSBCSVAtMzQwIHBhcml0eSwgY29tcHV0ZSBzX2kuXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVSb3VuZDEobWVzc2FnZXM6IERlc2VyaWFsaXplZE1lc3NhZ2VzKTogRGVzZXJpYWxpemVkTWVzc2FnZXMge1xuICAgIGlmIChtZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUm91bmQgMTogZXhwZWN0ZWQgMSBicm9hZGNhc3QgbWVzc2FnZSAoUl9qKSwgZ290ICR7bWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMubGVuZ3RofWApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuUmkpIHRocm93IG5ldyBFcnJvcignTm9uY2UgcG9pbnQgbm90IHNldCDigJQgY2FsbCBpbml0KCkgZmlyc3QuJyk7XG5cbiAgICBjb25zdCBSaiA9IG5vYmxlU2VjcC5Qcm9qZWN0aXZlUG9pbnQuZnJvbUhleChCdWZmZXIuZnJvbShtZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlc1swXS5wYXlsb2FkKS50b1N0cmluZygnaGV4JykpO1xuXG4gICAgLy8gQ29tYmluZTogUiA9IFJfaSArIFJfalxuICAgIGNvbnN0IFJfcmF3ID0gdGhpcy5SaS5hZGQoUmopO1xuXG4gICAgLy8gQklQLTM0MDogUi55IG11c3QgYmUgZXZlbi4gSWYgb2RkLCBuZWdhdGUga19pICAoYm90aCBwYXJ0aWVzIHdpbGwgYWdyZWUgb25cbiAgICAvLyB0aGUgc2lnbiBzaW5jZSB0aGV5IGJvdGggc2VlIHRoZSBzYW1lIFIgPSBSX2kgKyBSX2opLlxuICAgIGNvbnN0IFJfeUlzT2RkID0gUl9yYXcueSAlIEJpZ0ludCgyKSA9PT0gQmlnSW50KDEpO1xuICAgIGlmIChSX3lJc09kZCkge1xuICAgICAgdGhpcy5raSA9IHNjYWxhck1vZChOIC0gdGhpcy5raSk7XG4gICAgfVxuICAgIC8vIFN0b3JlIHRoZSBwYXJpdHktbm9ybWFsaXNlZCBSIChldmVuIHkpLlxuICAgIHRoaXMuUl9jb21iaW5lZCA9IFJfeUlzT2RkID8gUl9yYXcubmVnYXRlKCkgOiBSX3JhdztcblxuICAgIC8vIEJJUC0zNDAgY2hhbGxlbmdlOiBlID0gSF90YWcoXCJCSVAwMzQwL2NoYWxsZW5nZVwiLCBSLnhfMzIg4oCWIFAueF8zMiDigJYgbXNnKVxuICAgIGNvbnN0IFJ4ID0gYnVmMzIodGhpcy5SX2NvbWJpbmVkLngpO1xuICAgIGNvbnN0IGUgPSBiaWdGcm9tQnVmKHRhZ2dlZEhhc2goJ0JJUDAzNDAvY2hhbGxlbmdlJywgUngsIHRoaXMucHViS2V5WCwgdGhpcy5tZXNzYWdlSGFzaCkpO1xuXG4gICAgLy8gUGFydGlhbCBzaWduYXR1cmU6IHNfaSA9IGtfaSArIGUgwrcgZWZmZWN0aXZlUHJpdl9pICAobW9kIE4pXG4gICAgdGhpcy5zaSA9IHNjYWxhck1vZCh0aGlzLmtpICsgc2NhbGFyTW9kKGUgKiB0aGlzLmVmZmVjdGl2ZVByaXYpKTtcbiAgICB0aGlzLnN0YXRlID0gU2Nobm9yckRzZ1N0YXRlLlJvdW5kMjtcblxuICAgIHJldHVybiB7XG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW1xuICAgICAgICB7XG4gICAgICAgICAgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkoYnVmMzIodGhpcy5zaSkpLCAvLyAzMiBieXRlc1xuICAgICAgICAgIGZyb206IHRoaXMucGFydHlJZHgsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUm91bmQgMiAoY29tYmluZSk6IHJlY2VpdmUgc19qLCBwcm9kdWNlIHRoZSBmaW5hbCBCSVAtMzQwIFNjaG5vcnIgc2lnbmF0dXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlUm91bmQyKG1lc3NhZ2VzOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyk6IERlc2VyaWFsaXplZE1lc3NhZ2VzIHtcbiAgICBpZiAobWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJvdW5kIDI6IGV4cGVjdGVkIDEgYnJvYWRjYXN0IG1lc3NhZ2UgKHNfaiksIGdvdCAke21lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLlJfY29tYmluZWQpIHRocm93IG5ldyBFcnJvcignUl9jb21iaW5lZCBub3Qgc2V0IOKAlCBoYW5kbGVSb3VuZDEgbXVzdCBydW4gZmlyc3QuJyk7XG5cbiAgICBjb25zdCBzaiA9IGJpZ0Zyb21CdWYoQnVmZmVyLmZyb20obWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXNbMF0ucGF5bG9hZCkpO1xuICAgIGNvbnN0IHMgPSBzY2FsYXJNb2QodGhpcy5zaSArIHNqKTtcblxuICAgIHRoaXMuX3NpZ25hdHVyZSA9IHtcbiAgICAgIFI6IG5ldyBVaW50OEFycmF5KGJ1ZjMyKHRoaXMuUl9jb21iaW5lZC54KSksXG4gICAgICBTOiBuZXcgVWludDhBcnJheShidWYzMihzKSksXG4gICAgfTtcbiAgICB0aGlzLnN0YXRlID0gU2Nobm9yckRzZ1N0YXRlLkNvbXBsZXRlO1xuXG4gICAgcmV0dXJuIHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLCBwMnBNZXNzYWdlczogW10gfTtcbiAgfVxufVxuIl19
@@ -1,4 +0,0 @@
1
- export * as SchnorrDsg from './dsg';
2
- export { SchnorrDsgState } from './dsg';
3
- export type { SchnorrDklsSignature } from './dsg';
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tss/schnorr-dkls/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AACxC,YAAY,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC"}
@@ -1,40 +0,0 @@
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.SchnorrDsgState = exports.SchnorrDsg = void 0;
37
- exports.SchnorrDsg = __importStar(require("./dsg"));
38
- var dsg_1 = require("./dsg");
39
- Object.defineProperty(exports, "SchnorrDsgState", { enumerable: true, get: function () { return dsg_1.SchnorrDsgState; } });
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL3NjaG5vcnItZGtscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBb0M7QUFDcEMsNkJBQXdDO0FBQS9CLHNHQUFBLGVBQWUsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGFzIFNjaG5vcnJEc2cgZnJvbSAnLi9kc2cnO1xuZXhwb3J0IHsgU2Nobm9yckRzZ1N0YXRlIH0gZnJvbSAnLi9kc2cnO1xuZXhwb3J0IHR5cGUgeyBTY2hub3JyRGtsc1NpZ25hdHVyZSB9IGZyb20gJy4vZHNnJztcbiJdfQ==