@bitgo-beta/sdk-lib-mpc 8.2.0-beta.3 → 8.2.0-beta.300

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 (99) hide show
  1. package/CHANGELOG.md +493 -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} +9 -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 +3 -1
  15. package/dist/src/curves/secp256k1.d.ts.map +1 -1
  16. package/dist/src/curves/secp256k1.js +25 -14
  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 +36 -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 +17 -0
  27. package/dist/src/hashCommitment.d.ts.map +1 -0
  28. package/dist/src/hashCommitment.js +45 -0
  29. package/dist/src/index.d.ts +6 -2
  30. package/dist/src/index.d.ts.map +1 -1
  31. package/dist/src/index.js +25 -4
  32. package/dist/src/safePrime.d.ts +3 -0
  33. package/dist/src/safePrime.d.ts.map +1 -0
  34. package/dist/src/safePrime.js +23 -0
  35. package/dist/src/schnorrProof.d.ts +22 -0
  36. package/dist/src/schnorrProof.d.ts.map +1 -0
  37. package/dist/src/schnorrProof.js +62 -0
  38. package/dist/src/shamir/index.d.ts +3 -0
  39. package/dist/src/shamir/index.d.ts.map +1 -0
  40. package/dist/src/{openssl → shamir}/index.js +8 -3
  41. package/dist/src/shamir/shamir.d.ts +38 -0
  42. package/dist/src/shamir/shamir.d.ts.map +1 -0
  43. package/dist/src/shamir/shamir.js +136 -0
  44. package/dist/src/shamir/types.d.ts +5 -0
  45. package/dist/src/shamir/types.d.ts.map +1 -0
  46. package/dist/src/shamir/types.js +3 -0
  47. package/dist/src/tss/ecdsa/index.d.ts +2 -1
  48. package/dist/src/tss/ecdsa/index.d.ts.map +1 -1
  49. package/dist/src/tss/ecdsa/index.js +9 -4
  50. package/dist/src/tss/ecdsa/{pallierproof.d.ts → paillierproof.d.ts} +7 -6
  51. package/dist/src/tss/ecdsa/paillierproof.d.ts.map +1 -0
  52. package/dist/src/tss/ecdsa/paillierproof.js +86 -0
  53. package/dist/src/tss/ecdsa/rangeproof.d.ts +0 -1
  54. package/dist/src/tss/ecdsa/rangeproof.d.ts.map +1 -1
  55. package/dist/src/tss/ecdsa/rangeproof.js +102 -108
  56. package/dist/src/tss/ecdsa/types.d.ts +28 -22
  57. package/dist/src/tss/ecdsa/types.d.ts.map +1 -1
  58. package/dist/src/tss/ecdsa/types.js +42 -42
  59. package/dist/src/tss/ecdsa/zkVProof.d.ts +25 -0
  60. package/dist/src/tss/ecdsa/zkVProof.d.ts.map +1 -0
  61. package/dist/src/tss/ecdsa/zkVProof.js +71 -0
  62. package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts +43 -0
  63. package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts.map +1 -0
  64. package/dist/src/tss/ecdsa-dkls/commsLayer.js +216 -0
  65. package/dist/src/tss/ecdsa-dkls/dkg.d.ts +20 -0
  66. package/dist/src/tss/ecdsa-dkls/dkg.d.ts.map +1 -0
  67. package/dist/src/tss/ecdsa-dkls/dkg.js +153 -0
  68. package/dist/src/tss/ecdsa-dkls/dsg.d.ts +30 -0
  69. package/dist/src/tss/ecdsa-dkls/dsg.d.ts.map +1 -0
  70. package/dist/src/tss/ecdsa-dkls/dsg.js +169 -0
  71. package/dist/src/tss/ecdsa-dkls/index.d.ts +4 -0
  72. package/dist/src/tss/ecdsa-dkls/index.d.ts.map +1 -0
  73. package/dist/src/tss/ecdsa-dkls/index.js +30 -0
  74. package/dist/src/tss/ecdsa-dkls/types.d.ts +74 -0
  75. package/dist/src/tss/ecdsa-dkls/types.d.ts.map +1 -0
  76. package/dist/src/tss/ecdsa-dkls/types.js +70 -0
  77. package/dist/src/tss/index.d.ts +1 -0
  78. package/dist/src/tss/index.d.ts.map +1 -1
  79. package/dist/src/tss/index.js +7 -2
  80. package/dist/src/types.d.ts +14 -0
  81. package/dist/src/types.d.ts.map +1 -0
  82. package/dist/src/types.js +3 -0
  83. package/dist/src/util.d.ts +9 -3
  84. package/dist/src/util.d.ts.map +1 -1
  85. package/dist/src/util.js +36 -14
  86. package/dist/tsconfig.tsbuildinfo +1 -3645
  87. package/package.json +11 -6
  88. package/dist/src/curves/baseCurve.d.ts.map +0 -1
  89. package/dist/src/curves/baseCurve.js +0 -6
  90. package/dist/src/openssl/index.d.ts +0 -2
  91. package/dist/src/openssl/index.d.ts.map +0 -1
  92. package/dist/src/openssl/openssl.d.ts +0 -9
  93. package/dist/src/openssl/openssl.d.ts.map +0 -1
  94. package/dist/src/openssl/openssl.js +0 -45
  95. package/dist/src/openssl/opensslbytes.d.ts +0 -4
  96. package/dist/src/openssl/opensslbytes.d.ts.map +0 -1
  97. package/dist/src/openssl/opensslbytes.js +0 -20
  98. package/dist/src/tss/ecdsa/pallierproof.d.ts.map +0 -1
  99. package/dist/src/tss/ecdsa/pallierproof.js +0 -86
@@ -0,0 +1,216 @@
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
+ });
114
+ await verificationResult.signatures[0].verified;
115
+ return Buffer.from(decryptedMessage.data).toString('base64');
116
+ }
117
+ exports.decryptAndVerifySignedData = decryptAndVerifySignedData;
118
+ /**
119
+ * Verifies signature on a binary (message passed should be encoded in base64).
120
+ * @param signedMessage message to verify
121
+ * @param publicArmor public key to verify signature with
122
+ */
123
+ async function verifySignedData(signedMessage, publicArmor) {
124
+ const publicKey = await pgp.readKey({ armoredKey: publicArmor });
125
+ const verificationResult = await pgp.verify({
126
+ message: await pgp.createMessage({ binary: Buffer.from(signedMessage.message, 'base64') }),
127
+ signature: await pgp.readSignature({ armoredSignature: signedMessage.signature }),
128
+ verificationKeys: publicKey,
129
+ });
130
+ try {
131
+ await verificationResult.signatures[0].verified;
132
+ return true;
133
+ }
134
+ catch (e) {
135
+ return false;
136
+ }
137
+ }
138
+ exports.verifySignedData = verifySignedData;
139
+ /**
140
+ * Decrypts and verifies p2p messages + verifies broadcast messages
141
+ * @param messages message to decrypt and verify
142
+ * @param pubVerificationGpgKeys public keys to verify signatures with
143
+ * @param prvDecryptionGpgKeys private keys to decrypt with
144
+ */
145
+ async function decryptAndVerifyIncomingMessages(messages, pubVerificationGpgKeys, prvDecryptionGpgKeys) {
146
+ return {
147
+ p2pMessages: await Promise.all(messages.p2pMessages.map(async (m) => {
148
+ const pubGpgKey = pubVerificationGpgKeys.find((k) => k.partyId === m.from);
149
+ const prvGpgKey = prvDecryptionGpgKeys.find((k) => k.partyId === m.to);
150
+ if (!pubGpgKey) {
151
+ throw Error(`No public key provided for sender with ID: ${m.from}`);
152
+ }
153
+ if (!prvGpgKey) {
154
+ throw Error(`No private key provided for recepient with ID: ${m.to}`);
155
+ }
156
+ return {
157
+ to: m.to,
158
+ from: m.from,
159
+ payload: await decryptAndVerifySignedData(m.payload, pubGpgKey.gpgKey, prvGpgKey.gpgKey),
160
+ commitment: m.commitment,
161
+ };
162
+ })),
163
+ broadcastMessages: await Promise.all(messages.broadcastMessages.map(async (m) => {
164
+ const pubGpgKey = pubVerificationGpgKeys.find((k) => k.partyId === m.from);
165
+ if (!pubGpgKey) {
166
+ throw Error(`No public key provided for sender with ID: ${m.from}`);
167
+ }
168
+ if (!(await verifySignedData(m.payload, pubGpgKey.gpgKey))) {
169
+ throw Error(`Failed to authenticate broadcast message from party: ${m.from}`);
170
+ }
171
+ return {
172
+ from: m.from,
173
+ payload: m.payload.message,
174
+ };
175
+ })),
176
+ };
177
+ }
178
+ exports.decryptAndVerifyIncomingMessages = decryptAndVerifyIncomingMessages;
179
+ /**
180
+ * Encrypts and signs p2p messages + signs broadcast messages
181
+ * @param messages messages to encrypt and sign
182
+ * @param pubEncryptionGpgKey public keys to encrypt data to
183
+ * @param prvAuthenticationGpgKey private keys to sign with
184
+ */
185
+ async function encryptAndAuthOutgoingMessages(messages, pubEncryptionGpgKeys, prvAuthenticationGpgKeys) {
186
+ return {
187
+ p2pMessages: await Promise.all(messages.p2pMessages.map(async (m) => {
188
+ const pubGpgKey = pubEncryptionGpgKeys.find((k) => k.partyId === m.to);
189
+ const prvGpgKey = prvAuthenticationGpgKeys.find((k) => k.partyId === m.from);
190
+ if (!pubGpgKey) {
191
+ throw Error(`No public key provided for recipient with ID: ${m.to}`);
192
+ }
193
+ if (!prvGpgKey) {
194
+ throw Error(`No private key provided for sender with ID: ${m.from}`);
195
+ }
196
+ return {
197
+ to: m.to,
198
+ from: m.from,
199
+ payload: await encryptAndDetachSignData(Buffer.from(m.payload, 'base64'), pubGpgKey.gpgKey, prvGpgKey.gpgKey),
200
+ commitment: m.commitment,
201
+ };
202
+ })),
203
+ broadcastMessages: await Promise.all(messages.broadcastMessages.map(async (m) => {
204
+ const prvGpgKey = prvAuthenticationGpgKeys.find((k) => k.partyId === m.from);
205
+ if (!prvGpgKey) {
206
+ throw Error(`No private key provided for sender with ID: ${m.from}`);
207
+ }
208
+ return {
209
+ from: m.from,
210
+ payload: await detachSignData(Buffer.from(m.payload, 'base64'), prvGpgKey.gpgKey),
211
+ };
212
+ })),
213
+ };
214
+ }
215
+ exports.encryptAndAuthOutgoingMessages = encryptAndAuthOutgoingMessages;
216
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbXNMYXllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90c3MvZWNkc2EtZGtscy9jb21tc0xheWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsNkNBQStCO0FBRS9COzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsY0FBYyxDQUFDLElBQVksRUFBRSxZQUFvQjtJQUNyRSxNQUFNLE9BQU8sR0FBRyxNQUFNLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRCxNQUFNLFVBQVUsR0FBRyxNQUFNLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUMxRSxNQUFNLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDL0IsT0FBTztRQUNQLFdBQVcsRUFBRSxVQUFVO1FBQ3ZCLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLFFBQVEsRUFBRSxJQUFJO1FBQ2QsTUFBTSxFQUFFO1lBQ04sWUFBWSxFQUFFLElBQUksR0FBRyxFQUFFO1lBQ3ZCLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLFdBQVcsRUFBRSxLQUFLO1NBQ25CO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsT0FBTztRQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUNoQyxTQUFTLEVBQUUsU0FBUztLQUNyQixDQUFDO0FBQ0osQ0FBQztBQWxCRCx3Q0FrQkM7QUFFRDs7Ozs7R0FLRztBQUNJLEtBQUssVUFBVSx3QkFBd0IsQ0FDNUMsSUFBWSxFQUNaLFdBQW1CLEVBQ25CLFlBQW9CO0lBRXBCLE1BQU0sT0FBTyxHQUFHLE1BQU0sR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFELE1BQU0sU0FBUyxHQUFHLE1B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UUFBUSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekMsTUFBTSxTQUFTLEdBQUcsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNkLE1BQU0sS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQzthQUN0RTtZQUNELE9BQU87Z0JBQ0wsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO2dCQUNaLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQzthQUNsRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0g7S0FDRixDQUFDO0FBQ0osQ0FBQztBQXJDRCx3RUFxQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZXJpYWxpemVkTWVzc2FnZXMsIEF1dGhFbmNNZXNzYWdlLCBBdXRoRW5jTWVzc2FnZXMsIFBhcnR5R3BnS2V5LCBBdXRoTWVzc2FnZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0ICogYXMgcGdwIGZyb20gJ29wZW5wZ3AnO1xuXG4vKipcbiAqIERldGFjaCBzaWducyBhIGJpbmFyeSBhbmQgZW5jb2RlcyBpdCBpbiBiYXNlNjRcbiAqIEBwYXJhbSBkYXRhIGJpbmFyeSB0byBlbmNvZGUgaW4gYmFzZTY0IGFuZCBzaWduXG4gKiBAcGFyYW0gcHJpdmF0ZUFybW9yIHByaXZhdGUga2V5IHRvIHNpZ24gd2l0aFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGV0YWNoU2lnbkRhdGEoZGF0YTogQnVmZmVyLCBwcml2YXRlQXJtb3I6IHN0cmluZyk6IFByb21pc2U8QXV0aE1lc3NhZ2U+IHtcbiAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHBncC5jcmVhdGVNZXNzYWdlKHsgYmluYXJ5OiBkYXRhIH0pO1xuICBjb25zdCBwcml2YXRlS2V5ID0gYXdhaXQgcGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogcHJpdmF0ZUFybW9yIH0pO1xuICBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCBwZ3Auc2lnbih7XG4gICAgbWVzc2FnZSxcbiAgICBzaWduaW5nS2V5czogcHJpdmF0ZUtleSxcbiAgICBmb3JtYXQ6ICdhcm1vcmVkJyxcbiAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICBjb25maWc6IHtcbiAgICAgIHJlamVjdEN1cnZlczogbmV3IFNldCgpLFxuICAgICAgc2hvd1ZlcnNpb246IGZhbHNlLFxuICAgICAgc2hvd0NvbW1lbnQ6IGZhbHNlLFxuICAgIH0sXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIG1lc3NhZ2U6IGRhdGEudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIHNpZ25hdHVyZTogc2lnbmF0dXJlLFxuICB9O1xufVxuXG4vKipcbiAqIEVuY3J5cHRzIGFuZCBkZXRhY2ggc2lnbnMgYSBiaW5hcnlcbiAqIEBwYXJhbSBkYXRhIGJpbmFyeSB0byBlbmNyeXB0IGFuZCBzaWduXG4gKiBAcGFyYW0gcHVibGljQXJtb3IgcHVibGljIGtleSB0byBlbmNyeXB0IHdpdGhcbiAqIEBwYXJhbSBwcml2YXRlQXJtb3IgcHJpdmF0ZSBrZXkgdG8gc2lnbiB3aXRoXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0QW5kRGV0YWNoU2lnbkRhdGEoXG4gIGRhdGE6IEJ1ZmZlcixcbiAgcHVibGljQXJtb3I6IHN0cmluZyxcbiAgcHJpdmF0ZUFybW9yOiBzdHJpbmdcbik6IFByb21pc2U8QXV0aEVuY01lc3NhZ2U+IHtcbiAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHBncC5jcmVhdGVNZXNzYWdlKHsgYmluYXJ5OiBkYXRhIH0pO1xuICBjb25zdCBwdWJsaWNLZXkgPSBhd2FpdCBwZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IHB1YmxpY0FybW9yIH0pO1xuICBjb25zdCBwcml2YXRlS2V5ID0gYXdhaXQgcGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogcHJpdmF0ZUFybW9yIH0pO1xuICBjb25zdCBlbmNyeXB0ZWRNZXNzYWdlID0gYXdhaXQgcGdwLmVuY3J5cHQoe1xuICAgIG1lc3NhZ2UsXG4gICAgZW5jcnlwdGlvbktleXM6IHB1YmxpY0tleSxcbiAgICBmb3JtYXQ6ICdhcm1vcmVkJyxcbiAgICBjb25maWc6IHtcbiAgICAgIHJlamVjdEN1cnZlczogbmV3IFNldCgpLFxuICAgICAgc2hvd1ZlcnNpb246IGZhbHNlLFxuICAgICAgc2hvd0NvbW1lbnQ6IGZhbHNlLFxuICAgIH0sXG4gIH0pO1xuICBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCBwZ3Auc2lnbih7XG4gICAgbWVzc2FnZSxcbiAgICBzaWduaW5nS2V5czogcHJpdmF0ZUtleSxcbiAgICBmb3JtYXQ6ICdhcm1vcmVkJyxcbiAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICBjb25maWc6IHtcbiAgICAgIHJlamVjdEN1cnZlczogbmV3IFNldCgpLFxuICAgICAgc2hvd1ZlcnNpb246IGZhbHNlLFxuICAgICAgc2hvd0NvbW1lbnQ6IGZhbHNlLFxuICAgIH0sXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGVuY3J5cHRlZE1lc3NhZ2U6IGVuY3J5cHRlZE1lc3NhZ2UsXG4gICAgc2lnbmF0dXJlOiBzaWduYXR1cmUsXG4gIH07XG59XG5cbi8qKlxuICogRGVjcnlwdHMgYW5kIHZlcmlmaWVzIHNpZ25hdHVyZSBvbiBhIGJpbmFyeVxuICogQHBhcmFtIGVuY3J5cHRlZEFuZFNpZ25lZE1lc3NhZ2UgbWVzc2FnZSB0byBkZWNyeXB0IGFuZCB2ZXJpZnlcbiAqIEBwYXJhbSBwdWJsaWNBcm1vciBwdWJsaWMga2V5IHRvIHZlcmlmeSBzaWduYXR1cmUgd2l0aFxuICogQHBhcmFtIHByaXZhdGVBcm1vciBwcml2YXRlIGtleSB0byBkZWNyeXB0IHdpdGhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHRBbmRWZXJpZnlTaWduZWREYXRhKFxuICBlbmNyeXB0ZWRBbmRTaWduZWRNZXNzYWdlOiBBdXRoRW5jTWVzc2FnZSxcbiAgcHVibGljQXJtb3I6IHN0cmluZyxcbiAgcHJpdmF0ZUFybW9yOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHB1YmxpY0tleSA9IGF3YWl0IHBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogcHVibGljQXJtb3IgfSk7XG4gIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCBwZ3AucmVhZFByaXZhdGVLZXkoeyBhcm1vcmVkS2V5OiBwcml2YXRlQXJtb3IgfSk7XG4gIGNvbnN0IGRlY3J5cHRlZE1lc3NhZ2UgPSBhd2FpdCBwZ3AuZGVjcnlwdCh7XG4gICAgbWVzc2FnZTogYXdhaXQgcGdwLnJlYWRNZXNzYWdlKHsgYXJtb3JlZE1lc3NhZ2U6IGVuY3J5cHRlZEFuZFNpZ25lZE1lc3NhZ2UuZW5jcnlwdGVkTWVzc2FnZSB9KSxcbiAgICBkZWNyeXB0aW9uS2V5czogW3ByaXZhdGVLZXldLFxuICAgIGNvbmZpZzoge1xuICAgICAgcmVqZWN0Q3VydmVzOiBuZXcgU2V0KCksXG4gICAgICBzaG93VmVyc2lvbjogZmFsc2UsXG4gICAgICBzaG93Q29tbWVudDogZmFsc2UsXG4gICAgfSxcbiAgICBmb3JtYXQ6ICdiaW5hcnknLFxuICB9KTtcbiAgY29uc3QgdmVyaWZpY2F0aW9uUmVzdWx0ID0gYXdhaXQgcGdwLnZlcmlmeSh7XG4gICAgbWVzc2FnZTogYXdhaXQgcGdwLmNyZWF0ZU1lc3NhZ2UoeyBiaW5hcnk6IGRlY3J5cHRlZE1lc3NhZ2UuZGF0YSB9KSxcbiAgICBzaWduYXR1cmU6IGF3YWl0IHBncC5yZWFkU2lnbmF0dXJlKHsgYXJtb3JlZFNpZ25hdHVyZTogZW5jcnlwdGVkQW5kU2lnbmVkTWVzc2FnZS5zaWduYXR1cmUgfSksXG4gICAgdmVyaWZpY2F0aW9uS2V5czogcHVibGljS2V5LFxuICB9KTtcbiAgYXdhaXQgdmVyaWZpY2F0aW9uUmVzdWx0LnNpZ25hdHVyZXNbMF0udmVyaWZpZWQ7XG4gIHJldHVybiBCdWZmZXIuZnJvbShkZWNyeXB0ZWRNZXNzYWdlLmRhdGEpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbn1cblxuLyoqXG4gKiBWZXJpZmllcyBzaWduYXR1cmUgb24gYSBiaW5hcnkgKG1lc3NhZ2UgcGFzc2VkIHNob3VsZCBiZSBlbmNvZGVkIGluIGJhc2U2NCkuXG4gKiBAcGFyYW0gc2lnbmVkTWVzc2FnZSBtZXNzYWdlIHRvIHZlcmlmeVxuICogQHBhcmFtIHB1YmxpY0FybW9yIHB1YmxpYyBrZXkgdG8gdmVyaWZ5IHNpZ25hdHVyZSB3aXRoXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlTaWduZWREYXRhKHNpZ25lZE1lc3NhZ2U6IEF1dGhNZXNzYWdlLCBwdWJsaWNBcm1vcjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHB1YmxpY0tleSA9IGF3YWl0IHBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogcHVibGljQXJtb3IgfSk7XG4gIGNvbnN0IHZlcmlmaWNhdGlvblJlc3VsdCA9IGF3YWl0IHBncC52ZXJpZnkoe1xuICAgIG1lc3NhZ2U6IGF3YWl0IHBncC5jcmVhdGVNZXNzYWdlKHsgYmluYXJ5OiBCdWZmZXIuZnJvbShzaWduZWRNZXNzYWdlLm1lc3NhZ2UsICdiYXNlNjQnKSB9KSxcbiAgICBzaWduYXR1cmU6IGF3YWl0IHBncC5yZWFkU2lnbmF0dXJlKHsgYXJtb3JlZFNpZ25hdHVyZTogc2lnbmVkTWVzc2FnZS5zaWduYXR1cmUgfSksXG4gICAgdmVyaWZpY2F0aW9uS2V5czogcHVibGljS2V5LFxuICB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB2ZXJpZmljYXRpb25SZXN1bHQuc2lnbmF0dXJlc1swXS52ZXJpZmllZDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIERlY3J5cHRzIGFuZCB2ZXJpZmllcyBwMnAgbWVzc2FnZXMgKyB2ZXJpZmllcyBicm9hZGNhc3QgbWVzc2FnZXNcbiAqIEBwYXJhbSBtZXNzYWdlcyBtZXNzYWdlIHRvIGRlY3J5cHQgYW5kIHZlcmlmeVxuICogQHBhcmFtIHB1YlZlcmlmaWNhdGlvbkdwZ0tleXMgcHVibGljIGtleXMgdG8gdmVyaWZ5IHNpZ25hdHVyZXMgd2l0aFxuICogQHBhcmFtIHBydkRlY3J5cHRpb25HcGdLZXlzIHByaXZhdGUga2V5cyB0byBkZWNyeXB0IHdpdGhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICBtZXNzYWdlczogQXV0aEVuY01lc3NhZ2VzLFxuICBwdWJWZXJpZmljYXRpb25HcGdLZXlzOiBQYXJ0eUdwZ0tleVtdLFxuICBwcnZEZWNyeXB0aW9uR3BnS2V5czogUGFydHlHcGdLZXlbXVxuKTogUHJvbWlzZTxTZXJpYWxpemVkTWVzc2FnZXM+IHtcbiAgcmV0dXJuIHtcbiAgICBwMnBNZXNzYWdlczogYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtZXNzYWdlcy5wMnBNZXNzYWdlcy5tYXAoYXN5bmMgKG0pID0+IHtcbiAgICAgICAgY29uc3QgcHViR3BnS2V5ID0gcHViVmVyaWZpY2F0aW9uR3BnS2V5cy5maW5kKChrKSA9PiBrLnBhcnR5SWQgPT09IG0uZnJvbSk7XG4gICAgICAgIGNvbnN0IHBydkdwZ0tleSA9IHBydkRlY3J5cHRpb25HcGdLZXlzLmZpbmQoKGspID0+IGsucGFydHlJZCA9PT0gbS50byk7XG4gICAgICAgIGlmICghcHViR3BnS2V5KSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoYE5vIHB1YmxpYyBrZXkgcHJvdmlkZWQgZm9yIHNlbmRlciB3aXRoIElEOiAke20uZnJvbX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBydkdwZ0tleSkge1xuICAgICAgICAgIHRocm93IEVycm9yKGBObyBwcml2YXRlIGtleSBwcm92aWRlZCBmb3IgcmVjZXBpZW50IHdpdGggSUQ6ICR7bS50b31gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRvOiBtLnRvLFxuICAgICAgICAgIGZyb206IG0uZnJvbSxcbiAgICAgICAgICBwYXlsb2FkOiBhd2FpdCBkZWNyeXB0QW5kVmVyaWZ5U2lnbmVkRGF0YShtLnBheWxvYWQsIHB1YkdwZ0tleS5ncGdLZXksIHBydkdwZ0tleS5ncGdLZXkpLFxuICAgICAgICAgIGNvbW1pdG1lbnQ6IG0uY29tbWl0bWVudCxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5tYXAoYXN5bmMgKG0pID0+IHtcbiAgICAgICAgY29uc3QgcHViR3BnS2V5ID0gcHViVmVyaWZpY2F0aW9uR3BnS2V5cy5maW5kKChrKSA9PiBrLnBhcnR5SWQgPT09IG0uZnJvbSk7XG4gICAgICAgIGlmICghcHViR3BnS2V5KSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoYE5vIHB1YmxpYyBrZXkgcHJvdmlkZWQgZm9yIHNlbmRlciB3aXRoIElEOiAke20uZnJvbX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShhd2FpdCB2ZXJpZnlTaWduZWREYXRhKG0ucGF5bG9hZCwgcHViR3BnS2V5LmdwZ0tleSkpKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoYEZhaWxlZCB0byBhdXRoZW50aWNhdGUgYnJvYWRjYXN0IG1lc3NhZ2UgZnJvbSBwYXJ0eTogJHttLmZyb219YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmcm9tOiBtLmZyb20sXG4gICAgICAgICAgcGF5bG9hZDogbS5wYXlsb2FkLm1lc3NhZ2UsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICksXG4gIH07XG59XG5cbi8qKlxuICogRW5jcnlwdHMgYW5kIHNpZ25zIHAycCBtZXNzYWdlcyArIHNpZ25zIGJyb2FkY2FzdCBtZXNzYWdlc1xuICogQHBhcmFtIG1lc3NhZ2VzIG1lc3NhZ2VzIHRvIGVuY3J5cHQgYW5kIHNpZ25cbiAqIEBwYXJhbSBwdWJFbmNyeXB0aW9uR3BnS2V5IHB1YmxpYyBrZXlzIHRvIGVuY3J5cHQgZGF0YSB0b1xuICogQHBhcmFtIHBydkF1dGhlbnRpY2F0aW9uR3BnS2V5IHByaXZhdGUga2V5cyB0byBzaWduIHdpdGhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuY3J5cHRBbmRBdXRoT3V0Z29pbmdNZXNzYWdlcyhcbiAgbWVzc2FnZXM6IFNlcmlhbGl6ZWRNZXNzYWdlcyxcbiAgcHViRW5jcnlwdGlvbkdwZ0tleXM6IFBhcnR5R3BnS2V5W10sXG4gIHBydkF1dGhlbnRpY2F0aW9uR3BnS2V5czogUGFydHlHcGdLZXlbXVxuKTogUHJvbWlzZTxBdXRoRW5jTWVzc2FnZXM+IHtcbiAgcmV0dXJuIHtcbiAgICBwMnBNZXNzYWdlczogYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtZXNzYWdlcy5wMnBNZXNzYWdlcy5tYXAoYXN5bmMgKG0pID0+IHtcbiAgICAgICAgY29uc3QgcHViR3BnS2V5ID0gcHViRW5jcnlwdGlvbkdwZ0tleXMuZmluZCgoaykgPT4gay5wYXJ0eUlkID09PSBtLnRvKTtcbiAgICAgICAgY29uc3QgcHJ2R3BnS2V5ID0gcHJ2QXV0aGVudGljYXRpb25HcGdLZXlzLmZpbmQoKGspID0+IGsucGFydHlJZCA9PT0gbS5mcm9tKTtcbiAgICAgICAgaWYgKCFwdWJHcGdLZXkpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihgTm8gcHVibGljIGtleSBwcm92aWRlZCBmb3IgcmVjaXBpZW50IHdpdGggSUQ6ICR7bS50b31gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBydkdwZ0tleSkge1xuICAgICAgICAgIHRocm93IEVycm9yKGBObyBwcml2YXRlIGtleSBwcm92aWRlZCBmb3Igc2VuZGVyIHdpdGggSUQ6ICR7bS5mcm9tfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG86IG0udG8sXG4gICAgICAgICAgZnJvbTogbS5mcm9tLFxuICAgICAgICAgIHBheWxvYWQ6IGF3YWl0IGVuY3J5cHRBbmREZXRhY2hTaWduRGF0YShCdWZmZXIuZnJvbShtLnBheWxvYWQsICdiYXNlNjQnKSwgcHViR3BnS2V5LmdwZ0tleSwgcHJ2R3BnS2V5LmdwZ0tleSksXG4gICAgICAgICAgY29tbWl0bWVudDogbS5jb21taXRtZW50LFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICApLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICBjb25zdCBwcnZHcGdLZXkgPSBwcnZBdXRoZW50aWNhdGlvbkdwZ0tleXMuZmluZCgoaykgPT4gay5wYXJ0eUlkID09PSBtLmZyb20pO1xuICAgICAgICBpZiAoIXBydkdwZ0tleSkge1xuICAgICAgICAgIHRocm93IEVycm9yKGBObyBwcml2YXRlIGtleSBwcm92aWRlZCBmb3Igc2VuZGVyIHdpdGggSUQ6ICR7bS5mcm9tfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZnJvbTogbS5mcm9tLFxuICAgICAgICAgIHBheWxvYWQ6IGF3YWl0IGRldGFjaFNpZ25EYXRhKEJ1ZmZlci5mcm9tKG0ucGF5bG9hZCwgJ2Jhc2U2NCcpLCBwcnZHcGdLZXkuZ3BnS2V5KSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKSxcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,20 @@
1
+ /// <reference types="node" />
2
+ import { KeygenSession, Keyshare } from '@silencelaboratories/dkls-wasm-ll-node';
3
+ import { DeserializedBroadcastMessage, DeserializedMessages, DkgState } from './types';
4
+ export declare class Dkg {
5
+ protected dkgSession: KeygenSession | undefined;
6
+ protected dkgSessionBytes: Uint8Array;
7
+ protected dkgKeyShare: Keyshare;
8
+ protected n: number;
9
+ protected t: number;
10
+ protected chainCodeCommitment: Uint8Array | undefined;
11
+ protected partyIdx: number;
12
+ protected dkgState: DkgState;
13
+ constructor(n: number, t: number, partyIdx: number);
14
+ private _restoreSession;
15
+ private _deserializeState;
16
+ initDkg(): Promise<DeserializedBroadcastMessage>;
17
+ getKeyShare(): Buffer;
18
+ handleIncomingMessages(messagesForIthRound: DeserializedMessages): DeserializedMessages;
19
+ }
20
+ //# 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,EAAE,aAAa,EAAE,QAAQ,EAAW,MAAM,wCAAwC,CAAC;AAC1F,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGvF,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,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,mBAAmB,EAAE,UAAU,GAAG,SAAS,CAAC;IACtD,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAA0B;gBAE1C,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAOlD,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,iBAAiB;IA2BnB,OAAO,IAAI,OAAO,CAAC,4BAA4B,CAAC;IAwBtD,WAAW,IAAI,MAAM;IAMrB,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;CA8ExF"}
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Dkg = void 0;
4
+ const dkls_wasm_ll_node_1 = require("@silencelaboratories/dkls-wasm-ll-node");
5
+ const types_1 = require("./types");
6
+ const cbor_1 = require("cbor");
7
+ class Dkg {
8
+ constructor(n, t, partyIdx) {
9
+ this.dkgState = types_1.DkgState.Uninitialized;
10
+ this.n = n;
11
+ this.t = t;
12
+ this.partyIdx = partyIdx;
13
+ this.chainCodeCommitment = undefined;
14
+ }
15
+ _restoreSession() {
16
+ if (!this.dkgSession) {
17
+ this.dkgSession = dkls_wasm_ll_node_1.KeygenSession.fromBytes(this.dkgSessionBytes);
18
+ }
19
+ }
20
+ _deserializeState() {
21
+ if (!this.dkgSession) {
22
+ throw Error('Session not intialized');
23
+ }
24
+ const round = (0, cbor_1.decode)(this.dkgSession.toBytes()).round;
25
+ switch (round) {
26
+ case 'WaitMsg1':
27
+ this.dkgState = types_1.DkgState.Round1;
28
+ break;
29
+ case 'WaitMsg2':
30
+ this.dkgState = types_1.DkgState.Round2;
31
+ break;
32
+ case 'WaitMsg3':
33
+ this.dkgState = types_1.DkgState.Round3;
34
+ break;
35
+ case 'WaitMsg4':
36
+ this.dkgState = types_1.DkgState.Round4;
37
+ break;
38
+ case 'Ended':
39
+ this.dkgState = types_1.DkgState.Complete;
40
+ break;
41
+ default:
42
+ this.dkgState = types_1.DkgState.InvalidState;
43
+ throw `Invalid State: ${round}`;
44
+ }
45
+ }
46
+ async initDkg() {
47
+ if (this.t > this.n || this.partyIdx >= this.n) {
48
+ throw 'Invalid parameters for DKG';
49
+ }
50
+ if (this.dkgState != types_1.DkgState.Uninitialized) {
51
+ throw 'DKG session already initialized';
52
+ }
53
+ if (typeof window !== 'undefined') {
54
+ const initDkls = require('@silencelaboratories/dkls-wasm-ll-web');
55
+ await initDkls();
56
+ }
57
+ this.dkgSession = new dkls_wasm_ll_node_1.KeygenSession(this.n, this.t, this.partyIdx);
58
+ try {
59
+ const payload = this.dkgSession.createFirstMessage().payload;
60
+ this._deserializeState();
61
+ return {
62
+ payload: payload,
63
+ from: this.partyIdx,
64
+ };
65
+ }
66
+ catch (e) {
67
+ throw `Error while creating the first message from party ${this.partyIdx}: ${e}`;
68
+ }
69
+ }
70
+ getKeyShare() {
71
+ const keyShareBuff = Buffer.from(this.dkgKeyShare.toBytes());
72
+ this.dkgKeyShare.free();
73
+ return keyShareBuff;
74
+ }
75
+ handleIncomingMessages(messagesForIthRound) {
76
+ let nextRoundMessages = [];
77
+ let nextRoundDeserializedMessages = { broadcastMessages: [], p2pMessages: [] };
78
+ this._restoreSession();
79
+ if (!this.dkgSession) {
80
+ throw Error('Session not initialized');
81
+ }
82
+ try {
83
+ if (this.dkgState == types_1.DkgState.Round3) {
84
+ const commitmentsUnsorted = messagesForIthRound.p2pMessages
85
+ .map((m) => {
86
+ return { from: m.from, commitment: m.commitment };
87
+ })
88
+ .concat([{ from: this.partyIdx, commitment: this.chainCodeCommitment }]);
89
+ const commitmentsSorted = commitmentsUnsorted
90
+ .sort((a, b) => {
91
+ return a.from - b.from;
92
+ })
93
+ .map((c) => c.commitment);
94
+ nextRoundMessages = this.dkgSession.handleMessages(messagesForIthRound.broadcastMessages
95
+ .map((m) => new dkls_wasm_ll_node_1.Message(m.payload, m.from, undefined))
96
+ .concat(messagesForIthRound.p2pMessages.map((m) => new dkls_wasm_ll_node_1.Message(m.payload, m.from, m.to))), commitmentsSorted);
97
+ }
98
+ else {
99
+ nextRoundMessages = this.dkgSession.handleMessages(messagesForIthRound.broadcastMessages
100
+ .map((m) => new dkls_wasm_ll_node_1.Message(m.payload, m.from, undefined))
101
+ .concat(messagesForIthRound.p2pMessages.map((m) => new dkls_wasm_ll_node_1.Message(m.payload, m.from, m.to))), undefined);
102
+ }
103
+ if (this.dkgState == types_1.DkgState.Round4) {
104
+ this.dkgKeyShare = this.dkgSession.keyshare();
105
+ this.dkgState = types_1.DkgState.Complete;
106
+ return { broadcastMessages: [], p2pMessages: [] };
107
+ }
108
+ else {
109
+ // Update ronud data.
110
+ this._deserializeState();
111
+ }
112
+ if (this.dkgState == types_1.DkgState.Round2) {
113
+ this.chainCodeCommitment = this.dkgSession.calculateChainCodeCommitment();
114
+ }
115
+ nextRoundDeserializedMessages = {
116
+ p2pMessages: nextRoundMessages
117
+ .filter((m) => m.to_id !== undefined)
118
+ .map((m) => {
119
+ const p2pReturn = {
120
+ payload: m.payload,
121
+ from: m.from_id,
122
+ to: m.to_id,
123
+ commitment: this.chainCodeCommitment,
124
+ };
125
+ return p2pReturn;
126
+ }),
127
+ broadcastMessages: nextRoundMessages
128
+ .filter((m) => m.to_id === undefined)
129
+ .map((m) => {
130
+ const broadcastReturn = {
131
+ payload: m.payload,
132
+ from: m.from_id,
133
+ };
134
+ return broadcastReturn;
135
+ }),
136
+ };
137
+ }
138
+ catch (e) {
139
+ throw `Error while creating messages from party ${this.partyIdx}, round ${this.dkgState}: ${e}`;
140
+ }
141
+ finally {
142
+ nextRoundMessages.forEach((m) => m.free());
143
+ // Session is freed when keyshare is called.
144
+ if (this.dkgState !== types_1.DkgState.Complete) {
145
+ this.dkgSessionBytes = this.dkgSession.toBytes();
146
+ this.dkgSession = undefined;
147
+ }
148
+ }
149
+ return nextRoundDeserializedMessages;
150
+ }
151
+ }
152
+ exports.Dkg = Dkg;
153
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGtnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9lY2RzYS1ka2xzL2RrZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw4RUFBMEY7QUFDMUYsbUNBQXVGO0FBQ3ZGLCtCQUE4QjtBQUU5QixNQUFhLEdBQUc7SUFVZCxZQUFZLENBQVMsRUFBRSxDQUFTLEVBQUUsUUFBZ0I7UUFGeEMsYUFBUSxHQUFhLGdCQUFRLENBQUMsYUFBYSxDQUFDO1FBR3BELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsaUNBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ2pFO0lBQ0gsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQixNQUFNLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1NBQ3ZDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBQSxhQUFNLEVBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN0RCxRQUFRLEtBQUssRUFBRTtZQUNiLEtBQUssVUFBVTtnQkFDYixJQUFJLENBQUMsUUFBUSxHQUFHLGdCQUFRLENBQUMsTUFBTSxDQUFDO2dCQUNoQyxNQUFNO1lBQ1IsS0FBSyxVQUFVO2dCQUNiLElBQUksQ0FBQyxRQUFRLEdBQUcsZ0JBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQ2hDLE1BQU07WUFDUixLQUFLLFVBQVU7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RyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ1QsTUFBTSxlQUFlLEdBQUc7d0JBQ3RCLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTzt3QkFDbEIsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPO3FCQUNoQixDQUFDO29CQUNGLE9BQU8sZUFBZSxDQUFDO2dCQUN6QixDQUFDLENBQUM7YUFDTCxDQUFDO1NBQ0g7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE1BQU0sNENBQTRDLElBQUksQ0FBQyxRQUFRLFdBQVcsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQztTQUNqRztnQkFBUztZQUNSLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDM0MsNENBQTRDO1lBQzVDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBUSxDQUFDLFFBQVEsRUFBRTtnQkFDdkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNqRCxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQzthQUM3QjtTQUNGO1FBQ0QsT0FBTyw2QkFBNkIsQ0FBQztJQUN2QyxDQUFDO0NBQ0Y7QUE5SkQsa0JBOEpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS2V5Z2VuU2Vzc2lvbiwgS2V5c2hhcmUsIE1lc3NhZ2UgfSBmcm9tICdAc2lsZW5jZWxhYm9yYXRvcmllcy9ka2xzLXdhc20tbGwtbm9kZSc7XG5pbXBvcnQgeyBEZXNlcmlhbGl6ZWRCcm9hZGNhc3RNZXNzYWdlLCBEZXNlcmlhbGl6ZWRNZXNzYWdlcywgRGtnU3RhdGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGRlY29kZSB9IGZyb20gJ2Nib3InO1xuXG5leHBvcnQgY2xhc3MgRGtnIHtcbiAgcHJvdGVjdGVkIGRrZ1Nlc3Npb246IEtleWdlblNlc3Npb24gfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBka2dTZXNzaW9uQnl0ZXM6IFVpbnQ4QXJyYXk7XG4gIHByb3RlY3RlZCBka2dLZXlTaGFyZTogS2V5c2hhcmU7XG4gIHByb3RlY3RlZCBuOiBudW1iZXI7XG4gIHByb3RlY3RlZCB0OiBudW1iZXI7XG4gIHByb3RlY3RlZCBjaGFpbkNvZGVDb21taXRtZW50OiBVaW50OEFycmF5IHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcGFydHlJZHg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGRrZ1N0YXRlOiBEa2dTdGF0ZSA9IERrZ1N0YXRlLlVuaW5pdGlhbGl6ZWQ7XG5cbiAgY29uc3RydWN0b3IobjogbnVtYmVyLCB0OiBudW1iZXIsIHBhcnR5SWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLm4gPSBuO1xuICAgIHRoaXMudCA9IHQ7XG4gICAgdGhpcy5wYXJ0eUlkeCA9IHBhcnR5SWR4O1xuICAgIHRoaXMuY2hhaW5Db2RlQ29tbWl0bWVudCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc3RvcmVTZXNzaW9uKCkge1xuICAgIGlmICghdGhpcy5ka2dTZXNzaW9uKSB7XG4gICAgICB0aGlzLmRrZ1Nlc3Npb24gPSBLZXlnZW5TZXNzaW9uLmZyb21CeXRlcyh0aGlzLmRrZ1Nlc3Npb25CeXRlcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGVzZXJpYWxpemVTdGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuZGtnU2Vzc2lvbikge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Nlc3Npb24gbm90IGludGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgY29uc3Qgcm91bmQgPSBkZWNvZGUodGhpcy5ka2dTZXNzaW9uLnRvQnl0ZXMoKSkucm91bmQ7XG4gICAgc3dpdGNoIChyb3VuZCkge1xuICAgICAgY2FzZSAnV2FpdE1zZzEnOlxuICAgICAgICB0aGlzLmRrZ1N0YXRlID0gRGtnU3RhdGUuUm91bmQxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1dhaXRNc2cyJzpcbiAgICAgICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLlJvdW5kMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdXYWl0TXNnMyc6XG4gICAgICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5Sb3VuZDM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnV2FpdE1zZzQnOlxuICAgICAgICB0aGlzLmRrZ1N0YXRlID0gRGtnU3RhdGUuUm91bmQ0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VuZGVkJzpcbiAgICAgICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLkNvbXBsZXRlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5JbnZhbGlkU3RhdGU7XG4gICAgICAgIHRocm93IGBJbnZhbGlkIFN0YXRlOiAke3JvdW5kfWA7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdERrZygpOiBQcm9taXNlPERlc2VyaWFsaXplZEJyb2FkY2FzdE1lc3NhZ2U+IHtcbiAgICBpZiAodGhpcy50ID4gdGhpcy5uIHx8IHRoaXMucGFydHlJZHggPj0gdGhpcy5uKSB7XG4gICAgICB0aHJvdyAnSW52YWxpZCBwYXJhbWV0ZXJzIGZvciBES0cnO1xuICAgIH1cbiAgICBpZiAodGhpcy5ka2dTdGF0ZSAhPSBEa2dTdGF0ZS5VbmluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyAnREtHIHNlc3Npb24gYWxyZWFkeSBpbml0aWFsaXplZCc7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc3QgaW5pdERrbHMgPSByZXF1aXJlKCdAc2lsZW5jZWxhYm9yYXRvcmllcy9ka2xzLXdhc20tbGwtd2ViJyk7XG4gICAgICBhd2FpdCBpbml0RGtscygpO1xuICAgIH1cbiAgICB0aGlzLmRrZ1Nlc3Npb24gPSBuZXcgS2V5Z2VuU2Vzc2lvbih0aGlzLm4sIHRoaXMudCwgdGhpcy5wYXJ0eUlkeCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmRrZ1Nlc3Npb24uY3JlYXRlRmlyc3RNZXNzYWdlKCkucGF5bG9hZDtcbiAgICAgIHRoaXMuX2Rlc2VyaWFsaXplU3RhdGUoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBheWxvYWQ6IHBheWxvYWQsXG4gICAgICAgIGZyb206IHRoaXMucGFydHlJZHgsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IGBFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgZmlyc3QgbWVzc2FnZSBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH06ICR7ZX1gO1xuICAgIH1cbiAgfVxuXG4gIGdldEtleVNoYXJlKCk6IEJ1ZmZlciB7XG4gICAgY29uc3Qga2V5U2hhcmVCdWZmID0gQnVmZmVyLmZyb20odGhpcy5ka2dLZXlTaGFyZS50b0J5dGVzKCkpO1xuICAgIHRoaXMuZGtnS2V5U2hhcmUuZnJlZSgpO1xuICAgIHJldHVybiBrZXlTaGFyZUJ1ZmY7XG4gIH1cblxuICBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2VzRm9ySXRoUm91bmQ6IERlc2VyaWFsaXplZE1lc3NhZ2VzKTogRGVzZXJpYWxpemVkTWVzc2FnZXMge1xuICAgIGxldCBuZXh0Um91bmRNZXNzYWdlczogTWVzc2FnZVtdID0gW107XG4gICAgbGV0IG5leHRSb3VuZERlc2VyaWFsaXplZE1lc3NhZ2VzOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLCBwMnBNZXNzYWdlczogW10gfTtcbiAgICB0aGlzLl9yZXN0b3JlU2Vzc2lvbigpO1xuICAgIGlmICghdGhpcy5ka2dTZXNzaW9uKSB7XG4gICAgICB0aHJvdyBFcnJvcignU2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmRrZ1N0YXRlID09IERrZ1N0YXRlLlJvdW5kMykge1xuICAgICAgICBjb25zdCBjb21taXRtZW50c1Vuc29ydGVkID0gbWVzc2FnZXNGb3JJdGhSb3VuZC5wMnBNZXNzYWdlc1xuICAgICAgICAgIC5tYXAoKG0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb206IG0uZnJvbSwgY29tbWl0bWVudDogbS5jb21taXRtZW50IH07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY29uY2F0KFt7IGZyb206IHRoaXMucGFydHlJZHgsIGNvbW1pdG1lbnQ6IHRoaXMuY2hhaW5Db2RlQ29tbWl0bWVudCB9XSk7XG4gICAgICAgIGNvbnN0IGNvbW1pdG1lbnRzU29ydGVkID0gY29tbWl0bWVudHNVbnNvcnRlZFxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYS5mcm9tIC0gYi5mcm9tO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm1hcCgoYykgPT4gYy5jb21taXRtZW50KTtcbiAgICAgICAgbmV4dFJvdW5kTWVzc2FnZXMgPSB0aGlzLmRrZ1Nlc3Npb24uaGFuZGxlTWVzc2FnZXMoXG4gICAgICAgICAgbWVzc2FnZXNGb3JJdGhSb3VuZC5icm9hZGNhc3RNZXNzYWdlc1xuICAgICAgICAgICAgLm1hcCgobSkgPT4gbmV3IE1lc3NhZ2UobS5wYXlsb2FkLCBtLmZyb20sIHVuZGVmaW5lZCkpXG4gICAgICAgICAgICAuY29uY2F0KG1lc3NhZ2VzRm9ySXRoUm91bmQucDJwTWVzc2FnZXMubWFwKChtKSA9PiBuZXcgTWVzc2FnZShtLnBheWxvYWQsIG0uZnJvbSwgbS50bykpKSxcbiAgICAgICAgICBjb21taXRtZW50c1NvcnRlZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dFJvdW5kTWVzc2FnZXMgPSB0aGlzLmRrZ1Nlc3Npb24uaGFuZGxlTWVzc2FnZXMoXG4gICAgICAgICAgbWVzc2FnZXNGb3JJdGhSb3VuZC5icm9hZGNhc3RNZXNzYWdlc1xuICAgICAgICAgICAgLm1hcCgobSkgPT4gbmV3IE1lc3NhZ2UobS5wYXlsb2FkLCBtLmZyb20sIHVuZGVmaW5lZCkpXG4gICAgICAgICAgICAuY29uY2F0KG1lc3NhZ2VzRm9ySXRoUm91bmQucDJwTWVzc2FnZXMubWFwKChtKSA9PiBuZXcgTWVzc2FnZShtLnBheWxvYWQsIG0uZnJvbSwgbS50bykpKSxcbiAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRrZ1N0YXRlID09IERrZ1N0YXRlLlJvdW5kNCkge1xuICAgICAgICB0aGlzLmRrZ0tleVNoYXJlID0gdGhpcy5ka2dTZXNzaW9uLmtleXNoYXJlKCk7XG4gICAgICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5Db21wbGV0ZTtcbiAgICAgICAgcmV0dXJuIHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLCBwMnBNZXNzYWdlczogW10gfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVwZGF0ZSByb251ZCBkYXRhLlxuICAgICAgICB0aGlzLl9kZXNlcmlhbGl6ZVN0YXRlKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ka2dTdGF0ZSA9PSBEa2dTdGF0ZS5Sb3VuZDIpIHtcbiAgICAgICAgdGhpcy5jaGFpbkNvZGVDb21taXRtZW50ID0gdGhpcy5ka2dTZXNzaW9uLmNhbGN1bGF0ZUNoYWluQ29kZUNvbW1pdG1lbnQoKTtcbiAgICAgIH1cbiAgICAgIG5leHRSb3VuZERlc2VyaWFsaXplZE1lc3NhZ2VzID0ge1xuICAgICAgICBwMnBNZXNzYWdlczogbmV4dFJvdW5kTWVzc2FnZXNcbiAgICAgICAgICAuZmlsdGVyKChtKSA9PiBtLnRvX2lkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgLm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcDJwUmV0dXJuID0ge1xuICAgICAgICAgICAgICBwYXlsb2FkOiBtLnBheWxvYWQsXG4gICAgICAgICAgICAgIGZyb206IG0uZnJvbV9pZCxcbiAgICAgICAgICAgICAgdG86IG0udG9faWQhLFxuICAgICAgICAgICAgICBjb21taXRtZW50OiB0aGlzLmNoYWluQ29kZUNvbW1pdG1lbnQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHAycFJldHVybjtcbiAgICAgICAgICB9KSxcbiAgICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IG5leHRSb3VuZE1lc3NhZ2VzXG4gICAgICAgICAgLmZpbHRlcigobSkgPT4gbS50b19pZCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgIC5tYXAoKG0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJyb2FkY2FzdFJldHVybiA9IHtcbiAgICAgICAgICAgICAgcGF5bG9hZDogbS5wYXlsb2FkLFxuICAgICAgICAgICAgICBmcm9tOiBtLmZyb21faWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGJyb2FkY2FzdFJldHVybjtcbiAgICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgYEVycm9yIHdoaWxlIGNyZWF0aW5nIG1lc3NhZ2VzIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fSwgcm91bmQgJHt0aGlzLmRrZ1N0YXRlfTogJHtlfWA7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG5leHRSb3VuZE1lc3NhZ2VzLmZvckVhY2goKG0pID0+IG0uZnJlZSgpKTtcbiAgICAgIC8vIFNlc3Npb24gaXMgZnJlZWQgd2hlbiBrZXlzaGFyZSBpcyBjYWxsZWQuXG4gICAgICBpZiAodGhpcy5ka2dTdGF0ZSAhPT0gRGtnU3RhdGUuQ29tcGxldGUpIHtcbiAgICAgICAgdGhpcy5ka2dTZXNzaW9uQnl0ZXMgPSB0aGlzLmRrZ1Nlc3Npb24udG9CeXRlcygpO1xuICAgICAgICB0aGlzLmRrZ1Nlc3Npb24gPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXh0Um91bmREZXNlcmlhbGl6ZWRNZXNzYWdlcztcbiAgfVxufVxuIl19
@@ -0,0 +1,30 @@
1
+ /// <reference types="node" />
2
+ import { SignSession, Keyshare } from '@silencelaboratories/dkls-wasm-ll-node';
3
+ import { DeserializedBroadcastMessage, DeserializedMessages, DklsSignature, DsgState } from './types';
4
+ export declare class Dsg {
5
+ protected dsgSession: SignSession | undefined;
6
+ protected dsgSessionBytes: Uint8Array;
7
+ private _signature;
8
+ protected keyShare: Keyshare;
9
+ protected messageHash: Buffer;
10
+ protected derivationPath: string;
11
+ protected partyIdx: number;
12
+ protected dsgState: DsgState;
13
+ constructor(keyShare: Buffer, partyIdx: number, derivationPath: string, messageHash: Buffer);
14
+ private _restoreSession;
15
+ private _deserializeState;
16
+ init(): Promise<DeserializedBroadcastMessage>;
17
+ get signature(): DklsSignature;
18
+ /**
19
+ * Ends the DSG session by freeing any heap allocations from wasm. Note that the session is freed if a signature is produced.
20
+ */
21
+ endSession(): void;
22
+ /**
23
+ * Proccesses incoming messages to this party in the DKLs DSG protocol and
24
+ * produces messages from this party to other parties for the next round.
25
+ * @param messagesForIthRound - messages to process the current round
26
+ * @returns {DeserializedMessages} - messages to send to other parties for the next round
27
+ */
28
+ handleIncomingMessages(messagesForIthRound: DeserializedMessages): DeserializedMessages;
29
+ }
30
+ //# sourceMappingURL=dsg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsg.d.ts","sourceRoot":"","sources":["../../../../src/tss/ecdsa-dkls/dsg.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAW,MAAM,wCAAwC,CAAC;AACxF,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGtG,qBAAa,GAAG;IACd,SAAS,CAAC,UAAU,EAAE,WAAW,GAAG,SAAS,CAAC;IAC9C,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC;IACtC,OAAO,CAAC,UAAU,CAA4B;IAC9C,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC7B,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC;IACjC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAA0B;gBAE1C,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAU3F,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,iBAAiB;IAwBnB,IAAI,IAAI,OAAO,CAAC,4BAA4B,CAAC;IAqBnD,IAAI,SAAS,IAAI,aAAa,CAK7B;IAED;;OAEG;IACH,UAAU,IAAI,IAAI;IASlB;;;;;OAKG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;CA6ExF"}