@bitgo-beta/sdk-lib-mpc 8.2.1-alpha.19 → 8.2.1-alpha.191

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