@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,322 @@
|
|
|
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
|
+
require("should");
|
|
43
|
+
const assert_1 = __importDefault(require("assert"));
|
|
44
|
+
const bs58 = __importStar(require("bs58"));
|
|
45
|
+
const crypto_1 = require("crypto");
|
|
46
|
+
const sol = __importStar(require("@solana/web3.js"));
|
|
47
|
+
const src_1 = require("../../../../../src");
|
|
48
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
49
|
+
describe('TSS EDDSA key generation and signing', function () {
|
|
50
|
+
let MPC;
|
|
51
|
+
let hdTree;
|
|
52
|
+
before('initialize modules', async function () {
|
|
53
|
+
hdTree = await sdk_core_1.Ed25519BIP32.initialize();
|
|
54
|
+
MPC = await sdk_core_1.Eddsa.initialize(hdTree);
|
|
55
|
+
});
|
|
56
|
+
it('should fail to generate keys with invalid config', function () {
|
|
57
|
+
assert_1.default.throws(() => MPC.keyShare(0, 2, 3), /Invalid KeyShare config/);
|
|
58
|
+
assert_1.default.throws(() => MPC.keyShare(5, 2, 3), /Invalid KeyShare config/);
|
|
59
|
+
});
|
|
60
|
+
it('should sign and verify signature for low number public key', function () {
|
|
61
|
+
// We use little endian encoding. This means that the following value is a number that is shorter than 32 Bytes when
|
|
62
|
+
// leading zeroes are cut off. This is exactly what happened when we passed it to the sodium library for verifying
|
|
63
|
+
// the signature against the public key.
|
|
64
|
+
const y = '991b12a1b41b966a3382db32fe9b7fa9f80433940d0b17a1759f1e45ada83f00';
|
|
65
|
+
const R = 'b14386bb518b675357a4c79d2439166a5fc5a3a0e1c579c7b829eff1e7a7d967';
|
|
66
|
+
const signableHex = '01000307991b12a1b41b966a3382db32fe9b7fa9f80433940d0b17a1759f1e45ada83f0041536a20902b6d253b111fe5abe87757c123c28cc5fe4eb0da11b5857f3f38e65290384154058de76870e94672fc02e5f96f23e99307f08c56073ebea94cbc57d4d6429b650666264cbcdfe6070749d586d32781608958931e9b8d01636c4f320000000000000000000000000000000000000000000000000000000000000000b43af3bab20c3f39ef3c148c85640614a41043eeb306de5996380f10ec105a8e06ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a91073eab4660e8e3a957c7820d52df6338a8c7b60103bf903cb5f82118430922b02040200030c020000005819b217000000000604010502000a0cf40100000000000009';
|
|
67
|
+
const userToBitgoGShare = {
|
|
68
|
+
i: 1,
|
|
69
|
+
y,
|
|
70
|
+
R,
|
|
71
|
+
gamma: 'fcfd96d4ee4f3399b728b3c820a8eed4a6fa496828e84af2756197993b5df30b',
|
|
72
|
+
};
|
|
73
|
+
const bitgoToUserGShare = {
|
|
74
|
+
i: 3,
|
|
75
|
+
y,
|
|
76
|
+
R,
|
|
77
|
+
gamma: '89d5e45641dc93539a32a6651eaae2448db4d44f6d3040a1390beb14d0225c00',
|
|
78
|
+
};
|
|
79
|
+
const signature = MPC.signCombine([userToBitgoGShare, bitgoToUserGShare]);
|
|
80
|
+
const signablePayloadBuffer = Buffer.from(signableHex, 'hex');
|
|
81
|
+
const verificationResult = MPC.verify(signablePayloadBuffer, signature);
|
|
82
|
+
verificationResult.should.be.true();
|
|
83
|
+
});
|
|
84
|
+
it('should generate keys and sign message', function () {
|
|
85
|
+
const A = MPC.keyShare(1, 2, 3);
|
|
86
|
+
const B = MPC.keyShare(2, 2, 3);
|
|
87
|
+
const C = MPC.keyShare(3, 2, 3);
|
|
88
|
+
const A_combine = MPC.keyCombine(A.uShare, [B.yShares[1], C.yShares[1]]);
|
|
89
|
+
const B_combine = MPC.keyCombine(B.uShare, [A.yShares[2], C.yShares[2]]);
|
|
90
|
+
const C_combine = MPC.keyCombine(C.uShare, [A.yShares[3], B.yShares[3]]);
|
|
91
|
+
const message = 'MPC on a Friday night';
|
|
92
|
+
const message_buffer = Buffer.from(message);
|
|
93
|
+
const incorrect_message = 'MPC on a Monday night';
|
|
94
|
+
const incorrect_message_buffer = Buffer.from(incorrect_message);
|
|
95
|
+
// signing with A and B
|
|
96
|
+
let A_sign_share = MPC.signShare(message_buffer, A_combine.pShare, [A_combine.jShares[2]]);
|
|
97
|
+
let B_sign_share = MPC.signShare(message_buffer, B_combine.pShare, [B_combine.jShares[1]]);
|
|
98
|
+
let A_sign = MPC.sign(message_buffer, A_sign_share.xShare, [B_sign_share.rShares[1]], [C.yShares[1]]);
|
|
99
|
+
let B_sign = MPC.sign(message_buffer, B_sign_share.xShare, [A_sign_share.rShares[2]], [C.yShares[2]]);
|
|
100
|
+
let signature = MPC.signCombine([A_sign, B_sign]);
|
|
101
|
+
let result = MPC.verify(message_buffer, signature);
|
|
102
|
+
result.should.equal(true);
|
|
103
|
+
let resultTwo = MPC.verify(incorrect_message_buffer, signature);
|
|
104
|
+
resultTwo.should.equal(false);
|
|
105
|
+
// signing with A and C
|
|
106
|
+
A_sign_share = MPC.signShare(message_buffer, A_combine.pShare, [A_combine.jShares[3]]);
|
|
107
|
+
let C_sign_share = MPC.signShare(message_buffer, C_combine.pShare, [C_combine.jShares[1]]);
|
|
108
|
+
A_sign = MPC.sign(message_buffer, A_sign_share.xShare, [C_sign_share.rShares[1]], [B.yShares[1]]);
|
|
109
|
+
let C_sign = MPC.sign(message_buffer, C_sign_share.xShare, [A_sign_share.rShares[3]], [B.yShares[3]]);
|
|
110
|
+
signature = MPC.signCombine([A_sign, C_sign]);
|
|
111
|
+
result = MPC.verify(message_buffer, signature);
|
|
112
|
+
result.should.equal(true);
|
|
113
|
+
resultTwo = MPC.verify(incorrect_message_buffer, signature);
|
|
114
|
+
resultTwo.should.equal(false);
|
|
115
|
+
// signing with B and C
|
|
116
|
+
B_sign_share = MPC.signShare(message_buffer, B_combine.pShare, [B_combine.jShares[3]]);
|
|
117
|
+
C_sign_share = MPC.signShare(message_buffer, C_combine.pShare, [C_combine.jShares[2]]);
|
|
118
|
+
B_sign = MPC.sign(message_buffer, B_sign_share.xShare, [C_sign_share.rShares[2]], [A.yShares[2]]);
|
|
119
|
+
C_sign = MPC.sign(message_buffer, C_sign_share.xShare, [B_sign_share.rShares[3]], [A.yShares[3]]);
|
|
120
|
+
signature = MPC.signCombine([B_sign, C_sign]);
|
|
121
|
+
result = MPC.verify(message_buffer, signature);
|
|
122
|
+
result.should.equal(true);
|
|
123
|
+
resultTwo = MPC.verify(incorrect_message_buffer, signature);
|
|
124
|
+
resultTwo.should.equal(false);
|
|
125
|
+
});
|
|
126
|
+
it('should verify BIP32 subkey signature', function () {
|
|
127
|
+
const path = 'm/0/1/2';
|
|
128
|
+
const A = MPC.keyShare(1, 2, 3);
|
|
129
|
+
const B = MPC.keyShare(2, 2, 3);
|
|
130
|
+
const C = MPC.keyShare(3, 2, 3);
|
|
131
|
+
// Combine shares to common base address.
|
|
132
|
+
const A_combine = MPC.keyCombine(A.uShare, [B.yShares[1], C.yShares[1]]);
|
|
133
|
+
const B_combine = MPC.keyCombine(B.uShare, [A.yShares[2], C.yShares[2]]);
|
|
134
|
+
// Party A derives subkey P share and new Y shares.
|
|
135
|
+
const A_subkey = MPC.keyDerive(A.uShare, [B.yShares[1], C.yShares[1]], path);
|
|
136
|
+
// Party B calculates new P share using party A's subkey Y shares.
|
|
137
|
+
const B_subkey = MPC.keyCombine(B.uShare, [A_subkey.yShares[2], C.yShares[2]]);
|
|
138
|
+
// Derive the public subkeychain separately using the common keychain.
|
|
139
|
+
const subkey = hdTree.publicDerive({
|
|
140
|
+
pk: (0, sdk_core_1.bigIntFromBufferLE)(Buffer.from(A_combine.pShare.y, 'hex')),
|
|
141
|
+
chaincode: (0, sdk_core_1.bigIntFromBufferBE)(Buffer.from(A_combine.pShare.chaincode, 'hex')),
|
|
142
|
+
}, path);
|
|
143
|
+
const y = (0, sdk_core_1.bigIntToBufferLE)(subkey.pk, 32).toString('hex');
|
|
144
|
+
const chaincode = (0, sdk_core_1.bigIntToBufferBE)(subkey.chaincode, 32).toString('hex');
|
|
145
|
+
// Verify the keychain in the subkey P shares equals the separately derived public subkeychain.
|
|
146
|
+
A_subkey.pShare.y.should.equal(y);
|
|
147
|
+
A_subkey.pShare.chaincode.should.equal(chaincode);
|
|
148
|
+
B_subkey.pShare.y.should.equal(y);
|
|
149
|
+
B_subkey.pShare.chaincode.should.equal(chaincode);
|
|
150
|
+
const message = 'MPC on a Friday night';
|
|
151
|
+
const message_buffer = Buffer.from(message);
|
|
152
|
+
// Signing with A and B using subkey P shares.
|
|
153
|
+
const A_sign_share = MPC.signShare(message_buffer, A_subkey.pShare, [A_combine.jShares[2]]);
|
|
154
|
+
const B_sign_share = MPC.signShare(message_buffer, B_subkey.pShare, [B_combine.jShares[1]]);
|
|
155
|
+
const A_sign = MPC.sign(message_buffer, A_sign_share.xShare, [B_sign_share.rShares[1]], [C.yShares[1]]);
|
|
156
|
+
const B_sign = MPC.sign(message_buffer, B_sign_share.xShare, [A_sign_share.rShares[2]], [C.yShares[2]]);
|
|
157
|
+
const signature = MPC.signCombine([A_sign, B_sign]);
|
|
158
|
+
const result = MPC.verify(message_buffer, signature);
|
|
159
|
+
result.should.equal(true);
|
|
160
|
+
// Verify the public key in the signature equals the separately derived public subkey.
|
|
161
|
+
signature.y.should.equal(y);
|
|
162
|
+
});
|
|
163
|
+
it('should derive unhardened child keys', function () {
|
|
164
|
+
const A = MPC.keyShare(1, 2, 3);
|
|
165
|
+
const B = MPC.keyShare(2, 2, 3);
|
|
166
|
+
const C = MPC.keyShare(3, 2, 3);
|
|
167
|
+
const A_combine = MPC.keyCombine(A.uShare, [B.yShares[1], C.yShares[1]]);
|
|
168
|
+
const commonKeychain = A_combine.pShare.y + A_combine.pShare.chaincode;
|
|
169
|
+
for (let index = 0; index < 10; index++) {
|
|
170
|
+
const path = `m/0/0/${index}`;
|
|
171
|
+
const derive1 = MPC.deriveUnhardened(commonKeychain, path);
|
|
172
|
+
const subkey = MPC.keyDerive(A.uShare, [B.yShares[1], C.yShares[1]], path);
|
|
173
|
+
const derive2 = MPC.deriveUnhardened(commonKeychain, path);
|
|
174
|
+
const derivedPk = derive1.slice(0, 64);
|
|
175
|
+
(subkey.pShare.y + subkey.pShare.chaincode).should.equal(derive1);
|
|
176
|
+
derive1.should.equal(derive2, 'derivation should be deterministic');
|
|
177
|
+
const solAddress = bs58.encode(Buffer.from(derivedPk, 'hex'));
|
|
178
|
+
src_1.Sol.Utils.isValidPublicKey(solAddress).should.be.true();
|
|
179
|
+
const solPk = new sol.PublicKey(solAddress);
|
|
180
|
+
solPk.toBuffer().toString('hex').should.equal(derivedPk);
|
|
181
|
+
}
|
|
182
|
+
const rootPath = 'm/0';
|
|
183
|
+
const rootKeychain = MPC.deriveUnhardened(commonKeychain, rootPath);
|
|
184
|
+
const rootPublicKey = Buffer.from(rootKeychain, 'hex').slice(0, 32).toString('hex');
|
|
185
|
+
const solPk = new sol.PublicKey(bs58.encode(Buffer.from(rootPublicKey, 'hex')));
|
|
186
|
+
solPk.toBuffer().toString('hex').should.equal(rootPublicKey);
|
|
187
|
+
});
|
|
188
|
+
it('should derive unhardened valid dot child keys', function () {
|
|
189
|
+
const A = MPC.keyShare(1, 2, 3);
|
|
190
|
+
const B = MPC.keyShare(2, 2, 3);
|
|
191
|
+
const C = MPC.keyShare(3, 2, 3);
|
|
192
|
+
const A_combine = MPC.keyCombine(A.uShare, [B.yShares[1], C.yShares[1]]);
|
|
193
|
+
const commonKeychain = A_combine.pShare.y + A_combine.pShare.chaincode;
|
|
194
|
+
for (let index = 0; index < 10; index++) {
|
|
195
|
+
const path = `m/0/0/${index}`;
|
|
196
|
+
const derive1 = MPC.deriveUnhardened(commonKeychain, path);
|
|
197
|
+
const derive2 = MPC.deriveUnhardened(commonKeychain, path);
|
|
198
|
+
const derivedPk = Buffer.from(derive1, 'hex').slice(0, 32).toString('hex');
|
|
199
|
+
derive1.should.equal(derive2, 'derivation should be deterministic');
|
|
200
|
+
const pubKeyPair = new src_1.Dot.KeyPair({ pub: derivedPk });
|
|
201
|
+
pubKeyPair.getKeys().pub.should.equal(derivedPk);
|
|
202
|
+
}
|
|
203
|
+
const rootPath = 'm/';
|
|
204
|
+
const rootKeychain = MPC.deriveUnhardened(commonKeychain, rootPath);
|
|
205
|
+
const rootPublicKey = Buffer.from(rootKeychain, 'hex').slice(0, 32).toString('hex');
|
|
206
|
+
const pubKeyPair = new src_1.Dot.KeyPair({ pub: rootPublicKey });
|
|
207
|
+
pubKeyPair.getKeys().pub.should.equal(rootPublicKey);
|
|
208
|
+
});
|
|
209
|
+
it('should fail signing without meeting threshold', function () {
|
|
210
|
+
const A = MPC.keyShare(1, 2, 3);
|
|
211
|
+
const B = MPC.keyShare(2, 2, 3);
|
|
212
|
+
const C = MPC.keyShare(3, 2, 3);
|
|
213
|
+
const A_combine = MPC.keyCombine(A.uShare, [B.yShares[1], C.yShares[1]]);
|
|
214
|
+
const B_combine = MPC.keyCombine(B.uShare, [A.yShares[2], C.yShares[2]]);
|
|
215
|
+
const message = 'MPC on a Friday night';
|
|
216
|
+
const message_buffer = Buffer.from(message, 'utf-8');
|
|
217
|
+
const A_sign_share = MPC.signShare(message_buffer, A_combine.pShare, [A_combine.jShares[2]]);
|
|
218
|
+
const B_sign_share = MPC.signShare(message_buffer, B_combine.pShare, [B_combine.jShares[1]]);
|
|
219
|
+
const A_sign = MPC.sign(message_buffer, A_sign_share.xShare, [B_sign_share.rShares[1]]);
|
|
220
|
+
const signature = MPC.signCombine([A_sign]);
|
|
221
|
+
MPC.verify(message_buffer, signature).should.equal(false);
|
|
222
|
+
});
|
|
223
|
+
describe('with specific seed', function () {
|
|
224
|
+
it('should generate keys and sign message', function () {
|
|
225
|
+
const seed = (0, crypto_1.randomBytes)(64);
|
|
226
|
+
const A = MPC.keyShare(1, 2, 3, seed);
|
|
227
|
+
const B = MPC.keyShare(2, 2, 3, seed);
|
|
228
|
+
const C = MPC.keyShare(3, 2, 3, seed);
|
|
229
|
+
// Keys should be deterministic when using seed
|
|
230
|
+
MPC.keyShare(1, 2, 3, seed).should.deepEqual(A);
|
|
231
|
+
MPC.keyShare(2, 2, 3, seed).should.deepEqual(B);
|
|
232
|
+
MPC.keyShare(3, 2, 3, seed).should.deepEqual(C);
|
|
233
|
+
const A_combine = MPC.keyCombine(A.uShare, [B.yShares[1], C.yShares[1]]);
|
|
234
|
+
const B_combine = MPC.keyCombine(B.uShare, [A.yShares[2], C.yShares[2]]);
|
|
235
|
+
const C_combine = MPC.keyCombine(C.uShare, [A.yShares[3], B.yShares[3]]);
|
|
236
|
+
const message = 'MPC on a Friday night';
|
|
237
|
+
const message_buffer = Buffer.from(message);
|
|
238
|
+
// signing with A and B
|
|
239
|
+
let A_sign_share = MPC.signShare(message_buffer, A_combine.pShare, [A_combine.jShares[2]], seed);
|
|
240
|
+
let B_sign_share = MPC.signShare(message_buffer, B_combine.pShare, [B_combine.jShares[1]], seed);
|
|
241
|
+
let A_sign = MPC.sign(message_buffer, A_sign_share.xShare, [B_sign_share.rShares[1]], [C.yShares[1]]);
|
|
242
|
+
let B_sign = MPC.sign(message_buffer, B_sign_share.xShare, [A_sign_share.rShares[2]], [C.yShares[2]]);
|
|
243
|
+
let signature = MPC.signCombine([A_sign, B_sign]);
|
|
244
|
+
let result = MPC.verify(message_buffer, signature);
|
|
245
|
+
result.should.equal(true);
|
|
246
|
+
// signing with A and C
|
|
247
|
+
A_sign_share = MPC.signShare(message_buffer, A_combine.pShare, [A_combine.jShares[3]], seed);
|
|
248
|
+
let C_sign_share = MPC.signShare(message_buffer, C_combine.pShare, [C_combine.jShares[1]], seed);
|
|
249
|
+
A_sign = MPC.sign(message_buffer, A_sign_share.xShare, [C_sign_share.rShares[1]], [B.yShares[1]]);
|
|
250
|
+
let C_sign = MPC.sign(message_buffer, C_sign_share.xShare, [A_sign_share.rShares[3]], [B.yShares[3]]);
|
|
251
|
+
signature = MPC.signCombine([A_sign, C_sign]);
|
|
252
|
+
result = MPC.verify(message_buffer, signature);
|
|
253
|
+
result.should.equal(true);
|
|
254
|
+
// signing with B and C
|
|
255
|
+
B_sign_share = MPC.signShare(message_buffer, B_combine.pShare, [B_combine.jShares[3]], seed);
|
|
256
|
+
C_sign_share = MPC.signShare(message_buffer, C_combine.pShare, [C_combine.jShares[2]], seed);
|
|
257
|
+
B_sign = MPC.sign(message_buffer, B_sign_share.xShare, [C_sign_share.rShares[2]], [A.yShares[2]]);
|
|
258
|
+
C_sign = MPC.sign(message_buffer, C_sign_share.xShare, [B_sign_share.rShares[3]], [A.yShares[3]]);
|
|
259
|
+
signature = MPC.signCombine([B_sign, C_sign]);
|
|
260
|
+
result = MPC.verify(message_buffer, signature);
|
|
261
|
+
result.should.equal(true);
|
|
262
|
+
});
|
|
263
|
+
it('should verify BIP32 subkey signature', function () {
|
|
264
|
+
const seed = (0, crypto_1.randomBytes)(64);
|
|
265
|
+
const path = 'm/0/1/2';
|
|
266
|
+
const A = MPC.keyShare(1, 2, 3, seed);
|
|
267
|
+
const B = MPC.keyShare(2, 2, 3, seed);
|
|
268
|
+
const C = MPC.keyShare(3, 2, 3, seed);
|
|
269
|
+
// Keys should be deterministic when using seed
|
|
270
|
+
MPC.keyShare(1, 2, 3, seed).should.deepEqual(A);
|
|
271
|
+
MPC.keyShare(2, 2, 3, seed).should.deepEqual(B);
|
|
272
|
+
MPC.keyShare(3, 2, 3, seed).should.deepEqual(C);
|
|
273
|
+
// Combine shares to common base address.
|
|
274
|
+
const A_combine = MPC.keyCombine(A.uShare, [B.yShares[1], C.yShares[1]]);
|
|
275
|
+
const B_combine = MPC.keyCombine(B.uShare, [A.yShares[2], C.yShares[2]]);
|
|
276
|
+
// Party A derives subkey P share and new Y shares.
|
|
277
|
+
const A_subkey = MPC.keyDerive(A.uShare, [B.yShares[1], C.yShares[1]], path);
|
|
278
|
+
// Party B calculates new P share using party A's subkey Y shares.
|
|
279
|
+
const B_subkey = MPC.keyCombine(B.uShare, [A_subkey.yShares[2], C.yShares[2]]);
|
|
280
|
+
// Derive the public subkeychain separately using the common keychain.
|
|
281
|
+
const subkey = hdTree.publicDerive({
|
|
282
|
+
pk: (0, sdk_core_1.bigIntFromBufferLE)(Buffer.from(A_combine.pShare.y, 'hex')),
|
|
283
|
+
chaincode: (0, sdk_core_1.bigIntFromBufferBE)(Buffer.from(A_combine.pShare.chaincode, 'hex')),
|
|
284
|
+
}, path);
|
|
285
|
+
const y = (0, sdk_core_1.bigIntToBufferLE)(subkey.pk, 32).toString('hex');
|
|
286
|
+
const chaincode = (0, sdk_core_1.bigIntToBufferBE)(subkey.chaincode, 32).toString('hex');
|
|
287
|
+
// Verify the keychain in the subkey P shares equals the separately derived public subkeychain.
|
|
288
|
+
A_subkey.pShare.y.should.equal(y);
|
|
289
|
+
A_subkey.pShare.chaincode.should.equal(chaincode);
|
|
290
|
+
B_subkey.pShare.y.should.equal(y);
|
|
291
|
+
B_subkey.pShare.chaincode.should.equal(chaincode);
|
|
292
|
+
const message = 'MPC on a Friday night';
|
|
293
|
+
const message_buffer = Buffer.from(message);
|
|
294
|
+
// Signing with A and B using subkey P shares.
|
|
295
|
+
const A_sign_share = MPC.signShare(message_buffer, A_subkey.pShare, [A_combine.jShares[2]]);
|
|
296
|
+
const B_sign_share = MPC.signShare(message_buffer, B_subkey.pShare, [B_combine.jShares[1]]);
|
|
297
|
+
const A_sign = MPC.sign(message_buffer, A_sign_share.xShare, [B_sign_share.rShares[1]], [C.yShares[1]]);
|
|
298
|
+
const B_sign = MPC.sign(message_buffer, B_sign_share.xShare, [A_sign_share.rShares[2]], [C.yShares[2]]);
|
|
299
|
+
const signature = MPC.signCombine([A_sign, B_sign]);
|
|
300
|
+
const result = MPC.verify(message_buffer, signature);
|
|
301
|
+
result.should.equal(true);
|
|
302
|
+
// Verify the public key in the signature equals the separately derived public subkey.
|
|
303
|
+
signature.y.should.equal(y);
|
|
304
|
+
});
|
|
305
|
+
it('should fail if seed is not length 64', function () {
|
|
306
|
+
assert_1.default.throws(() => MPC.keyShare(1, 2, 3, (0, crypto_1.randomBytes)(33)), /Seed must have length 64/);
|
|
307
|
+
assert_1.default.throws(() => MPC.keyShare(1, 2, 3, (0, crypto_1.randomBytes)(66)), /Seed must have length 64/);
|
|
308
|
+
const fakePShare = {
|
|
309
|
+
i: 1,
|
|
310
|
+
t: 3,
|
|
311
|
+
n: 2,
|
|
312
|
+
y: 'yString',
|
|
313
|
+
u: 'uString',
|
|
314
|
+
prefix: 'prefix',
|
|
315
|
+
chaincode: 'chaincode',
|
|
316
|
+
};
|
|
317
|
+
assert_1.default.throws(() => MPC.signShare(Buffer.from('abcd', 'hex'), fakePShare, [], (0, crypto_1.randomBytes)(33)), /Seed must have length 64/);
|
|
318
|
+
assert_1.default.throws(() => MPC.signShare(Buffer.from('abcd', 'hex'), fakePShare, [], (0, crypto_1.randomBytes)(66)), /Seed must have length 64/);
|
|
319
|
+
});
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvbXBjL3Rzcy9lZGRzYS9lZGRzYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsa0JBQWdCO0FBQ2hCLG9EQUE0QjtBQUM1QiwyQ0FBNkI7QUFDN0IsbUNBQXFDO0FBQ3JDLHFEQUF1QztBQUV2Qyw0Q0FBOEM7QUFFOUMsbURBUThCO0FBRTlCLFFBQVEsQ0FBQyxzQ0FBc0MsRUFBRTtJQUMvQyxJQUFJLEdBQVUsQ0FBQztJQUNmLElBQUksTUFBYyxDQUFDO0lBRW5CLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxLQUFLO1FBQ2hDLE1BQU0sR0FBRyxNQUFNLHVCQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDekMsR0FBRyxHQUFHLE1BQU0sZ0JBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUU7UUFDckQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDdEUsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLHlCQUF5QixDQUFDLENBQUM7SUFDeEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNERBQTRELEVBQUU7UUFDL0Qsb0hBQW9IO1FBQ3BILGtIQUFrSDtRQUNsSCx3Q0FBd0M7UUFDeEMsTUFBTSxDQUFDLEdBQUcsa0VBQWtFLENBQUM7UUFDN0UsTUFBTSxDQUFDLEdBQUcsa0VB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Iiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgYnM1OCBmcm9tICdiczU4JztcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIHNvbCBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuXG5pbXBvcnQgeyBEb3QsIFNvbCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NyYyc7XG5cbmltcG9ydCB7XG4gIGJpZ0ludEZyb21CdWZmZXJMRSxcbiAgYmlnSW50VG9CdWZmZXJMRSxcbiAgYmlnSW50RnJvbUJ1ZmZlckJFLFxuICBiaWdJbnRUb0J1ZmZlckJFLFxuICBFZDI1NTE5QklQMzIsXG4gIEVkZHNhLFxuICBIRFRyZWUsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcblxuZGVzY3JpYmUoJ1RTUyBFRERTQSBrZXkgZ2VuZXJhdGlvbiBhbmQgc2lnbmluZycsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IE1QQzogRWRkc2E7XG4gIGxldCBoZFRyZWU6IEhEVHJlZTtcblxuICBiZWZvcmUoJ2luaXRpYWxpemUgbW9kdWxlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBoZFRyZWUgPSBhd2FpdCBFZDI1NTE5QklQMzIuaW5pdGlhbGl6ZSgpO1xuICAgIE1QQyA9IGF3YWl0IEVkZHNhLmluaXRpYWxpemUoaGRUcmVlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIHRvIGdlbmVyYXRlIGtleXMgd2l0aCBpbnZhbGlkIGNvbmZpZycsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IE1QQy5rZXlTaGFyZSgwLCAyLCAzKSwgL0ludmFsaWQgS2V5U2hhcmUgY29uZmlnLyk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBNUEMua2V5U2hhcmUoNSwgMiwgMyksIC9JbnZhbGlkIEtleVNoYXJlIGNvbmZpZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHNpZ24gYW5kIHZlcmlmeSBzaWduYXR1cmUgZm9yIGxvdyBudW1iZXIgcHVibGljIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBXZSB1c2UgbGl0dGxlIGVuZGlhbiBlbmNvZGluZy4gVGhpcyBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcgdmFsdWUgaXMgYSBudW1iZXIgdGhhdCBpcyBzaG9ydGVyIHRoYW4gMzIgQnl0ZXMgd2hlblxuICAgIC8vIGxlYWRpbmcgemVyb2VzIGFyZSBjdXQgb2ZmLiBUaGlzIGlzIGV4YWN0bHkgd2hhdCBoYXBwZW5lZCB3aGVuIHdlIHBhc3NlZCBpdCB0byB0aGUgc29kaXVtIGxpYnJhcnkgZm9yIHZlcmlmeWluZ1xuICAgIC8vIHRoZSBzaWduYXR1cmUgYWdhaW5zdCB0aGUgcHVibGljIGtleS5cbiAgICBjb25zdCB5ID0gJzk5MWIxMmExYjQxYjk2NmEzMzgyZGIzMmZlOWI3ZmE5ZjgwNDMzOTQwZDBiMTdhMTc1OWYxZTQ1YWRhODNmMDAnO1xuICAgIGNvbnN0IFIgPSAnYjE0Mzg2YmI1MThiNjc1MzU3YTRjNzlkMjQzOTE2NmE1ZmM1YTNhMGUxYzU3OWM3YjgyOWVmZjFlN2E3ZDk2Nyc7XG4gICAgY29uc3Qgc2lnbmFibGVIZXggPVxuICAgICAgJzAxMDAwMzA3OTkxYjEyYTFiNDFiOTY2YTMzODJkYjMyZmU5YjdmYTlmODA0MzM5NDBkMGIxN2ExNzU5ZjFlNDVhZGE4M2YwMDQxNTM2YTIwOTAyYjZkMjUzYjExMWZlNWFiZTg3NzU3YzEyM2MyOGNjNWZlNGViMGRhMTFiNTg1N2YzZjM4ZTY1MjkwMzg0MTU0MDU4ZGU3Njg3MGU5NDY3MmZjMDJlNWY5NmYyM2U5OTMwN2YwOGM1NjA3M2ViZWE5NGNiYzU3ZDRkNjQyOWI2NTA2NjYyNjRjYmNkZmU2MDcwNzQ5ZDU4NmQzMjc4MTYwODk1ODkzMWU5YjhkMDE2MzZjNGYzMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBiNDNhZjNiYWIyMGMzZjM5ZWYzYzE0OGM4NTY0MDYxNGE0MTA0M2VlYjMwNmRlNTk5NjM4MGYxMGVjMTA1YThlMDZkZGY2ZTFkNzY1YTE5M2Q5Y2JlMTQ2Y2VlYjc5YWMxY2I0ODVlZDVmNWIzNzkxM2E4Y2Y1ODU3ZWZmMDBhOTEwNzNlYWI0NjYwZThlM2E5NTdjNzgyMGQ1MmRmNjMzOGE4YzdiNjAxMDNiZjkwM2NiNWY4MjExODQzMDkyMmIwMjA0MDIwMDAzMGMwMjAwMDAwMDU4MTliMjE3MDAwMDAwMDAwNjA0MDEwNTAyMDAwYTBjZjQwMTAwMDAwMDAwMDAwMDA5JztcbiAgICBjb25zdCB1c2VyVG9CaXRnb0dTaGFyZSA9IHtcbiAgICAgIGk6IDEsXG4gICAgICB5LFxuICAgICAgUixcbiAgICAgIGdhbW1hOiAnZmNmZDk2ZDRlZTRmMzM5OWI3MjhiM2M4MjBhOGVlZDRhNmZhNDk2ODI4ZTg0YWYyNzU2MTk3OTkzYjVkZjMwYicsXG4gICAgfTtcbiAgICBjb25zdCBiaXRnb1RvVXNlckdTaGFyZSA9IHtcbiAgICAgIGk6IDMsXG4gICAgICB5LFxuICAgICAgUixcbiAgICAgIGdhbW1hOiAnODlkNWU0NTY0MWRjOTM1MzlhMzJhNjY1MWVhYWUyNDQ4ZGI0ZDQ0ZjZkMzA0MGExMzkwYmViMTRkMDIyNWMwMCcsXG4gICAgfTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IE1QQy5zaWduQ29tYmluZShbdXNlclRvQml0Z29HU2hhcmUsIGJpdGdvVG9Vc2VyR1NoYXJlXSk7XG4gICAgY29uc3Qgc2lnbmFibGVQYXlsb2FkQnVmZmVyID0gQnVmZmVyLmZyb20oc2lnbmFibGVIZXgsICdoZXgnKTtcbiAgICBjb25zdCB2ZXJpZmljYXRpb25SZXN1bHQgPSBNUEMudmVyaWZ5KHNpZ25hYmxlUGF5bG9hZEJ1ZmZlciwgc2lnbmF0dXJlKTtcbiAgICB2ZXJpZmljYXRpb25SZXN1bHQuc2hvdWxkLmJlLnRydWUoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBrZXlzIGFuZCBzaWduIG1lc3NhZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgQSA9IE1QQy5rZXlTaGFyZSgxLCAyLCAzKTtcbiAgICBjb25zdCBCID0gTVBDLmtleVNoYXJlKDIsIDIsIDMpO1xuICAgIGNvbnN0IEMgPSBNUEMua2V5U2hhcmUoMywgMiwgMyk7XG5cbiAgICBjb25zdCBBX2NvbWJpbmUgPSBNUEMua2V5Q29tYmluZShBLnVTaGFyZSwgW0IueVNoYXJlc1sxXSwgQy55U2hhcmVzWzFdXSk7XG4gICAgY29uc3QgQl9jb21iaW5lID0gTVBDLmtleUNvbWJpbmUoQi51U2hhcmUsIFtBLnlTaGFyZXNbMl0sIEMueVNoYXJlc1syXV0pO1xuICAgIGNvbnN0IENfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEMudVNoYXJlLCBbQS55U2hhcmVzWzNdLCBCLnlTaGFyZXNbM11dKTtcblxuICAgIGNvbnN0IG1lc3NhZ2UgPSAnTVBDIG9uIGEgRnJpZGF5IG5pZ2h0JztcbiAgICBjb25zdCBtZXNzYWdlX2J1ZmZlciA9IEJ1ZmZlci5mcm9tKG1lc3NhZ2UpO1xuXG4gICAgY29uc3QgaW5jb3JyZWN0X21lc3NhZ2UgPSAnTVBDIG9uIGEgTW9uZGF5IG5pZ2h0JztcbiAgICBjb25zdCBpbmNvcnJlY3RfbWVzc2FnZV9idWZmZXIgPSBCdWZmZXIuZnJvbShpbmNvcnJlY3RfbWVzc2FnZSk7XG5cbiAgICAvLyBzaWduaW5nIHdpdGggQSBhbmQgQlxuICAgIGxldCBBX3NpZ25fc2hhcmUgPSBNUEMuc2lnblNoYXJlKG1lc3NhZ2VfYnVmZmVyLCBBX2NvbWJpbmUucFNoYXJlLCBbQV9jb21iaW5lLmpTaGFyZXNbMl1dKTtcbiAgICBsZXQgQl9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQl9jb21iaW5lLnBTaGFyZSwgW0JfY29tYmluZS5qU2hhcmVzWzFdXSk7XG4gICAgbGV0IEFfc2lnbiA9IE1QQy5zaWduKG1lc3NhZ2VfYnVmZmVyLCBBX3NpZ25fc2hhcmUueFNoYXJlLCBbQl9zaWduX3NoYXJlLnJTaGFyZXNbMV1dLCBbQy55U2hhcmVzWzFdXSk7XG4gICAgbGV0IEJfc2lnbiA9IE1QQy5zaWduKG1lc3NhZ2VfYnVmZmVyLCBCX3NpZ25fc2hhcmUueFNoYXJlLCBbQV9zaWduX3NoYXJlLnJTaGFyZXNbMl1dLCBbQy55U2hhcmVzWzJdXSk7XG4gICAgbGV0IHNpZ25hdHVyZSA9IE1QQy5zaWduQ29tYmluZShbQV9zaWduLCBCX3NpZ25dKTtcbiAgICBsZXQgcmVzdWx0ID0gTVBDLnZlcmlmeShtZXNzYWdlX2J1ZmZlciwgc2lnbmF0dXJlKTtcbiAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIGxldCByZXN1bHRUd28gPSBNUEMudmVyaWZ5KGluY29ycmVjdF9tZXNzYWdlX2J1ZmZlciwgc2lnbmF0dXJlKTtcbiAgICByZXN1bHRUd28uc2hvdWxkLmVxdWFsKGZhbHNlKTtcblxuICAgIC8vIHNpZ25pbmcgd2l0aCBBIGFuZCBDXG4gICAgQV9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQV9jb21iaW5lLnBTaGFyZSwgW0FfY29tYmluZS5qU2hhcmVzWzNdXSk7XG4gICAgbGV0IENfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUobWVzc2FnZV9idWZmZXIsIENfY29tYmluZS5wU2hhcmUsIFtDX2NvbWJpbmUualNoYXJlc1sxXV0pO1xuICAgIEFfc2lnbiA9IE1QQy5zaWduKG1lc3NhZ2VfYnVmZmVyLCBBX3NpZ25fc2hhcmUueFNoYXJlLCBbQ19zaWduX3NoYXJlLnJTaGFyZXNbMV1dLCBbQi55U2hhcmVzWzFdXSk7XG4gICAgbGV0IENfc2lnbiA9IE1QQy5zaWduKG1lc3NhZ2VfYnVmZmVyLCBDX3NpZ25fc2hhcmUueFNoYXJlLCBbQV9zaWduX3NoYXJlLnJTaGFyZXNbM11dLCBbQi55U2hhcmVzWzNdXSk7XG4gICAgc2lnbmF0dXJlID0gTVBDLnNpZ25Db21iaW5lKFtBX3NpZ24sIENfc2lnbl0pO1xuICAgIHJlc3VsdCA9IE1QQy52ZXJpZnkobWVzc2FnZV9idWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICByZXN1bHRUd28gPSBNUEMudmVyaWZ5KGluY29ycmVjdF9tZXNzYWdlX2J1ZmZlciwgc2lnbmF0dXJlKTtcbiAgICByZXN1bHRUd28uc2hvdWxkLmVxdWFsKGZhbHNlKTtcblxuICAgIC8vIHNpZ25pbmcgd2l0aCBCIGFuZCBDXG4gICAgQl9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQl9jb21iaW5lLnBTaGFyZSwgW0JfY29tYmluZS5qU2hhcmVzWzNdXSk7XG4gICAgQ19zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQ19jb21iaW5lLnBTaGFyZSwgW0NfY29tYmluZS5qU2hhcmVzWzJdXSk7XG4gICAgQl9zaWduID0gTVBDLnNpZ24obWVzc2FnZV9idWZmZXIsIEJfc2lnbl9zaGFyZS54U2hhcmUsIFtDX3NpZ25fc2hhcmUuclNoYXJlc1syXV0sIFtBLnlTaGFyZXNbMl1dKTtcbiAgICBDX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQ19zaWduX3NoYXJlLnhTaGFyZSwgW0Jfc2lnbl9zaGFyZS5yU2hhcmVzWzNdXSwgW0EueVNoYXJlc1szXV0pO1xuICAgIHNpZ25hdHVyZSA9IE1QQy5zaWduQ29tYmluZShbQl9zaWduLCBDX3NpZ25dKTtcbiAgICByZXN1bHQgPSBNUEMudmVyaWZ5KG1lc3NhZ2VfYnVmZmVyLCBzaWduYXR1cmUpO1xuICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgcmVzdWx0VHdvID0gTVBDLnZlcmlmeShpbmNvcnJlY3RfbWVzc2FnZV9idWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgcmVzdWx0VHdvLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmVyaWZ5IEJJUDMyIHN1YmtleSBzaWduYXR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcGF0aCA9ICdtLzAvMS8yJztcbiAgICBjb25zdCBBID0gTVBDLmtleVNoYXJlKDEsIDIsIDMpO1xuICAgIGNvbnN0IEIgPSBNUEMua2V5U2hhcmUoMiwgMiwgMyk7XG4gICAgY29uc3QgQyA9IE1QQy5rZXlTaGFyZSgzLCAyLCAzKTtcblxuICAgIC8vIENvbWJpbmUgc2hhcmVzIHRvIGNvbW1vbiBiYXNlIGFkZHJlc3MuXG4gICAgY29uc3QgQV9jb21iaW5lID0gTVBDLmtleUNvbWJpbmUoQS51U2hhcmUsIFtCLnlTaGFyZXNbMV0sIEMueVNoYXJlc1sxXV0pO1xuICAgIGNvbnN0IEJfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEIudVNoYXJlLCBbQS55U2hhcmVzWzJdLCBDLnlTaGFyZXNbMl1dKTtcblxuICAgIC8vIFBhcnR5IEEgZGVyaXZlcyBzdWJrZXkgUCBzaGFyZSBhbmQgbmV3IFkgc2hhcmVzLlxuICAgIGNvbnN0IEFfc3Via2V5ID0gTVBDLmtleURlcml2ZShBLnVTaGFyZSwgW0IueVNoYXJlc1sxXSwgQy55U2hhcmVzWzFdXSwgcGF0aCk7XG5cbiAgICAvLyBQYXJ0eSBCIGNhbGN1bGF0ZXMgbmV3IFAgc2hhcmUgdXNpbmcgcGFydHkgQSdzIHN1YmtleSBZIHNoYXJlcy5cbiAgICBjb25zdCBCX3N1YmtleSA9IE1QQy5rZXlDb21iaW5lKEIudVNoYXJlLCBbQV9zdWJrZXkueVNoYXJlc1syXSwgQy55U2hhcmVzWzJdXSk7XG5cbiAgICAvLyBEZXJpdmUgdGhlIHB1YmxpYyBzdWJrZXljaGFpbiBzZXBhcmF0ZWx5IHVzaW5nIHRoZSBjb21tb24ga2V5Y2hhaW4uXG4gICAgY29uc3Qgc3Via2V5ID0gaGRUcmVlLnB1YmxpY0Rlcml2ZShcbiAgICAgIHtcbiAgICAgICAgcGs6IGJpZ0ludEZyb21CdWZmZXJMRShCdWZmZXIuZnJvbShBX2NvbWJpbmUucFNoYXJlLnksICdoZXgnKSksXG4gICAgICAgIGNoYWluY29kZTogYmlnSW50RnJvbUJ1ZmZlckJFKEJ1ZmZlci5mcm9tKEFfY29tYmluZS5wU2hhcmUuY2hhaW5jb2RlLCAnaGV4JykpLFxuICAgICAgfSxcbiAgICAgIHBhdGgsXG4gICAgKTtcbiAgICBjb25zdCB5ID0gYmlnSW50VG9CdWZmZXJMRShzdWJrZXkucGssIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgY2hhaW5jb2RlID0gYmlnSW50VG9CdWZmZXJCRShzdWJrZXkuY2hhaW5jb2RlLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgLy8gVmVyaWZ5IHRoZSBrZXljaGFpbiBpbiB0aGUgc3Via2V5IFAgc2hhcmVzIGVxdWFscyB0aGUgc2VwYXJhdGVseSBkZXJpdmVkIHB1YmxpYyBzdWJrZXljaGFpbi5cbiAgICBBX3N1YmtleS5wU2hhcmUueS5zaG91bGQuZXF1YWwoeSk7XG4gICAgQV9zdWJrZXkucFNoYXJlLmNoYWluY29kZS5zaG91bGQuZXF1YWwoY2hhaW5jb2RlKTtcbiAgICBCX3N1YmtleS5wU2hhcmUueS5zaG91bGQuZXF1YWwoeSk7XG4gICAgQl9zdWJrZXkucFNoYXJlLmNoYWluY29kZS5zaG91bGQuZXF1YWwoY2hhaW5jb2RlKTtcblxuICAgIGNvbnN0IG1lc3NhZ2UgPSAnTVBDIG9uIGEgRnJpZGF5IG5pZ2h0JztcbiAgICBjb25zdCBtZXNzYWdlX2J1ZmZlciA9IEJ1ZmZlci5mcm9tKG1lc3NhZ2UpO1xuXG4gICAgLy8gU2lnbmluZyB3aXRoIEEgYW5kIEIgdXNpbmcgc3Via2V5IFAgc2hhcmVzLlxuICAgIGNvbnN0IEFfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUobWVzc2FnZV9idWZmZXIsIEFfc3Via2V5LnBTaGFyZSwgW0FfY29tYmluZS5qU2hhcmVzWzJdXSk7XG4gICAgY29uc3QgQl9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQl9zdWJrZXkucFNoYXJlLCBbQl9jb21iaW5lLmpTaGFyZXNbMV1dKTtcbiAgICBjb25zdCBBX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQV9zaWduX3NoYXJlLnhTaGFyZSwgW0Jfc2lnbl9zaGFyZS5yU2hhcmVzWzFdXSwgW0MueVNoYXJlc1sxXV0pO1xuICAgIGNvbnN0IEJfc2lnbiA9IE1QQy5zaWduKG1lc3NhZ2VfYnVmZmVyLCBCX3NpZ25fc2hhcmUueFNoYXJlLCBbQV9zaWduX3NoYXJlLnJTaGFyZXNbMl1dLCBbQy55U2hhcmVzWzJdXSk7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gTVBDLnNpZ25Db21iaW5lKFtBX3NpZ24sIEJfc2lnbl0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IE1QQy52ZXJpZnkobWVzc2FnZV9idWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcblxuICAgIC8vIFZlcmlmeSB0aGUgcHVibGljIGtleSBpbiB0aGUgc2lnbmF0dXJlIGVxdWFscyB0aGUgc2VwYXJhdGVseSBkZXJpdmVkIHB1YmxpYyBzdWJrZXkuXG4gICAgc2lnbmF0dXJlLnkuc2hvdWxkLmVxdWFsKHkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRlcml2ZSB1bmhhcmRlbmVkIGNoaWxkIGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgQSA9IE1QQy5rZXlTaGFyZSgxLCAyLCAzKTtcbiAgICBjb25zdCBCID0gTVBDLmtleVNoYXJlKDIsIDIsIDMpO1xuICAgIGNvbnN0IEMgPSBNUEMua2V5U2hhcmUoMywgMiwgMyk7XG5cbiAgICBjb25zdCBBX2NvbWJpbmUgPSBNUEMua2V5Q29tYmluZShBLnVTaGFyZSwgW0IueVNoYXJlc1sxXSwgQy55U2hhcmVzWzFdXSk7XG5cbiAgICBjb25zdCBjb21tb25LZXljaGFpbiA9IEFfY29tYmluZS5wU2hhcmUueSArIEFfY29tYmluZS5wU2hhcmUuY2hhaW5jb2RlO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDEwOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBwYXRoID0gYG0vMC8wLyR7aW5kZXh9YDtcbiAgICAgIGNvbnN0IGRlcml2ZTEgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXljaGFpbiwgcGF0aCk7XG4gICAgICBjb25zdCBzdWJrZXkgPSBNUEMua2V5RGVyaXZlKEEudVNoYXJlLCBbQi55U2hhcmVzWzFdLCBDLnlTaGFyZXNbMV1dLCBwYXRoKTtcbiAgICAgIGNvbnN0IGRlcml2ZTIgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXljaGFpbiwgcGF0aCk7XG4gICAgICBjb25zdCBkZXJpdmVkUGsgPSBkZXJpdmUxLnNsaWNlKDAsIDY0KTtcblxuICAgICAgKHN1YmtleS5wU2hhcmUueSArIHN1YmtleS5wU2hhcmUuY2hhaW5jb2RlKS5zaG91bGQuZXF1YWwoZGVyaXZlMSk7XG4gICAgICBkZXJpdmUxLnNob3VsZC5lcXVhbChkZXJpdmUyLCAnZGVyaXZhdGlvbiBzaG91bGQgYmUgZGV0ZXJtaW5pc3RpYycpO1xuXG4gICAgICBjb25zdCBzb2xBZGRyZXNzID0gYnM1OC5lbmNvZGUoQnVmZmVyLmZyb20oZGVyaXZlZFBrLCAnaGV4JykpO1xuICAgICAgU29sLlV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoc29sQWRkcmVzcykuc2hvdWxkLmJlLnRydWUoKTtcblxuICAgICAgY29uc3Qgc29sUGsgPSBuZXcgc29sLlB1YmxpY0tleShzb2xBZGRyZXNzKTtcbiAgICAgIHNvbFBrLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbChkZXJpdmVkUGspO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3RQYXRoID0gJ20vMCc7XG4gICAgY29uc3Qgcm9vdEtleWNoYWluID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Y2hhaW4sIHJvb3RQYXRoKTtcbiAgICBjb25zdCByb290UHVibGljS2V5ID0gQnVmZmVyLmZyb20ocm9vdEtleWNoYWluLCAnaGV4Jykuc2xpY2UoMCwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBzb2xQayA9IG5ldyBzb2wuUHVibGljS2V5KGJzNTguZW5jb2RlKEJ1ZmZlci5mcm9tKHJvb3RQdWJsaWNLZXksICdoZXgnKSkpO1xuICAgIHNvbFBrLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbChyb290UHVibGljS2V5KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBkZXJpdmUgdW5oYXJkZW5lZCB2YWxpZCBkb3QgY2hpbGQga2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBBID0gTVBDLmtleVNoYXJlKDEsIDIsIDMpO1xuICAgIGNvbnN0IEIgPSBNUEMua2V5U2hhcmUoMiwgMiwgMyk7XG4gICAgY29uc3QgQyA9IE1QQy5rZXlTaGFyZSgzLCAyLCAzKTtcblxuICAgIGNvbnN0IEFfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEEudVNoYXJlLCBbQi55U2hhcmVzWzFdLCBDLnlTaGFyZXNbMV1dKTtcblxuICAgIGNvbnN0IGNvbW1vbktleWNoYWluID0gQV9jb21iaW5lLnBTaGFyZS55ICsgQV9jb21iaW5lLnBTaGFyZS5jaGFpbmNvZGU7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMTA7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHBhdGggPSBgbS8wLzAvJHtpbmRleH1gO1xuICAgICAgY29uc3QgZGVyaXZlMSA9IE1QQy5kZXJpdmVVbmhhcmRlbmVkKGNvbW1vbktleWNoYWluLCBwYXRoKTtcbiAgICAgIGNvbnN0IGRlcml2ZTIgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXljaGFpbiwgcGF0aCk7XG4gICAgICBjb25zdCBkZXJpdmVkUGsgPSBCdWZmZXIuZnJvbShkZXJpdmUxLCAnaGV4Jykuc2xpY2UoMCwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgICAgZGVyaXZlMS5zaG91bGQuZXF1YWwoZGVyaXZlMiwgJ2Rlcml2YXRpb24gc2hvdWxkIGJlIGRldGVybWluaXN0aWMnKTtcblxuICAgICAgY29uc3QgcHViS2V5UGFpciA9IG5ldyBEb3QuS2V5UGFpcih7IHB1YjogZGVyaXZlZFBrIH0pO1xuICAgICAgcHViS2V5UGFpci5nZXRLZXlzKCkucHViLnNob3VsZC5lcXVhbChkZXJpdmVkUGspO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3RQYXRoID0gJ20vJztcbiAgICBjb25zdCByb290S2V5Y2hhaW4gPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXljaGFpbiwgcm9vdFBhdGgpO1xuICAgIGNvbnN0IHJvb3RQdWJsaWNLZXkgPSBCdWZmZXIuZnJvbShyb290S2V5Y2hhaW4sICdoZXgnKS5zbGljZSgwLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHB1YktleVBhaXIgPSBuZXcgRG90LktleVBhaXIoeyBwdWI6IHJvb3RQdWJsaWNLZXkgfSk7XG4gICAgcHViS2V5UGFpci5nZXRLZXlzKCkucHViLnNob3VsZC5lcXVhbChyb290UHVibGljS2V5KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIHNpZ25pbmcgd2l0aG91dCBtZWV0aW5nIHRocmVzaG9sZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBBID0gTVBDLmtleVNoYXJlKDEsIDIsIDMpO1xuICAgIGNvbnN0IEIgPSBNUEMua2V5U2hhcmUoMiwgMiwgMyk7XG4gICAgY29uc3QgQyA9IE1QQy5rZXlTaGFyZSgzLCAyLCAzKTtcblxuICAgIGNvbnN0IEFfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEEudVNoYXJlLCBbQi55U2hhcmVzWzFdLCBDLnlTaGFyZXNbMV1dKTtcbiAgICBjb25zdCBCX2NvbWJpbmUgPSBNUEMua2V5Q29tYmluZShCLnVTaGFyZSwgW0EueVNoYXJlc1syXSwgQy55U2hhcmVzWzJdXSk7XG5cbiAgICBjb25zdCBtZXNzYWdlID0gJ01QQyBvbiBhIEZyaWRheSBuaWdodCc7XG4gICAgY29uc3QgbWVzc2FnZV9idWZmZXIgPSBCdWZmZXIuZnJvbShtZXNzYWdlLCAndXRmLTgnKTtcbiAgICBjb25zdCBBX3NpZ25fc2hhcmUgPSBNUEMuc2lnblNoYXJlKG1lc3NhZ2VfYnVmZmVyLCBBX2NvbWJpbmUucFNoYXJlLCBbQV9jb21iaW5lLmpTaGFyZXNbMl1dKTtcbiAgICBjb25zdCBCX3NpZ25fc2hhcmUgPSBNUEMuc2lnblNoYXJlKG1lc3NhZ2VfYnVmZmVyLCBCX2NvbWJpbmUucFNoYXJlLCBbQl9jb21iaW5lLmpTaGFyZXNbMV1dKTtcblxuICAgIGNvbnN0IEFfc2lnbiA9IE1QQy5zaWduKG1lc3NhZ2VfYnVmZmVyLCBBX3NpZ25fc2hhcmUueFNoYXJlLCBbQl9zaWduX3NoYXJlLnJTaGFyZXNbMV1dKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBNUEMuc2lnbkNvbWJpbmUoW0Ffc2lnbl0pO1xuICAgIE1QQy52ZXJpZnkobWVzc2FnZV9idWZmZXIsIHNpZ25hdHVyZSkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dpdGggc3BlY2lmaWMgc2VlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGtleXMgYW5kIHNpZ24gbWVzc2FnZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNlZWQgPSByYW5kb21CeXRlcyg2NCk7XG5cbiAgICAgIGNvbnN0IEEgPSBNUEMua2V5U2hhcmUoMSwgMiwgMywgc2VlZCk7XG4gICAgICBjb25zdCBCID0gTVBDLmtleVNoYXJlKDIsIDIsIDMsIHNlZWQpO1xuICAgICAgY29uc3QgQyA9IE1QQy5rZXlTaGFyZSgzLCAyLCAzLCBzZWVkKTtcblxuICAgICAgLy8gS2V5cyBzaG91bGQgYmUgZGV0ZXJtaW5pc3RpYyB3aGVuIHVzaW5nIHNlZWRcbiAgICAgIE1QQy5rZXlTaGFyZSgxLCAyLCAzLCBzZWVkKS5zaG91bGQuZGVlcEVxdWFsKEEpO1xuICAgICAgTVBDLmtleVNoYXJlKDIsIDIsIDMsIHNlZWQpLnNob3VsZC5kZWVwRXF1YWwoQik7XG4gICAgICBNUEMua2V5U2hhcmUoMywgMiwgMywgc2VlZCkuc2hvdWxkLmRlZXBFcXVhbChDKTtcblxuICAgICAgY29uc3QgQV9jb21iaW5lID0gTVBDLmtleUNvbWJpbmUoQS51U2hhcmUsIFtCLnlTaGFyZXNbMV0sIEMueVNoYXJlc1sxXV0pO1xuICAgICAgY29uc3QgQl9jb21iaW5lID0gTVBDLmtleUNvbWJpbmUoQi51U2hhcmUsIFtBLnlTaGFyZXNbMl0sIEMueVNoYXJlc1syXV0pO1xuICAgICAgY29uc3QgQ19jb21iaW5lID0gTVBDLmtleUNvbWJpbmUoQy51U2hhcmUsIFtBLnlTaGFyZXNbM10sIEIueVNoYXJlc1szXV0pO1xuXG4gICAgICBjb25zdCBtZXNzYWdlID0gJ01QQyBvbiBhIEZyaWRheSBuaWdodCc7XG4gICAgICBjb25zdCBtZXNzYWdlX2J1ZmZlciA9IEJ1ZmZlci5mcm9tKG1lc3NhZ2UpO1xuXG4gICAgICAvLyBzaWduaW5nIHdpdGggQSBhbmQgQlxuICAgICAgbGV0IEFfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUobWVzc2FnZV9idWZmZXIsIEFfY29tYmluZS5wU2hhcmUsIFtBX2NvbWJpbmUualNoYXJlc1syXV0sIHNlZWQpO1xuICAgICAgbGV0IEJfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUobWVzc2FnZV9idWZmZXIsIEJfY29tYmluZS5wU2hhcmUsIFtCX2NvbWJpbmUualNoYXJlc1sxXV0sIHNlZWQpO1xuICAgICAgbGV0IEFfc2lnbiA9IE1QQy5zaWduKG1lc3NhZ2VfYnVmZmVyLCBBX3NpZ25fc2hhcmUueFNoYXJlLCBbQl9zaWduX3NoYXJlLnJTaGFyZXNbMV1dLCBbQy55U2hhcmVzWzFdXSk7XG4gICAgICBsZXQgQl9zaWduID0gTVBDLnNpZ24obWVzc2FnZV9idWZmZXIsIEJfc2lnbl9zaGFyZS54U2hhcmUsIFtBX3NpZ25fc2hhcmUuclNoYXJlc1syXV0sIFtDLnlTaGFyZXNbMl1dKTtcbiAgICAgIGxldCBzaWduYXR1cmUgPSBNUEMuc2lnbkNvbWJpbmUoW0Ffc2lnbiwgQl9zaWduXSk7XG4gICAgICBsZXQgcmVzdWx0ID0gTVBDLnZlcmlmeShtZXNzYWdlX2J1ZmZlciwgc2lnbmF0dXJlKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG5cbiAgICAgIC8vIHNpZ25pbmcgd2l0aCBBIGFuZCBDXG4gICAgICBBX3NpZ25fc2hhcmUgPSBNUEMuc2lnblNoYXJlKG1lc3NhZ2VfYnVmZmVyLCBBX2NvbWJpbmUucFNoYXJlLCBbQV9jb21iaW5lLmpTaGFyZXNbM11dLCBzZWVkKTtcbiAgICAgIGxldCBDX3NpZ25fc2hhcmUgPSBNUEMuc2lnblNoYXJlKG1lc3NhZ2VfYnVmZmVyLCBDX2NvbWJpbmUucFNoYXJlLCBbQ19jb21iaW5lLmpTaGFyZXNbMV1dLCBzZWVkKTtcbiAgICAgIEFfc2lnbiA9IE1QQy5zaWduKG1lc3NhZ2VfYnVmZmVyLCBBX3NpZ25fc2hhcmUueFNoYXJlLCBbQ19zaWduX3NoYXJlLnJTaGFyZXNbMV1dLCBbQi55U2hhcmVzWzFdXSk7XG4gICAgICBsZXQgQ19zaWduID0gTVBDLnNpZ24obWVzc2FnZV9idWZmZXIsIENfc2lnbl9zaGFyZS54U2hhcmUsIFtBX3NpZ25fc2hhcmUuclNoYXJlc1szXV0sIFtCLnlTaGFyZXNbM11dKTtcbiAgICAgIHNpZ25hdHVyZSA9IE1QQy5zaWduQ29tYmluZShbQV9zaWduLCBDX3NpZ25dKTtcbiAgICAgIHJlc3VsdCA9IE1QQy52ZXJpZnkobWVzc2FnZV9idWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuXG4gICAgICAvLyBzaWduaW5nIHdpdGggQiBhbmQgQ1xuICAgICAgQl9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQl9jb21iaW5lLnBTaGFyZSwgW0JfY29tYmluZS5qU2hhcmVzWzNdXSwgc2VlZCk7XG4gICAgICBDX3NpZ25fc2hhcmUgPSBNUEMuc2lnblNoYXJlKG1lc3NhZ2VfYnVmZmVyLCBDX2NvbWJpbmUucFNoYXJlLCBbQ19jb21iaW5lLmpTaGFyZXNbMl1dLCBzZWVkKTtcbiAgICAgIEJfc2lnbiA9IE1QQy5zaWduKG1lc3NhZ2VfYnVmZmVyLCBCX3NpZ25fc2hhcmUueFNoYXJlLCBbQ19zaWduX3NoYXJlLnJTaGFyZXNbMl1dLCBbQS55U2hhcmVzWzJdXSk7XG4gICAgICBDX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQ19zaWduX3NoYXJlLnhTaGFyZSwgW0Jfc2lnbl9zaGFyZS5yU2hhcmVzWzNdXSwgW0EueVNoYXJlc1szXV0pO1xuICAgICAgc2lnbmF0dXJlID0gTVBDLnNpZ25Db21iaW5lKFtCX3NpZ24sIENfc2lnbl0pO1xuICAgICAgcmVzdWx0ID0gTVBDLnZlcmlmeShtZXNzYWdlX2J1ZmZlciwgc2lnbmF0dXJlKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSBCSVAzMiBzdWJrZXkgc2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2VlZCA9IHJhbmRvbUJ5dGVzKDY0KTtcbiAgICAgIGNvbnN0IHBhdGggPSAnbS8wLzEvMic7XG5cbiAgICAgIGNvbnN0IEEgPSBNUEMua2V5U2hhcmUoMSwgMiwgMywgc2VlZCk7XG4gICAgICBjb25zdCBCID0gTVBDLmtleVNoYXJlKDIsIDIsIDMsIHNlZWQpO1xuICAgICAgY29uc3QgQyA9IE1QQy5rZXlTaGFyZSgzLCAyLCAzLCBzZWVkKTtcblxuICAgICAgLy8gS2V5cyBzaG91bGQgYmUgZGV0ZXJtaW5pc3RpYyB3aGVuIHVzaW5nIHNlZWRcbiAgICAgIE1QQy5rZXlTaGFyZSgxLCAyLCAzLCBzZWVkKS5zaG91bGQuZGVlcEVxdWFsKEEpO1xuICAgICAgTVBDLmtleVNoYXJlKDIsIDIsIDMsIHNlZWQpLnNob3VsZC5kZWVwRXF1YWwoQik7XG4gICAgICBNUEMua2V5U2hhcmUoMywgMiwgMywgc2VlZCkuc2hvdWxkLmRlZXBFcXVhbChDKTtcblxuICAgICAgLy8gQ29tYmluZSBzaGFyZXMgdG8gY29tbW9uIGJhc2UgYWRkcmVzcy5cbiAgICAgIGNvbnN0IEFfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEEudVNoYXJlLCBbQi55U2hhcmVzWzFdLCBDLnlTaGFyZXNbMV1dKTtcbiAgICAgIGNvbnN0IEJfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEIudVNoYXJlLCBbQS55U2hhcmVzWzJdLCBDLnlTaGFyZXNbMl1dKTtcblxuICAgICAgLy8gUGFydHkgQSBkZXJpdmVzIHN1YmtleSBQIHNoYXJlIGFuZCBuZXcgWSBzaGFyZXMuXG4gICAgICBjb25zdCBBX3N1YmtleSA9IE1QQy5rZXlEZXJpdmUoQS51U2hhcmUsIFtCLnlTaGFyZXNbMV0sIEMueVNoYXJlc1sxXV0sIHBhdGgpO1xuXG4gICAgICAvLyBQYXJ0eSBCIGNhbGN1bGF0ZXMgbmV3IFAgc2hhcmUgdXNpbmcgcGFydHkgQSdzIHN1YmtleSBZIHNoYXJlcy5cbiAgICAgIGNvbnN0IEJfc3Via2V5ID0gTVBDLmtleUNvbWJpbmUoQi51U2hhcmUsIFtBX3N1YmtleS55U2hhcmVzWzJdLCBDLnlTaGFyZXNbMl1dKTtcblxuICAgICAgLy8gRGVyaXZlIHRoZSBwdWJsaWMgc3Via2V5Y2hhaW4gc2VwYXJhdGVseSB1c2luZyB0aGUgY29tbW9uIGtleWNoYWluLlxuICAgICAgY29uc3Qgc3Via2V5ID0gaGRUcmVlLnB1YmxpY0Rlcml2ZShcbiAgICAgICAge1xuICAgICAgICAgIHBrOiBiaWdJbnRGcm9tQnVmZmVyTEUoQnVmZmVyLmZyb20oQV9jb21iaW5lLnBTaGFyZS55LCAnaGV4JykpLFxuICAgICAgICAgIGNoYWluY29kZTogYmlnSW50RnJvbUJ1ZmZlckJFKEJ1ZmZlci5mcm9tKEFfY29tYmluZS5wU2hhcmUuY2hhaW5jb2RlLCAnaGV4JykpLFxuICAgICAgICB9LFxuICAgICAgICBwYXRoLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHkgPSBiaWdJbnRUb0J1ZmZlckxFKHN1YmtleS5waywgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IGNoYWluY29kZSA9IGJpZ0ludFRvQnVmZmVyQkUoc3Via2V5LmNoYWluY29kZSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgICAgLy8gVmVyaWZ5IHRoZSBrZXljaGFpbiBpbiB0aGUgc3Via2V5IFAgc2hhcmVzIGVxdWFscyB0aGUgc2VwYXJhdGVseSBkZXJpdmVkIHB1YmxpYyBzdWJrZXljaGFpbi5cbiAgICAgIEFfc3Via2V5LnBTaGFyZS55LnNob3VsZC5lcXVhbCh5KTtcbiAgICAgIEFfc3Via2V5LnBTaGFyZS5jaGFpbmNvZGUuc2hvdWxkLmVxdWFsKGNoYWluY29kZSk7XG4gICAgICBCX3N1YmtleS5wU2hhcmUueS5zaG91bGQuZXF1YWwoeSk7XG4gICAgICBCX3N1YmtleS5wU2hhcmUuY2hhaW5jb2RlLnNob3VsZC5lcXVhbChjaGFpbmNvZGUpO1xuXG4gICAgICBjb25zdCBtZXNzYWdlID0gJ01QQyBvbiBhIEZyaWRheSBuaWdodCc7XG4gICAgICBjb25zdCBtZXNzYWdlX2J1ZmZlciA9IEJ1ZmZlci5mcm9tKG1lc3NhZ2UpO1xuXG4gICAgICAvLyBTaWduaW5nIHdpdGggQSBhbmQgQiB1c2luZyBzdWJrZXkgUCBzaGFyZXMuXG4gICAgICBjb25zdCBBX3NpZ25fc2hhcmUgPSBNUEMuc2lnblNoYXJlKG1lc3NhZ2VfYnVmZmVyLCBBX3N1YmtleS5wU2hhcmUsIFtBX2NvbWJpbmUualNoYXJlc1syXV0pO1xuICAgICAgY29uc3QgQl9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQl9zdWJrZXkucFNoYXJlLCBbQl9jb21iaW5lLmpTaGFyZXNbMV1dKTtcbiAgICAgIGNvbnN0IEFfc2lnbiA9IE1QQy5zaWduKG1lc3NhZ2VfYnVmZmVyLCBBX3NpZ25fc2hhcmUueFNoYXJlLCBbQl9zaWduX3NoYXJlLnJTaGFyZXNbMV1dLCBbQy55U2hhcmVzWzFdXSk7XG4gICAgICBjb25zdCBCX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQl9zaWduX3NoYXJlLnhTaGFyZSwgW0Ffc2lnbl9zaGFyZS5yU2hhcmVzWzJdXSwgW0MueVNoYXJlc1syXV0pO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gTVBDLnNpZ25Db21iaW5lKFtBX3NpZ24sIEJfc2lnbl0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gTVBDLnZlcmlmeShtZXNzYWdlX2J1ZmZlciwgc2lnbmF0dXJlKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUgcHVibGljIGtleSBpbiB0aGUgc2lnbmF0dXJlIGVxdWFscyB0aGUgc2VwYXJhdGVseSBkZXJpdmVkIHB1YmxpYyBzdWJrZXkuXG4gICAgICBzaWduYXR1cmUueS5zaG91bGQuZXF1YWwoeSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgc2VlZCBpcyBub3QgbGVuZ3RoIDY0JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBNUEMua2V5U2hhcmUoMSwgMiwgMywgcmFuZG9tQnl0ZXMoMzMpKSwgL1NlZWQgbXVzdCBoYXZlIGxlbmd0aCA2NC8pO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBNUEMua2V5U2hhcmUoMSwgMiwgMywgcmFuZG9tQnl0ZXMoNjYpKSwgL1NlZWQgbXVzdCBoYXZlIGxlbmd0aCA2NC8pO1xuXG4gICAgICBjb25zdCBmYWtlUFNoYXJlID0ge1xuICAgICAgICBpOiAxLFxuICAgICAgICB0OiAzLFxuICAgICAgICBuOiAyLFxuICAgICAgICB5OiAneVN0cmluZycsXG4gICAgICAgIHU6ICd1U3RyaW5nJyxcbiAgICAgICAgcHJlZml4OiAncHJlZml4JyxcbiAgICAgICAgY2hhaW5jb2RlOiAnY2hhaW5jb2RlJyxcbiAgICAgIH07XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBNUEMuc2lnblNoYXJlKEJ1ZmZlci5mcm9tKCdhYmNkJywgJ2hleCcpLCBmYWtlUFNoYXJlLCBbXSwgcmFuZG9tQnl0ZXMoMzMpKSxcbiAgICAgICAgL1NlZWQgbXVzdCBoYXZlIGxlbmd0aCA2NC8sXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gTVBDLnNpZ25TaGFyZShCdWZmZXIuZnJvbSgnYWJjZCcsICdoZXgnKSwgZmFrZVBTaGFyZSwgW10sIHJhbmRvbUJ5dGVzKDY2KSksXG4gICAgICAgIC9TZWVkIG11c3QgaGF2ZSBsZW5ndGggNjQvLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
export declare const ntildes: {
|
|
2
|
+
ntilde: bigint;
|
|
3
|
+
h1: bigint;
|
|
4
|
+
h2: bigint;
|
|
5
|
+
}[];
|
|
6
|
+
export declare const paillerKeys: {
|
|
7
|
+
publicKey: {
|
|
8
|
+
n: bigint;
|
|
9
|
+
_n2: bigint;
|
|
10
|
+
g: bigint;
|
|
11
|
+
};
|
|
12
|
+
privateKey: {
|
|
13
|
+
lambda: bigint;
|
|
14
|
+
mu: bigint;
|
|
15
|
+
_p: bigint;
|
|
16
|
+
_q: bigint;
|
|
17
|
+
publicKey: {
|
|
18
|
+
n: bigint;
|
|
19
|
+
_n2: bigint;
|
|
20
|
+
g: bigint;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
}[];
|
|
24
|
+
export declare const schnorrProofs: {
|
|
25
|
+
vPoint: bigint;
|
|
26
|
+
r: bigint;
|
|
27
|
+
}[];
|
|
28
|
+
export declare const mockPShare: {
|
|
29
|
+
i: number;
|
|
30
|
+
t: number;
|
|
31
|
+
c: number;
|
|
32
|
+
l: string;
|
|
33
|
+
m: string;
|
|
34
|
+
n: string;
|
|
35
|
+
y: string;
|
|
36
|
+
u: string;
|
|
37
|
+
uu: string;
|
|
38
|
+
chaincode: string;
|
|
39
|
+
};
|
|
40
|
+
export declare const mockNShares: {
|
|
41
|
+
i: number;
|
|
42
|
+
j: number;
|
|
43
|
+
n: string;
|
|
44
|
+
y: string;
|
|
45
|
+
v: string;
|
|
46
|
+
u: string;
|
|
47
|
+
chaincode: string;
|
|
48
|
+
}[];
|
|
49
|
+
export declare const mockDKeyShare: {
|
|
50
|
+
xShare: {
|
|
51
|
+
i: number;
|
|
52
|
+
l: string;
|
|
53
|
+
m: string;
|
|
54
|
+
n: string;
|
|
55
|
+
y: string;
|
|
56
|
+
x: string;
|
|
57
|
+
chaincode: string;
|
|
58
|
+
schnorrProofX: {
|
|
59
|
+
vPoint: bigint;
|
|
60
|
+
r: bigint;
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
yShares: {
|
|
64
|
+
2: {
|
|
65
|
+
i: number;
|
|
66
|
+
j: number;
|
|
67
|
+
n: string;
|
|
68
|
+
};
|
|
69
|
+
3: {
|
|
70
|
+
i: number;
|
|
71
|
+
j: number;
|
|
72
|
+
n: string;
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
export declare const mockEKeyShare: {
|
|
77
|
+
xShare: {
|
|
78
|
+
i: number;
|
|
79
|
+
l: string;
|
|
80
|
+
m: string;
|
|
81
|
+
n: string;
|
|
82
|
+
y: string;
|
|
83
|
+
x: string;
|
|
84
|
+
chaincode: string;
|
|
85
|
+
schnorrProofX: {
|
|
86
|
+
vPoint: bigint;
|
|
87
|
+
r: bigint;
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
yShares: {
|
|
91
|
+
1: {
|
|
92
|
+
i: number;
|
|
93
|
+
j: number;
|
|
94
|
+
n: string;
|
|
95
|
+
};
|
|
96
|
+
3: {
|
|
97
|
+
i: number;
|
|
98
|
+
j: number;
|
|
99
|
+
n: string;
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
export declare const mockFKeyShare: {
|
|
104
|
+
xShare: {
|
|
105
|
+
i: number;
|
|
106
|
+
l: string;
|
|
107
|
+
m: string;
|
|
108
|
+
n: string;
|
|
109
|
+
y: string;
|
|
110
|
+
x: string;
|
|
111
|
+
chaincode: string;
|
|
112
|
+
schnorrProofX: {
|
|
113
|
+
vPoint: bigint;
|
|
114
|
+
r: bigint;
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
yShares: {
|
|
118
|
+
1: {
|
|
119
|
+
i: number;
|
|
120
|
+
j: number;
|
|
121
|
+
n: string;
|
|
122
|
+
};
|
|
123
|
+
2: {
|
|
124
|
+
i: number;
|
|
125
|
+
j: number;
|
|
126
|
+
n: string;
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
//# sourceMappingURL=ecdsa.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ecdsa.d.ts","sourceRoot":"","sources":["../../../../../../test/unit/mpc/tss/fixtures/ecdsa.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO;;;;GAuMnB,CAAC;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;GAmHvB,CAAC;AAEF,eAAO,MAAM,aAAa;;;GAyBzB,CAAC;AAEF,eAAO,MAAM,UAAU;;;;;;;;;;;CAWtB,CAAC;AAEF,eAAO,MAAM,WAAW;;;;;;;;GAmBvB,CAAC;AAGF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;CAuBzB,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;CAuBzB,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;CAuBzB,CAAC"}
|