@bitpay-labs/bitcore-wallet-service 11.10.14 → 11.11.0
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.
- package/package.json +5 -5
- package/src/lib/common/constants.ts +1 -1
- package/src/lib/errors/errordefinitions.ts +8 -0
- package/src/lib/model/tsskeygen.ts +12 -4
- package/src/lib/routes/middleware/authRequest.ts +6 -16
- package/src/lib/routes/middleware/authTssRequest.ts +130 -26
- package/src/lib/routes/tss.ts +21 -8
- package/src/lib/routes/wallets.ts +8 -9
- package/src/lib/server.ts +9 -17
- package/src/lib/storage.ts +55 -22
- package/src/lib/tss.ts +77 -1
- package/test/integration/tss.test.ts +706 -371
- package/test/storage.test.ts +6 -7
- package/ts_build/package.json +4 -4
- package/ts_build/src/lib/common/constants.d.ts +1 -1
- package/ts_build/src/lib/common/constants.js +1 -1
- package/ts_build/src/lib/common/index.d.ts +1 -1
- package/ts_build/src/lib/errors/errordefinitions.d.ts +4 -0
- package/ts_build/src/lib/errors/errordefinitions.d.ts.map +1 -1
- package/ts_build/src/lib/errors/errordefinitions.js +4 -0
- package/ts_build/src/lib/errors/errordefinitions.js.map +1 -1
- package/ts_build/src/lib/model/tsskeygen.d.ts +2 -0
- package/ts_build/src/lib/model/tsskeygen.d.ts.map +1 -1
- package/ts_build/src/lib/model/tsskeygen.js +6 -2
- package/ts_build/src/lib/model/tsskeygen.js.map +1 -1
- package/ts_build/src/lib/routes/middleware/authRequest.d.ts.map +1 -1
- package/ts_build/src/lib/routes/middleware/authRequest.js +6 -16
- package/ts_build/src/lib/routes/middleware/authRequest.js.map +1 -1
- package/ts_build/src/lib/routes/middleware/authTssRequest.d.ts +2 -1
- package/ts_build/src/lib/routes/middleware/authTssRequest.d.ts.map +1 -1
- package/ts_build/src/lib/routes/middleware/authTssRequest.js +104 -24
- package/ts_build/src/lib/routes/middleware/authTssRequest.js.map +1 -1
- package/ts_build/src/lib/routes/tss.d.ts.map +1 -1
- package/ts_build/src/lib/routes/tss.js +19 -7
- package/ts_build/src/lib/routes/tss.js.map +1 -1
- package/ts_build/src/lib/routes/wallets.d.ts.map +1 -1
- package/ts_build/src/lib/routes/wallets.js +8 -9
- package/ts_build/src/lib/routes/wallets.js.map +1 -1
- package/ts_build/src/lib/server.d.ts.map +1 -1
- package/ts_build/src/lib/server.js +8 -18
- package/ts_build/src/lib/server.js.map +1 -1
- package/ts_build/src/lib/storage.d.ts +9 -2
- package/ts_build/src/lib/storage.d.ts.map +1 -1
- package/ts_build/src/lib/storage.js +51 -20
- package/ts_build/src/lib/storage.js.map +1 -1
- package/ts_build/src/lib/tss.d.ts +8 -0
- package/ts_build/src/lib/tss.d.ts.map +1 -1
- package/ts_build/src/lib/tss.js +59 -1
- package/ts_build/src/lib/tss.js.map +1 -1
- package/ts_build/test/integration/tss.test.d.ts.map +1 -1
- package/ts_build/test/integration/tss.test.js +599 -357
- package/ts_build/test/integration/tss.test.js.map +1 -1
- package/ts_build/test/storage.test.js +6 -7
- package/ts_build/test/storage.test.js.map +1 -1
package/src/lib/tss.ts
CHANGED
|
@@ -155,6 +155,57 @@ class TssKeyGenClass {
|
|
|
155
155
|
return session;
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
+
async registerParty(params: {
|
|
159
|
+
/** Session ID */
|
|
160
|
+
id: string;
|
|
161
|
+
/** Copayer ID of the requesting party */
|
|
162
|
+
copayerId: string;
|
|
163
|
+
/* Copayer data to register */
|
|
164
|
+
data: {
|
|
165
|
+
/** Party ID */
|
|
166
|
+
partyId: string | number;
|
|
167
|
+
/** Public key/Copayer ID of the party */
|
|
168
|
+
partyPubKey: string;
|
|
169
|
+
};
|
|
170
|
+
}) {
|
|
171
|
+
const { id, copayerId, data } = params;
|
|
172
|
+
|
|
173
|
+
const session = await this.getSessionForCopayer({ id, copayerId });
|
|
174
|
+
const reqPartyId = session.participants.indexOf(copayerId);
|
|
175
|
+
if (reqPartyId !== 0) {
|
|
176
|
+
throw Errors.TSS_NON_PARTICIPANT.withMessage('Only the first participant can register a party');
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (data.partyId == null || isNaN(data.partyId as number)) {
|
|
180
|
+
throw Errors.TSS_INVALID_PARTY_DATA.withMessage(`Invalid partyId: ${data.partyId}`);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const partyId = parseInt(data.partyId as string);
|
|
184
|
+
const pubKey = data.partyPubKey?.trim();
|
|
185
|
+
|
|
186
|
+
if (!(partyId > 0) || !pubKey || pubKey === copayerId || partyId >= session.n) {
|
|
187
|
+
throw Errors.TSS_INVALID_PARTY_DATA.withMessage(`Invalid data for party ${partyId} registration`);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
if (session.authPublicKeys.includes(pubKey)) {
|
|
191
|
+
if (session.authPublicKeys.indexOf(pubKey) === partyId) {
|
|
192
|
+
// Already registered at partyId -> return idempotently
|
|
193
|
+
return;
|
|
194
|
+
} else {
|
|
195
|
+
// Trying to re-register a party that is already registered under a different party ID
|
|
196
|
+
throw Errors.TSS_PARTY_ALREADY_REGISTERED;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Has party already submitted initial rounds message? (case when this is a re-register)
|
|
201
|
+
if (session.rounds?.[0]?.some(round => round.fromPartyId === partyId)) {
|
|
202
|
+
throw Errors.TSS_ROUNDS_ALREADY_STARTED.withMessage(`Party ${partyId} has already submitted an initial message. Cannot register a new party ${partyId}`);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const storage = WalletService.getStorage();
|
|
206
|
+
await storage.storeTssKeyGenAuthPublicKey({ id, partyId, authPublicKey: pubKey, __v: session.__v });
|
|
207
|
+
}
|
|
208
|
+
|
|
158
209
|
/**
|
|
159
210
|
* Get messages for a given party in a TSS keygen session.
|
|
160
211
|
* Only returns messages if all other parties have sent their messages for the round.
|
|
@@ -279,10 +330,29 @@ class TssKeyGenClass {
|
|
|
279
330
|
|
|
280
331
|
|
|
281
332
|
if (!session.participants[message.partyId]) {
|
|
333
|
+
if (session.participants.includes(copayerId)) {
|
|
334
|
+
throw Errors.TSS_PARTY_ALREADY_REGISTERED;
|
|
335
|
+
}
|
|
282
336
|
if (!this._checkPassword({ session, password })) {
|
|
283
337
|
throw Errors.TSS_INVALID_PASSWORD;
|
|
284
338
|
}
|
|
285
|
-
|
|
339
|
+
// Sanity check for the public key of the participant in the session
|
|
340
|
+
// session.authPublicKeys was not added until version 1.2
|
|
341
|
+
if (session.schemeVersion >= 1.2 && session.authPublicKeys[message.partyId] !== message.publicKey) {
|
|
342
|
+
throw Errors.NOT_AUTHORIZED;
|
|
343
|
+
}
|
|
344
|
+
try {
|
|
345
|
+
await storage.storeTssKeyGenParticipant({ id, partyId: message.partyId, copayerId, __v: session.__v });
|
|
346
|
+
} catch (e) {
|
|
347
|
+
if (e?.message?.startsWith('MONGO_DOC_OUTDATED')) {
|
|
348
|
+
return this.processMessage(params);
|
|
349
|
+
} else if (e?.message?.startsWith('MONGO_DOC_NOT_FOUND')) {
|
|
350
|
+
throw Errors.TSS_SESSION_NOT_FOUND;
|
|
351
|
+
}
|
|
352
|
+
throw e;
|
|
353
|
+
}
|
|
354
|
+
} else if (session.participants[message.partyId] !== copayerId) {
|
|
355
|
+
throw Errors.TSS_NON_PARTICIPANT.withMessage('Incorrect copayerId for this partyId');
|
|
286
356
|
}
|
|
287
357
|
|
|
288
358
|
let result = false;
|
|
@@ -427,6 +497,8 @@ class TssKeyGenClass {
|
|
|
427
497
|
} catch (e) {
|
|
428
498
|
if (e?.message?.startsWith('MONGO_DOC_OUTDATED')) {
|
|
429
499
|
return false;
|
|
500
|
+
} else if (e?.message?.startsWith('MONGO_DOC_NOT_FOUND')) {
|
|
501
|
+
throw Errors.TSS_SESSION_NOT_FOUND;
|
|
430
502
|
}
|
|
431
503
|
throw e;
|
|
432
504
|
}
|
|
@@ -694,6 +766,8 @@ class TssSignClass {
|
|
|
694
766
|
} catch (e) {
|
|
695
767
|
if (e?.message?.startsWith('MONGO_DOC_OUTDATED')) {
|
|
696
768
|
return this.processMessage(params);
|
|
769
|
+
} else if (e?.message?.startsWith('MONGO_DOC_NOT_FOUND')) {
|
|
770
|
+
throw Errors.TSS_SESSION_NOT_FOUND;
|
|
697
771
|
}
|
|
698
772
|
throw e;
|
|
699
773
|
}
|
|
@@ -814,6 +888,8 @@ class TssSignClass {
|
|
|
814
888
|
} catch (e) {
|
|
815
889
|
if (e?.message?.startsWith('MONGO_DOC_OUTDATED')) {
|
|
816
890
|
return false;
|
|
891
|
+
} else if (e?.message?.startsWith('MONGO_DOC_NOT_FOUND')) {
|
|
892
|
+
throw Errors.TSS_SESSION_NOT_FOUND;
|
|
817
893
|
}
|
|
818
894
|
throw e;
|
|
819
895
|
}
|