@bitgo-beta/sdk-lib-mpc 8.2.0-beta.208 → 8.2.0-beta.2080

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 (141) hide show
  1. package/dist/src/curves/ed25519.d.ts +0 -1
  2. package/dist/src/curves/ed25519.d.ts.map +1 -1
  3. package/dist/src/curves/ed25519.js +12 -12
  4. package/dist/src/curves/ed25519Bip32HdTree.js +14 -14
  5. package/dist/src/curves/index.js +6 -2
  6. package/dist/src/curves/secp256k1.d.ts +0 -1
  7. package/dist/src/curves/secp256k1.d.ts.map +1 -1
  8. package/dist/src/curves/secp256k1.js +22 -38
  9. package/dist/src/curves/secp256k1Bip32HdTree.js +10 -10
  10. package/dist/src/curves/types.d.ts +2 -3
  11. package/dist/src/curves/types.d.ts.map +1 -1
  12. package/dist/src/curves/util.d.ts +2 -0
  13. package/dist/src/curves/util.d.ts.map +1 -1
  14. package/dist/src/curves/util.js +34 -3
  15. package/dist/src/hashCommitment.d.ts +0 -1
  16. package/dist/src/hashCommitment.d.ts.map +1 -1
  17. package/dist/src/hashCommitment.js +7 -8
  18. package/dist/src/index.d.ts +1 -1
  19. package/dist/src/index.d.ts.map +1 -1
  20. package/dist/src/index.js +24 -10
  21. package/dist/src/openssl/index.js +6 -2
  22. package/dist/src/openssl/openssl.d.ts +1 -2
  23. package/dist/src/openssl/openssl.d.ts.map +1 -1
  24. package/dist/src/openssl/openssl.js +4 -12
  25. package/dist/src/safePrime.d.ts +3 -0
  26. package/dist/src/safePrime.d.ts.map +1 -0
  27. package/dist/src/safePrime.js +19 -0
  28. package/dist/src/schnorrProof.d.ts +0 -1
  29. package/dist/src/schnorrProof.d.ts.map +1 -1
  30. package/dist/src/schnorrProof.js +8 -9
  31. package/dist/src/shamir/index.js +6 -2
  32. package/dist/src/shamir/shamir.js +2 -2
  33. package/dist/src/shamir/types.d.ts +1 -1
  34. package/dist/src/shamir/types.d.ts.map +1 -1
  35. package/dist/src/tss/dkls-vrf/dkg.d.ts +91 -0
  36. package/dist/src/tss/dkls-vrf/dkg.d.ts.map +1 -0
  37. package/dist/src/tss/dkls-vrf/dkg.js +278 -0
  38. package/dist/src/tss/dkls-vrf/index.d.ts +4 -0
  39. package/dist/src/tss/dkls-vrf/index.d.ts.map +1 -0
  40. package/dist/src/tss/dkls-vrf/index.js +40 -0
  41. package/dist/src/tss/dkls-vrf/types.d.ts +28 -0
  42. package/dist/src/tss/dkls-vrf/types.d.ts.map +1 -0
  43. package/dist/src/tss/dkls-vrf/types.js +23 -0
  44. package/dist/src/tss/dkls-vrf/util.d.ts +29 -0
  45. package/dist/src/tss/dkls-vrf/util.d.ts.map +1 -0
  46. package/dist/src/tss/dkls-vrf/util.js +113 -0
  47. package/dist/src/tss/ecdsa/index.js +23 -9
  48. package/dist/src/tss/ecdsa/paillierproof.js +10 -10
  49. package/dist/src/tss/ecdsa/rangeproof.d.ts +1 -2
  50. package/dist/src/tss/ecdsa/rangeproof.d.ts.map +1 -1
  51. package/dist/src/tss/ecdsa/rangeproof.js +108 -118
  52. package/dist/src/tss/ecdsa/types.d.ts +28 -17
  53. package/dist/src/tss/ecdsa/types.d.ts.map +1 -1
  54. package/dist/src/tss/ecdsa/types.js +29 -31
  55. package/dist/src/tss/ecdsa/zkVProof.d.ts +0 -1
  56. package/dist/src/tss/ecdsa/zkVProof.d.ts.map +1 -1
  57. package/dist/src/tss/ecdsa/zkVProof.js +9 -10
  58. package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts +69 -0
  59. package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts.map +1 -0
  60. package/dist/src/tss/ecdsa-dkls/commsLayer.js +268 -0
  61. package/dist/src/tss/ecdsa-dkls/derive.d.ts +111 -0
  62. package/dist/src/tss/ecdsa-dkls/derive.d.ts.map +1 -0
  63. package/dist/src/tss/ecdsa-dkls/derive.js +329 -0
  64. package/dist/src/tss/ecdsa-dkls/dkg.d.ts +64 -0
  65. package/dist/src/tss/ecdsa-dkls/dkg.d.ts.map +1 -0
  66. package/dist/src/tss/ecdsa-dkls/dkg.js +334 -0
  67. package/dist/src/tss/ecdsa-dkls/dsg.d.ts +47 -0
  68. package/dist/src/tss/ecdsa-dkls/dsg.d.ts.map +1 -0
  69. package/dist/src/tss/ecdsa-dkls/dsg.js +271 -0
  70. package/dist/src/tss/ecdsa-dkls/index.d.ts +7 -0
  71. package/dist/src/tss/ecdsa-dkls/index.d.ts.map +1 -0
  72. package/dist/src/tss/ecdsa-dkls/index.js +43 -0
  73. package/dist/src/tss/ecdsa-dkls/types.d.ts +128 -0
  74. package/dist/src/tss/ecdsa-dkls/types.d.ts.map +1 -0
  75. package/dist/src/tss/ecdsa-dkls/types.js +175 -0
  76. package/dist/src/tss/ecdsa-dkls/util.d.ts +26 -0
  77. package/dist/src/tss/ecdsa-dkls/util.d.ts.map +1 -0
  78. package/dist/src/tss/ecdsa-dkls/util.js +276 -0
  79. package/dist/src/tss/eddsa-mps/commsLayer.d.ts +30 -0
  80. package/dist/src/tss/eddsa-mps/commsLayer.d.ts.map +1 -0
  81. package/dist/src/tss/eddsa-mps/commsLayer.js +96 -0
  82. package/dist/src/tss/eddsa-mps/dkg.d.ts +109 -0
  83. package/dist/src/tss/eddsa-mps/dkg.d.ts.map +1 -0
  84. package/dist/src/tss/eddsa-mps/dkg.js +303 -0
  85. package/dist/src/tss/eddsa-mps/dsg.d.ts +96 -0
  86. package/dist/src/tss/eddsa-mps/dsg.d.ts.map +1 -0
  87. package/dist/src/tss/eddsa-mps/dsg.js +346 -0
  88. package/dist/src/tss/eddsa-mps/index.d.ts +7 -0
  89. package/dist/src/tss/eddsa-mps/index.d.ts.map +1 -0
  90. package/dist/src/tss/eddsa-mps/index.js +42 -0
  91. package/dist/src/tss/eddsa-mps/types.d.ts +76 -0
  92. package/dist/src/tss/eddsa-mps/types.d.ts.map +1 -0
  93. package/dist/src/tss/eddsa-mps/types.js +105 -0
  94. package/dist/src/tss/eddsa-mps/util.d.ts +33 -0
  95. package/dist/src/tss/eddsa-mps/util.d.ts.map +1 -0
  96. package/dist/src/tss/eddsa-mps/util.js +94 -0
  97. package/dist/src/tss/eddsa-mps-vrf/dkg.d.ts +65 -0
  98. package/dist/src/tss/eddsa-mps-vrf/dkg.d.ts.map +1 -0
  99. package/dist/src/tss/eddsa-mps-vrf/dkg.js +246 -0
  100. package/dist/src/tss/eddsa-mps-vrf/index.d.ts +4 -0
  101. package/dist/src/tss/eddsa-mps-vrf/index.d.ts.map +1 -0
  102. package/dist/src/tss/eddsa-mps-vrf/index.js +40 -0
  103. package/dist/src/tss/eddsa-mps-vrf/types.d.ts +31 -0
  104. package/dist/src/tss/eddsa-mps-vrf/types.d.ts.map +1 -0
  105. package/dist/src/tss/eddsa-mps-vrf/types.js +97 -0
  106. package/dist/src/tss/eddsa-mps-vrf/util.d.ts +9 -0
  107. package/dist/src/tss/eddsa-mps-vrf/util.d.ts.map +1 -0
  108. package/dist/src/tss/eddsa-mps-vrf/util.js +36 -0
  109. package/dist/src/tss/index.d.ts +5 -0
  110. package/dist/src/tss/index.d.ts.map +1 -1
  111. package/dist/src/tss/index.js +11 -2
  112. package/dist/src/tss/redpallas-mps/commsLayer.d.ts +34 -0
  113. package/dist/src/tss/redpallas-mps/commsLayer.d.ts.map +1 -0
  114. package/dist/src/tss/redpallas-mps/commsLayer.js +100 -0
  115. package/dist/src/tss/redpallas-mps/dkg.d.ts +103 -0
  116. package/dist/src/tss/redpallas-mps/dkg.d.ts.map +1 -0
  117. package/dist/src/tss/redpallas-mps/dkg.js +285 -0
  118. package/dist/src/tss/redpallas-mps/dsg.d.ts +108 -0
  119. package/dist/src/tss/redpallas-mps/dsg.d.ts.map +1 -0
  120. package/dist/src/tss/redpallas-mps/dsg.js +355 -0
  121. package/dist/src/tss/redpallas-mps/index.d.ts +7 -0
  122. package/dist/src/tss/redpallas-mps/index.d.ts.map +1 -0
  123. package/dist/src/tss/redpallas-mps/index.js +42 -0
  124. package/dist/src/tss/redpallas-mps/types.d.ts +85 -0
  125. package/dist/src/tss/redpallas-mps/types.d.ts.map +1 -0
  126. package/dist/src/tss/redpallas-mps/types.js +112 -0
  127. package/dist/src/tss/redpallas-mps/util.d.ts +43 -0
  128. package/dist/src/tss/redpallas-mps/util.d.ts.map +1 -0
  129. package/dist/src/tss/redpallas-mps/util.js +147 -0
  130. package/dist/src/types.d.ts +0 -1
  131. package/dist/src/types.d.ts.map +1 -1
  132. package/dist/src/util.d.ts +0 -1
  133. package/dist/src/util.d.ts.map +1 -1
  134. package/dist/src/util.js +21 -22
  135. package/dist/tsconfig.tsbuildinfo +1 -1
  136. package/package.json +42 -5
  137. package/.eslintignore +0 -5
  138. package/CHANGELOG.md +0 -340
  139. package/dist/src/openssl/opensslbytes.d.ts +0 -4
  140. package/dist/src/openssl/opensslbytes.d.ts.map +0 -1
  141. package/dist/src/openssl/opensslbytes.js +0 -20
@@ -0,0 +1,268 @@
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.SIGNATURE_DATE_TOLERANCE_MS = void 0;
37
+ exports.detachSignData = detachSignData;
38
+ exports.encryptAndDetachSignData = encryptAndDetachSignData;
39
+ exports.decryptAndVerifySignedData = decryptAndVerifySignedData;
40
+ exports.verifySignedData = verifySignedData;
41
+ exports.decryptAndVerifyIncomingMessages = decryptAndVerifyIncomingMessages;
42
+ exports.encryptAndAuthOutgoingMessages = encryptAndAuthOutgoingMessages;
43
+ const pgp = __importStar(require("openpgp"));
44
+ /**
45
+ * Tolerance window for OpenPGP date-based key validity checks (24 hours).
46
+ *
47
+ * Background: OpenPGP.js uses the `date` parameter to check key expiry at a
48
+ * given point in time. We previously passed `date: null` to disable this check
49
+ * entirely (see HSM-706) because OVC cold-signing flows for trust and SMC
50
+ * clients can involve significant clock skew between the signing device and the
51
+ * server — the device may be air-gapped and its clock can drift by hours.
52
+ *
53
+ * Note: this GPG expiry check is not strictly required for replay protection.
54
+ * The DKLS protocol has its own mechanism for preventing replay attacks
55
+ * (session-bound commitments and round-specific message validation), so the
56
+ * OpenPGP date check is a defense-in-depth measure rather than the primary
57
+ * replay mitigation.
58
+ *
59
+ * OpenPGP's `date` parameter shifts the reference time for ALL temporal
60
+ * checks simultaneously (key expiry, self-signature validity, signature
61
+ * freshness). This means a single shifted date cannot independently relax
62
+ * key-expiry checks without breaking self-signature validation on fresh keys.
63
+ *
64
+ * Therefore:
65
+ * - encrypt/decrypt omit `date` (use default = current time) for normal key
66
+ * expiry checking and self-signature validation.
67
+ * - verify uses `now + tolerance` so that signatures from OVC devices whose
68
+ * clocks are up to 24 hours ahead are not rejected as "from the future".
69
+ */
70
+ exports.SIGNATURE_DATE_TOLERANCE_MS = 24 * 60 * 60 * 1000;
71
+ /**
72
+ * Detach signs a binary and encodes it in base64
73
+ * @param data binary to encode in base64 and sign
74
+ * @param privateArmor private key to sign with
75
+ */
76
+ async function detachSignData(data, privateArmor) {
77
+ const message = await pgp.createMessage({ binary: data });
78
+ const privateKey = await pgp.readPrivateKey({ armoredKey: privateArmor });
79
+ const signature = await pgp.sign({
80
+ message,
81
+ signingKeys: privateKey,
82
+ format: 'armored',
83
+ detached: true,
84
+ config: {
85
+ rejectCurves: new Set(),
86
+ showVersion: false,
87
+ showComment: false,
88
+ },
89
+ });
90
+ return {
91
+ message: data.toString('base64'),
92
+ signature: signature,
93
+ };
94
+ }
95
+ /**
96
+ * Encrypts and detach signs a binary
97
+ * @param data binary to encrypt and sign
98
+ * @param publicArmor public key to encrypt with
99
+ * @param privateArmor private key to sign with
100
+ */
101
+ async function encryptAndDetachSignData(data, publicArmor, privateArmor) {
102
+ const message = await pgp.createMessage({ binary: data });
103
+ const publicKey = await pgp.readKey({ armoredKey: publicArmor });
104
+ const privateKey = await pgp.readPrivateKey({ armoredKey: privateArmor });
105
+ const encryptedMessage = await pgp.encrypt({
106
+ message,
107
+ encryptionKeys: publicKey,
108
+ format: 'armored',
109
+ config: {
110
+ rejectCurves: new Set(),
111
+ showVersion: false,
112
+ showComment: false,
113
+ },
114
+ });
115
+ const signature = await pgp.sign({
116
+ message,
117
+ signingKeys: privateKey,
118
+ format: 'armored',
119
+ detached: true,
120
+ config: {
121
+ rejectCurves: new Set(),
122
+ showVersion: false,
123
+ showComment: false,
124
+ },
125
+ });
126
+ return {
127
+ encryptedMessage: encryptedMessage,
128
+ signature: signature,
129
+ };
130
+ }
131
+ /**
132
+ * Decrypts and verifies signature on a binary
133
+ * @param encryptedAndSignedMessage message to decrypt and verify
134
+ * @param publicArmor public key to verify signature with
135
+ * @param privateArmor private key to decrypt with
136
+ */
137
+ async function decryptAndVerifySignedData(encryptedAndSignedMessage, publicArmor, privateArmor) {
138
+ const publicKey = await pgp.readKey({ armoredKey: publicArmor });
139
+ const privateKey = await pgp.readPrivateKey({ armoredKey: privateArmor });
140
+ const decryptedMessage = await pgp.decrypt({
141
+ message: await pgp.readMessage({ armoredMessage: encryptedAndSignedMessage.encryptedMessage }),
142
+ decryptionKeys: [privateKey],
143
+ config: {
144
+ rejectCurves: new Set(),
145
+ showVersion: false,
146
+ showComment: false,
147
+ },
148
+ format: 'binary',
149
+ });
150
+ const verificationResult = await pgp.verify({
151
+ message: await pgp.createMessage({ binary: decryptedMessage.data }),
152
+ signature: await pgp.readSignature({ armoredSignature: encryptedAndSignedMessage.signature }),
153
+ verificationKeys: publicKey,
154
+ date: new Date(Date.now() + exports.SIGNATURE_DATE_TOLERANCE_MS),
155
+ });
156
+ await verificationResult.signatures[0].verified;
157
+ return Buffer.from(decryptedMessage.data).toString('base64');
158
+ }
159
+ /**
160
+ * Verifies signature on a binary (message passed should be encoded in base64).
161
+ * @param signedMessage message to verify
162
+ * @param publicArmor public key to verify signature with
163
+ */
164
+ async function verifySignedData(signedMessage, publicArmor) {
165
+ const publicKey = await pgp.readKey({ armoredKey: publicArmor });
166
+ const verificationResult = await pgp.verify({
167
+ message: await pgp.createMessage({ binary: Buffer.from(signedMessage.message, 'base64') }),
168
+ signature: await pgp.readSignature({ armoredSignature: signedMessage.signature }),
169
+ verificationKeys: publicKey,
170
+ date: new Date(Date.now() + exports.SIGNATURE_DATE_TOLERANCE_MS),
171
+ });
172
+ try {
173
+ await verificationResult.signatures[0].verified;
174
+ return true;
175
+ }
176
+ catch (e) {
177
+ return false;
178
+ }
179
+ }
180
+ /**
181
+ * Decrypts and verifies p2p messages + verifies broadcast messages
182
+ * @param messages message to decrypt and verify
183
+ * @param pubVerificationGpgKeys public keys to verify signatures with
184
+ * @param prvDecryptionGpgKeys private keys to decrypt with
185
+ */
186
+ async function decryptAndVerifyIncomingMessages(messages, pubVerificationGpgKeys, prvDecryptionGpgKeys) {
187
+ return {
188
+ p2pMessages: await Promise.all(messages.p2pMessages.map(async (m) => {
189
+ const pubGpgKey = pubVerificationGpgKeys.find((k) => k.partyId === m.from);
190
+ const prvGpgKey = prvDecryptionGpgKeys.find((k) => k.partyId === m.to);
191
+ if (!pubGpgKey) {
192
+ throw Error(`No public key provided for sender with ID: ${m.from}`);
193
+ }
194
+ if (!prvGpgKey) {
195
+ throw Error(`No private key provided for recepient with ID: ${m.to}`);
196
+ }
197
+ return {
198
+ to: m.to,
199
+ from: m.from,
200
+ payload: await decryptAndVerifySignedData(m.payload, pubGpgKey.gpgKey, prvGpgKey.gpgKey),
201
+ commitment: m.commitment,
202
+ };
203
+ })),
204
+ broadcastMessages: await Promise.all(messages.broadcastMessages.map(async (m) => {
205
+ const pubGpgKey = pubVerificationGpgKeys.find((k) => k.partyId === m.from);
206
+ if (!pubGpgKey) {
207
+ throw Error(`No public key provided for sender with ID: ${m.from}`);
208
+ }
209
+ if (!(await verifySignedData(m.payload, pubGpgKey.gpgKey))) {
210
+ throw Error(`Failed to authenticate broadcast message from party: ${m.from}`);
211
+ }
212
+ if (m.signatureR !== undefined) {
213
+ if (!(await verifySignedData(m.signatureR, pubGpgKey.gpgKey))) {
214
+ throw Error(`Failed to authenticate signatureR in broadcast message from party: ${m.from}`);
215
+ }
216
+ }
217
+ return {
218
+ from: m.from,
219
+ payload: m.payload.message,
220
+ signatureR: m.signatureR?.message,
221
+ };
222
+ })),
223
+ };
224
+ }
225
+ /**
226
+ * Encrypts and signs p2p messages + signs broadcast messages
227
+ * @param messages messages to encrypt and sign
228
+ * @param pubEncryptionGpgKey public keys to encrypt data to
229
+ * @param prvAuthenticationGpgKey private keys to sign with
230
+ */
231
+ async function encryptAndAuthOutgoingMessages(messages, pubEncryptionGpgKeys, prvAuthenticationGpgKeys) {
232
+ return {
233
+ p2pMessages: await Promise.all(messages.p2pMessages.map(async (m) => {
234
+ const pubGpgKey = pubEncryptionGpgKeys.find((k) => k.partyId === m.to);
235
+ const prvGpgKey = prvAuthenticationGpgKeys.find((k) => k.partyId === m.from);
236
+ if (!pubGpgKey) {
237
+ throw Error(`No public key provided for recipient with ID: ${m.to}`);
238
+ }
239
+ if (!prvGpgKey) {
240
+ throw Error(`No private key provided for sender with ID: ${m.from}`);
241
+ }
242
+ return {
243
+ to: m.to,
244
+ from: m.from,
245
+ payload: await encryptAndDetachSignData(Buffer.from(m.payload, 'base64'), pubGpgKey.gpgKey, prvGpgKey.gpgKey),
246
+ commitment: m.commitment,
247
+ };
248
+ })),
249
+ broadcastMessages: await Promise.all(messages.broadcastMessages.map(async (m) => {
250
+ const prvGpgKey = prvAuthenticationGpgKeys.find((k) => k.partyId === m.from);
251
+ if (!prvGpgKey) {
252
+ throw Error(`No private key provided for sender with ID: ${m.from}`);
253
+ }
254
+ const [signedPayload, signedSignatureR] = await Promise.all([
255
+ detachSignData(Buffer.from(m.payload, 'base64'), prvGpgKey.gpgKey),
256
+ m.signatureR
257
+ ? detachSignData(Buffer.from(m.signatureR, 'base64'), prvGpgKey.gpgKey)
258
+ : Promise.resolve(undefined),
259
+ ]);
260
+ return {
261
+ from: m.from,
262
+ payload: signedPayload,
263
+ signatureR: signedSignatureR,
264
+ };
265
+ })),
266
+ };
267
+ }
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbXNMYXllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90c3MvZWNkc2EtZGtscy9jb21tc0xheWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9DQSx3Q0FrQkM7QUFRRCw0REFpQ0M7QUFRRCxnRUF5QkM7QUFPRCw0Q0FjQztBQVFELDRFQThDQztBQVFELHdFQTRDQztBQTlQRCw2Q0FBK0I7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFDVSxRQUFBLDJCQUEyQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUUvRDs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLGNBQWMsQ0FBQyxJQUFZLEVBQUUsWUFBb0I7SUFDckUsTUFBTSxPQUFPLEdBQUcsTUFBTSxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUQsTUFBTSxVQUFVLEdBQUcsTUFBTSxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDMUUsTUFBTSxTQUFTLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQy9CLE9BQU87UUFDUCxXQUFXLEVBQUUsVUFBVTtRQUN2QixNQUFNLEVBQUUsU0FBUztRQUNqQixRQUFRLEVBQUUsSUFBSTtRQUNkLE1BQU0sRUFBRTtZQUNOLFlBQVksRUFBRSxJQUFJLEdBQUcsRUFBRTtZQUN2QixXQUFXLEVBQUUsS0FBSztZQUNsQixXQUFXLEVBQUUsS0FBSztTQUNuQjtLQUNGLENBQUMsQ0FBQztJQUNILE9BQU87UUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDaEMsU0FBUyxFQUFFLFNBQVM7S0FDckIsQ0FBQztBQUNKLENBQUM7QUFFRDs7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QUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQzFELGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztnQkFDbEUsQ0FBQyxDQUFDLFVBQVU7b0JBQ1YsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztvQkFDdkUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO2FBQy9CLENBQUMsQ0FBQztZQUNILE9BQU87Z0JBQ0wsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO2dCQUNaLE9BQU8sRUFBRSxhQUFhO2dCQUN0QixVQUFVLEVBQUUsZ0JBQWdCO2FBQzdCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FDSDtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VyaWFsaXplZE1lc3NhZ2VzLCBBdXRoRW5jTWVzc2FnZSwgQXV0aEVuY01lc3NhZ2VzLCBQYXJ0eUdwZ0tleSwgQXV0aE1lc3NhZ2UgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIHBncCBmcm9tICdvcGVucGdwJztcblxuLyoqXG4gKiBUb2xlcmFuY2Ugd2luZG93IGZvciBPcGVuUEdQIGRhdGUtYmFzZWQga2V5IHZhbGlkaXR5IGNoZWNrcyAoMjQgaG91cnMpLlxuICpcbiAqIEJhY2tncm91bmQ6IE9wZW5QR1AuanMgdXNlcyB0aGUgYGRhdGVgIHBhcmFtZXRlciB0byBjaGVjayBrZXkgZXhwaXJ5IGF0IGFcbiAqIGdpdmVuIHBvaW50IGluIHRpbWUuIFdlIHByZXZpb3VzbHkgcGFzc2VkIGBkYXRlOiBudWxsYCB0byBkaXNhYmxlIHRoaXMgY2hlY2tcbiAqIGVudGlyZWx5IChzZWUgSFNNLTcwNikgYmVjYXVzZSBPVkMgY29sZC1zaWduaW5nIGZsb3dzIGZvciB0cnVzdCBhbmQgU01DXG4gKiBjbGllbnRzIGNhbiBpbnZvbHZlIHNpZ25pZmljYW50IGNsb2NrIHNrZXcgYmV0d2VlbiB0aGUgc2lnbmluZyBkZXZpY2UgYW5kIHRoZVxuICogc2VydmVyIOKAlCB0aGUgZGV2aWNlIG1heSBiZSBhaXItZ2FwcGVkIGFuZCBpdHMgY2xvY2sgY2FuIGRyaWZ0IGJ5IGhvdXJzLlxuICpcbiAqIE5vdGU6IHRoaXMgR1BHIGV4cGlyeSBjaGVjayBpcyBub3Qgc3RyaWN0bHkgcmVxdWlyZWQgZm9yIHJlcGxheSBwcm90ZWN0aW9uLlxuICogVGhlIERLTFMgcHJvdG9jb2wgaGFzIGl0cyBvd24gbWVjaGFuaXNtIGZvciBwcmV2ZW50aW5nIHJlcGxheSBhdHRhY2tzXG4gKiAoc2Vzc2lvbi1ib3VuZCBjb21taXRtZW50cyBhbmQgcm91bmQtc3BlY2lmaWMgbWVzc2FnZSB2YWxpZGF0aW9uKSwgc28gdGhlXG4gKiBPcGVuUEdQIGRhdGUgY2hlY2sgaXMgYSBkZWZlbnNlLWluLWRlcHRoIG1lYXN1cmUgcmF0aGVyIHRoYW4gdGhlIHByaW1hcnlcbiAqIHJlcGxheSBtaXRpZ2F0aW9uLlxuICpcbiAqIE9wZW5QR1AncyBgZGF0ZWAgcGFyYW1ldGVyIHNoaWZ0cyB0aGUgcmVmZXJlbmNlIHRpbWUgZm9yIEFMTCB0ZW1wb3JhbFxuICogY2hlY2tzIHNpbXVsdGFuZW91c2x5IChrZXkgZXhwaXJ5LCBzZWxmLXNpZ25hdHVyZSB2YWxpZGl0eSwgc2lnbmF0dXJlXG4gKiBmcmVzaG5lc3MpLiBUaGlzIG1lYW5zIGEgc2luZ2xlIHNoaWZ0ZWQgZGF0ZSBjYW5ub3QgaW5kZXBlbmRlbnRseSByZWxheFxuICoga2V5LWV4cGlyeSBjaGVja3Mgd2l0aG91dCBicmVha2luZyBzZWxmLXNpZ25hdHVyZSB2YWxpZGF0aW9uIG9uIGZyZXNoIGtleXMuXG4gKlxuICogVGhlcmVmb3JlOlxuICogLSBlbmNyeXB0L2RlY3J5cHQgb21pdCBgZGF0ZWAgKHVzZSBkZWZhdWx0ID0gY3VycmVudCB0aW1lKSBmb3Igbm9ybWFsIGtleVxuICogICBleHBpcnkgY2hlY2tpbmcgYW5kIHNlbGYtc2lnbmF0dXJlIHZhbGlkYXRpb24uXG4gKiAtIHZlcmlmeSB1c2VzIGBub3cgKyB0b2xlcmFuY2VgIHNvIHRoYXQgc2lnbmF0dXJlcyBmcm9tIE9WQyBkZXZpY2VzIHdob3NlXG4gKiAgIGNsb2NrcyBhcmUgdXAgdG8gMjQgaG91cnMgYWhlYWQgYXJlIG5vdCByZWplY3RlZCBhcyBcImZyb20gdGhlIGZ1dHVyZVwiLlxuICovXG5leHBvcnQgY29uc3QgU0lHTkFUVVJFX0RBVEVfVE9MRVJBTkNFX01TID0gMjQgKiA2MCAqIDYwICogMTAwMDtcblxuLyoqXG4gKiBEZXRhY2ggc2lnbnMgYSBiaW5hcnkgYW5kIGVuY29kZXMgaXQgaW4gYmFzZTY0XG4gKiBAcGFyYW0gZGF0YSBiaW5hcnkgdG8gZW5jb2RlIGluIGJhc2U2NCBhbmQgc2lnblxuICogQHBhcmFtIHByaXZhdGVBcm1vciBwcml2YXRlIGtleSB0byBzaWduIHdpdGhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRldGFjaFNpZ25EYXRhKGRhdGE6IEJ1ZmZlciwgcHJpdmF0ZUFybW9yOiBzdHJpbmcpOiBQcm9taXNlPEF1dGhNZXNzYWdlPiB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCBwZ3AuY3JlYXRlTWVzc2FnZSh7IGJpbmFyeTogZGF0YSB9KTtcbiAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IHBncC5yZWFkUHJpdmF0ZUtleSh7IGFybW9yZWRLZXk6IHByaXZhdGVBcm1vciB9KTtcbiAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgcGdwLnNpZ24oe1xuICAgIG1lc3NhZ2UsXG4gICAgc2lnbmluZ0tleXM6IHByaXZhdGVLZXksXG4gICAgZm9ybWF0OiAnYXJtb3JlZCcsXG4gICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgY29uZmlnOiB7XG4gICAgICByZWplY3RDdXJ2ZXM6IG5ldyBTZXQoKSxcbiAgICAgIHNob3dWZXJzaW9uOiBmYWxzZSxcbiAgICAgIHNob3dDb21tZW50OiBmYWxzZSxcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlOiBkYXRhLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICBzaWduYXR1cmU6IHNpZ25hdHVyZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBFbmNyeXB0cyBhbmQgZGV0YWNoIHNpZ25zIGEgYmluYXJ5XG4gKiBAcGFyYW0gZGF0YSBiaW5hcnkgdG8gZW5jcnlwdCBhbmQgc2lnblxuICogQHBhcmFtIHB1YmxpY0FybW9yIHB1YmxpYyBrZXkgdG8gZW5jcnlwdCB3aXRoXG4gKiBAcGFyYW0gcHJpdmF0ZUFybW9yIHByaXZhdGUga2V5IHRvIHNpZ24gd2l0aFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jcnlwdEFuZERldGFjaFNpZ25EYXRhKFxuICBkYXRhOiBCdWZmZXIsXG4gIHB1YmxpY0FybW9yOiBzdHJpbmcsXG4gIHByaXZhdGVBcm1vcjogc3RyaW5nXG4pOiBQcm9taXNlPEF1dGhFbmNNZXNzYWdlPiB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCBwZ3AuY3JlYXRlTWVzc2FnZSh7IGJpbmFyeTogZGF0YSB9KTtcbiAgY29uc3QgcHVibGljS2V5ID0gYXdhaXQgcGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBwdWJsaWNBcm1vciB9KTtcbiAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IHBncC5yZWFkUHJpdmF0ZUtleSh7IGFybW9yZWRLZXk6IHByaXZhdGVBcm1vciB9KTtcbiAgY29uc3QgZW5jcnlwdGVkTWVzc2FnZSA9IGF3YWl0IHBncC5lbmNyeXB0KHtcbiAgICBtZXNzYWdlLFxuICAgIGVuY3J5cHRpb25LZXlzOiBwdWJsaWNLZXksXG4gICAgZm9ybWF0OiAnYXJtb3JlZCcsXG4gICAgY29uZmlnOiB7XG4gICAgICByZWplY3RDdXJ2ZXM6IG5ldyBTZXQoKSxcbiAgICAgIHNob3dWZXJzaW9uOiBmYWxzZSxcbiAgICAgIHNob3dDb21tZW50OiBmYWxzZSxcbiAgICB9LFxuICB9KTtcbiAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgcGdwLnNpZ24oe1xuICAgIG1lc3NhZ2UsXG4gICAgc2lnbmluZ0tleXM6IHByaXZhdGVLZXksXG4gICAgZm9ybWF0OiAnYXJtb3JlZCcsXG4gICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgY29uZmlnOiB7XG4gICAgICByZWplY3RDdXJ2ZXM6IG5ldyBTZXQoKSxcbiAgICAgIHNob3dWZXJzaW9uOiBmYWxzZSxcbiAgICAgIHNob3dDb21tZW50OiBmYWxzZSxcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBlbmNyeXB0ZWRNZXNzYWdlOiBlbmNyeXB0ZWRNZXNzYWdlLFxuICAgIHNpZ25hdHVyZTogc2lnbmF0dXJlLFxuICB9O1xufVxuXG4vKipcbiAqIERlY3J5cHRzIGFuZCB2ZXJpZmllcyBzaWduYXR1cmUgb24gYSBiaW5hcnlcbiAqIEBwYXJhbSBlbmNyeXB0ZWRBbmRTaWduZWRNZXNzYWdlIG1lc3NhZ2UgdG8gZGVjcnlwdCBhbmQgdmVyaWZ5XG4gKiBAcGFyYW0gcHVibGljQXJtb3IgcHVibGljIGtleSB0byB2ZXJpZnkgc2lnbmF0dXJlIHdpdGhcbiAqIEBwYXJhbSBwcml2YXRlQXJtb3IgcHJpdmF0ZSBrZXkgdG8gZGVjcnlwdCB3aXRoXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0QW5kVmVyaWZ5U2lnbmVkRGF0YShcbiAgZW5jcnlwdGVkQW5kU2lnbmVkTWVzc2FnZTogQXV0aEVuY01lc3NhZ2UsXG4gIHB1YmxpY0FybW9yOiBzdHJpbmcsXG4gIHByaXZhdGVBcm1vcjogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBwdWJsaWNLZXkgPSBhd2FpdCBwZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IHB1YmxpY0FybW9yIH0pO1xuICBjb25zdCBwcml2YXRlS2V5ID0gYXdhaXQgcGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogcHJpdmF0ZUFybW9yIH0pO1xuICBjb25zdCBkZWNyeXB0ZWRNZXNzYWdlID0gYXdhaXQgcGdwLmRlY3J5cHQoe1xuICAgIG1lc3NhZ2U6IGF3YWl0IHBncC5yZWFkTWVzc2FnZSh7IGFybW9yZWRNZXNzYWdlOiBlbmNyeXB0ZWRBbmRTaWduZWRNZXNzYWdlLmVuY3J5cHRlZE1lc3NhZ2UgfSksXG4gICAgZGVjcnlwdGlvbktleXM6IFtwcml2YXRlS2V5XSxcbiAgICBjb25maWc6IHtcbiAgICAgIHJlamVjdEN1cnZlczogbmV3IFNldCgpLFxuICAgICAgc2hvd1ZlcnNpb246IGZhbHNlLFxuICAgICAgc2hvd0NvbW1lbnQ6IGZhbHNlLFxuICAgIH0sXG4gICAgZm9ybWF0OiAnYmluYXJ5JyxcbiAgfSk7XG4gIGNvbnN0IHZlcmlmaWNhdGlvblJlc3VsdCA9IGF3YWl0IHBncC52ZXJpZnkoe1xuICAgIG1lc3NhZ2U6IGF3YWl0IHBncC5jcmVhdGVNZXNzYWdlKHsgYmluYXJ5OiBkZWNyeXB0ZWRNZXNzYWdlLmRhdGEgfSksXG4gICAgc2lnbmF0dXJlOiBhd2FpdCBwZ3AucmVhZFNpZ25hdHVyZSh7IGFybW9yZWRTaWduYXR1cmU6IGVuY3J5cHRlZEFuZFNpZ25lZE1lc3NhZ2Uuc2lnbmF0dXJlIH0pLFxuICAgIHZlcmlmaWNhdGlvbktleXM6IHB1YmxpY0tleSxcbiAgICBkYXRlOiBuZXcgRGF0ZShEYXRlLm5vdygpICsgU0lHTkFUVVJFX0RBVEVfVE9MRVJBTkNFX01TKSxcbiAgfSk7XG4gIGF3YWl0IHZlcmlmaWNhdGlvblJlc3VsdC5zaWduYXR1cmVzWzBdLnZlcmlmaWVkO1xuICByZXR1cm4gQnVmZmVyLmZyb20oZGVjcnlwdGVkTWVzc2FnZS5kYXRhKS50b1N0cmluZygnYmFzZTY0Jyk7XG59XG5cbi8qKlxuICogVmVyaWZpZXMgc2lnbmF0dXJlIG9uIGEgYmluYXJ5IChtZXNzYWdlIHBhc3NlZCBzaG91bGQgYmUgZW5jb2RlZCBpbiBiYXNlNjQpLlxuICogQHBhcmFtIHNpZ25lZE1lc3NhZ2UgbWVzc2FnZSB0byB2ZXJpZnlcbiAqIEBwYXJhbSBwdWJsaWNBcm1vciBwdWJsaWMga2V5IHRvIHZlcmlmeSBzaWduYXR1cmUgd2l0aFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5U2lnbmVkRGF0YShzaWduZWRNZXNzYWdlOiBBdXRoTWVzc2FnZSwgcHVibGljQXJtb3I6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBwdWJsaWNLZXkgPSBhd2FpdCBwZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IHB1YmxpY0FybW9yIH0pO1xuICBjb25zdCB2ZXJpZmljYXRpb25SZXN1bHQgPSBhd2FpdCBwZ3AudmVyaWZ5KHtcbiAgICBtZXNzYWdlOiBhd2FpdCBwZ3AuY3JlYXRlTWVzc2FnZSh7IGJpbmFyeTogQnVmZmVyLmZyb20oc2lnbmVkTWVzc2FnZS5tZXNzYWdlLCAnYmFzZTY0JykgfSksXG4gICAgc2lnbmF0dXJlOiBhd2FpdCBwZ3AucmVhZFNpZ25hdHVyZSh7IGFybW9yZWRTaWduYXR1cmU6IHNpZ25lZE1lc3NhZ2Uuc2lnbmF0dXJlIH0pLFxuICAgIHZlcmlmaWNhdGlvbktleXM6IHB1YmxpY0tleSxcbiAgICBkYXRlOiBuZXcgRGF0ZShEYXRlLm5vdygpICsgU0lHTkFUVVJFX0RBVEVfVE9MRVJBTkNFX01TKSxcbiAgfSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdmVyaWZpY2F0aW9uUmVzdWx0LnNpZ25hdHVyZXNbMF0udmVyaWZpZWQ7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWNyeXB0cyBhbmQgdmVyaWZpZXMgcDJwIG1lc3NhZ2VzICsgdmVyaWZpZXMgYnJvYWRjYXN0IG1lc3NhZ2VzXG4gKiBAcGFyYW0gbWVzc2FnZXMgbWVzc2FnZSB0byBkZWNyeXB0IGFuZCB2ZXJpZnlcbiAqIEBwYXJhbSBwdWJWZXJpZmljYXRpb25HcGdLZXlzIHB1YmxpYyBrZXlzIHRvIHZlcmlmeSBzaWduYXR1cmVzIHdpdGhcbiAqIEBwYXJhbSBwcnZEZWNyeXB0aW9uR3BnS2V5cyBwcml2YXRlIGtleXMgdG8gZGVjcnlwdCB3aXRoXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgbWVzc2FnZXM6IEF1dGhFbmNNZXNzYWdlcyxcbiAgcHViVmVyaWZpY2F0aW9uR3BnS2V5czogUGFydHlHcGdLZXlbXSxcbiAgcHJ2RGVjcnlwdGlvbkdwZ0tleXM6IFBhcnR5R3BnS2V5W11cbik6IFByb21pc2U8U2VyaWFsaXplZE1lc3NhZ2VzPiB7XG4gIHJldHVybiB7XG4gICAgcDJwTWVzc2FnZXM6IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWVzc2FnZXMucDJwTWVzc2FnZXMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIGNvbnN0IHB1YkdwZ0tleSA9IHB1YlZlcmlmaWNhdGlvbkdwZ0tleXMuZmluZCgoaykgPT4gay5wYXJ0eUlkID09PSBtLmZyb20pO1xuICAgICAgICBjb25zdCBwcnZHcGdLZXkgPSBwcnZEZWNyeXB0aW9uR3BnS2V5cy5maW5kKChrKSA9PiBrLnBhcnR5SWQgPT09IG0udG8pO1xuICAgICAgICBpZiAoIXB1YkdwZ0tleSkge1xuICAgICAgICAgIHRocm93IEVycm9yKGBObyBwdWJsaWMga2V5IHByb3ZpZGVkIGZvciBzZW5kZXIgd2l0aCBJRDogJHttLmZyb219YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwcnZHcGdLZXkpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihgTm8gcHJpdmF0ZSBrZXkgcHJvdmlkZWQgZm9yIHJlY2VwaWVudCB3aXRoIElEOiAke20udG99YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0bzogbS50byxcbiAgICAgICAgICBmcm9tOiBtLmZyb20sXG4gICAgICAgICAgcGF5bG9hZDogYXdhaXQgZGVjcnlwdEFuZFZlcmlmeVNpZ25lZERhdGEobS5wYXlsb2FkLCBwdWJHcGdLZXkuZ3BnS2V5LCBwcnZHcGdLZXkuZ3BnS2V5KSxcbiAgICAgICAgICBjb21taXRtZW50OiBtLmNvbW1pdG1lbnQsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIGNvbnN0IHB1YkdwZ0tleSA9IHB1YlZlcmlmaWNhdGlvbkdwZ0tleXMuZmluZCgoaykgPT4gay5wYXJ0eUlkID09PSBtLmZyb20pO1xuICAgICAgICBpZiAoIXB1YkdwZ0tleSkge1xuICAgICAgICAgIHRocm93IEVycm9yKGBObyBwdWJsaWMga2V5IHByb3ZpZGVkIGZvciBzZW5kZXIgd2l0aCBJRDogJHttLmZyb219YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoYXdhaXQgdmVyaWZ5U2lnbmVkRGF0YShtLnBheWxvYWQsIHB1YkdwZ0tleS5ncGdLZXkpKSkge1xuICAgICAgICAgIHRocm93IEVycm9yKGBGYWlsZWQgdG8gYXV0aGVudGljYXRlIGJyb2FkY2FzdCBtZXNzYWdlIGZyb20gcGFydHk6ICR7bS5mcm9tfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtLnNpZ25hdHVyZVIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICghKGF3YWl0IHZlcmlmeVNpZ25lZERhdGEobS5zaWduYXR1cmVSLCBwdWJHcGdLZXkuZ3BnS2V5KSkpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBGYWlsZWQgdG8gYXV0aGVudGljYXRlIHNpZ25hdHVyZVIgaW4gYnJvYWRjYXN0IG1lc3NhZ2UgZnJvbSBwYXJ0eTogJHttLmZyb219YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZnJvbTogbS5mcm9tLFxuICAgICAgICAgIHBheWxvYWQ6IG0ucGF5bG9hZC5tZXNzYWdlLFxuICAgICAgICAgIHNpZ25hdHVyZVI6IG0uc2lnbmF0dXJlUj8ubWVzc2FnZSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBFbmNyeXB0cyBhbmQgc2lnbnMgcDJwIG1lc3NhZ2VzICsgc2lnbnMgYnJvYWRjYXN0IG1lc3NhZ2VzXG4gKiBAcGFyYW0gbWVzc2FnZXMgbWVzc2FnZXMgdG8gZW5jcnlwdCBhbmQgc2lnblxuICogQHBhcmFtIHB1YkVuY3J5cHRpb25HcGdLZXkgcHVibGljIGtleXMgdG8gZW5jcnlwdCBkYXRhIHRvXG4gKiBAcGFyYW0gcHJ2QXV0aGVudGljYXRpb25HcGdLZXkgcHJpdmF0ZSBrZXlzIHRvIHNpZ24gd2l0aFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jcnlwdEFuZEF1dGhPdXRnb2luZ01lc3NhZ2VzKFxuICBtZXNzYWdlczogU2VyaWFsaXplZE1lc3NhZ2VzLFxuICBwdWJFbmNyeXB0aW9uR3BnS2V5czogUGFydHlHcGdLZXlbXSxcbiAgcHJ2QXV0aGVudGljYXRpb25HcGdLZXlzOiBQYXJ0eUdwZ0tleVtdXG4pOiBQcm9taXNlPEF1dGhFbmNNZXNzYWdlcz4ge1xuICByZXR1cm4ge1xuICAgIHAycE1lc3NhZ2VzOiBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1lc3NhZ2VzLnAycE1lc3NhZ2VzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICBjb25zdCBwdWJHcGdLZXkgPSBwdWJFbmNyeXB0aW9uR3BnS2V5cy5maW5kKChrKSA9PiBrLnBhcnR5SWQgPT09IG0udG8pO1xuICAgICAgICBjb25zdCBwcnZHcGdLZXkgPSBwcnZBdXRoZW50aWNhdGlvbkdwZ0tleXMuZmluZCgoaykgPT4gay5wYXJ0eUlkID09PSBtLmZyb20pO1xuICAgICAgICBpZiAoIXB1YkdwZ0tleSkge1xuICAgICAgICAgIHRocm93IEVycm9yKGBObyBwdWJsaWMga2V5IHByb3ZpZGVkIGZvciByZWNpcGllbnQgd2l0aCBJRDogJHttLnRvfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcHJ2R3BnS2V5KSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoYE5vIHByaXZhdGUga2V5IHByb3ZpZGVkIGZvciBzZW5kZXIgd2l0aCBJRDogJHttLmZyb219YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0bzogbS50byxcbiAgICAgICAgICBmcm9tOiBtLmZyb20sXG4gICAgICAgICAgcGF5bG9hZDogYXdhaXQgZW5jcnlwdEFuZERldGFjaFNpZ25EYXRhKEJ1ZmZlci5mcm9tKG0ucGF5bG9hZCwgJ2Jhc2U2NCcpLCBwdWJHcGdLZXkuZ3BnS2V5LCBwcnZHcGdLZXkuZ3BnS2V5KSxcbiAgICAgICAgICBjb21taXRtZW50OiBtLmNvbW1pdG1lbnQsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIGNvbnN0IHBydkdwZ0tleSA9IHBydkF1dGhlbnRpY2F0aW9uR3BnS2V5cy5maW5kKChrKSA9PiBrLnBhcnR5SWQgPT09IG0uZnJvbSk7XG4gICAgICAgIGlmICghcHJ2R3BnS2V5KSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoYE5vIHByaXZhdGUga2V5IHByb3ZpZGVkIGZvciBzZW5kZXIgd2l0aCBJRDogJHttLmZyb219YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgW3NpZ25lZFBheWxvYWQsIHNpZ25lZFNpZ25hdHVyZVJdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIGRldGFjaFNpZ25EYXRhKEJ1ZmZlci5mcm9tKG0ucGF5bG9hZCwgJ2Jhc2U2NCcpLCBwcnZHcGdLZXkuZ3BnS2V5KSxcbiAgICAgICAgICBtLnNpZ25hdHVyZVJcbiAgICAgICAgICAgID8gZGV0YWNoU2lnbkRhdGEoQnVmZmVyLmZyb20obS5zaWduYXR1cmVSLCAnYmFzZTY0JyksIHBydkdwZ0tleS5ncGdLZXkpXG4gICAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpLFxuICAgICAgICBdKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmcm9tOiBtLmZyb20sXG4gICAgICAgICAgcGF5bG9hZDogc2lnbmVkUGF5bG9hZCxcbiAgICAgICAgICBzaWduYXR1cmVSOiBzaWduZWRTaWduYXR1cmVSLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICApLFxuICB9O1xufVxuIl19
@@ -0,0 +1,111 @@
1
+ import type { HardDeriveSession as DklsHardDeriveSession, VrfKeygenSession as DklsVrfKeygenSession } from '@silencelaboratories/dkls-wasm-ll-vrf-node';
2
+ import type { HardDeriveSession as DklsVrfWebHardDeriveSession, VrfKeygenSession as DklsVrfWebKeygenSession } from '@silencelaboratories/dkls-wasm-ll-vrf-web';
3
+ import { Buffer } from 'buffer';
4
+ import { DeserializedBroadcastMessage, DeserializedMessages } from './types';
5
+ type NodeVrfWasmer = typeof import('@silencelaboratories/dkls-wasm-ll-vrf-node');
6
+ type WebVrfWasmer = typeof import('@silencelaboratories/dkls-wasm-ll-vrf-web');
7
+ type BundlerVrfWasmer = typeof import('@silencelaboratories/dkls-wasm-ll-vrf-bundler');
8
+ type VrfWasm = NodeVrfWasmer | WebVrfWasmer | BundlerVrfWasmer;
9
+ export type { DklsHardDeriveSession, DklsVrfWebHardDeriveSession, DklsVrfKeygenSession, DklsVrfWebKeygenSession };
10
+ export declare enum DeriveState {
11
+ Uninitialized = 0,
12
+ Round1 = 1,
13
+ Round2 = 2,
14
+ Complete = 3,
15
+ InvalidState = 4
16
+ }
17
+ export interface DeriveSessionData {
18
+ deriveSessionBytes: Uint8Array;
19
+ deriveState: DeriveState;
20
+ keyShareBuff?: Buffer;
21
+ ownMsg1?: Uint8Array;
22
+ ownMsg2?: Uint8Array;
23
+ }
24
+ /**
25
+ * Round driver for the DKLS23 hard-derivation protocol (Ristretto VRF backed),
26
+ * which derives a child signing keyshare from a root keyshare and its VRF keyshare.
27
+ *
28
+ * Each session is a 2-party threshold protocol between this party and one partner:
29
+ * every round accepts exactly two broadcast messages — this party's own (created by
30
+ * `initDerive()` and re-fed automatically) and the partner's. A ceremony runs one
31
+ * `Derive` per SDK party, each paired with the BitGo party:
32
+ *
33
+ * - Round 1 (`WaitMsg1`): consume `{own msg1, partner msg1}`, emit own broadcast msg2.
34
+ * - Round 2 (`WaitMsg2`): consume `{own msg2, partner msg2}`, finalize the session
35
+ * and extract the derived DKLS `Keyshare`.
36
+ *
37
+ * The session is seeded from the decrypted root blob: the DKLS signing keyshare and
38
+ * the Ristretto VRF keyshare produced by root keygen, plus the child's hardened
39
+ * derivation path.
40
+ *
41
+ * Party indices follow the MPCv2 convention: 0 = user, 1 = backup, 2 = bitgo.
42
+ */
43
+ export declare class Derive {
44
+ protected deriveSession: DklsHardDeriveSession | DklsVrfWebHardDeriveSession | undefined;
45
+ protected deriveSessionBytes: Uint8Array;
46
+ protected keyShareBuff: Buffer | undefined;
47
+ protected n: number;
48
+ protected t: number;
49
+ protected partyIdx: number;
50
+ protected rootKeyShare: Buffer;
51
+ protected vrfKeyShare: Buffer;
52
+ protected path: Uint8Array;
53
+ protected seed: Buffer | undefined;
54
+ protected deriveState: DeriveState;
55
+ protected vrfWasm: VrfWasm | null;
56
+ protected ownMsg1: Uint8Array | undefined;
57
+ protected ownMsg2: Uint8Array | undefined;
58
+ constructor(n: number, t: number, partyIdx: number, rootKeyShare: Buffer, vrfKeyShare: Buffer, path: Uint8Array, seed?: Buffer, vrfWasm?: BundlerVrfWasmer);
59
+ private loadVrfWasm;
60
+ private getVrfWasm;
61
+ private _restoreSession;
62
+ /**
63
+ * Re-derive the round state from the wasm session bytes instead of trusting a
64
+ * caller-supplied enum. The wasm embeds the round tag (`WaitMsg1`/`WaitMsg2`,
65
+ * then a `Share` payload once finalized) for exactly this reason.
66
+ */
67
+ private _deserializeState;
68
+ /**
69
+ * Create this party's first hard-derive message (broadcast). Seeds the wasm
70
+ * session from the root keyshare, VRF keyshare and derivation path.
71
+ */
72
+ initDerive(): Promise<DeserializedBroadcastMessage>;
73
+ /**
74
+ * Process the messages this party holds for the current round and return this
75
+ * party's messages for the next round. Callers pass the partner's broadcast
76
+ * message only; this party's own message is re-fed automatically because the
77
+ * wasm session validates the sender set as `{self, partner}`.
78
+ *
79
+ * - Round 1 (WaitMsg1): consumes `{own msg1, partner msg1}` and emits this
80
+ * party's broadcast msg2.
81
+ * - Round 2 (WaitMsg2): consumes `{own msg2, partner msg2}` and finalizes the
82
+ * session, returning no messages.
83
+ */
84
+ handleIncomingMessages(messagesForIthRound: DeserializedMessages): DeserializedMessages;
85
+ /**
86
+ * Get the derived DKLS keyshare bytes (CBOR `Keyshare`) once the derive is
87
+ * complete. This buffer is private key material.
88
+ */
89
+ getKeyShare(): Buffer;
90
+ /**
91
+ * Returns a CBOR-encoded ReducedKeyShare buffer containing the derived party's
92
+ * private scalar (s_i) in the `prv` field. This buffer is private key material;
93
+ * the caller encrypts it as `reducedEncryptedPrv`, matching `Dkg.getReducedKeyShare`.
94
+ */
95
+ getReducedKeyShare(): Buffer;
96
+ /**
97
+ * Get the current session data that can be used to restore the session later.
98
+ *
99
+ * The returned session bytes are secret key material — they carry this party's
100
+ * root keyshares. They must never be logged or persisted in the clear; the
101
+ * caller encrypts them exactly like the key share itself.
102
+ */
103
+ getSessionData(): DeriveSessionData;
104
+ /**
105
+ * Restore a session snapshot captured after initDerive() or round 1 processing.
106
+ * Do not call this before initDerive() has created session bytes.
107
+ * The round state is re-derived from the wasm session bytes, not the caller enum.
108
+ */
109
+ static restoreSession(n: number, t: number, partyIdx: number, rootKeyShare: Buffer, vrfKeyShare: Buffer, path: Uint8Array, sessionData: DeriveSessionData, seed?: Buffer, vrfWasm?: BundlerVrfWasmer): Promise<Derive>;
110
+ }
111
+ //# sourceMappingURL=derive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive.d.ts","sourceRoot":"","sources":["../../../../src/tss/ecdsa-dkls/derive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,IAAI,qBAAqB,EAE1C,gBAAgB,IAAI,oBAAoB,EACzC,MAAM,4CAA4C,CAAC;AACpD,OAAO,KAAK,EACV,iBAAiB,IAAI,2BAA2B,EAChD,gBAAgB,IAAI,uBAAuB,EAC5C,MAAM,2CAA2C,CAAC;AAEnD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAmB,MAAM,SAAS,CAAC;AAM9F,KAAK,aAAa,GAAG,cAAc,4CAA4C,CAAC,CAAC;AACjF,KAAK,YAAY,GAAG,cAAc,2CAA2C,CAAC,CAAC;AAC/E,KAAK,gBAAgB,GAAG,cAAc,+CAA+C,CAAC,CAAC;AAEvF,KAAK,OAAO,GAAG,aAAa,GAAG,YAAY,GAAG,gBAAgB,CAAC;AAG/D,YAAY,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,CAAC;AAElH,oBAAY,WAAW;IACrB,aAAa,IAAA;IACb,MAAM,IAAA;IACN,MAAM,IAAA;IACN,QAAQ,IAAA;IACR,YAAY,IAAA;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,EAAE,UAAU,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,MAAM;IACjB,SAAS,CAAC,aAAa,EAAE,qBAAqB,GAAG,2BAA2B,GAAG,SAAS,CAAC;IACzF,SAAS,CAAC,kBAAkB,EAAE,UAAU,CAAC;IACzC,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC;IAC3B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,SAAS,CAAC,WAAW,EAAE,WAAW,CAA6B;IAC/D,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAGlC,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,CAAC;IAC1C,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,CAAC;gBAGxC,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,UAAU,EAChB,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB;YAad,WAAW;IAMzB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,eAAe;IAMvB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,4BAA4B,CAAC;IAkDzD;;;;;;;;;;OAUG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;IAqEvF;;;OAGG;IACH,WAAW,IAAI,MAAM;IAOrB;;;;OAIG;IACH,kBAAkB,IAAI,MAAM;IAe5B;;;;;;OAMG;IACH,cAAc,IAAI,iBAAiB;IAiBnC;;;;OAIG;WACU,cAAc,CACzB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,UAAU,EAChB,WAAW,EAAE,iBAAiB,EAC9B,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,MAAM,CAAC;CAmBnB"}