@bitgo-beta/account-lib 2.24.1-alpha.49 → 2.24.1-alpha.490
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/README.md +1 -1
- package/dist/resources/dot/index.js +6 -2
- package/dist/resources/dot/westend.d.ts +1 -1
- package/dist/resources/dot/westend.d.ts.map +1 -1
- package/dist/resources/dot/westend.js +2 -2
- package/dist/resources/dot/westend.ts +1 -1
- package/dist/src/index.d.ts +112 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +263 -17
- package/dist/src/keyPair/index.js +24 -11
- package/dist/src/utils/index.d.ts +1 -0
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +27 -10
- package/dist/src/utils/messages/index.d.ts +10 -0
- package/dist/src/utils/messages/index.d.ts.map +1 -0
- package/dist/src/utils/messages/index.js +30 -0
- package/dist/test/resources/ed25519Deriver.d.ts +15 -0
- package/dist/test/resources/ed25519Deriver.d.ts.map +1 -0
- package/dist/test/resources/ed25519Deriver.js +18 -0
- package/dist/test/resources/testTransaction.d.ts +11 -0
- package/dist/test/resources/testTransaction.d.ts.map +1 -0
- package/dist/test/resources/testTransaction.js +19 -0
- package/dist/test/resources/testTransactionBuilder.d.ts +26 -0
- package/dist/test/resources/testTransactionBuilder.d.ts.map +1 -0
- package/dist/test/resources/testTransactionBuilder.js +47 -0
- package/dist/test/unit/coin/baseCoin/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/coin/baseCoin/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/coin/baseCoin/transactionBuilder.js +135 -0
- package/dist/test/unit/fixtures.d.ts +16 -0
- package/dist/test/unit/fixtures.d.ts.map +1 -0
- package/dist/test/unit/fixtures.js +43 -0
- package/dist/test/unit/index.d.ts +2 -0
- package/dist/test/unit/index.d.ts.map +1 -0
- package/dist/test/unit/index.js +13 -0
- package/dist/test/unit/keyPair/index.d.ts +2 -0
- package/dist/test/unit/keyPair/index.d.ts.map +1 -0
- package/dist/test/unit/keyPair/index.js +132 -0
- package/dist/test/unit/messageFactory.d.ts +2 -0
- package/dist/test/unit/messageFactory.d.ts.map +1 -0
- package/dist/test/unit/messageFactory.js +78 -0
- package/dist/test/unit/mpc/tss/ecdsa/ecdsa.d.ts +2 -0
- package/dist/test/unit/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -0
- package/dist/test/unit/mpc/tss/ecdsa/ecdsa.js +333 -0
- package/dist/test/unit/mpc/tss/eddsa/eddsa.d.ts +5 -0
- package/dist/test/unit/mpc/tss/eddsa/eddsa.d.ts.map +1 -0
- package/dist/test/unit/mpc/tss/eddsa/eddsa.js +322 -0
- package/dist/test/unit/mpc/tss/fixtures/ecdsa.d.ts +130 -0
- package/dist/test/unit/mpc/tss/fixtures/ecdsa.d.ts.map +1 -0
- package/dist/test/unit/mpc/tss/fixtures/ecdsa.js +283 -0
- package/dist/test/unit/utils/crypto.d.ts +2 -0
- package/dist/test/unit/utils/crypto.d.ts.map +1 -0
- package/dist/test/unit/utils/crypto.js +60 -0
- package/dist/test/unit/utils/ed25519KeyDeriver.d.ts +2 -0
- package/dist/test/unit/utils/ed25519KeyDeriver.d.ts.map +1 -0
- package/dist/test/unit/utils/ed25519KeyDeriver.js +23 -0
- package/dist/test/unit/utils/index.d.ts +2 -0
- package/dist/test/unit/utils/index.d.ts.map +1 -0
- package/dist/test/unit/utils/index.js +61 -0
- package/dist/test/unit/utils/messages/index.d.ts +2 -0
- package/dist/test/unit/utils/messages/index.d.ts.map +1 -0
- package/dist/test/unit/utils/messages/index.js +51 -0
- package/dist/test/unit/verifyMessage.d.ts +2 -0
- package/dist/test/unit/verifyMessage.d.ts.map +1 -0
- package/dist/test/unit/verifyMessage.js +96 -0
- package/dist/tsconfig.tsbuildinfo +1 -43553
- package/package.json +78 -32
- package/.mocharc.js +0 -10
- package/CHANGELOG.md +0 -389
- package/DEVELOPER.md +0 -93
- package/resources/README.md +0 -17
- package/resources/cspr/contract/keys-manager.wasm +0 -0
- package/resources/dot/index.ts +0 -2
- package/resources/dot/mainnet.ts +0 -2
- package/resources/dot/westend.ts +0 -2
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
/**
|
|
40
|
+
* @prettier
|
|
41
|
+
*/
|
|
42
|
+
const assert_1 = __importDefault(require("assert"));
|
|
43
|
+
const crypto_1 = require("crypto");
|
|
44
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
45
|
+
const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
|
|
46
|
+
const sinon = __importStar(require("sinon"));
|
|
47
|
+
const keccak_1 = __importDefault(require("keccak"));
|
|
48
|
+
const ecdsa_1 = require("../fixtures/ecdsa");
|
|
49
|
+
// Need to import and then monkey-patch to make stubbing work with ESM
|
|
50
|
+
const paillierBigintModule = require('paillier-bigint');
|
|
51
|
+
const paillierBigint = paillierBigintModule;
|
|
52
|
+
const schnorrModule = require('@bitgo-beta/sdk-lib-mpc');
|
|
53
|
+
const Schnorr = schnorrModule.Schnorr;
|
|
54
|
+
describe('TSS ECDSA TESTS', function () {
|
|
55
|
+
const MPC = new sdk_core_1.Ecdsa();
|
|
56
|
+
const base = BigInt('0x010000000000000000000000000000000000000000000000000000000000000000'); // 2^256
|
|
57
|
+
let keyShares;
|
|
58
|
+
let commonPublicKey;
|
|
59
|
+
const seed = Buffer.from('c4d1583a0b7b88626b56f0c83ee6df4d95d99cca73893ffb57c5e4411fa1b2b9c87456080e8d3f03462f065688abc28be2d4af3164d593c50b55269b435ea48d', 'hex');
|
|
60
|
+
let A, B, C;
|
|
61
|
+
before(async () => {
|
|
62
|
+
// Direct monkey patching of the module for ESM compatibility
|
|
63
|
+
const originalGenerateRandomKeys = paillierBigint.generateRandomKeys;
|
|
64
|
+
const paillierMock = sinon.stub();
|
|
65
|
+
paillierMock
|
|
66
|
+
.onCall(0)
|
|
67
|
+
.resolves(ecdsa_1.paillerKeys[0])
|
|
68
|
+
.onCall(1)
|
|
69
|
+
.resolves(ecdsa_1.paillerKeys[1])
|
|
70
|
+
.onCall(2)
|
|
71
|
+
.resolves(ecdsa_1.paillerKeys[2])
|
|
72
|
+
.onCall(3)
|
|
73
|
+
.resolves(ecdsa_1.paillerKeys[0])
|
|
74
|
+
.onCall(4)
|
|
75
|
+
.resolves(ecdsa_1.paillerKeys[1])
|
|
76
|
+
.onCall(5)
|
|
77
|
+
.resolves(ecdsa_1.paillerKeys[2]);
|
|
78
|
+
// Replace the function directly on the module
|
|
79
|
+
paillierBigint.generateRandomKeys = paillierMock;
|
|
80
|
+
// Save references to restore later
|
|
81
|
+
paillierMock.originalFn = originalGenerateRandomKeys;
|
|
82
|
+
// Apply the same monkey-patching approach for Schnorr
|
|
83
|
+
const originalCreateSchnorrProof = Schnorr.createSchnorrProof;
|
|
84
|
+
const schnorrProofMock = sinon.stub();
|
|
85
|
+
schnorrProofMock
|
|
86
|
+
.onCall(0)
|
|
87
|
+
.returns(ecdsa_1.schnorrProofs[0])
|
|
88
|
+
.onCall(1)
|
|
89
|
+
.returns(ecdsa_1.schnorrProofs[1])
|
|
90
|
+
.onCall(2)
|
|
91
|
+
.returns(ecdsa_1.schnorrProofs[2])
|
|
92
|
+
.onCall(3)
|
|
93
|
+
.returns(ecdsa_1.schnorrProofs[3])
|
|
94
|
+
.onCall(4)
|
|
95
|
+
.returns(ecdsa_1.schnorrProofs[4])
|
|
96
|
+
.onCall(5)
|
|
97
|
+
.returns(ecdsa_1.schnorrProofs[5]);
|
|
98
|
+
// Replace the function directly on the module
|
|
99
|
+
Schnorr.createSchnorrProof = schnorrProofMock;
|
|
100
|
+
// Save references to restore later
|
|
101
|
+
schnorrProofMock.originalFn = originalCreateSchnorrProof;
|
|
102
|
+
[A, B, C] = await Promise.all([MPC.keyShare(1, 2, 3), MPC.keyShare(2, 2, 3), MPC.keyShare(3, 2, 3)]);
|
|
103
|
+
// Needs to run this serially for testing deterministic key generation
|
|
104
|
+
// to get specific paillier keys to be assigned
|
|
105
|
+
const D = await MPC.keyShare(1, 2, 3, seed);
|
|
106
|
+
const E = await MPC.keyShare(2, 2, 3, seed);
|
|
107
|
+
const F = await MPC.keyShare(3, 2, 3, seed);
|
|
108
|
+
const aKeyCombine = MPC.keyCombine(A.pShare, [B.nShares[1], C.nShares[1]]);
|
|
109
|
+
const bKeyCombine = MPC.keyCombine(B.pShare, [A.nShares[2], C.nShares[2]]);
|
|
110
|
+
const cKeyCombine = MPC.keyCombine(C.pShare, [A.nShares[3], B.nShares[3]]);
|
|
111
|
+
// Shares with specific seeds
|
|
112
|
+
const dKeyCombine = MPC.keyCombine(D.pShare, [E.nShares[1], F.nShares[1]]);
|
|
113
|
+
const eKeyCombine = MPC.keyCombine(E.pShare, [D.nShares[2], F.nShares[2]]);
|
|
114
|
+
const fKeyCombine = MPC.keyCombine(F.pShare, [D.nShares[3], E.nShares[3]]);
|
|
115
|
+
// Shares for derived keys.
|
|
116
|
+
const path = 'm/0/1';
|
|
117
|
+
const aKeyDerive = MPC.keyDerive(A.pShare, [B.nShares[1], C.nShares[1]], path);
|
|
118
|
+
const gKeyCombine = {
|
|
119
|
+
xShare: aKeyDerive.xShare,
|
|
120
|
+
yShares: aKeyCombine.yShares,
|
|
121
|
+
};
|
|
122
|
+
const hKeyCombine = MPC.keyCombine(B.pShare, [aKeyDerive.nShares[2], C.nShares[2]]);
|
|
123
|
+
keyShares = [
|
|
124
|
+
aKeyCombine,
|
|
125
|
+
bKeyCombine,
|
|
126
|
+
cKeyCombine,
|
|
127
|
+
dKeyCombine,
|
|
128
|
+
eKeyCombine,
|
|
129
|
+
fKeyCombine,
|
|
130
|
+
gKeyCombine,
|
|
131
|
+
hKeyCombine,
|
|
132
|
+
];
|
|
133
|
+
commonPublicKey = aKeyCombine.xShare.y;
|
|
134
|
+
// Adding an explicit assertion to check if the stub was used
|
|
135
|
+
paillierMock.callCount.should.equal(6, 'paillierMock should be called 6 times');
|
|
136
|
+
schnorrProofMock.callCount.should.equal(8, 'schnorrProofMock should be called 6 times');
|
|
137
|
+
// Restore original functions
|
|
138
|
+
paillierBigint.generateRandomKeys = paillierMock.originalFn;
|
|
139
|
+
Schnorr.createSchnorrProof = schnorrProofMock.originalFn;
|
|
140
|
+
});
|
|
141
|
+
describe('Ecdsa Key Generation Test', function () {
|
|
142
|
+
it('should generate keys with correct threshold and share number', async function () {
|
|
143
|
+
for (let index = 0; index < 3; index++) {
|
|
144
|
+
const participantOne = (index % 3) + 1;
|
|
145
|
+
const participantTwo = ((index + 1) % 3) + 1;
|
|
146
|
+
const participantThree = ((index + 2) % 3) + 1;
|
|
147
|
+
keyShares[index].xShare.i.should.equal(participantOne);
|
|
148
|
+
keyShares[index].xShare.y.should.equal(commonPublicKey);
|
|
149
|
+
keyShares[index].xShare.m.should.not.be.Null;
|
|
150
|
+
keyShares[index].xShare.l.should.not.be.Null;
|
|
151
|
+
keyShares[index].xShare.n.should.not.be.Null;
|
|
152
|
+
const chaincode = BigInt('0x' + keyShares[index].xShare.chaincode);
|
|
153
|
+
const isChainCodeValid = chaincode > BigInt(0) && chaincode <= base;
|
|
154
|
+
isChainCodeValid.should.equal(true);
|
|
155
|
+
keyShares[index].yShares[participantTwo].i.should.equal(participantOne);
|
|
156
|
+
keyShares[index].yShares[participantThree].i.should.equal(participantOne);
|
|
157
|
+
keyShares[index].yShares[participantTwo].j.should.equal(participantTwo);
|
|
158
|
+
keyShares[index].yShares[participantThree].j.should.equal(participantThree);
|
|
159
|
+
keyShares[index].yShares[participantTwo].n.should.not.be.Null;
|
|
160
|
+
keyShares[index].yShares[participantThree].n.should.not.be.Null;
|
|
161
|
+
const publicKeyPrefix = keyShares[index].xShare.y.slice(0, 2);
|
|
162
|
+
const isRightPrefix = publicKeyPrefix === '03' || publicKeyPrefix === '02';
|
|
163
|
+
isRightPrefix.should.equal(true);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
it('should generate keyshares with specific seed', async function () {
|
|
167
|
+
// Keys should be deterministic when using seed
|
|
168
|
+
const [, , , D, E, F] = keyShares;
|
|
169
|
+
assert_1.default.deepEqual(D, ecdsa_1.mockDKeyShare);
|
|
170
|
+
assert_1.default.deepEqual(E, ecdsa_1.mockEKeyShare);
|
|
171
|
+
assert_1.default.deepEqual(F, ecdsa_1.mockFKeyShare);
|
|
172
|
+
});
|
|
173
|
+
it('should fail if seed is length less than 64 bytes', async function () {
|
|
174
|
+
await MPC.keyShare(1, 2, 3, (0, crypto_1.randomBytes)(16)).should.be.rejectedWith('Seed must have a length of at least 64 bytes');
|
|
175
|
+
await MPC.keyShare(1, 2, 3, (0, crypto_1.randomBytes)(32)).should.be.rejectedWith('Seed must have a length of at least 64 bytes');
|
|
176
|
+
});
|
|
177
|
+
it('should pass if seed length is greater than 64', async function () {
|
|
178
|
+
const paillierMock = sinon.stub(paillierBigint, 'generateRandomKeys').onCall(0).resolves(ecdsa_1.paillerKeys[0]);
|
|
179
|
+
const seed72Bytes = Buffer.from('4f7e914dc9ec696398675d1544aab61cb7a67662ffcbdb4079ec5d682be565d87c1b2de75c943dec14c96586984860268779498e6732473aed9ed9c2538f50bea0af926bdccc0134', 'hex');
|
|
180
|
+
(await MPC.keyShare(1, 2, 3, seed72Bytes)).pShare.u.length.should.equal(64);
|
|
181
|
+
paillierMock.restore();
|
|
182
|
+
});
|
|
183
|
+
it('should calculate correct chaincode while combining', async function () {
|
|
184
|
+
const keyCombine = MPC.keyCombine(ecdsa_1.mockPShare, ecdsa_1.mockNShares);
|
|
185
|
+
keyCombine.xShare.chaincode.should.equal('fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc32');
|
|
186
|
+
});
|
|
187
|
+
it('should fail to generate keys with invalid threshold and share number', async function () {
|
|
188
|
+
const invalidConfigs = [
|
|
189
|
+
{ index: 1, threshold: 5, numShares: 3 },
|
|
190
|
+
{ index: -1, threshold: 2, numShares: 3 },
|
|
191
|
+
{ index: 1, threshold: 2, numShares: 1 },
|
|
192
|
+
];
|
|
193
|
+
for (let index = 0; index < invalidConfigs.length; index++) {
|
|
194
|
+
try {
|
|
195
|
+
await MPC.keyShare(invalidConfigs[index].index, invalidConfigs[index].threshold, invalidConfigs[index].numShares);
|
|
196
|
+
}
|
|
197
|
+
catch (e) {
|
|
198
|
+
e.should.equal('Invalid KeyShare Config');
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
it('should derive unhardened child keys', async function () {
|
|
203
|
+
// parent key
|
|
204
|
+
const aKeyCombine = keyShares[0];
|
|
205
|
+
const commonKeychain = aKeyCombine.xShare.y + aKeyCombine.xShare.chaincode;
|
|
206
|
+
for (let index = 0; index < 10; index++) {
|
|
207
|
+
const path = `m/0/0/${index}`;
|
|
208
|
+
const subkey = MPC.keyDerive(A.pShare, [B.nShares[1], C.nShares[1]], path);
|
|
209
|
+
const derive1 = MPC.deriveUnhardened(commonKeychain, path);
|
|
210
|
+
const derive2 = MPC.deriveUnhardened(commonKeychain, path);
|
|
211
|
+
derive1.should.equal(derive2, 'derivation should be deterministic');
|
|
212
|
+
(subkey.xShare.y + subkey.xShare.chaincode).should.equal(derive1, 'subkey common keychain should match derived keychain');
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
describe('ECDSA Signing', async function () {
|
|
217
|
+
let config;
|
|
218
|
+
before(() => {
|
|
219
|
+
const [A, B, C, D, E, F, G, H] = keyShares;
|
|
220
|
+
config = [
|
|
221
|
+
{ signerOne: A, signerTwo: B },
|
|
222
|
+
{ signerOne: A, signerTwo: C },
|
|
223
|
+
{ signerOne: B, signerTwo: A },
|
|
224
|
+
{ signerOne: B, signerTwo: C },
|
|
225
|
+
{ signerOne: C, signerTwo: A },
|
|
226
|
+
{ signerOne: C, signerTwo: B },
|
|
227
|
+
// Checks signing with specific seed
|
|
228
|
+
{ signerOne: D, signerTwo: E },
|
|
229
|
+
{ signerOne: E, signerTwo: F },
|
|
230
|
+
{ signerOne: F, signerTwo: D },
|
|
231
|
+
// Checks with specific hashing algorithm
|
|
232
|
+
{ signerOne: A, signerTwo: B, hash: 'keccak256' },
|
|
233
|
+
// checks with no hashing
|
|
234
|
+
{ signerOne: A, signerTwo: B, shouldHash: false },
|
|
235
|
+
// Checks with derived subkey
|
|
236
|
+
{ signerOne: G, signerTwo: H },
|
|
237
|
+
];
|
|
238
|
+
});
|
|
239
|
+
for (let index = 0; index < 9; index++) {
|
|
240
|
+
it(`should properly sign the message case ${index}`, async function () {
|
|
241
|
+
// Step One
|
|
242
|
+
// signerOne, signerTwo have decided to sign the message
|
|
243
|
+
const signerOne = config[index].signerOne;
|
|
244
|
+
const signerOneIndex = signerOne.xShare.i;
|
|
245
|
+
const signerTwo = config[index].signerTwo;
|
|
246
|
+
const signerTwoIndex = signerTwo.xShare.i;
|
|
247
|
+
const [signerOneToTwoPaillierChallenge, signerTwoToOnePaillierChallenge] = await Promise.all([
|
|
248
|
+
sdk_lib_mpc_1.EcdsaPaillierProof.generateP((0, sdk_core_1.hexToBigInt)(signerOne.yShares[signerTwoIndex].n)),
|
|
249
|
+
sdk_lib_mpc_1.EcdsaPaillierProof.generateP((0, sdk_core_1.hexToBigInt)(signerTwo.yShares[signerOneIndex].n)),
|
|
250
|
+
]);
|
|
251
|
+
// Step Two
|
|
252
|
+
// First signer generates their range proof challenge.
|
|
253
|
+
const signerOneXShare = MPC.appendChallenge(signerOne.xShare, sdk_lib_mpc_1.EcdsaTypes.serializeNtilde(ecdsa_1.ntildes[index]), sdk_lib_mpc_1.EcdsaTypes.serializePaillierChallenge({ p: signerOneToTwoPaillierChallenge }));
|
|
254
|
+
// Step Three
|
|
255
|
+
// Second signer generates their range proof challenge.
|
|
256
|
+
const signerTwoXShare = MPC.appendChallenge(signerTwo.xShare, sdk_lib_mpc_1.EcdsaTypes.serializeNtilde(ecdsa_1.ntildes[index + 1]), sdk_lib_mpc_1.EcdsaTypes.serializePaillierChallenge({ p: signerTwoToOnePaillierChallenge }));
|
|
257
|
+
const signerTwoChallenge = { ntilde: signerTwoXShare.ntilde, h1: signerTwoXShare.h1, h2: signerTwoXShare.h2 };
|
|
258
|
+
// Step Four
|
|
259
|
+
// First signer receives the challenge from the second signer and appends it to their YShare
|
|
260
|
+
const signerTwoYShare = MPC.appendChallenge(signerOne.yShares[signerTwoIndex], signerTwoChallenge, sdk_lib_mpc_1.EcdsaTypes.serializePaillierChallenge({ p: signerTwoToOnePaillierChallenge }));
|
|
261
|
+
// Step Five
|
|
262
|
+
// Sign Shares are created by one of the participants (signerOne)
|
|
263
|
+
// with its private XShare and YShare corresponding to the other participant (signerTwo)
|
|
264
|
+
// This step produces a private WShare which signerOne saves and KShare which signerOne sends to signerTwo
|
|
265
|
+
const signShares = await MPC.signShare(signerOneXShare, signerTwoYShare);
|
|
266
|
+
// Step Six
|
|
267
|
+
// signerTwo receives the KShare from signerOne and uses it produce private
|
|
268
|
+
// BShare (Beta Share) which signerTwo saves and AShare (Alpha Share)
|
|
269
|
+
// which is sent to signerOne
|
|
270
|
+
const signConvertS21 = await MPC.signConvertStep1({
|
|
271
|
+
xShare: signerTwoXShare,
|
|
272
|
+
yShare: signerTwo.yShares[signerOneIndex], // YShare corresponding to the other participant signerOne
|
|
273
|
+
kShare: signShares.kShare,
|
|
274
|
+
});
|
|
275
|
+
// Step Seven
|
|
276
|
+
// signerOne receives the AShare from signerTwo and signerOne using the private WShare from step two
|
|
277
|
+
// uses it produce private GShare (Gamma Share) and MUShare (Mu Share) which
|
|
278
|
+
// is sent to signerTwo to produce its Gamma Share
|
|
279
|
+
const signConvertS12 = await MPC.signConvertStep2({
|
|
280
|
+
aShare: signConvertS21.aShare,
|
|
281
|
+
wShare: signShares.wShare,
|
|
282
|
+
});
|
|
283
|
+
// Step Eight
|
|
284
|
+
// signerTwo receives the MUShare from signerOne and signerOne using the private BShare from step three
|
|
285
|
+
// uses it produce private GShare (Gamma Share)
|
|
286
|
+
const signConvertS21_2 = await MPC.signConvertStep3({
|
|
287
|
+
muShare: signConvertS12.muShare,
|
|
288
|
+
bShare: signConvertS21.bShare,
|
|
289
|
+
});
|
|
290
|
+
// Step Nine
|
|
291
|
+
// signerOne and signerTwo both have successfully generated GShares and they use
|
|
292
|
+
// the sign combine function to generate their private omicron shares and
|
|
293
|
+
// delta shares which they share to each other
|
|
294
|
+
const [signCombineOne, signCombineTwo] = [
|
|
295
|
+
MPC.signCombine({
|
|
296
|
+
gShare: signConvertS12.gShare,
|
|
297
|
+
signIndex: {
|
|
298
|
+
i: signConvertS12.muShare.i,
|
|
299
|
+
j: signConvertS12.muShare.j,
|
|
300
|
+
},
|
|
301
|
+
}),
|
|
302
|
+
MPC.signCombine({
|
|
303
|
+
gShare: signConvertS21_2.gShare,
|
|
304
|
+
signIndex: {
|
|
305
|
+
i: signConvertS21_2.signIndex.i,
|
|
306
|
+
j: signConvertS21_2.signIndex.j,
|
|
307
|
+
},
|
|
308
|
+
}),
|
|
309
|
+
];
|
|
310
|
+
const MESSAGE = Buffer.from('TOO MANY SECRETS');
|
|
311
|
+
// Step Ten
|
|
312
|
+
// signerOne and signerTwo shares the delta share from each other
|
|
313
|
+
// and finally signs the message using their private OShare
|
|
314
|
+
// and delta share received from the other signer
|
|
315
|
+
const hashGenerator = (hashType) => {
|
|
316
|
+
return hashType === 'keccak256' ? (0, keccak_1.default)('keccak256') : undefined;
|
|
317
|
+
};
|
|
318
|
+
const [signA, signB] = [
|
|
319
|
+
MPC.sign(MESSAGE, signCombineOne.oShare, signCombineTwo.dShare, hashGenerator(config[index].hash), config[index].shouldHash),
|
|
320
|
+
MPC.sign(MESSAGE, signCombineTwo.oShare, signCombineOne.dShare, hashGenerator(config[index].hash), config[index].shouldHash),
|
|
321
|
+
];
|
|
322
|
+
// Step Eleven
|
|
323
|
+
// Construct the final signature
|
|
324
|
+
const signature = MPC.constructSignature([signA, signB]);
|
|
325
|
+
// Step Twelve
|
|
326
|
+
// Verify signature
|
|
327
|
+
const isValid = MPC.verify(MESSAGE, signature, hashGenerator(config[index].hash), config[index].shouldHash);
|
|
328
|
+
isValid.should.equal(true);
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvbXBjL3Rzcy9lY2RzYS9lY2RzYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsb0RBQTRCO0FBQzVCLG1DQUEyQztBQUMzQyxtREFBaUU7QUFDakUseURBQXVGO0FBQ3ZGLDZDQUErQjtBQUMvQixvREFBc0M7QUFDdEMsNkNBUzJCO0FBRTNCLHNFQUFzRTtBQUN0RSxNQUFNLG9CQUFvQixHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3hELE1BQU0sY0FBYyxHQUFHLG9CQUFvQixDQUFDO0FBQzVDLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0FBQ3pELE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7QUFFdEMsUUFBUSxDQUFDLGlCQUFpQixFQUFFO0lBQzFCLE1BQU0sR0FBRyxHQUFHLElBQUksZ0JBQUssRUFBRSxDQUFDO0lBQ3hCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDLENBQUMsUUFBUTtJQUNyRyxJQUFJLFNBQThCLENBQUM7SUFDbkMsSUFBSSxlQUF1QixDQUFDO0lBQzVCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQ3RCLGtJQUFrSSxFQUNsSSxLQUFLLENBQ04sQ0FBQztJQUNGLElBQUksQ0FBaUIsRUFBRSxDQUFpQixFQUFFLENBQWlCLENBQUM7SUFDNUQsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2hCLDZEQUE2RDtRQUM3RCxNQUFNLDBCQUEwQixHQUFHLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQztRQUVyRSxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEMsWUFBWTthQUNULE1BQU0s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TyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRSxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0UsNkJBQTZCO1FBQzdCLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRSxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNFLDJCQUEyQjtRQUMzQixNQUFNLElBQUksR0FBRyxPQUFPLENBQUM7UUFDckIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8s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QUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgSGFzaCwgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgRWNkc2EsIEVDRFNBLCBoZXhUb0JpZ0ludCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEVjZHNhUGFpbGxpZXJQcm9vZiwgRWNkc2FUeXBlcywgU2Nobm9yclByb29mIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IGNyZWF0ZUtlY2Nha0hhc2ggZnJvbSAna2VjY2FrJztcbmltcG9ydCB7XG4gIHNjaG5vcnJQcm9vZnMsXG4gIG50aWxkZXMsXG4gIHBhaWxsZXJLZXlzLFxuICBtb2NrTlNoYXJlcyxcbiAgbW9ja1BTaGFyZSxcbiAgbW9ja0RLZXlTaGFyZSxcbiAgbW9ja0VLZXlTaGFyZSxcbiAgbW9ja0ZLZXlTaGFyZSxcbn0gZnJvbSAnLi4vZml4dHVyZXMvZWNkc2EnO1xuXG4vLyBOZWVkIHRvIGltcG9ydCBhbmQgdGhlbiBtb25rZXktcGF0Y2ggdG8gbWFrZSBzdHViYmluZyB3b3JrIHdpdGggRVNNXG5jb25zdCBwYWlsbGllckJpZ2ludE1vZHVsZSA9IHJlcXVpcmUoJ3BhaWxsaWVyLWJpZ2ludCcpO1xuY29uc3QgcGFpbGxpZXJCaWdpbnQgPSBwYWlsbGllckJpZ2ludE1vZHVsZTtcbmNvbnN0IHNjaG5vcnJNb2R1bGUgPSByZXF1aXJlKCdAYml0Z28tYmV0YS9zZGstbGliLW1wYycpO1xuY29uc3QgU2Nobm9yciA9IHNjaG5vcnJNb2R1bGUuU2Nobm9ycjtcblxuZGVzY3JpYmUoJ1RTUyBFQ0RTQSBURVNUUycsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgTVBDID0gbmV3IEVjZHNhKCk7XG4gIGNvbnN0IGJhc2UgPSBCaWdJbnQoJzB4MDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyk7IC8vIDJeMjU2XG4gIGxldCBrZXlTaGFyZXM6IEVDRFNBLktleUNvbWJpbmVkW107XG4gIGxldCBjb21tb25QdWJsaWNLZXk6IHN0cmluZztcbiAgY29uc3Qgc2VlZCA9IEJ1ZmZlci5mcm9tKFxuICAgICdjNGQxNTgzYTBiN2I4ODYyNmI1NmYwYzgzZWU2ZGY0ZDk1ZDk5Y2NhNzM4OTNmZmI1N2M1ZTQ0MTFmYTFiMmI5Yzg3NDU2MDgwZThkM2YwMzQ2MmYwNjU2ODhhYmMyOGJlMmQ0YWYzMTY0ZDU5M2M1MGI1NTI2OWI0MzVlYTQ4ZCcsXG4gICAgJ2hleCcsXG4gICk7XG4gIGxldCBBOiBFQ0RTQS5LZXlTaGFyZSwgQjogRUNEU0EuS2V5U2hhcmUsIEM6IEVDRFNBLktleVNoYXJlO1xuICBiZWZvcmUoYXN5bmMgKCkgPT4ge1xuICAgIC8vIERpcmVjdCBtb25rZXkgcGF0Y2hpbmcgb2YgdGhlIG1vZHVsZSBmb3IgRVNNIGNvbXBhdGliaWxpdHlcbiAgICBjb25zdCBvcmlnaW5hbEdlbmVyYXRlUmFuZG9tS2V5cyA9IHBhaWxsaWVyQmlnaW50LmdlbmVyYXRlUmFuZG9tS2V5cztcblxuICAgIGNvbnN0IHBhaWxsaWVyTW9jayA9IHNpbm9uLnN0dWIoKTtcbiAgICBwYWlsbGllck1vY2tcbiAgICAgIC5vbkNhbGwoMClcbiAgICAgIC5yZXNvbHZlcyhwYWlsbGVyS2V5c1swXSlcbiAgICAgIC5vbkNhbGwoMSlcbiAgICAgIC5yZXNvbHZlcyhwYWlsbGVyS2V5c1sxXSlcbiAgICAgIC5vbkNhbGwoMilcbiAgICAgIC5yZXNvbHZlcyhwYWlsbGVyS2V5c1syXSlcbiAgICAgIC5vbkNhbGwoMylcbiAgICAgIC5yZXNvbHZlcyhwYWlsbGVyS2V5c1swXSlcbiAgICAgIC5vbkNhbGwoNClcbiAgICAgIC5yZXNvbHZlcyhwYWlsbGVyS2V5c1sxXSlcbiAgICAgIC5vbkNhbGwoNSlcbiAgICAgIC5yZXNvbHZlcyhwYWlsbGVyS2V5c1syXSk7XG5cbiAgICAvLyBSZXBsYWNlIHRoZSBmdW5jdGlvbiBkaXJlY3RseSBvbiB0aGUgbW9kdWxlXG4gICAgcGFpbGxpZXJCaWdpbnQuZ2VuZXJhdGVSYW5kb21LZXlzID0gcGFpbGxpZXJNb2NrO1xuXG4gICAgLy8gU2F2ZSByZWZlcmVuY2VzIHRvIHJlc3RvcmUgbGF0ZXJcbiAgICAocGFpbGxpZXJNb2NrIGFzIGFueSkub3JpZ2luYWxGbiA9IG9yaWdpbmFsR2VuZXJhdGVSYW5kb21LZXlzO1xuXG4gICAgLy8gQXBwbHkgdGhlIHNhbWUgbW9ua2V5LXBhdGNoaW5nIGFwcHJvYWNoIGZvciBTY2hub3JyXG4gICAgY29uc3Qgb3JpZ2luYWxDcmVhdGVTY2hub3JyUHJvb2YgPSBTY2hub3JyLmNyZWF0ZVNjaG5vcnJQcm9vZjtcblxuICAgIGNvbnN0IHNjaG5vcnJQcm9vZk1vY2sgPSBzaW5vbi5zdHViKCk7XG4gICAgc2Nobm9yclByb29mTW9ja1xuICAgICAgLm9uQ2FsbCgwKVxuICAgICAgLnJldHVybnMoc2Nobm9yclByb29mc1swXSBhcyB1bmtub3duIGFzIFNjaG5vcnJQcm9vZilcbiAgICAgIC5vbkNhbGwoMSlcbiAgICAgIC5yZXR1cm5zKHNjaG5vcnJQcm9vZnNbMV0gYXMgdW5rbm93biBhcyBTY2hub3JyUHJvb2YpXG4gICAgICAub25DYWxsKDIpXG4gICAgICAucmV0dXJucyhzY2hub3JyUHJvb2ZzWzJdIGFzIHVua25vd24gYXMgU2Nobm9yclByb29mKVxuICAgICAgLm9uQ2FsbCgzKVxuICAgICAgLnJldHVybnMoc2Nobm9yclByb29mc1szXSBhcyB1bmtub3duIGFzIFNjaG5vcnJQcm9vZilcbiAgICAgIC5vbkNhbGwoNClcbiAgICAgIC5yZXR1cm5zKHNjaG5vcnJQcm9vZnNbNF0gYXMgdW5rbm93biBhcyBTY2hub3JyUHJvb2YpXG4gICAgICAub25DYWxsKDUpXG4gICAgICAucmV0dXJucyhzY2hub3JyUHJvb2ZzWzVdIGFzIHVua25vd24gYXMgU2Nobm9yclByb29mKTtcblxuICAgIC8vIFJlcGxhY2UgdGhlIGZ1bmN0aW9uIGRpcmVjdGx5IG9uIHRoZSBtb2R1bGVcbiAgICBTY2hub3JyLmNyZWF0ZVNjaG5vcnJQcm9vZiA9IHNjaG5vcnJQcm9vZk1vY2s7XG5cbiAgICAvLyBTYXZlIHJlZmVyZW5jZXMgdG8gcmVzdG9yZSBsYXRlclxuICAgIChzY2hub3JyUHJvb2ZNb2NrIGFzIGFueSkub3JpZ2luYWxGbiA9IG9yaWdpbmFsQ3JlYXRlU2Nobm9yclByb29mO1xuXG4gICAgW0EsIEIsIENdID0gYXdhaXQgUHJvbWlzZS5hbGwoW01QQy5rZXlTaGFyZSgxLCAyLCAzKSwgTVBDLmtleVNoYXJlKDIsIDIsIDMpLCBNUEMua2V5U2hhcmUoMywgMiwgMyldKTtcblxuICAgIC8vIE5lZWRzIHRvIHJ1biB0aGlzIHNlcmlhbGx5IGZvciB0ZXN0aW5nIGRldGVybWluaXN0aWMga2V5IGdlbmVyYXRpb25cbiAgICAvLyB0byBnZXQgc3BlY2lmaWMgcGFpbGxpZXIga2V5cyB0byBiZSBhc3NpZ25lZFxuICAgIGNvbnN0IEQgPSBhd2FpdCBNUEMua2V5U2hhcmUoMSwgMiwgMywgc2VlZCk7XG4gICAgY29uc3QgRSA9IGF3YWl0IE1QQy5rZXlTaGFyZSgyLCAyLCAzLCBzZWVkKTtcbiAgICBjb25zdCBGID0gYXdhaXQgTVBDLmtleVNoYXJlKDMsIDIsIDMsIHNlZWQpO1xuXG4gICAgY29uc3QgYUtleUNvbWJpbmUgPSBNUEMua2V5Q29tYmluZShBLnBTaGFyZSwgW0IublNoYXJlc1sxXSwgQy5uU2hhcmVzWzFdXSk7XG4gICAgY29uc3QgYktleUNvbWJpbmUgPSBNUEMua2V5Q29tYmluZShCLnBTaGFyZSwgW0EublNoYXJlc1syXSwgQy5uU2hhcmVzWzJdXSk7XG4gICAgY29uc3QgY0tleUNvbWJpbmUgPSBNUEMua2V5Q29tYmluZShDLnBTaGFyZSwgW0EublNoYXJlc1szXSwgQi5uU2hhcmVzWzNdXSk7XG5cbiAgICAvLyBTaGFyZXMgd2l0aCBzcGVjaWZpYyBzZWVkc1xuICAgIGNvbnN0IGRLZXlDb21iaW5lID0gTVBDLmtleUNvbWJpbmUoRC5wU2hhcmUsIFtFLm5TaGFyZXNbMV0sIEYublNoYXJlc1sxXV0pO1xuICAgIGNvbnN0IGVLZXlDb21iaW5lID0gTVBDLmtleUNvbWJpbmUoRS5wU2hhcmUsIFtELm5TaGFyZXNbMl0sIEYublNoYXJlc1syXV0pO1xuICAgIGNvbnN0IGZLZXlDb21iaW5lID0gTVBDLmtleUNvbWJpbmUoRi5wU2hhcmUsIFtELm5TaGFyZXNbM10sIEUublNoYXJlc1szXV0pO1xuXG4gICAgLy8gU2hhcmVzIGZvciBkZXJpdmVkIGtleXMuXG4gICAgY29uc3QgcGF0aCA9ICdtLzAvMSc7XG4gICAgY29uc3QgYUtleURlcml2ZSA9IE1QQy5rZXlEZXJpdmUoQS5wU2hhcmUsIFtCLm5TaGFyZXNbMV0sIEMublNoYXJlc1sxXV0sIHBhdGgpO1xuICAgIGNvbnN0IGdLZXlDb21iaW5lOiBFQ0RTQS5LZXlDb21iaW5lZCA9IHtcbiAgICAgIHhTaGFyZTogYUtleURlcml2ZS54U2hhcmUsXG4gICAgICB5U2hhcmVzOiBhS2V5Q29tYmluZS55U2hhcmVzLFxuICAgIH07XG4gICAgY29uc3QgaEtleUNvbWJpbmUgPSBNUEMua2V5Q29tYmluZShCLnBTaGFyZSwgW2FLZXlEZXJpdmUublNoYXJlc1syXSwgQy5uU2hhcmVzWzJdXSk7XG4gICAga2V5U2hhcmVzID0gW1xuICAgICAgYUtleUNvbWJpbmUsXG4gICAgICBiS2V5Q29tYmluZSxcbiAgICAgIGNLZXlDb21iaW5lLFxuICAgICAgZEtleUNvbWJpbmUsXG4gICAgICBlS2V5Q29tYmluZSxcbiAgICAgIGZLZXlDb21iaW5lLFxuICAgICAgZ0tleUNvbWJpbmUsXG4gICAgICBoS2V5Q29tYmluZSxcbiAgICBdO1xuICAgIGNvbW1vblB1YmxpY0tleSA9IGFLZXlDb21iaW5lLnhTaGFyZS55O1xuICAgIC8vIEFkZGluZyBhbiBleHBsaWNpdCBhc3NlcnRpb24gdG8gY2hlY2sgaWYgdGhlIHN0dWIgd2FzIHVzZWRcbiAgICBwYWlsbGllck1vY2suY2FsbENvdW50LnNob3VsZC5lcXVhbCg2LCAncGFpbGxpZXJNb2NrIHNob3VsZCBiZSBjYWxsZWQgNiB0aW1lcycpO1xuICAgIHNjaG5vcnJQcm9vZk1vY2suY2FsbENvdW50LnNob3VsZC5lcXVhbCg4LCAnc2Nobm9yclByb29mTW9jayBzaG91bGQgYmUgY2FsbGVkIDYgdGltZXMnKTtcblxuICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgZnVuY3Rpb25zXG4gICAgcGFpbGxpZXJCaWdpbnQuZ2VuZXJhdGVSYW5kb21LZXlzID0gKHBhaWxsaWVyTW9jayBhcyBhbnkpLm9yaWdpbmFsRm47XG4gICAgU2Nobm9yci5jcmVhdGVTY2hub3JyUHJvb2YgPSAoc2Nobm9yclByb29mTW9jayBhcyBhbnkpLm9yaWdpbmFsRm47XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdFY2RzYSBLZXkgR2VuZXJhdGlvbiBUZXN0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUga2V5cyB3aXRoIGNvcnJlY3QgdGhyZXNob2xkIGFuZCBzaGFyZSBudW1iZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMzsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCBwYXJ0aWNpcGFudE9uZSA9IChpbmRleCAlIDMpICsgMTtcbiAgICAgICAgY29uc3QgcGFydGljaXBhbnRUd28gPSAoKGluZGV4ICsgMSkgJSAzKSArIDE7XG4gICAgICAgIGNvbnN0IHBhcnRpY2lwYW50VGhyZWUgPSAoKGluZGV4ICsgMikgJSAzKSArIDE7XG4gICAgICAgIGtleVNoYXJlc1tpbmRleF0ueFNoYXJlLmkuc2hvdWxkLmVxdWFsKHBhcnRpY2lwYW50T25lKTtcbiAgICAgICAga2V5U2hhcmVzW2luZGV4XS54U2hhcmUueS5zaG91bGQuZXF1YWwoY29tbW9uUHVibGljS2V5KTtcbiAgICAgICAga2V5U2hhcmVzW2luZGV4XS54U2hhcmUubS5zaG91bGQubm90LmJlLk51bGw7XG4gICAgICAgIGtleVNoYXJlc1tpbmRleF0ueFNoYXJlLmwuc2hvdWxkLm5vdC5iZS5OdWxsO1xuICAgICAgICBrZXlTaGFyZXNbaW5kZXhdLnhTaGFyZS5uLnNob3VsZC5ub3QuYmUuTnVsbDtcblxuICAgICAgICBjb25zdCBjaGFpbmNvZGUgPSBCaWdJbnQoJzB4JyArIGtleVNoYXJlc1tpbmRleF0ueFNoYXJlLmNoYWluY29kZSk7XG4gICAgICAgIGNvbnN0IGlzQ2hhaW5Db2RlVmFsaWQgPSBjaGFpbmNvZGUgPiBCaWdJbnQoMCkgJiYgY2hhaW5jb2RlIDw9IGJhc2U7XG4gICAgICAgIGlzQ2hhaW5Db2RlVmFsaWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuXG4gICAgICAgIGtleVNoYXJlc1tpbmRleF0ueVNoYXJlc1twYXJ0aWNpcGFudFR3b10uaS5zaG91bGQuZXF1YWwocGFydGljaXBhbnRPbmUpO1xuICAgICAgICBrZXlTaGFyZXNbaW5kZXhdLnlTaGFyZXNbcGFydGljaXBhbnRUaHJlZV0uaS5zaG91bGQuZXF1YWwocGFydGljaXBhbnRPbmUpO1xuICAgICAgICBrZXlTaGFyZXNbaW5kZXhdLnlTaGFyZXNbcGFydGljaXBhbnRUd29dLmouc2hvdWxkLmVxdWFsKHBhcnRpY2lwYW50VHdvKTtcbiAgICAgICAga2V5U2hhcmVzW2luZGV4XS55U2hhcmVzW3BhcnRpY2lwYW50VGhyZWVdLmouc2hvdWxkLmVxdWFsKHBhcnRpY2lwYW50VGhyZWUpO1xuICAgICAgICBrZXlTaGFyZXNbaW5kZXhdLnlTaGFyZXNbcGFydGljaXBhbnRUd29dLm4uc2hvdWxkLm5vdC5iZS5OdWxsO1xuICAgICAgICBrZXlTaGFyZXNbaW5kZXhdLnlTaGFyZXNbcGFydGljaXBhbnRUaHJlZV0ubi5zaG91bGQubm90LmJlLk51bGw7XG5cbiAgICAgICAgY29uc3QgcHVibGljS2V5UHJlZml4ID0ga2V5U2hhcmVzW2luZGV4XS54U2hhcmUueS5zbGljZSgwLCAyKTtcbiAgICAgICAgY29uc3QgaXNSaWdodFByZWZpeCA9IHB1YmxpY0tleVByZWZpeCA9PT0gJzAzJyB8fCBwdWJsaWNLZXlQcmVmaXggPT09ICcwMic7XG4gICAgICAgIGlzUmlnaHRQcmVmaXguc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBrZXlzaGFyZXMgd2l0aCBzcGVjaWZpYyBzZWVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gS2V5cyBzaG91bGQgYmUgZGV0ZXJtaW5pc3RpYyB3aGVuIHVzaW5nIHNlZWRcbiAgICAgIGNvbnN0IFssICwgLCBELCBFLCBGXSA9IGtleVNoYXJlcztcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoRCwgbW9ja0RLZXlTaGFyZSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKEUsIG1vY2tFS2V5U2hhcmUpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChGLCBtb2NrRktleVNoYXJlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBpZiBzZWVkIGlzIGxlbmd0aCBsZXNzIHRoYW4gNjQgYnl0ZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBNUEMua2V5U2hhcmUoMSwgMiwgMywgcmFuZG9tQnl0ZXMoMTYpKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAnU2VlZCBtdXN0IGhhdmUgYSBsZW5ndGggb2YgYXQgbGVhc3QgNjQgYnl0ZXMnLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IE1QQy5rZXlTaGFyZSgxLCAyLCAzLCByYW5kb21CeXRlcygzMikpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICdTZWVkIG11c3QgaGF2ZSBhIGxlbmd0aCBvZiBhdCBsZWFzdCA2NCBieXRlcycsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXNzIGlmIHNlZWQgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiA2NCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBhaWxsaWVyTW9jayA9IHNpbm9uLnN0dWIocGFpbGxpZXJCaWdpbnQsICdnZW5lcmF0ZVJhbmRvbUtleXMnKS5vbkNhbGwoMCkucmVzb2x2ZXMocGFpbGxlcktleXNbMF0pO1xuICAgICAgY29uc3Qgc2VlZDcyQnl0ZXMgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgJzRmN2U5MTRkYzllYzY5NjM5ODY3NWQxNTQ0YWFiNjFjYjdhNjc2NjJmZmNiZGI0MDc5ZWM1ZDY4MmJlNTY1ZDg3YzFiMmRlNzVjOTQzZGVjMTRjOTY1ODY5ODQ4NjAyNjg3Nzk0OThlNjczMjQ3M2FlZDllZDljMjUzOGY1MGJlYTBhZjkyNmJkY2NjMDEzNCcsXG4gICAgICAgICdoZXgnLFxuICAgICAgKTtcbiAgICAgIChhd2FpdCBNUEMua2V5U2hhcmUoMSwgMiwgMywgc2VlZDcyQnl0ZXMpKS5wU2hhcmUudS5sZW5ndGguc2hvdWxkLmVxdWFsKDY0KTtcbiAgICAgIHBhaWxsaWVyTW9jay5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSBjb3JyZWN0IGNoYWluY29kZSB3aGlsZSBjb21iaW5pbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBrZXlDb21iaW5lID0gTVBDLmtleUNvbWJpbmUobW9ja1BTaGFyZSwgbW9ja05TaGFyZXMpO1xuICAgICAga2V5Q29tYmluZS54U2hhcmUuY2hhaW5jb2RlLnNob3VsZC5lcXVhbCgnZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmVmZmZmZmMzMicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGdlbmVyYXRlIGtleXMgd2l0aCBpbnZhbGlkIHRocmVzaG9sZCBhbmQgc2hhcmUgbnVtYmVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW52YWxpZENvbmZpZ3MgPSBbXG4gICAgICAgIHsgaW5kZXg6IDEsIHRocmVzaG9sZDogNSwgbnVtU2hhcmVzOiAzIH0sXG4gICAgICAgIHsgaW5kZXg6IC0xLCB0aHJlc2hvbGQ6IDIsIG51bVNoYXJlczogMyB9LFxuICAgICAgICB7IGluZGV4OiAxLCB0aHJlc2hvbGQ6IDIsIG51bVNoYXJlczogMSB9LFxuICAgICAgXTtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBpbnZhbGlkQ29uZmlncy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBNUEMua2V5U2hhcmUoXG4gICAgICAgICAgICBpbnZhbGlkQ29uZmlnc1tpbmRleF0uaW5kZXgsXG4gICAgICAgICAgICBpbnZhbGlkQ29uZmlnc1tpbmRleF0udGhyZXNob2xkLFxuICAgICAgICAgICAgaW52YWxpZENvbmZpZ3NbaW5kZXhdLm51bVNoYXJlcyxcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZS5zaG91bGQuZXF1YWwoJ0ludmFsaWQgS2V5U2hhcmUgQ29uZmlnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVyaXZlIHVuaGFyZGVuZWQgY2hpbGQga2V5cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHBhcmVudCBrZXlcbiAgICAgIGNvbnN0IGFLZXlDb21iaW5lID0ga2V5U2hhcmVzWzBdO1xuICAgICAgY29uc3QgY29tbW9uS2V5Y2hhaW4gPSBhS2V5Q29tYmluZS54U2hhcmUueSArIGFLZXlDb21iaW5lLnhTaGFyZS5jaGFpbmNvZGU7XG5cbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCAxMDsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCBwYXRoID0gYG0vMC8wLyR7aW5kZXh9YDtcblxuICAgICAgICBjb25zdCBzdWJrZXkgPSBNUEMua2V5RGVyaXZlKEEucFNoYXJlLCBbQi5uU2hhcmVzWzFdLCBDLm5TaGFyZXNbMV1dLCBwYXRoKTtcblxuICAgICAgICBjb25zdCBkZXJpdmUxOiBzdHJpbmcgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXljaGFpbiwgcGF0aCk7XG4gICAgICAgIGNvbnN0IGRlcml2ZTI6IHN0cmluZyA9IE1QQy5kZXJpdmVVbmhhcmRlbmVkKGNvbW1vbktleWNoYWluLCBwYXRoKTtcblxuICAgICAgICBkZXJpdmUxLnNob3VsZC5lcXVhbChkZXJpdmUyLCAnZGVyaXZhdGlvbiBzaG91bGQgYmUgZGV0ZXJtaW5pc3RpYycpO1xuXG4gICAgICAgIChzdWJrZXkueFNoYXJlLnkgKyBzdWJrZXkueFNoYXJlLmNoYWluY29kZSkuc2hvdWxkLmVxdWFsKFxuICAgICAgICAgIGRlcml2ZTEsXG4gICAgICAgICAgJ3N1YmtleSBjb21tb24ga2V5Y2hhaW4gc2hvdWxkIG1hdGNoIGRlcml2ZWQga2V5Y2hhaW4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRUNEU0EgU2lnbmluZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgY29uZmlnOiB7IHNpZ25lck9uZTogRUNEU0EuS2V5Q29tYmluZWQ7IHNpZ25lclR3bzogRUNEU0EuS2V5Q29tYmluZWQ7IGhhc2g/OiBzdHJpbmc7IHNob3VsZEhhc2g/OiBib29sZWFuIH1bXTtcblxuICAgIGJlZm9yZSgoKSA9PiB7XG4gICAgICBjb25zdCBbQSwgQiwgQywgRCwgRSwgRiwgRywgSF0gPSBrZXlTaGFyZXM7XG5cbiAgICAgIGNvbmZpZyA9IFtcbiAgICAgICAgeyBzaWduZXJPbmU6IEEsIHNpZ25lclR3bzogQiB9LFxuICAgICAgICB7IHNpZ25lck9uZTogQSwgc2lnbmVyVHdvOiBDIH0sXG4gICAgICAgIHsgc2lnbmVyT25lOiBCLCBzaWduZXJUd286IEEgfSxcbiAgICAgICAgeyBzaWduZXJPbmU6IEIsIHNpZ25lclR3bzogQyB9LFxuICAgICAgICB7IHNpZ25lck9uZTogQywgc2lnbmVyVHdvOiBBIH0sXG4gICAgICAgIHsgc2lnbmVyT25lOiBDLCBzaWduZXJUd286IEIgfSxcblxuICAgICAgICAvLyBDaGVja3Mgc2lnbmluZyB3aXRoIHNwZWNpZmljIHNlZWRcbiAgICAgICAgeyBzaWduZXJPbmU6IEQsIHNpZ25lclR3bzogRSB9LFxuICAgICAgICB7IHNpZ25lck9uZTogRSwgc2lnbmVyVHdvOiBGIH0sXG4gICAgICAgIHsgc2lnbmVyT25lOiBGLCBzaWduZXJUd286IEQgfSxcblxuICAgICAgICAvLyBDaGVja3Mgd2l0aCBzcGVjaWZpYyBoYXNoaW5nIGFsZ29yaXRobVxuICAgICAgICB7IHNpZ25lck9uZTogQSwgc2lnbmVyVHdvOiBCLCBoYXNoOiAna2VjY2FrMjU2JyB9LFxuXG4gICAgICAgIC8vIGNoZWNrcyB3aXRoIG5vIGhhc2hpbmdcbiAgICAgICAgeyBzaWduZXJPbmU6IEEsIHNpZ25lclR3bzogQiwgc2hvdWxkSGFzaDogZmFsc2UgfSxcblxuICAgICAgICAvLyBDaGVja3Mgd2l0aCBkZXJpdmVkIHN1YmtleVxuICAgICAgICB7IHNpZ25lck9uZTogRywgc2lnbmVyVHdvOiBIIH0sXG4gICAgICBdO1xuICAgIH0pO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDk7IGluZGV4KyspIHtcbiAgICAgIGl0KGBzaG91bGQgcHJvcGVybHkgc2lnbiB0aGUgbWVzc2FnZSBjYXNlICR7aW5kZXh9YCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBTdGVwIE9uZVxuICAgICAgICAvLyBzaWduZXJPbmUsIHNpZ25lclR3byBoYXZlIGRlY2lkZWQgdG8gc2lnbiB0aGUgbWVzc2FnZVxuICAgICAgICBjb25zdCBzaWduZXJPbmUgPSBjb25maWdbaW5kZXhdLnNpZ25lck9uZTtcbiAgICAgICAgY29uc3Qgc2lnbmVyT25lSW5kZXggPSBzaWduZXJPbmUueFNoYXJlLmk7XG4gICAgICAgIGNvbnN0IHNpZ25lclR3byA9IGNvbmZpZ1tpbmRleF0uc2lnbmVyVHdvO1xuICAgICAgICBjb25zdCBzaWduZXJUd29JbmRleCA9IHNpZ25lclR3by54U2hhcmUuaTtcblxuICAgICAgICBjb25zdCBbc2lnbmVyT25lVG9Ud29QYWlsbGllckNoYWxsZW5nZSwgc2lnbmVyVHdvVG9PbmVQYWlsbGllckNoYWxsZW5nZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgRWNkc2FQYWlsbGllclByb29mLmdlbmVyYXRlUChoZXhUb0JpZ0ludChzaWduZXJPbmUueVNoYXJlc1tzaWduZXJUd29JbmRleF0ubikpLFxuICAgICAgICAgIEVjZHNhUGFpbGxpZXJQcm9vZi5nZW5lcmF0ZVAoaGV4VG9CaWdJbnQoc2lnbmVyVHdvLnlTaGFyZXNbc2lnbmVyT25lSW5kZXhdLm4pKSxcbiAgICAgICAgXSk7XG4gICAgICAgIC8vIFN0ZXAgVHdvXG4gICAgICAgIC8vIEZpcnN0IHNpZ25lciBnZW5lcmF0ZXMgdGhlaXIgcmFuZ2UgcHJvb2YgY2hhbGxlbmdlLlxuICAgICAgICBjb25zdCBzaWduZXJPbmVYU2hhcmU6IEVDRFNBLlhTaGFyZVdpdGhDaGFsbGVuZ2VzID0gTVBDLmFwcGVuZENoYWxsZW5nZShcbiAgICAgICAgICBzaWduZXJPbmUueFNoYXJlLFxuICAgICAgICAgIEVjZHNhVHlwZXMuc2VyaWFsaXplTnRpbGRlKG50aWxkZXNbaW5kZXhdKSxcbiAgICAgICAgICBFY2RzYVR5cGVzLnNlcmlhbGl6ZVBhaWxsaWVyQ2hhbGxlbmdlKHsgcDogc2lnbmVyT25lVG9Ud29QYWlsbGllckNoYWxsZW5nZSB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBTdGVwIFRocmVlXG4gICAgICAgIC8vICBTZWNvbmQgc2lnbmVyIGdlbmVyYXRlcyB0aGVpciByYW5nZSBwcm9vZiBjaGFsbGVuZ2UuXG4gICAgICAgIGNvbnN0IHNpZ25lclR3b1hTaGFyZTogRUNEU0EuWFNoYXJlV2l0aENoYWxsZW5nZXMgPSBNUEMuYXBwZW5kQ2hhbGxlbmdlKFxuICAgICAgICAgIHNpZ25lclR3by54U2hhcmUsXG4gICAgICAgICAgRWNkc2FUeXBlcy5zZXJpYWxpemVOdGlsZGUobnRpbGRlc1tpbmRleCArIDFdKSxcbiAgICAgICAgICBFY2RzYVR5cGVzLnNlcmlhbGl6ZVBhaWxsaWVyQ2hhbGxlbmdlKHsgcDogc2lnbmVyVHdvVG9PbmVQYWlsbGllckNoYWxsZW5nZSB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc2lnbmVyVHdvQ2hhbGxlbmdlID0geyBudGlsZGU6IHNpZ25lclR3b1hTaGFyZS5udGlsZGUsIGgxOiBzaWduZXJUd29YU2hhcmUuaDEsIGgyOiBzaWduZXJUd29YU2hhcmUuaDIgfTtcblxuICAgICAgICAvLyBTdGVwIEZvdXJcbiAgICAgICAgLy8gRmlyc3Qgc2lnbmVyIHJlY2VpdmVzIHRoZSBjaGFsbGVuZ2UgZnJvbSB0aGUgc2Vjb25kIHNpZ25lciBhbmQgYXBwZW5kcyBpdCB0byB0aGVpciBZU2hhcmVcbiAgICAgICAgY29uc3Qgc2lnbmVyVHdvWVNoYXJlOiBFQ0RTQS5ZU2hhcmVXaXRoQ2hhbGxlbmdlcyA9IE1QQy5hcHBlbmRDaGFsbGVuZ2UoXG4gICAgICAgICAgc2lnbmVyT25lLnlTaGFyZXNbc2lnbmVyVHdvSW5kZXhdLFxuICAgICAgICAgIHNpZ25lclR3b0NoYWxsZW5nZSxcbiAgICAgICAgICBFY2RzYVR5cGVzLnNlcmlhbGl6ZVBhaWxsaWVyQ2hhbGxlbmdlKHsgcDogc2lnbmVyVHdvVG9PbmVQYWlsbGllckNoYWxsZW5nZSB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBTdGVwIEZpdmVcbiAgICAgICAgLy8gU2lnbiBTaGFyZXMgYXJlIGNyZWF0ZWQgYnkgb25lIG9mIHRoZSBwYXJ0aWNpcGFudHMgKHNpZ25lck9uZSlcbiAgICAgICAgLy8gd2l0aCBpdHMgcHJpdmF0ZSBYU2hhcmUgYW5kIFlTaGFyZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdGhlciBwYXJ0aWNpcGFudCAoc2lnbmVyVHdvKVxuICAgICAgICAvLyBUaGlzIHN0ZXAgcHJvZHVjZXMgYSBwcml2YXRlIFdTaGFyZSB3aGljaCBzaWduZXJPbmUgc2F2ZXMgYW5kIEtTaGFyZSB3aGljaCBzaWduZXJPbmUgc2VuZHMgdG8gc2lnbmVyVHdvXG4gICAgICAgIGNvbnN0IHNpZ25TaGFyZXMgPSBhd2FpdCBNUEMuc2lnblNoYXJlKHNpZ25lck9uZVhTaGFyZSwgc2lnbmVyVHdvWVNoYXJlKTtcblxuICAgICAgICAvLyBTdGVwIFNpeFxuICAgICAgICAvLyBzaWduZXJUd28gcmVjZWl2ZXMgdGhlIEtTaGFyZSBmcm9tIHNpZ25lck9uZSBhbmQgdXNlcyBpdCBwcm9kdWNlIHByaXZhdGVcbiAgICAgICAgLy8gQlNoYXJlIChCZXRhIFNoYXJlKSB3aGljaCBzaWduZXJUd28gc2F2ZXMgYW5kIEFTaGFyZSAoQWxwaGEgU2hhcmUpXG4gICAgICAgIC8vIHdoaWNoIGlzIHNlbnQgdG8gc2lnbmVyT25lXG5cbiAgICAgICAgY29uc3Qgc2lnbkNvbnZlcnRTMjEgPSBhd2FpdCBNUEMuc2lnbkNvbnZlcnRTdGVwMSh7XG4gICAgICAgICAgeFNoYXJlOiBzaWduZXJUd29YU2hhcmUsXG4gICAgICAgICAgeVNoYXJlOiBzaWduZXJUd28ueVNoYXJlc1tzaWduZXJPbmVJbmRleF0sIC8vIFlTaGFyZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdGhlciBwYXJ0aWNpcGFudCBzaWduZXJPbmVcbiAgICAgICAgICBrU2hhcmU6IHNpZ25TaGFyZXMua1NoYXJlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTdGVwIFNldmVuXG4gICAgICAgIC8vIHNpZ25lck9uZSByZWNlaXZlcyB0aGUgQVNoYXJlIGZyb20gc2lnbmVyVHdvIGFuZCBzaWduZXJPbmUgdXNpbmcgdGhlIHByaXZhdGUgV1NoYXJlIGZyb20gc3RlcCB0d29cbiAgICAgICAgLy8gdXNlcyBpdCBwcm9kdWNlIHByaXZhdGUgR1NoYXJlIChHYW1tYSBTaGFyZSkgYW5kIE1VU2hhcmUgKE11IFNoYXJlKSB3aGljaFxuICAgICAgICAvLyBpcyBzZW50IHRvIHNpZ25lclR3byB0byBwcm9kdWNlIGl0cyBHYW1tYSBTaGFyZVxuICAgICAgICBjb25zdCBzaWduQ29udmVydFMxMiA9IGF3YWl0IE1QQy5zaWduQ29udmVydFN0ZXAyKHtcbiAgICAgICAgICBhU2hhcmU6IHNpZ25Db252ZXJ0UzIxLmFTaGFyZSxcbiAgICAgICAgICB3U2hhcmU6IHNpZ25TaGFyZXMud1NoYXJlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTdGVwIEVpZ2h0XG4gICAgICAgIC8vIHNpZ25lclR3byByZWNlaXZlcyB0aGUgTVVTaGFyZSBmcm9tIHNpZ25lck9uZSBhbmQgc2lnbmVyT25lIHVzaW5nIHRoZSBwcml2YXRlIEJTaGFyZSBmcm9tIHN0ZXAgdGhyZWVcbiAgICAgICAgLy8gdXNlcyBpdCBwcm9kdWNlIHByaXZhdGUgR1NoYXJlIChHYW1tYSBTaGFyZSlcbiAgICAgICAgY29uc3Qgc2lnbkNvbnZlcnRTMjFfMiA9IGF3YWl0IE1QQy5zaWduQ29udmVydFN0ZXAzKHtcbiAgICAgICAgICBtdVNoYXJlOiBzaWduQ29udmVydFMxMi5tdVNoYXJlLFxuICAgICAgICAgIGJTaGFyZTogc2lnbkNvbnZlcnRTMjEuYlNoYXJlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTdGVwIE5pbmVcbiAgICAgICAgLy8gc2lnbmVyT25lIGFuZCBzaWduZXJUd28gYm90aCBoYXZlIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQgR1NoYXJlcyBhbmQgdGhleSB1c2VcbiAgICAgICAgLy8gdGhlIHNpZ24gY29tYmluZSBmdW5jdGlvbiB0byBnZW5lcmF0ZSB0aGVpciBwcml2YXRlIG9taWNyb24gc2hhcmVzIGFuZFxuICAgICAgICAvLyBkZWx0YSBzaGFyZXMgd2hpY2ggdGhleSBzaGFyZSB0byBlYWNoIG90aGVyXG5cbiAgICAgICAgY29uc3QgW3NpZ25Db21iaW5lT25lLCBzaWduQ29tYmluZVR3b10gPSBbXG4gICAgICAgICAgTVBDLnNpZ25Db21iaW5lKHtcbiAgICAgICAgICAgIGdTaGFyZTogc2lnbkNvbnZlcnRTMTIuZ1NoYXJlLFxuICAgICAgICAgICAgc2lnbkluZGV4OiB7XG4gICAgICAgICAgICAgIGk6IHNpZ25Db252ZXJ0UzEyLm11U2hhcmUuaSxcbiAgICAgICAgICAgICAgajogc2lnbkNvbnZlcnRTMTIubXVTaGFyZS5qLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBNUEMuc2lnbkNvbWJpbmUoe1xuICAgICAgICAgICAgZ1NoYXJlOiBzaWduQ29udmVydFMyMV8yLmdTaGFyZSxcbiAgICAgICAgICAgIHNpZ25JbmRleDoge1xuICAgICAgICAgICAgICBpOiBzaWduQ29udmVydFMyMV8yLnNpZ25JbmRleC5pLFxuICAgICAgICAgICAgICBqOiBzaWduQ29udmVydFMyMV8yLnNpZ25JbmRleC5qLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCBNRVNTQUdFID0gQnVmZmVyLmZyb20oJ1RPTyBNQU5ZIFNFQ1JFVFMnKTtcblxuICAgICAgICAvLyBTdGVwIFRlblxuICAgICAgICAvLyBzaWduZXJPbmUgYW5kIHNpZ25lclR3byBzaGFyZXMgdGhlIGRlbHRhIHNoYXJlIGZyb20gZWFjaCBvdGhlclxuICAgICAgICAvLyBhbmQgZmluYWxseSBzaWducyB0aGUgbWVzc2FnZSB1c2luZyB0aGVpciBwcml2YXRlIE9TaGFyZVxuICAgICAgICAvLyBhbmQgZGVsdGEgc2hhcmUgcmVjZWl2ZWQgZnJvbSB0aGUgb3RoZXIgc2lnbmVyXG5cbiAgICAgICAgY29uc3QgaGFzaEdlbmVyYXRvciA9IChoYXNoVHlwZT86IHN0cmluZyk6IEhhc2ggfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICAgIHJldHVybiBoYXNoVHlwZSA9PT0gJ2tlY2NhazI1NicgPyAoY3JlYXRlS2VjY2FrSGFzaCgna2VjY2FrMjU2JykgYXMgSGFzaCkgOiB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IFtzaWduQSwgc2lnbkJdID0gW1xuICAgICAgICAgIE1QQy5zaWduKFxuICAgICAgICAgICAgTUVTU0FHRSxcbiAgICAgICAgICAgIHNpZ25Db21iaW5lT25lLm9TaGFyZSxcbiAgICAgICAgICAgIHNpZ25Db21iaW5lVHdvLmRTaGFyZSxcbiAgICAgICAgICAgIGhhc2hHZW5lcmF0b3IoY29uZmlnW2luZGV4XS5oYXNoKSxcbiAgICAgICAgICAgIGNvbmZpZ1tpbmRleF0uc2hvdWxkSGFzaCxcbiAgICAgICAgICApLFxuICAgICAgICAgIE1QQy5zaWduKFxuICAgICAgICAgICAgTUVTU0FHRSxcbiAgICAgICAgICAgIHNpZ25Db21iaW5lVHdvLm9TaGFyZSxcbiAgICAgICAgICAgIHNpZ25Db21iaW5lT25lLmRTaGFyZSxcbiAgICAgICAgICAgIGhhc2hHZW5lcmF0b3IoY29uZmlnW2luZGV4XS5oYXNoKSxcbiAgICAgICAgICAgIGNvbmZpZ1tpbmRleF0uc2hvdWxkSGFzaCxcbiAgICAgICAgICApLFxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIFN0ZXAgRWxldmVuXG4gICAgICAgIC8vIENvbnN0cnVjdCB0aGUgZmluYWwgc2lnbmF0dXJlXG5cbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gTVBDLmNvbnN0cnVjdFNpZ25hdHVyZShbc2lnbkEsIHNpZ25CXSk7XG5cbiAgICAgICAgLy8gU3RlcCBUd2VsdmVcbiAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZVxuXG4gICAgICAgIGNvbnN0IGlzVmFsaWQgPSBNUEMudmVyaWZ5KE1FU1NBR0UsIHNpZ25hdHVyZSwgaGFzaEdlbmVyYXRvcihjb25maWdbaW5kZXhdLmhhc2gpLCBjb25maWdbaW5kZXhdLnNob3VsZEhhc2gpO1xuICAgICAgICBpc1ZhbGlkLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eddsa.d.ts","sourceRoot":"","sources":["../../../../../../test/unit/mpc/tss/eddsa/eddsa.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,QAAQ,CAAC"}
|