@bitgo-beta/sdk-lib-mpc 8.2.0-beta.209 → 8.2.0-beta.2090
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 +29 -0
- package/dist/src/tss/dkls-vrf/util.d.ts.map +1 -0
- package/dist/src/tss/dkls-vrf/util.js +113 -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 +334 -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 +128 -0
- package/dist/src/tss/ecdsa-dkls/types.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/types.js +175 -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 +303 -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 +9 -0
- package/dist/src/tss/eddsa-mps-vrf/util.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps-vrf/util.js +36 -0
- package/dist/src/tss/index.d.ts +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 +108 -0
- package/dist/src/tss/redpallas-mps/dsg.d.ts.map +1 -0
- package/dist/src/tss/redpallas-mps/dsg.js +355 -0
- package/dist/src/tss/redpallas-mps/index.d.ts +7 -0
- package/dist/src/tss/redpallas-mps/index.d.ts.map +1 -0
- package/dist/src/tss/redpallas-mps/index.js +42 -0
- package/dist/src/tss/redpallas-mps/types.d.ts +85 -0
- package/dist/src/tss/redpallas-mps/types.d.ts.map +1 -0
- package/dist/src/tss/redpallas-mps/types.js +112 -0
- package/dist/src/tss/redpallas-mps/util.d.ts +43 -0
- package/dist/src/tss/redpallas-mps/util.d.ts.map +1 -0
- package/dist/src/tss/redpallas-mps/util.js +147 -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 -340
- 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,278 @@
|
|
|
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.VrfDkg = void 0;
|
|
37
|
+
const cbor_x_1 = require("cbor-x");
|
|
38
|
+
const buffer_1 = require("buffer");
|
|
39
|
+
const types_1 = require("./types");
|
|
40
|
+
/**
|
|
41
|
+
* Round driver for the DKLS VRF DKG, which produces a Ristretto VRF keyshare.
|
|
42
|
+
*
|
|
43
|
+
* Two rounds, all broadcast: round 1 exchanges commitments (VrfKeygenMsg1), round 2
|
|
44
|
+
* exchanges openings (VrfKeygenMsg2, emitted per recipient) and the DKG finalizes
|
|
45
|
+
* locally. There is no chain-code commitment step, unlike the signing DKG.
|
|
46
|
+
*
|
|
47
|
+
* Callers pass every message they hold; this class routes them internally. Round 1
|
|
48
|
+
* must exclude the party's own commitment (the wasm rejects a sender set containing
|
|
49
|
+
* it) and round 2 consumes the openings addressed to this party, own included.
|
|
50
|
+
*
|
|
51
|
+
* Party indices follow the MPCv2 convention: 0 = user, 1 = backup, 2 = bitgo.
|
|
52
|
+
*/
|
|
53
|
+
class VrfDkg {
|
|
54
|
+
constructor(n, t, partyIdx, seed, vrfWasm) {
|
|
55
|
+
this.vrfState = types_1.VrfDkgState.Uninitialized;
|
|
56
|
+
this.n = n;
|
|
57
|
+
this.t = t;
|
|
58
|
+
this.partyIdx = partyIdx;
|
|
59
|
+
this.seed = seed;
|
|
60
|
+
this.vrfWasm = vrfWasm ?? null;
|
|
61
|
+
}
|
|
62
|
+
async loadVrfWasm() {
|
|
63
|
+
if (!this.vrfWasm) {
|
|
64
|
+
this.vrfWasm = await Promise.resolve().then(() => __importStar(require('@silencelaboratories/dkls-wasm-ll-vrf-node')));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
getVrfWasm() {
|
|
68
|
+
if (!this.vrfWasm) {
|
|
69
|
+
throw Error('VRF wasm not loaded');
|
|
70
|
+
}
|
|
71
|
+
return this.vrfWasm;
|
|
72
|
+
}
|
|
73
|
+
_restoreSession() {
|
|
74
|
+
if (!this.vrfSession) {
|
|
75
|
+
this.vrfSession = this.getVrfWasm().VrfKeygenSession.fromBytes(this.vrfSessionBytes);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Re-derive the round state from the wasm session bytes instead of trusting a
|
|
80
|
+
* caller-supplied enum. The wasm embeds a round tag for exactly this reason; this
|
|
81
|
+
* is what lets a stateless server resume mid-protocol.
|
|
82
|
+
*/
|
|
83
|
+
_deserializeState() {
|
|
84
|
+
if (!this.vrfSession) {
|
|
85
|
+
throw Error('Session not initialized');
|
|
86
|
+
}
|
|
87
|
+
const round = (0, cbor_x_1.decode)(this.vrfSession.toBytes()).round;
|
|
88
|
+
if (round === 'Init') {
|
|
89
|
+
this.vrfState = types_1.VrfDkgState.Uninitialized;
|
|
90
|
+
}
|
|
91
|
+
else if (round === 'WaitMsg1') {
|
|
92
|
+
this.vrfState = types_1.VrfDkgState.Round1;
|
|
93
|
+
}
|
|
94
|
+
else if (round === 'WaitMsg2') {
|
|
95
|
+
this.vrfState = types_1.VrfDkgState.Round2;
|
|
96
|
+
}
|
|
97
|
+
else if (typeof round === 'object' && round !== null && 'Share' in round) {
|
|
98
|
+
this.vrfState = types_1.VrfDkgState.Complete;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
this.vrfState = types_1.VrfDkgState.InvalidState;
|
|
102
|
+
throw Error(`Invalid State: ${JSON.stringify(round)}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Create this party's VRF DKG commitment (VrfKeygenMsg1, broadcast).
|
|
107
|
+
*/
|
|
108
|
+
async initDkg() {
|
|
109
|
+
if (!this.vrfWasm) {
|
|
110
|
+
await this.loadVrfWasm();
|
|
111
|
+
}
|
|
112
|
+
if (this.t > this.n || this.partyIdx >= this.n) {
|
|
113
|
+
throw Error('Invalid parameters for VRF DKG');
|
|
114
|
+
}
|
|
115
|
+
if (this.vrfState != types_1.VrfDkgState.Uninitialized) {
|
|
116
|
+
throw Error('VRF DKG session already initialized');
|
|
117
|
+
}
|
|
118
|
+
if (typeof window !== 'undefined' &&
|
|
119
|
+
/* checks for electron processes */
|
|
120
|
+
!window.process &&
|
|
121
|
+
!window.process?.['type']) {
|
|
122
|
+
/* This is only needed for browsers/web because it uses fetch to resolve the wasm asset for the web */
|
|
123
|
+
const initVrf = await Promise.resolve().then(() => __importStar(require('@silencelaboratories/dkls-wasm-ll-vrf-web')));
|
|
124
|
+
await initVrf.default();
|
|
125
|
+
}
|
|
126
|
+
if (this.seed && this.seed.length !== 32) {
|
|
127
|
+
throw Error(`Seed should be 32 bytes, got ${this.seed.length}.`);
|
|
128
|
+
}
|
|
129
|
+
const { VrfKeygenSession } = this.getVrfWasm();
|
|
130
|
+
this.vrfSession = this.seed
|
|
131
|
+
? new VrfKeygenSession(this.n, this.t, this.partyIdx, new Uint8Array(this.seed))
|
|
132
|
+
: new VrfKeygenSession(this.n, this.t, this.partyIdx);
|
|
133
|
+
try {
|
|
134
|
+
const message = this.vrfSession.createFirstMessage();
|
|
135
|
+
// Copy the payload out before freeing the wasm message object.
|
|
136
|
+
const payload = new Uint8Array(message.payload);
|
|
137
|
+
message.free();
|
|
138
|
+
this.vrfSessionBytes = this.vrfSession.toBytes();
|
|
139
|
+
this._deserializeState();
|
|
140
|
+
return { broadcastMessages: [{ payload, from: this.partyIdx }], p2pMessages: [] };
|
|
141
|
+
}
|
|
142
|
+
catch (e) {
|
|
143
|
+
throw Error(`Error while creating the first VRF message from party ${this.partyIdx}: ${e}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Process the messages this party holds for the current round and return this
|
|
148
|
+
* party's messages for the next round. Callers pass everything they hold; the
|
|
149
|
+
* round routing happens here:
|
|
150
|
+
*
|
|
151
|
+
* - Round 1 (WaitMsg1): consumes the other parties' commitments (own excluded —
|
|
152
|
+
* the wasm rejects a sender set containing the party's own Msg1) and emits this
|
|
153
|
+
* party's openings (VrfKeygenMsg2), one broadcast message per recipient.
|
|
154
|
+
* - Round 2 (WaitMsg2): consumes the openings addressed to this party (own
|
|
155
|
+
* self-addressed opening included) and finalizes the DKG, returning no messages.
|
|
156
|
+
*/
|
|
157
|
+
async handleIncomingMessages(messagesForIthRound) {
|
|
158
|
+
this._restoreSession();
|
|
159
|
+
if (!this.vrfSession) {
|
|
160
|
+
throw Error('Session not initialized');
|
|
161
|
+
}
|
|
162
|
+
const { Message: VrfMessage } = this.getVrfWasm();
|
|
163
|
+
let nextRoundMessages = [];
|
|
164
|
+
const nextRoundDeserializedMessages = { broadcastMessages: [], p2pMessages: [] };
|
|
165
|
+
try {
|
|
166
|
+
switch (this.vrfState) {
|
|
167
|
+
case types_1.VrfDkgState.Round1: {
|
|
168
|
+
const othersCommitments = messagesForIthRound.broadcastMessages.filter((m) => m.from !== this.partyIdx);
|
|
169
|
+
nextRoundMessages = this.vrfSession.handleMessages(othersCommitments.map((m) => new VrfMessage(m.payload, m.from)));
|
|
170
|
+
this._deserializeState();
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
case types_1.VrfDkgState.Round2: {
|
|
174
|
+
const openingsForMe = messagesForIthRound.p2pMessages.filter((m) => m.to === this.partyIdx);
|
|
175
|
+
nextRoundMessages = this.vrfSession.handleMessages(openingsForMe.map((m) => new VrfMessage(m.payload, m.from, m.to)));
|
|
176
|
+
// vrfKeyshare() consumes (and deallocates) the session in all cases.
|
|
177
|
+
const vrfKeyShare = this.vrfSession.vrfKeyshare();
|
|
178
|
+
this.vrfKeyShare = vrfKeyShare;
|
|
179
|
+
this.keyShareBuff = buffer_1.Buffer.from(vrfKeyShare.toBytes());
|
|
180
|
+
this.publicKey = buffer_1.Buffer.from(vrfKeyShare.publicKey);
|
|
181
|
+
this.keyId = buffer_1.Buffer.from(vrfKeyShare.keyId);
|
|
182
|
+
this.rootChainCode = buffer_1.Buffer.from(vrfKeyShare.rootChainCode);
|
|
183
|
+
vrfKeyShare.free();
|
|
184
|
+
this.vrfState = types_1.VrfDkgState.Complete;
|
|
185
|
+
return nextRoundDeserializedMessages;
|
|
186
|
+
}
|
|
187
|
+
default:
|
|
188
|
+
throw Error(`Invalid VRF DKG state: ${this.vrfState}`);
|
|
189
|
+
}
|
|
190
|
+
nextRoundDeserializedMessages.broadcastMessages = nextRoundMessages
|
|
191
|
+
.filter((m) => m.to_id === undefined)
|
|
192
|
+
.map((m) => ({ payload: new Uint8Array(m.payload), from: m.from_id }));
|
|
193
|
+
nextRoundDeserializedMessages.p2pMessages = nextRoundMessages
|
|
194
|
+
.filter((m) => m.to_id !== undefined)
|
|
195
|
+
.map((m) => ({ payload: new Uint8Array(m.payload), from: m.from_id, to: m.to_id }));
|
|
196
|
+
return nextRoundDeserializedMessages;
|
|
197
|
+
}
|
|
198
|
+
catch (e) {
|
|
199
|
+
throw Error(`Error while creating VRF messages from party ${this.partyIdx}, state ${this.vrfState}: ${e}`);
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
nextRoundMessages.forEach((m) => m.free());
|
|
203
|
+
if (this.vrfState !== types_1.VrfDkgState.Complete) {
|
|
204
|
+
this.vrfSessionBytes = this.vrfSession.toBytes();
|
|
205
|
+
this.vrfSession = undefined;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get the VRF keyshare bytes (CBOR VrfKeyshare) once the DKG is complete.
|
|
211
|
+
* This buffer is private key material.
|
|
212
|
+
*/
|
|
213
|
+
getKeyShare() {
|
|
214
|
+
if (!this.keyShareBuff) {
|
|
215
|
+
throw Error('Can not get key share, VRF DKG is not complete yet.');
|
|
216
|
+
}
|
|
217
|
+
return this.keyShareBuff;
|
|
218
|
+
}
|
|
219
|
+
/** 32-byte compressed Ristretto VRF public key, available once the DKG is complete. */
|
|
220
|
+
getPublicKey() {
|
|
221
|
+
if (!this.publicKey) {
|
|
222
|
+
throw Error('Can not get public key, VRF DKG is not complete yet.');
|
|
223
|
+
}
|
|
224
|
+
return this.publicKey;
|
|
225
|
+
}
|
|
226
|
+
/** 32-byte VRF key identifier, available once the DKG is complete. */
|
|
227
|
+
getKeyId() {
|
|
228
|
+
if (!this.keyId) {
|
|
229
|
+
throw Error('Can not get key id, VRF DKG is not complete yet.');
|
|
230
|
+
}
|
|
231
|
+
return this.keyId;
|
|
232
|
+
}
|
|
233
|
+
/** 32-byte VRF root chain code, available once the DKG is complete. */
|
|
234
|
+
getRootChainCode() {
|
|
235
|
+
if (!this.rootChainCode) {
|
|
236
|
+
throw Error('Can not get root chain code, VRF DKG is not complete yet.');
|
|
237
|
+
}
|
|
238
|
+
return this.rootChainCode;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Get the current session data that can be used to restore the session later.
|
|
242
|
+
*
|
|
243
|
+
* The returned session bytes are secret key material — they carry this party's
|
|
244
|
+
* secret polynomial share. They must never be logged or persisted in the clear;
|
|
245
|
+
* the caller encrypts them exactly like the key share itself.
|
|
246
|
+
*/
|
|
247
|
+
getSessionData() {
|
|
248
|
+
const sessionData = {
|
|
249
|
+
vrfSessionBytes: this.vrfSessionBytes,
|
|
250
|
+
vrfState: this.vrfState,
|
|
251
|
+
};
|
|
252
|
+
if (this.keyShareBuff) {
|
|
253
|
+
sessionData.keyShareBuff = this.keyShareBuff;
|
|
254
|
+
}
|
|
255
|
+
return sessionData;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Restore a VRF DKG session from previous session data.
|
|
259
|
+
* Note: This should not be used for Round 1 as that's the initialization phase.
|
|
260
|
+
* The round state is re-derived from the wasm session bytes, not trusted from the
|
|
261
|
+
* caller-supplied enum, so a tampered `vrfState` cannot steer the protocol.
|
|
262
|
+
*/
|
|
263
|
+
static async restoreSession(n, t, partyIdx, sessionData, seed, vrfWasm) {
|
|
264
|
+
const vrfDkg = new VrfDkg(n, t, partyIdx, seed, vrfWasm);
|
|
265
|
+
if (!vrfDkg.vrfWasm) {
|
|
266
|
+
await vrfDkg.loadVrfWasm();
|
|
267
|
+
}
|
|
268
|
+
vrfDkg.vrfSessionBytes = sessionData.vrfSessionBytes;
|
|
269
|
+
vrfDkg._restoreSession();
|
|
270
|
+
vrfDkg._deserializeState();
|
|
271
|
+
if (sessionData.keyShareBuff) {
|
|
272
|
+
vrfDkg.keyShareBuff = sessionData.keyShareBuff;
|
|
273
|
+
}
|
|
274
|
+
return vrfDkg;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
exports.VrfDkg = VrfDkg;
|
|
278
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGtnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9ka2xzLXZyZi9ka2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTUEsbUNBQWdDO0FBQ2hDLG1DQUFnQztBQUVoQyxtQ0FBeUQ7QUFZekQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBYSxNQUFNO0lBZWpCLFlBQVksQ0FBUyxFQUFFLENBQVMsRUFBRSxRQUFnQixFQUFFLElBQWEsRUFBRSxPQUEwQjtRQUhuRixhQUFRLEdBQWdCLG1CQUFXLENBQUMsYUFBYSxDQUFDO1FBSTFELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxJQUFJLENBQUM7SUFDakMsQ0FBQztJQUVPLEtBQUssQ0FBQyxXQUFXO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyx3REFBYSw0Q0FBNEMsR0FBQyxDQUFDO1FBQzVFLENBQUM7SUFDSCxDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLGdC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QUFHLFdBQVcsQ0FBQyxlQUFlLENBQUM7UUFDckQsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzNCLElBQUksV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQztRQUNqRCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBL1BELHdCQStQQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgTWVzc2FnZSBhcyBWcmZXYXNtTWVzc2FnZSxcbiAgVnJmS2V5Z2VuU2Vzc2lvbixcbiAgVnJmS2V5c2hhcmUgYXMgRGtsc1ZyZktleXNoYXJlLFxufSBmcm9tICdAc2lsZW5jZWxhYm9yYXRvcmllcy9ka2xzLXdhc20tbGwtdnJmLW5vZGUnO1xuaW1wb3J0IHR5cGUgeyBWcmZLZXlnZW5TZXNzaW9uIGFzIFZyZldlYktleWdlblNlc3Npb24gfSBmcm9tICdAc2lsZW5jZWxhYm9yYXRvcmllcy9ka2xzLXdhc20tbGwtdnJmLXdlYic7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdjYm9yLXgnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IERlc2VyaWFsaXplZE1lc3NhZ2VzIH0gZnJvbSAnLi4vZWNkc2EtZGtscy90eXBlcyc7XG5pbXBvcnQgeyBWcmZEa2dTZXNzaW9uRGF0YSwgVnJmRGtnU3RhdGUgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gUGxhdGZvcm0tc3BlY2lmaWMgbW9kdWxlcyB0aGF0IGRvIG5vdCBleGlzdCBldmVyeXdoZXJlOiB0aGUgbm9kZS93ZWIvYnVuZGxlciB3YXNtXG4vLyB2YXJpYW50cyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIGFuZCBzZWxlY3RlZCBhdCBydW50aW1lIChub2RlIHByb2Nlc3MgdnMgYnJvd3NlciB2c1xuLy8gYnVuZGxlcikuIFN0YXRpYyBpbXBvcnRzIHdvdWxkIGxvYWQgdGhlIHdyb25nIHBsYXRmb3JtJ3Mgd2FzbSBiaW5kaW5nLCBzbyBib3RoIHRoZVxuLy8gdHlwZSBhbGlhc2VzIGJlbG93IGFuZCB0aGUgbGF6eSBgYXdhaXQgaW1wb3J0KClgIGNhbGxzIGFyZSBkZWxpYmVyYXRlLlxudHlwZSBOb2RlVnJmV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQHNpbGVuY2VsYWJvcmF0b3JpZXMvZGtscy13YXNtLWxsLXZyZi1ub2RlJyk7XG50eXBlIFdlYlZyZldhc21lciA9IHR5cGVvZiBpbXBvcnQoJ0BzaWxlbmNlbGFib3JhdG9yaWVzL2RrbHMtd2FzbS1sbC12cmYtd2ViJyk7XG50eXBlIEJ1bmRsZXJWcmZXYXNtZXIgPSB0eXBlb2YgaW1wb3J0KCdAc2lsZW5jZWxhYm9yYXRvcmllcy9ka2xzLXdhc20tbGwtdnJmLWJ1bmRsZXInKTtcblxudHlwZSBWcmZXYXNtID0gTm9kZVZyZldhc21lciB8IFdlYlZyZldhc21lciB8IEJ1bmRsZXJWcmZXYXNtZXI7XG5cbi8qKlxuICogUm91bmQgZHJpdmVyIGZvciB0aGUgREtMUyBWUkYgREtHLCB3aGljaCBwcm9kdWNlcyBhIFJpc3RyZXR0byBWUkYga2V5c2hhcmUuXG4gKlxuICogVHdvIHJvdW5kcywgYWxsIGJyb2FkY2FzdDogcm91bmQgMSBleGNoYW5nZXMgY29tbWl0bWVudHMgKFZyZktleWdlbk1zZzEpLCByb3VuZCAyXG4gKiBleGNoYW5nZXMgb3BlbmluZ3MgKFZyZktleWdlbk1zZzIsIGVtaXR0ZWQgcGVyIHJlY2lwaWVudCkgYW5kIHRoZSBES0cgZmluYWxpemVzXG4gKiBsb2NhbGx5LiBUaGVyZSBpcyBubyBjaGFpbi1jb2RlIGNvbW1pdG1lbnQgc3RlcCwgdW5saWtlIHRoZSBzaWduaW5nIERLRy5cbiAqXG4gKiBDYWxsZXJzIHBhc3MgZXZlcnkgbWVzc2FnZSB0aGV5IGhvbGQ7IHRoaXMgY2xhc3Mgcm91dGVzIHRoZW0gaW50ZXJuYWxseS4gUm91bmQgMVxuICogbXVzdCBleGNsdWRlIHRoZSBwYXJ0eSdzIG93biBjb21taXRtZW50ICh0aGUgd2FzbSByZWplY3RzIGEgc2VuZGVyIHNldCBjb250YWluaW5nXG4gKiBpdCkgYW5kIHJvdW5kIDIgY29uc3VtZXMgdGhlIG9wZW5pbmdzIGFkZHJlc3NlZCB0byB0aGlzIHBhcnR5LCBvd24gaW5jbHVkZWQuXG4gKlxuICogUGFydHkgaW5kaWNlcyBmb2xsb3cgdGhlIE1QQ3YyIGNvbnZlbnRpb246IDAgPSB1c2VyLCAxID0gYmFja3VwLCAyID0gYml0Z28uXG4gKi9cbmV4cG9ydCBjbGFzcyBWcmZEa2cge1xuICBwcm90ZWN0ZWQgdnJmU2Vzc2lvbjogVnJmS2V5Z2VuU2Vzc2lvbiB8IFZyZldlYktleWdlblNlc3Npb24gfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCB2cmZTZXNzaW9uQnl0ZXM6IFVpbnQ4QXJyYXk7XG4gIHByb3RlY3RlZCB2cmZLZXlTaGFyZTogRGtsc1ZyZktleXNoYXJlIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQga2V5U2hhcmVCdWZmOiBCdWZmZXIgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBwdWJsaWNLZXk6IEJ1ZmZlciB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGtleUlkOiBCdWZmZXIgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCByb290Q2hhaW5Db2RlOiBCdWZmZXIgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBuOiBudW1iZXI7XG4gIHByb3RlY3RlZCB0OiBudW1iZXI7XG4gIHByb3RlY3RlZCBwYXJ0eUlkeDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgc2VlZDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgdnJmU3RhdGU6IFZyZkRrZ1N0YXRlID0gVnJmRGtnU3RhdGUuVW5pbml0aWFsaXplZDtcbiAgcHJvdGVjdGVkIHZyZldhc206IFZyZldhc20gfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKG46IG51bWJlciwgdDogbnVtYmVyLCBwYXJ0eUlkeDogbnVtYmVyLCBzZWVkPzogQnVmZmVyLCB2cmZXYXNtPzogQnVuZGxlclZyZldhc21lcikge1xuICAgIHRoaXMubiA9IG47XG4gICAgdGhpcy50ID0gdDtcbiAgICB0aGlzLnBhcnR5SWR4ID0gcGFydHlJZHg7XG4gICAgdGhpcy5zZWVkID0gc2VlZDtcbiAgICB0aGlzLnZyZldhc20gPSB2cmZXYXNtID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRWcmZXYXNtKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy52cmZXYXNtKSB7XG4gICAgICB0aGlzLnZyZldhc20gPSBhd2FpdCBpbXBvcnQoJ0BzaWxlbmNlbGFib3JhdG9yaWVzL2RrbHMtd2FzbS1sbC12cmYtbm9kZScpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VnJmV2FzbSgpIHtcbiAgICBpZiAoIXRoaXMudnJmV2FzbSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1ZSRiB3YXNtIG5vdCBsb2FkZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudnJmV2FzbTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc3RvcmVTZXNzaW9uKCkge1xuICAgIGlmICghdGhpcy52cmZTZXNzaW9uKSB7XG4gICAgICB0aGlzLnZyZlNlc3Npb24gPSB0aGlzLmdldFZyZldhc20oKS5WcmZLZXlnZW5TZXNzaW9uLmZyb21CeXRlcyh0aGlzLnZyZlNlc3Npb25CeXRlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlLWRlcml2ZSB0aGUgcm91bmQgc3RhdGUgZnJvbSB0aGUgd2FzbSBzZXNzaW9uIGJ5dGVzIGluc3RlYWQgb2YgdHJ1c3RpbmcgYVxuICAgKiBjYWxsZXItc3VwcGxpZWQgZW51bS4gVGhlIHdhc20gZW1iZWRzIGEgcm91bmQgdGFnIGZvciBleGFjdGx5IHRoaXMgcmVhc29uOyB0aGlzXG4gICAqIGlzIHdoYXQgbGV0cyBhIHN0YXRlbGVzcyBzZXJ2ZXIgcmVzdW1lIG1pZC1wcm90b2NvbC5cbiAgICovXG4gIHByaXZhdGUgX2Rlc2VyaWFsaXplU3RhdGUoKSB7XG4gICAgaWYgKCF0aGlzLnZyZlNlc3Npb24pIHtcbiAgICAgIHRocm93IEVycm9yKCdTZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBjb25zdCByb3VuZCA9IGRlY29kZSh0aGlzLnZyZlNlc3Npb24udG9CeXRlcygpKS5yb3VuZDtcbiAgICBpZiAocm91bmQgPT09ICdJbml0Jykge1xuICAgICAgdGhpcy52cmZTdGF0ZSA9IFZyZkRrZ1N0YXRlLlVuaW5pdGlhbGl6ZWQ7XG4gICAgfSBlbHNlIGlmIChyb3VuZCA9PT0gJ1dhaXRNc2cxJykge1xuICAgICAgdGhpcy52cmZTdGF0ZSA9IFZyZkRrZ1N0YXRlLlJvdW5kMTtcbiAgICB9IGVsc2UgaWYgKHJvdW5kID09PSAnV2FpdE1zZzInKSB7XG4gICAgICB0aGlzLnZyZlN0YXRlID0gVnJmRGtnU3RhdGUuUm91bmQyO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJvdW5kID09PSAnb2JqZWN0JyAmJiByb3VuZCAhPT0gbnVsbCAmJiAnU2hhcmUnIGluIHJvdW5kKSB7XG4gICAgICB0aGlzLnZyZlN0YXRlID0gVnJmRGtnU3RhdGUuQ29tcGxldGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudnJmU3RhdGUgPSBWcmZEa2dTdGF0ZS5JbnZhbGlkU3RhdGU7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBTdGF0ZTogJHtKU09OLnN0cmluZ2lmeShyb3VuZCl9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGlzIHBhcnR5J3MgVlJGIERLRyBjb21taXRtZW50IChWcmZLZXlnZW5Nc2cxLCBicm9hZGNhc3QpLlxuICAgKi9cbiAgYXN5bmMgaW5pdERrZygpOiBQcm9taXNlPERlc2VyaWFsaXplZE1lc3NhZ2VzPiB7XG4gICAgaWYgKCF0aGlzLnZyZldhc20pIHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZFZyZldhc20oKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudCA+IHRoaXMubiB8fCB0aGlzLnBhcnR5SWR4ID49IHRoaXMubikge1xuICAgICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgcGFyYW1ldGVycyBmb3IgVlJGIERLRycpO1xuICAgIH1cbiAgICBpZiAodGhpcy52cmZTdGF0ZSAhPSBWcmZEa2dTdGF0ZS5VbmluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignVlJGIERLRyBzZXNzaW9uIGFscmVhZHkgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIC8qIGNoZWNrcyBmb3IgZWxlY3Ryb24gcHJvY2Vzc2VzICovXG4gICAgICAhd2luZG93LnByb2Nlc3MgJiZcbiAgICAgICF3aW5kb3cucHJvY2Vzcz8uWyd0eXBlJ11cbiAgICApIHtcbiAgICAgIC8qIFRoaXMgaXMgb25seSBuZWVkZWQgZm9yIGJyb3dzZXJzL3dlYiBiZWNhdXNlIGl0IHVzZXMgZmV0Y2ggdG8gcmVzb2x2ZSB0aGUgd2FzbSBhc3NldCBmb3IgdGhlIHdlYiAqL1xuICAgICAgY29uc3QgaW5pdFZyZiA9IGF3YWl0IGltcG9ydCgnQHNpbGVuY2VsYWJvcmF0b3JpZXMvZGtscy13YXNtLWxsLXZyZi13ZWInKTtcbiAgICAgIGF3YWl0IGluaXRWcmYuZGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWVkICYmIHRoaXMuc2VlZC5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBFcnJvcihgU2VlZCBzaG91bGQgYmUgMzIgYnl0ZXMsIGdvdCAke3RoaXMuc2VlZC5sZW5ndGh9LmApO1xuICAgIH1cbiAgICBjb25zdCB7IFZyZktleWdlblNlc3Npb24gfSA9IHRoaXMuZ2V0VnJmV2FzbSgpO1xuICAgIHRoaXMudnJmU2Vzc2lvbiA9IHRoaXMuc2VlZFxuICAgICAgPyBuZXcgVnJmS2V5Z2VuU2Vzc2lvbih0aGlzLm4sIHRoaXMudCwgdGhpcy5wYXJ0eUlkeCwgbmV3IFVpbnQ4QXJyYXkodGhpcy5zZWVkKSlcbiAgICAgIDogbmV3IFZyZktleWdlblNlc3Npb24odGhpcy5uLCB0aGlzLnQsIHRoaXMucGFydHlJZHgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy52cmZTZXNzaW9uLmNyZWF0ZUZpcnN0TWVzc2FnZSgpO1xuICAgICAgLy8gQ29weSB0aGUgcGF5bG9hZCBvdXQgYmVmb3JlIGZyZWVpbmcgdGhlIHdhc20gbWVzc2FnZSBvYmplY3QuXG4gICAgICBjb25zdCBwYXlsb2FkID0gbmV3IFVpbnQ4QXJyYXkobWVzc2FnZS5wYXlsb2FkKTtcbiAgICAgIG1lc3NhZ2UuZnJlZSgpO1xuICAgICAgdGhpcy52cmZTZXNzaW9uQnl0ZXMgPSB0aGlzLnZyZlNlc3Npb24udG9CeXRlcygpO1xuICAgICAgdGhpcy5fZGVzZXJpYWxpemVTdGF0ZSgpO1xuICAgICAgcmV0dXJuIHsgYnJvYWRjYXN0TWVzc2FnZXM6IFt7IHBheWxvYWQsIGZyb206IHRoaXMucGFydHlJZHggfV0sIHAycE1lc3NhZ2VzOiBbXSB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgZmlyc3QgVlJGIG1lc3NhZ2UgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9OiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgdGhlIG1lc3NhZ2VzIHRoaXMgcGFydHkgaG9sZHMgZm9yIHRoZSBjdXJyZW50IHJvdW5kIGFuZCByZXR1cm4gdGhpc1xuICAgKiBwYXJ0eSdzIG1lc3NhZ2VzIGZvciB0aGUgbmV4dCByb3VuZC4gQ2FsbGVycyBwYXNzIGV2ZXJ5dGhpbmcgdGhleSBob2xkOyB0aGVcbiAgICogcm91bmQgcm91dGluZyBoYXBwZW5zIGhlcmU6XG4gICAqXG4gICAqIC0gUm91bmQgMSAoV2FpdE1zZzEpOiBjb25zdW1lcyB0aGUgb3RoZXIgcGFydGllcycgY29tbWl0bWVudHMgKG93biBleGNsdWRlZCDigJRcbiAgICogICB0aGUgd2FzbSByZWplY3RzIGEgc2VuZGVyIHNldCBjb250YWluaW5nIHRoZSBwYXJ0eSdzIG93biBNc2cxKSBhbmQgZW1pdHMgdGhpc1xuICAgKiAgIHBhcnR5J3Mgb3BlbmluZ3MgKFZyZktleWdlbk1zZzIpLCBvbmUgYnJvYWRjYXN0IG1lc3NhZ2UgcGVyIHJlY2lwaWVudC5cbiAgICogLSBSb3VuZCAyIChXYWl0TXNnMik6IGNvbnN1bWVzIHRoZSBvcGVuaW5ncyBhZGRyZXNzZWQgdG8gdGhpcyBwYXJ0eSAob3duXG4gICAqICAgc2VsZi1hZGRyZXNzZWQgb3BlbmluZyBpbmNsdWRlZCkgYW5kIGZpbmFsaXplcyB0aGUgREtHLCByZXR1cm5pbmcgbm8gbWVzc2FnZXMuXG4gICAqL1xuICBhc3luYyBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2VzRm9ySXRoUm91bmQ6IERlc2VyaWFsaXplZE1lc3NhZ2VzKTogUHJvbWlzZTxEZXNlcmlhbGl6ZWRNZXNzYWdlcz4ge1xuICAgIHRoaXMuX3Jlc3RvcmVTZXNzaW9uKCk7XG4gICAgaWYgKCF0aGlzLnZyZlNlc3Npb24pIHtcbiAgICAgIHRocm93IEVycm9yKCdTZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBjb25zdCB7IE1lc3NhZ2U6IFZyZk1lc3NhZ2UgfSA9IHRoaXMuZ2V0VnJmV2FzbSgpO1xuICAgIGxldCBuZXh0Um91bmRNZXNzYWdlczogVnJmV2FzbU1lc3NhZ2VbXSA9IFtdO1xuICAgIGNvbnN0IG5leHRSb3VuZERlc2VyaWFsaXplZE1lc3NhZ2VzOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLCBwMnBNZXNzYWdlczogW10gfTtcbiAgICB0cnkge1xuICAgICAgc3dpdGNoICh0aGlzLnZyZlN0YXRlKSB7XG4gICAgICAgIGNhc2UgVnJmRGtnU3RhdGUuUm91bmQxOiB7XG4gICAgICAgICAgY29uc3Qgb3RoZXJzQ29tbWl0bWVudHMgPSBtZXNzYWdlc0Zvckl0aFJvdW5kLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS5mcm9tICE9PSB0aGlzLnBhcnR5SWR4KTtcbiAgICAgICAgICBuZXh0Um91bmRNZXNzYWdlcyA9IHRoaXMudnJmU2Vzc2lvbi5oYW5kbGVNZXNzYWdlcyhcbiAgICAgICAgICAgIG90aGVyc0NvbW1pdG1lbnRzLm1hcCgobSkgPT4gbmV3IFZyZk1lc3NhZ2UobS5wYXlsb2FkLCBtLmZyb20pKVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fZGVzZXJpYWxpemVTdGF0ZSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgVnJmRGtnU3RhdGUuUm91bmQyOiB7XG4gICAgICAgICAgY29uc3Qgb3BlbmluZ3NGb3JNZSA9IG1lc3NhZ2VzRm9ySXRoUm91bmQucDJwTWVzc2FnZXMuZmlsdGVyKChtKSA9PiBtLnRvID09PSB0aGlzLnBhcnR5SWR4KTtcbiAgICAgICAgICBuZXh0Um91bmRNZXNzYWdlcyA9IHRoaXMudnJmU2Vzc2lvbi5oYW5kbGVNZXNzYWdlcyhcbiAgICAgICAgICAgIG9wZW5pbmdzRm9yTWUubWFwKChtKSA9PiBuZXcgVnJmTWVzc2FnZShtLnBheWxvYWQsIG0uZnJvbSwgbS50bykpXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyB2cmZLZXlzaGFyZSgpIGNvbnN1bWVzIChhbmQgZGVhbGxvY2F0ZXMpIHRoZSBzZXNzaW9uIGluIGFsbCBjYXNlcy5cbiAgICAgICAgICBjb25zdCB2cmZLZXlTaGFyZSA9IHRoaXMudnJmU2Vzc2lvbi52cmZLZXlzaGFyZSgpO1xuICAgICAgICAgIHRoaXMudnJmS2V5U2hhcmUgPSB2cmZLZXlTaGFyZTtcbiAgICAgICAgICB0aGlzLmtleVNoYXJlQnVmZiA9IEJ1ZmZlci5mcm9tKHZyZktleVNoYXJlLnRvQnl0ZXMoKSk7XG4gICAgICAgICAgdGhpcy5wdWJsaWNLZXkgPSBCdWZmZXIuZnJvbSh2cmZLZXlTaGFyZS5wdWJsaWNLZXkpO1xuICAgICAgICAgIHRoaXMua2V5SWQgPSBCdWZmZXIuZnJvbSh2cmZLZXlTaGFyZS5rZXlJZCk7XG4gICAgICAgICAgdGhpcy5yb290Q2hhaW5Db2RlID0gQnVmZmVyLmZyb20odnJmS2V5U2hhcmUucm9vdENoYWluQ29kZSk7XG4gICAgICAgICAgdnJmS2V5U2hhcmUuZnJlZSgpO1xuICAgICAgICAgIHRoaXMudnJmU3RhdGUgPSBWcmZEa2dTdGF0ZS5Db21wbGV0ZTtcbiAgICAgICAgICByZXR1cm4gbmV4dFJvdW5kRGVzZXJpYWxpemVkTWVzc2FnZXM7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBWUkYgREtHIHN0YXRlOiAke3RoaXMudnJmU3RhdGV9YCk7XG4gICAgICB9XG5cbiAgICAgIG5leHRSb3VuZERlc2VyaWFsaXplZE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzID0gbmV4dFJvdW5kTWVzc2FnZXNcbiAgICAgICAgLmZpbHRlcigobSkgPT4gbS50b19pZCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAubWFwKChtKSA9PiAoeyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShtLnBheWxvYWQpLCBmcm9tOiBtLmZyb21faWQgfSkpO1xuICAgICAgbmV4dFJvdW5kRGVzZXJpYWxpemVkTWVzc2FnZXMucDJwTWVzc2FnZXMgPSBuZXh0Um91bmRNZXNzYWdlc1xuICAgICAgICAuZmlsdGVyKChtKTogbSBpcyBWcmZXYXNtTWVzc2FnZSAmIHsgdG9faWQ6IG51bWJlciB9ID0+IG0udG9faWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgLm1hcCgobSkgPT4gKHsgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkobS5wYXlsb2FkKSwgZnJvbTogbS5mcm9tX2lkLCB0bzogbS50b19pZCB9KSk7XG4gICAgICByZXR1cm4gbmV4dFJvdW5kRGVzZXJpYWxpemVkTWVzc2FnZXM7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIFZSRiBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHN0YXRlICR7dGhpcy52cmZTdGF0ZX06ICR7ZX1gKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgbmV4dFJvdW5kTWVzc2FnZXMuZm9yRWFjaCgobSkgPT4gbS5mcmVlKCkpO1xuICAgICAgaWYgKHRoaXMudnJmU3RhdGUgIT09IFZyZkRrZ1N0YXRlLkNvbXBsZXRlKSB7XG4gICAgICAgIHRoaXMudnJmU2Vzc2lvbkJ5dGVzID0gdGhpcy52cmZTZXNzaW9uLnRvQnl0ZXMoKTtcbiAgICAgICAgdGhpcy52cmZTZXNzaW9uID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFZSRiBrZXlzaGFyZSBieXRlcyAoQ0JPUiBWcmZLZXlzaGFyZSkgb25jZSB0aGUgREtHIGlzIGNvbXBsZXRlLlxuICAgKiBUaGlzIGJ1ZmZlciBpcyBwcml2YXRlIGtleSBtYXRlcmlhbC5cbiAgICovXG4gIGdldEtleVNoYXJlKCk6IEJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLmtleVNoYXJlQnVmZikge1xuICAgICAgdGhyb3cgRXJyb3IoJ0NhbiBub3QgZ2V0IGtleSBzaGFyZSwgVlJGIERLRyBpcyBub3QgY29tcGxldGUgeWV0LicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5rZXlTaGFyZUJ1ZmY7XG4gIH1cblxuICAvKiogMzItYnl0ZSBjb21wcmVzc2VkIFJpc3RyZXR0byBWUkYgcHVibGljIGtleSwgYXZhaWxhYmxlIG9uY2UgdGhlIERLRyBpcyBjb21wbGV0ZS4gKi9cbiAgZ2V0UHVibGljS2V5KCk6IEJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLnB1YmxpY0tleSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0NhbiBub3QgZ2V0IHB1YmxpYyBrZXksIFZSRiBES0cgaXMgbm90IGNvbXBsZXRlIHlldC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucHVibGljS2V5O1xuICB9XG5cbiAgLyoqIDMyLWJ5dGUgVlJGIGtleSBpZGVudGlmaWVyLCBhdmFpbGFibGUgb25jZSB0aGUgREtHIGlzIGNvbXBsZXRlLiAqL1xuICBnZXRLZXlJZCgpOiBCdWZmZXIge1xuICAgIGlmICghdGhpcy5rZXlJZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0NhbiBub3QgZ2V0IGtleSBpZCwgVlJGIERLRyBpcyBub3QgY29tcGxldGUgeWV0LicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5rZXlJZDtcbiAgfVxuXG4gIC8qKiAzMi1ieXRlIFZSRiByb290IGNoYWluIGNvZGUsIGF2YWlsYWJsZSBvbmNlIHRoZSBES0cgaXMgY29tcGxldGUuICovXG4gIGdldFJvb3RDaGFpbkNvZGUoKTogQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMucm9vdENoYWluQ29kZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0NhbiBub3QgZ2V0IHJvb3QgY2hhaW4gY29kZSwgVlJGIERLRyBpcyBub3QgY29tcGxldGUgeWV0LicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yb290Q2hhaW5Db2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBzZXNzaW9uIGRhdGEgdGhhdCBjYW4gYmUgdXNlZCB0byByZXN0b3JlIHRoZSBzZXNzaW9uIGxhdGVyLlxuICAgKlxuICAgKiBUaGUgcmV0dXJuZWQgc2Vzc2lvbiBieXRlcyBhcmUgc2VjcmV0IGtleSBtYXRlcmlhbCDigJQgdGhleSBjYXJyeSB0aGlzIHBhcnR5J3NcbiAgICogc2VjcmV0IHBvbHlub21pYWwgc2hhcmUuIFRoZXkgbXVzdCBuZXZlciBiZSBsb2dnZWQgb3IgcGVyc2lzdGVkIGluIHRoZSBjbGVhcjtcbiAgICogdGhlIGNhbGxlciBlbmNyeXB0cyB0aGVtIGV4YWN0bHkgbGlrZSB0aGUga2V5IHNoYXJlIGl0c2VsZi5cbiAgICovXG4gIGdldFNlc3Npb25EYXRhKCk6IFZyZkRrZ1Nlc3Npb25EYXRhIHtcbiAgICBjb25zdCBzZXNzaW9uRGF0YTogVnJmRGtnU2Vzc2lvbkRhdGEgPSB7XG4gICAgICB2cmZTZXNzaW9uQnl0ZXM6IHRoaXMudnJmU2Vzc2lvbkJ5dGVzLFxuICAgICAgdnJmU3RhdGU6IHRoaXMudnJmU3RhdGUsXG4gICAgfTtcbiAgICBpZiAodGhpcy5rZXlTaGFyZUJ1ZmYpIHtcbiAgICAgIHNlc3Npb25EYXRhLmtleVNoYXJlQnVmZiA9IHRoaXMua2V5U2hhcmVCdWZmO1xuICAgIH1cbiAgICByZXR1cm4gc2Vzc2lvbkRhdGE7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBhIFZSRiBES0cgc2Vzc2lvbiBmcm9tIHByZXZpb3VzIHNlc3Npb24gZGF0YS5cbiAgICogTm90ZTogVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIFJvdW5kIDEgYXMgdGhhdCdzIHRoZSBpbml0aWFsaXphdGlvbiBwaGFzZS5cbiAgICogVGhlIHJvdW5kIHN0YXRlIGlzIHJlLWRlcml2ZWQgZnJvbSB0aGUgd2FzbSBzZXNzaW9uIGJ5dGVzLCBub3QgdHJ1c3RlZCBmcm9tIHRoZVxuICAgKiBjYWxsZXItc3VwcGxpZWQgZW51bSwgc28gYSB0YW1wZXJlZCBgdnJmU3RhdGVgIGNhbm5vdCBzdGVlciB0aGUgcHJvdG9jb2wuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVzdG9yZVNlc3Npb24oXG4gICAgbjogbnVtYmVyLFxuICAgIHQ6IG51bWJlcixcbiAgICBwYXJ0eUlkeDogbnVtYmVyLFxuICAgIHNlc3Npb25EYXRhOiBWcmZEa2dTZXNzaW9uRGF0YSxcbiAgICBzZWVkPzogQnVmZmVyLFxuICAgIHZyZldhc20/OiBCdW5kbGVyVnJmV2FzbWVyXG4gICk6IFByb21pc2U8VnJmRGtnPiB7XG4gICAgY29uc3QgdnJmRGtnID0gbmV3IFZyZkRrZyhuLCB0LCBwYXJ0eUlkeCwgc2VlZCwgdnJmV2FzbSk7XG4gICAgaWYgKCF2cmZEa2cudnJmV2FzbSkge1xuICAgICAgYXdhaXQgdnJmRGtnLmxvYWRWcmZXYXNtKCk7XG4gICAgfVxuICAgIHZyZkRrZy52cmZTZXNzaW9uQnl0ZXMgPSBzZXNzaW9uRGF0YS52cmZTZXNzaW9uQnl0ZXM7XG4gICAgdnJmRGtnLl9yZXN0b3JlU2Vzc2lvbigpO1xuICAgIHZyZkRrZy5fZGVzZXJpYWxpemVTdGF0ZSgpO1xuICAgIGlmIChzZXNzaW9uRGF0YS5rZXlTaGFyZUJ1ZmYpIHtcbiAgICAgIHZyZkRrZy5rZXlTaGFyZUJ1ZmYgPSBzZXNzaW9uRGF0YS5rZXlTaGFyZUJ1ZmY7XG4gICAgfVxuICAgIHJldHVybiB2cmZEa2c7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tss/dkls-vrf/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,OAAO,CAAC;AACjC,OAAO,KAAK,YAAY,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,YAAY,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.DklsVrfUtils = exports.DklsVrfTypes = exports.DklsVrf = void 0;
|
|
37
|
+
exports.DklsVrf = __importStar(require("./dkg"));
|
|
38
|
+
exports.DklsVrfTypes = __importStar(require("./types"));
|
|
39
|
+
exports.DklsVrfUtils = __importStar(require("./util"));
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL2RrbHMtdnJmL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlEQUFpQztBQUNqQyx3REFBd0M7QUFDeEMsdURBQXVDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogYXMgRGtsc1ZyZiBmcm9tICcuL2RrZyc7XG5leHBvcnQgKiBhcyBEa2xzVnJmVHlwZXMgZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgKiBhcyBEa2xzVnJmVXRpbHMgZnJvbSAnLi91dGlsJztcbiJdfQ==
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* States of the VRF DKG state machine: a two-round, commit-then-open distributed
|
|
3
|
+
* key generation. Kept separate from `ecdsa-dkls`'s `DkgState` because the round
|
|
4
|
+
* counts differ (2 vs 4).
|
|
5
|
+
*
|
|
6
|
+
* The wasm session bytes embed a round tag (`Init` / `WaitMsg1` / `WaitMsg2` /
|
|
7
|
+
* `{Share: …}`); `VrfDkg` re-derives this state from the bytes rather than
|
|
8
|
+
* trusting a caller-supplied value.
|
|
9
|
+
*/
|
|
10
|
+
export declare enum VrfDkgState {
|
|
11
|
+
Uninitialized = 0,
|
|
12
|
+
/** Commitment created and broadcast; waiting for the other parties' VrfKeygenMsg1. */
|
|
13
|
+
Round1 = 1,
|
|
14
|
+
/** Openings created and broadcast; waiting for the other parties' VrfKeygenMsg2. */
|
|
15
|
+
Round2 = 2,
|
|
16
|
+
Complete = 3,
|
|
17
|
+
InvalidState = 4
|
|
18
|
+
}
|
|
19
|
+
export interface VrfDkgSessionData {
|
|
20
|
+
/**
|
|
21
|
+
* Serialized wasm session. Secret key material — it carries the party's
|
|
22
|
+
* secret polynomial share. Never log it or persist it in the clear.
|
|
23
|
+
*/
|
|
24
|
+
vrfSessionBytes: Uint8Array;
|
|
25
|
+
vrfState: VrfDkgState;
|
|
26
|
+
keyShareBuff?: Buffer;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/tss/dkls-vrf/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,oBAAY,WAAW;IACrB,aAAa,IAAI;IACjB,sFAAsF;IACtF,MAAM,IAAA;IACN,oFAAoF;IACpF,MAAM,IAAA;IACN,QAAQ,IAAA;IACR,YAAY,IAAA;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,eAAe,EAAE,UAAU,CAAC;IAC5B,QAAQ,EAAE,WAAW,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VrfDkgState = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* States of the VRF DKG state machine: a two-round, commit-then-open distributed
|
|
6
|
+
* key generation. Kept separate from `ecdsa-dkls`'s `DkgState` because the round
|
|
7
|
+
* counts differ (2 vs 4).
|
|
8
|
+
*
|
|
9
|
+
* The wasm session bytes embed a round tag (`Init` / `WaitMsg1` / `WaitMsg2` /
|
|
10
|
+
* `{Share: …}`); `VrfDkg` re-derives this state from the bytes rather than
|
|
11
|
+
* trusting a caller-supplied value.
|
|
12
|
+
*/
|
|
13
|
+
var VrfDkgState;
|
|
14
|
+
(function (VrfDkgState) {
|
|
15
|
+
VrfDkgState[VrfDkgState["Uninitialized"] = 0] = "Uninitialized";
|
|
16
|
+
/** Commitment created and broadcast; waiting for the other parties' VrfKeygenMsg1. */
|
|
17
|
+
VrfDkgState[VrfDkgState["Round1"] = 1] = "Round1";
|
|
18
|
+
/** Openings created and broadcast; waiting for the other parties' VrfKeygenMsg2. */
|
|
19
|
+
VrfDkgState[VrfDkgState["Round2"] = 2] = "Round2";
|
|
20
|
+
VrfDkgState[VrfDkgState["Complete"] = 3] = "Complete";
|
|
21
|
+
VrfDkgState[VrfDkgState["InvalidState"] = 4] = "InvalidState";
|
|
22
|
+
})(VrfDkgState || (exports.VrfDkgState = VrfDkgState = {}));
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL2RrbHMtdnJmL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7Ozs7OztHQVFHO0FBQ0gsSUFBWSxXQVFYO0FBUkQsV0FBWSxXQUFXO0lBQ3JCLCtEQUFpQixDQUFBO0lBQ2pCLHNGQUFzRjtJQUN0RixpREFBTSxDQUFBO0lBQ04sb0ZBQW9GO0lBQ3BGLGlEQUFNLENBQUE7SUFDTixxREFBUSxDQUFBO0lBQ1IsNkRBQVksQ0FBQTtBQUNkLENBQUMsRUFSVyxXQUFXLDJCQUFYLFdBQVcsUUFRdEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YXRlcyBvZiB0aGUgVlJGIERLRyBzdGF0ZSBtYWNoaW5lOiBhIHR3by1yb3VuZCwgY29tbWl0LXRoZW4tb3BlbiBkaXN0cmlidXRlZFxuICoga2V5IGdlbmVyYXRpb24uIEtlcHQgc2VwYXJhdGUgZnJvbSBgZWNkc2EtZGtsc2AncyBgRGtnU3RhdGVgIGJlY2F1c2UgdGhlIHJvdW5kXG4gKiBjb3VudHMgZGlmZmVyICgyIHZzIDQpLlxuICpcbiAqIFRoZSB3YXNtIHNlc3Npb24gYnl0ZXMgZW1iZWQgYSByb3VuZCB0YWcgKGBJbml0YCAvIGBXYWl0TXNnMWAgLyBgV2FpdE1zZzJgIC9cbiAqIGB7U2hhcmU6IOKApn1gKTsgYFZyZkRrZ2AgcmUtZGVyaXZlcyB0aGlzIHN0YXRlIGZyb20gdGhlIGJ5dGVzIHJhdGhlciB0aGFuXG4gKiB0cnVzdGluZyBhIGNhbGxlci1zdXBwbGllZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGVudW0gVnJmRGtnU3RhdGUge1xuICBVbmluaXRpYWxpemVkID0gMCxcbiAgLyoqIENvbW1pdG1lbnQgY3JlYXRlZCBhbmQgYnJvYWRjYXN0OyB3YWl0aW5nIGZvciB0aGUgb3RoZXIgcGFydGllcycgVnJmS2V5Z2VuTXNnMS4gKi9cbiAgUm91bmQxLFxuICAvKiogT3BlbmluZ3MgY3JlYXRlZCBhbmQgYnJvYWRjYXN0OyB3YWl0aW5nIGZvciB0aGUgb3RoZXIgcGFydGllcycgVnJmS2V5Z2VuTXNnMi4gKi9cbiAgUm91bmQyLFxuICBDb21wbGV0ZSxcbiAgSW52YWxpZFN0YXRlLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZyZkRrZ1Nlc3Npb25EYXRhIHtcbiAgLyoqXG4gICAqIFNlcmlhbGl6ZWQgd2FzbSBzZXNzaW9uLiBTZWNyZXQga2V5IG1hdGVyaWFsIOKAlCBpdCBjYXJyaWVzIHRoZSBwYXJ0eSdzXG4gICAqIHNlY3JldCBwb2x5bm9taWFsIHNoYXJlLiBOZXZlciBsb2cgaXQgb3IgcGVyc2lzdCBpdCBpbiB0aGUgY2xlYXIuXG4gICAqL1xuICB2cmZTZXNzaW9uQnl0ZXM6IFVpbnQ4QXJyYXk7XG4gIHZyZlN0YXRlOiBWcmZEa2dTdGF0ZTtcbiAga2V5U2hhcmVCdWZmPzogQnVmZmVyO1xufVxuIl19
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Buffer } from 'buffer';
|
|
2
|
+
import { Derive } from '../ecdsa-dkls/derive';
|
|
3
|
+
import { VrfDkg } from './dkg';
|
|
4
|
+
/**
|
|
5
|
+
* Runs a local 2-of-3 VRF DKG across user (0), backup (1) and bitgo (2) parties and
|
|
6
|
+
* returns the three completed VrfDkg sessions, mirroring `generateDKGKeyShares` from
|
|
7
|
+
* `ecdsa-dkls/util.ts` so VRF tests read like the existing DKLS ones.
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateVrfDKGKeyShares(seedUser?: Buffer, seedBackup?: Buffer, seedBitgo?: Buffer): Promise<[VrfDkg, VrfDkg, VrfDkg]>;
|
|
10
|
+
/**
|
|
11
|
+
* Runs the hard-derivation ceremony on top of completed root sessions: the user (0)
|
|
12
|
+
* hard-derive session pairs with a fresh BitGo (2) session, and the backup (1)
|
|
13
|
+
* session with a second fresh BitGo session. The hard-derive wasm session is a
|
|
14
|
+
* 2-party threshold protocol per instance, so the BitGo server side runs two
|
|
15
|
+
* sessions — one per SDK party. All four derived keyshares agree on the child
|
|
16
|
+
* public key; the two BitGo shares are distinct private shares of that same key.
|
|
17
|
+
*
|
|
18
|
+
* @param path hardened derivation path bytes (e.g. `m/0'` as a 4-byte big-endian
|
|
19
|
+
* index with the hardened bit set)
|
|
20
|
+
* @returns [user, backup, bitgoUserPair, bitgoBackupPair] completed Derive sessions
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateHardDerivedKeyShares(userRoot: {
|
|
23
|
+
getKeyShare(): Buffer;
|
|
24
|
+
}, backupRoot: {
|
|
25
|
+
getKeyShare(): Buffer;
|
|
26
|
+
}, bitgoRoot: {
|
|
27
|
+
getKeyShare(): Buffer;
|
|
28
|
+
}, userVrf: VrfDkg, backupVrf: VrfDkg, bitgoVrf: VrfDkg, path: Uint8Array, seedUser?: Buffer, seedBackup?: Buffer): Promise<[Derive, Derive, Derive, Derive]>;
|
|
29
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/tss/dkls-vrf/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,CAAC,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CA0CnC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE;IAAE,WAAW,IAAI,MAAM,CAAA;CAAE,EACnC,UAAU,EAAE;IAAE,WAAW,IAAI,MAAM,CAAA;CAAE,EACrC,SAAS,EAAE;IAAE,WAAW,IAAI,MAAM,CAAA;CAAE,EACpC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,UAAU,EAChB,QAAQ,CAAC,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAkD3C"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateVrfDKGKeyShares = generateVrfDKGKeyShares;
|
|
4
|
+
exports.generateHardDerivedKeyShares = generateHardDerivedKeyShares;
|
|
5
|
+
const derive_1 = require("../ecdsa-dkls/derive");
|
|
6
|
+
const dkg_1 = require("./dkg");
|
|
7
|
+
/**
|
|
8
|
+
* Runs a local 2-of-3 VRF DKG across user (0), backup (1) and bitgo (2) parties and
|
|
9
|
+
* returns the three completed VrfDkg sessions, mirroring `generateDKGKeyShares` from
|
|
10
|
+
* `ecdsa-dkls/util.ts` so VRF tests read like the existing DKLS ones.
|
|
11
|
+
*/
|
|
12
|
+
async function generateVrfDKGKeyShares(seedUser, seedBackup, seedBitgo) {
|
|
13
|
+
const user = new dkg_1.VrfDkg(3, 2, 0, seedUser);
|
|
14
|
+
const backup = new dkg_1.VrfDkg(3, 2, 1, seedBackup);
|
|
15
|
+
const bitgo = new dkg_1.VrfDkg(3, 2, 2, seedBitgo);
|
|
16
|
+
// #region round 1
|
|
17
|
+
const userRound1Messages = await user.initDkg();
|
|
18
|
+
const backupRound1Messages = await backup.initDkg();
|
|
19
|
+
const bitgoRound1Messages = await bitgo.initDkg();
|
|
20
|
+
const bitgoRound2Messages = await bitgo.handleIncomingMessages({
|
|
21
|
+
p2pMessages: [],
|
|
22
|
+
broadcastMessages: [...userRound1Messages.broadcastMessages, ...backupRound1Messages.broadcastMessages],
|
|
23
|
+
});
|
|
24
|
+
// #endregion
|
|
25
|
+
// #region round 2
|
|
26
|
+
const userRound2Messages = await user.handleIncomingMessages({
|
|
27
|
+
p2pMessages: [],
|
|
28
|
+
broadcastMessages: [...bitgoRound1Messages.broadcastMessages, ...backupRound1Messages.broadcastMessages],
|
|
29
|
+
});
|
|
30
|
+
const backupRound2Messages = await backup.handleIncomingMessages({
|
|
31
|
+
p2pMessages: [],
|
|
32
|
+
broadcastMessages: [...userRound1Messages.broadcastMessages, ...bitgoRound1Messages.broadcastMessages],
|
|
33
|
+
});
|
|
34
|
+
await bitgo.handleIncomingMessages({
|
|
35
|
+
p2pMessages: [bitgoRound2Messages, userRound2Messages, backupRound2Messages]
|
|
36
|
+
.flatMap((m) => m.p2pMessages)
|
|
37
|
+
.filter((m) => m.to === 2),
|
|
38
|
+
broadcastMessages: [],
|
|
39
|
+
});
|
|
40
|
+
await user.handleIncomingMessages({
|
|
41
|
+
p2pMessages: [bitgoRound2Messages, userRound2Messages, backupRound2Messages]
|
|
42
|
+
.flatMap((m) => m.p2pMessages)
|
|
43
|
+
.filter((m) => m.to === 0),
|
|
44
|
+
broadcastMessages: [],
|
|
45
|
+
});
|
|
46
|
+
await backup.handleIncomingMessages({
|
|
47
|
+
p2pMessages: [bitgoRound2Messages, userRound2Messages, backupRound2Messages]
|
|
48
|
+
.flatMap((m) => m.p2pMessages)
|
|
49
|
+
.filter((m) => m.to === 1),
|
|
50
|
+
broadcastMessages: [],
|
|
51
|
+
});
|
|
52
|
+
return [user, backup, bitgo];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Runs the hard-derivation ceremony on top of completed root sessions: the user (0)
|
|
56
|
+
* hard-derive session pairs with a fresh BitGo (2) session, and the backup (1)
|
|
57
|
+
* session with a second fresh BitGo session. The hard-derive wasm session is a
|
|
58
|
+
* 2-party threshold protocol per instance, so the BitGo server side runs two
|
|
59
|
+
* sessions — one per SDK party. All four derived keyshares agree on the child
|
|
60
|
+
* public key; the two BitGo shares are distinct private shares of that same key.
|
|
61
|
+
*
|
|
62
|
+
* @param path hardened derivation path bytes (e.g. `m/0'` as a 4-byte big-endian
|
|
63
|
+
* index with the hardened bit set)
|
|
64
|
+
* @returns [user, backup, bitgoUserPair, bitgoBackupPair] completed Derive sessions
|
|
65
|
+
*/
|
|
66
|
+
async function generateHardDerivedKeyShares(userRoot, backupRoot, bitgoRoot, userVrf, backupVrf, bitgoVrf, path, seedUser, seedBackup) {
|
|
67
|
+
const user = new derive_1.Derive(3, 2, 0, userRoot.getKeyShare(), userVrf.getKeyShare(), path, seedUser);
|
|
68
|
+
const backup = new derive_1.Derive(3, 2, 1, backupRoot.getKeyShare(), backupVrf.getKeyShare(), path, seedBackup);
|
|
69
|
+
const bitgoUserPair = new derive_1.Derive(3, 2, 2, bitgoRoot.getKeyShare(), bitgoVrf.getKeyShare(), path);
|
|
70
|
+
const bitgoBackupPair = new derive_1.Derive(3, 2, 2, bitgoRoot.getKeyShare(), bitgoVrf.getKeyShare(), path);
|
|
71
|
+
// #region round 1
|
|
72
|
+
const userMsg1 = await user.initDerive();
|
|
73
|
+
const backupMsg1 = await backup.initDerive();
|
|
74
|
+
const bitgoUserPairMsg1 = await bitgoUserPair.initDerive();
|
|
75
|
+
const bitgoBackupPairMsg1 = await bitgoBackupPair.initDerive();
|
|
76
|
+
const userMsg2 = user.handleIncomingMessages({
|
|
77
|
+
p2pMessages: [],
|
|
78
|
+
broadcastMessages: [{ payload: bitgoUserPairMsg1.payload, from: bitgoUserPairMsg1.from }],
|
|
79
|
+
});
|
|
80
|
+
const bitgoUserPairMsg2 = bitgoUserPair.handleIncomingMessages({
|
|
81
|
+
p2pMessages: [],
|
|
82
|
+
broadcastMessages: [{ payload: userMsg1.payload, from: userMsg1.from }],
|
|
83
|
+
});
|
|
84
|
+
const backupMsg2 = backup.handleIncomingMessages({
|
|
85
|
+
p2pMessages: [],
|
|
86
|
+
broadcastMessages: [{ payload: bitgoBackupPairMsg1.payload, from: bitgoBackupPairMsg1.from }],
|
|
87
|
+
});
|
|
88
|
+
const bitgoBackupPairMsg2 = bitgoBackupPair.handleIncomingMessages({
|
|
89
|
+
p2pMessages: [],
|
|
90
|
+
broadcastMessages: [{ payload: backupMsg1.payload, from: backupMsg1.from }],
|
|
91
|
+
});
|
|
92
|
+
// #endregion
|
|
93
|
+
// #region round 2
|
|
94
|
+
user.handleIncomingMessages({
|
|
95
|
+
p2pMessages: [],
|
|
96
|
+
broadcastMessages: [{ payload: bitgoUserPairMsg2.broadcastMessages[0].payload, from: 2 }],
|
|
97
|
+
});
|
|
98
|
+
bitgoUserPair.handleIncomingMessages({
|
|
99
|
+
p2pMessages: [],
|
|
100
|
+
broadcastMessages: [{ payload: userMsg2.broadcastMessages[0].payload, from: 0 }],
|
|
101
|
+
});
|
|
102
|
+
backup.handleIncomingMessages({
|
|
103
|
+
p2pMessages: [],
|
|
104
|
+
broadcastMessages: [{ payload: bitgoBackupPairMsg2.broadcastMessages[0].payload, from: 2 }],
|
|
105
|
+
});
|
|
106
|
+
bitgoBackupPair.handleIncomingMessages({
|
|
107
|
+
p2pMessages: [],
|
|
108
|
+
broadcastMessages: [{ payload: backupMsg2.broadcastMessages[0].payload, from: 1 }],
|
|
109
|
+
});
|
|
110
|
+
// #endregion
|
|
111
|
+
return [user, backup, bitgoUserPair, bitgoBackupPair];
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90c3MvZGtscy12cmYvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVNBLDBEQThDQztBQWNELG9FQTREQztBQWhJRCxpREFBOEM7QUFDOUMsK0JBQStCO0FBRS9COzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsdUJBQXVCLENBQzNDLFFBQWlCLEVBQ2pCLFVBQW1CLEVBQ25CLFNBQWtCO0lBRWxCLE1BQU0sSUFBSSxHQUFHLElBQUksWUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksWUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLGtCQUFrQjtJQUNsQixNQUFNLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2hELE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDcEQsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNsRCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sS0FBSyxDQUFDLHNCQUFzQixDQUFDO1FBQzdELFdBQVcsRUFBRSxFQUFFO1FBQ2YsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLGlCQUFpQixFQUFFLEdBQUcsb0JBQW9CLENBQUMsaUJBQWlCLENBQUM7S0FDeEcsQ0FBQyxDQUFDO0lBQ0gsYUFBYTtJQUViLGtCQUFrQjtJQUNsQixNQUFNLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FB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ZSB9IGZyb20gJy4uL2VjZHNhLWRrbHMvZGVyaXZlJztcbmltcG9ydCB7IFZyZkRrZyB9IGZyb20gJy4vZGtnJztcblxuLyoqXG4gKiBSdW5zIGEgbG9jYWwgMi1vZi0zIFZSRiBES0cgYWNyb3NzIHVzZXIgKDApLCBiYWNrdXAgKDEpIGFuZCBiaXRnbyAoMikgcGFydGllcyBhbmRcbiAqIHJldHVybnMgdGhlIHRocmVlIGNvbXBsZXRlZCBWcmZEa2cgc2Vzc2lvbnMsIG1pcnJvcmluZyBgZ2VuZXJhdGVES0dLZXlTaGFyZXNgIGZyb21cbiAqIGBlY2RzYS1ka2xzL3V0aWwudHNgIHNvIFZSRiB0ZXN0cyByZWFkIGxpa2UgdGhlIGV4aXN0aW5nIERLTFMgb25lcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnJmREtHS2V5U2hhcmVzKFxuICBzZWVkVXNlcj86IEJ1ZmZlcixcbiAgc2VlZEJhY2t1cD86IEJ1ZmZlcixcbiAgc2VlZEJpdGdvPzogQnVmZmVyXG4pOiBQcm9taXNlPFtWcmZEa2csIFZyZkRrZywgVnJmRGtnXT4ge1xuICBjb25zdCB1c2VyID0gbmV3IFZyZkRrZygzLCAyLCAwLCBzZWVkVXNlcik7XG4gIGNvbnN0IGJhY2t1cCA9IG5ldyBWcmZEa2coMywgMiwgMSwgc2VlZEJhY2t1cCk7XG4gIGNvbnN0IGJpdGdvID0gbmV3IFZyZkRrZygzLCAyLCAyLCBzZWVkQml0Z28pO1xuICAvLyAjcmVnaW9uIHJvdW5kIDFcbiAgY29uc3QgdXNlclJvdW5kMU1lc3NhZ2VzID0gYXdhaXQgdXNlci5pbml0RGtnKCk7XG4gIGNvbnN0IGJhY2t1cFJvdW5kMU1lc3NhZ2VzID0gYXdhaXQgYmFja3VwLmluaXREa2coKTtcbiAgY29uc3QgYml0Z29Sb3VuZDFNZXNzYWdlcyA9IGF3YWl0IGJpdGdvLmluaXREa2coKTtcbiAgY29uc3QgYml0Z29Sb3VuZDJNZXNzYWdlcyA9IGF3YWl0IGJpdGdvLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogWy4uLnVzZXJSb3VuZDFNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcywgLi4uYmFja3VwUm91bmQxTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXNdLFxuICB9KTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gcm91bmQgMlxuICBjb25zdCB1c2VyUm91bmQyTWVzc2FnZXMgPSBhd2FpdCB1c2VyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogWy4uLmJpdGdvUm91bmQxTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMsIC4uLmJhY2t1cFJvdW5kMU1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzXSxcbiAgfSk7XG4gIGNvbnN0IGJhY2t1cFJvdW5kMk1lc3NhZ2VzID0gYXdhaXQgYmFja3VwLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogWy4uLnVzZXJSb3VuZDFNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcywgLi4uYml0Z29Sb3VuZDFNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlc10sXG4gIH0pO1xuICBhd2FpdCBiaXRnby5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW2JpdGdvUm91bmQyTWVzc2FnZXMsIHVzZXJSb3VuZDJNZXNzYWdlcywgYmFja3VwUm91bmQyTWVzc2FnZXNdXG4gICAgICAuZmxhdE1hcCgobSkgPT4gbS5wMnBNZXNzYWdlcylcbiAgICAgIC5maWx0ZXIoKG0pID0+IG0udG8gPT09IDIpLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgfSk7XG4gIGF3YWl0IHVzZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtiaXRnb1JvdW5kMk1lc3NhZ2VzLCB1c2VyUm91bmQyTWVzc2FnZXMsIGJhY2t1cFJvdW5kMk1lc3NhZ2VzXVxuICAgICAgLmZsYXRNYXAoKG0pID0+IG0ucDJwTWVzc2FnZXMpXG4gICAgICAuZmlsdGVyKChtKSA9PiBtLnRvID09PSAwKSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gIH0pO1xuICBhd2FpdCBiYWNrdXAuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtiaXRnb1JvdW5kMk1lc3NhZ2VzLCB1c2VyUm91bmQyTWVzc2FnZXMsIGJhY2t1cFJvdW5kMk1lc3NhZ2VzXVxuICAgICAgLmZsYXRNYXAoKG0pID0+IG0ucDJwTWVzc2FnZXMpXG4gICAgICAuZmlsdGVyKChtKSA9PiBtLnRvID09PSAxKSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gIH0pO1xuICByZXR1cm4gW3VzZXIsIGJhY2t1cCwgYml0Z29dO1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIGhhcmQtZGVyaXZhdGlvbiBjZXJlbW9ueSBvbiB0b3Agb2YgY29tcGxldGVkIHJvb3Qgc2Vzc2lvbnM6IHRoZSB1c2VyICgwKVxuICogaGFyZC1kZXJpdmUgc2Vzc2lvbiBwYWlycyB3aXRoIGEgZnJlc2ggQml0R28gKDIpIHNlc3Npb24sIGFuZCB0aGUgYmFja3VwICgxKVxuICogc2Vzc2lvbiB3aXRoIGEgc2Vjb25kIGZyZXNoIEJpdEdvIHNlc3Npb24uIFRoZSBoYXJkLWRlcml2ZSB3YXNtIHNlc3Npb24gaXMgYVxuICogMi1wYXJ0eSB0aHJlc2hvbGQgcHJvdG9jb2wgcGVyIGluc3RhbmNlLCBzbyB0aGUgQml0R28gc2VydmVyIHNpZGUgcnVucyB0d29cbiAqIHNlc3Npb25zIOKAlCBvbmUgcGVyIFNESyBwYXJ0eS4gQWxsIGZvdXIgZGVyaXZlZCBrZXlzaGFyZXMgYWdyZWUgb24gdGhlIGNoaWxkXG4gKiBwdWJsaWMga2V5OyB0aGUgdHdvIEJpdEdvIHNoYXJlcyBhcmUgZGlzdGluY3QgcHJpdmF0ZSBzaGFyZXMgb2YgdGhhdCBzYW1lIGtleS5cbiAqXG4gKiBAcGFyYW0gcGF0aCBoYXJkZW5lZCBkZXJpdmF0aW9uIHBhdGggYnl0ZXMgKGUuZy4gYG0vMCdgIGFzIGEgNC1ieXRlIGJpZy1lbmRpYW5cbiAqICAgaW5kZXggd2l0aCB0aGUgaGFyZGVuZWQgYml0IHNldClcbiAqIEByZXR1cm5zIFt1c2VyLCBiYWNrdXAsIGJpdGdvVXNlclBhaXIsIGJpdGdvQmFja3VwUGFpcl0gY29tcGxldGVkIERlcml2ZSBzZXNzaW9uc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVIYXJkRGVyaXZlZEtleVNoYXJlcyhcbiAgdXNlclJvb3Q6IHsgZ2V0S2V5U2hhcmUoKTogQnVmZmVyIH0sXG4gIGJhY2t1cFJvb3Q6IHsgZ2V0S2V5U2hhcmUoKTogQnVmZmVyIH0sXG4gIGJpdGdvUm9vdDogeyBnZXRLZXlTaGFyZSgpOiBCdWZmZXIgfSxcbiAgdXNlclZyZjogVnJmRGtnLFxuICBiYWNrdXBWcmY6IFZyZkRrZyxcbiAgYml0Z29WcmY6IFZyZkRrZyxcbiAgcGF0aDogVWludDhBcnJheSxcbiAgc2VlZFVzZXI/OiBCdWZmZXIsXG4gIHNlZWRCYWNrdXA/OiBCdWZmZXJcbik6IFByb21pc2U8W0Rlcml2ZSwgRGVyaXZlLCBEZXJpdmUsIERlcml2ZV0+IHtcbiAgY29uc3QgdXNlciA9IG5ldyBEZXJpdmUoMywgMiwgMCwgdXNlclJvb3QuZ2V0S2V5U2hhcmUoKSwgdXNlclZyZi5nZXRLZXlTaGFyZSgpLCBwYXRoLCBzZWVkVXNlcik7XG4gIGNvbnN0IGJhY2t1cCA9IG5ldyBEZXJpdmUoMywgMiwgMSwgYmFja3VwUm9vdC5nZXRLZXlTaGFyZSgpLCBiYWNrdXBWcmYuZ2V0S2V5U2hhcmUoKSwgcGF0aCwgc2VlZEJhY2t1cCk7XG4gIGNvbnN0IGJpdGdvVXNlclBhaXIgPSBuZXcgRGVyaXZlKDMsIDIsIDIsIGJpdGdvUm9vdC5nZXRLZXlTaGFyZSgpLCBiaXRnb1ZyZi5nZXRLZXlTaGFyZSgpLCBwYXRoKTtcbiAgY29uc3QgYml0Z29CYWNrdXBQYWlyID0gbmV3IERlcml2ZSgzLCAyLCAyLCBiaXRnb1Jvb3QuZ2V0S2V5U2hhcmUoKSwgYml0Z29WcmYuZ2V0S2V5U2hhcmUoKSwgcGF0aCk7XG5cbiAgLy8gI3JlZ2lvbiByb3VuZCAxXG4gIGNvbnN0IHVzZXJNc2cxID0gYXdhaXQgdXNlci5pbml0RGVyaXZlKCk7XG4gIGNvbnN0IGJhY2t1cE1zZzEgPSBhd2FpdCBiYWNrdXAuaW5pdERlcml2ZSgpO1xuICBjb25zdCBiaXRnb1VzZXJQYWlyTXNnMSA9IGF3YWl0IGJpdGdvVXNlclBhaXIuaW5pdERlcml2ZSgpO1xuICBjb25zdCBiaXRnb0JhY2t1cFBhaXJNc2cxID0gYXdhaXQgYml0Z29CYWNrdXBQYWlyLmluaXREZXJpdmUoKTtcblxuICBjb25zdCB1c2VyTXNnMiA9IHVzZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbeyBwYXlsb2FkOiBiaXRnb1VzZXJQYWlyTXNnMS5wYXlsb2FkLCBmcm9tOiBiaXRnb1VzZXJQYWlyTXNnMS5mcm9tIH1dLFxuICB9KTtcbiAgY29uc3QgYml0Z29Vc2VyUGFpck1zZzIgPSBiaXRnb1VzZXJQYWlyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW3sgcGF5bG9hZDogdXNlck1zZzEucGF5bG9hZCwgZnJvbTogdXNlck1zZzEuZnJvbSB9XSxcbiAgfSk7XG4gIGNvbnN0IGJhY2t1cE1zZzIgPSBiYWNrdXAuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbeyBwYXlsb2FkOiBiaXRnb0JhY2t1cFBhaXJNc2cxLnBheWxvYWQsIGZyb206IGJpdGdvQmFja3VwUGFpck1zZzEuZnJvbSB9XSxcbiAgfSk7XG4gIGNvbnN0IGJpdGdvQmFja3VwUGFpck1zZzIgPSBiaXRnb0JhY2t1cFBhaXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbeyBwYXlsb2FkOiBiYWNrdXBNc2cxLnBheWxvYWQsIGZyb206IGJhY2t1cE1zZzEuZnJvbSB9XSxcbiAgfSk7XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIHJvdW5kIDJcbiAgdXNlci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt7IHBheWxvYWQ6IGJpdGdvVXNlclBhaXJNc2cyLmJyb2FkY2FzdE1lc3NhZ2VzWzBdLnBheWxvYWQsIGZyb206IDIgfV0sXG4gIH0pO1xuICBiaXRnb1VzZXJQYWlyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW3sgcGF5bG9hZDogdXNlck1zZzIuYnJvYWRjYXN0TWVzc2FnZXNbMF0ucGF5bG9hZCwgZnJvbTogMCB9XSxcbiAgfSk7XG4gIGJhY2t1cC5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt7IHBheWxvYWQ6IGJpdGdvQmFja3VwUGFpck1zZzIuYnJvYWRjYXN0TWVzc2FnZXNbMF0ucGF5bG9hZCwgZnJvbTogMiB9XSxcbiAgfSk7XG4gIGJpdGdvQmFja3VwUGFpci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt7IHBheWxvYWQ6IGJhY2t1cE1zZzIuYnJvYWRjYXN0TWVzc2FnZXNbMF0ucGF5bG9hZCwgZnJvbTogMSB9XSxcbiAgfSk7XG4gIC8vICNlbmRyZWdpb25cblxuICByZXR1cm4gW3VzZXIsIGJhY2t1cCwgYml0Z29Vc2VyUGFpciwgYml0Z29CYWNrdXBQYWlyXTtcbn1cbiJdfQ==
|