@bitgo/account-lib 27.11.2 → 27.11.3

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.
Files changed (58) hide show
  1. package/dist/test/resources/ed25519Deriver.d.ts +15 -0
  2. package/dist/test/resources/ed25519Deriver.d.ts.map +1 -0
  3. package/dist/test/resources/ed25519Deriver.js +18 -0
  4. package/dist/test/resources/testTransaction.d.ts +11 -0
  5. package/dist/test/resources/testTransaction.d.ts.map +1 -0
  6. package/dist/test/resources/testTransaction.js +19 -0
  7. package/dist/test/resources/testTransactionBuilder.d.ts +26 -0
  8. package/dist/test/resources/testTransactionBuilder.d.ts.map +1 -0
  9. package/dist/test/resources/testTransactionBuilder.js +47 -0
  10. package/dist/test/unit/coin/baseCoin/transactionBuilder.d.ts +2 -0
  11. package/dist/test/unit/coin/baseCoin/transactionBuilder.d.ts.map +1 -0
  12. package/dist/test/unit/coin/baseCoin/transactionBuilder.js +135 -0
  13. package/dist/test/unit/fixtures.d.ts +16 -0
  14. package/dist/test/unit/fixtures.d.ts.map +1 -0
  15. package/dist/test/unit/fixtures.js +43 -0
  16. package/dist/test/unit/index.d.ts +2 -0
  17. package/dist/test/unit/index.d.ts.map +1 -0
  18. package/dist/test/unit/index.js +13 -0
  19. package/dist/test/unit/keyPair/index.d.ts +2 -0
  20. package/dist/test/unit/keyPair/index.d.ts.map +1 -0
  21. package/dist/test/unit/keyPair/index.js +132 -0
  22. package/dist/test/unit/messageFactory.d.ts +2 -0
  23. package/dist/test/unit/messageFactory.d.ts.map +1 -0
  24. package/dist/test/unit/messageFactory.js +52 -0
  25. package/dist/test/unit/mpc/tss/ecdsa/ecdsa.d.ts +2 -0
  26. package/dist/test/unit/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -0
  27. package/dist/test/unit/mpc/tss/ecdsa/ecdsa.js +333 -0
  28. package/dist/test/unit/mpc/tss/eddsa/eddsa.d.ts +5 -0
  29. package/dist/test/unit/mpc/tss/eddsa/eddsa.d.ts.map +1 -0
  30. package/dist/test/unit/mpc/tss/eddsa/eddsa.js +322 -0
  31. package/dist/test/unit/mpc/tss/fixtures/ecdsa.d.ts +130 -0
  32. package/dist/test/unit/mpc/tss/fixtures/ecdsa.d.ts.map +1 -0
  33. package/dist/test/unit/mpc/tss/fixtures/ecdsa.js +283 -0
  34. package/dist/test/unit/utils/crypto.d.ts +2 -0
  35. package/dist/test/unit/utils/crypto.d.ts.map +1 -0
  36. package/dist/test/unit/utils/crypto.js +60 -0
  37. package/dist/test/unit/utils/ed25519KeyDeriver.d.ts +2 -0
  38. package/dist/test/unit/utils/ed25519KeyDeriver.d.ts.map +1 -0
  39. package/dist/test/unit/utils/ed25519KeyDeriver.js +23 -0
  40. package/dist/test/unit/utils/index.d.ts +2 -0
  41. package/dist/test/unit/utils/index.d.ts.map +1 -0
  42. package/dist/test/unit/utils/index.js +61 -0
  43. package/dist/test/unit/utils/messages/index.d.ts +2 -0
  44. package/dist/test/unit/utils/messages/index.d.ts.map +1 -0
  45. package/dist/test/unit/utils/messages/index.js +51 -0
  46. package/dist/test/unit/verifyMessage.d.ts +2 -0
  47. package/dist/test/unit/verifyMessage.d.ts.map +1 -0
  48. package/dist/test/unit/verifyMessage.js +96 -0
  49. package/dist/tsconfig.tsbuildinfo +1 -1
  50. package/package.json +66 -63
  51. package/.mocharc.js +0 -10
  52. package/CHANGELOG.md +0 -1691
  53. package/DEVELOPER.md +0 -93
  54. package/resources/README.md +0 -17
  55. package/resources/cspr/contract/keys-manager.wasm +0 -0
  56. package/resources/dot/index.ts +0 -2
  57. package/resources/dot/mainnet.ts +0 -2
  58. 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/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvbXBjL3Rzcy9lZGRzYS9lZGRzYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsa0JBQWdCO0FBQ2hCLG9EQUE0QjtBQUM1QiwyQ0FBNkI7QUFDN0IsbUNBQXFDO0FBQ3JDLHFEQUF1QztBQUV2Qyw0Q0FBOEM7QUFFOUMsOENBUXlCO0FBRXpCLFFBQVEsQ0FBQyxzQ0FBc0MsRUFBRTtJQUMvQyxJQUFJLEdBQVUsQ0FBQztJQUNmLElBQUksTUFBYyxDQUFDO0lBRW5CLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxLQUFLO1FBQ2hDLE1BQU0sR0FBRyxNQUFNLHVCQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDekMsR0FBRyxHQUFHLE1BQU0sZ0JBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUU7UUFDckQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDdEUsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLHlCQUF5QixDQUFDLENBQUM7SUFDeEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNERBQTRELEVBQUU7UUFDL0Qsb0hBQW9IO1FBQ3BILGtIQUFrSDtRQUNsSCx3Q0FBd0M7UUFDeEMsTUFBTSxDQUFDLEdBQUcsa0VBQWtFLENBQUM7UUFDN0UsTUFBTSxDQUFDLEdBQUcsa0VB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Iiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgYnM1OCBmcm9tICdiczU4JztcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIHNvbCBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuXG5pbXBvcnQgeyBEb3QsIFNvbCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NyYyc7XG5cbmltcG9ydCB7XG4gIGJpZ0ludEZyb21CdWZmZXJMRSxcbiAgYmlnSW50VG9CdWZmZXJMRSxcbiAgYmlnSW50RnJvbUJ1ZmZlckJFLFxuICBiaWdJbnRUb0J1ZmZlckJFLFxuICBFZDI1NTE5QklQMzIsXG4gIEVkZHNhLFxuICBIRFRyZWUsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5cbmRlc2NyaWJlKCdUU1MgRUREU0Ega2V5IGdlbmVyYXRpb24gYW5kIHNpZ25pbmcnLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBNUEM6IEVkZHNhO1xuICBsZXQgaGRUcmVlOiBIRFRyZWU7XG5cbiAgYmVmb3JlKCdpbml0aWFsaXplIG1vZHVsZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgaGRUcmVlID0gYXdhaXQgRWQyNTUxOUJJUDMyLmluaXRpYWxpemUoKTtcbiAgICBNUEMgPSBhd2FpdCBFZGRzYS5pbml0aWFsaXplKGhkVHJlZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFpbCB0byBnZW5lcmF0ZSBrZXlzIHdpdGggaW52YWxpZCBjb25maWcnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBNUEMua2V5U2hhcmUoMCwgMiwgMyksIC9JbnZhbGlkIEtleVNoYXJlIGNvbmZpZy8pO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gTVBDLmtleVNoYXJlKDUsIDIsIDMpLCAvSW52YWxpZCBLZXlTaGFyZSBjb25maWcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzaWduIGFuZCB2ZXJpZnkgc2lnbmF0dXJlIGZvciBsb3cgbnVtYmVyIHB1YmxpYyBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gV2UgdXNlIGxpdHRsZSBlbmRpYW4gZW5jb2RpbmcuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIHZhbHVlIGlzIGEgbnVtYmVyIHRoYXQgaXMgc2hvcnRlciB0aGFuIDMyIEJ5dGVzIHdoZW5cbiAgICAvLyBsZWFkaW5nIHplcm9lcyBhcmUgY3V0IG9mZi4gVGhpcyBpcyBleGFjdGx5IHdoYXQgaGFwcGVuZWQgd2hlbiB3ZSBwYXNzZWQgaXQgdG8gdGhlIHNvZGl1bSBsaWJyYXJ5IGZvciB2ZXJpZnlpbmdcbiAgICAvLyB0aGUgc2lnbmF0dXJlIGFnYWluc3QgdGhlIHB1YmxpYyBrZXkuXG4gICAgY29uc3QgeSA9ICc5OTFiMTJhMWI0MWI5NjZhMzM4MmRiMzJmZTliN2ZhOWY4MDQzMzk0MGQwYjE3YTE3NTlmMWU0NWFkYTgzZjAwJztcbiAgICBjb25zdCBSID0gJ2IxNDM4NmJiNTE4YjY3NTM1N2E0Yzc5ZDI0MzkxNjZhNWZjNWEzYTBlMWM1NzljN2I4MjllZmYxZTdhN2Q5NjcnO1xuICAgIGNvbnN0IHNpZ25hYmxlSGV4ID1cbiAgICAgICcwMTAwMDMwNzk5MWIxMmExYjQxYjk2NmEzMzgyZGIzMmZlOWI3ZmE5ZjgwNDMzOTQwZDBiMTdhMTc1OWYxZTQ1YWRhODNmMDA0MTUzNmEyMDkwMmI2ZDI1M2IxMTFmZTVhYmU4Nzc1N2MxMjNjMjhjYzVmZTRlYjBkYTExYjU4NTdmM2YzOGU2NTI5MDM4NDE1NDA1OGRlNzY4NzBlOTQ2NzJmYzAyZTVmOTZmMjNlOTkzMDdmMDhjNTYwNzNlYmVhOTRjYmM1N2Q0ZDY0MjliNjUwNjY2MjY0Y2JjZGZlNjA3MDc0OWQ1ODZkMzI3ODE2MDg5NTg5MzFlOWI4ZDAxNjM2YzRmMzIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYjQzYWYzYmFiMjBjM2YzOWVmM2MxNDhjODU2NDA2MTRhNDEwNDNlZWIzMDZkZTU5OTYzODBmMTBlYzEwNWE4ZTA2ZGRmNmUxZDc2NWExOTNkOWNiZTE0NmNlZWI3OWFjMWNiNDg1ZWQ1ZjViMzc5MTNhOGNmNTg1N2VmZjAwYTkxMDczZWFiNDY2MGU4ZTNhOTU3Yzc4MjBkNTJkZjYzMzhhOGM3YjYwMTAzYmY5MDNjYjVmODIxMTg0MzA5MjJiMDIwNDAyMDAwMzBjMDIwMDAwMDA1ODE5YjIxNzAwMDAwMDAwMDYwNDAxMDUwMjAwMGEwY2Y0MDEwMDAwMDAwMDAwMDAwOSc7XG4gICAgY29uc3QgdXNlclRvQml0Z29HU2hhcmUgPSB7XG4gICAgICBpOiAxLFxuICAgICAgeSxcbiAgICAgIFIsXG4gICAgICBnYW1tYTogJ2ZjZmQ5NmQ0ZWU0ZjMzOTliNzI4YjNjODIwYThlZWQ0YTZmYTQ5NjgyOGU4NGFmMjc1NjE5Nzk5M2I1ZGYzMGInLFxuICAgIH07XG4gICAgY29uc3QgYml0Z29Ub1VzZXJHU2hhcmUgPSB7XG4gICAgICBpOiAzLFxuICAgICAgeSxcbiAgICAgIFIsXG4gICAgICBnYW1tYTogJzg5ZDVlNDU2NDFkYzkzNTM5YTMyYTY2NTFlYWFlMjQ0OGRiNGQ0NGY2ZDMwNDBhMTM5MGJlYjE0ZDAyMjVjMDAnLFxuICAgIH07XG5cbiAgICBjb25zdCBzaWduYXR1cmUgPSBNUEMuc2lnbkNvbWJpbmUoW3VzZXJUb0JpdGdvR1NoYXJlLCBiaXRnb1RvVXNlckdTaGFyZV0pO1xuICAgIGNvbnN0IHNpZ25hYmxlUGF5bG9hZEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHNpZ25hYmxlSGV4LCAnaGV4Jyk7XG4gICAgY29uc3QgdmVyaWZpY2F0aW9uUmVzdWx0ID0gTVBDLnZlcmlmeShzaWduYWJsZVBheWxvYWRCdWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgdmVyaWZpY2F0aW9uUmVzdWx0LnNob3VsZC5iZS50cnVlKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUga2V5cyBhbmQgc2lnbiBtZXNzYWdlJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IEEgPSBNUEMua2V5U2hhcmUoMSwgMiwgMyk7XG4gICAgY29uc3QgQiA9IE1QQy5rZXlTaGFyZSgyLCAyLCAzKTtcbiAgICBjb25zdCBDID0gTVBDLmtleVNoYXJlKDMsIDIsIDMpO1xuXG4gICAgY29uc3QgQV9jb21iaW5lID0gTVBDLmtleUNvbWJpbmUoQS51U2hhcmUsIFtCLnlTaGFyZXNbMV0sIEMueVNoYXJlc1sxXV0pO1xuICAgIGNvbnN0IEJfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEIudVNoYXJlLCBbQS55U2hhcmVzWzJdLCBDLnlTaGFyZXNbMl1dKTtcbiAgICBjb25zdCBDX2NvbWJpbmUgPSBNUEMua2V5Q29tYmluZShDLnVTaGFyZSwgW0EueVNoYXJlc1szXSwgQi55U2hhcmVzWzNdXSk7XG5cbiAgICBjb25zdCBtZXNzYWdlID0gJ01QQyBvbiBhIEZyaWRheSBuaWdodCc7XG4gICAgY29uc3QgbWVzc2FnZV9idWZmZXIgPSBCdWZmZXIuZnJvbShtZXNzYWdlKTtcblxuICAgIGNvbnN0IGluY29ycmVjdF9tZXNzYWdlID0gJ01QQyBvbiBhIE1vbmRheSBuaWdodCc7XG4gICAgY29uc3QgaW5jb3JyZWN0X21lc3NhZ2VfYnVmZmVyID0gQnVmZmVyLmZyb20oaW5jb3JyZWN0X21lc3NhZ2UpO1xuXG4gICAgLy8gc2lnbmluZyB3aXRoIEEgYW5kIEJcbiAgICBsZXQgQV9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQV9jb21iaW5lLnBTaGFyZSwgW0FfY29tYmluZS5qU2hhcmVzWzJdXSk7XG4gICAgbGV0IEJfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUobWVzc2FnZV9idWZmZXIsIEJfY29tYmluZS5wU2hhcmUsIFtCX2NvbWJpbmUualNoYXJlc1sxXV0pO1xuICAgIGxldCBBX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQV9zaWduX3NoYXJlLnhTaGFyZSwgW0Jfc2lnbl9zaGFyZS5yU2hhcmVzWzFdXSwgW0MueVNoYXJlc1sxXV0pO1xuICAgIGxldCBCX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQl9zaWduX3NoYXJlLnhTaGFyZSwgW0Ffc2lnbl9zaGFyZS5yU2hhcmVzWzJdXSwgW0MueVNoYXJlc1syXV0pO1xuICAgIGxldCBzaWduYXR1cmUgPSBNUEMuc2lnbkNvbWJpbmUoW0Ffc2lnbiwgQl9zaWduXSk7XG4gICAgbGV0IHJlc3VsdCA9IE1QQy52ZXJpZnkobWVzc2FnZV9idWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICBsZXQgcmVzdWx0VHdvID0gTVBDLnZlcmlmeShpbmNvcnJlY3RfbWVzc2FnZV9idWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgcmVzdWx0VHdvLnNob3VsZC5lcXVhbChmYWxzZSk7XG5cbiAgICAvLyBzaWduaW5nIHdpdGggQSBhbmQgQ1xuICAgIEFfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUobWVzc2FnZV9idWZmZXIsIEFfY29tYmluZS5wU2hhcmUsIFtBX2NvbWJpbmUualNoYXJlc1szXV0pO1xuICAgIGxldCBDX3NpZ25fc2hhcmUgPSBNUEMuc2lnblNoYXJlKG1lc3NhZ2VfYnVmZmVyLCBDX2NvbWJpbmUucFNoYXJlLCBbQ19jb21iaW5lLmpTaGFyZXNbMV1dKTtcbiAgICBBX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQV9zaWduX3NoYXJlLnhTaGFyZSwgW0Nfc2lnbl9zaGFyZS5yU2hhcmVzWzFdXSwgW0IueVNoYXJlc1sxXV0pO1xuICAgIGxldCBDX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQ19zaWduX3NoYXJlLnhTaGFyZSwgW0Ffc2lnbl9zaGFyZS5yU2hhcmVzWzNdXSwgW0IueVNoYXJlc1szXV0pO1xuICAgIHNpZ25hdHVyZSA9IE1QQy5zaWduQ29tYmluZShbQV9zaWduLCBDX3NpZ25dKTtcbiAgICByZXN1bHQgPSBNUEMudmVyaWZ5KG1lc3NhZ2VfYnVmZmVyLCBzaWduYXR1cmUpO1xuICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgcmVzdWx0VHdvID0gTVBDLnZlcmlmeShpbmNvcnJlY3RfbWVzc2FnZV9idWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgcmVzdWx0VHdvLnNob3VsZC5lcXVhbChmYWxzZSk7XG5cbiAgICAvLyBzaWduaW5nIHdpdGggQiBhbmQgQ1xuICAgIEJfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUobWVzc2FnZV9idWZmZXIsIEJfY29tYmluZS5wU2hhcmUsIFtCX2NvbWJpbmUualNoYXJlc1szXV0pO1xuICAgIENfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUobWVzc2FnZV9idWZmZXIsIENfY29tYmluZS5wU2hhcmUsIFtDX2NvbWJpbmUualNoYXJlc1syXV0pO1xuICAgIEJfc2lnbiA9IE1QQy5zaWduKG1lc3NhZ2VfYnVmZmVyLCBCX3NpZ25fc2hhcmUueFNoYXJlLCBbQ19zaWduX3NoYXJlLnJTaGFyZXNbMl1dLCBbQS55U2hhcmVzWzJdXSk7XG4gICAgQ19zaWduID0gTVBDLnNpZ24obWVzc2FnZV9idWZmZXIsIENfc2lnbl9zaGFyZS54U2hhcmUsIFtCX3NpZ25fc2hhcmUuclNoYXJlc1szXV0sIFtBLnlTaGFyZXNbM11dKTtcbiAgICBzaWduYXR1cmUgPSBNUEMuc2lnbkNvbWJpbmUoW0Jfc2lnbiwgQ19zaWduXSk7XG4gICAgcmVzdWx0ID0gTVBDLnZlcmlmeShtZXNzYWdlX2J1ZmZlciwgc2lnbmF0dXJlKTtcbiAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIHJlc3VsdFR3byA9IE1QQy52ZXJpZnkoaW5jb3JyZWN0X21lc3NhZ2VfYnVmZmVyLCBzaWduYXR1cmUpO1xuICAgIHJlc3VsdFR3by5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHZlcmlmeSBCSVAzMiBzdWJrZXkgc2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHBhdGggPSAnbS8wLzEvMic7XG4gICAgY29uc3QgQSA9IE1QQy5rZXlTaGFyZSgxLCAyLCAzKTtcbiAgICBjb25zdCBCID0gTVBDLmtleVNoYXJlKDIsIDIsIDMpO1xuICAgIGNvbnN0IEMgPSBNUEMua2V5U2hhcmUoMywgMiwgMyk7XG5cbiAgICAvLyBDb21iaW5lIHNoYXJlcyB0byBjb21tb24gYmFzZSBhZGRyZXNzLlxuICAgIGNvbnN0IEFfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEEudVNoYXJlLCBbQi55U2hhcmVzWzFdLCBDLnlTaGFyZXNbMV1dKTtcbiAgICBjb25zdCBCX2NvbWJpbmUgPSBNUEMua2V5Q29tYmluZShCLnVTaGFyZSwgW0EueVNoYXJlc1syXSwgQy55U2hhcmVzWzJdXSk7XG5cbiAgICAvLyBQYXJ0eSBBIGRlcml2ZXMgc3Via2V5IFAgc2hhcmUgYW5kIG5ldyBZIHNoYXJlcy5cbiAgICBjb25zdCBBX3N1YmtleSA9IE1QQy5rZXlEZXJpdmUoQS51U2hhcmUsIFtCLnlTaGFyZXNbMV0sIEMueVNoYXJlc1sxXV0sIHBhdGgpO1xuXG4gICAgLy8gUGFydHkgQiBjYWxjdWxhdGVzIG5ldyBQIHNoYXJlIHVzaW5nIHBhcnR5IEEncyBzdWJrZXkgWSBzaGFyZXMuXG4gICAgY29uc3QgQl9zdWJrZXkgPSBNUEMua2V5Q29tYmluZShCLnVTaGFyZSwgW0Ffc3Via2V5LnlTaGFyZXNbMl0sIEMueVNoYXJlc1syXV0pO1xuXG4gICAgLy8gRGVyaXZlIHRoZSBwdWJsaWMgc3Via2V5Y2hhaW4gc2VwYXJhdGVseSB1c2luZyB0aGUgY29tbW9uIGtleWNoYWluLlxuICAgIGNvbnN0IHN1YmtleSA9IGhkVHJlZS5wdWJsaWNEZXJpdmUoXG4gICAgICB7XG4gICAgICAgIHBrOiBiaWdJbnRGcm9tQnVmZmVyTEUoQnVmZmVyLmZyb20oQV9jb21iaW5lLnBTaGFyZS55LCAnaGV4JykpLFxuICAgICAgICBjaGFpbmNvZGU6IGJpZ0ludEZyb21CdWZmZXJCRShCdWZmZXIuZnJvbShBX2NvbWJpbmUucFNoYXJlLmNoYWluY29kZSwgJ2hleCcpKSxcbiAgICAgIH0sXG4gICAgICBwYXRoLFxuICAgICk7XG4gICAgY29uc3QgeSA9IGJpZ0ludFRvQnVmZmVyTEUoc3Via2V5LnBrLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IGNoYWluY29kZSA9IGJpZ0ludFRvQnVmZmVyQkUoc3Via2V5LmNoYWluY29kZSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIC8vIFZlcmlmeSB0aGUga2V5Y2hhaW4gaW4gdGhlIHN1YmtleSBQIHNoYXJlcyBlcXVhbHMgdGhlIHNlcGFyYXRlbHkgZGVyaXZlZCBwdWJsaWMgc3Via2V5Y2hhaW4uXG4gICAgQV9zdWJrZXkucFNoYXJlLnkuc2hvdWxkLmVxdWFsKHkpO1xuICAgIEFfc3Via2V5LnBTaGFyZS5jaGFpbmNvZGUuc2hvdWxkLmVxdWFsKGNoYWluY29kZSk7XG4gICAgQl9zdWJrZXkucFNoYXJlLnkuc2hvdWxkLmVxdWFsKHkpO1xuICAgIEJfc3Via2V5LnBTaGFyZS5jaGFpbmNvZGUuc2hvdWxkLmVxdWFsKGNoYWluY29kZSk7XG5cbiAgICBjb25zdCBtZXNzYWdlID0gJ01QQyBvbiBhIEZyaWRheSBuaWdodCc7XG4gICAgY29uc3QgbWVzc2FnZV9idWZmZXIgPSBCdWZmZXIuZnJvbShtZXNzYWdlKTtcblxuICAgIC8vIFNpZ25pbmcgd2l0aCBBIGFuZCBCIHVzaW5nIHN1YmtleSBQIHNoYXJlcy5cbiAgICBjb25zdCBBX3NpZ25fc2hhcmUgPSBNUEMuc2lnblNoYXJlKG1lc3NhZ2VfYnVmZmVyLCBBX3N1YmtleS5wU2hhcmUsIFtBX2NvbWJpbmUualNoYXJlc1syXV0pO1xuICAgIGNvbnN0IEJfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUobWVzc2FnZV9idWZmZXIsIEJfc3Via2V5LnBTaGFyZSwgW0JfY29tYmluZS5qU2hhcmVzWzFdXSk7XG4gICAgY29uc3QgQV9zaWduID0gTVBDLnNpZ24obWVzc2FnZV9idWZmZXIsIEFfc2lnbl9zaGFyZS54U2hhcmUsIFtCX3NpZ25fc2hhcmUuclNoYXJlc1sxXV0sIFtDLnlTaGFyZXNbMV1dKTtcbiAgICBjb25zdCBCX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQl9zaWduX3NoYXJlLnhTaGFyZSwgW0Ffc2lnbl9zaGFyZS5yU2hhcmVzWzJdXSwgW0MueVNoYXJlc1syXV0pO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IE1QQy5zaWduQ29tYmluZShbQV9zaWduLCBCX3NpZ25dKTtcbiAgICBjb25zdCByZXN1bHQgPSBNUEMudmVyaWZ5KG1lc3NhZ2VfYnVmZmVyLCBzaWduYXR1cmUpO1xuICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG5cbiAgICAvLyBWZXJpZnkgdGhlIHB1YmxpYyBrZXkgaW4gdGhlIHNpZ25hdHVyZSBlcXVhbHMgdGhlIHNlcGFyYXRlbHkgZGVyaXZlZCBwdWJsaWMgc3Via2V5LlxuICAgIHNpZ25hdHVyZS55LnNob3VsZC5lcXVhbCh5KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBkZXJpdmUgdW5oYXJkZW5lZCBjaGlsZCBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IEEgPSBNUEMua2V5U2hhcmUoMSwgMiwgMyk7XG4gICAgY29uc3QgQiA9IE1QQy5rZXlTaGFyZSgyLCAyLCAzKTtcbiAgICBjb25zdCBDID0gTVBDLmtleVNoYXJlKDMsIDIsIDMpO1xuXG4gICAgY29uc3QgQV9jb21iaW5lID0gTVBDLmtleUNvbWJpbmUoQS51U2hhcmUsIFtCLnlTaGFyZXNbMV0sIEMueVNoYXJlc1sxXV0pO1xuXG4gICAgY29uc3QgY29tbW9uS2V5Y2hhaW4gPSBBX2NvbWJpbmUucFNoYXJlLnkgKyBBX2NvbWJpbmUucFNoYXJlLmNoYWluY29kZTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCAxMDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgcGF0aCA9IGBtLzAvMC8ke2luZGV4fWA7XG4gICAgICBjb25zdCBkZXJpdmUxID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Y2hhaW4sIHBhdGgpO1xuICAgICAgY29uc3Qgc3Via2V5ID0gTVBDLmtleURlcml2ZShBLnVTaGFyZSwgW0IueVNoYXJlc1sxXSwgQy55U2hhcmVzWzFdXSwgcGF0aCk7XG4gICAgICBjb25zdCBkZXJpdmUyID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Y2hhaW4sIHBhdGgpO1xuICAgICAgY29uc3QgZGVyaXZlZFBrID0gZGVyaXZlMS5zbGljZSgwLCA2NCk7XG5cbiAgICAgIChzdWJrZXkucFNoYXJlLnkgKyBzdWJrZXkucFNoYXJlLmNoYWluY29kZSkuc2hvdWxkLmVxdWFsKGRlcml2ZTEpO1xuICAgICAgZGVyaXZlMS5zaG91bGQuZXF1YWwoZGVyaXZlMiwgJ2Rlcml2YXRpb24gc2hvdWxkIGJlIGRldGVybWluaXN0aWMnKTtcblxuICAgICAgY29uc3Qgc29sQWRkcmVzcyA9IGJzNTguZW5jb2RlKEJ1ZmZlci5mcm9tKGRlcml2ZWRQaywgJ2hleCcpKTtcbiAgICAgIFNvbC5VdGlscy5pc1ZhbGlkUHVibGljS2V5KHNvbEFkZHJlc3MpLnNob3VsZC5iZS50cnVlKCk7XG5cbiAgICAgIGNvbnN0IHNvbFBrID0gbmV3IHNvbC5QdWJsaWNLZXkoc29sQWRkcmVzcyk7XG4gICAgICBzb2xQay50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoZGVyaXZlZFBrKTtcbiAgICB9XG5cbiAgICBjb25zdCByb290UGF0aCA9ICdtLzAnO1xuICAgIGNvbnN0IHJvb3RLZXljaGFpbiA9IE1QQy5kZXJpdmVVbmhhcmRlbmVkKGNvbW1vbktleWNoYWluLCByb290UGF0aCk7XG4gICAgY29uc3Qgcm9vdFB1YmxpY0tleSA9IEJ1ZmZlci5mcm9tKHJvb3RLZXljaGFpbiwgJ2hleCcpLnNsaWNlKDAsIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3Qgc29sUGsgPSBuZXcgc29sLlB1YmxpY0tleShiczU4LmVuY29kZShCdWZmZXIuZnJvbShyb290UHVibGljS2V5LCAnaGV4JykpKTtcbiAgICBzb2xQay50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwocm9vdFB1YmxpY0tleSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZGVyaXZlIHVuaGFyZGVuZWQgdmFsaWQgZG90IGNoaWxkIGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgQSA9IE1QQy5rZXlTaGFyZSgxLCAyLCAzKTtcbiAgICBjb25zdCBCID0gTVBDLmtleVNoYXJlKDIsIDIsIDMpO1xuICAgIGNvbnN0IEMgPSBNUEMua2V5U2hhcmUoMywgMiwgMyk7XG5cbiAgICBjb25zdCBBX2NvbWJpbmUgPSBNUEMua2V5Q29tYmluZShBLnVTaGFyZSwgW0IueVNoYXJlc1sxXSwgQy55U2hhcmVzWzFdXSk7XG5cbiAgICBjb25zdCBjb21tb25LZXljaGFpbiA9IEFfY29tYmluZS5wU2hhcmUueSArIEFfY29tYmluZS5wU2hhcmUuY2hhaW5jb2RlO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDEwOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBwYXRoID0gYG0vMC8wLyR7aW5kZXh9YDtcbiAgICAgIGNvbnN0IGRlcml2ZTEgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXljaGFpbiwgcGF0aCk7XG4gICAgICBjb25zdCBkZXJpdmUyID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Y2hhaW4sIHBhdGgpO1xuICAgICAgY29uc3QgZGVyaXZlZFBrID0gQnVmZmVyLmZyb20oZGVyaXZlMSwgJ2hleCcpLnNsaWNlKDAsIDMyKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAgIGRlcml2ZTEuc2hvdWxkLmVxdWFsKGRlcml2ZTIsICdkZXJpdmF0aW9uIHNob3VsZCBiZSBkZXRlcm1pbmlzdGljJyk7XG5cbiAgICAgIGNvbnN0IHB1YktleVBhaXIgPSBuZXcgRG90LktleVBhaXIoeyBwdWI6IGRlcml2ZWRQayB9KTtcbiAgICAgIHB1YktleVBhaXIuZ2V0S2V5cygpLnB1Yi5zaG91bGQuZXF1YWwoZGVyaXZlZFBrKTtcbiAgICB9XG5cbiAgICBjb25zdCByb290UGF0aCA9ICdtLyc7XG4gICAgY29uc3Qgcm9vdEtleWNoYWluID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Y2hhaW4sIHJvb3RQYXRoKTtcbiAgICBjb25zdCByb290UHVibGljS2V5ID0gQnVmZmVyLmZyb20ocm9vdEtleWNoYWluLCAnaGV4Jykuc2xpY2UoMCwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBwdWJLZXlQYWlyID0gbmV3IERvdC5LZXlQYWlyKHsgcHViOiByb290UHVibGljS2V5IH0pO1xuICAgIHB1YktleVBhaXIuZ2V0S2V5cygpLnB1Yi5zaG91bGQuZXF1YWwocm9vdFB1YmxpY0tleSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFpbCBzaWduaW5nIHdpdGhvdXQgbWVldGluZyB0aHJlc2hvbGQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgQSA9IE1QQy5rZXlTaGFyZSgxLCAyLCAzKTtcbiAgICBjb25zdCBCID0gTVBDLmtleVNoYXJlKDIsIDIsIDMpO1xuICAgIGNvbnN0IEMgPSBNUEMua2V5U2hhcmUoMywgMiwgMyk7XG5cbiAgICBjb25zdCBBX2NvbWJpbmUgPSBNUEMua2V5Q29tYmluZShBLnVTaGFyZSwgW0IueVNoYXJlc1sxXSwgQy55U2hhcmVzWzFdXSk7XG4gICAgY29uc3QgQl9jb21iaW5lID0gTVBDLmtleUNvbWJpbmUoQi51U2hhcmUsIFtBLnlTaGFyZXNbMl0sIEMueVNoYXJlc1syXV0pO1xuXG4gICAgY29uc3QgbWVzc2FnZSA9ICdNUEMgb24gYSBGcmlkYXkgbmlnaHQnO1xuICAgIGNvbnN0IG1lc3NhZ2VfYnVmZmVyID0gQnVmZmVyLmZyb20obWVzc2FnZSwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgQV9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQV9jb21iaW5lLnBTaGFyZSwgW0FfY29tYmluZS5qU2hhcmVzWzJdXSk7XG4gICAgY29uc3QgQl9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQl9jb21iaW5lLnBTaGFyZSwgW0JfY29tYmluZS5qU2hhcmVzWzFdXSk7XG5cbiAgICBjb25zdCBBX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQV9zaWduX3NoYXJlLnhTaGFyZSwgW0Jfc2lnbl9zaGFyZS5yU2hhcmVzWzFdXSk7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gTVBDLnNpZ25Db21iaW5lKFtBX3NpZ25dKTtcbiAgICBNUEMudmVyaWZ5KG1lc3NhZ2VfYnVmZmVyLCBzaWduYXR1cmUpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3aXRoIHNwZWNpZmljIHNlZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBrZXlzIGFuZCBzaWduIG1lc3NhZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzZWVkID0gcmFuZG9tQnl0ZXMoNjQpO1xuXG4gICAgICBjb25zdCBBID0gTVBDLmtleVNoYXJlKDEsIDIsIDMsIHNlZWQpO1xuICAgICAgY29uc3QgQiA9IE1QQy5rZXlTaGFyZSgyLCAyLCAzLCBzZWVkKTtcbiAgICAgIGNvbnN0IEMgPSBNUEMua2V5U2hhcmUoMywgMiwgMywgc2VlZCk7XG5cbiAgICAgIC8vIEtleXMgc2hvdWxkIGJlIGRldGVybWluaXN0aWMgd2hlbiB1c2luZyBzZWVkXG4gICAgICBNUEMua2V5U2hhcmUoMSwgMiwgMywgc2VlZCkuc2hvdWxkLmRlZXBFcXVhbChBKTtcbiAgICAgIE1QQy5rZXlTaGFyZSgyLCAyLCAzLCBzZWVkKS5zaG91bGQuZGVlcEVxdWFsKEIpO1xuICAgICAgTVBDLmtleVNoYXJlKDMsIDIsIDMsIHNlZWQpLnNob3VsZC5kZWVwRXF1YWwoQyk7XG5cbiAgICAgIGNvbnN0IEFfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEEudVNoYXJlLCBbQi55U2hhcmVzWzFdLCBDLnlTaGFyZXNbMV1dKTtcbiAgICAgIGNvbnN0IEJfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEIudVNoYXJlLCBbQS55U2hhcmVzWzJdLCBDLnlTaGFyZXNbMl1dKTtcbiAgICAgIGNvbnN0IENfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEMudVNoYXJlLCBbQS55U2hhcmVzWzNdLCBCLnlTaGFyZXNbM11dKTtcblxuICAgICAgY29uc3QgbWVzc2FnZSA9ICdNUEMgb24gYSBGcmlkYXkgbmlnaHQnO1xuICAgICAgY29uc3QgbWVzc2FnZV9idWZmZXIgPSBCdWZmZXIuZnJvbShtZXNzYWdlKTtcblxuICAgICAgLy8gc2lnbmluZyB3aXRoIEEgYW5kIEJcbiAgICAgIGxldCBBX3NpZ25fc2hhcmUgPSBNUEMuc2lnblNoYXJlKG1lc3NhZ2VfYnVmZmVyLCBBX2NvbWJpbmUucFNoYXJlLCBbQV9jb21iaW5lLmpTaGFyZXNbMl1dLCBzZWVkKTtcbiAgICAgIGxldCBCX3NpZ25fc2hhcmUgPSBNUEMuc2lnblNoYXJlKG1lc3NhZ2VfYnVmZmVyLCBCX2NvbWJpbmUucFNoYXJlLCBbQl9jb21iaW5lLmpTaGFyZXNbMV1dLCBzZWVkKTtcbiAgICAgIGxldCBBX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQV9zaWduX3NoYXJlLnhTaGFyZSwgW0Jfc2lnbl9zaGFyZS5yU2hhcmVzWzFdXSwgW0MueVNoYXJlc1sxXV0pO1xuICAgICAgbGV0IEJfc2lnbiA9IE1QQy5zaWduKG1lc3NhZ2VfYnVmZmVyLCBCX3NpZ25fc2hhcmUueFNoYXJlLCBbQV9zaWduX3NoYXJlLnJTaGFyZXNbMl1dLCBbQy55U2hhcmVzWzJdXSk7XG4gICAgICBsZXQgc2lnbmF0dXJlID0gTVBDLnNpZ25Db21iaW5lKFtBX3NpZ24sIEJfc2lnbl0pO1xuICAgICAgbGV0IHJlc3VsdCA9IE1QQy52ZXJpZnkobWVzc2FnZV9idWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuXG4gICAgICAvLyBzaWduaW5nIHdpdGggQSBhbmQgQ1xuICAgICAgQV9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQV9jb21iaW5lLnBTaGFyZSwgW0FfY29tYmluZS5qU2hhcmVzWzNdXSwgc2VlZCk7XG4gICAgICBsZXQgQ19zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQ19jb21iaW5lLnBTaGFyZSwgW0NfY29tYmluZS5qU2hhcmVzWzFdXSwgc2VlZCk7XG4gICAgICBBX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQV9zaWduX3NoYXJlLnhTaGFyZSwgW0Nfc2lnbl9zaGFyZS5yU2hhcmVzWzFdXSwgW0IueVNoYXJlc1sxXV0pO1xuICAgICAgbGV0IENfc2lnbiA9IE1QQy5zaWduKG1lc3NhZ2VfYnVmZmVyLCBDX3NpZ25fc2hhcmUueFNoYXJlLCBbQV9zaWduX3NoYXJlLnJTaGFyZXNbM11dLCBbQi55U2hhcmVzWzNdXSk7XG4gICAgICBzaWduYXR1cmUgPSBNUEMuc2lnbkNvbWJpbmUoW0Ffc2lnbiwgQ19zaWduXSk7XG4gICAgICByZXN1bHQgPSBNUEMudmVyaWZ5KG1lc3NhZ2VfYnVmZmVyLCBzaWduYXR1cmUpO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcblxuICAgICAgLy8gc2lnbmluZyB3aXRoIEIgYW5kIENcbiAgICAgIEJfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUobWVzc2FnZV9idWZmZXIsIEJfY29tYmluZS5wU2hhcmUsIFtCX2NvbWJpbmUualNoYXJlc1szXV0sIHNlZWQpO1xuICAgICAgQ19zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQ19jb21iaW5lLnBTaGFyZSwgW0NfY29tYmluZS5qU2hhcmVzWzJdXSwgc2VlZCk7XG4gICAgICBCX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQl9zaWduX3NoYXJlLnhTaGFyZSwgW0Nfc2lnbl9zaGFyZS5yU2hhcmVzWzJdXSwgW0EueVNoYXJlc1syXV0pO1xuICAgICAgQ19zaWduID0gTVBDLnNpZ24obWVzc2FnZV9idWZmZXIsIENfc2lnbl9zaGFyZS54U2hhcmUsIFtCX3NpZ25fc2hhcmUuclNoYXJlc1szXV0sIFtBLnlTaGFyZXNbM11dKTtcbiAgICAgIHNpZ25hdHVyZSA9IE1QQy5zaWduQ29tYmluZShbQl9zaWduLCBDX3NpZ25dKTtcbiAgICAgIHJlc3VsdCA9IE1QQy52ZXJpZnkobWVzc2FnZV9idWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgQklQMzIgc3Via2V5IHNpZ25hdHVyZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNlZWQgPSByYW5kb21CeXRlcyg2NCk7XG4gICAgICBjb25zdCBwYXRoID0gJ20vMC8xLzInO1xuXG4gICAgICBjb25zdCBBID0gTVBDLmtleVNoYXJlKDEsIDIsIDMsIHNlZWQpO1xuICAgICAgY29uc3QgQiA9IE1QQy5rZXlTaGFyZSgyLCAyLCAzLCBzZWVkKTtcbiAgICAgIGNvbnN0IEMgPSBNUEMua2V5U2hhcmUoMywgMiwgMywgc2VlZCk7XG5cbiAgICAgIC8vIEtleXMgc2hvdWxkIGJlIGRldGVybWluaXN0aWMgd2hlbiB1c2luZyBzZWVkXG4gICAgICBNUEMua2V5U2hhcmUoMSwgMiwgMywgc2VlZCkuc2hvdWxkLmRlZXBFcXVhbChBKTtcbiAgICAgIE1QQy5rZXlTaGFyZSgyLCAyLCAzLCBzZWVkKS5zaG91bGQuZGVlcEVxdWFsKEIpO1xuICAgICAgTVBDLmtleVNoYXJlKDMsIDIsIDMsIHNlZWQpLnNob3VsZC5kZWVwRXF1YWwoQyk7XG5cbiAgICAgIC8vIENvbWJpbmUgc2hhcmVzIHRvIGNvbW1vbiBiYXNlIGFkZHJlc3MuXG4gICAgICBjb25zdCBBX2NvbWJpbmUgPSBNUEMua2V5Q29tYmluZShBLnVTaGFyZSwgW0IueVNoYXJlc1sxXSwgQy55U2hhcmVzWzFdXSk7XG4gICAgICBjb25zdCBCX2NvbWJpbmUgPSBNUEMua2V5Q29tYmluZShCLnVTaGFyZSwgW0EueVNoYXJlc1syXSwgQy55U2hhcmVzWzJdXSk7XG5cbiAgICAgIC8vIFBhcnR5IEEgZGVyaXZlcyBzdWJrZXkgUCBzaGFyZSBhbmQgbmV3IFkgc2hhcmVzLlxuICAgICAgY29uc3QgQV9zdWJrZXkgPSBNUEMua2V5RGVyaXZlKEEudVNoYXJlLCBbQi55U2hhcmVzWzFdLCBDLnlTaGFyZXNbMV1dLCBwYXRoKTtcblxuICAgICAgLy8gUGFydHkgQiBjYWxjdWxhdGVzIG5ldyBQIHNoYXJlIHVzaW5nIHBhcnR5IEEncyBzdWJrZXkgWSBzaGFyZXMuXG4gICAgICBjb25zdCBCX3N1YmtleSA9IE1QQy5rZXlDb21iaW5lKEIudVNoYXJlLCBbQV9zdWJrZXkueVNoYXJlc1syXSwgQy55U2hhcmVzWzJdXSk7XG5cbiAgICAgIC8vIERlcml2ZSB0aGUgcHVibGljIHN1YmtleWNoYWluIHNlcGFyYXRlbHkgdXNpbmcgdGhlIGNvbW1vbiBrZXljaGFpbi5cbiAgICAgIGNvbnN0IHN1YmtleSA9IGhkVHJlZS5wdWJsaWNEZXJpdmUoXG4gICAgICAgIHtcbiAgICAgICAgICBwazogYmlnSW50RnJvbUJ1ZmZlckxFKEJ1ZmZlci5mcm9tKEFfY29tYmluZS5wU2hhcmUueSwgJ2hleCcpKSxcbiAgICAgICAgICBjaGFpbmNvZGU6IGJpZ0ludEZyb21CdWZmZXJCRShCdWZmZXIuZnJvbShBX2NvbWJpbmUucFNoYXJlLmNoYWluY29kZSwgJ2hleCcpKSxcbiAgICAgICAgfSxcbiAgICAgICAgcGF0aCxcbiAgICAgICk7XG4gICAgICBjb25zdCB5ID0gYmlnSW50VG9CdWZmZXJMRShzdWJrZXkucGssIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCBjaGFpbmNvZGUgPSBiaWdJbnRUb0J1ZmZlckJFKHN1YmtleS5jaGFpbmNvZGUsIDMyKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUga2V5Y2hhaW4gaW4gdGhlIHN1YmtleSBQIHNoYXJlcyBlcXVhbHMgdGhlIHNlcGFyYXRlbHkgZGVyaXZlZCBwdWJsaWMgc3Via2V5Y2hhaW4uXG4gICAgICBBX3N1YmtleS5wU2hhcmUueS5zaG91bGQuZXF1YWwoeSk7XG4gICAgICBBX3N1YmtleS5wU2hhcmUuY2hhaW5jb2RlLnNob3VsZC5lcXVhbChjaGFpbmNvZGUpO1xuICAgICAgQl9zdWJrZXkucFNoYXJlLnkuc2hvdWxkLmVxdWFsKHkpO1xuICAgICAgQl9zdWJrZXkucFNoYXJlLmNoYWluY29kZS5zaG91bGQuZXF1YWwoY2hhaW5jb2RlKTtcblxuICAgICAgY29uc3QgbWVzc2FnZSA9ICdNUEMgb24gYSBGcmlkYXkgbmlnaHQnO1xuICAgICAgY29uc3QgbWVzc2FnZV9idWZmZXIgPSBCdWZmZXIuZnJvbShtZXNzYWdlKTtcblxuICAgICAgLy8gU2lnbmluZyB3aXRoIEEgYW5kIEIgdXNpbmcgc3Via2V5IFAgc2hhcmVzLlxuICAgICAgY29uc3QgQV9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQV9zdWJrZXkucFNoYXJlLCBbQV9jb21iaW5lLmpTaGFyZXNbMl1dKTtcbiAgICAgIGNvbnN0IEJfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUobWVzc2FnZV9idWZmZXIsIEJfc3Via2V5LnBTaGFyZSwgW0JfY29tYmluZS5qU2hhcmVzWzFdXSk7XG4gICAgICBjb25zdCBBX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQV9zaWduX3NoYXJlLnhTaGFyZSwgW0Jfc2lnbl9zaGFyZS5yU2hhcmVzWzFdXSwgW0MueVNoYXJlc1sxXV0pO1xuICAgICAgY29uc3QgQl9zaWduID0gTVBDLnNpZ24obWVzc2FnZV9idWZmZXIsIEJfc2lnbl9zaGFyZS54U2hhcmUsIFtBX3NpZ25fc2hhcmUuclNoYXJlc1syXV0sIFtDLnlTaGFyZXNbMl1dKTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IE1QQy5zaWduQ29tYmluZShbQV9zaWduLCBCX3NpZ25dKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IE1QQy52ZXJpZnkobWVzc2FnZV9idWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuXG4gICAgICAvLyBWZXJpZnkgdGhlIHB1YmxpYyBrZXkgaW4gdGhlIHNpZ25hdHVyZSBlcXVhbHMgdGhlIHNlcGFyYXRlbHkgZGVyaXZlZCBwdWJsaWMgc3Via2V5LlxuICAgICAgc2lnbmF0dXJlLnkuc2hvdWxkLmVxdWFsKHkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGlmIHNlZWQgaXMgbm90IGxlbmd0aCA2NCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gTVBDLmtleVNoYXJlKDEsIDIsIDMsIHJhbmRvbUJ5dGVzKDMzKSksIC9TZWVkIG11c3QgaGF2ZSBsZW5ndGggNjQvKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gTVBDLmtleVNoYXJlKDEsIDIsIDMsIHJhbmRvbUJ5dGVzKDY2KSksIC9TZWVkIG11c3QgaGF2ZSBsZW5ndGggNjQvKTtcblxuICAgICAgY29uc3QgZmFrZVBTaGFyZSA9IHtcbiAgICAgICAgaTogMSxcbiAgICAgICAgdDogMyxcbiAgICAgICAgbjogMixcbiAgICAgICAgeTogJ3lTdHJpbmcnLFxuICAgICAgICB1OiAndVN0cmluZycsXG4gICAgICAgIHByZWZpeDogJ3ByZWZpeCcsXG4gICAgICAgIGNoYWluY29kZTogJ2NoYWluY29kZScsXG4gICAgICB9O1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gTVBDLnNpZ25TaGFyZShCdWZmZXIuZnJvbSgnYWJjZCcsICdoZXgnKSwgZmFrZVBTaGFyZSwgW10sIHJhbmRvbUJ5dGVzKDMzKSksXG4gICAgICAgIC9TZWVkIG11c3QgaGF2ZSBsZW5ndGggNjQvLFxuICAgICAgKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IE1QQy5zaWduU2hhcmUoQnVmZmVyLmZyb20oJ2FiY2QnLCAnaGV4JyksIGZha2VQU2hhcmUsIFtdLCByYW5kb21CeXRlcyg2NikpLFxuICAgICAgICAvU2VlZCBtdXN0IGhhdmUgbGVuZ3RoIDY0LyxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -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"}