@bitgo-beta/sdk-lib-mpc 8.2.1-alpha.26 → 8.2.1-alpha.260

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 (94) hide show
  1. package/CHANGELOG.md +598 -0
  2. package/dist/src/curves/constant.d.ts +2 -0
  3. package/dist/src/curves/constant.d.ts.map +1 -0
  4. package/dist/src/curves/constant.js +6 -0
  5. package/dist/src/curves/{baseCurve.d.ts → ed25519.d.ts} +7 -8
  6. package/dist/src/curves/ed25519.d.ts.map +1 -0
  7. package/dist/src/curves/ed25519.js +72 -0
  8. package/dist/src/curves/ed25519Bip32HdTree.d.ts +10 -0
  9. package/dist/src/curves/ed25519Bip32HdTree.d.ts.map +1 -0
  10. package/dist/src/curves/ed25519Bip32HdTree.js +85 -0
  11. package/dist/src/curves/index.d.ts +6 -1
  12. package/dist/src/curves/index.d.ts.map +1 -1
  13. package/dist/src/curves/index.js +12 -3
  14. package/dist/src/curves/secp256k1.d.ts +1 -2
  15. package/dist/src/curves/secp256k1.d.ts.map +1 -1
  16. package/dist/src/curves/secp256k1.js +22 -38
  17. package/dist/src/curves/secp256k1Bip32HdTree.d.ts +8 -0
  18. package/dist/src/curves/secp256k1Bip32HdTree.d.ts.map +1 -0
  19. package/dist/src/curves/secp256k1Bip32HdTree.js +54 -0
  20. package/dist/src/curves/types.d.ts +35 -0
  21. package/dist/src/curves/types.d.ts.map +1 -0
  22. package/dist/src/curves/types.js +3 -0
  23. package/dist/src/curves/util.d.ts +2 -0
  24. package/dist/src/curves/util.d.ts.map +1 -0
  25. package/dist/src/curves/util.js +10 -0
  26. package/dist/src/hashCommitment.d.ts +0 -1
  27. package/dist/src/hashCommitment.d.ts.map +1 -1
  28. package/dist/src/hashCommitment.js +7 -8
  29. package/dist/src/index.d.ts +2 -1
  30. package/dist/src/index.d.ts.map +1 -1
  31. package/dist/src/index.js +25 -10
  32. package/dist/src/openssl/index.js +6 -2
  33. package/dist/src/openssl/openssl.d.ts +1 -2
  34. package/dist/src/openssl/openssl.d.ts.map +1 -1
  35. package/dist/src/openssl/openssl.js +4 -12
  36. package/dist/src/safePrime.d.ts +3 -0
  37. package/dist/src/safePrime.d.ts.map +1 -0
  38. package/dist/src/safePrime.js +19 -0
  39. package/dist/src/schnorrProof.d.ts +0 -1
  40. package/dist/src/schnorrProof.d.ts.map +1 -1
  41. package/dist/src/schnorrProof.js +17 -9
  42. package/dist/src/shamir/index.d.ts +3 -0
  43. package/dist/src/shamir/index.d.ts.map +1 -0
  44. package/dist/src/shamir/index.js +19 -0
  45. package/dist/src/shamir/shamir.d.ts +38 -0
  46. package/dist/src/shamir/shamir.d.ts.map +1 -0
  47. package/dist/src/shamir/shamir.js +136 -0
  48. package/dist/src/shamir/types.d.ts +5 -0
  49. package/dist/src/shamir/types.d.ts.map +1 -0
  50. package/dist/src/shamir/types.js +3 -0
  51. package/dist/src/tss/ecdsa/index.js +23 -9
  52. package/dist/src/tss/ecdsa/paillierproof.js +10 -10
  53. package/dist/src/tss/ecdsa/rangeproof.d.ts +1 -2
  54. package/dist/src/tss/ecdsa/rangeproof.d.ts.map +1 -1
  55. package/dist/src/tss/ecdsa/rangeproof.js +111 -118
  56. package/dist/src/tss/ecdsa/types.d.ts +28 -17
  57. package/dist/src/tss/ecdsa/types.d.ts.map +1 -1
  58. package/dist/src/tss/ecdsa/types.js +29 -31
  59. package/dist/src/tss/ecdsa/zkVProof.d.ts +0 -1
  60. package/dist/src/tss/ecdsa/zkVProof.d.ts.map +1 -1
  61. package/dist/src/tss/ecdsa/zkVProof.js +19 -10
  62. package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts +42 -0
  63. package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts.map +1 -0
  64. package/dist/src/tss/ecdsa-dkls/commsLayer.js +235 -0
  65. package/dist/src/tss/ecdsa-dkls/dkg.d.ts +33 -0
  66. package/dist/src/tss/ecdsa-dkls/dkg.d.ts.map +1 -0
  67. package/dist/src/tss/ecdsa-dkls/dkg.js +275 -0
  68. package/dist/src/tss/ecdsa-dkls/dsg.d.ts +47 -0
  69. package/dist/src/tss/ecdsa-dkls/dsg.d.ts.map +1 -0
  70. package/dist/src/tss/ecdsa-dkls/dsg.js +266 -0
  71. package/dist/src/tss/ecdsa-dkls/index.d.ts +6 -0
  72. package/dist/src/tss/ecdsa-dkls/index.d.ts.map +1 -0
  73. package/dist/src/tss/ecdsa-dkls/index.js +42 -0
  74. package/dist/src/tss/ecdsa-dkls/types.d.ts +118 -0
  75. package/dist/src/tss/ecdsa-dkls/types.d.ts.map +1 -0
  76. package/dist/src/tss/ecdsa-dkls/types.js +165 -0
  77. package/dist/src/tss/ecdsa-dkls/util.d.ts +26 -0
  78. package/dist/src/tss/ecdsa-dkls/util.d.ts.map +1 -0
  79. package/dist/src/tss/ecdsa-dkls/util.js +276 -0
  80. package/dist/src/tss/index.d.ts +1 -0
  81. package/dist/src/tss/index.d.ts.map +1 -1
  82. package/dist/src/tss/index.js +7 -2
  83. package/dist/src/types.d.ts +0 -1
  84. package/dist/src/types.d.ts.map +1 -1
  85. package/dist/src/util.d.ts +6 -1
  86. package/dist/src/util.d.ts.map +1 -1
  87. package/dist/src/util.js +42 -21
  88. package/dist/tsconfig.tsbuildinfo +1 -1
  89. package/package.json +27 -7
  90. package/dist/src/curves/baseCurve.d.ts.map +0 -1
  91. package/dist/src/curves/baseCurve.js +0 -6
  92. package/dist/src/openssl/opensslbytes.d.ts +0 -4
  93. package/dist/src/openssl/opensslbytes.d.ts.map +0 -1
  94. package/dist/src/openssl/opensslbytes.js +0 -20
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.detachSignData = detachSignData;
37
+ exports.encryptAndDetachSignData = encryptAndDetachSignData;
38
+ exports.decryptAndVerifySignedData = decryptAndVerifySignedData;
39
+ exports.verifySignedData = verifySignedData;
40
+ exports.decryptAndVerifyIncomingMessages = decryptAndVerifyIncomingMessages;
41
+ exports.encryptAndAuthOutgoingMessages = encryptAndAuthOutgoingMessages;
42
+ const pgp = __importStar(require("openpgp"));
43
+ /**
44
+ * Detach signs a binary and encodes it in base64
45
+ * @param data binary to encode in base64 and sign
46
+ * @param privateArmor private key to sign with
47
+ */
48
+ async function detachSignData(data, privateArmor) {
49
+ const message = await pgp.createMessage({ binary: data });
50
+ const privateKey = await pgp.readPrivateKey({ armoredKey: privateArmor });
51
+ const signature = await pgp.sign({
52
+ message,
53
+ signingKeys: privateKey,
54
+ format: 'armored',
55
+ detached: true,
56
+ config: {
57
+ rejectCurves: new Set(),
58
+ showVersion: false,
59
+ showComment: false,
60
+ },
61
+ });
62
+ return {
63
+ message: data.toString('base64'),
64
+ signature: signature,
65
+ };
66
+ }
67
+ /**
68
+ * Encrypts and detach signs a binary
69
+ * @param data binary to encrypt and sign
70
+ * @param publicArmor public key to encrypt with
71
+ * @param privateArmor private key to sign with
72
+ */
73
+ async function encryptAndDetachSignData(data, publicArmor, privateArmor) {
74
+ const message = await pgp.createMessage({ binary: data });
75
+ const publicKey = await pgp.readKey({ armoredKey: publicArmor });
76
+ const privateKey = await pgp.readPrivateKey({ armoredKey: privateArmor });
77
+ const encryptedMessage = await pgp.encrypt({
78
+ message,
79
+ encryptionKeys: publicKey,
80
+ format: 'armored',
81
+ config: {
82
+ rejectCurves: new Set(),
83
+ showVersion: false,
84
+ showComment: false,
85
+ },
86
+ date: null,
87
+ });
88
+ const signature = await pgp.sign({
89
+ message,
90
+ signingKeys: privateKey,
91
+ format: 'armored',
92
+ detached: true,
93
+ config: {
94
+ rejectCurves: new Set(),
95
+ showVersion: false,
96
+ showComment: false,
97
+ },
98
+ });
99
+ return {
100
+ encryptedMessage: encryptedMessage,
101
+ signature: signature,
102
+ };
103
+ }
104
+ /**
105
+ * Decrypts and verifies signature on a binary
106
+ * @param encryptedAndSignedMessage message to decrypt and verify
107
+ * @param publicArmor public key to verify signature with
108
+ * @param privateArmor private key to decrypt with
109
+ */
110
+ async function decryptAndVerifySignedData(encryptedAndSignedMessage, publicArmor, privateArmor) {
111
+ const publicKey = await pgp.readKey({ armoredKey: publicArmor });
112
+ const privateKey = await pgp.readPrivateKey({ armoredKey: privateArmor });
113
+ const decryptedMessage = await pgp.decrypt({
114
+ message: await pgp.readMessage({ armoredMessage: encryptedAndSignedMessage.encryptedMessage }),
115
+ decryptionKeys: [privateKey],
116
+ config: {
117
+ rejectCurves: new Set(),
118
+ showVersion: false,
119
+ showComment: false,
120
+ },
121
+ format: 'binary',
122
+ date: null,
123
+ });
124
+ const verificationResult = await pgp.verify({
125
+ message: await pgp.createMessage({ binary: decryptedMessage.data }),
126
+ signature: await pgp.readSignature({ armoredSignature: encryptedAndSignedMessage.signature }),
127
+ verificationKeys: publicKey,
128
+ date: null,
129
+ });
130
+ await verificationResult.signatures[0].verified;
131
+ return Buffer.from(decryptedMessage.data).toString('base64');
132
+ }
133
+ /**
134
+ * Verifies signature on a binary (message passed should be encoded in base64).
135
+ * @param signedMessage message to verify
136
+ * @param publicArmor public key to verify signature with
137
+ */
138
+ async function verifySignedData(signedMessage, publicArmor) {
139
+ const publicKey = await pgp.readKey({ armoredKey: publicArmor });
140
+ const verificationResult = await pgp.verify({
141
+ message: await pgp.createMessage({ binary: Buffer.from(signedMessage.message, 'base64') }),
142
+ signature: await pgp.readSignature({ armoredSignature: signedMessage.signature }),
143
+ verificationKeys: publicKey,
144
+ date: null,
145
+ });
146
+ try {
147
+ await verificationResult.signatures[0].verified;
148
+ return true;
149
+ }
150
+ catch (e) {
151
+ return false;
152
+ }
153
+ }
154
+ /**
155
+ * Decrypts and verifies p2p messages + verifies broadcast messages
156
+ * @param messages message to decrypt and verify
157
+ * @param pubVerificationGpgKeys public keys to verify signatures with
158
+ * @param prvDecryptionGpgKeys private keys to decrypt with
159
+ */
160
+ async function decryptAndVerifyIncomingMessages(messages, pubVerificationGpgKeys, prvDecryptionGpgKeys) {
161
+ return {
162
+ p2pMessages: await Promise.all(messages.p2pMessages.map(async (m) => {
163
+ const pubGpgKey = pubVerificationGpgKeys.find((k) => k.partyId === m.from);
164
+ const prvGpgKey = prvDecryptionGpgKeys.find((k) => k.partyId === m.to);
165
+ if (!pubGpgKey) {
166
+ throw Error(`No public key provided for sender with ID: ${m.from}`);
167
+ }
168
+ if (!prvGpgKey) {
169
+ throw Error(`No private key provided for recepient with ID: ${m.to}`);
170
+ }
171
+ return {
172
+ to: m.to,
173
+ from: m.from,
174
+ payload: await decryptAndVerifySignedData(m.payload, pubGpgKey.gpgKey, prvGpgKey.gpgKey),
175
+ commitment: m.commitment,
176
+ };
177
+ })),
178
+ broadcastMessages: await Promise.all(messages.broadcastMessages.map(async (m) => {
179
+ const pubGpgKey = pubVerificationGpgKeys.find((k) => k.partyId === m.from);
180
+ if (!pubGpgKey) {
181
+ throw Error(`No public key provided for sender with ID: ${m.from}`);
182
+ }
183
+ if (!(await verifySignedData(m.payload, pubGpgKey.gpgKey))) {
184
+ throw Error(`Failed to authenticate broadcast message from party: ${m.from}`);
185
+ }
186
+ return {
187
+ from: m.from,
188
+ payload: m.payload.message,
189
+ };
190
+ })),
191
+ };
192
+ }
193
+ /**
194
+ * Encrypts and signs p2p messages + signs broadcast messages
195
+ * @param messages messages to encrypt and sign
196
+ * @param pubEncryptionGpgKey public keys to encrypt data to
197
+ * @param prvAuthenticationGpgKey private keys to sign with
198
+ */
199
+ async function encryptAndAuthOutgoingMessages(messages, pubEncryptionGpgKeys, prvAuthenticationGpgKeys) {
200
+ return {
201
+ p2pMessages: await Promise.all(messages.p2pMessages.map(async (m) => {
202
+ const pubGpgKey = pubEncryptionGpgKeys.find((k) => k.partyId === m.to);
203
+ const prvGpgKey = prvAuthenticationGpgKeys.find((k) => k.partyId === m.from);
204
+ if (!pubGpgKey) {
205
+ throw Error(`No public key provided for recipient with ID: ${m.to}`);
206
+ }
207
+ if (!prvGpgKey) {
208
+ throw Error(`No private key provided for sender with ID: ${m.from}`);
209
+ }
210
+ return {
211
+ to: m.to,
212
+ from: m.from,
213
+ payload: await encryptAndDetachSignData(Buffer.from(m.payload, 'base64'), pubGpgKey.gpgKey, prvGpgKey.gpgKey),
214
+ commitment: m.commitment,
215
+ };
216
+ })),
217
+ broadcastMessages: await Promise.all(messages.broadcastMessages.map(async (m) => {
218
+ const prvGpgKey = prvAuthenticationGpgKeys.find((k) => k.partyId === m.from);
219
+ if (!prvGpgKey) {
220
+ throw Error(`No private key provided for sender with ID: ${m.from}`);
221
+ }
222
+ return {
223
+ from: m.from,
224
+ payload: await detachSignData(Buffer.from(m.payload, 'base64'), prvGpgKey.gpgKey),
225
+ signatureR: m.signatureR
226
+ ? {
227
+ message: m.signatureR,
228
+ signature: '',
229
+ }
230
+ : undefined,
231
+ };
232
+ })),
233
+ };
234
+ }
235
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbXNMYXllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90c3MvZWNkc2EtZGtscy9jb21tc0xheWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUUEsd0NBa0JDO0FBUUQsNERBa0NDO0FBUUQsZ0VBMEJDO0FBT0QsNENBY0M7QUFRRCw0RUF3Q0M7QUFRRCx3RUEyQ0M7QUE3TkQsNkNBQStCO0FBRS9COzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsY0FBYyxDQUFDLElBQVksRUFBRSxZQUFvQjtJQUNyRSxNQUFNLE9BQU8sR0FBRyxNQUFNLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRCxNQUFNLFVBQVUsR0FBRyxNQUFNLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUMxRSxNQUFNLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDL0IsT0FBTztRQUNQLFdBQVcsRUFBRSxVQUFVO1FBQ3ZCLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLFFBQVEsRUFBRSxJQUFJO1FBQ2QsTUFBTSxFQUFFO1lBQ04sWUFBWSxFQUFFLElBQUksR0FBRyxFQUFFO1lBQ3ZCLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLFdBQVcsRUFBRSxLQUFLO1NBQ25CO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsT0FBTztRQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUNoQyxTQUFTLEVBQUUsU0FBUztLQUNyQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0ksS0FBSyxVQUFVLHdCQUF3QixDQUM1QyxJQUFZLEVBQ1osV0FBbUIsRUFDbkIsWUFBb0I7SUFFcEIsTUFBTSxPQUFPLEdBQUcsTUFBTSxHQUFHLENBQUMs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Q0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztnQkFDN0csVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVO2FBQ3pCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FDSDtRQUNELGlCQUFpQixFQUFFLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDbEMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekMsTUFBTSxTQUFTLEdBQUcsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7WUFDRCxPQUFPO2dCQUNMLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtnQkFDWixPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUM7Z0JBQ2pGLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVTtvQkFDdEIsQ0FBQyxDQUFDO3dCQUNFLE9BQU8sRUFBRSxDQUFDLENBQUMsVUFBVTt3QkFDckIsU0FBUyxFQUFFLEVBQUU7cUJBQ2Q7b0JBQ0gsQ0FBQyxDQUFDLFNBQVM7YUFDZCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0g7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlcmlhbGl6ZWRNZXNzYWdlcywgQXV0aEVuY01lc3NhZ2UsIEF1dGhFbmNNZXNzYWdlcywgUGFydHlHcGdLZXksIEF1dGhNZXNzYWdlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgKiBhcyBwZ3AgZnJvbSAnb3BlbnBncCc7XG5cbi8qKlxuICogRGV0YWNoIHNpZ25zIGEgYmluYXJ5IGFuZCBlbmNvZGVzIGl0IGluIGJhc2U2NFxuICogQHBhcmFtIGRhdGEgYmluYXJ5IHRvIGVuY29kZSBpbiBiYXNlNjQgYW5kIHNpZ25cbiAqIEBwYXJhbSBwcml2YXRlQXJtb3IgcHJpdmF0ZSBrZXkgdG8gc2lnbiB3aXRoXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXRhY2hTaWduRGF0YShkYXRhOiBCdWZmZXIsIHByaXZhdGVBcm1vcjogc3RyaW5nKTogUHJvbWlzZTxBdXRoTWVzc2FnZT4ge1xuICBjb25zdCBtZXNzYWdlID0gYXdhaXQgcGdwLmNyZWF0ZU1lc3NhZ2UoeyBiaW5hcnk6IGRhdGEgfSk7XG4gIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCBwZ3AucmVhZFByaXZhdGVLZXkoeyBhcm1vcmVkS2V5OiBwcml2YXRlQXJtb3IgfSk7XG4gIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHBncC5zaWduKHtcbiAgICBtZXNzYWdlLFxuICAgIHNpZ25pbmdLZXlzOiBwcml2YXRlS2V5LFxuICAgIGZvcm1hdDogJ2FybW9yZWQnLFxuICAgIGRldGFjaGVkOiB0cnVlLFxuICAgIGNvbmZpZzoge1xuICAgICAgcmVqZWN0Q3VydmVzOiBuZXcgU2V0KCksXG4gICAgICBzaG93VmVyc2lvbjogZmFsc2UsXG4gICAgICBzaG93Q29tbWVudDogZmFsc2UsXG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgbWVzc2FnZTogZGF0YS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgc2lnbmF0dXJlOiBzaWduYXR1cmUsXG4gIH07XG59XG5cbi8qKlxuICogRW5jcnlwdHMgYW5kIGRldGFjaCBzaWducyBhIGJpbmFyeVxuICogQHBhcmFtIGRhdGEgYmluYXJ5IHRvIGVuY3J5cHQgYW5kIHNpZ25cbiAqIEBwYXJhbSBwdWJsaWNBcm1vciBwdWJsaWMga2V5IHRvIGVuY3J5cHQgd2l0aFxuICogQHBhcmFtIHByaXZhdGVBcm1vciBwcml2YXRlIGtleSB0byBzaWduIHdpdGhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuY3J5cHRBbmREZXRhY2hTaWduRGF0YShcbiAgZGF0YTogQnVmZmVyLFxuICBwdWJsaWNBcm1vcjogc3RyaW5nLFxuICBwcml2YXRlQXJtb3I6IHN0cmluZ1xuKTogUHJvbWlzZTxBdXRoRW5jTWVzc2FnZT4ge1xuICBjb25zdCBtZXNzYWdlID0gYXdhaXQgcGdwLmNyZWF0ZU1lc3NhZ2UoeyBiaW5hcnk6IGRhdGEgfSk7XG4gIGNvbnN0IHB1YmxpY0tleSA9IGF3YWl0IHBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogcHVibGljQXJtb3IgfSk7XG4gIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCBwZ3AucmVhZFByaXZhdGVLZXkoeyBhcm1vcmVkS2V5OiBwcml2YXRlQXJtb3IgfSk7XG4gIGNvbnN0IGVuY3J5cHRlZE1lc3NhZ2UgPSBhd2FpdCBwZ3AuZW5jcnlwdCh7XG4gICAgbWVzc2FnZSxcbiAgICBlbmNyeXB0aW9uS2V5czogcHVibGljS2V5LFxuICAgIGZvcm1hdDogJ2FybW9yZWQnLFxuICAgIGNvbmZpZzoge1xuICAgICAgcmVqZWN0Q3VydmVzOiBuZXcgU2V0KCksXG4gICAgICBzaG93VmVyc2lvbjogZmFsc2UsXG4gICAgICBzaG93Q29tbWVudDogZmFsc2UsXG4gICAgfSxcbiAgICBkYXRlOiBudWxsIGFzIHVua25vd24gYXMgdW5kZWZpbmVkLFxuICB9KTtcbiAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgcGdwLnNpZ24oe1xuICAgIG1lc3NhZ2UsXG4gICAgc2lnbmluZ0tleXM6IHByaXZhdGVLZXksXG4gICAgZm9ybWF0OiAnYXJtb3JlZCcsXG4gICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgY29uZmlnOiB7XG4gICAgICByZWplY3RDdXJ2ZXM6IG5ldyBTZXQoKSxcbiAgICAgIHNob3dWZXJzaW9uOiBmYWxzZSxcbiAgICAgIHNob3dDb21tZW50OiBmYWxzZSxcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBlbmNyeXB0ZWRNZXNzYWdlOiBlbmNyeXB0ZWRNZXNzYWdlLFxuICAgIHNpZ25hdHVyZTogc2lnbmF0dXJlLFxuICB9O1xufVxuXG4vKipcbiAqIERlY3J5cHRzIGFuZCB2ZXJpZmllcyBzaWduYXR1cmUgb24gYSBiaW5hcnlcbiAqIEBwYXJhbSBlbmNyeXB0ZWRBbmRTaWduZWRNZXNzYWdlIG1lc3NhZ2UgdG8gZGVjcnlwdCBhbmQgdmVyaWZ5XG4gKiBAcGFyYW0gcHVibGljQXJtb3IgcHVibGljIGtleSB0byB2ZXJpZnkgc2lnbmF0dXJlIHdpdGhcbiAqIEBwYXJhbSBwcml2YXRlQXJtb3IgcHJpdmF0ZSBrZXkgdG8gZGVjcnlwdCB3aXRoXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0QW5kVmVyaWZ5U2lnbmVkRGF0YShcbiAgZW5jcnlwdGVkQW5kU2lnbmVkTWVzc2FnZTogQXV0aEVuY01lc3NhZ2UsXG4gIHB1YmxpY0FybW9yOiBzdHJpbmcsXG4gIHByaXZhdGVBcm1vcjogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBwdWJsaWNLZXkgPSBhd2FpdCBwZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IHB1YmxpY0FybW9yIH0pO1xuICBjb25zdCBwcml2YXRlS2V5ID0gYXdhaXQgcGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogcHJpdmF0ZUFybW9yIH0pO1xuICBjb25zdCBkZWNyeXB0ZWRNZXNzYWdlID0gYXdhaXQgcGdwLmRlY3J5cHQoe1xuICAgIG1lc3NhZ2U6IGF3YWl0IHBncC5yZWFkTWVzc2FnZSh7IGFybW9yZWRNZXNzYWdlOiBlbmNyeXB0ZWRBbmRTaWduZWRNZXNzYWdlLmVuY3J5cHRlZE1lc3NhZ2UgfSksXG4gICAgZGVjcnlwdGlvbktleXM6IFtwcml2YXRlS2V5XSxcbiAgICBjb25maWc6IHtcbiAgICAgIHJlamVjdEN1cnZlczogbmV3IFNldCgpLFxuICAgICAgc2hvd1ZlcnNpb246IGZhbHNlLFxuICAgICAgc2hvd0NvbW1lbnQ6IGZhbHNlLFxuICAgIH0sXG4gICAgZm9ybWF0OiAnYmluYXJ5JyxcbiAgICBkYXRlOiBudWxsIGFzIHVua25vd24gYXMgdW5kZWZpbmVkLFxuICB9KTtcbiAgY29uc3QgdmVyaWZpY2F0aW9uUmVzdWx0ID0gYXdhaXQgcGdwLnZlcmlmeSh7XG4gICAgbWVzc2FnZTogYXdhaXQgcGdwLmNyZWF0ZU1lc3NhZ2UoeyBiaW5hcnk6IGRlY3J5cHRlZE1lc3NhZ2UuZGF0YSB9KSxcbiAgICBzaWduYXR1cmU6IGF3YWl0IHBncC5yZWFkU2lnbmF0dXJlKHsgYXJtb3JlZFNpZ25hdHVyZTogZW5jcnlwdGVkQW5kU2lnbmVkTWVzc2FnZS5zaWduYXR1cmUgfSksXG4gICAgdmVyaWZpY2F0aW9uS2V5czogcHVibGljS2V5LFxuICAgIGRhdGU6IG51bGwgYXMgdW5rbm93biBhcyB1bmRlZmluZWQsXG4gIH0pO1xuICBhd2FpdCB2ZXJpZmljYXRpb25SZXN1bHQuc2lnbmF0dXJlc1swXS52ZXJpZmllZDtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRlY3J5cHRlZE1lc3NhZ2UuZGF0YSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG4vKipcbiAqIFZlcmlmaWVzIHNpZ25hdHVyZSBvbiBhIGJpbmFyeSAobWVzc2FnZSBwYXNzZWQgc2hvdWxkIGJlIGVuY29kZWQgaW4gYmFzZTY0KS5cbiAqIEBwYXJhbSBzaWduZWRNZXNzYWdlIG1lc3NhZ2UgdG8gdmVyaWZ5XG4gKiBAcGFyYW0gcHVibGljQXJtb3IgcHVibGljIGtleSB0byB2ZXJpZnkgc2lnbmF0dXJlIHdpdGhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVNpZ25lZERhdGEoc2lnbmVkTWVzc2FnZTogQXV0aE1lc3NhZ2UsIHB1YmxpY0FybW9yOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgcHVibGljS2V5ID0gYXdhaXQgcGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBwdWJsaWNBcm1vciB9KTtcbiAgY29uc3QgdmVyaWZpY2F0aW9uUmVzdWx0ID0gYXdhaXQgcGdwLnZlcmlmeSh7XG4gICAgbWVzc2FnZTogYXdhaXQgcGdwLmNyZWF0ZU1lc3NhZ2UoeyBiaW5hcnk6IEJ1ZmZlci5mcm9tKHNpZ25lZE1lc3NhZ2UubWVzc2FnZSwgJ2Jhc2U2NCcpIH0pLFxuICAgIHNpZ25hdHVyZTogYXdhaXQgcGdwLnJlYWRTaWduYXR1cmUoeyBhcm1vcmVkU2lnbmF0dXJlOiBzaWduZWRNZXNzYWdlLnNpZ25hdHVyZSB9KSxcbiAgICB2ZXJpZmljYXRpb25LZXlzOiBwdWJsaWNLZXksXG4gICAgZGF0ZTogbnVsbCBhcyB1bmtub3duIGFzIHVuZGVmaW5lZCxcbiAgfSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdmVyaWZpY2F0aW9uUmVzdWx0LnNpZ25hdHVyZXNbMF0udmVyaWZpZWQ7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWNyeXB0cyBhbmQgdmVyaWZpZXMgcDJwIG1lc3NhZ2VzICsgdmVyaWZpZXMgYnJvYWRjYXN0IG1lc3NhZ2VzXG4gKiBAcGFyYW0gbWVzc2FnZXMgbWVzc2FnZSB0byBkZWNyeXB0IGFuZCB2ZXJpZnlcbiAqIEBwYXJhbSBwdWJWZXJpZmljYXRpb25HcGdLZXlzIHB1YmxpYyBrZXlzIHRvIHZlcmlmeSBzaWduYXR1cmVzIHdpdGhcbiAqIEBwYXJhbSBwcnZEZWNyeXB0aW9uR3BnS2V5cyBwcml2YXRlIGtleXMgdG8gZGVjcnlwdCB3aXRoXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgbWVzc2FnZXM6IEF1dGhFbmNNZXNzYWdlcyxcbiAgcHViVmVyaWZpY2F0aW9uR3BnS2V5czogUGFydHlHcGdLZXlbXSxcbiAgcHJ2RGVjcnlwdGlvbkdwZ0tleXM6IFBhcnR5R3BnS2V5W11cbik6IFByb21pc2U8U2VyaWFsaXplZE1lc3NhZ2VzPiB7XG4gIHJldHVybiB7XG4gICAgcDJwTWVzc2FnZXM6IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWVzc2FnZXMucDJwTWVzc2FnZXMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIGNvbnN0IHB1YkdwZ0tleSA9IHB1YlZlcmlmaWNhdGlvbkdwZ0tleXMuZmluZCgoaykgPT4gay5wYXJ0eUlkID09PSBtLmZyb20pO1xuICAgICAgICBjb25zdCBwcnZHcGdLZXkgPSBwcnZEZWNyeXB0aW9uR3BnS2V5cy5maW5kKChrKSA9PiBrLnBhcnR5SWQgPT09IG0udG8pO1xuICAgICAgICBpZiAoIXB1YkdwZ0tleSkge1xuICAgICAgICAgIHRocm93IEVycm9yKGBObyBwdWJsaWMga2V5IHByb3ZpZGVkIGZvciBzZW5kZXIgd2l0aCBJRDogJHttLmZyb219YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwcnZHcGdLZXkpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihgTm8gcHJpdmF0ZSBrZXkgcHJvdmlkZWQgZm9yIHJlY2VwaWVudCB3aXRoIElEOiAke20udG99YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0bzogbS50byxcbiAgICAgICAgICBmcm9tOiBtLmZyb20sXG4gICAgICAgICAgcGF5bG9hZDogYXdhaXQgZGVjcnlwdEFuZFZlcmlmeVNpZ25lZERhdGEobS5wYXlsb2FkLCBwdWJHcGdLZXkuZ3BnS2V5LCBwcnZHcGdLZXkuZ3BnS2V5KSxcbiAgICAgICAgICBjb21taXRtZW50OiBtLmNvbW1pdG1lbnQsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIGNvbnN0IHB1YkdwZ0tleSA9IHB1YlZlcmlmaWNhdGlvbkdwZ0tleXMuZmluZCgoaykgPT4gay5wYXJ0eUlkID09PSBtLmZyb20pO1xuICAgICAgICBpZiAoIXB1YkdwZ0tleSkge1xuICAgICAgICAgIHRocm93IEVycm9yKGBObyBwdWJsaWMga2V5IHByb3ZpZGVkIGZvciBzZW5kZXIgd2l0aCBJRDogJHttLmZyb219YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoYXdhaXQgdmVyaWZ5U2lnbmVkRGF0YShtLnBheWxvYWQsIHB1YkdwZ0tleS5ncGdLZXkpKSkge1xuICAgICAgICAgIHRocm93IEVycm9yKGBGYWlsZWQgdG8gYXV0aGVudGljYXRlIGJyb2FkY2FzdCBtZXNzYWdlIGZyb20gcGFydHk6ICR7bS5mcm9tfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZnJvbTogbS5mcm9tLFxuICAgICAgICAgIHBheWxvYWQ6IG0ucGF5bG9hZC5tZXNzYWdlLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICApLFxuICB9O1xufVxuXG4vKipcbiAqIEVuY3J5cHRzIGFuZCBzaWducyBwMnAgbWVzc2FnZXMgKyBzaWducyBicm9hZGNhc3QgbWVzc2FnZXNcbiAqIEBwYXJhbSBtZXNzYWdlcyBtZXNzYWdlcyB0byBlbmNyeXB0IGFuZCBzaWduXG4gKiBAcGFyYW0gcHViRW5jcnlwdGlvbkdwZ0tleSBwdWJsaWMga2V5cyB0byBlbmNyeXB0IGRhdGEgdG9cbiAqIEBwYXJhbSBwcnZBdXRoZW50aWNhdGlvbkdwZ0tleSBwcml2YXRlIGtleXMgdG8gc2lnbiB3aXRoXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0QW5kQXV0aE91dGdvaW5nTWVzc2FnZXMoXG4gIG1lc3NhZ2VzOiBTZXJpYWxpemVkTWVzc2FnZXMsXG4gIHB1YkVuY3J5cHRpb25HcGdLZXlzOiBQYXJ0eUdwZ0tleVtdLFxuICBwcnZBdXRoZW50aWNhdGlvbkdwZ0tleXM6IFBhcnR5R3BnS2V5W11cbik6IFByb21pc2U8QXV0aEVuY01lc3NhZ2VzPiB7XG4gIHJldHVybiB7XG4gICAgcDJwTWVzc2FnZXM6IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWVzc2FnZXMucDJwTWVzc2FnZXMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIGNvbnN0IHB1YkdwZ0tleSA9IHB1YkVuY3J5cHRpb25HcGdLZXlzLmZpbmQoKGspID0+IGsucGFydHlJZCA9PT0gbS50byk7XG4gICAgICAgIGNvbnN0IHBydkdwZ0tleSA9IHBydkF1dGhlbnRpY2F0aW9uR3BnS2V5cy5maW5kKChrKSA9PiBrLnBhcnR5SWQgPT09IG0uZnJvbSk7XG4gICAgICAgIGlmICghcHViR3BnS2V5KSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoYE5vIHB1YmxpYyBrZXkgcHJvdmlkZWQgZm9yIHJlY2lwaWVudCB3aXRoIElEOiAke20udG99YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwcnZHcGdLZXkpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihgTm8gcHJpdmF0ZSBrZXkgcHJvdmlkZWQgZm9yIHNlbmRlciB3aXRoIElEOiAke20uZnJvbX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRvOiBtLnRvLFxuICAgICAgICAgIGZyb206IG0uZnJvbSxcbiAgICAgICAgICBwYXlsb2FkOiBhd2FpdCBlbmNyeXB0QW5kRGV0YWNoU2lnbkRhdGEoQnVmZmVyLmZyb20obS5wYXlsb2FkLCAnYmFzZTY0JyksIHB1YkdwZ0tleS5ncGdLZXksIHBydkdwZ0tleS5ncGdLZXkpLFxuICAgICAgICAgIGNvbW1pdG1lbnQ6IG0uY29tbWl0bWVudCxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5tYXAoYXN5bmMgKG0pID0+IHtcbiAgICAgICAgY29uc3QgcHJ2R3BnS2V5ID0gcHJ2QXV0aGVudGljYXRpb25HcGdLZXlzLmZpbmQoKGspID0+IGsucGFydHlJZCA9PT0gbS5mcm9tKTtcbiAgICAgICAgaWYgKCFwcnZHcGdLZXkpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihgTm8gcHJpdmF0ZSBrZXkgcHJvdmlkZWQgZm9yIHNlbmRlciB3aXRoIElEOiAke20uZnJvbX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZyb206IG0uZnJvbSxcbiAgICAgICAgICBwYXlsb2FkOiBhd2FpdCBkZXRhY2hTaWduRGF0YShCdWZmZXIuZnJvbShtLnBheWxvYWQsICdiYXNlNjQnKSwgcHJ2R3BnS2V5LmdwZ0tleSksXG4gICAgICAgICAgc2lnbmF0dXJlUjogbS5zaWduYXR1cmVSXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBtLnNpZ25hdHVyZVIsXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlOiAnJyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICksXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,33 @@
1
+ import type { KeygenSession, Keyshare } from '@silencelaboratories/dkls-wasm-ll-node';
2
+ import { DeserializedBroadcastMessage, DeserializedMessages, DkgState, RetrofitData } from './types';
3
+ type NodeWasmer = typeof import('@silencelaboratories/dkls-wasm-ll-node');
4
+ type WebWasmer = typeof import('@silencelaboratories/dkls-wasm-ll-web');
5
+ type BundlerWasmer = typeof import('@silencelaboratories/dkls-wasm-ll-bundler');
6
+ type DklsWasm = NodeWasmer | WebWasmer | BundlerWasmer;
7
+ export declare class Dkg {
8
+ protected dkgSession: KeygenSession | undefined;
9
+ protected dkgSessionBytes: Uint8Array;
10
+ protected dkgKeyShare: Keyshare;
11
+ protected keyShareBuff: Buffer;
12
+ protected n: number;
13
+ protected t: number;
14
+ protected seed: Buffer | undefined;
15
+ protected chainCodeCommitment: Uint8Array | undefined;
16
+ protected partyIdx: number;
17
+ protected dkgState: DkgState;
18
+ protected dklsKeyShareRetrofitObject: Keyshare | undefined;
19
+ protected retrofitData: RetrofitData | undefined;
20
+ protected dklsWasm: DklsWasm | null;
21
+ constructor(n: number, t: number, partyIdx: number, seed?: Buffer, retrofitData?: RetrofitData, dklsWasm?: BundlerWasmer);
22
+ private loadDklsWasm;
23
+ private getDklsWasm;
24
+ private _restoreSession;
25
+ private _createDKLsRetrofitKeyShare;
26
+ private _deserializeState;
27
+ initDkg(): Promise<DeserializedBroadcastMessage>;
28
+ getKeyShare(): Buffer;
29
+ getReducedKeyShare(): Buffer;
30
+ handleIncomingMessages(messagesForIthRound: DeserializedMessages): DeserializedMessages;
31
+ }
32
+ export {};
33
+ //# sourceMappingURL=dkg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dkg.d.ts","sourceRoot":"","sources":["../../../../src/tss/ecdsa-dkls/dkg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAW,MAAM,wCAAwC,CAAC;AAI/F,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,QAAQ,EAAmB,YAAY,EAAE,MAAM,SAAS,CAAC;AAEtH,KAAK,UAAU,GAAG,cAAc,wCAAwC,CAAC,CAAC;AAC1E,KAAK,SAAS,GAAG,cAAc,uCAAuC,CAAC,CAAC;AACxE,KAAK,aAAa,GAAG,cAAc,2CAA2C,CAAC,CAAC;AAEhF,KAAK,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,CAAC;AAEvD,qBAAa,GAAG;IACd,SAAS,CAAC,UAAU,EAAE,aAAa,GAAG,SAAS,CAAC;IAChD,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC;IACtC,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC;IAChC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,SAAS,CAAC,mBAAmB,EAAE,UAAU,GAAG,SAAS,CAAC;IACtD,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAA0B;IACtD,SAAS,CAAC,0BAA0B,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3D,SAAS,CAAC,YAAY,EAAE,YAAY,GAAG,SAAS,CAAC;IACjD,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;gBAGlC,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,YAAY,EAC3B,QAAQ,CAAC,EAAE,aAAa;YAWZ,YAAY;IAM1B,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,2BAA2B;IAkCnC,OAAO,CAAC,iBAAiB;IA2BnB,OAAO,IAAI,OAAO,CAAC,4BAA4B,CAAC;IA8CtD,WAAW,IAAI,MAAM;IAOrB,kBAAkB,IAAI,MAAM;IAgB5B,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;CAoFxF"}
@@ -0,0 +1,275 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Dkg = void 0;
37
+ const cbor_x_1 = require("cbor-x");
38
+ const curves_1 = require("../../curves");
39
+ const util_1 = require("../../util");
40
+ const types_1 = require("./types");
41
+ class Dkg {
42
+ constructor(n, t, partyIdx, seed, retrofitData, dklsWasm) {
43
+ this.dkgState = types_1.DkgState.Uninitialized;
44
+ this.n = n;
45
+ this.t = t;
46
+ this.partyIdx = partyIdx;
47
+ this.chainCodeCommitment = undefined;
48
+ this.retrofitData = retrofitData;
49
+ this.seed = seed;
50
+ this.dklsWasm = dklsWasm ?? null;
51
+ }
52
+ async loadDklsWasm() {
53
+ if (!this.dklsWasm) {
54
+ this.dklsWasm = await Promise.resolve().then(() => __importStar(require('@silencelaboratories/dkls-wasm-ll-node')));
55
+ }
56
+ }
57
+ getDklsWasm() {
58
+ if (!this.dklsWasm) {
59
+ throw Error('DKLS wasm not loaded');
60
+ }
61
+ return this.dklsWasm;
62
+ }
63
+ _restoreSession() {
64
+ if (!this.dkgSession) {
65
+ this.dkgSession = this.getDklsWasm().KeygenSession.fromBytes(this.dkgSessionBytes);
66
+ }
67
+ }
68
+ _createDKLsRetrofitKeyShare() {
69
+ if (this.retrofitData) {
70
+ if (!this.retrofitData.xShare.y || !this.retrofitData.xShare.chaincode || !this.retrofitData.xShare.x) {
71
+ throw Error('xShare must have a public key, private share value, and a chaincode.');
72
+ }
73
+ const xiList = [];
74
+ for (let i = 0; i < this.n; i++) {
75
+ xiList.push(Array.from((0, util_1.bigIntToBufferBE)(BigInt(i + 1), 32)));
76
+ }
77
+ const secp256k1 = new curves_1.Secp256k1Curve();
78
+ const dklsKeyShare = {
79
+ total_parties: this.n,
80
+ threshold: this.t,
81
+ rank_list: new Array(this.n).fill(0),
82
+ party_id: this.partyIdx,
83
+ public_key: Array.from(Buffer.from(this.retrofitData.xShare.y, 'hex')),
84
+ root_chain_code: Array.from(Buffer.from(this.retrofitData.xShare.chaincode, 'hex')),
85
+ final_session_id: Array(32).fill(0),
86
+ seed_ot_receivers: new Array(this.n - 1).fill(Array(32832).fill(0)),
87
+ seed_ot_senders: new Array(this.n - 1).fill(Array(32768).fill(0)),
88
+ sent_seed_list: [Array(32).fill(0)],
89
+ rec_seed_list: [Array(32).fill(0)],
90
+ s_i: Array.from(Buffer.from(this.retrofitData.xShare.x, 'hex')),
91
+ // big_s_list is now created internally during the protocol so isn't needed here, however a valid KeyShare object needs to have it.
92
+ // a dummy public key is used to fill big_s_list.
93
+ big_s_list: new Array(this.n).fill(Array.from((0, util_1.bigIntToBufferBE)(secp256k1.basePointMult(BigInt('0x' + this.retrofitData.xShare.x))))),
94
+ x_i_list: this.retrofitData.xiList ? this.retrofitData.xiList : xiList,
95
+ };
96
+ this.dklsKeyShareRetrofitObject = this.getDklsWasm().Keyshare.fromBytes((0, cbor_x_1.encode)(dklsKeyShare));
97
+ }
98
+ }
99
+ _deserializeState() {
100
+ if (!this.dkgSession) {
101
+ throw Error('Session not intialized');
102
+ }
103
+ const round = (0, cbor_x_1.decode)(this.dkgSession.toBytes()).round;
104
+ switch (round) {
105
+ case 'WaitMsg1':
106
+ this.dkgState = types_1.DkgState.Round1;
107
+ break;
108
+ case 'WaitMsg2':
109
+ this.dkgState = types_1.DkgState.Round2;
110
+ break;
111
+ case 'WaitMsg3':
112
+ this.dkgState = types_1.DkgState.Round3;
113
+ break;
114
+ case 'WaitMsg4':
115
+ this.dkgState = types_1.DkgState.Round4;
116
+ break;
117
+ case 'Ended':
118
+ this.dkgState = types_1.DkgState.Complete;
119
+ break;
120
+ default:
121
+ this.dkgState = types_1.DkgState.InvalidState;
122
+ throw Error(`Invalid State: ${round}`);
123
+ }
124
+ }
125
+ async initDkg() {
126
+ if (!this.dklsWasm) {
127
+ await this.loadDklsWasm();
128
+ }
129
+ if (this.t > this.n || this.partyIdx >= this.n) {
130
+ throw Error('Invalid parameters for DKG');
131
+ }
132
+ if (this.dkgState != types_1.DkgState.Uninitialized) {
133
+ throw Error('DKG session already initialized');
134
+ }
135
+ if (typeof window !== 'undefined' &&
136
+ /* checks for electron processes */
137
+ !window.process &&
138
+ !window.process?.['type']) {
139
+ /* This is only needed for browsers/web because it uses fetch to resolve the wasm asset for the web */
140
+ const initDkls = await Promise.resolve().then(() => __importStar(require('@silencelaboratories/dkls-wasm-ll-web')));
141
+ await initDkls.default();
142
+ }
143
+ this._createDKLsRetrofitKeyShare();
144
+ if (this.seed && this.seed.length !== 32) {
145
+ throw Error(`Seed should be 32 bytes, got ${this.seed.length}.`);
146
+ }
147
+ const { KeygenSession } = this.getDklsWasm();
148
+ if (this.dklsKeyShareRetrofitObject) {
149
+ this.dkgSession = this.seed
150
+ ? KeygenSession.initKeyRotation(this.dklsKeyShareRetrofitObject, new Uint8Array(this.seed))
151
+ : KeygenSession.initKeyRotation(this.dklsKeyShareRetrofitObject);
152
+ }
153
+ else {
154
+ this.dkgSession = this.seed
155
+ ? new KeygenSession(this.n, this.t, this.partyIdx, new Uint8Array(this.seed))
156
+ : new KeygenSession(this.n, this.t, this.partyIdx);
157
+ }
158
+ try {
159
+ const payload = this.dkgSession.createFirstMessage().payload;
160
+ this._deserializeState();
161
+ return {
162
+ payload: payload,
163
+ from: this.partyIdx,
164
+ };
165
+ }
166
+ catch (e) {
167
+ throw Error(`Error while creating the first message from party ${this.partyIdx}: ${e}`);
168
+ }
169
+ }
170
+ getKeyShare() {
171
+ if (!this.keyShareBuff) {
172
+ throw Error('Can not get key share, DKG is not complete yet.');
173
+ }
174
+ return this.keyShareBuff;
175
+ }
176
+ getReducedKeyShare() {
177
+ if (!this.keyShareBuff) {
178
+ throw Error('Can not get key share, DKG is not complete yet.');
179
+ }
180
+ const decodedKeyshare = (0, cbor_x_1.decode)(this.keyShareBuff);
181
+ const reducedKeyShare = {
182
+ bigSList: decodedKeyshare.big_s_list,
183
+ xList: decodedKeyshare.x_i_list,
184
+ rootChainCode: decodedKeyshare.root_chain_code,
185
+ prv: decodedKeyshare.s_i,
186
+ pub: decodedKeyshare.public_key,
187
+ };
188
+ const encodedKeyShare = (0, cbor_x_1.encode)(reducedKeyShare);
189
+ return encodedKeyShare;
190
+ }
191
+ handleIncomingMessages(messagesForIthRound) {
192
+ let nextRoundMessages = [];
193
+ let nextRoundDeserializedMessages = { broadcastMessages: [], p2pMessages: [] };
194
+ this._restoreSession();
195
+ if (!this.dkgSession) {
196
+ throw Error('Session not initialized');
197
+ }
198
+ const { Message } = this.getDklsWasm();
199
+ try {
200
+ if (this.dkgState === types_1.DkgState.Round3) {
201
+ const commitmentsUnsorted = messagesForIthRound.p2pMessages
202
+ .map((m) => {
203
+ return { from: m.from, commitment: m.commitment };
204
+ })
205
+ .concat([{ from: this.partyIdx, commitment: this.chainCodeCommitment }]);
206
+ const commitmentsSorted = commitmentsUnsorted
207
+ .sort((a, b) => {
208
+ return a.from - b.from;
209
+ })
210
+ .map((c) => c.commitment);
211
+ nextRoundMessages = this.dkgSession.handleMessages(messagesForIthRound.broadcastMessages
212
+ .map((m) => new Message(m.payload, m.from, undefined))
213
+ .concat(messagesForIthRound.p2pMessages.map((m) => new Message(m.payload, m.from, m.to))), commitmentsSorted);
214
+ }
215
+ else {
216
+ nextRoundMessages = this.dkgSession.handleMessages(messagesForIthRound.broadcastMessages
217
+ .map((m) => new Message(m.payload, m.from, undefined))
218
+ .concat(messagesForIthRound.p2pMessages.map((m) => new Message(m.payload, m.from, m.to))), undefined);
219
+ }
220
+ if (this.dkgState === types_1.DkgState.Round4) {
221
+ this.dkgKeyShare = this.dkgSession.keyshare();
222
+ this.keyShareBuff = Buffer.from(this.dkgKeyShare.toBytes());
223
+ this.dkgKeyShare.free();
224
+ if (this.dklsKeyShareRetrofitObject) {
225
+ this.dklsKeyShareRetrofitObject.free();
226
+ }
227
+ this.dkgState = types_1.DkgState.Complete;
228
+ return { broadcastMessages: [], p2pMessages: [] };
229
+ }
230
+ else {
231
+ // Update round data.
232
+ this._deserializeState();
233
+ }
234
+ if (this.dkgState === types_1.DkgState.Round2) {
235
+ this.chainCodeCommitment = this.dkgSession.calculateChainCodeCommitment();
236
+ }
237
+ nextRoundDeserializedMessages = {
238
+ p2pMessages: nextRoundMessages
239
+ .filter((m) => m.to_id !== undefined)
240
+ .map((m) => {
241
+ const p2pReturn = {
242
+ payload: m.payload,
243
+ from: m.from_id,
244
+ to: m.to_id,
245
+ commitment: this.chainCodeCommitment,
246
+ };
247
+ return p2pReturn;
248
+ }),
249
+ broadcastMessages: nextRoundMessages
250
+ .filter((m) => m.to_id === undefined)
251
+ .map((m) => {
252
+ const broadcastReturn = {
253
+ payload: m.payload,
254
+ from: m.from_id,
255
+ };
256
+ return broadcastReturn;
257
+ }),
258
+ };
259
+ }
260
+ catch (e) {
261
+ throw Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dkgState}: ${e}`);
262
+ }
263
+ finally {
264
+ nextRoundMessages.forEach((m) => m.free());
265
+ // Session is freed when keyshare is called.
266
+ if (this.dkgState !== types_1.DkgState.Complete) {
267
+ this.dkgSessionBytes = this.dkgSession.toBytes();
268
+ this.dkgSession = undefined;
269
+ }
270
+ }
271
+ return nextRoundDeserializedMessages;
272
+ }
273
+ }
274
+ exports.Dkg = Dkg;
275
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGtnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9lY2RzYS1ka2xzL2RrZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxtQ0FBd0M7QUFDeEMseUNBQThDO0FBQzlDLHFDQUE4QztBQUM5QyxtQ0FBc0g7QUFRdEgsTUFBYSxHQUFHO0lBZWQsWUFDRSxDQUFTLEVBQ1QsQ0FBUyxFQUNULFFBQWdCLEVBQ2hCLElBQWEsRUFDYixZQUEyQixFQUMzQixRQUF3QjtRQVhoQixhQUFRLEdBQWEsZ0JBQVEsQ0FBQyxhQUFhLENBQUM7UUFhcEQsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUM7UUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLElBQUksSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFFTyxLQUFLLENBQUMsWUFBWTtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsd0RBQWEsd0NBQXdDLEdBQUMsQ0FBQztRQUN6RSxDQUFDO0lBQ0gsQ0FBQztJQUVPLFdBQVc7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixNQUFNLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxDQUFD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Q0FBQyxRQUFRLFdBQVcsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pHLENBQUM7Z0JBQVMsQ0FBQztZQUNULGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDM0MsNENBQTRDO1lBQzVDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1lBQzlCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyw2QkFBNkIsQ0FBQztJQUN2QyxDQUFDO0NBQ0Y7QUExUUQsa0JBMFFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBLZXlnZW5TZXNzaW9uLCBLZXlzaGFyZSwgTWVzc2FnZSB9IGZyb20gJ0BzaWxlbmNlbGFib3JhdG9yaWVzL2RrbHMtd2FzbS1sbC1ub2RlJztcbmltcG9ydCB7IGRlY29kZSwgZW5jb2RlIH0gZnJvbSAnY2Jvci14JztcbmltcG9ydCB7IFNlY3AyNTZrMUN1cnZlIH0gZnJvbSAnLi4vLi4vY3VydmVzJztcbmltcG9ydCB7IGJpZ0ludFRvQnVmZmVyQkUgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IERlc2VyaWFsaXplZEJyb2FkY2FzdE1lc3NhZ2UsIERlc2VyaWFsaXplZE1lc3NhZ2VzLCBEa2dTdGF0ZSwgUmVkdWNlZEtleVNoYXJlLCBSZXRyb2ZpdERhdGEgfSBmcm9tICcuL3R5cGVzJztcblxudHlwZSBOb2RlV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQHNpbGVuY2VsYWJvcmF0b3JpZXMvZGtscy13YXNtLWxsLW5vZGUnKTtcbnR5cGUgV2ViV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQHNpbGVuY2VsYWJvcmF0b3JpZXMvZGtscy13YXNtLWxsLXdlYicpO1xudHlwZSBCdW5kbGVyV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQHNpbGVuY2VsYWJvcmF0b3JpZXMvZGtscy13YXNtLWxsLWJ1bmRsZXInKTtcblxudHlwZSBEa2xzV2FzbSA9IE5vZGVXYXNtZXIgfCBXZWJXYXNtZXIgfCBCdW5kbGVyV2FzbWVyO1xuXG5leHBvcnQgY2xhc3MgRGtnIHtcbiAgcHJvdGVjdGVkIGRrZ1Nlc3Npb246IEtleWdlblNlc3Npb24gfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBka2dTZXNzaW9uQnl0ZXM6IFVpbnQ4QXJyYXk7XG4gIHByb3RlY3RlZCBka2dLZXlTaGFyZTogS2V5c2hhcmU7XG4gIHByb3RlY3RlZCBrZXlTaGFyZUJ1ZmY6IEJ1ZmZlcjtcbiAgcHJvdGVjdGVkIG46IG51bWJlcjtcbiAgcHJvdGVjdGVkIHQ6IG51bWJlcjtcbiAgcHJvdGVjdGVkIHNlZWQ6IEJ1ZmZlciB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGNoYWluQ29kZUNvbW1pdG1lbnQ6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBwYXJ0eUlkeDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgZGtnU3RhdGU6IERrZ1N0YXRlID0gRGtnU3RhdGUuVW5pbml0aWFsaXplZDtcbiAgcHJvdGVjdGVkIGRrbHNLZXlTaGFyZVJldHJvZml0T2JqZWN0OiBLZXlzaGFyZSB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHJldHJvZml0RGF0YTogUmV0cm9maXREYXRhIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgZGtsc1dhc206IERrbHNXYXNtIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBuOiBudW1iZXIsXG4gICAgdDogbnVtYmVyLFxuICAgIHBhcnR5SWR4OiBudW1iZXIsXG4gICAgc2VlZD86IEJ1ZmZlcixcbiAgICByZXRyb2ZpdERhdGE/OiBSZXRyb2ZpdERhdGEsXG4gICAgZGtsc1dhc20/OiBCdW5kbGVyV2FzbWVyXG4gICkge1xuICAgIHRoaXMubiA9IG47XG4gICAgdGhpcy50ID0gdDtcbiAgICB0aGlzLnBhcnR5SWR4ID0gcGFydHlJZHg7XG4gICAgdGhpcy5jaGFpbkNvZGVDb21taXRtZW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucmV0cm9maXREYXRhID0gcmV0cm9maXREYXRhO1xuICAgIHRoaXMuc2VlZCA9IHNlZWQ7XG4gICAgdGhpcy5ka2xzV2FzbSA9IGRrbHNXYXNtID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWREa2xzV2FzbSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuZGtsc1dhc20pIHtcbiAgICAgIHRoaXMuZGtsc1dhc20gPSBhd2FpdCBpbXBvcnQoJ0BzaWxlbmNlbGFib3JhdG9yaWVzL2RrbHMtd2FzbS1sbC1ub2RlJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXREa2xzV2FzbSgpIHtcbiAgICBpZiAoIXRoaXMuZGtsc1dhc20pIHtcbiAgICAgIHRocm93IEVycm9yKCdES0xTIHdhc20gbm90IGxvYWRlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRrbHNXYXNtO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzdG9yZVNlc3Npb24oKSB7XG4gICAgaWYgKCF0aGlzLmRrZ1Nlc3Npb24pIHtcbiAgICAgIHRoaXMuZGtnU2Vzc2lvbiA9IHRoaXMuZ2V0RGtsc1dhc20oKS5LZXlnZW5TZXNzaW9uLmZyb21CeXRlcyh0aGlzLmRrZ1Nlc3Npb25CeXRlcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlREtMc1JldHJvZml0S2V5U2hhcmUoKSB7XG4gICAgaWYgKHRoaXMucmV0cm9maXREYXRhKSB7XG4gICAgICBpZiAoIXRoaXMucmV0cm9maXREYXRhLnhTaGFyZS55IHx8ICF0aGlzLnJldHJvZml0RGF0YS54U2hhcmUuY2hhaW5jb2RlIHx8ICF0aGlzLnJldHJvZml0RGF0YS54U2hhcmUueCkge1xuICAgICAgICB0aHJvdyBFcnJvcigneFNoYXJlIG11c3QgaGF2ZSBhIHB1YmxpYyBrZXksIHByaXZhdGUgc2hhcmUgdmFsdWUsIGFuZCBhIGNoYWluY29kZS4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHhpTGlzdDogQXJyYXk8QXJyYXk8bnVtYmVyPj4gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uOyBpKyspIHtcbiAgICAgICAgeGlMaXN0LnB1c2goQXJyYXkuZnJvbShiaWdJbnRUb0J1ZmZlckJFKEJpZ0ludChpICsgMSksIDMyKSkpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VjcDI1NmsxID0gbmV3IFNlY3AyNTZrMUN1cnZlKCk7XG4gICAgICBjb25zdCBka2xzS2V5U2hhcmUgPSB7XG4gICAgICAgIHRvdGFsX3BhcnRpZXM6IHRoaXMubixcbiAgICAgICAgdGhyZXNob2xkOiB0aGlzLnQsXG4gICAgICAgIHJhbmtfbGlzdDogbmV3IEFycmF5KHRoaXMubikuZmlsbCgwKSxcbiAgICAgICAgcGFydHlfaWQ6IHRoaXMucGFydHlJZHgsXG4gICAgICAgIHB1YmxpY19rZXk6IEFycmF5LmZyb20oQnVmZmVyLmZyb20odGhpcy5yZXRyb2ZpdERhdGEueFNoYXJlLnksICdoZXgnKSksXG4gICAgICAgIHJvb3RfY2hhaW5fY29kZTogQXJyYXkuZnJvbShCdWZmZXIuZnJvbSh0aGlzLnJldHJvZml0RGF0YS54U2hhcmUuY2hhaW5jb2RlLCAnaGV4JykpLFxuICAgICAgICBmaW5hbF9zZXNzaW9uX2lkOiBBcnJheSgzMikuZmlsbCgwKSxcbiAgICAgICAgc2VlZF9vdF9yZWNlaXZlcnM6IG5ldyBBcnJheSh0aGlzLm4gLSAxKS5maWxsKEFycmF5KDMyODMyKS5maWxsKDApKSxcbiAgICAgICAgc2VlZF9vdF9zZW5kZXJzOiBuZXcgQXJyYXkodGhpcy5uIC0gMSkuZmlsbChBcnJheSgzMjc2OCkuZmlsbCgwKSksXG4gICAgICAgIHNlbnRfc2VlZF9saXN0OiBbQXJyYXkoMzIpLmZpbGwoMCldLFxuICAgICAgICByZWNfc2VlZF9saXN0OiBbQXJyYXkoMzIpLmZpbGwoMCldLFxuICAgICAgICBzX2k6IEFycmF5LmZyb20oQnVmZmVyLmZyb20odGhpcy5yZXRyb2ZpdERhdGEueFNoYXJlLngsICdoZXgnKSksXG4gICAgICAgIC8vIGJpZ19zX2xpc3QgaXMgbm93IGNyZWF0ZWQgaW50ZXJuYWxseSBkdXJpbmcgdGhlIHByb3RvY29sIHNvIGlzbid0IG5lZWRlZCBoZXJlLCBob3dldmVyIGEgdmFsaWQgS2V5U2hhcmUgb2JqZWN0IG5lZWRzIHRvIGhhdmUgaXQuXG4gICAgICAgIC8vIGEgZHVtbXkgcHVibGljIGtleSBpcyB1c2VkIHRvIGZpbGwgYmlnX3NfbGlzdC5cbiAgICAgICAgYmlnX3NfbGlzdDogbmV3IEFycmF5KHRoaXMubikuZmlsbChcbiAgICAgICAgICBBcnJheS5mcm9tKGJpZ0ludFRvQnVmZmVyQkUoc2VjcDI1NmsxLmJhc2VQb2ludE11bHQoQmlnSW50KCcweCcgKyB0aGlzLnJldHJvZml0RGF0YS54U2hhcmUueCkpKSlcbiAgICAgICAgKSxcbiAgICAgICAgeF9pX2xpc3Q6IHRoaXMucmV0cm9maXREYXRhLnhpTGlzdCA/IHRoaXMucmV0cm9maXREYXRhLnhpTGlzdCA6IHhpTGlzdCxcbiAgICAgIH07XG4gICAgICB0aGlzLmRrbHNLZXlTaGFyZVJldHJvZml0T2JqZWN0ID0gdGhpcy5nZXREa2xzV2FzbSgpLktleXNoYXJlLmZyb21CeXRlcyhlbmNvZGUoZGtsc0tleVNoYXJlKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGVzZXJpYWxpemVTdGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuZGtnU2Vzc2lvbikge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Nlc3Npb24gbm90IGludGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgY29uc3Qgcm91bmQgPSBkZWNvZGUodGhpcy5ka2dTZXNzaW9uLnRvQnl0ZXMoKSkucm91bmQ7XG4gICAgc3dpdGNoIChyb3VuZCkge1xuICAgICAgY2FzZSAnV2FpdE1zZzEnOlxuICAgICAgICB0aGlzLmRrZ1N0YXRlID0gRGtnU3RhdGUuUm91bmQxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1dhaXRNc2cyJzpcbiAgICAgICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLlJvdW5kMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdXYWl0TXNnMyc6XG4gICAgICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5Sb3VuZDM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnV2FpdE1zZzQnOlxuICAgICAgICB0aGlzLmRrZ1N0YXRlID0gRGtnU3RhdGUuUm91bmQ0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VuZGVkJzpcbiAgICAgICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLkNvbXBsZXRlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5JbnZhbGlkU3RhdGU7XG4gICAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIFN0YXRlOiAke3JvdW5kfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluaXREa2coKTogUHJvbWlzZTxEZXNlcmlhbGl6ZWRCcm9hZGNhc3RNZXNzYWdlPiB7XG4gICAgaWYgKCF0aGlzLmRrbHNXYXNtKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWREa2xzV2FzbSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ID4gdGhpcy5uIHx8IHRoaXMucGFydHlJZHggPj0gdGhpcy5uKSB7XG4gICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBwYXJhbWV0ZXJzIGZvciBES0cnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgIT0gRGtnU3RhdGUuVW5pbml0aWFsaXplZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIGFscmVhZHkgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIC8qIGNoZWNrcyBmb3IgZWxlY3Ryb24gcHJvY2Vzc2VzICovXG4gICAgICAhd2luZG93LnByb2Nlc3MgJiZcbiAgICAgICF3aW5kb3cucHJvY2Vzcz8uWyd0eXBlJ11cbiAgICApIHtcbiAgICAgIC8qIFRoaXMgaXMgb25seSBuZWVkZWQgZm9yIGJyb3dzZXJzL3dlYiBiZWNhdXNlIGl0IHVzZXMgZmV0Y2ggdG8gcmVzb2x2ZSB0aGUgd2FzbSBhc3NldCBmb3IgdGhlIHdlYiAqL1xuICAgICAgY29uc3QgaW5pdERrbHMgPSBhd2FpdCBpbXBvcnQoJ0BzaWxlbmNlbGFib3JhdG9yaWVzL2RrbHMtd2FzbS1sbC13ZWInKTtcbiAgICAgIGF3YWl0IGluaXREa2xzLmRlZmF1bHQoKTtcbiAgICB9XG4gICAgdGhpcy5fY3JlYXRlREtMc1JldHJvZml0S2V5U2hhcmUoKTtcbiAgICBpZiAodGhpcy5zZWVkICYmIHRoaXMuc2VlZC5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBFcnJvcihgU2VlZCBzaG91bGQgYmUgMzIgYnl0ZXMsIGdvdCAke3RoaXMuc2VlZC5sZW5ndGh9LmApO1xuICAgIH1cbiAgICBjb25zdCB7IEtleWdlblNlc3Npb24gfSA9IHRoaXMuZ2V0RGtsc1dhc20oKTtcbiAgICBpZiAodGhpcy5ka2xzS2V5U2hhcmVSZXRyb2ZpdE9iamVjdCkge1xuICAgICAgdGhpcy5ka2dTZXNzaW9uID0gdGhpcy5zZWVkXG4gICAgICAgID8gS2V5Z2VuU2Vzc2lvbi5pbml0S2V5Um90YXRpb24odGhpcy5ka2xzS2V5U2hhcmVSZXRyb2ZpdE9iamVjdCwgbmV3IFVpbnQ4QXJyYXkodGhpcy5zZWVkKSlcbiAgICAgICAgOiBLZXlnZW5TZXNzaW9uLmluaXRLZXlSb3RhdGlvbih0aGlzLmRrbHNLZXlTaGFyZVJldHJvZml0T2JqZWN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ka2dTZXNzaW9uID0gdGhpcy5zZWVkXG4gICAgICAgID8gbmV3IEtleWdlblNlc3Npb24odGhpcy5uLCB0aGlzLnQsIHRoaXMucGFydHlJZHgsIG5ldyBVaW50OEFycmF5KHRoaXMuc2VlZCkpXG4gICAgICAgIDogbmV3IEtleWdlblNlc3Npb24odGhpcy5uLCB0aGlzLnQsIHRoaXMucGFydHlJZHgpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuZGtnU2Vzc2lvbi5jcmVhdGVGaXJzdE1lc3NhZ2UoKS5wYXlsb2FkO1xuICAgICAgdGhpcy5fZGVzZXJpYWxpemVTdGF0ZSgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgICAgZnJvbTogdGhpcy5wYXJ0eUlkeCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBmaXJzdCBtZXNzYWdlIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fTogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIGdldEtleVNoYXJlKCk6IEJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLmtleVNoYXJlQnVmZikge1xuICAgICAgdGhyb3cgRXJyb3IoJ0NhbiBub3QgZ2V0IGtleSBzaGFyZSwgREtHIGlzIG5vdCBjb21wbGV0ZSB5ZXQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmtleVNoYXJlQnVmZjtcbiAgfVxuXG4gIGdldFJlZHVjZWRLZXlTaGFyZSgpOiBCdWZmZXIge1xuICAgIGlmICghdGhpcy5rZXlTaGFyZUJ1ZmYpIHtcbiAgICAgIHRocm93IEVycm9yKCdDYW4gbm90IGdldCBrZXkgc2hhcmUsIERLRyBpcyBub3QgY29tcGxldGUgeWV0LicpO1xuICAgIH1cbiAgICBjb25zdCBkZWNvZGVkS2V5c2hhcmUgPSBkZWNvZGUodGhpcy5rZXlTaGFyZUJ1ZmYpO1xuICAgIGNvbnN0IHJlZHVjZWRLZXlTaGFyZTogUmVkdWNlZEtleVNoYXJlID0ge1xuICAgICAgYmlnU0xpc3Q6IGRlY29kZWRLZXlzaGFyZS5iaWdfc19saXN0LFxuICAgICAgeExpc3Q6IGRlY29kZWRLZXlzaGFyZS54X2lfbGlzdCxcbiAgICAgIHJvb3RDaGFpbkNvZGU6IGRlY29kZWRLZXlzaGFyZS5yb290X2NoYWluX2NvZGUsXG4gICAgICBwcnY6IGRlY29kZWRLZXlzaGFyZS5zX2ksXG4gICAgICBwdWI6IGRlY29kZWRLZXlzaGFyZS5wdWJsaWNfa2V5LFxuICAgIH07XG4gICAgY29uc3QgZW5jb2RlZEtleVNoYXJlID0gZW5jb2RlKHJlZHVjZWRLZXlTaGFyZSk7XG4gICAgcmV0dXJuIGVuY29kZWRLZXlTaGFyZTtcbiAgfVxuXG4gIGhhbmRsZUluY29taW5nTWVzc2FnZXMobWVzc2FnZXNGb3JJdGhSb3VuZDogRGVzZXJpYWxpemVkTWVzc2FnZXMpOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyB7XG4gICAgbGV0IG5leHRSb3VuZE1lc3NhZ2VzOiBNZXNzYWdlW10gPSBbXTtcbiAgICBsZXQgbmV4dFJvdW5kRGVzZXJpYWxpemVkTWVzc2FnZXM6IERlc2VyaWFsaXplZE1lc3NhZ2VzID0geyBicm9hZGNhc3RNZXNzYWdlczogW10sIHAycE1lc3NhZ2VzOiBbXSB9O1xuICAgIHRoaXMuX3Jlc3RvcmVTZXNzaW9uKCk7XG4gICAgaWYgKCF0aGlzLmRrZ1Nlc3Npb24pIHtcbiAgICAgIHRocm93IEVycm9yKCdTZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBjb25zdCB7IE1lc3NhZ2UgfSA9IHRoaXMuZ2V0RGtsc1dhc20oKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLlJvdW5kMykge1xuICAgICAgICBjb25zdCBjb21taXRtZW50c1Vuc29ydGVkID0gbWVzc2FnZXNGb3JJdGhSb3VuZC5wMnBNZXNzYWdlc1xuICAgICAgICAgIC5tYXAoKG0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb206IG0uZnJvbSwgY29tbWl0bWVudDogbS5jb21taXRtZW50IH07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY29uY2F0KFt7IGZyb206IHRoaXMucGFydHlJZHgsIGNvbW1pdG1lbnQ6IHRoaXMuY2hhaW5Db2RlQ29tbWl0bWVudCB9XSk7XG4gICAgICAgIGNvbnN0IGNvbW1pdG1lbnRzU29ydGVkID0gY29tbWl0bWVudHNVbnNvcnRlZFxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYS5mcm9tIC0gYi5mcm9tO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm1hcCgoYykgPT4gYy5jb21taXRtZW50KTtcbiAgICAgICAgbmV4dFJvdW5kTWVzc2FnZXMgPSB0aGlzLmRrZ1Nlc3Npb24uaGFuZGxlTWVzc2FnZXMoXG4gICAgICAgICAgbWVzc2FnZXNGb3JJdGhSb3VuZC5icm9hZGNhc3RNZXNzYWdlc1xuICAgICAgICAgICAgLm1hcCgobSkgPT4gbmV3IE1lc3NhZ2UobS5wYXlsb2FkLCBtLmZyb20sIHVuZGVmaW5lZCkpXG4gICAgICAgICAgICAuY29uY2F0KG1lc3NhZ2VzRm9ySXRoUm91bmQucDJwTWVzc2FnZXMubWFwKChtKSA9PiBuZXcgTWVzc2FnZShtLnBheWxvYWQsIG0uZnJvbSwgbS50bykpKSxcbiAgICAgICAgICBjb21taXRtZW50c1NvcnRlZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dFJvdW5kTWVzc2FnZXMgPSB0aGlzLmRrZ1Nlc3Npb24uaGFuZGxlTWVzc2FnZXMoXG4gICAgICAgICAgbWVzc2FnZXNGb3JJdGhSb3VuZC5icm9hZGNhc3RNZXNzYWdlc1xuICAgICAgICAgICAgLm1hcCgobSkgPT4gbmV3IE1lc3NhZ2UobS5wYXlsb2FkLCBtLmZyb20sIHVuZGVmaW5lZCkpXG4gICAgICAgICAgICAuY29uY2F0KG1lc3NhZ2VzRm9ySXRoUm91bmQucDJwTWVzc2FnZXMubWFwKChtKSA9PiBuZXcgTWVzc2FnZShtLnBheWxvYWQsIG0uZnJvbSwgbS50bykpKSxcbiAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRrZ1N0YXRlID09PSBEa2dTdGF0ZS5Sb3VuZDQpIHtcbiAgICAgICAgdGhpcy5ka2dLZXlTaGFyZSA9IHRoaXMuZGtnU2Vzc2lvbi5rZXlzaGFyZSgpO1xuICAgICAgICB0aGlzLmtleVNoYXJlQnVmZiA9IEJ1ZmZlci5mcm9tKHRoaXMuZGtnS2V5U2hhcmUudG9CeXRlcygpKTtcbiAgICAgICAgdGhpcy5ka2dLZXlTaGFyZS5mcmVlKCk7XG4gICAgICAgIGlmICh0aGlzLmRrbHNLZXlTaGFyZVJldHJvZml0T2JqZWN0KSB7XG4gICAgICAgICAgdGhpcy5ka2xzS2V5U2hhcmVSZXRyb2ZpdE9iamVjdC5mcmVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLkNvbXBsZXRlO1xuICAgICAgICByZXR1cm4geyBicm9hZGNhc3RNZXNzYWdlczogW10sIHAycE1lc3NhZ2VzOiBbXSB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXBkYXRlIHJvdW5kIGRhdGEuXG4gICAgICAgIHRoaXMuX2Rlc2VyaWFsaXplU3RhdGUoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRrZ1N0YXRlID09PSBEa2dTdGF0ZS5Sb3VuZDIpIHtcbiAgICAgICAgdGhpcy5jaGFpbkNvZGVDb21taXRtZW50ID0gdGhpcy5ka2dTZXNzaW9uLmNhbGN1bGF0ZUNoYWluQ29kZUNvbW1pdG1lbnQoKTtcbiAgICAgIH1cbiAgICAgIG5leHRSb3VuZERlc2VyaWFsaXplZE1lc3NhZ2VzID0ge1xuICAgICAgICBwMnBNZXNzYWdlczogbmV4dFJvdW5kTWVzc2FnZXNcbiAgICAgICAgICAuZmlsdGVyKChtKSA9PiBtLnRvX2lkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgLm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcDJwUmV0dXJuID0ge1xuICAgICAgICAgICAgICBwYXlsb2FkOiBtLnBheWxvYWQsXG4gICAgICAgICAgICAgIGZyb206IG0uZnJvbV9pZCxcbiAgICAgICAgICAgICAgdG86IG0udG9faWQhLFxuICAgICAgICAgICAgICBjb21taXRtZW50OiB0aGlzLmNoYWluQ29kZUNvbW1pdG1lbnQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHAycFJldHVybjtcbiAgICAgICAgICB9KSxcbiAgICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IG5leHRSb3VuZE1lc3NhZ2VzXG4gICAgICAgICAgLmZpbHRlcigobSkgPT4gbS50b19pZCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgIC5tYXAoKG0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJyb2FkY2FzdFJldHVybiA9IHtcbiAgICAgICAgICAgICAgcGF5bG9hZDogbS5wYXlsb2FkLFxuICAgICAgICAgICAgICBmcm9tOiBtLmZyb21faWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGJyb2FkY2FzdFJldHVybjtcbiAgICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIG1lc3NhZ2VzIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fSwgcm91bmQgJHt0aGlzLmRrZ1N0YXRlfTogJHtlfWApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBuZXh0Um91bmRNZXNzYWdlcy5mb3JFYWNoKChtKSA9PiBtLmZyZWUoKSk7XG4gICAgICAvLyBTZXNzaW9uIGlzIGZyZWVkIHdoZW4ga2V5c2hhcmUgaXMgY2FsbGVkLlxuICAgICAgaWYgKHRoaXMuZGtnU3RhdGUgIT09IERrZ1N0YXRlLkNvbXBsZXRlKSB7XG4gICAgICAgIHRoaXMuZGtnU2Vzc2lvbkJ5dGVzID0gdGhpcy5ka2dTZXNzaW9uLnRvQnl0ZXMoKTtcbiAgICAgICAgdGhpcy5ka2dTZXNzaW9uID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV4dFJvdW5kRGVzZXJpYWxpemVkTWVzc2FnZXM7XG4gIH1cbn1cbiJdfQ==