@bitgo-beta/sdk-core 8.2.1-beta.2030 → 8.2.1-beta.2032
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/api/types.d.ts +6 -0
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/api/types.js +8 -1
- package/dist/src/bitgo/internal/keycard.d.ts +2 -1
- package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
- package/dist/src/bitgo/internal/keycard.js +6 -3
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +14 -3
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts +39 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.js +344 -0
- package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/index.js +2 -1
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +17 -2
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +8 -5
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +33 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +260 -0
- package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/index.js +2 -1
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +15 -2
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +13 -2
- package/dist/src/bitgo/wallet/iWallet.d.ts +2 -0
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/bitgo/wallet/wallet.d.ts +10 -4
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +19 -6
- package/dist/src/bitgo/wallet/wallets.d.ts +6 -0
- package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallets.js +35 -36
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +173 -0
- package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +51 -40
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -8
- package/LICENSE +0 -191
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.EcdsaVrfMPCv2Utils = void 0;
|
|
7
|
+
exports.buildVrfKeyEnvelopes = buildVrfKeyEnvelopes;
|
|
8
|
+
const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
|
|
9
|
+
const cbor_x_1 = require("cbor-x");
|
|
10
|
+
const assert_1 = __importDefault(require("assert"));
|
|
11
|
+
const io_ts_types_1 = require("io-ts-types");
|
|
12
|
+
const public_types_1 = require("@bitgo/public-types");
|
|
13
|
+
const opengpgUtils_1 = require("../../opengpgUtils");
|
|
14
|
+
const bitgoPubKeys_1 = require("../../../tss/bitgoPubKeys");
|
|
15
|
+
const ecdsaMPCv2_1 = require("./ecdsaMPCv2");
|
|
16
|
+
const ecdsaMPCv2KeyGenSender_1 = require("./ecdsaMPCv2KeyGenSender");
|
|
17
|
+
const typesMPCv2_1 = require("./typesMPCv2");
|
|
18
|
+
/**
|
|
19
|
+
* Version field of the `encryptedPrv` envelope used when a ceremony produces both a
|
|
20
|
+
* signing keyshare and a VRF keyshare. The plaintext handed to encrypt() is
|
|
21
|
+
* `base64(cborEncode(envelope))`, keeping it a single opaque base64 token exactly as
|
|
22
|
+
* the ordinary MPCv2 format does.
|
|
23
|
+
*/
|
|
24
|
+
const VRF_KEY_ENVELOPE_VERSION = 1;
|
|
25
|
+
function serializeVrfMessages(messages) {
|
|
26
|
+
const transfers = [
|
|
27
|
+
...messages.broadcastMessages.map((m) => ({ from: m.from, payload: Buffer.from(m.payload).toString('base64') })),
|
|
28
|
+
...messages.p2pMessages.map((m) => ({
|
|
29
|
+
from: m.from,
|
|
30
|
+
to: m.to,
|
|
31
|
+
payload: Buffer.from(m.payload).toString('base64'),
|
|
32
|
+
})),
|
|
33
|
+
];
|
|
34
|
+
return Buffer.from(JSON.stringify(transfers)).toString('base64');
|
|
35
|
+
}
|
|
36
|
+
function deserializeVrfMessages(blob, forParty) {
|
|
37
|
+
const transfers = JSON.parse(Buffer.from(blob, 'base64').toString());
|
|
38
|
+
return {
|
|
39
|
+
broadcastMessages: transfers
|
|
40
|
+
.filter((t) => t.to === undefined)
|
|
41
|
+
.map((t) => ({ from: t.from, payload: new Uint8Array(Buffer.from(t.payload, 'base64')) })),
|
|
42
|
+
p2pMessages: transfers
|
|
43
|
+
.filter((t) => t.to === forParty)
|
|
44
|
+
.map((t) => ({ from: t.from, to: t.to, payload: new Uint8Array(Buffer.from(t.payload, 'base64')) })),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Combines the signing keyshare with the VRF keyshare into the `encryptedPrv` envelope
|
|
49
|
+
* (`base64(cborEncode({version, prvKeyShare, vrf}))` once the caller base64-encodes the
|
|
50
|
+
* returned buffers). The same container wraps the reduced signing share for
|
|
51
|
+
* `reducedEncryptedPrv`.
|
|
52
|
+
*/
|
|
53
|
+
function buildVrfKeyEnvelopes(privateMaterial, reducedPrivateMaterial, vrfKeyShare) {
|
|
54
|
+
const envelope = (0, cbor_x_1.encode)({
|
|
55
|
+
version: VRF_KEY_ENVELOPE_VERSION,
|
|
56
|
+
prvKeyShare: new Uint8Array(privateMaterial),
|
|
57
|
+
vrf: new Uint8Array(vrfKeyShare),
|
|
58
|
+
});
|
|
59
|
+
const reducedEnvelope = (0, cbor_x_1.encode)({
|
|
60
|
+
version: VRF_KEY_ENVELOPE_VERSION,
|
|
61
|
+
prvKeyShare: new Uint8Array(reducedPrivateMaterial),
|
|
62
|
+
vrf: new Uint8Array(vrfKeyShare),
|
|
63
|
+
});
|
|
64
|
+
return { envelope: Buffer.from(envelope), reducedEnvelope: Buffer.from(reducedEnvelope) };
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* EcdsaMPCv2Utils variant that runs the Ristretto VRF DKG alongside the signing DKLS
|
|
68
|
+
* DKG inside the same MPCv2 keygen rounds, for safe MPC root creation.
|
|
69
|
+
*
|
|
70
|
+
* The round enum is unchanged: the VRF commitment rides MPCv2-R1, the opening rides
|
|
71
|
+
* MPCv2-R2, and the VRF DKG finalizes locally before MPCv2-R3. VRF messages travel as
|
|
72
|
+
* opaque base64 fields on the round payloads, never through the DKLS broadcast/p2p slots.
|
|
73
|
+
* At the end, the signing and VRF keyshares are combined into a single CBOR envelope
|
|
74
|
+
* before encryption.
|
|
75
|
+
*/
|
|
76
|
+
class EcdsaVrfMPCv2Utils extends ecdsaMPCv2_1.EcdsaMPCv2Utils {
|
|
77
|
+
/** @inheritdoc */
|
|
78
|
+
async createKeychains(params) {
|
|
79
|
+
const { userSession, backupSession } = this.getUserAndBackupSessions(params.retrofit);
|
|
80
|
+
const userVrfSession = new sdk_lib_mpc_1.DklsVrf.VrfDkg(3, 2, typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
81
|
+
const backupVrfSession = new sdk_lib_mpc_1.DklsVrf.VrfDkg(3, 2, typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
|
|
82
|
+
const userGpgKey = await (0, opengpgUtils_1.generateGPGKeyPair)('secp256k1');
|
|
83
|
+
const backupGpgKey = await (0, opengpgUtils_1.generateGPGKeyPair)('secp256k1');
|
|
84
|
+
// Get the BitGo public key based on user/enterprise feature flags
|
|
85
|
+
// If it doesn't work, use the default public key from the constants
|
|
86
|
+
const { mpcv2PublicKey } = await this.getBitgoGpgPubkeyBasedOnFeatureFlags(params.enterprise, true);
|
|
87
|
+
const mpcv2Key = mpcv2PublicKey ?? this.bitgoMPCv2PublicGpgKey;
|
|
88
|
+
(0, assert_1.default)(mpcv2Key, 'Failed to get BitGo MPCv2 GPG public key');
|
|
89
|
+
const bitgoPublicGpgKey = mpcv2Key.armor();
|
|
90
|
+
if ((0, bitgoPubKeys_1.envRequiresBitgoPubGpgKeyConfig)(this.bitgo.getEnv())) {
|
|
91
|
+
// Ensure the public key is one of the expected BitGo public keys when in test or prod.
|
|
92
|
+
(0, assert_1.default)((0, bitgoPubKeys_1.isBitgoMpcPubKey)(bitgoPublicGpgKey, 'mpcv2'), 'Invalid BitGo GPG public key');
|
|
93
|
+
}
|
|
94
|
+
const userGpgPrvKey = {
|
|
95
|
+
partyId: typesMPCv2_1.MPCv2PartiesEnum.USER,
|
|
96
|
+
gpgKey: userGpgKey.privateKey,
|
|
97
|
+
};
|
|
98
|
+
const backupGpgPrvKey = {
|
|
99
|
+
partyId: typesMPCv2_1.MPCv2PartiesEnum.BACKUP,
|
|
100
|
+
gpgKey: backupGpgKey.privateKey,
|
|
101
|
+
};
|
|
102
|
+
const bitgoGpgPubKey = {
|
|
103
|
+
partyId: typesMPCv2_1.MPCv2PartiesEnum.BITGO,
|
|
104
|
+
gpgKey: bitgoPublicGpgKey,
|
|
105
|
+
};
|
|
106
|
+
// #region round 1
|
|
107
|
+
const userRound1BroadcastMsg = await userSession.initDkg();
|
|
108
|
+
const backupRound1BroadcastMsg = await backupSession.initDkg();
|
|
109
|
+
const userVrfRound1Msg = await userVrfSession.initDkg();
|
|
110
|
+
const backupVrfRound1Msg = await backupVrfSession.initDkg();
|
|
111
|
+
const round1SerializedMessages = sdk_lib_mpc_1.DklsTypes.serializeMessages({
|
|
112
|
+
broadcastMessages: [userRound1BroadcastMsg, backupRound1BroadcastMsg],
|
|
113
|
+
p2pMessages: [],
|
|
114
|
+
});
|
|
115
|
+
const round1Messages = await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages(round1SerializedMessages, [bitgoGpgPubKey], [userGpgPrvKey, backupGpgPrvKey]);
|
|
116
|
+
const userMsg1 = round1Messages.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER)?.payload;
|
|
117
|
+
const backupMsg1 = round1Messages.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP)?.payload;
|
|
118
|
+
(0, assert_1.default)(userMsg1, 'User message 1 not found in broadcast messages');
|
|
119
|
+
(0, assert_1.default)(backupMsg1, 'Backup message 1 not found in broadcast messages');
|
|
120
|
+
const userGpgPublicKey = userGpgKey.publicKey;
|
|
121
|
+
const backupGpgPublicKey = backupGpgKey.publicKey;
|
|
122
|
+
(0, assert_1.default)(io_ts_types_1.NonEmptyString.is(userGpgPublicKey), 'User GPG public key is required');
|
|
123
|
+
(0, assert_1.default)(io_ts_types_1.NonEmptyString.is(backupGpgPublicKey), 'Backup GPG public key is required');
|
|
124
|
+
// The platform derives withVrf from the safeId on this request; the VRF messages ride as opaque blobs.
|
|
125
|
+
const round1Sender = (0, ecdsaMPCv2KeyGenSender_1.KeyGenSenderForEnterprise)(this.bitgo, params.enterprise, params.safeId);
|
|
126
|
+
const { sessionId, bitgoMsg1, bitgoToBackupMsg2, bitgoToUserMsg2, bitgoVrfMsg1 } = await round1Sender(public_types_1.MPCv2KeyGenStateEnum['MPCv2-R1'], {
|
|
127
|
+
userMsg1: { from: typesMPCv2_1.MPCv2PartiesEnum.USER, ...userMsg1 },
|
|
128
|
+
backupMsg1: { from: typesMPCv2_1.MPCv2PartiesEnum.BACKUP, ...backupMsg1 },
|
|
129
|
+
userGpgPublicKey,
|
|
130
|
+
backupGpgPublicKey,
|
|
131
|
+
userVrfMsg1: serializeVrfMessages(userVrfRound1Msg),
|
|
132
|
+
backupVrfMsg1: serializeVrfMessages(backupVrfRound1Msg),
|
|
133
|
+
walletId: params.retrofit?.walletId,
|
|
134
|
+
});
|
|
135
|
+
(0, assert_1.default)(bitgoVrfMsg1, 'BitGo VRF message 1 not found in round 1 response');
|
|
136
|
+
// #endregion
|
|
137
|
+
// #region round 2
|
|
138
|
+
const bitgoRound1BroadcastMessages = await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ p2pMessages: [], broadcastMessages: [this.formatBitgoBroadcastMessage(bitgoMsg1)] }, [bitgoGpgPubKey], [userGpgPrvKey, backupGpgPrvKey]);
|
|
139
|
+
const bitgoRound1BroadcastMsg = bitgoRound1BroadcastMessages.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
140
|
+
(0, assert_1.default)(bitgoRound1BroadcastMsg, 'BitGo message 1 not found in broadcast messages');
|
|
141
|
+
const userRound2P2PMessages = userSession.handleIncomingMessages({
|
|
142
|
+
p2pMessages: [],
|
|
143
|
+
broadcastMessages: [sdk_lib_mpc_1.DklsTypes.deserializeBroadcastMessage(bitgoRound1BroadcastMsg), backupRound1BroadcastMsg],
|
|
144
|
+
});
|
|
145
|
+
const userToBitgoMsg2 = userRound2P2PMessages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
146
|
+
(0, assert_1.default)(userToBitgoMsg2, 'User message 2 not found in P2P messages');
|
|
147
|
+
const serializedUserToBitgoMsg2 = sdk_lib_mpc_1.DklsTypes.serializeP2PMessage(userToBitgoMsg2);
|
|
148
|
+
const backupRound2P2PMessages = backupSession.handleIncomingMessages({
|
|
149
|
+
p2pMessages: [],
|
|
150
|
+
broadcastMessages: [userRound1BroadcastMsg, sdk_lib_mpc_1.DklsTypes.deserializeBroadcastMessage(bitgoRound1BroadcastMsg)],
|
|
151
|
+
});
|
|
152
|
+
const serializedBackupToBitgoMsg2 = sdk_lib_mpc_1.DklsTypes.serializeMessages(backupRound2P2PMessages).p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
153
|
+
(0, assert_1.default)(serializedBackupToBitgoMsg2, 'Backup message 2 not found in P2P messages');
|
|
154
|
+
// VRF: consume BitGo's and the counterparty's commitments, emit this party's openings.
|
|
155
|
+
// Openings come back as p2p messages addressed to each party (including the sender).
|
|
156
|
+
const userVrfRound2Messages = await userVrfSession.handleIncomingMessages({
|
|
157
|
+
broadcastMessages: [
|
|
158
|
+
...backupVrfRound1Msg.broadcastMessages,
|
|
159
|
+
...deserializeVrfMessages(bitgoVrfMsg1, typesMPCv2_1.MPCv2PartiesEnum.USER).broadcastMessages,
|
|
160
|
+
],
|
|
161
|
+
p2pMessages: [],
|
|
162
|
+
});
|
|
163
|
+
const backupVrfRound2Messages = await backupVrfSession.handleIncomingMessages({
|
|
164
|
+
broadcastMessages: [
|
|
165
|
+
...userVrfRound1Msg.broadcastMessages,
|
|
166
|
+
...deserializeVrfMessages(bitgoVrfMsg1, typesMPCv2_1.MPCv2PartiesEnum.BACKUP).broadcastMessages,
|
|
167
|
+
],
|
|
168
|
+
p2pMessages: [],
|
|
169
|
+
});
|
|
170
|
+
const round2Messages = await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages({ p2pMessages: [serializedUserToBitgoMsg2, serializedBackupToBitgoMsg2], broadcastMessages: [] }, [bitgoGpgPubKey], [userGpgPrvKey, backupGpgPrvKey]);
|
|
171
|
+
const userRound2Msg = round2Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
172
|
+
const backupRound2Msg = round2Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
173
|
+
(0, assert_1.default)(userRound2Msg, 'User to Bitgo message 2 not found in P2P messages');
|
|
174
|
+
(0, assert_1.default)(userRound2Msg.commitment, 'User to Bitgo commitment not found in P2P messages');
|
|
175
|
+
(0, assert_1.default)(backupRound2Msg, 'Backup to Bitgo message 2 not found in P2P messages');
|
|
176
|
+
(0, assert_1.default)(backupRound2Msg.commitment, 'Backup to Bitgo commitment not found in P2P messages');
|
|
177
|
+
(0, assert_1.default)(io_ts_types_1.NonEmptyString.is(userRound2Msg.commitment), 'User to Bitgo commitment is required');
|
|
178
|
+
(0, assert_1.default)(io_ts_types_1.NonEmptyString.is(backupRound2Msg.commitment), 'Backup to Bitgo commitment is required');
|
|
179
|
+
const round2Sender = (0, ecdsaMPCv2KeyGenSender_1.KeyGenSenderForEnterprise)(this.bitgo, params.enterprise);
|
|
180
|
+
const { sessionId: sessionIdRound2, bitgoCommitment2, bitgoToUserMsg3, bitgoToBackupMsg3, bitgoVrfMsg2, } = await round2Sender(public_types_1.MPCv2KeyGenStateEnum['MPCv2-R2'], {
|
|
181
|
+
sessionId,
|
|
182
|
+
userMsg2: {
|
|
183
|
+
from: typesMPCv2_1.MPCv2PartiesEnum.USER,
|
|
184
|
+
to: typesMPCv2_1.MPCv2PartiesEnum.BITGO,
|
|
185
|
+
signature: userRound2Msg.payload.signature,
|
|
186
|
+
encryptedMessage: userRound2Msg.payload.encryptedMessage,
|
|
187
|
+
},
|
|
188
|
+
userCommitment2: userRound2Msg.commitment,
|
|
189
|
+
backupMsg2: {
|
|
190
|
+
from: typesMPCv2_1.MPCv2PartiesEnum.BACKUP,
|
|
191
|
+
to: typesMPCv2_1.MPCv2PartiesEnum.BITGO,
|
|
192
|
+
signature: backupRound2Msg.payload.signature,
|
|
193
|
+
encryptedMessage: backupRound2Msg.payload.encryptedMessage,
|
|
194
|
+
},
|
|
195
|
+
backupCommitment2: backupRound2Msg.commitment,
|
|
196
|
+
userVrfMsg2: serializeVrfMessages(userVrfRound2Messages),
|
|
197
|
+
backupVrfMsg2: serializeVrfMessages(backupVrfRound2Messages),
|
|
198
|
+
});
|
|
199
|
+
// #endregion
|
|
200
|
+
// #region round 3
|
|
201
|
+
assert_1.default.equal(sessionId, sessionIdRound2, 'Round 1 and 2 Session IDs do not match');
|
|
202
|
+
(0, assert_1.default)(bitgoVrfMsg2, 'BitGo VRF message 2 not found in round 2 response');
|
|
203
|
+
// VRF: finalize both DKGs locally by consuming the opening messages addressed to each
|
|
204
|
+
// party (including each party's own) from the R2 exchanges. The VRF DKG completes here,
|
|
205
|
+
// a full round of slack before MPCv2-R3.
|
|
206
|
+
await userVrfSession.handleIncomingMessages({
|
|
207
|
+
broadcastMessages: [],
|
|
208
|
+
p2pMessages: [
|
|
209
|
+
...userVrfRound2Messages.p2pMessages.filter((m) => m.to === typesMPCv2_1.MPCv2PartiesEnum.USER),
|
|
210
|
+
...backupVrfRound2Messages.p2pMessages.filter((m) => m.to === typesMPCv2_1.MPCv2PartiesEnum.USER),
|
|
211
|
+
...deserializeVrfMessages(bitgoVrfMsg2, typesMPCv2_1.MPCv2PartiesEnum.USER).p2pMessages,
|
|
212
|
+
],
|
|
213
|
+
});
|
|
214
|
+
await backupVrfSession.handleIncomingMessages({
|
|
215
|
+
broadcastMessages: [],
|
|
216
|
+
p2pMessages: [
|
|
217
|
+
...userVrfRound2Messages.p2pMessages.filter((m) => m.to === typesMPCv2_1.MPCv2PartiesEnum.BACKUP),
|
|
218
|
+
...backupVrfRound2Messages.p2pMessages.filter((m) => m.to === typesMPCv2_1.MPCv2PartiesEnum.BACKUP),
|
|
219
|
+
...deserializeVrfMessages(bitgoVrfMsg2, typesMPCv2_1.MPCv2PartiesEnum.BACKUP).p2pMessages,
|
|
220
|
+
],
|
|
221
|
+
});
|
|
222
|
+
const decryptedBitgoToUserRound2Msgs = await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ p2pMessages: [this.formatP2PMessage(bitgoToUserMsg2)], broadcastMessages: [] }, [bitgoGpgPubKey], [userGpgPrvKey]);
|
|
223
|
+
const serializedBitgoToUserRound2Msg = decryptedBitgoToUserRound2Msgs.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO && m.to === typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
224
|
+
(0, assert_1.default)(serializedBitgoToUserRound2Msg, 'BitGo to User message 2 not found in P2P messages');
|
|
225
|
+
const bitgoToUserRound2Msg = sdk_lib_mpc_1.DklsTypes.deserializeP2PMessage(serializedBitgoToUserRound2Msg);
|
|
226
|
+
const decryptedBitgoToBackupRound2Msg = await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ p2pMessages: [this.formatP2PMessage(bitgoToBackupMsg2)], broadcastMessages: [] }, [bitgoGpgPubKey], [backupGpgPrvKey]);
|
|
227
|
+
const serializedBitgoToBackupRound2Msg = decryptedBitgoToBackupRound2Msg.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO && m.to === typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
|
|
228
|
+
(0, assert_1.default)(serializedBitgoToBackupRound2Msg, 'BitGo to Backup message 2 not found in P2P messages');
|
|
229
|
+
const bitgoToBackupRound2Msg = sdk_lib_mpc_1.DklsTypes.deserializeP2PMessage(serializedBitgoToBackupRound2Msg);
|
|
230
|
+
const userToBackupMsg2 = userRound2P2PMessages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER && m.to === typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
|
|
231
|
+
(0, assert_1.default)(userToBackupMsg2, 'User to Backup message 2 not found in P2P messages');
|
|
232
|
+
const backupToUserMsg2 = backupRound2P2PMessages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP && m.to === typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
233
|
+
(0, assert_1.default)(backupToUserMsg2, 'Backup to User message 2 not found in P2P messages');
|
|
234
|
+
const userRound3Messages = userSession.handleIncomingMessages({
|
|
235
|
+
broadcastMessages: [],
|
|
236
|
+
p2pMessages: [bitgoToUserRound2Msg, backupToUserMsg2],
|
|
237
|
+
});
|
|
238
|
+
const userToBackupMsg3 = userRound3Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER && m.to === typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
|
|
239
|
+
(0, assert_1.default)(userToBackupMsg3, 'User to Backup message 3 not found in P2P messages');
|
|
240
|
+
const userToBitgoMsg3 = userRound3Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
241
|
+
(0, assert_1.default)(userToBitgoMsg3, 'User to Bitgo message 3 not found in P2P messages');
|
|
242
|
+
const serializedUserToBitgoMsg3 = sdk_lib_mpc_1.DklsTypes.serializeP2PMessage(userToBitgoMsg3);
|
|
243
|
+
const backupRound3Messages = backupSession.handleIncomingMessages({
|
|
244
|
+
broadcastMessages: [],
|
|
245
|
+
p2pMessages: [bitgoToBackupRound2Msg, userToBackupMsg2],
|
|
246
|
+
});
|
|
247
|
+
const backupToUserMsg3 = backupRound3Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP && m.to === typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
248
|
+
(0, assert_1.default)(backupToUserMsg3, 'Backup to User message 3 not found in P2P messages');
|
|
249
|
+
const backupToBitgoMsg3 = backupRound3Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
250
|
+
(0, assert_1.default)(backupToBitgoMsg3, 'Backup to Bitgo message 3 not found in P2P messages');
|
|
251
|
+
const serializedBackupToBitgoMsg3 = sdk_lib_mpc_1.DklsTypes.serializeP2PMessage(backupToBitgoMsg3);
|
|
252
|
+
const decryptedBitgoToUserRound3Messages = await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ broadcastMessages: [], p2pMessages: [this.formatP2PMessage(bitgoToUserMsg3, bitgoCommitment2)] }, [bitgoGpgPubKey], [userGpgPrvKey]);
|
|
253
|
+
const serializedBitgoToUserRound3Msg = decryptedBitgoToUserRound3Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO && m.to === typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
254
|
+
(0, assert_1.default)(serializedBitgoToUserRound3Msg, 'BitGo to User message 3 not found in P2P messages');
|
|
255
|
+
const bitgoToUserRound3Msg = sdk_lib_mpc_1.DklsTypes.deserializeP2PMessage(serializedBitgoToUserRound3Msg);
|
|
256
|
+
const decryptedBitgoToBackupRound3Messages = await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ broadcastMessages: [], p2pMessages: [this.formatP2PMessage(bitgoToBackupMsg3, bitgoCommitment2)] }, [bitgoGpgPubKey], [backupGpgPrvKey]);
|
|
257
|
+
const serializedBitgoToBackupRound3Msg = decryptedBitgoToBackupRound3Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO && m.to === typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
|
|
258
|
+
(0, assert_1.default)(serializedBitgoToBackupRound3Msg, 'BitGo to Backup message 3 not found in P2P messages');
|
|
259
|
+
const bitgoToBackupRound3Msg = sdk_lib_mpc_1.DklsTypes.deserializeP2PMessage(serializedBitgoToBackupRound3Msg);
|
|
260
|
+
const userRound4Messages = userSession.handleIncomingMessages({
|
|
261
|
+
p2pMessages: [backupToUserMsg3, bitgoToUserRound3Msg],
|
|
262
|
+
broadcastMessages: [],
|
|
263
|
+
});
|
|
264
|
+
const userRound4BroadcastMsg = userRound4Messages.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
265
|
+
(0, assert_1.default)(userRound4BroadcastMsg, 'User message 4 not found in broadcast messages');
|
|
266
|
+
const serializedUserRound4BroadcastMsg = sdk_lib_mpc_1.DklsTypes.serializeBroadcastMessage(userRound4BroadcastMsg);
|
|
267
|
+
const backupRound4Messages = backupSession.handleIncomingMessages({
|
|
268
|
+
p2pMessages: [userToBackupMsg3, bitgoToBackupRound3Msg],
|
|
269
|
+
broadcastMessages: [],
|
|
270
|
+
});
|
|
271
|
+
const backupRound4BroadcastMsg = backupRound4Messages.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
|
|
272
|
+
(0, assert_1.default)(backupRound4BroadcastMsg, 'Backup message 4 not found in broadcast messages');
|
|
273
|
+
const serializedBackupRound4BroadcastMsg = sdk_lib_mpc_1.DklsTypes.serializeBroadcastMessage(backupRound4BroadcastMsg);
|
|
274
|
+
const round3Messages = await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages({
|
|
275
|
+
p2pMessages: [serializedUserToBitgoMsg3, serializedBackupToBitgoMsg3],
|
|
276
|
+
broadcastMessages: [serializedUserRound4BroadcastMsg, serializedBackupRound4BroadcastMsg],
|
|
277
|
+
}, [bitgoGpgPubKey], [userGpgPrvKey, backupGpgPrvKey]);
|
|
278
|
+
const { sessionId: sessionIdRound3, bitgoMsg4, commonKeychain: bitgoCommonKeychain, } = await this.sendKeyGenerationRound3(params.enterprise, sessionId, round3Messages);
|
|
279
|
+
// #endregion
|
|
280
|
+
// #region keychain creation
|
|
281
|
+
assert_1.default.equal(sessionId, sessionIdRound3, 'Round 1 and 3 Session IDs do not match');
|
|
282
|
+
const bitgoRound4BroadcastMessages = sdk_lib_mpc_1.DklsTypes.deserializeMessages(await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ p2pMessages: [], broadcastMessages: [this.formatBitgoBroadcastMessage(bitgoMsg4)] }, [bitgoGpgPubKey], [])).broadcastMessages;
|
|
283
|
+
const bitgoRound4BroadcastMsg = bitgoRound4BroadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
284
|
+
(0, assert_1.default)(bitgoRound4BroadcastMsg, 'BitGo message 4 not found in broadcast messages');
|
|
285
|
+
userSession.handleIncomingMessages({
|
|
286
|
+
p2pMessages: [],
|
|
287
|
+
broadcastMessages: [bitgoRound4BroadcastMsg, backupRound4BroadcastMsg],
|
|
288
|
+
});
|
|
289
|
+
backupSession.handleIncomingMessages({
|
|
290
|
+
p2pMessages: [],
|
|
291
|
+
broadcastMessages: [bitgoRound4BroadcastMsg, userRound4BroadcastMsg],
|
|
292
|
+
});
|
|
293
|
+
const userPrivateMaterial = userSession.getKeyShare();
|
|
294
|
+
const backupPrivateMaterial = backupSession.getKeyShare();
|
|
295
|
+
const userReducedPrivateMaterial = userSession.getReducedKeyShare();
|
|
296
|
+
const backupReducedPrivateMaterial = backupSession.getReducedKeyShare();
|
|
297
|
+
const userVrfKeyShare = userVrfSession.getKeyShare();
|
|
298
|
+
const backupVrfKeyShare = backupVrfSession.getKeyShare();
|
|
299
|
+
const userCommonKeychain = sdk_lib_mpc_1.DklsTypes.getCommonKeychain(userPrivateMaterial);
|
|
300
|
+
const backupCommonKeychain = sdk_lib_mpc_1.DklsTypes.getCommonKeychain(backupPrivateMaterial);
|
|
301
|
+
assert_1.default.equal(bitgoCommonKeychain, userCommonKeychain, 'User and Bitgo Common keychains do not match');
|
|
302
|
+
assert_1.default.equal(bitgoCommonKeychain, backupCommonKeychain, 'Backup and Bitgo Common keychains do not match');
|
|
303
|
+
const { envelope: userEnvelope, reducedEnvelope: userReducedEnvelope } = buildVrfKeyEnvelopes(userPrivateMaterial, userReducedPrivateMaterial, userVrfKeyShare);
|
|
304
|
+
const { envelope: backupEnvelope, reducedEnvelope: backupReducedEnvelope } = buildVrfKeyEnvelopes(backupPrivateMaterial, backupReducedPrivateMaterial, backupVrfKeyShare);
|
|
305
|
+
const encryptionSession = params.encryptionVersion === 2 ? await this.bitgo.createEncryptionSession(params.passphrase) : undefined;
|
|
306
|
+
try {
|
|
307
|
+
const userKeychainPromise = this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.USER, bitgoCommonKeychain, userEnvelope, userReducedEnvelope, params.passphrase, params.originalPasscodeEncryptionCode, params.webauthnInfo, encryptionSession, params.encryptionVersion, params.enterprise, params.safeId);
|
|
308
|
+
const backupKeychainPromise = this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BACKUP, bitgoCommonKeychain, backupEnvelope, backupReducedEnvelope, params.passphrase, params.originalPasscodeEncryptionCode, undefined, encryptionSession, params.encryptionVersion, undefined, params.safeId);
|
|
309
|
+
const bitgoKeychainPromise = this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BITGO, bitgoCommonKeychain, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, params.safeId);
|
|
310
|
+
const [userKeychain, backupKeychain, bitgoKeychain] = await Promise.all([
|
|
311
|
+
userKeychainPromise,
|
|
312
|
+
backupKeychainPromise,
|
|
313
|
+
bitgoKeychainPromise,
|
|
314
|
+
]);
|
|
315
|
+
// #endregion
|
|
316
|
+
return {
|
|
317
|
+
userKeychain,
|
|
318
|
+
backupKeychain,
|
|
319
|
+
bitgoKeychain,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
finally {
|
|
323
|
+
encryptionSession?.destroy();
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
getUserAndBackupSessions(retrofit) {
|
|
327
|
+
if (retrofit) {
|
|
328
|
+
const retrofitData = this.getMpcV2RetrofitDataFromMpcV1Keys({
|
|
329
|
+
mpcv1UserKeyShare: retrofit.decryptedUserKey,
|
|
330
|
+
mpcv1BackupKeyShare: retrofit.decryptedBackupKey,
|
|
331
|
+
});
|
|
332
|
+
return {
|
|
333
|
+
userSession: new sdk_lib_mpc_1.DklsDkg.Dkg(3, 2, typesMPCv2_1.MPCv2PartiesEnum.USER, undefined, retrofitData.mpcv2UserKeyShare),
|
|
334
|
+
backupSession: new sdk_lib_mpc_1.DklsDkg.Dkg(3, 2, typesMPCv2_1.MPCv2PartiesEnum.BACKUP, undefined, retrofitData.mpcv2BackupKeyShare),
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
return {
|
|
338
|
+
userSession: new sdk_lib_mpc_1.DklsDkg.Dkg(3, 2, typesMPCv2_1.MPCv2PartiesEnum.USER),
|
|
339
|
+
backupSession: new sdk_lib_mpc_1.DklsDkg.Dkg(3, 2, typesMPCv2_1.MPCv2PartiesEnum.BACKUP),
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
exports.EcdsaVrfMPCv2Utils = EcdsaVrfMPCv2Utils;
|
|
344
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2FWcmZNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWNkc2EvZWNkc2FWcmZNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFtRUEsb0RBZ0JDO0FBbkZELHlEQUFpRjtBQUNqRixtQ0FBZ0M7QUFDaEMsb0RBQTRCO0FBQzVCLDZDQUE2QztBQUM3QyxzREFBaUg7QUFLakgscURBQXdEO0FBRXhELDREQUE4RjtBQUM5Riw2Q0FBK0M7QUFDL0MscUVBQXFFO0FBQ3JFLDZDQUE4RTtBQUU5RTs7Ozs7R0FLRztBQUNILE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxDQUFDO0FBZW5DLFNBQVMsb0JBQW9CLENBQUMsUUFBd0M7SUFDcEUsTUFBTSxTQUFTLEdBQXlCO1FBQ3RDLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hILEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbEMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1lBQ1osRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO1lBQ1IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7U0FDbkQsQ0FBQyxDQUFDO0tBQ0osQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFD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Q0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSw2QkFBZ0IsQ0FBQyxJQUFJLENBQUM7WUFDekQsYUFBYSxFQUFFLElBQUkscUJBQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSw2QkFBZ0IsQ0FBQyxNQUFNLENBQUM7U0FDOUQsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQW5jRCxnREFtY0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEa2xzQ29tbXMsIERrbHNEa2csIERrbHNUeXBlcywgRGtsc1ZyZiB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCB7IGVuY29kZSB9IGZyb20gJ2Nib3IteCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBOb25FbXB0eVN0cmluZyB9IGZyb20gJ2lvLXRzLXR5cGVzJztcbmltcG9ydCB7IE1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2UsIE1QQ3YyS2V5R2VuUm91bmQyUmVzcG9uc2UsIE1QQ3YyS2V5R2VuU3RhdGVFbnVtIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5cbmltcG9ydCB7IEtleWNoYWluc1RyaXBsZXQgfSBmcm9tICcuLi8uLi8uLi9iYXNlQ29pbic7XG5pbXBvcnQgeyBEZWNyeXB0ZWRSZXRyb2ZpdFBheWxvYWQgfSBmcm9tICcuLi8uLi8uLi9rZXljaGFpbi9pS2V5Y2hhaW5zJztcbmltcG9ydCB7IEVuY3J5cHRpb25WZXJzaW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vYXBpJztcbmltcG9ydCB7IGdlbmVyYXRlR1BHS2V5UGFpciB9IGZyb20gJy4uLy4uL29wZW5ncGdVdGlscyc7XG5pbXBvcnQgeyBXZWJhdXRobktleUVuY3J5cHRpb25JbmZvIH0gZnJvbSAnLi4vLi4vLi4va2V5Y2hhaW4nO1xuaW1wb3J0IHsgZW52UmVxdWlyZXNCaXRnb1B1YkdwZ0tleUNvbmZpZywgaXNCaXRnb01wY1B1YktleSB9IGZyb20gJy4uLy4uLy4uL3Rzcy9iaXRnb1B1YktleXMnO1xuaW1wb3J0IHsgRWNkc2FNUEN2MlV0aWxzIH0gZnJvbSAnLi9lY2RzYU1QQ3YyJztcbmltcG9ydCB7IEtleUdlblNlbmRlckZvckVudGVycHJpc2UgfSBmcm9tICcuL2VjZHNhTVBDdjJLZXlHZW5TZW5kZXInO1xuaW1wb3J0IHsgTVBDdjJQYXJ0aWVzRW51bSwgTXBjVjJWcmZLZXlHZW5SZXNwb25zZUZpZWxkcyB9IGZyb20gJy4vdHlwZXNNUEN2Mic7XG5cbi8qKlxuICogVmVyc2lvbiBmaWVsZCBvZiB0aGUgYGVuY3J5cHRlZFBydmAgZW52ZWxvcGUgdXNlZCB3aGVuIGEgY2VyZW1vbnkgcHJvZHVjZXMgYm90aCBhXG4gKiBzaWduaW5nIGtleXNoYXJlIGFuZCBhIFZSRiBrZXlzaGFyZS4gVGhlIHBsYWludGV4dCBoYW5kZWQgdG8gZW5jcnlwdCgpIGlzXG4gKiBgYmFzZTY0KGNib3JFbmNvZGUoZW52ZWxvcGUpKWAsIGtlZXBpbmcgaXQgYSBzaW5nbGUgb3BhcXVlIGJhc2U2NCB0b2tlbiBleGFjdGx5IGFzXG4gKiB0aGUgb3JkaW5hcnkgTVBDdjIgZm9ybWF0IGRvZXMuXG4gKi9cbmNvbnN0IFZSRl9LRVlfRU5WRUxPUEVfVkVSU0lPTiA9IDE7XG5cbi8qKlxuICogV2lyZSBmb3JtYXQgZm9yIFZSRiBES0cgbWVzc2FnZXMgcmlkaW5nIHRoZSBNUEN2Mi1SMS9SMiBwYXlsb2FkczogYW4gb3BhcXVlIGJsb2IsXG4gKiBgYmFzZTY0KEpTT04uc3RyaW5naWZ5KFZyZk1lc3NhZ2VUcmFuc2ZlcltdKSlgLCBjYXJyeWluZyB0aGUgcGFydHkncyBmdWxsIGJhdGNoIG9mXG4gKiBlbWl0dGVkIG1lc3NhZ2VzLiBUaGUgVlJGIERLRyBlbWl0cyBicm9hZGNhc3QgY29tbWl0bWVudHMgKFIxKSBhbmQgcGVyLXJlY2lwaWVudFxuICogb3BlbmluZyBtZXNzYWdlcyBhZGRyZXNzZWQgdG8gZWFjaCBwYXJ0eSBpbmNsdWRpbmcgdGhlIHNlbmRlciAoUjIpLCBzbyB0aGUgcmVjZWl2aW5nXG4gKiBzaWRlIHJvdXRlcyBieSBgdG9gIGFuZCBrZWVwcyBtZXNzYWdlcyBhZGRyZXNzZWQgdG8gaXRzZWxmLlxuICovXG5pbnRlcmZhY2UgVnJmTWVzc2FnZVRyYW5zZmVyIHtcbiAgZnJvbTogbnVtYmVyO1xuICB0bz86IG51bWJlcjtcbiAgcGF5bG9hZDogc3RyaW5nOyAvLyBiYXNlNjRcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplVnJmTWVzc2FnZXMobWVzc2FnZXM6IERrbHNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlcyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyYW5zZmVyczogVnJmTWVzc2FnZVRyYW5zZmVyW10gPSBbXG4gICAgLi4ubWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMubWFwKChtKSA9PiAoeyBmcm9tOiBtLmZyb20sIHBheWxvYWQ6IEJ1ZmZlci5mcm9tKG0ucGF5bG9hZCkudG9TdHJpbmcoJ2Jhc2U2NCcpIH0pKSxcbiAgICAuLi5tZXNzYWdlcy5wMnBNZXNzYWdlcy5tYXAoKG0pID0+ICh7XG4gICAgICBmcm9tOiBtLmZyb20sXG4gICAgICB0bzogbS50byxcbiAgICAgIHBheWxvYWQ6IEJ1ZmZlci5mcm9tKG0ucGF5bG9hZCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIH0pKSxcbiAgXTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHRyYW5zZmVycykpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbn1cblxuZnVuY3Rpb24gZGVzZXJpYWxpemVWcmZNZXNzYWdlcyhibG9iOiBzdHJpbmcsIGZvclBhcnR5OiBudW1iZXIpOiBEa2xzVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZXMge1xuICBjb25zdCB0cmFuc2ZlcnM6IFZyZk1lc3NhZ2VUcmFuc2ZlcltdID0gSlNPTi5wYXJzZShCdWZmZXIuZnJvbShibG9iLCAnYmFzZTY0JykudG9TdHJpbmcoKSk7XG4gIHJldHVybiB7XG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IHRyYW5zZmVyc1xuICAgICAgLmZpbHRlcigodCkgPT4gdC50byA9PT0gdW5kZWZpbmVkKVxuICAgICAgLm1hcCgodCkgPT4gKHsgZnJvbTogdC5mcm9tLCBwYXlsb2FkOiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh0LnBheWxvYWQsICdiYXNlNjQnKSkgfSkpLFxuICAgIHAycE1lc3NhZ2VzOiB0cmFuc2ZlcnNcbiAgICAgIC5maWx0ZXIoKHQpOiB0IGlzIFZyZk1lc3NhZ2VUcmFuc2ZlciAmIHsgdG86IG51bWJlciB9ID0+IHQudG8gPT09IGZvclBhcnR5KVxuICAgICAgLm1hcCgodCkgPT4gKHsgZnJvbTogdC5mcm9tLCB0bzogdC50bywgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odC5wYXlsb2FkLCAnYmFzZTY0JykpIH0pKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDb21iaW5lcyB0aGUgc2lnbmluZyBrZXlzaGFyZSB3aXRoIHRoZSBWUkYga2V5c2hhcmUgaW50byB0aGUgYGVuY3J5cHRlZFBydmAgZW52ZWxvcGVcbiAqIChgYmFzZTY0KGNib3JFbmNvZGUoe3ZlcnNpb24sIHBydktleVNoYXJlLCB2cmZ9KSlgIG9uY2UgdGhlIGNhbGxlciBiYXNlNjQtZW5jb2RlcyB0aGVcbiAqIHJldHVybmVkIGJ1ZmZlcnMpLiBUaGUgc2FtZSBjb250YWluZXIgd3JhcHMgdGhlIHJlZHVjZWQgc2lnbmluZyBzaGFyZSBmb3JcbiAqIGByZWR1Y2VkRW5jcnlwdGVkUHJ2YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVnJmS2V5RW52ZWxvcGVzKFxuICBwcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbDogQnVmZmVyLFxuICB2cmZLZXlTaGFyZTogQnVmZmVyXG4pOiB7IGVudmVsb3BlOiBCdWZmZXI7IHJlZHVjZWRFbnZlbG9wZTogQnVmZmVyIH0ge1xuICBjb25zdCBlbnZlbG9wZSA9IGVuY29kZSh7XG4gICAgdmVyc2lvbjogVlJGX0tFWV9FTlZFTE9QRV9WRVJTSU9OLFxuICAgIHBydktleVNoYXJlOiBuZXcgVWludDhBcnJheShwcml2YXRlTWF0ZXJpYWwpLFxuICAgIHZyZjogbmV3IFVpbnQ4QXJyYXkodnJmS2V5U2hhcmUpLFxuICB9KTtcbiAgY29uc3QgcmVkdWNlZEVudmVsb3BlID0gZW5jb2RlKHtcbiAgICB2ZXJzaW9uOiBWUkZfS0VZX0VOVkVMT1BFX1ZFUlNJT04sXG4gICAgcHJ2S2V5U2hhcmU6IG5ldyBVaW50OEFycmF5KHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwpLFxuICAgIHZyZjogbmV3IFVpbnQ4QXJyYXkodnJmS2V5U2hhcmUpLFxuICB9KTtcbiAgcmV0dXJuIHsgZW52ZWxvcGU6IEJ1ZmZlci5mcm9tKGVudmVsb3BlKSwgcmVkdWNlZEVudmVsb3BlOiBCdWZmZXIuZnJvbShyZWR1Y2VkRW52ZWxvcGUpIH07XG59XG5cbi8qKlxuICogRWNkc2FNUEN2MlV0aWxzIHZhcmlhbnQgdGhhdCBydW5zIHRoZSBSaXN0cmV0dG8gVlJGIERLRyBhbG9uZ3NpZGUgdGhlIHNpZ25pbmcgREtMU1xuICogREtHIGluc2lkZSB0aGUgc2FtZSBNUEN2MiBrZXlnZW4gcm91bmRzLCBmb3Igc2FmZSBNUEMgcm9vdCBjcmVhdGlvbi5cbiAqXG4gKiBUaGUgcm91bmQgZW51bSBpcyB1bmNoYW5nZWQ6IHRoZSBWUkYgY29tbWl0bWVudCByaWRlcyBNUEN2Mi1SMSwgdGhlIG9wZW5pbmcgcmlkZXNcbiAqIE1QQ3YyLVIyLCBhbmQgdGhlIFZSRiBES0cgZmluYWxpemVzIGxvY2FsbHkgYmVmb3JlIE1QQ3YyLVIzLiBWUkYgbWVzc2FnZXMgdHJhdmVsIGFzXG4gKiBvcGFxdWUgYmFzZTY0IGZpZWxkcyBvbiB0aGUgcm91bmQgcGF5bG9hZHMsIG5ldmVyIHRocm91Z2ggdGhlIERLTFMgYnJvYWRjYXN0L3AycCBzbG90cy5cbiAqIEF0IHRoZSBlbmQsIHRoZSBzaWduaW5nIGFuZCBWUkYga2V5c2hhcmVzIGFyZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIENCT1IgZW52ZWxvcGVcbiAqIGJlZm9yZSBlbmNyeXB0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRWNkc2FWcmZNUEN2MlV0aWxzIGV4dGVuZHMgRWNkc2FNUEN2MlV0aWxzIHtcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIGNyZWF0ZUtleWNoYWlucyhwYXJhbXM6IHtcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgZW50ZXJwcmlzZTogc3RyaW5nO1xuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZztcbiAgICByZXRyb2ZpdD86IERlY3J5cHRlZFJldHJvZml0UGF5bG9hZDtcbiAgICB3ZWJhdXRobkluZm8/OiBXZWJhdXRobktleUVuY3J5cHRpb25JbmZvO1xuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb247XG4gICAgLy8gVGFncyB0aGUgcmVzdWx0aW5nIHVzZXIvYmFja3VwL2JpdGdvIHJvb3Qga2V5cyB3aXRoIHRoaXMgc2FmZS5cbiAgICBzYWZlSWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8S2V5Y2hhaW5zVHJpcGxldD4ge1xuICAgIGNvbnN0IHsgdXNlclNlc3Npb24sIGJhY2t1cFNlc3Npb24gfSA9IHRoaXMuZ2V0VXNlckFuZEJhY2t1cFNlc3Npb25zKHBhcmFtcy5yZXRyb2ZpdCk7XG4gICAgY29uc3QgdXNlclZyZlNlc3Npb24gPSBuZXcgRGtsc1ZyZi5WcmZEa2coMywgMiwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgICBjb25zdCBiYWNrdXBWcmZTZXNzaW9uID0gbmV3IERrbHNWcmYuVnJmRGtnKDMsIDIsIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQKTtcblxuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuICAgIGNvbnN0IGJhY2t1cEdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG5cbiAgICAvLyBHZXQgdGhlIEJpdEdvIHB1YmxpYyBrZXkgYmFzZWQgb24gdXNlci9lbnRlcnByaXNlIGZlYXR1cmUgZmxhZ3NcbiAgICAvLyBJZiBpdCBkb2Vzbid0IHdvcmssIHVzZSB0aGUgZGVmYXVsdCBwdWJsaWMga2V5IGZyb20gdGhlIGNvbnN0YW50c1xuICAgIGNvbnN0IHsgbXBjdjJQdWJsaWNLZXkgfSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29HcGdQdWJrZXlCYXNlZE9uRmVhdHVyZUZsYWdzKHBhcmFtcy5lbnRlcnByaXNlLCB0cnVlKTtcbiAgICBjb25zdCBtcGN2MktleSA9IG1wY3YyUHVibGljS2V5ID8/IHRoaXMuYml0Z29NUEN2MlB1YmxpY0dwZ0tleTtcbiAgICBhc3NlcnQobXBjdjJLZXksICdGYWlsZWQgdG8gZ2V0IEJpdEdvIE1QQ3YyIEdQRyBwdWJsaWMga2V5Jyk7XG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXkgPSBtcGN2MktleS5hcm1vcigpO1xuXG4gICAgaWYgKGVudlJlcXVpcmVzQml0Z29QdWJHcGdLZXlDb25maWcodGhpcy5iaXRnby5nZXRFbnYoKSkpIHtcbiAgICAgIC8vIEVuc3VyZSB0aGUgcHVibGljIGtleSBpcyBvbmUgb2YgdGhlIGV4cGVjdGVkIEJpdEdvIHB1YmxpYyBrZXlzIHdoZW4gaW4gdGVzdCBvciBwcm9kLlxuICAgICAgYXNzZXJ0KGlzQml0Z29NcGNQdWJLZXkoYml0Z29QdWJsaWNHcGdLZXksICdtcGN2MicpLCAnSW52YWxpZCBCaXRHbyBHUEcgcHVibGljIGtleScpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJHcGdQcnZLZXk6IERrbHNUeXBlcy5QYXJ0eUdwZ0tleSA9IHtcbiAgICAgIHBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgIGdwZ0tleTogdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgIH07XG4gICAgY29uc3QgYmFja3VwR3BnUHJ2S2V5OiBEa2xzVHlwZXMuUGFydHlHcGdLZXkgPSB7XG4gICAgICBwYXJ0eUlkOiBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCxcbiAgICAgIGdwZ0tleTogYmFja3VwR3BnS2V5LnByaXZhdGVLZXksXG4gICAgfTtcbiAgICBjb25zdCBiaXRnb0dwZ1B1YktleTogRGtsc1R5cGVzLlBhcnR5R3BnS2V5ID0ge1xuICAgICAgcGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgIGdwZ0tleTogYml0Z29QdWJsaWNHcGdLZXksXG4gICAgfTtcblxuICAgIC8vICNyZWdpb24gcm91bmQgMVxuICAgIGNvbnN0IHVzZXJSb3VuZDFCcm9hZGNhc3RNc2cgPSBhd2FpdCB1c2VyU2Vzc2lvbi5pbml0RGtnKCk7XG4gICAgY29uc3QgYmFja3VwUm91bmQxQnJvYWRjYXN0TXNnID0gYXdhaXQgYmFja3VwU2Vzc2lvbi5pbml0RGtnKCk7XG4gICAgY29uc3QgdXNlclZyZlJvdW5kMU1zZyA9IGF3YWl0IHVzZXJWcmZTZXNzaW9uLmluaXREa2coKTtcbiAgICBjb25zdCBiYWNrdXBWcmZSb3VuZDFNc2cgPSBhd2FpdCBiYWNrdXBWcmZTZXNzaW9uLmluaXREa2coKTtcblxuICAgIGNvbnN0IHJvdW5kMVNlcmlhbGl6ZWRNZXNzYWdlcyA9IERrbHNUeXBlcy5zZXJpYWxpemVNZXNzYWdlcyh7XG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW3VzZXJSb3VuZDFCcm9hZGNhc3RNc2csIGJhY2t1cFJvdW5kMUJyb2FkY2FzdE1zZ10sXG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgfSk7XG4gICAgY29uc3Qgcm91bmQxTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZW5jcnlwdEFuZEF1dGhPdXRnb2luZ01lc3NhZ2VzKFxuICAgICAgcm91bmQxU2VyaWFsaXplZE1lc3NhZ2VzLFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFt1c2VyR3BnUHJ2S2V5LCBiYWNrdXBHcGdQcnZLZXldXG4gICAgKTtcbiAgICBjb25zdCB1c2VyTXNnMSA9IHJvdW5kMU1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSKT8ucGF5bG9hZDtcbiAgICBjb25zdCBiYWNrdXBNc2cxID0gcm91bmQxTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk/LnBheWxvYWQ7XG4gICAgYXNzZXJ0KHVzZXJNc2cxLCAnVXNlciBtZXNzYWdlIDEgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuICAgIGFzc2VydChiYWNrdXBNc2cxLCAnQmFja3VwIG1lc3NhZ2UgMSBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG5cbiAgICBjb25zdCB1c2VyR3BnUHVibGljS2V5ID0gdXNlckdwZ0tleS5wdWJsaWNLZXk7XG4gICAgY29uc3QgYmFja3VwR3BnUHVibGljS2V5ID0gYmFja3VwR3BnS2V5LnB1YmxpY0tleTtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXModXNlckdwZ1B1YmxpY0tleSksICdVc2VyIEdQRyBwdWJsaWMga2V5IGlzIHJlcXVpcmVkJyk7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKGJhY2t1cEdwZ1B1YmxpY0tleSksICdCYWNrdXAgR1BHIHB1YmxpYyBrZXkgaXMgcmVxdWlyZWQnKTtcbiAgICAvLyBUaGUgcGxhdGZvcm0gZGVyaXZlcyB3aXRoVnJmIGZyb20gdGhlIHNhZmVJZCBvbiB0aGlzIHJlcXVlc3Q7IHRoZSBWUkYgbWVzc2FnZXMgcmlkZSBhcyBvcGFxdWUgYmxvYnMuXG4gICAgY29uc3Qgcm91bmQxU2VuZGVyID0gS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZTxNUEN2MktleUdlblJvdW5kMVJlc3BvbnNlICYgTXBjVjJWcmZLZXlHZW5SZXNwb25zZUZpZWxkcz4oXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgcGFyYW1zLmVudGVycHJpc2UsXG4gICAgICBwYXJhbXMuc2FmZUlkXG4gICAgKTtcbiAgICBjb25zdCB7IHNlc3Npb25JZCwgYml0Z29Nc2cxLCBiaXRnb1RvQmFja3VwTXNnMiwgYml0Z29Ub1VzZXJNc2cyLCBiaXRnb1ZyZk1zZzEgfSA9IGF3YWl0IHJvdW5kMVNlbmRlcihcbiAgICAgIE1QQ3YyS2V5R2VuU3RhdGVFbnVtWydNUEN2Mi1SMSddLFxuICAgICAge1xuICAgICAgICB1c2VyTXNnMTogeyBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsIC4uLnVzZXJNc2cxIH0sXG4gICAgICAgIGJhY2t1cE1zZzE6IHsgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsIC4uLmJhY2t1cE1zZzEgfSxcbiAgICAgICAgdXNlckdwZ1B1YmxpY0tleSxcbiAgICAgICAgYmFja3VwR3BnUHVibGljS2V5LFxuICAgICAgICB1c2VyVnJmTXNnMTogc2VyaWFsaXplVnJmTWVzc2FnZXModXNlclZyZlJvdW5kMU1zZyksXG4gICAgICAgIGJhY2t1cFZyZk1zZzE6IHNlcmlhbGl6ZVZyZk1lc3NhZ2VzKGJhY2t1cFZyZlJvdW5kMU1zZyksXG4gICAgICAgIHdhbGxldElkOiBwYXJhbXMucmV0cm9maXQ/LndhbGxldElkLFxuICAgICAgfVxuICAgICk7XG4gICAgYXNzZXJ0KGJpdGdvVnJmTXNnMSwgJ0JpdEdvIFZSRiBtZXNzYWdlIDEgbm90IGZvdW5kIGluIHJvdW5kIDEgcmVzcG9uc2UnKTtcbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAvLyAjcmVnaW9uIHJvdW5kIDJcbiAgICBjb25zdCBiaXRnb1JvdW5kMUJyb2FkY2FzdE1lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgeyBwMnBNZXNzYWdlczogW10sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbdGhpcy5mb3JtYXRCaXRnb0Jyb2FkY2FzdE1lc3NhZ2UoYml0Z29Nc2cxKV0gfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbdXNlckdwZ1BydktleSwgYmFja3VwR3BnUHJ2S2V5XVxuICAgICk7XG4gICAgY29uc3QgYml0Z29Sb3VuZDFCcm9hZGNhc3RNc2cgPSBiaXRnb1JvdW5kMUJyb2FkY2FzdE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQoYml0Z29Sb3VuZDFCcm9hZGNhc3RNc2csICdCaXRHbyBtZXNzYWdlIDEgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuXG4gICAgY29uc3QgdXNlclJvdW5kMlAyUE1lc3NhZ2VzID0gdXNlclNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW0RrbHNUeXBlcy5kZXNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UoYml0Z29Sb3VuZDFCcm9hZGNhc3RNc2cpLCBiYWNrdXBSb3VuZDFCcm9hZGNhc3RNc2ddLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdXNlclRvQml0Z29Nc2cyID0gdXNlclJvdW5kMlAyUE1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuICAgICk7XG4gICAgYXNzZXJ0KHVzZXJUb0JpdGdvTXNnMiwgJ1VzZXIgbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVXNlclRvQml0Z29Nc2cyID0gRGtsc1R5cGVzLnNlcmlhbGl6ZVAyUE1lc3NhZ2UodXNlclRvQml0Z29Nc2cyKTtcblxuICAgIGNvbnN0IGJhY2t1cFJvdW5kMlAyUE1lc3NhZ2VzID0gYmFja3VwU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbdXNlclJvdW5kMUJyb2FkY2FzdE1zZywgRGtsc1R5cGVzLmRlc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZShiaXRnb1JvdW5kMUJyb2FkY2FzdE1zZyldLFxuICAgIH0pO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCYWNrdXBUb0JpdGdvTXNnMiA9IERrbHNUeXBlcy5zZXJpYWxpemVNZXNzYWdlcyhiYWNrdXBSb3VuZDJQMlBNZXNzYWdlcykucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydChzZXJpYWxpemVkQmFja3VwVG9CaXRnb01zZzIsICdCYWNrdXAgbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcblxuICAgIC8vIFZSRjogY29uc3VtZSBCaXRHbydzIGFuZCB0aGUgY291bnRlcnBhcnR5J3MgY29tbWl0bWVudHMsIGVtaXQgdGhpcyBwYXJ0eSdzIG9wZW5pbmdzLlxuICAgIC8vIE9wZW5pbmdzIGNvbWUgYmFjayBhcyBwMnAgbWVzc2FnZXMgYWRkcmVzc2VkIHRvIGVhY2ggcGFydHkgKGluY2x1ZGluZyB0aGUgc2VuZGVyKS5cbiAgICBjb25zdCB1c2VyVnJmUm91bmQyTWVzc2FnZXMgPSBhd2FpdCB1c2VyVnJmU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXG4gICAgICAgIC4uLmJhY2t1cFZyZlJvdW5kMU1zZy5icm9hZGNhc3RNZXNzYWdlcyxcbiAgICAgICAgLi4uZGVzZXJpYWxpemVWcmZNZXNzYWdlcyhiaXRnb1ZyZk1zZzEsIE1QQ3YyUGFydGllc0VudW0uVVNFUikuYnJvYWRjYXN0TWVzc2FnZXMsXG4gICAgICBdLFxuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYmFja3VwVnJmUm91bmQyTWVzc2FnZXMgPSBhd2FpdCBiYWNrdXBWcmZTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtcbiAgICAgICAgLi4udXNlclZyZlJvdW5kMU1zZy5icm9hZGNhc3RNZXNzYWdlcyxcbiAgICAgICAgLi4uZGVzZXJpYWxpemVWcmZNZXNzYWdlcyhiaXRnb1ZyZk1zZzEsIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQKS5icm9hZGNhc3RNZXNzYWdlcyxcbiAgICAgIF0sXG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgfSk7XG5cbiAgICBjb25zdCByb3VuZDJNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5lbmNyeXB0QW5kQXV0aE91dGdvaW5nTWVzc2FnZXMoXG4gICAgICB7IHAycE1lc3NhZ2VzOiBbc2VyaWFsaXplZFVzZXJUb0JpdGdvTXNnMiwgc2VyaWFsaXplZEJhY2t1cFRvQml0Z29Nc2cyXSwgYnJvYWRjYXN0TWVzc2FnZXM6IFtdIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXksIGJhY2t1cEdwZ1BydktleV1cbiAgICApO1xuICAgIGNvbnN0IHVzZXJSb3VuZDJNc2cgPSByb3VuZDJNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGNvbnN0IGJhY2t1cFJvdW5kMk1zZyA9IHJvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQodXNlclJvdW5kMk1zZywgJ1VzZXIgdG8gQml0Z28gbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBhc3NlcnQodXNlclJvdW5kMk1zZy5jb21taXRtZW50LCAnVXNlciB0byBCaXRnbyBjb21taXRtZW50IG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBhc3NlcnQoYmFja3VwUm91bmQyTXNnLCAnQmFja3VwIHRvIEJpdGdvIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgYXNzZXJ0KGJhY2t1cFJvdW5kMk1zZy5jb21taXRtZW50LCAnQmFja3VwIHRvIEJpdGdvIGNvbW1pdG1lbnQgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyh1c2VyUm91bmQyTXNnLmNvbW1pdG1lbnQpLCAnVXNlciB0byBCaXRnbyBjb21taXRtZW50IGlzIHJlcXVpcmVkJyk7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKGJhY2t1cFJvdW5kMk1zZy5jb21taXRtZW50KSwgJ0JhY2t1cCB0byBCaXRnbyBjb21taXRtZW50IGlzIHJlcXVpcmVkJyk7XG4gICAgY29uc3Qgcm91bmQyU2VuZGVyID0gS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZTxNUEN2MktleUdlblJvdW5kMlJlc3BvbnNlICYgTXBjVjJWcmZLZXlHZW5SZXNwb25zZUZpZWxkcz4oXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgcGFyYW1zLmVudGVycHJpc2VcbiAgICApO1xuICAgIGNvbnN0IHtcbiAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkUm91bmQyLFxuICAgICAgYml0Z29Db21taXRtZW50MixcbiAgICAgIGJpdGdvVG9Vc2VyTXNnMyxcbiAgICAgIGJpdGdvVG9CYWNrdXBNc2czLFxuICAgICAgYml0Z29WcmZNc2cyLFxuICAgIH0gPSBhd2FpdCByb3VuZDJTZW5kZXIoTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyLVIyJ10sIHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHVzZXJNc2cyOiB7XG4gICAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgICAgdG86IE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICAgIHNpZ25hdHVyZTogdXNlclJvdW5kMk1zZy5wYXlsb2FkLnNpZ25hdHVyZSxcbiAgICAgICAgZW5jcnlwdGVkTWVzc2FnZTogdXNlclJvdW5kMk1zZy5wYXlsb2FkLmVuY3J5cHRlZE1lc3NhZ2UsXG4gICAgICB9LFxuICAgICAgdXNlckNvbW1pdG1lbnQyOiB1c2VyUm91bmQyTXNnLmNvbW1pdG1lbnQsXG4gICAgICBiYWNrdXBNc2cyOiB7XG4gICAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLFxuICAgICAgICB0bzogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgICAgc2lnbmF0dXJlOiBiYWNrdXBSb3VuZDJNc2cucGF5bG9hZC5zaWduYXR1cmUsXG4gICAgICAgIGVuY3J5cHRlZE1lc3NhZ2U6IGJhY2t1cFJvdW5kMk1zZy5wYXlsb2FkLmVuY3J5cHRlZE1lc3NhZ2UsXG4gICAgICB9LFxuICAgICAgYmFja3VwQ29tbWl0bWVudDI6IGJhY2t1cFJvdW5kMk1zZy5jb21taXRtZW50LFxuICAgICAgdXNlclZyZk1zZzI6IHNlcmlhbGl6ZVZyZk1lc3NhZ2VzKHVzZXJWcmZSb3VuZDJNZXNzYWdlcyksXG4gICAgICBiYWNrdXBWcmZNc2cyOiBzZXJpYWxpemVWcmZNZXNzYWdlcyhiYWNrdXBWcmZSb3VuZDJNZXNzYWdlcyksXG4gICAgfSk7XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiByb3VuZCAzXG4gICAgYXNzZXJ0LmVxdWFsKHNlc3Npb25JZCwgc2Vzc2lvbklkUm91bmQyLCAnUm91bmQgMSBhbmQgMiBTZXNzaW9uIElEcyBkbyBub3QgbWF0Y2gnKTtcbiAgICBhc3NlcnQoYml0Z29WcmZNc2cyLCAnQml0R28gVlJGIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gcm91bmQgMiByZXNwb25zZScpO1xuXG4gICAgLy8gVlJGOiBmaW5hbGl6ZSBib3RoIERLR3MgbG9jYWxseSBieSBjb25zdW1pbmcgdGhlIG9wZW5pbmcgbWVzc2FnZXMgYWRkcmVzc2VkIHRvIGVhY2hcbiAgICAvLyBwYXJ0eSAoaW5jbHVkaW5nIGVhY2ggcGFydHkncyBvd24pIGZyb20gdGhlIFIyIGV4Y2hhbmdlcy4gVGhlIFZSRiBES0cgY29tcGxldGVzIGhlcmUsXG4gICAgLy8gYSBmdWxsIHJvdW5kIG9mIHNsYWNrIGJlZm9yZSBNUEN2Mi1SMy5cbiAgICBhd2FpdCB1c2VyVnJmU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICAgIHAycE1lc3NhZ2VzOiBbXG4gICAgICAgIC4uLnVzZXJWcmZSb3VuZDJNZXNzYWdlcy5wMnBNZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiksXG4gICAgICAgIC4uLmJhY2t1cFZyZlJvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSKSxcbiAgICAgICAgLi4uZGVzZXJpYWxpemVWcmZNZXNzYWdlcyhiaXRnb1ZyZk1zZzIsIE1QQ3YyUGFydGllc0VudW0uVVNFUikucDJwTWVzc2FnZXMsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGF3YWl0IGJhY2t1cFZyZlNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgICBwMnBNZXNzYWdlczogW1xuICAgICAgICAuLi51c2VyVnJmUm91bmQyTWVzc2FnZXMucDJwTWVzc2FnZXMuZmlsdGVyKChtKSA9PiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCksXG4gICAgICAgIC4uLmJhY2t1cFZyZlJvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApLFxuICAgICAgICAuLi5kZXNlcmlhbGl6ZVZyZk1lc3NhZ2VzKGJpdGdvVnJmTXNnMiwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApLnAycE1lc3NhZ2VzLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGRlY3J5cHRlZEJpdGdvVG9Vc2VyUm91bmQyTXNncyA9IGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgIHsgcDJwTWVzc2FnZXM6IFt0aGlzLmZvcm1hdFAyUE1lc3NhZ2UoYml0Z29Ub1VzZXJNc2cyKV0sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFt1c2VyR3BnUHJ2S2V5XVxuICAgICk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQyTXNnID0gZGVjcnlwdGVkQml0Z29Ub1VzZXJSb3VuZDJNc2dzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUlxuICAgICk7XG4gICAgYXNzZXJ0KHNlcmlhbGl6ZWRCaXRnb1RvVXNlclJvdW5kMk1zZywgJ0JpdEdvIHRvIFVzZXIgbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBiaXRnb1RvVXNlclJvdW5kMk1zZyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZVAyUE1lc3NhZ2Uoc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQyTXNnKTtcblxuICAgIGNvbnN0IGRlY3J5cHRlZEJpdGdvVG9CYWNrdXBSb3VuZDJNc2cgPSBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICB7IHAycE1lc3NhZ2VzOiBbdGhpcy5mb3JtYXRQMlBNZXNzYWdlKGJpdGdvVG9CYWNrdXBNc2cyKV0sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFtiYWNrdXBHcGdQcnZLZXldXG4gICAgKTtcbiAgICBjb25zdCBzZXJpYWxpemVkQml0Z29Ub0JhY2t1cFJvdW5kMk1zZyA9IGRlY3J5cHRlZEJpdGdvVG9CYWNrdXBSb3VuZDJNc2cucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08gJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVBcbiAgICApO1xuICAgIGFzc2VydChzZXJpYWxpemVkQml0Z29Ub0JhY2t1cFJvdW5kMk1zZywgJ0JpdEdvIHRvIEJhY2t1cCBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJpdGdvVG9CYWNrdXBSb3VuZDJNc2cgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVQMlBNZXNzYWdlKHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQyTXNnKTtcblxuICAgIGNvbnN0IHVzZXJUb0JhY2t1cE1zZzIgPSB1c2VyUm91bmQyUDJQTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUFxuICAgICk7XG4gICAgYXNzZXJ0KHVzZXJUb0JhY2t1cE1zZzIsICdVc2VyIHRvIEJhY2t1cCBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuXG4gICAgY29uc3QgYmFja3VwVG9Vc2VyTXNnMiA9IGJhY2t1cFJvdW5kMlAyUE1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVJcbiAgICApO1xuICAgIGFzc2VydChiYWNrdXBUb1VzZXJNc2cyLCAnQmFja3VwIHRvIFVzZXIgbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcblxuICAgIGNvbnN0IHVzZXJSb3VuZDNNZXNzYWdlcyA9IHVzZXJTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgICAgcDJwTWVzc2FnZXM6IFtiaXRnb1RvVXNlclJvdW5kMk1zZywgYmFja3VwVG9Vc2VyTXNnMl0sXG4gICAgfSk7XG4gICAgY29uc3QgdXNlclRvQmFja3VwTXNnMyA9IHVzZXJSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQXG4gICAgKTtcbiAgICBhc3NlcnQodXNlclRvQmFja3VwTXNnMywgJ1VzZXIgdG8gQmFja3VwIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgdXNlclRvQml0Z29Nc2czID0gdXNlclJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuICAgICk7XG4gICAgYXNzZXJ0KHVzZXJUb0JpdGdvTXNnMywgJ1VzZXIgdG8gQml0Z28gbWVzc2FnZSAzIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVXNlclRvQml0Z29Nc2czID0gRGtsc1R5cGVzLnNlcmlhbGl6ZVAyUE1lc3NhZ2UodXNlclRvQml0Z29Nc2czKTtcblxuICAgIGNvbnN0IGJhY2t1cFJvdW5kM01lc3NhZ2VzID0gYmFja3VwU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICAgIHAycE1lc3NhZ2VzOiBbYml0Z29Ub0JhY2t1cFJvdW5kMk1zZywgdXNlclRvQmFja3VwTXNnMl0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBiYWNrdXBUb1VzZXJNc2czID0gYmFja3VwUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUlxuICAgICk7XG4gICAgYXNzZXJ0KGJhY2t1cFRvVXNlck1zZzMsICdCYWNrdXAgdG8gVXNlciBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJhY2t1cFRvQml0Z29Nc2czID0gYmFja3VwUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydChiYWNrdXBUb0JpdGdvTXNnMywgJ0JhY2t1cCB0byBCaXRnbyBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCYWNrdXBUb0JpdGdvTXNnMyA9IERrbHNUeXBlcy5zZXJpYWxpemVQMlBNZXNzYWdlKGJhY2t1cFRvQml0Z29Nc2czKTtcblxuICAgIGNvbnN0IGRlY3J5cHRlZEJpdGdvVG9Vc2VyUm91bmQzTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICB7IGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSwgcDJwTWVzc2FnZXM6IFt0aGlzLmZvcm1hdFAyUE1lc3NhZ2UoYml0Z29Ub1VzZXJNc2czLCBiaXRnb0NvbW1pdG1lbnQyKV0gfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbdXNlckdwZ1BydktleV1cbiAgICApO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCaXRnb1RvVXNlclJvdW5kM01zZyA9IGRlY3J5cHRlZEJpdGdvVG9Vc2VyUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08gJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSXG4gICAgKTtcbiAgICBhc3NlcnQoc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQzTXNnLCAnQml0R28gdG8gVXNlciBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJpdGdvVG9Vc2VyUm91bmQzTXNnID0gRGtsc1R5cGVzLmRlc2VyaWFsaXplUDJQTWVzc2FnZShzZXJpYWxpemVkQml0Z29Ub1VzZXJSb3VuZDNNc2cpO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkQml0Z29Ub0JhY2t1cFJvdW5kM01lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgeyBicm9hZGNhc3RNZXNzYWdlczogW10sIHAycE1lc3NhZ2VzOiBbdGhpcy5mb3JtYXRQMlBNZXNzYWdlKGJpdGdvVG9CYWNrdXBNc2czLCBiaXRnb0NvbW1pdG1lbnQyKV0gfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbYmFja3VwR3BnUHJ2S2V5XVxuICAgICk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJpdGdvVG9CYWNrdXBSb3VuZDNNc2cgPSBkZWNyeXB0ZWRCaXRnb1RvQmFja3VwUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08gJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVBcbiAgICApO1xuICAgIGFzc2VydChzZXJpYWxpemVkQml0Z29Ub0JhY2t1cFJvdW5kM01zZywgJ0JpdEdvIHRvIEJhY2t1cCBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJpdGdvVG9CYWNrdXBSb3VuZDNNc2cgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVQMlBNZXNzYWdlKHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQzTXNnKTtcblxuICAgIGNvbnN0IHVzZXJSb3VuZDRNZXNzYWdlcyA9IHVzZXJTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtiYWNrdXBUb1VzZXJNc2czLCBiaXRnb1RvVXNlclJvdW5kM01zZ10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgfSk7XG5cbiAgICBjb25zdCB1c2VyUm91bmQ0QnJvYWRjYXN0TXNnID0gdXNlclJvdW5kNE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgICBhc3NlcnQodXNlclJvdW5kNEJyb2FkY2FzdE1zZywgJ1VzZXIgbWVzc2FnZSA0IG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVXNlclJvdW5kNEJyb2FkY2FzdE1zZyA9IERrbHNUeXBlcy5zZXJpYWxpemVCcm9hZGNhc3RNZXNzYWdlKHVzZXJSb3VuZDRCcm9hZGNhc3RNc2cpO1xuXG4gICAgY29uc3QgYmFja3VwUm91bmQ0TWVzc2FnZXMgPSBiYWNrdXBTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFt1c2VyVG9CYWNrdXBNc2czLCBiaXRnb1RvQmFja3VwUm91bmQzTXNnXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcbiAgICBjb25zdCBiYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2cgPSBiYWNrdXBSb3VuZDRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVBcbiAgICApO1xuICAgIGFzc2VydChiYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2csICdCYWNrdXAgbWVzc2FnZSA0IG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBzZXJpYWxpemVkQmFja3VwUm91bmQ0QnJvYWRjYXN0TXNnID0gRGtsc1R5cGVzLnNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UoYmFja3VwUm91bmQ0QnJvYWRjYXN0TXNnKTtcblxuICAgIGNvbnN0IHJvdW5kM01lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmVuY3J5cHRBbmRBdXRoT3V0Z29pbmdNZXNzYWdlcyhcbiAgICAgIHtcbiAgICAgICAgcDJwTWVzc2FnZXM6IFtzZXJpYWxpemVkVXNlclRvQml0Z29Nc2czLCBzZXJpYWxpemVkQmFja3VwVG9CaXRnb01zZzNdLFxuICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogW3NlcmlhbGl6ZWRVc2VyUm91bmQ0QnJvYWRjYXN0TXNnLCBzZXJpYWxpemVkQmFja3VwUm91bmQ0QnJvYWRjYXN0TXNnXSxcbiAgICAgIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXksIGJhY2t1cEdwZ1BydktleV1cbiAgICApO1xuXG4gICAgY29uc3Qge1xuICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWRSb3VuZDMsXG4gICAgICBiaXRnb01zZzQsXG4gICAgICBjb21tb25LZXljaGFpbjogYml0Z29Db21tb25LZXljaGFpbixcbiAgICB9ID0gYXdhaXQgdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMyhwYXJhbXMuZW50ZXJwcmlzZSwgc2Vzc2lvbklkLCByb3VuZDNNZXNzYWdlcyk7XG5cbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAvLyAjcmVnaW9uIGtleWNoYWluIGNyZWF0aW9uXG4gICAgYXNzZXJ0LmVxdWFsKHNlc3Npb25JZCwgc2Vzc2lvbklkUm91bmQzLCAnUm91bmQgMSBhbmQgMyBTZXNzaW9uIElEcyBkbyBub3QgbWF0Y2gnKTtcbiAgICBjb25zdCBiaXRnb1JvdW5kNEJyb2FkY2FzdE1lc3NhZ2VzID0gRGtsc1R5cGVzLmRlc2VyaWFsaXplTWVzc2FnZXMoXG4gICAgICBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICAgIHsgcDJwTWVzc2FnZXM6IFtdLCBicm9hZGNhc3RNZXNzYWdlczogW3RoaXMuZm9ybWF0Qml0Z29Ccm9hZGNhc3RNZXNzYWdlKGJpdGdvTXNnNCldIH0sXG4gICAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICAgIFtdXG4gICAgICApXG4gICAgKS5icm9hZGNhc3RNZXNzYWdlcztcbiAgICBjb25zdCBiaXRnb1JvdW5kNEJyb2FkY2FzdE1zZyA9IGJpdGdvUm91bmQ0QnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPKTtcblxuICAgIGFzc2VydChiaXRnb1JvdW5kNEJyb2FkY2FzdE1zZywgJ0JpdEdvIG1lc3NhZ2UgNCBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG4gICAgdXNlclNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW2JpdGdvUm91bmQ0QnJvYWRjYXN0TXNnLCBiYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2ddLFxuICAgIH0pO1xuXG4gICAgYmFja3VwU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbYml0Z29Sb3VuZDRCcm9hZGNhc3RNc2csIHVzZXJSb3VuZDRCcm9hZGNhc3RNc2ddLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdXNlclByaXZhdGVNYXRlcmlhbCA9IHVzZXJTZXNzaW9uLmdldEtleVNoYXJlKCk7XG4gICAgY29uc3QgYmFja3VwUHJpdmF0ZU1hdGVyaWFsID0gYmFja3VwU2Vzc2lvbi5nZXRLZXlTaGFyZSgpO1xuICAgIGNvbnN0IHVzZXJSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gdXNlclNlc3Npb24uZ2V0UmVkdWNlZEtleVNoYXJlKCk7XG4gICAgY29uc3QgYmFja3VwUmVkdWNlZFByaXZhdGVNYXRlcmlhbCA9IGJhY2t1cFNlc3Npb24uZ2V0UmVkdWNlZEtleVNoYXJlKCk7XG4gICAgY29uc3QgdXNlclZyZktleVNoYXJlID0gdXNlclZyZlNlc3Npb24uZ2V0S2V5U2hhcmUoKTtcbiAgICBjb25zdCBiYWNrdXBWcmZLZXlTaGFyZSA9IGJhY2t1cFZyZlNlc3Npb24uZ2V0S2V5U2hhcmUoKTtcblxuICAgIGNvbnN0IHVzZXJDb21tb25LZXljaGFpbiA9IERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbih1c2VyUHJpdmF0ZU1hdGVyaWFsKTtcbiAgICBjb25zdCBiYWNrdXBDb21tb25LZXljaGFpbiA9IERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbihiYWNrdXBQcml2YXRlTWF0ZXJpYWwpO1xuXG4gICAgYXNzZXJ0LmVxdWFsKGJpdGdvQ29tbW9uS2V5Y2hhaW4sIHVzZXJDb21tb25LZXljaGFpbiwgJ1VzZXIgYW5kIEJpdGdvIENvbW1vbiBrZXljaGFpbnMgZG8gbm90IG1hdGNoJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGJpdGdvQ29tbW9uS2V5Y2hhaW4sIGJhY2t1cENvbW1vbktleWNoYWluLCAnQmFja3VwIGFuZCBCaXRnbyBDb21tb24ga2V5Y2hhaW5zIGRvIG5vdCBtYXRjaCcpO1xuXG4gICAgY29uc3QgeyBlbnZlbG9wZTogdXNlckVudmVsb3BlLCByZWR1Y2VkRW52ZWxvcGU6IHVzZXJSZWR1Y2VkRW52ZWxvcGUgfSA9IGJ1aWxkVnJmS2V5RW52ZWxvcGVzKFxuICAgICAgdXNlclByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHVzZXJSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgdXNlclZyZktleVNoYXJlXG4gICAgKTtcbiAgICBjb25zdCB7IGVudmVsb3BlOiBiYWNrdXBFbnZlbG9wZSwgcmVkdWNlZEVudmVsb3BlOiBiYWNrdXBSZWR1Y2VkRW52ZWxvcGUgfSA9IGJ1aWxkVnJmS2V5RW52ZWxvcGVzKFxuICAgICAgYmFja3VwUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgYmFja3VwUmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIGJhY2t1cFZyZktleVNoYXJlXG4gICAgKTtcblxuICAgIGNvbnN0IGVuY3J5cHRpb25TZXNzaW9uID1cbiAgICAgIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbiA9PT0gMiA/IGF3YWl0IHRoaXMuYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24ocGFyYW1zLnBhc3NwaHJhc2UpIDogdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1c2VyS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgICBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICAgIGJpdGdvQ29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIHVzZXJFbnZlbG9wZSxcbiAgICAgICAgdXNlclJlZHVjZWRFbnZlbG9wZSxcbiAgICAgICAgcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICAgIHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgIHBhcmFtcy53ZWJhdXRobkluZm8sXG4gICAgICAgIGVuY3J5cHRpb25TZXNzaW9uLFxuICAgICAgICBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgICBwYXJhbXMuc2FmZUlkXG4gICAgICApO1xuICAgICAgY29uc3QgYmFja3VwS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgICBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCxcbiAgICAgICAgYml0Z29Db21tb25LZXljaGFpbixcbiAgICAgICAgYmFja3VwRW52ZWxvcGUsXG4gICAgICAgIGJhY2t1cFJlZHVjZWRFbnZlbG9wZSxcbiAgICAgICAgcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICAgIHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgZW5jcnlwdGlvblNlc3Npb24sXG4gICAgICAgIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBwYXJhbXMuc2FmZUlkXG4gICAgICApO1xuICAgICAgY29uc3QgYml0Z29LZXljaGFpblByb21pc2UgPSB0aGlzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICAgIE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICAgIGJpdGdvQ29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBwYXJhbXMuc2FmZUlkXG4gICAgICApO1xuXG4gICAgICBjb25zdCBbdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHVzZXJLZXljaGFpblByb21pc2UsXG4gICAgICAgIGJhY2t1cEtleWNoYWluUHJvbWlzZSxcbiAgICAgICAgYml0Z29LZXljaGFpblByb21pc2UsXG4gICAgICBdKTtcbiAgICAgIC8vICNlbmRyZWdpb25cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcktleWNoYWluLFxuICAgICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVuY3J5cHRpb25TZXNzaW9uPy5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRVc2VyQW5kQmFja3VwU2Vzc2lvbnMocmV0cm9maXQ/OiBEZWNyeXB0ZWRSZXRyb2ZpdFBheWxvYWQpIHtcbiAgICBpZiAocmV0cm9maXQpIHtcbiAgICAgIGNvbnN0IHJldHJvZml0RGF0YSA9IHRoaXMuZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXlzKHtcbiAgICAgICAgbXBjdjFVc2VyS2V5U2hhcmU6IHJldHJvZml0LmRlY3J5cHRlZFVzZXJLZXksXG4gICAgICAgIG1wY3YxQmFja3VwS2V5U2hhcmU6IHJldHJvZml0LmRlY3J5cHRlZEJhY2t1cEtleSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlclNlc3Npb246IG5ldyBEa2xzRGtnLkRrZygzLCAyLCBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsIHVuZGVmaW5lZCwgcmV0cm9maXREYXRhLm1wY3YyVXNlcktleVNoYXJlKSxcbiAgICAgICAgYmFja3VwU2Vzc2lvbjogbmV3IERrbHNEa2cuRGtnKDMsIDIsIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLCB1bmRlZmluZWQsIHJldHJvZml0RGF0YS5tcGN2MkJhY2t1cEtleVNoYXJlKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB1c2VyU2Vzc2lvbjogbmV3IERrbHNEa2cuRGtnKDMsIDIsIE1QQ3YyUGFydGllc0VudW0uVVNFUiksXG4gICAgICBiYWNrdXBTZXNzaW9uOiBuZXcgRGtsc0RrZy5Ea2coMywgMiwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/bitgo/utils/tss/ecdsa/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/bitgo/utils/tss/ecdsa/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC"}
|
|
@@ -16,8 +16,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./ecdsa"), exports);
|
|
18
18
|
__exportStar(require("./ecdsaMPCv2"), exports);
|
|
19
|
+
__exportStar(require("./ecdsaVrfMPCv2"), exports);
|
|
19
20
|
__exportStar(require("./types"), exports);
|
|
20
21
|
__exportStar(require("./typesMPCv2"), exports);
|
|
21
22
|
__exportStar(require("./SMC/utils"), exports);
|
|
22
23
|
__exportStar(require("./ecdsaMPCv2KeyGenSender"), exports);
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VjZHNhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwwQ0FBd0I7QUFDeEIsK0NBQTZCO0FBQzdCLGtEQUFnQztBQUNoQywwQ0FBd0I7QUFDeEIsK0NBQTZCO0FBQzdCLDhDQUE0QjtBQUM1QiwyREFBeUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2VjZHNhJztcbmV4cG9ydCAqIGZyb20gJy4vZWNkc2FNUEN2Mic7XG5leHBvcnQgKiBmcm9tICcuL2VjZHNhVnJmTVBDdjInO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzTVBDdjInO1xuZXhwb3J0ICogZnJvbSAnLi9TTUMvdXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9lY2RzYU1QQ3YyS2V5R2VuU2VuZGVyJztcbiJdfQ==
|
|
@@ -58,7 +58,6 @@ export declare const generateMPCv2KeyRequestBody: t.UnionC<[t.TypeC<{
|
|
|
58
58
|
signature: t.StringC;
|
|
59
59
|
}>;
|
|
60
60
|
}>]>;
|
|
61
|
-
export type GenerateMPCv2KeyRequestBody = t.TypeOf<typeof generateMPCv2KeyRequestBody>;
|
|
62
61
|
export declare const generateMPCv2KeyRequestResponse: t.UnionC<[t.TypeC<{
|
|
63
62
|
walletGpgPubKeySigs: import("io-ts-types").NonEmptyStringC;
|
|
64
63
|
sessionId: import("io-ts-types").NonEmptyStringC;
|
|
@@ -103,5 +102,21 @@ export declare const generateMPCv2KeyRequestResponse: t.UnionC<[t.TypeC<{
|
|
|
103
102
|
signature: t.StringC;
|
|
104
103
|
}>;
|
|
105
104
|
}>]>;
|
|
106
|
-
|
|
105
|
+
/**
|
|
106
|
+
* Optional VRF DKG message fields carried on the MPCv2-R1/R2 keygen round payloads as
|
|
107
|
+
* opaque base64 blobs. Only set when the ceremony runs the VRF DKG alongside the
|
|
108
|
+
* signing DKG (safe root keys); ordinary TSS wallet creation payloads are unchanged.
|
|
109
|
+
*/
|
|
110
|
+
export type MpcV2VrfKeyGenRequestFields = {
|
|
111
|
+
userVrfMsg1?: string;
|
|
112
|
+
backupVrfMsg1?: string;
|
|
113
|
+
userVrfMsg2?: string;
|
|
114
|
+
backupVrfMsg2?: string;
|
|
115
|
+
};
|
|
116
|
+
export type MpcV2VrfKeyGenResponseFields = {
|
|
117
|
+
bitgoVrfMsg1?: string;
|
|
118
|
+
bitgoVrfMsg2?: string;
|
|
119
|
+
};
|
|
120
|
+
export type GenerateMPCv2KeyRequestBody = t.TypeOf<typeof generateMPCv2KeyRequestBody> & MpcV2VrfKeyGenRequestFields;
|
|
121
|
+
export type GenerateMPCv2KeyRequestResponse = t.TypeOf<typeof generateMPCv2KeyRequestResponse> & MpcV2VrfKeyGenResponseFields;
|
|
107
122
|
//# sourceMappingURL=typesMPCv2.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typesMPCv2.d.ts","sourceRoot":"","sources":["../../../../../../src/bitgo/utils/tss/ecdsa/typesMPCv2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAU3B,oBAAY,gBAAgB;IAC1B,IAAI,IAAI;IACR,MAAM,IAAI;IACV,KAAK,IAAI;CACV;AAED,eAAO,MAAM,2BAA2B;6BAZpB,aACf;+BACqB,aACf;cACG,EAAG,KAAK;cAEf,EAAG,MAAM,EAAE,EAAE,MAAM,EAAG,EAC3B,QAAK,KACL,EAAA,QAAQ,KACR,EAAC,QAAQ,OAGV,EAAG,IAAI;iBACL,EAAG,OAAO;mBACR,EAAG,OAAO;;gBACH,EAAG,KAAK;cAGjB,EAAI,MAAK,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,KAAI,
|
|
1
|
+
{"version":3,"file":"typesMPCv2.d.ts","sourceRoot":"","sources":["../../../../../../src/bitgo/utils/tss/ecdsa/typesMPCv2.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,4 +52,4 @@ exports.generateMPCv2KeyRequestResponse = t.union([
|
|
|
52
52
|
public_types_1.MPCv2KeyGenRound2Response,
|
|
53
53
|
public_types_1.MPCv2KeyGenRound3Response,
|
|
54
54
|
]);
|
|
55
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWNkc2EvdHlwZXNNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5Q0FBMkI7QUFDM0Isc0RBTzZCO0FBRTdCLElBQVksZ0JBSVg7QUFKRCxXQUFZLGdCQUFnQjtJQUMxQix1REFBUSxDQUFBO0lBQ1IsMkRBQVUsQ0FBQTtJQUNWLHlEQUFTLENBQUE7QUFDWCxDQUFDLEVBSlcsZ0JBQWdCLGdDQUFoQixnQkFBZ0IsUUFJM0I7QUFFWSxRQUFBLDJCQUEyQixHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDakQsdUNBQXdCO0lBQ3hCLHVDQUF3QjtJQUN4Qix1Q0FBd0I7Q0FDekIsQ0FBQyxDQUFDO0FBRVUsUUFBQSwrQkFBK0IsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3JELHdDQUF5QjtJQUN6Qix3Q0FBeUI7SUFDekIsd0NBQXlCO0NBQzFCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0IHtcbiAgTVBDdjJLZXlHZW5Sb3VuZDFSZXF1ZXN0LFxuICBNUEN2MktleUdlblJvdW5kMVJlc3BvbnNlLFxuICBNUEN2MktleUdlblJvdW5kMlJlcXVlc3QsXG4gIE1QQ3YyS2V5R2VuUm91bmQyUmVzcG9uc2UsXG4gIE1QQ3YyS2V5R2VuUm91bmQzUmVxdWVzdCxcbiAgTVBDdjJLZXlHZW5Sb3VuZDNSZXNwb25zZSxcbn0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5cbmV4cG9ydCBlbnVtIE1QQ3YyUGFydGllc0VudW0ge1xuICBVU0VSID0gMCxcbiAgQkFDS1VQID0gMSxcbiAgQklUR08gPSAyLFxufVxuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVNUEN2MktleVJlcXVlc3RCb2R5ID0gdC51bmlvbihbXG4gIE1QQ3YyS2V5R2VuUm91bmQxUmVxdWVzdCxcbiAgTVBDdjJLZXlHZW5Sb3VuZDJSZXF1ZXN0LFxuICBNUEN2MktleUdlblJvdW5kM1JlcXVlc3QsXG5dKTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlTVBDdjJLZXlSZXF1ZXN0UmVzcG9uc2UgPSB0LnVuaW9uKFtcbiAgTVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZSxcbiAgTVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZSxcbiAgTVBDdjJLZXlHZW5Sb3VuZDNSZXNwb25zZSxcbl0pO1xuXG4vKipcbiAqIE9wdGlvbmFsIFZSRiBES0cgbWVzc2FnZSBmaWVsZHMgY2FycmllZCBvbiB0aGUgTVBDdjItUjEvUjIga2V5Z2VuIHJvdW5kIHBheWxvYWRzIGFzXG4gKiBvcGFxdWUgYmFzZTY0IGJsb2JzLiBPbmx5IHNldCB3aGVuIHRoZSBjZXJlbW9ueSBydW5zIHRoZSBWUkYgREtHIGFsb25nc2lkZSB0aGVcbiAqIHNpZ25pbmcgREtHIChzYWZlIHJvb3Qga2V5cyk7IG9yZGluYXJ5IFRTUyB3YWxsZXQgY3JlYXRpb24gcGF5bG9hZHMgYXJlIHVuY2hhbmdlZC5cbiAqL1xuZXhwb3J0IHR5cGUgTXBjVjJWcmZLZXlHZW5SZXF1ZXN0RmllbGRzID0ge1xuICB1c2VyVnJmTXNnMT86IHN0cmluZztcbiAgYmFja3VwVnJmTXNnMT86IHN0cmluZztcbiAgdXNlclZyZk1zZzI/OiBzdHJpbmc7XG4gIGJhY2t1cFZyZk1zZzI/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBNcGNWMlZyZktleUdlblJlc3BvbnNlRmllbGRzID0ge1xuICBiaXRnb1ZyZk1zZzE/OiBzdHJpbmc7XG4gIGJpdGdvVnJmTXNnMj86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEdlbmVyYXRlTVBDdjJLZXlSZXF1ZXN0Qm9keSA9IHQuVHlwZU9mPHR5cGVvZiBnZW5lcmF0ZU1QQ3YyS2V5UmVxdWVzdEJvZHk+ICYgTXBjVjJWcmZLZXlHZW5SZXF1ZXN0RmllbGRzO1xuXG5leHBvcnQgdHlwZSBHZW5lcmF0ZU1QQ3YyS2V5UmVxdWVzdFJlc3BvbnNlID0gdC5UeXBlT2Y8dHlwZW9mIGdlbmVyYXRlTVBDdjJLZXlSZXF1ZXN0UmVzcG9uc2U+ICZcbiAgTXBjVjJWcmZLZXlHZW5SZXNwb25zZUZpZWxkcztcbiJdfQ==
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EddsaMPCv2KeyGenRound1Request, EddsaMPCv2KeyGenRound1Response, EddsaMPCv2KeyGenRound2Request, EddsaMPCv2KeyGenRound2Response, MPCv2PartyFromStringOrNumber } from '@bitgo/public-types';
|
|
2
2
|
import { EddsaMPCv2KeyGenCallbacks } from '../../../wallet/iWallets';
|
|
3
|
-
import { MPSTypes } from '@bitgo-beta/sdk-lib-mpc';
|
|
3
|
+
import { EddsaMPSDkg, MPSTypes } from '@bitgo-beta/sdk-lib-mpc';
|
|
4
4
|
import { KeychainsTriplet } from '../../../baseCoin';
|
|
5
5
|
import { DecryptedRetrofitPayload, Keychain, WebauthnKeyEncryptionInfo } from '../../../keychain';
|
|
6
6
|
import { MPCv2PartiesEnum } from '../ecdsa/typesMPCv2';
|
|
@@ -30,9 +30,9 @@ export declare class EddsaMPCv2Utils extends BaseEddsaUtils {
|
|
|
30
30
|
callbacks: EddsaMPCv2KeyGenCallbacks;
|
|
31
31
|
}): Promise<KeychainsTriplet>;
|
|
32
32
|
createParticipantKeychain(participantIndex: MPCv2PartyFromStringOrNumber, commonKeychain: string, privateMaterial?: Buffer, reducedPrivateMaterial?: Buffer, passphrase?: string, originalPasscodeEncryptionCode?: string, webauthnInfo?: WebauthnKeyEncryptionInfo, encryptionVersion?: EncryptionVersion, enterprise?: string, safeId?: string): Promise<Keychain>;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
protected addUserKeychain(commonKeychain: string, privateMaterial: Buffer, reducedPrivateMaterial: Buffer, passphrase: string, originalPasscodeEncryptionCode?: string, webauthnInfo?: WebauthnKeyEncryptionInfo, encryptionVersion?: EncryptionVersion, enterprise?: string, safeId?: string): Promise<Keychain>;
|
|
34
|
+
protected addBackupKeychain(commonKeychain: string, privateMaterial: Buffer, reducedPrivateMaterial: Buffer, passphrase: string, originalPasscodeEncryptionCode?: string, encryptionVersion?: EncryptionVersion, enterprise?: string, safeId?: string): Promise<Keychain>;
|
|
35
|
+
protected addBitgoKeychain(commonKeychain: string, safeId?: string): Promise<Keychain>;
|
|
36
36
|
sendKeyGenerationRound1(enterprise: string, payload: EddsaMPCv2KeyGenRound1Request & {
|
|
37
37
|
walletId?: string;
|
|
38
38
|
}, safeId?: string): Promise<EddsaMPCv2KeyGenRound1Response>;
|
|
@@ -111,7 +111,10 @@ export declare class EddsaMPCv2Utils extends BaseEddsaUtils {
|
|
|
111
111
|
}>;
|
|
112
112
|
/** @inheritdoc */
|
|
113
113
|
signEddsaMPCv2TssUsingExternalSigner(params: TSSParams | TSSParamsForMessage, externalSignerEddsaMPCv2SigningRound1Generator: CustomEddsaMPCv2SigningRound1GeneratingFunction, externalSignerEddsaMPCv2SigningRound2Generator: CustomEddsaMPCv2SigningRound2GeneratingFunction, externalSignerEddsaMPCv2SigningRound3Generator: CustomEddsaMPCv2SigningRound3GeneratingFunction, requestType?: RequestType): Promise<TxRequest>;
|
|
114
|
-
|
|
114
|
+
protected getUserAndBackupSession(retrofit?: DecryptedRetrofitPayload): Promise<{
|
|
115
|
+
userDkg: EddsaMPSDkg.DKG;
|
|
116
|
+
backupDkg: EddsaMPSDkg.DKG;
|
|
117
|
+
}>;
|
|
115
118
|
getMpcV2RetrofitDataFromMpcV1Keys(params: {
|
|
116
119
|
mpcv1UserKeyShare: string;
|
|
117
120
|
mpcv1BackupKeyShare: string;
|