From 71b343f238fdabf2e72ed3911ad2d83f3656149f Mon Sep 17 00:00:00 2001 From: ieow Date: Tue, 9 May 2023 17:29:31 +0800 Subject: [PATCH 01/12] feat: move tss to different file --- packages/default/test/shared.js | 650 ----------------- packages/default/test/tssShared.js | 672 ++++++++++++++++++ .../default/test/tssTorusSPManualSync.test.js | 4 + 3 files changed, 676 insertions(+), 650 deletions(-) create mode 100644 packages/default/test/tssShared.js diff --git a/packages/default/test/shared.js b/packages/default/test/shared.js index 3859729b..d7144c6d 100644 --- a/packages/default/test/shared.js +++ b/packages/default/test/shared.js @@ -65,657 +65,7 @@ function compareReconstructedKeys(a, b, message) { export const sharedTestCases = (mode, torusSP, storageLayer) => { const customSP = torusSP; const customSL = storageLayer; - describe("TSS tests", function () { - it("#should be able to refresh tss shares", async function () { - const sp = customSP; - if (!sp.useTSS) this.skip(); - - const deviceTSSShare = new BN(generatePrivate()); - const deviceTSSIndex = 2; - - sp.verifierName = "torus-test-health"; - sp.verifierId = "test19@example.com"; - const testId = sp.getVerifierNameVerifierId(); - const { signatures, postboxkey } = await fetchPostboxKeyAndSigs({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - }); - sp.postboxKey = postboxkey; - const { serverDKGPrivKeys } = await assignTssDkgKeys({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - maxTSSNonceToSimulate: 2, - }); - const storageLayer = initStorageLayer({ hostUrl: metadataURL }); - const tb1 = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); - - // factor key needs to passed from outside of tKey - const factorKey = new BN(generatePrivate()); - const factorPub = getPubKeyPoint(factorKey); - - await tb1.initialize({ useTSS: true, factorPub, deviceTSSShare, deviceTSSIndex }); - const newShare = await tb1.generateNewShare(); - const reconstructedKey = await tb1.reconstructKey(); - await tb1.syncLocalMetadataTransitions(); - if (tb1.privKey.cmp(reconstructedKey.privKey) !== 0) { - fail("key should be able to be reconstructed"); - } - - const tb2 = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); - await tb2.initialize({ useTSS: true, factorPub }); - tb2.inputShareStore(newShare.newShareStores[newShare.newShareIndex.toString("hex")]); - await tb2.reconstructKey(); - const { tssShare: retrievedTSS, tssIndex: retrievedTSSIndex } = await tb2.getTSSShare(factorKey); - const tssCommits = tb2.getTSSCommits(); - const tssPrivKey = getLagrangeCoeffs([1, retrievedTSSIndex], 1) - .mul(serverDKGPrivKeys[0]) - .add(getLagrangeCoeffs([1, retrievedTSSIndex], retrievedTSSIndex).mul(retrievedTSS)) - .umod(ecCurve.n); - - const tssPubKey = getPubKeyPoint(tssPrivKey); - strictEqual(tssPubKey.x.toString(16, 64), tssCommits[0].x.toString(16, 64)); - strictEqual(tssPubKey.y.toString(16, 64), tssCommits[0].y.toString(16, 64)); - - // // test tss refresh - - const factorKey2 = new BN(generatePrivate()); - const factorPub2 = getPubKeyPoint(factorKey2); - - const factorPubs = [factorPub, factorPub2]; - const { serverEndpoints, serverPubKeys } = await sp.getRSSNodeDetails(); - await tb2._refreshTSSShares(true, retrievedTSS, retrievedTSSIndex, factorPubs, [2, 3], testId, { - serverThreshold: 3, - selectedServers: [1, 2, 3], - serverEndpoints, - serverPubKeys, - authSignatures: signatures, - }); - - { - const { tssShare: newTSS2, tssIndex } = await tb2.getTSSShare(factorKey); - const newTSSPrivKey = getLagrangeCoeffs([1, 2], 1) - .mul(new BN(serverDKGPrivKeys[1], "hex")) - .add(getLagrangeCoeffs([1, 2], 2).mul(newTSS2)) - .umod(ecCurve.n); - strictEqual(tssPrivKey.toString(16, 64), newTSSPrivKey.toString(16, 64)); - // eslint-disable-next-line no-console - console.log("newTSS2", newTSS2.toString("hex"), tssIndex); - } - - { - const { tssShare: newTSS2, tssIndex } = await tb2.getTSSShare(factorKey2); - const newTSSPrivKey = getLagrangeCoeffs([1, 3], 1) - .mul(new BN(serverDKGPrivKeys[1], "hex")) - .add(getLagrangeCoeffs([1, 3], 3).mul(newTSS2)) - .umod(ecCurve.n); - strictEqual(tssPrivKey.toString(16, 64), newTSSPrivKey.toString(16, 64)); - // eslint-disable-next-line no-console - console.log("newTSS2", newTSS2.toString("hex"), tssIndex); - } - }); - it("#should be able to reconstruct tssShare from factor key (tss2) when initializing a key with useTSS true", async function () { - const sp = customSP; - if (!sp.useTSS) this.skip(); - - const deviceTSSShare = new BN(generatePrivate()); - const deviceTSSIndex = 3; - - sp.verifierName = "torus-test-health"; - sp.verifierId = "test@example.com"; - const { postboxkey } = await fetchPostboxKeyAndSigs({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - }); - sp.postboxKey = postboxkey; - - const storageLayer = initStorageLayer({ hostUrl: metadataURL }); - const tb1 = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); - - // factor key needs to passed from outside of tKey - const factorKey = new BN(generatePrivate()); - const factorPub = getPubKeyPoint(factorKey); - - await tb1.initialize({ useTSS: true, factorPub, deviceTSSShare, deviceTSSIndex }); - const reconstructedKey = await tb1.reconstructKey(); - await tb1.syncLocalMetadataTransitions(); - if (tb1.privKey.cmp(reconstructedKey.privKey) !== 0) { - fail("key should be able to be reconstructed"); - } - const { tssShare: tss2 } = await tb1.getTSSShare(factorKey); - - const tssCommits = tb1.getTSSCommits(); - const tss2Pub = ecCurve.g.mul(tss2); - const tssCommitA0 = ecCurve.keyFromPublic({ x: tssCommits[0].x.toString(16, 64), y: tssCommits[0].y.toString(16, 64) }).getPublic(); - const tssCommitA1 = ecCurve.keyFromPublic({ x: tssCommits[1].x.toString(16, 64), y: tssCommits[1].y.toString(16, 64) }).getPublic(); - const _tss2Pub = - deviceTSSIndex === 2 ? tssCommitA0.add(tssCommitA1).add(tssCommitA1) : tssCommitA0.add(tssCommitA1).add(tssCommitA1).add(tssCommitA1); - strictEqual(tss2Pub.x.toString(16, 64), _tss2Pub.x.toString(16, 64)); - strictEqual(tss2Pub.y.toString(16, 64), _tss2Pub.y.toString(16, 64)); - }); - it("#should be able to reconstruct tss key from factor key (tss2) when initializing a key with useTSS true", async function () { - const sp = customSP; - - if (!sp.useTSS) this.skip(); - - sp.verifierName = "torus-test-health"; - sp.verifierId = "test18@example.com"; - const { serverDKGPrivKeys } = await assignTssDkgKeys({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - maxTSSNonceToSimulate: 2, - }); - - const tss1 = new BN(serverDKGPrivKeys[0], "hex"); - const deviceTSSShare = new BN(generatePrivate()); - const deviceTSSIndex = 2; - const { postboxkey } = await fetchPostboxKeyAndSigs({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - }); - sp.postboxKey = postboxkey; - const storageLayer = initStorageLayer({ hostUrl: metadataURL }); - const tb1 = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); - - // factor key needs to passed from outside of tKey - const factorKey = new BN(generatePrivate()); - const factorPub = getPubKeyPoint(factorKey); - - await tb1.initialize({ useTSS: true, factorPub, deviceTSSShare, deviceTSSIndex }); - const reconstructedKey = await tb1.reconstructKey(); - await tb1.syncLocalMetadataTransitions(); - if (tb1.privKey.cmp(reconstructedKey.privKey) !== 0) { - fail("key should be able to be reconstructed"); - } - - const { tssShare: tss2 } = await tb1.getTSSShare(factorKey); - const tssCommits = tb1.getTSSCommits(); - - const tssPrivKey = getLagrangeCoeffs([1, deviceTSSIndex], 1) - .mul(tss1) - .add(getLagrangeCoeffs([1, deviceTSSIndex], deviceTSSIndex).mul(tss2)) - .umod(ecCurve.n); - - const tssPubKey = getPubKeyPoint(tssPrivKey); - strictEqual(tssPubKey.x.toString(16, 64), tssCommits[0].x.toString(16, 64)); - strictEqual(tssPubKey.y.toString(16, 64), tssCommits[0].y.toString(16, 64)); - }); - it("#should be able to serialize and deserialize with tss even with rss", async function () { - const sp = customSP; - if (!sp.useTSS) this.skip(); - - const deviceTSSShare = new BN(generatePrivate()); - const deviceTSSIndex = 3; - - sp.verifierName = "torus-test-health"; - sp.verifierId = "test18@example.com"; - const { signatures, postboxkey } = await fetchPostboxKeyAndSigs({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - }); - - const testId = sp.getVerifierNameVerifierId(); - - sp.postboxKey = postboxkey; - const { serverDKGPrivKeys } = await assignTssDkgKeys({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - maxTSSNonceToSimulate: 2, - }); - const storageLayer = initStorageLayer({ hostUrl: metadataURL }); - const tb1 = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); - - // factor key needs to passed from outside of tKey - const factorKey = new BN(generatePrivate()); - const factorPub = getPubKeyPoint(factorKey); - - await tb1.initialize({ useTSS: true, factorPub, deviceTSSShare, deviceTSSIndex }); - const reconstructedKey = await tb1.reconstructKey(); - await tb1.syncLocalMetadataTransitions(); - if (tb1.privKey.cmp(reconstructedKey.privKey) !== 0) { - fail("key should be able to be reconstructed"); - } - - const { tssShare: retrievedTSS, tssIndex: retrievedTSSIndex } = await tb1.getTSSShare(factorKey); - const tssCommits = tb1.getTSSCommits(); - - const tssPrivKey = getLagrangeCoeffs([1, retrievedTSSIndex], 1) - .mul(serverDKGPrivKeys[0]) - .add(getLagrangeCoeffs([1, retrievedTSSIndex], retrievedTSSIndex).mul(retrievedTSS)) - .umod(ecCurve.n); - - const tssPubKey = getPubKeyPoint(tssPrivKey); - strictEqual(tssPubKey.x.toString(16, 64), tssCommits[0].x.toString(16, 64)); - strictEqual(tssPubKey.y.toString(16, 64), tssCommits[0].y.toString(16, 64)); - // test tss refresh - - const factorKey2 = new BN(generatePrivate()); - const factorPub2 = getPubKeyPoint(factorKey2); - - const factorPubs = [factorPub, factorPub2]; - const { serverEndpoints, serverPubKeys } = await sp.getRSSNodeDetails(); - - await tb1._refreshTSSShares(true, retrievedTSS, retrievedTSSIndex, factorPubs, [2, 3], testId, { - serverThreshold: 3, - selectedServers: [1, 2, 3], - serverEndpoints, - serverPubKeys, - }); - - { - const { tssShare: newTSS2 } = await tb1.getTSSShare(factorKey); - const newTSSPrivKey = getLagrangeCoeffs([1, 2], 1) - .mul(new BN(serverDKGPrivKeys[1], "hex")) - .add(getLagrangeCoeffs([1, 2], 2).mul(newTSS2)) - .umod(ecCurve.n); - strictEqual(tssPrivKey.toString(16, 64), newTSSPrivKey.toString(16, 64)); - } - - { - const { tssShare: newTSS2 } = await tb1.getTSSShare(factorKey2); - const newTSSPrivKey = getLagrangeCoeffs([1, 3], 1) - .mul(new BN(serverDKGPrivKeys[1], "hex")) - .add(getLagrangeCoeffs([1, 3], 3).mul(newTSS2)) - .umod(ecCurve.n); - strictEqual(tssPrivKey.toString(16, 64), newTSSPrivKey.toString(16, 64)); - } - - const serialized = stringify(tb1); - - const deserialized = await ThresholdKey.fromJSON(JSON.parse(serialized), { serviceProvider: sp, storageLayer, manualSync: mode }); - const serialized2 = stringify(deserialized); - - strictEqual(serialized, serialized2); - - const tb2 = await ThresholdKey.fromJSON(JSON.parse(serialized2), { serviceProvider: sp, storageLayer, manualSync: mode }); - { - const { tssShare: newTSS2 } = await tb2.getTSSShare(factorKey); - const newTSSPrivKey = getLagrangeCoeffs([1, 2], 1) - .mul(new BN(serverDKGPrivKeys[1], "hex")) - .add(getLagrangeCoeffs([1, 2], 2).mul(newTSS2)) - .umod(ecCurve.n); - strictEqual(tssPrivKey.toString(16, 64), newTSSPrivKey.toString(16, 64)); - } - - { - const { tssShare: newTSS2 } = await tb2.getTSSShare(factorKey2); - const newTSSPrivKey = getLagrangeCoeffs([1, 3], 1) - .mul(new BN(serverDKGPrivKeys[1], "hex")) - .add(getLagrangeCoeffs([1, 3], 3).mul(newTSS2)) - .umod(ecCurve.n); - strictEqual(tssPrivKey.toString(16, 64), newTSSPrivKey.toString(16, 64)); - } - }); - describe("with tss, tkey share deletion", function () { - let deletedShareIndex; - let shareStoreAfterDelete; - let tb; - let tbTssInitResp; - let oldFactorKey; - let newFactorKey; - before(`#should be able to generate and delete a share, manualSync=${mode}`, async function () { - const sp = customSP; - - if (!sp.useTSS) this.skip(); - const deviceTSSShare = new BN(generatePrivate()); - const deviceTSSIndex = 3; - - sp.verifierName = "torus-test-health"; - sp.verifierId = "test192@example.com"; - const { signatures, postboxkey } = await fetchPostboxKeyAndSigs({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - }); - sp.postboxKey = postboxkey; - const { serverDKGPrivKeys } = await assignTssDkgKeys({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - maxTSSNonceToSimulate: 4, - }); - - // tb = new ThresholdKey({ serviceProvider: sp, storageLayer: customSL, manualSync: mode }); - // tbInitResp = await tb._initializeNewKey({ initializeModules: true }); - // oldFactorKey = new BN(generatePrivate()); - // const oldFactorPub = getPubKeyPoint(oldFactorKey); - // tbTssInitResp = await tb._initializeNewTSSKey("default", deviceTSSShare, oldFactorPub, deviceTSSIndex); - // const { factorEncs, factorPubs, tssPolyCommits } = tbTssInitResp; - // tb.metadata.addTSSData({ tssTag: tb.tssTag, tssNonce: 0, tssPolyCommits, factorPubs, factorEncs }); - // // const { factorEncs, factorPubs, tssPolyCommits } = tbTssInitResp; - - tb = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); - - // factor key needs to passed from outside of tKey - const factorKey = new BN(generatePrivate()); - const factorPub = getPubKeyPoint(factorKey); - await tb.initialize({ useTSS: true, factorPub, deviceTSSShare, deviceTSSIndex }); - newFactorKey = new BN(generatePrivate()); - - const newFactorPub = getPubKeyPoint(newFactorKey); - const newShare = await tb.generateNewShare(true, { - inputTSSShare: deviceTSSShare, - inputTSSIndex: deviceTSSIndex, - newFactorPub, - newTSSIndex: 2, - authSignatures: signatures, - }); - const reconstructedKey = await tb.reconstructKey(); - await tb.syncLocalMetadataTransitions(); - - if (tb.privKey.cmp(reconstructedKey.privKey) !== 0) { - fail("key should be able to be reconstructed"); - } - const { tssShare: retrievedTSS, tssIndex: retrievedTSSIndex } = await tb.getTSSShare(factorKey); - const tssCommits = tb.getTSSCommits(); - const tssPrivKey = getLagrangeCoeffs([1, retrievedTSSIndex], 1) - .mul(serverDKGPrivKeys[1]) - .add(getLagrangeCoeffs([1, retrievedTSSIndex], retrievedTSSIndex).mul(retrievedTSS)) - .umod(ecCurve.n); - const tssPubKey = getPubKeyPoint(tssPrivKey); - - strictEqual(tssPubKey.x.toString(16, 64), tssCommits[0].x.toString(16, 64)); - strictEqual(tssPubKey.y.toString(16, 64), tssCommits[0].y.toString(16, 64)); - const updatedShareStore = await tb.deleteShare(newShare.newShareIndex, true, { - inputTSSIndex: retrievedTSSIndex, - inputTSSShare: retrievedTSS, - authSignatures: signatures, - factorPub, - }); - - deletedShareIndex = newShare.newShareIndex; - shareStoreAfterDelete = updatedShareStore.newShareStores; - - await tb.syncLocalMetadataTransitions(); - }); - it(`#should be not be able to lookup delete share, manualSync=${mode}`, async function () { - if (!customSP.useTSS) this.skip(); - const newKeys = Object.keys(shareStoreAfterDelete); - if (newKeys.find((el) => el === deletedShareIndex.toString("hex"))) { - fail("Unable to delete share index"); - } - rejects(async () => { - await tb.getTSSShare(oldFactorKey); - }); - await tb.getTSSShare(newFactorKey); - }); - // it(`#should be able to delete a user and reset tss nonce, manualSync=${mode}`, async function () { - // if (!customSP.useTSS) this.skip(); - // // create 2/4 - // await tb._initializeNewKey({ initializeModules: true }); - // await tb.generateNewShare(); - // const shareStoresAtEpoch2 = tb.getAllShareStoresForLatestPolynomial(); - - // await tb.generateNewShare(); - // await tb.syncLocalMetadataTransitions(); - // const sharesStoresAtEpoch3 = tb.getAllShareStoresForLatestPolynomial(); - // await tb.CRITICAL_deleteTkey(); - - // const spData = await customSL.getMetadata({ serviceProvider: customSP }); - // const data2 = await Promise.allSettled(shareStoresAtEpoch2.map((x) => tb.catchupToLatestShare({ shareStore: x }))); - // const data3 = await Promise.all(sharesStoresAtEpoch3.map((x) => customSL.getMetadata({ privKey: x.share.share }))); - - // deepStrictEqual(spData.message, KEY_NOT_FOUND); - - // data2.forEach((x) => { - // deepStrictEqual(x.status, "rejected"); - // deepStrictEqual(x.reason.code, 1308); - // }); - - // data3.forEach((x) => { - // deepStrictEqual(x.message, SHARE_DELETED); - // }); - - // // TODO: check that TSS nonce is reset - // }); - it(`#should be able to reinitialize after wipe, manualSync=${mode}`, async function () { - if (!customSP.useTSS) this.skip(); - // create 2/4 - const resp1 = await tb._initializeNewKey({ initializeModules: true }); - await tb.generateNewShare(); - if (mode) { - await tb.syncLocalMetadataTransitions(); - } - await tb.CRITICAL_deleteTkey(); - - const tb2 = new ThresholdKey({ serviceProvider: customSP, storageLayer: customSL, manualSync: mode }); - await tb2.initialize(); - await tb2.generateNewShare(); - if (mode) { - await tb2.syncLocalMetadataTransitions(); - } - - const data3 = await customSL.getMetadata({ serviceProvider: customSP }); - notEqual(data3.message, KEY_NOT_FOUND); - deepStrictEqual(tb2.metadata.nonce, 1); - - const reconstructedKey = await tb2.reconstructKey(); - if (resp1.privKey.cmp(reconstructedKey.privKey) === 0) { - fail("key should be different"); - } - // TODO: check that TSS is reset and still able to use TSS methods - }); - }); - describe("with tss, tkey serialization/deserialization", function () { - let tb; - beforeEach("Setup ThresholdKey", async function () { - if (!customSP.useTSS) this.skip(); - tb = new ThresholdKey({ serviceProvider: customSP, storageLayer: customSL, manualSync: mode }); - }); - it(`#should serialize and deserialize correctly without tkeyArgs, manualSync=${mode}`, async function () { - if (!customSP.useTSS) this.skip(); - const sp = customSP; - let userInput = new BN(keccak256("user answer blublu").slice(2), "hex"); - userInput = userInput.umod(ecCurve.curve.n); - const resp1 = await tb._initializeNewKey({ userInput, initializeModules: true }); - - sp.verifierName = "torus-test-health"; - sp.verifierId = "test18@example.com"; - const { postboxkey } = await fetchPostboxKeyAndSigs({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - }); - sp.postboxKey = postboxkey; - const { serverDKGPrivKeys } = await assignTssDkgKeys({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - maxTSSNonceToSimulate: 2, - }); - const deviceTSSShare = new BN(generatePrivate()); - const deviceTSSIndex = 2; - const factorKey = new BN(generatePrivate()); - const factorPub = getPubKeyPoint(factorKey); - const { factorEncs, factorPubs, tssPolyCommits } = await tb._initializeNewTSSKey("default", deviceTSSShare, factorPub, deviceTSSIndex); - tb.metadata.addTSSData({ tssTag: tb.tssTag, tssNonce: 0, tssPolyCommits, factorPubs, factorEncs }); - const { tssShare, tssIndex } = await tb.getTSSShare(factorKey); - - const tssPrivKey = getLagrangeCoeffs([1, tssIndex], 1) - .mul(serverDKGPrivKeys[0]) - .add(getLagrangeCoeffs([1, tssIndex], tssIndex).mul(tssShare)) - .umod(ecCurve.n); - - const newFactorKey = new BN(generatePrivate()); - const newFactorPub = getPubKeyPoint(newFactorKey); - - await tb.generateNewShare(true, { - inputTSSShare: tssShare, - inputTSSIndex: tssIndex, - newFactorPub, - newTSSIndex: 3, - }); - await tb.syncLocalMetadataTransitions(); - - const stringified = JSON.stringify(tb); - const tb3 = await ThresholdKey.fromJSON(JSON.parse(stringified)); - const finalKey = await tb3.reconstructKey(); - strictEqual(finalKey.privKey.toString("hex"), resp1.privKey.toString("hex"), "Incorrect serialization"); - - const { tssShare: tssShare2, tssIndex: tssIndex2 } = await tb3.getTSSShare(newFactorKey); - const tssPrivKey2 = getLagrangeCoeffs([1, tssIndex2], 1) - .mul(serverDKGPrivKeys[1]) - .add(getLagrangeCoeffs([1, tssIndex2], tssIndex2).mul(tssShare2)) - .umod(ecCurve.n); - strictEqual(tssPrivKey.toString("hex"), tssPrivKey2.toString("hex"), "Incorrect tss key"); - }); - it(`#should serialize and deserialize correctly with tkeyArgs, manualSync=${mode}`, async function () { - if (!customSP.useTSS) this.skip(); - let userInput = new BN(keccak256("user answer blublu").slice(2), "hex"); - userInput = userInput.umod(ecCurve.curve.n); - const resp1 = await tb._initializeNewKey({ userInput, initializeModules: true }); - - const sp = customSP; - sp.verifierName = "torus-test-health"; - sp.verifierId = "test18@example.com"; - const { postboxkey } = await fetchPostboxKeyAndSigs({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - }); - sp.postboxKey = postboxkey; - const { serverDKGPrivKeys } = await assignTssDkgKeys({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - maxTSSNonceToSimulate: 2, - }); - const deviceTSSShare = new BN(generatePrivate()); - const deviceTSSIndex = 2; - const factorKey = new BN(generatePrivate()); - const factorPub = getPubKeyPoint(factorKey); - const { factorEncs, factorPubs, tssPolyCommits } = await tb._initializeNewTSSKey("default", deviceTSSShare, factorPub, deviceTSSIndex); - tb.metadata.addTSSData({ tssTag: tb.tssTag, tssNonce: 0, tssPolyCommits, factorPubs, factorEncs }); - const { tssShare, tssIndex } = await tb.getTSSShare(factorKey); - const tssPrivKey = getLagrangeCoeffs([1, tssIndex], 1) - .mul(serverDKGPrivKeys[0]) - .add(getLagrangeCoeffs([1, tssIndex], tssIndex).mul(tssShare)) - .umod(ecCurve.n); - - const newFactorKey = new BN(generatePrivate()); - const newFactorPub = getPubKeyPoint(newFactorKey); - - await tb.generateNewShare(true, { - inputTSSShare: tssShare, - inputTSSIndex: tssIndex, - newFactorPub, - newTSSIndex: 3, - }); - - await tb.syncLocalMetadataTransitions(); - - const stringified = JSON.stringify(tb); - const tb3 = await ThresholdKey.fromJSON(JSON.parse(stringified), { serviceProvider: customSP, storageLayer: customSL }); - const finalKey = await tb3.reconstructKey(); - strictEqual(finalKey.privKey.toString("hex"), resp1.privKey.toString("hex"), "Incorrect serialization"); - - const { tssShare: tssShare2, tssIndex: tssIndex2 } = await tb3.getTSSShare(newFactorKey); - const tssPrivKey2 = getLagrangeCoeffs([1, tssIndex2], 1) - .mul(serverDKGPrivKeys[1]) - .add(getLagrangeCoeffs([1, tssIndex2], tssIndex2).mul(tssShare2)) - .umod(ecCurve.n); - strictEqual(tssPrivKey.toString("hex"), tssPrivKey2.toString("hex"), "Incorrect tss key"); - }); - // TODO: add test for initialize such that initialize throws if the remote metadata is already there - it(`#should serialize and deserialize correctly, keeping localTransitions consistent before syncing NewKeyAssign, manualSync=${mode}`, async function () { - if (!customSP.useTSS) this.skip(); - - const sp = customSP; - sp.verifierName = "torus-test-health"; - sp.verifierId = "test18@example.com"; - const { postboxkey } = await fetchPostboxKeyAndSigs({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - }); - sp.postboxKey = postboxkey; - await assignTssDkgKeys({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - maxTSSNonceToSimulate: 2, - }); - - let userInput = new BN(keccak256("user answer blublu").slice(2), "hex"); - userInput = userInput.umod(ecCurve.curve.n); - const resp1 = await tb._initializeNewKey({ userInput, initializeModules: true }); - - // generate and delete - const { newShareIndex: shareIndex1 } = await tb.generateNewShare(); - await tb.deleteShare(shareIndex1); - - const { newShareStores: shareStores, newShareIndex: shareIndex } = await tb.generateNewShare(); - - const stringified = JSON.stringify(tb); - const tb2 = await ThresholdKey.fromJSON(JSON.parse(stringified), { serviceProvider: sp, storageLayer: customSL }); - if (tb2.manualSync !== mode) { - fail(`manualSync should be ${mode}`); - } - const finalKey = await tb2.reconstructKey(); - const shareToVerify = tb2.outputShareStore(shareIndex); - // TODO: tb2.generateNewShare() - strictEqual(shareStores[shareIndex.toString("hex")].share.share.toString("hex"), shareToVerify.share.share.toString("hex")); - await tb2.syncLocalMetadataTransitions(); - strictEqual(finalKey.privKey.toString("hex"), resp1.privKey.toString("hex"), "Incorrect serialization"); - - const reconstructedKey2 = await tb2.reconstructKey(); - if (resp1.privKey.cmp(reconstructedKey2.privKey) !== 0) { - fail("key should be able to be reconstructed"); - } - }); - it(`#should serialize and deserialize correctly keeping localTransitions afterNewKeyAssign, manualSync=${mode}`, async function () { - if (!customSP.useTSS) this.skip(); - let userInput = new BN(keccak256("user answer blublu").slice(2), "hex"); - userInput = userInput.umod(ecCurve.curve.n); - const resp1 = await tb._initializeNewKey({ userInput, initializeModules: true }); - // TODO: tss initialize - await tb.syncLocalMetadataTransitions(); - const reconstructedKey = await tb.reconstructKey(); - // TODO: reconstruct tss key - const { newShareStores: shareStores, newShareIndex: shareIndex } = await tb.generateNewShare(); - - const stringified = JSON.stringify(tb); - const tb2 = await ThresholdKey.fromJSON(JSON.parse(stringified), { serviceProvider: customSP, storageLayer: customSL }); - const finalKey = await tb2.reconstructKey(); - // TODO: reconstruct tss key - const shareToVerify = tb2.outputShareStore(shareIndex); - strictEqual(shareStores[shareIndex.toString("hex")].share.share.toString("hex"), shareToVerify.share.share.toString("hex")); - await tb2.syncLocalMetadataTransitions(); - strictEqual(finalKey.privKey.toString("hex"), reconstructedKey.privKey.toString("hex"), "Incorrect serialization"); - // TODO: both tss keys should be the same - - const reconstructedKey2 = await tb2.reconstructKey(); - if (resp1.privKey.cmp(reconstructedKey2.privKey) !== 0) { - fail("key should be able to be reconstructed"); - } - }); - it(`#should not be able to updateSDK with newKeyAssign transitions unsynced, manualSync=${mode}`, async function () { - await tb._initializeNewKey({ initializeModules: true }); - // TODO: initialize new tss key - const stringified = JSON.stringify(tb); - const tb2 = await ThresholdKey.fromJSON(JSON.parse(stringified), {}); - - if (mode) { - // Can't updateSDK, please do key assign. - await rejects(async function () { - await tb2.updateSDK(); // TODO: does this need params? update function to handle TSS in tb.initialize core.ts:1130 - }, Error); - } - // create new key because the state might have changed after updateSDK() - const tb3 = await ThresholdKey.fromJSON(JSON.parse(stringified), {}); - await tb3.generateNewShare(); - await tb3.syncLocalMetadataTransitions(); - await tb3.updateSDK(); - }); - }); - }); describe("tkey", function () { let tb; beforeEach("Setup ThresholdKey", async function () { diff --git a/packages/default/test/tssShared.js b/packages/default/test/tssShared.js new file mode 100644 index 00000000..4cbaabdd --- /dev/null +++ b/packages/default/test/tssShared.js @@ -0,0 +1,672 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ + +/* eslint-disable import/no-extraneous-dependencies */ + +import { ecCurve, getPubKeyPoint, KEY_NOT_FOUND, SHARE_DELETED } from "@tkey/common-types"; +import { generatePrivate } from "@toruslabs/eccrypto"; +import { getLagrangeCoeffs } from "@toruslabs/rss-client"; +import { deepEqual, deepStrictEqual, equal, fail, notEqual, notStrictEqual, rejects, strict, strictEqual, throws } from "assert"; +import BN from "bn.js"; +import stringify from "json-stable-stringify"; +import { keccak256 } from "web3-utils"; + +import ThresholdKey from "../src/index"; +import { assignTssDkgKeys, fetchPostboxKeyAndSigs, getMetadataUrl, getServiceProvider, initStorageLayer, isMocked, setupTSSMocks } from "./helpers"; +const metadataURL = getMetadataUrl(); + +// eslint-disable-next-line mocha/no-exports +export const tssSharedTests = (mode, torusSP, storageLayer) => { + const customSP = torusSP; + const customSL = storageLayer; + describe.only("TSS tests", function () { + it("#should be able to refresh tss shares", async function () { + const sp = customSP; + if (!sp.useTSS) this.skip(); + + const deviceTSSShare = new BN(generatePrivate()); + const deviceTSSIndex = 2; + + sp.verifierName = "torus-test-health"; + sp.verifierId = "test19@example.com"; + const testId = sp.getVerifierNameVerifierId(); + const { signatures, postboxkey } = await fetchPostboxKeyAndSigs({ + serviceProvider: sp, + verifierName: sp.verifierName, + verifierId: sp.verifierId, + }); + sp.postboxKey = postboxkey; + const { serverDKGPrivKeys } = await assignTssDkgKeys({ + serviceProvider: sp, + verifierName: sp.verifierName, + verifierId: sp.verifierId, + maxTSSNonceToSimulate: 2, + }); + // const storageLayer = initStorageLayer({ hostUrl: metadataURL }); + const tb1 = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); + + // factor key needs to passed from outside of tKey + const factorKey = new BN(generatePrivate()); + const factorPub = getPubKeyPoint(factorKey); + + await tb1.initialize({ useTSS: true, factorPub, deviceTSSShare, deviceTSSIndex }); + const newShare = await tb1.generateNewShare(); + const reconstructedKey = await tb1.reconstructKey(); + await tb1.syncLocalMetadataTransitions(); + if (tb1.privKey.cmp(reconstructedKey.privKey) !== 0) { + fail("key should be able to be reconstructed"); + } + + const tb2 = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); + await tb2.initialize({ useTSS: true, factorPub }); + tb2.inputShareStore(newShare.newShareStores[newShare.newShareIndex.toString("hex")]); + await tb2.reconstructKey(); + const { tssShare: retrievedTSS, tssIndex: retrievedTSSIndex } = await tb2.getTSSShare(factorKey); + const tssCommits = tb2.getTSSCommits(); + const tssPrivKey = getLagrangeCoeffs([1, retrievedTSSIndex], 1) + .mul(serverDKGPrivKeys[0]) + .add(getLagrangeCoeffs([1, retrievedTSSIndex], retrievedTSSIndex).mul(retrievedTSS)) + .umod(ecCurve.n); + + const tssPubKey = getPubKeyPoint(tssPrivKey); + strictEqual(tssPubKey.x.toString(16, 64), tssCommits[0].x.toString(16, 64)); + strictEqual(tssPubKey.y.toString(16, 64), tssCommits[0].y.toString(16, 64)); + + // // test tss refresh + + const factorKey2 = new BN(generatePrivate()); + const factorPub2 = getPubKeyPoint(factorKey2); + + const factorPubs = [factorPub, factorPub2]; + const { serverEndpoints, serverPubKeys } = await sp.getRSSNodeDetails(); + await tb2._refreshTSSShares(true, retrievedTSS, retrievedTSSIndex, factorPubs, [2, 3], testId, { + serverThreshold: 3, + selectedServers: [1, 2, 3], + serverEndpoints, + serverPubKeys, + authSignatures: signatures, + }); + + { + const { tssShare: newTSS2, tssIndex } = await tb2.getTSSShare(factorKey); + const newTSSPrivKey = getLagrangeCoeffs([1, 2], 1) + .mul(new BN(serverDKGPrivKeys[1], "hex")) + .add(getLagrangeCoeffs([1, 2], 2).mul(newTSS2)) + .umod(ecCurve.n); + strictEqual(tssPrivKey.toString(16, 64), newTSSPrivKey.toString(16, 64)); + // eslint-disable-next-line no-console + console.log("newTSS2", newTSS2.toString("hex"), tssIndex); + } + + { + const { tssShare: newTSS2, tssIndex } = await tb2.getTSSShare(factorKey2); + const newTSSPrivKey = getLagrangeCoeffs([1, 3], 1) + .mul(new BN(serverDKGPrivKeys[1], "hex")) + .add(getLagrangeCoeffs([1, 3], 3).mul(newTSS2)) + .umod(ecCurve.n); + strictEqual(tssPrivKey.toString(16, 64), newTSSPrivKey.toString(16, 64)); + // eslint-disable-next-line no-console + console.log("newTSS2", newTSS2.toString("hex"), tssIndex); + } + }); + it("#should be able to reconstruct tssShare from factor key (tss2) when initializing a key with useTSS true", async function () { + const sp = customSP; + if (!sp.useTSS) this.skip(); + + const deviceTSSShare = new BN(generatePrivate()); + const deviceTSSIndex = 3; + + sp.verifierName = "torus-test-health"; + sp.verifierId = "test@example.com"; + const { postboxkey } = await fetchPostboxKeyAndSigs({ + serviceProvider: sp, + verifierName: sp.verifierName, + verifierId: sp.verifierId, + }); + sp.postboxKey = postboxkey; + + // const storageLayer = initStorageLayer({ hostUrl: metadataURL }); + const tb1 = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); + + // factor key needs to passed from outside of tKey + const factorKey = new BN(generatePrivate()); + const factorPub = getPubKeyPoint(factorKey); + + await tb1.initialize({ useTSS: true, factorPub, deviceTSSShare, deviceTSSIndex }); + const reconstructedKey = await tb1.reconstructKey(); + await tb1.syncLocalMetadataTransitions(); + if (tb1.privKey.cmp(reconstructedKey.privKey) !== 0) { + fail("key should be able to be reconstructed"); + } + const { tssShare: tss2 } = await tb1.getTSSShare(factorKey); + + const tssCommits = tb1.getTSSCommits(); + const tss2Pub = ecCurve.g.mul(tss2); + const tssCommitA0 = ecCurve.keyFromPublic({ x: tssCommits[0].x.toString(16, 64), y: tssCommits[0].y.toString(16, 64) }).getPublic(); + const tssCommitA1 = ecCurve.keyFromPublic({ x: tssCommits[1].x.toString(16, 64), y: tssCommits[1].y.toString(16, 64) }).getPublic(); + const _tss2Pub = + deviceTSSIndex === 2 ? tssCommitA0.add(tssCommitA1).add(tssCommitA1) : tssCommitA0.add(tssCommitA1).add(tssCommitA1).add(tssCommitA1); + strictEqual(tss2Pub.x.toString(16, 64), _tss2Pub.x.toString(16, 64)); + strictEqual(tss2Pub.y.toString(16, 64), _tss2Pub.y.toString(16, 64)); + }); + it("#should be able to reconstruct tss key from factor key (tss2) when initializing a key with useTSS true", async function () { + const sp = customSP; + + if (!sp.useTSS) this.skip(); + + sp.verifierName = "torus-test-health"; + sp.verifierId = "test18@example.com"; + const { serverDKGPrivKeys } = await assignTssDkgKeys({ + serviceProvider: sp, + verifierName: sp.verifierName, + verifierId: sp.verifierId, + maxTSSNonceToSimulate: 2, + }); + + const tss1 = new BN(serverDKGPrivKeys[0], "hex"); + const deviceTSSShare = new BN(generatePrivate()); + const deviceTSSIndex = 2; + const { postboxkey } = await fetchPostboxKeyAndSigs({ + serviceProvider: sp, + verifierName: sp.verifierName, + verifierId: sp.verifierId, + }); + sp.postboxKey = postboxkey; + // const storageLayer = initStorageLayer({ hostUrl: metadataURL }); + const tb1 = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); + + // factor key needs to passed from outside of tKey + const factorKey = new BN(generatePrivate()); + const factorPub = getPubKeyPoint(factorKey); + + await tb1.initialize({ useTSS: true, factorPub, deviceTSSShare, deviceTSSIndex }); + const reconstructedKey = await tb1.reconstructKey(); + await tb1.syncLocalMetadataTransitions(); + if (tb1.privKey.cmp(reconstructedKey.privKey) !== 0) { + fail("key should be able to be reconstructed"); + } + + const { tssShare: tss2 } = await tb1.getTSSShare(factorKey); + const tssCommits = tb1.getTSSCommits(); + + const tssPrivKey = getLagrangeCoeffs([1, deviceTSSIndex], 1) + .mul(tss1) + .add(getLagrangeCoeffs([1, deviceTSSIndex], deviceTSSIndex).mul(tss2)) + .umod(ecCurve.n); + + const tssPubKey = getPubKeyPoint(tssPrivKey); + strictEqual(tssPubKey.x.toString(16, 64), tssCommits[0].x.toString(16, 64)); + strictEqual(tssPubKey.y.toString(16, 64), tssCommits[0].y.toString(16, 64)); + }); + it("#should be able to serialize and deserialize with tss even with rss", async function () { + const sp = customSP; + if (!sp.useTSS) this.skip(); + + const deviceTSSShare = new BN(generatePrivate()); + const deviceTSSIndex = 3; + + sp.verifierName = "torus-test-health"; + sp.verifierId = "test18@example.com"; + const { signatures, postboxkey } = await fetchPostboxKeyAndSigs({ + serviceProvider: sp, + verifierName: sp.verifierName, + verifierId: sp.verifierId, + }); + + const testId = sp.getVerifierNameVerifierId(); + + sp.postboxKey = postboxkey; + const { serverDKGPrivKeys } = await assignTssDkgKeys({ + serviceProvider: sp, + verifierName: sp.verifierName, + verifierId: sp.verifierId, + maxTSSNonceToSimulate: 2, + }); + const storageLayer = initStorageLayer({ hostUrl: metadataURL }); + const tb1 = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); + + // factor key needs to passed from outside of tKey + const factorKey = new BN(generatePrivate()); + const factorPub = getPubKeyPoint(factorKey); + + await tb1.initialize({ useTSS: true, factorPub, deviceTSSShare, deviceTSSIndex }); + const reconstructedKey = await tb1.reconstructKey(); + await tb1.syncLocalMetadataTransitions(); + if (tb1.privKey.cmp(reconstructedKey.privKey) !== 0) { + fail("key should be able to be reconstructed"); + } + + const { tssShare: retrievedTSS, tssIndex: retrievedTSSIndex } = await tb1.getTSSShare(factorKey); + const tssCommits = tb1.getTSSCommits(); + + const tssPrivKey = getLagrangeCoeffs([1, retrievedTSSIndex], 1) + .mul(serverDKGPrivKeys[0]) + .add(getLagrangeCoeffs([1, retrievedTSSIndex], retrievedTSSIndex).mul(retrievedTSS)) + .umod(ecCurve.n); + + const tssPubKey = getPubKeyPoint(tssPrivKey); + strictEqual(tssPubKey.x.toString(16, 64), tssCommits[0].x.toString(16, 64)); + strictEqual(tssPubKey.y.toString(16, 64), tssCommits[0].y.toString(16, 64)); + + // test tss refresh + + const factorKey2 = new BN(generatePrivate()); + const factorPub2 = getPubKeyPoint(factorKey2); + + const factorPubs = [factorPub, factorPub2]; + const { serverEndpoints, serverPubKeys } = await sp.getRSSNodeDetails(); + + await tb1._refreshTSSShares(true, retrievedTSS, retrievedTSSIndex, factorPubs, [2, 3], testId, { + serverThreshold: 3, + selectedServers: [1, 2, 3], + serverEndpoints, + serverPubKeys, + }); + + { + const { tssShare: newTSS2 } = await tb1.getTSSShare(factorKey); + const newTSSPrivKey = getLagrangeCoeffs([1, 2], 1) + .mul(new BN(serverDKGPrivKeys[1], "hex")) + .add(getLagrangeCoeffs([1, 2], 2).mul(newTSS2)) + .umod(ecCurve.n); + strictEqual(tssPrivKey.toString(16, 64), newTSSPrivKey.toString(16, 64)); + } + + { + const { tssShare: newTSS2 } = await tb1.getTSSShare(factorKey2); + const newTSSPrivKey = getLagrangeCoeffs([1, 3], 1) + .mul(new BN(serverDKGPrivKeys[1], "hex")) + .add(getLagrangeCoeffs([1, 3], 3).mul(newTSS2)) + .umod(ecCurve.n); + strictEqual(tssPrivKey.toString(16, 64), newTSSPrivKey.toString(16, 64)); + } + + const serialized = stringify(tb1); + + const deserialized = await ThresholdKey.fromJSON(JSON.parse(serialized), { serviceProvider: sp, storageLayer, manualSync: mode }); + const serialized2 = stringify(deserialized); + + strictEqual(serialized, serialized2); + + const tb2 = await ThresholdKey.fromJSON(JSON.parse(serialized2), { serviceProvider: sp, storageLayer, manualSync: mode }); + { + const { tssShare: newTSS2 } = await tb2.getTSSShare(factorKey); + const newTSSPrivKey = getLagrangeCoeffs([1, 2], 1) + .mul(new BN(serverDKGPrivKeys[1], "hex")) + .add(getLagrangeCoeffs([1, 2], 2).mul(newTSS2)) + .umod(ecCurve.n); + strictEqual(tssPrivKey.toString(16, 64), newTSSPrivKey.toString(16, 64)); + } + + { + const { tssShare: newTSS2 } = await tb2.getTSSShare(factorKey2); + const newTSSPrivKey = getLagrangeCoeffs([1, 3], 1) + .mul(new BN(serverDKGPrivKeys[1], "hex")) + .add(getLagrangeCoeffs([1, 3], 3).mul(newTSS2)) + .umod(ecCurve.n); + strictEqual(tssPrivKey.toString(16, 64), newTSSPrivKey.toString(16, 64)); + } + }); + describe("with tss, tkey share deletion", function () { + let deletedShareIndex; + let shareStoreAfterDelete; + let tb; + let tbTssInitResp; + let oldFactorKey; + let newFactorKey; + before(`#should be able to generate and delete a share, manualSync=${mode}`, async function () { + const sp = customSP; + + if (!sp.useTSS) this.skip(); + const deviceTSSShare = new BN(generatePrivate()); + const deviceTSSIndex = 3; + + sp.verifierName = "torus-test-health"; + sp.verifierId = "test192@example.com"; + const { signatures, postboxkey } = await fetchPostboxKeyAndSigs({ + serviceProvider: sp, + verifierName: sp.verifierName, + verifierId: sp.verifierId, + }); + sp.postboxKey = postboxkey; + const { serverDKGPrivKeys } = await assignTssDkgKeys({ + serviceProvider: sp, + verifierName: sp.verifierName, + verifierId: sp.verifierId, + maxTSSNonceToSimulate: 4, + }); + + // tb = new ThresholdKey({ serviceProvider: sp, storageLayer: customSL, manualSync: mode }); + // tbInitResp = await tb._initializeNewKey({ initializeModules: true }); + // oldFactorKey = new BN(generatePrivate()); + // const oldFactorPub = getPubKeyPoint(oldFactorKey); + // tbTssInitResp = await tb._initializeNewTSSKey("default", deviceTSSShare, oldFactorPub, deviceTSSIndex); + // const { factorEncs, factorPubs, tssPolyCommits } = tbTssInitResp; + // tb.metadata.addTSSData({ tssTag: tb.tssTag, tssNonce: 0, tssPolyCommits, factorPubs, factorEncs }); + // // const { factorEncs, factorPubs, tssPolyCommits } = tbTssInitResp; + + tb = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); + + // factor key needs to passed from outside of tKey + const factorKey = new BN(generatePrivate()); + const factorPub = getPubKeyPoint(factorKey); + await tb.initialize({ useTSS: true, factorPub, deviceTSSShare, deviceTSSIndex }); + newFactorKey = new BN(generatePrivate()); + + const newFactorPub = getPubKeyPoint(newFactorKey); + const newShare = await tb.generateNewShare(true, { + inputTSSShare: deviceTSSShare, + inputTSSIndex: deviceTSSIndex, + newFactorPub, + newTSSIndex: 2, + authSignatures: signatures, + }); + const reconstructedKey = await tb.reconstructKey(); + await tb.syncLocalMetadataTransitions(); + + if (tb.privKey.cmp(reconstructedKey.privKey) !== 0) { + fail("key should be able to be reconstructed"); + } + const { tssShare: retrievedTSS, tssIndex: retrievedTSSIndex } = await tb.getTSSShare(factorKey); + const tssCommits = tb.getTSSCommits(); + const tssPrivKey = getLagrangeCoeffs([1, retrievedTSSIndex], 1) + .mul(serverDKGPrivKeys[1]) + .add(getLagrangeCoeffs([1, retrievedTSSIndex], retrievedTSSIndex).mul(retrievedTSS)) + .umod(ecCurve.n); + const tssPubKey = getPubKeyPoint(tssPrivKey); + + strictEqual(tssPubKey.x.toString(16, 64), tssCommits[0].x.toString(16, 64)); + strictEqual(tssPubKey.y.toString(16, 64), tssCommits[0].y.toString(16, 64)); + const updatedShareStore = await tb.deleteShare(newShare.newShareIndex, true, { + inputTSSIndex: retrievedTSSIndex, + inputTSSShare: retrievedTSS, + authSignatures: signatures, + factorPub, + }); + + deletedShareIndex = newShare.newShareIndex; + shareStoreAfterDelete = updatedShareStore.newShareStores; + + await tb.syncLocalMetadataTransitions(); + }); + it(`#should be not be able to lookup delete share, manualSync=${mode}`, async function () { + if (!customSP.useTSS) this.skip(); + const newKeys = Object.keys(shareStoreAfterDelete); + if (newKeys.find((el) => el === deletedShareIndex.toString("hex"))) { + fail("Unable to delete share index"); + } + rejects(async () => { + await tb.getTSSShare(oldFactorKey); + }); + await tb.getTSSShare(newFactorKey); + }); + // it(`#should be able to delete a user and reset tss nonce, manualSync=${mode}`, async function () { + // if (!customSP.useTSS) this.skip(); + // // create 2/4 + // await tb._initializeNewKey({ initializeModules: true }); + // await tb.generateNewShare(); + // const shareStoresAtEpoch2 = tb.getAllShareStoresForLatestPolynomial(); + + // await tb.generateNewShare(); + // await tb.syncLocalMetadataTransitions(); + // const sharesStoresAtEpoch3 = tb.getAllShareStoresForLatestPolynomial(); + // await tb.CRITICAL_deleteTkey(); + + // const spData = await customSL.getMetadata({ serviceProvider: customSP }); + // const data2 = await Promise.allSettled(shareStoresAtEpoch2.map((x) => tb.catchupToLatestShare({ shareStore: x }))); + // const data3 = await Promise.all(sharesStoresAtEpoch3.map((x) => customSL.getMetadata({ privKey: x.share.share }))); + + // deepStrictEqual(spData.message, KEY_NOT_FOUND); + + // data2.forEach((x) => { + // deepStrictEqual(x.status, "rejected"); + // deepStrictEqual(x.reason.code, 1308); + // }); + + // data3.forEach((x) => { + // deepStrictEqual(x.message, SHARE_DELETED); + // }); + + // // TODO: check that TSS nonce is reset + // }); + it(`#should be able to reinitialize after wipe, manualSync=${mode}`, async function () { + if (!customSP.useTSS) this.skip(); + // create 2/4 + const resp1 = await tb._initializeNewKey({ initializeModules: true }); + await tb.generateNewShare(); + if (mode) { + await tb.syncLocalMetadataTransitions(); + } + await tb.CRITICAL_deleteTkey(); + + const tb2 = new ThresholdKey({ serviceProvider: customSP, storageLayer: customSL, manualSync: mode }); + await tb2.initialize(); + await tb2.generateNewShare(); + if (mode) { + await tb2.syncLocalMetadataTransitions(); + } + + const data3 = await customSL.getMetadata({ serviceProvider: customSP }); + notEqual(data3.message, KEY_NOT_FOUND); + deepStrictEqual(tb2.metadata.nonce, 1); + + const reconstructedKey = await tb2.reconstructKey(); + if (resp1.privKey.cmp(reconstructedKey.privKey) === 0) { + fail("key should be different"); + } + // TODO: check that TSS is reset and still able to use TSS methods + }); + }); + describe("with tss, tkey serialization/deserialization", function () { + let tb; + beforeEach("Setup ThresholdKey", async function () { + if (!customSP.useTSS) this.skip(); + tb = new ThresholdKey({ serviceProvider: customSP, storageLayer: customSL, manualSync: mode }); + }); + it(`#should serialize and deserialize correctly without tkeyArgs, manualSync=${mode}`, async function () { + if (!customSP.useTSS) this.skip(); + const sp = customSP; + let userInput = new BN(keccak256("user answer blublu").slice(2), "hex"); + userInput = userInput.umod(ecCurve.curve.n); + const resp1 = await tb._initializeNewKey({ userInput, initializeModules: true }); + + sp.verifierName = "torus-test-health"; + sp.verifierId = "test18@example.com"; + const { postboxkey } = await fetchPostboxKeyAndSigs({ + serviceProvider: sp, + verifierName: sp.verifierName, + verifierId: sp.verifierId, + }); + sp.postboxKey = postboxkey; + const { serverDKGPrivKeys } = await assignTssDkgKeys({ + serviceProvider: sp, + verifierName: sp.verifierName, + verifierId: sp.verifierId, + maxTSSNonceToSimulate: 2, + }); + const deviceTSSShare = new BN(generatePrivate()); + const deviceTSSIndex = 2; + const factorKey = new BN(generatePrivate()); + const factorPub = getPubKeyPoint(factorKey); + const { factorEncs, factorPubs, tssPolyCommits } = await tb._initializeNewTSSKey("default", deviceTSSShare, factorPub, deviceTSSIndex); + tb.metadata.addTSSData({ tssTag: tb.tssTag, tssNonce: 0, tssPolyCommits, factorPubs, factorEncs }); + const { tssShare, tssIndex } = await tb.getTSSShare(factorKey); + + const tssPrivKey = getLagrangeCoeffs([1, tssIndex], 1) + .mul(serverDKGPrivKeys[0]) + .add(getLagrangeCoeffs([1, tssIndex], tssIndex).mul(tssShare)) + .umod(ecCurve.n); + + const newFactorKey = new BN(generatePrivate()); + const newFactorPub = getPubKeyPoint(newFactorKey); + + await tb.generateNewShare(true, { + inputTSSShare: tssShare, + inputTSSIndex: tssIndex, + newFactorPub, + newTSSIndex: 3, + }); + await tb.syncLocalMetadataTransitions(); + + const stringified = JSON.stringify(tb); + const tb3 = await ThresholdKey.fromJSON(JSON.parse(stringified)); + const finalKey = await tb3.reconstructKey(); + strictEqual(finalKey.privKey.toString("hex"), resp1.privKey.toString("hex"), "Incorrect serialization"); + + const { tssShare: tssShare2, tssIndex: tssIndex2 } = await tb3.getTSSShare(newFactorKey); + const tssPrivKey2 = getLagrangeCoeffs([1, tssIndex2], 1) + .mul(serverDKGPrivKeys[1]) + .add(getLagrangeCoeffs([1, tssIndex2], tssIndex2).mul(tssShare2)) + .umod(ecCurve.n); + strictEqual(tssPrivKey.toString("hex"), tssPrivKey2.toString("hex"), "Incorrect tss key"); + }); + it(`#should serialize and deserialize correctly with tkeyArgs, manualSync=${mode}`, async function () { + if (!customSP.useTSS) this.skip(); + let userInput = new BN(keccak256("user answer blublu").slice(2), "hex"); + userInput = userInput.umod(ecCurve.curve.n); + const resp1 = await tb._initializeNewKey({ userInput, initializeModules: true }); + + const sp = customSP; + sp.verifierName = "torus-test-health"; + sp.verifierId = "test18@example.com"; + const { postboxkey } = await fetchPostboxKeyAndSigs({ + serviceProvider: sp, + verifierName: sp.verifierName, + verifierId: sp.verifierId, + }); + sp.postboxKey = postboxkey; + const { serverDKGPrivKeys } = await assignTssDkgKeys({ + serviceProvider: sp, + verifierName: sp.verifierName, + verifierId: sp.verifierId, + maxTSSNonceToSimulate: 2, + }); + const deviceTSSShare = new BN(generatePrivate()); + const deviceTSSIndex = 2; + const factorKey = new BN(generatePrivate()); + const factorPub = getPubKeyPoint(factorKey); + const { factorEncs, factorPubs, tssPolyCommits } = await tb._initializeNewTSSKey("default", deviceTSSShare, factorPub, deviceTSSIndex); + tb.metadata.addTSSData({ tssTag: tb.tssTag, tssNonce: 0, tssPolyCommits, factorPubs, factorEncs }); + const { tssShare, tssIndex } = await tb.getTSSShare(factorKey); + const tssPrivKey = getLagrangeCoeffs([1, tssIndex], 1) + .mul(serverDKGPrivKeys[0]) + .add(getLagrangeCoeffs([1, tssIndex], tssIndex).mul(tssShare)) + .umod(ecCurve.n); + + const newFactorKey = new BN(generatePrivate()); + const newFactorPub = getPubKeyPoint(newFactorKey); + + await tb.generateNewShare(true, { + inputTSSShare: tssShare, + inputTSSIndex: tssIndex, + newFactorPub, + newTSSIndex: 3, + }); + + await tb.syncLocalMetadataTransitions(); + + const stringified = JSON.stringify(tb); + const tb3 = await ThresholdKey.fromJSON(JSON.parse(stringified), { serviceProvider: customSP, storageLayer: customSL }); + const finalKey = await tb3.reconstructKey(); + strictEqual(finalKey.privKey.toString("hex"), resp1.privKey.toString("hex"), "Incorrect serialization"); + + const { tssShare: tssShare2, tssIndex: tssIndex2 } = await tb3.getTSSShare(newFactorKey); + const tssPrivKey2 = getLagrangeCoeffs([1, tssIndex2], 1) + .mul(serverDKGPrivKeys[1]) + .add(getLagrangeCoeffs([1, tssIndex2], tssIndex2).mul(tssShare2)) + .umod(ecCurve.n); + strictEqual(tssPrivKey.toString("hex"), tssPrivKey2.toString("hex"), "Incorrect tss key"); + }); + // TODO: add test for initialize such that initialize throws if the remote metadata is already there + it(`#should serialize and deserialize correctly, keeping localTransitions consistent before syncing NewKeyAssign, manualSync=${mode}`, async function () { + if (!customSP.useTSS) this.skip(); + + const sp = customSP; + sp.verifierName = "torus-test-health"; + sp.verifierId = "test18@example.com"; + const { postboxkey } = await fetchPostboxKeyAndSigs({ + serviceProvider: sp, + verifierName: sp.verifierName, + verifierId: sp.verifierId, + }); + sp.postboxKey = postboxkey; + await assignTssDkgKeys({ + serviceProvider: sp, + verifierName: sp.verifierName, + verifierId: sp.verifierId, + maxTSSNonceToSimulate: 2, + }); + + let userInput = new BN(keccak256("user answer blublu").slice(2), "hex"); + userInput = userInput.umod(ecCurve.curve.n); + const resp1 = await tb._initializeNewKey({ userInput, initializeModules: true }); + + // generate and delete + const { newShareIndex: shareIndex1 } = await tb.generateNewShare(); + await tb.deleteShare(shareIndex1); + + const { newShareStores: shareStores, newShareIndex: shareIndex } = await tb.generateNewShare(); + + const stringified = JSON.stringify(tb); + const tb2 = await ThresholdKey.fromJSON(JSON.parse(stringified), { serviceProvider: sp, storageLayer: customSL }); + if (tb2.manualSync !== mode) { + fail(`manualSync should be ${mode}`); + } + const finalKey = await tb2.reconstructKey(); + const shareToVerify = tb2.outputShareStore(shareIndex); + // TODO: tb2.generateNewShare() + strictEqual(shareStores[shareIndex.toString("hex")].share.share.toString("hex"), shareToVerify.share.share.toString("hex")); + await tb2.syncLocalMetadataTransitions(); + strictEqual(finalKey.privKey.toString("hex"), resp1.privKey.toString("hex"), "Incorrect serialization"); + + const reconstructedKey2 = await tb2.reconstructKey(); + if (resp1.privKey.cmp(reconstructedKey2.privKey) !== 0) { + fail("key should be able to be reconstructed"); + } + }); + it(`#should serialize and deserialize correctly keeping localTransitions afterNewKeyAssign, manualSync=${mode}`, async function () { + if (!customSP.useTSS) this.skip(); + let userInput = new BN(keccak256("user answer blublu").slice(2), "hex"); + userInput = userInput.umod(ecCurve.curve.n); + const resp1 = await tb._initializeNewKey({ userInput, initializeModules: true }); + // TODO: tss initialize + await tb.syncLocalMetadataTransitions(); + const reconstructedKey = await tb.reconstructKey(); + // TODO: reconstruct tss key + const { newShareStores: shareStores, newShareIndex: shareIndex } = await tb.generateNewShare(); + + const stringified = JSON.stringify(tb); + const tb2 = await ThresholdKey.fromJSON(JSON.parse(stringified), { serviceProvider: customSP, storageLayer: customSL }); + const finalKey = await tb2.reconstructKey(); + // TODO: reconstruct tss key + const shareToVerify = tb2.outputShareStore(shareIndex); + strictEqual(shareStores[shareIndex.toString("hex")].share.share.toString("hex"), shareToVerify.share.share.toString("hex")); + await tb2.syncLocalMetadataTransitions(); + strictEqual(finalKey.privKey.toString("hex"), reconstructedKey.privKey.toString("hex"), "Incorrect serialization"); + // TODO: both tss keys should be the same + + const reconstructedKey2 = await tb2.reconstructKey(); + if (resp1.privKey.cmp(reconstructedKey2.privKey) !== 0) { + fail("key should be able to be reconstructed"); + } + }); + it(`#should not be able to updateSDK with newKeyAssign transitions unsynced, manualSync=${mode}`, async function () { + await tb._initializeNewKey({ initializeModules: true }); + // TODO: initialize new tss key + const stringified = JSON.stringify(tb); + const tb2 = await ThresholdKey.fromJSON(JSON.parse(stringified), {}); + + if (mode) { + // Can't updateSDK, please do key assign. + await rejects(async function () { + await tb2.updateSDK(); // TODO: does this need params? update function to handle TSS in tb.initialize core.ts:1130 + }, Error); + } + // create new key because the state might have changed after updateSDK() + const tb3 = await ThresholdKey.fromJSON(JSON.parse(stringified), {}); + await tb3.generateNewShare(); + await tb3.syncLocalMetadataTransitions(); + await tb3.updateSDK(); + }); + }); + }); +}; diff --git a/packages/default/test/tssTorusSPManualSync.test.js b/packages/default/test/tssTorusSPManualSync.test.js index 6f9d7021..6705b0f0 100644 --- a/packages/default/test/tssTorusSPManualSync.test.js +++ b/packages/default/test/tssTorusSPManualSync.test.js @@ -4,6 +4,7 @@ import { generatePrivate } from "@toruslabs/eccrypto"; import { getMetadataUrl, initStorageLayer } from "./helpers"; import { sharedTestCases } from "./shared"; +import { tssSharedTests } from "./tssShared"; const PRIVATE_KEY = generatePrivate().toString("hex"); @@ -34,4 +35,7 @@ const MANUAL_SYNC = true; describe.only(`TorusServiceProvider with manualSync: ${MANUAL_SYNC}`, function () { // eslint-disable-next-line mocha/no-setup-in-describe sharedTestCases(MANUAL_SYNC, torusSp, torusSL); + + // eslint-disable-next-line mocha/no-setup-in-describe + tssSharedTests(MANUAL_SYNC, torusSp, torusSL); }); From 15fe17400c4c013ef9a32a984eff10a96c16eaef Mon Sep 17 00:00:00 2001 From: ieow Date: Wed, 10 May 2023 13:26:17 +0800 Subject: [PATCH 02/12] feat: update --- .../default/test/tssBaseSPMockRss.test.js | 52 +++++++++++++++++++ packages/default/test/tssShared.js | 4 +- ...PManualSync.test.js => tssTorusSP.test.js} | 22 +++++--- 3 files changed, 70 insertions(+), 8 deletions(-) create mode 100644 packages/default/test/tssBaseSPMockRss.test.js rename packages/default/test/{tssTorusSPManualSync.test.js => tssTorusSP.test.js} (61%) diff --git a/packages/default/test/tssBaseSPMockRss.test.js b/packages/default/test/tssBaseSPMockRss.test.js new file mode 100644 index 00000000..65811822 --- /dev/null +++ b/packages/default/test/tssBaseSPMockRss.test.js @@ -0,0 +1,52 @@ +// import ServiceProviderBase from "@tkey/service-provider-base"; +import ServiceProviderTorus from "@tkey/service-provider-torus"; +import { generatePrivate } from "@toruslabs/eccrypto"; + +import { getMetadataUrl, initStorageLayer } from "./helpers"; +import { sharedTestCases } from "./shared"; +import { tssSharedTests } from "./tssShared"; + +const PRIVATE_KEY = generatePrivate().toString("hex"); + +const torusSp = new ServiceProviderTorus({ + postboxKey: PRIVATE_KEY, + tssVerifier: "test-tss-verifier", + useTSS: true, + // tssPubKey: { + // // test key: bc0def03430ddb9d57a5fa2cb18786ee21c55255016c7b5db9616d0463b4b7ed + // x: new BN("9c381cea525bcc72b05272afe8ea75b1c3029966caa5953aa64b5d84d7a97773", "hex"), + // y: new BN("4f3909bf64be23a32887086fccd449e0e57042622a1364e0d670f6eb798238d7", "hex"), + // }, + customAuthArgs: { + network: "sapphire_mainnet", + web3AuthClientId: "YOUR_CLIENT_ID", + baseUrl: "http://localhost:3000", + }, +}); + +// const torusSp = new ServiceProviderBase({ +// postboxKey: PRIVATE_KEY, +// useTSS: true, +// }); +const metadataURL = getMetadataUrl(); +const torusSL = initStorageLayer({ hostUrl: metadataURL }); + +describe.only(`TSS Test with BaseServiceProvider Mock Rss`, function () { + const MANUAL_SYNC = true; + const MOCK_RSS = true; + describe.only(`TSS BaseServiceProvider Mock Rss with manualSync: ${MANUAL_SYNC}`, function () { + // eslint-disable-next-line mocha/no-setup-in-describe + sharedTestCases(MANUAL_SYNC, torusSp, torusSL); + + // eslint-disable-next-line mocha/no-setup-in-describe + tssSharedTests(MANUAL_SYNC, torusSp, torusSL, MOCK_RSS); + }); + + describe.only(`TSS BaseServiceProvider Mock Rss with manualSync: ${false}`, function () { + // eslint-disable-next-line mocha/no-setup-in-describe + sharedTestCases(false, torusSp, torusSL); + + // eslint-disable-next-line mocha/no-setup-in-describe + tssSharedTests(false, torusSp, torusSL, MOCK_RSS); + }); +}); diff --git a/packages/default/test/tssShared.js b/packages/default/test/tssShared.js index 4cbaabdd..bffebad3 100644 --- a/packages/default/test/tssShared.js +++ b/packages/default/test/tssShared.js @@ -15,7 +15,7 @@ import { assignTssDkgKeys, fetchPostboxKeyAndSigs, getMetadataUrl, getServicePro const metadataURL = getMetadataUrl(); // eslint-disable-next-line mocha/no-exports -export const tssSharedTests = (mode, torusSP, storageLayer) => { +export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { const customSP = torusSP; const customSL = storageLayer; describe.only("TSS tests", function () { @@ -35,7 +35,7 @@ export const tssSharedTests = (mode, torusSP, storageLayer) => { verifierId: sp.verifierId, }); sp.postboxKey = postboxkey; - const { serverDKGPrivKeys } = await assignTssDkgKeys({ + const { serverDKGPrivKeys } = await assignTssDkgKeys({ serviceProvider: sp, verifierName: sp.verifierName, verifierId: sp.verifierId, diff --git a/packages/default/test/tssTorusSPManualSync.test.js b/packages/default/test/tssTorusSP.test.js similarity index 61% rename from packages/default/test/tssTorusSPManualSync.test.js rename to packages/default/test/tssTorusSP.test.js index 6705b0f0..2d3e3180 100644 --- a/packages/default/test/tssTorusSPManualSync.test.js +++ b/packages/default/test/tssTorusSP.test.js @@ -31,11 +31,21 @@ const torusSp = new ServiceProviderTorus({ const metadataURL = getMetadataUrl(); const torusSL = initStorageLayer({ hostUrl: metadataURL }); -const MANUAL_SYNC = true; -describe.only(`TorusServiceProvider with manualSync: ${MANUAL_SYNC}`, function () { - // eslint-disable-next-line mocha/no-setup-in-describe - sharedTestCases(MANUAL_SYNC, torusSp, torusSL); +describe.only(`TSS Test with TorusServiceProvider`, function () { + const MANUAL_SYNC = true; + describe.only(`TSS TorusServiceProvider with manualSync: ${MANUAL_SYNC}`, function () { + // eslint-disable-next-line mocha/no-setup-in-describe + sharedTestCases(MANUAL_SYNC, torusSp, torusSL); - // eslint-disable-next-line mocha/no-setup-in-describe - tssSharedTests(MANUAL_SYNC, torusSp, torusSL); + // eslint-disable-next-line mocha/no-setup-in-describe + tssSharedTests(MANUAL_SYNC, torusSp, torusSL); + }); + + describe.only(`TSS TorusServiceProvider with manualSync: ${false}`, function () { + // eslint-disable-next-line mocha/no-setup-in-describe + sharedTestCases(false, torusSp, torusSL); + + // eslint-disable-next-line mocha/no-setup-in-describe + tssSharedTests(false, torusSp, torusSL); + }); }); From 619a51e0a9479c90f1e77e5b8064eea04891e56d Mon Sep 17 00:00:00 2001 From: ieow Date: Wed, 10 May 2023 15:14:16 +0800 Subject: [PATCH 03/12] feat: update with mock rss --- packages/default/test/helpers.js | 38 ++++++++++++++++++- .../default/test/tssBaseSPMockRss.test.js | 4 +- packages/default/test/tssShared.js | 36 ++++++++++++------ 3 files changed, 64 insertions(+), 14 deletions(-) diff --git a/packages/default/test/helpers.js b/packages/default/test/helpers.js index cbbf3d8c..cc531e28 100644 --- a/packages/default/test/helpers.js +++ b/packages/default/test/helpers.js @@ -96,7 +96,7 @@ export async function setupTSSMocks(opts) { } serviceProvider._setTSSNodeDetails(serverEndpoints, serverPubKeys, serverThreshold); - + serviceProvider.rssNodeDetails = { ...serviceProvider.tssNodeDetails }; return { serverEndpoints, serverPubKeys, @@ -182,3 +182,39 @@ export async function assignTssDkgKeys(opts) { // serverDKGPubKeys, }; } + +export async function setupTSS(opts) { + const { serviceProvider, verifierName, verifierId, maxTSSNonceToSimulate, tssTag, MOCK_RSS } = opts; + if (MOCK_RSS) { + const { serverEndpoints, serverPubKeys, serverDKGPrivKeys, serverDKGPubKeys } = await setupTSSMocks({ + serviceProvider , + verifierName, + verifierId, + maxTSSNonceToSimulate, + tssTag, + }); + const signatures = "signature"; + return { + signatures, + serverDKGPrivKeys, + }; + } + + const { signatures, postboxkey } = await fetchPostboxKeyAndSigs({ + serviceProvider, + verifierName, + verifierId, + }); + serviceProvider.postboxKey = postboxkey; + const { serverDKGPrivKeys } = await assignTssDkgKeys({ + serviceProvider, + verifierName, + verifierId, + maxTSSNonceToSimulate, + }); + + return { + signatures, + serverDKGPrivKeys, + }; +} diff --git a/packages/default/test/tssBaseSPMockRss.test.js b/packages/default/test/tssBaseSPMockRss.test.js index 65811822..77ab5579 100644 --- a/packages/default/test/tssBaseSPMockRss.test.js +++ b/packages/default/test/tssBaseSPMockRss.test.js @@ -1,5 +1,5 @@ // import ServiceProviderBase from "@tkey/service-provider-base"; -import ServiceProviderTorus from "@tkey/service-provider-torus"; +import { ServiceProviderBase } from "@tkey/service-provider-base"; import { generatePrivate } from "@toruslabs/eccrypto"; import { getMetadataUrl, initStorageLayer } from "./helpers"; @@ -8,7 +8,7 @@ import { tssSharedTests } from "./tssShared"; const PRIVATE_KEY = generatePrivate().toString("hex"); -const torusSp = new ServiceProviderTorus({ +const torusSp = new ServiceProviderBase({ postboxKey: PRIVATE_KEY, tssVerifier: "test-tss-verifier", useTSS: true, diff --git a/packages/default/test/tssShared.js b/packages/default/test/tssShared.js index bffebad3..6b34161e 100644 --- a/packages/default/test/tssShared.js +++ b/packages/default/test/tssShared.js @@ -11,7 +11,16 @@ import stringify from "json-stable-stringify"; import { keccak256 } from "web3-utils"; import ThresholdKey from "../src/index"; -import { assignTssDkgKeys, fetchPostboxKeyAndSigs, getMetadataUrl, getServiceProvider, initStorageLayer, isMocked, setupTSSMocks } from "./helpers"; +import { + assignTssDkgKeys, + fetchPostboxKeyAndSigs, + getMetadataUrl, + getServiceProvider, + initStorageLayer, + isMocked, + setupTSS, + setupTSSMocks, +} from "./helpers"; const metadataURL = getMetadataUrl(); // eslint-disable-next-line mocha/no-exports @@ -28,19 +37,16 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { sp.verifierName = "torus-test-health"; sp.verifierId = "test19@example.com"; - const testId = sp.getVerifierNameVerifierId(); - const { signatures, postboxkey } = await fetchPostboxKeyAndSigs({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - }); - sp.postboxKey = postboxkey; - const { serverDKGPrivKeys } = await assignTssDkgKeys({ + const { signatures, serverDKGPrivKeys } = await setupTSS({ serviceProvider: sp, verifierName: sp.verifierName, verifierId: sp.verifierId, maxTSSNonceToSimulate: 2, + tssTag: "default", + MOCK_RSS, }); + + const testId = sp.getVerifierNameVerifierId(); // const storageLayer = initStorageLayer({ hostUrl: metadataURL }); const tb1 = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); @@ -117,12 +123,20 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { sp.verifierName = "torus-test-health"; sp.verifierId = "test@example.com"; - const { postboxkey } = await fetchPostboxKeyAndSigs({ + // const { postboxkey } = await fetchPostboxKeyAndSigs({ + // serviceProvider: sp, + // verifierName: sp.verifierName, + // verifierId: sp.verifierId, + // }); + // sp.postboxKey = postboxkey; + await setupTSS({ serviceProvider: sp, verifierName: sp.verifierName, verifierId: sp.verifierId, + maxTSSNonceToSimulate: 2, + tssTag: "default", + MOCK_RSS, }); - sp.postboxKey = postboxkey; // const storageLayer = initStorageLayer({ hostUrl: metadataURL }); const tb1 = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); From 7340911a8560c1a8aef8a2560d516386d1bb9437 Mon Sep 17 00:00:00 2001 From: ieow Date: Wed, 10 May 2023 16:01:38 +0800 Subject: [PATCH 04/12] feat: most tests pass with mock rss --- packages/default/test/helpers.js | 6 ++- packages/default/test/tssShared.js | 68 +++++++++++------------------- 2 files changed, 29 insertions(+), 45 deletions(-) diff --git a/packages/default/test/helpers.js b/packages/default/test/helpers.js index cc531e28..aef177b1 100644 --- a/packages/default/test/helpers.js +++ b/packages/default/test/helpers.js @@ -92,11 +92,15 @@ export async function setupTSSMocks(opts) { }); }) ); - serviceProvider._setTSSPubKey("default", j, new Point(dkg2Pub.x, dkg2Pub.y)); + serviceProvider._setTSSPubKey(tssTag, j, new Point(dkg2Pub.x, dkg2Pub.y)); } serviceProvider._setTSSNodeDetails(serverEndpoints, serverPubKeys, serverThreshold); serviceProvider.rssNodeDetails = { ...serviceProvider.tssNodeDetails }; + + // update new serviceprovider postbox key + const postboxKey = new BN(generatePrivate()); + serviceProvider.postboxKey = postboxKey.toString(16, 64); return { serverEndpoints, serverPubKeys, diff --git a/packages/default/test/tssShared.js b/packages/default/test/tssShared.js index 6b34161e..27bb4b49 100644 --- a/packages/default/test/tssShared.js +++ b/packages/default/test/tssShared.js @@ -169,22 +169,20 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { sp.verifierName = "torus-test-health"; sp.verifierId = "test18@example.com"; - const { serverDKGPrivKeys } = await assignTssDkgKeys({ + + const { serverDKGPrivKeys } = await setupTSS({ serviceProvider: sp, verifierName: sp.verifierName, verifierId: sp.verifierId, maxTSSNonceToSimulate: 2, + tssTag: "default", + MOCK_RSS, }); const tss1 = new BN(serverDKGPrivKeys[0], "hex"); const deviceTSSShare = new BN(generatePrivate()); const deviceTSSIndex = 2; - const { postboxkey } = await fetchPostboxKeyAndSigs({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - }); - sp.postboxKey = postboxkey; + // const storageLayer = initStorageLayer({ hostUrl: metadataURL }); const tb1 = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); @@ -220,21 +218,17 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { sp.verifierName = "torus-test-health"; sp.verifierId = "test18@example.com"; - const { signatures, postboxkey } = await fetchPostboxKeyAndSigs({ + const { signatures, serverDKGPrivKeys } = await setupTSS({ serviceProvider: sp, verifierName: sp.verifierName, verifierId: sp.verifierId, + maxTSSNonceToSimulate: 2, + tssTag: "default", + MOCK_RSS, }); const testId = sp.getVerifierNameVerifierId(); - sp.postboxKey = postboxkey; - const { serverDKGPrivKeys } = await assignTssDkgKeys({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - maxTSSNonceToSimulate: 2, - }); const storageLayer = initStorageLayer({ hostUrl: metadataURL }); const tb1 = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); @@ -336,17 +330,13 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { sp.verifierName = "torus-test-health"; sp.verifierId = "test192@example.com"; - const { signatures, postboxkey } = await fetchPostboxKeyAndSigs({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - }); - sp.postboxKey = postboxkey; - const { serverDKGPrivKeys } = await assignTssDkgKeys({ + const { signatures, serverDKGPrivKeys } = await setupTSS({ serviceProvider: sp, verifierName: sp.verifierName, verifierId: sp.verifierId, - maxTSSNonceToSimulate: 4, + maxTSSNonceToSimulate: 2, + tssTag: "default", + MOCK_RSS, }); // tb = new ThresholdKey({ serviceProvider: sp, storageLayer: customSL, manualSync: mode }); @@ -485,18 +475,15 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { sp.verifierName = "torus-test-health"; sp.verifierId = "test18@example.com"; - const { postboxkey } = await fetchPostboxKeyAndSigs({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - }); - sp.postboxKey = postboxkey; - const { serverDKGPrivKeys } = await assignTssDkgKeys({ + const { signatures, serverDKGPrivKeys } = await setupTSS({ serviceProvider: sp, verifierName: sp.verifierName, verifierId: sp.verifierId, maxTSSNonceToSimulate: 2, + tssTag: "default", + MOCK_RSS, }); + const deviceTSSShare = new BN(generatePrivate()); const deviceTSSIndex = 2; const factorKey = new BN(generatePrivate()); @@ -542,18 +529,15 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { const sp = customSP; sp.verifierName = "torus-test-health"; sp.verifierId = "test18@example.com"; - const { postboxkey } = await fetchPostboxKeyAndSigs({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - }); - sp.postboxKey = postboxkey; - const { serverDKGPrivKeys } = await assignTssDkgKeys({ + const { signatures, serverDKGPrivKeys } = await setupTSS({ serviceProvider: sp, verifierName: sp.verifierName, verifierId: sp.verifierId, maxTSSNonceToSimulate: 2, + tssTag: "default", + MOCK_RSS, }); + const deviceTSSShare = new BN(generatePrivate()); const deviceTSSIndex = 2; const factorKey = new BN(generatePrivate()); @@ -597,17 +581,13 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { const sp = customSP; sp.verifierName = "torus-test-health"; sp.verifierId = "test18@example.com"; - const { postboxkey } = await fetchPostboxKeyAndSigs({ - serviceProvider: sp, - verifierName: sp.verifierName, - verifierId: sp.verifierId, - }); - sp.postboxKey = postboxkey; - await assignTssDkgKeys({ + const { signatures, serverDKGPrivKeys } = await setupTSS({ serviceProvider: sp, verifierName: sp.verifierName, verifierId: sp.verifierId, maxTSSNonceToSimulate: 2, + tssTag: "default", + MOCK_RSS, }); let userInput = new BN(keccak256("user answer blublu").slice(2), "hex"); From 773b4d2092b8311f5d977333e5eb3e98596dbe93 Mon Sep 17 00:00:00 2001 From: ieow Date: Wed, 10 May 2023 16:06:51 +0800 Subject: [PATCH 05/12] feat: tests pass with mock rss --- packages/default/test/tssShared.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/default/test/tssShared.js b/packages/default/test/tssShared.js index 27bb4b49..36854a32 100644 --- a/packages/default/test/tssShared.js +++ b/packages/default/test/tssShared.js @@ -334,7 +334,7 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { serviceProvider: sp, verifierName: sp.verifierName, verifierId: sp.verifierId, - maxTSSNonceToSimulate: 2, + maxTSSNonceToSimulate: 4, tssTag: "default", MOCK_RSS, }); From c4fb54cb8041603129dbe4de2a02dbe1dc0de9cc Mon Sep 17 00:00:00 2001 From: ieow Date: Mon, 15 May 2023 12:17:33 +0800 Subject: [PATCH 06/12] fix: using verifierID --- packages/default/test/helpers.js | 7 ++- .../default/test/tssBaseSPMockRss.test.js | 6 +-- packages/default/test/tssShared.js | 43 +++++++++---------- packages/default/test/tssTorusSP.test.js | 3 +- 4 files changed, 31 insertions(+), 28 deletions(-) diff --git a/packages/default/test/helpers.js b/packages/default/test/helpers.js index aef177b1..91e3edda 100644 --- a/packages/default/test/helpers.js +++ b/packages/default/test/helpers.js @@ -191,7 +191,7 @@ export async function setupTSS(opts) { const { serviceProvider, verifierName, verifierId, maxTSSNonceToSimulate, tssTag, MOCK_RSS } = opts; if (MOCK_RSS) { const { serverEndpoints, serverPubKeys, serverDKGPrivKeys, serverDKGPubKeys } = await setupTSSMocks({ - serviceProvider , + serviceProvider, verifierName, verifierId, maxTSSNonceToSimulate, @@ -222,3 +222,8 @@ export async function setupTSS(opts) { serverDKGPrivKeys, }; } + +export const generateVerifierId = (prefix = "") => { + const randomkey = generatePrivate().toString("hex"); + return `${prefix}${randomkey}@mail.com`; +}; diff --git a/packages/default/test/tssBaseSPMockRss.test.js b/packages/default/test/tssBaseSPMockRss.test.js index 77ab5579..c65163d3 100644 --- a/packages/default/test/tssBaseSPMockRss.test.js +++ b/packages/default/test/tssBaseSPMockRss.test.js @@ -31,10 +31,10 @@ const torusSp = new ServiceProviderBase({ const metadataURL = getMetadataUrl(); const torusSL = initStorageLayer({ hostUrl: metadataURL }); -describe.only(`TSS Test with BaseServiceProvider Mock Rss`, function () { +describe(`TSS Test with BaseServiceProvider Mock Rss`, function () { const MANUAL_SYNC = true; const MOCK_RSS = true; - describe.only(`TSS BaseServiceProvider Mock Rss with manualSync: ${MANUAL_SYNC}`, function () { + describe(`TSS BaseServiceProvider Mock Rss with manualSync: ${MANUAL_SYNC}`, function () { // eslint-disable-next-line mocha/no-setup-in-describe sharedTestCases(MANUAL_SYNC, torusSp, torusSL); @@ -42,7 +42,7 @@ describe.only(`TSS Test with BaseServiceProvider Mock Rss`, function () { tssSharedTests(MANUAL_SYNC, torusSp, torusSL, MOCK_RSS); }); - describe.only(`TSS BaseServiceProvider Mock Rss with manualSync: ${false}`, function () { + describe(`TSS BaseServiceProvider Mock Rss with manualSync: ${false}`, function () { // eslint-disable-next-line mocha/no-setup-in-describe sharedTestCases(false, torusSp, torusSL); diff --git a/packages/default/test/tssShared.js b/packages/default/test/tssShared.js index 36854a32..f5153747 100644 --- a/packages/default/test/tssShared.js +++ b/packages/default/test/tssShared.js @@ -11,22 +11,20 @@ import stringify from "json-stable-stringify"; import { keccak256 } from "web3-utils"; import ThresholdKey from "../src/index"; -import { - assignTssDkgKeys, - fetchPostboxKeyAndSigs, - getMetadataUrl, - getServiceProvider, - initStorageLayer, - isMocked, - setupTSS, - setupTSSMocks, -} from "./helpers"; +import { generateVerifierId, getMetadataUrl, setupTSS } from "./helpers"; const metadataURL = getMetadataUrl(); // eslint-disable-next-line mocha/no-exports export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { const customSP = torusSP; const customSL = storageLayer; + let verifierId; + + before(function () { + verifierId = generateVerifierId(); + console.log(verifierId) + }); + describe.only("TSS tests", function () { it("#should be able to refresh tss shares", async function () { const sp = customSP; @@ -36,7 +34,8 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { const deviceTSSIndex = 2; sp.verifierName = "torus-test-health"; - sp.verifierId = "test19@example.com"; + // expect new account, use new random verifierId + sp.verifierId = generateVerifierId(); const { signatures, serverDKGPrivKeys } = await setupTSS({ serviceProvider: sp, verifierName: sp.verifierName, @@ -47,14 +46,13 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { }); const testId = sp.getVerifierNameVerifierId(); - // const storageLayer = initStorageLayer({ hostUrl: metadataURL }); const tb1 = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); - // factor key needs to passed from outside of tKey const factorKey = new BN(generatePrivate()); const factorPub = getPubKeyPoint(factorKey); await tb1.initialize({ useTSS: true, factorPub, deviceTSSShare, deviceTSSIndex }); + await tb1.reconstructKey(); const newShare = await tb1.generateNewShare(); const reconstructedKey = await tb1.reconstructKey(); await tb1.syncLocalMetadataTransitions(); @@ -122,7 +120,8 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { const deviceTSSIndex = 3; sp.verifierName = "torus-test-health"; - sp.verifierId = "test@example.com"; + // expect new account, use new random verifierId + sp.verifierId = generateVerifierId(); // const { postboxkey } = await fetchPostboxKeyAndSigs({ // serviceProvider: sp, // verifierName: sp.verifierName, @@ -138,7 +137,6 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { MOCK_RSS, }); - // const storageLayer = initStorageLayer({ hostUrl: metadataURL }); const tb1 = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); // factor key needs to passed from outside of tKey @@ -168,7 +166,8 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { if (!sp.useTSS) this.skip(); sp.verifierName = "torus-test-health"; - sp.verifierId = "test18@example.com"; + // expect new account, use new random verifierId + sp.verifierId = generateVerifierId(); const { serverDKGPrivKeys } = await setupTSS({ serviceProvider: sp, @@ -183,7 +182,6 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { const deviceTSSShare = new BN(generatePrivate()); const deviceTSSIndex = 2; - // const storageLayer = initStorageLayer({ hostUrl: metadataURL }); const tb1 = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); // factor key needs to passed from outside of tKey @@ -217,7 +215,9 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { const deviceTSSIndex = 3; sp.verifierName = "torus-test-health"; - sp.verifierId = "test18@example.com"; + // expect new account, use new random verifierId + sp.verifierId = generateVerifierId(); + const { signatures, serverDKGPrivKeys } = await setupTSS({ serviceProvider: sp, verifierName: sp.verifierName, @@ -229,7 +229,6 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { const testId = sp.getVerifierNameVerifierId(); - const storageLayer = initStorageLayer({ hostUrl: metadataURL }); const tb1 = new ThresholdKey({ serviceProvider: sp, storageLayer, manualSync: mode }); // factor key needs to passed from outside of tKey @@ -328,7 +327,7 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { const deviceTSSShare = new BN(generatePrivate()); const deviceTSSIndex = 3; - sp.verifierName = "torus-test-health"; + sp.verifierName = verifierId; sp.verifierId = "test192@example.com"; const { signatures, serverDKGPrivKeys } = await setupTSS({ serviceProvider: sp, @@ -474,7 +473,7 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { const resp1 = await tb._initializeNewKey({ userInput, initializeModules: true }); sp.verifierName = "torus-test-health"; - sp.verifierId = "test18@example.com"; + sp.verifierId = verifierId; const { signatures, serverDKGPrivKeys } = await setupTSS({ serviceProvider: sp, verifierName: sp.verifierName, @@ -580,7 +579,7 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { const sp = customSP; sp.verifierName = "torus-test-health"; - sp.verifierId = "test18@example.com"; + sp.verifierId = verifierId; const { signatures, serverDKGPrivKeys } = await setupTSS({ serviceProvider: sp, verifierName: sp.verifierName, diff --git a/packages/default/test/tssTorusSP.test.js b/packages/default/test/tssTorusSP.test.js index 2d3e3180..211b0f80 100644 --- a/packages/default/test/tssTorusSP.test.js +++ b/packages/default/test/tssTorusSP.test.js @@ -30,10 +30,9 @@ const torusSp = new ServiceProviderTorus({ // }); const metadataURL = getMetadataUrl(); const torusSL = initStorageLayer({ hostUrl: metadataURL }); - describe.only(`TSS Test with TorusServiceProvider`, function () { const MANUAL_SYNC = true; - describe.only(`TSS TorusServiceProvider with manualSync: ${MANUAL_SYNC}`, function () { + describe(`TSS TorusServiceProvider with manualSync: ${MANUAL_SYNC}`, function () { // eslint-disable-next-line mocha/no-setup-in-describe sharedTestCases(MANUAL_SYNC, torusSp, torusSL); From 41393957b78a264b1338551254ccd177aa4d8333 Mon Sep 17 00:00:00 2001 From: ieow Date: Mon, 15 May 2023 17:45:16 +0800 Subject: [PATCH 07/12] fix: tss tests --- packages/default/test/tssShared.js | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/packages/default/test/tssShared.js b/packages/default/test/tssShared.js index f5153747..5cca6e81 100644 --- a/packages/default/test/tssShared.js +++ b/packages/default/test/tssShared.js @@ -327,8 +327,8 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { const deviceTSSShare = new BN(generatePrivate()); const deviceTSSIndex = 3; - sp.verifierName = verifierId; - sp.verifierId = "test192@example.com"; + sp.verifierName = "torus-test-health"; + sp.verifierId = verifierId; const { signatures, serverDKGPrivKeys } = await setupTSS({ serviceProvider: sp, verifierName: sp.verifierName, @@ -468,12 +468,9 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { it(`#should serialize and deserialize correctly without tkeyArgs, manualSync=${mode}`, async function () { if (!customSP.useTSS) this.skip(); const sp = customSP; - let userInput = new BN(keccak256("user answer blublu").slice(2), "hex"); - userInput = userInput.umod(ecCurve.curve.n); - const resp1 = await tb._initializeNewKey({ userInput, initializeModules: true }); - sp.verifierName = "torus-test-health"; sp.verifierId = verifierId; + const { signatures, serverDKGPrivKeys } = await setupTSS({ serviceProvider: sp, verifierName: sp.verifierName, @@ -483,6 +480,10 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { MOCK_RSS, }); + let userInput = new BN(keccak256("user answer blublu").slice(2), "hex"); + userInput = userInput.umod(ecCurve.curve.n); + const resp1 = await tb._initializeNewKey({ userInput, initializeModules: true }); + const deviceTSSShare = new BN(generatePrivate()); const deviceTSSIndex = 2; const factorKey = new BN(generatePrivate()); @@ -521,13 +522,10 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { }); it(`#should serialize and deserialize correctly with tkeyArgs, manualSync=${mode}`, async function () { if (!customSP.useTSS) this.skip(); - let userInput = new BN(keccak256("user answer blublu").slice(2), "hex"); - userInput = userInput.umod(ecCurve.curve.n); - const resp1 = await tb._initializeNewKey({ userInput, initializeModules: true }); const sp = customSP; sp.verifierName = "torus-test-health"; - sp.verifierId = "test18@example.com"; + sp.verifierId = verifierId; const { signatures, serverDKGPrivKeys } = await setupTSS({ serviceProvider: sp, verifierName: sp.verifierName, @@ -537,6 +535,10 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { MOCK_RSS, }); + let userInput = new BN(keccak256("user answer blublu").slice(2), "hex"); + userInput = userInput.umod(ecCurve.curve.n); + const resp1 = await tb._initializeNewKey({ userInput, initializeModules: true }); + const deviceTSSShare = new BN(generatePrivate()); const deviceTSSIndex = 2; const factorKey = new BN(generatePrivate()); @@ -580,6 +582,7 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { const sp = customSP; sp.verifierName = "torus-test-health"; sp.verifierId = verifierId; + const { signatures, serverDKGPrivKeys } = await setupTSS({ serviceProvider: sp, verifierName: sp.verifierName, From d8a25227291bb6e94282a22ffdba386e066cf5af Mon Sep 17 00:00:00 2001 From: ieow Date: Thu, 18 May 2023 16:10:48 +0800 Subject: [PATCH 08/12] fix: package.json, before test --- package.json | 2 +- packages/default/test/tssShared.js | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 6879d36c..1789d64d 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-simple-import-sort": "^8.0.0", + "eslint-plugin-simple-import-sort": "^10.0.0", "eslint-plugin-tsdoc": "^0.2.17", "form-data": "^4.0.0", "husky": "^8.0.2", diff --git a/packages/default/test/tssShared.js b/packages/default/test/tssShared.js index 5cca6e81..748352bb 100644 --- a/packages/default/test/tssShared.js +++ b/packages/default/test/tssShared.js @@ -20,12 +20,10 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { const customSL = storageLayer; let verifierId; - before(function () { - verifierId = generateVerifierId(); - console.log(verifierId) - }); - describe.only("TSS tests", function () { + before(function () { + verifierId = generateVerifierId(); + }); it("#should be able to refresh tss shares", async function () { const sp = customSP; if (!sp.useTSS) this.skip(); From 3ef089e212e43acc18d22281bbf46dfc8f89baee Mon Sep 17 00:00:00 2001 From: ieow Date: Thu, 18 May 2023 16:11:51 +0800 Subject: [PATCH 09/12] fix: remove test --- packages/default/test/tssShared.js | 2 +- packages/default/test/tssTorusSP.test.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/default/test/tssShared.js b/packages/default/test/tssShared.js index 748352bb..ef78245c 100644 --- a/packages/default/test/tssShared.js +++ b/packages/default/test/tssShared.js @@ -20,7 +20,7 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { const customSL = storageLayer; let verifierId; - describe.only("TSS tests", function () { + describe("TSS tests", function () { before(function () { verifierId = generateVerifierId(); }); diff --git a/packages/default/test/tssTorusSP.test.js b/packages/default/test/tssTorusSP.test.js index 211b0f80..9d255bf6 100644 --- a/packages/default/test/tssTorusSP.test.js +++ b/packages/default/test/tssTorusSP.test.js @@ -30,7 +30,7 @@ const torusSp = new ServiceProviderTorus({ // }); const metadataURL = getMetadataUrl(); const torusSL = initStorageLayer({ hostUrl: metadataURL }); -describe.only(`TSS Test with TorusServiceProvider`, function () { +describe(`TSS Test with TorusServiceProvider`, function () { const MANUAL_SYNC = true; describe(`TSS TorusServiceProvider with manualSync: ${MANUAL_SYNC}`, function () { // eslint-disable-next-line mocha/no-setup-in-describe @@ -40,7 +40,7 @@ describe.only(`TSS Test with TorusServiceProvider`, function () { tssSharedTests(MANUAL_SYNC, torusSp, torusSL); }); - describe.only(`TSS TorusServiceProvider with manualSync: ${false}`, function () { + describe(`TSS TorusServiceProvider with manualSync: ${false}`, function () { // eslint-disable-next-line mocha/no-setup-in-describe sharedTestCases(false, torusSp, torusSL); From c142a3d62002094f7ae54af813bee613d935d093 Mon Sep 17 00:00:00 2001 From: ieow Date: Fri, 19 May 2023 16:14:07 +0800 Subject: [PATCH 10/12] fix: remove redundant tests --- packages/default/test/tssBaseSPMockRss.test.js | 7 ------- packages/default/test/tssTorusSP.test.js | 7 ------- 2 files changed, 14 deletions(-) diff --git a/packages/default/test/tssBaseSPMockRss.test.js b/packages/default/test/tssBaseSPMockRss.test.js index c65163d3..db1e3242 100644 --- a/packages/default/test/tssBaseSPMockRss.test.js +++ b/packages/default/test/tssBaseSPMockRss.test.js @@ -3,7 +3,6 @@ import { ServiceProviderBase } from "@tkey/service-provider-base"; import { generatePrivate } from "@toruslabs/eccrypto"; import { getMetadataUrl, initStorageLayer } from "./helpers"; -import { sharedTestCases } from "./shared"; import { tssSharedTests } from "./tssShared"; const PRIVATE_KEY = generatePrivate().toString("hex"); @@ -35,17 +34,11 @@ describe(`TSS Test with BaseServiceProvider Mock Rss`, function () { const MANUAL_SYNC = true; const MOCK_RSS = true; describe(`TSS BaseServiceProvider Mock Rss with manualSync: ${MANUAL_SYNC}`, function () { - // eslint-disable-next-line mocha/no-setup-in-describe - sharedTestCases(MANUAL_SYNC, torusSp, torusSL); - // eslint-disable-next-line mocha/no-setup-in-describe tssSharedTests(MANUAL_SYNC, torusSp, torusSL, MOCK_RSS); }); describe(`TSS BaseServiceProvider Mock Rss with manualSync: ${false}`, function () { - // eslint-disable-next-line mocha/no-setup-in-describe - sharedTestCases(false, torusSp, torusSL); - // eslint-disable-next-line mocha/no-setup-in-describe tssSharedTests(false, torusSp, torusSL, MOCK_RSS); }); diff --git a/packages/default/test/tssTorusSP.test.js b/packages/default/test/tssTorusSP.test.js index 9d255bf6..fb28b4c5 100644 --- a/packages/default/test/tssTorusSP.test.js +++ b/packages/default/test/tssTorusSP.test.js @@ -3,7 +3,6 @@ import ServiceProviderTorus from "@tkey/service-provider-torus"; import { generatePrivate } from "@toruslabs/eccrypto"; import { getMetadataUrl, initStorageLayer } from "./helpers"; -import { sharedTestCases } from "./shared"; import { tssSharedTests } from "./tssShared"; const PRIVATE_KEY = generatePrivate().toString("hex"); @@ -33,17 +32,11 @@ const torusSL = initStorageLayer({ hostUrl: metadataURL }); describe(`TSS Test with TorusServiceProvider`, function () { const MANUAL_SYNC = true; describe(`TSS TorusServiceProvider with manualSync: ${MANUAL_SYNC}`, function () { - // eslint-disable-next-line mocha/no-setup-in-describe - sharedTestCases(MANUAL_SYNC, torusSp, torusSL); - // eslint-disable-next-line mocha/no-setup-in-describe tssSharedTests(MANUAL_SYNC, torusSp, torusSL); }); describe(`TSS TorusServiceProvider with manualSync: ${false}`, function () { - // eslint-disable-next-line mocha/no-setup-in-describe - sharedTestCases(false, torusSp, torusSL); - // eslint-disable-next-line mocha/no-setup-in-describe tssSharedTests(false, torusSp, torusSL); }); From fb93e1bf20f5cdcd96fee7de61531bd16bb0eb7b Mon Sep 17 00:00:00 2001 From: shubham <16849485+metallicalfa2@users.noreply.github.com> Date: Mon, 19 Jun 2023 16:19:18 +0800 Subject: [PATCH 11/12] fix: updated --- packages/default/test/tssBaseSPMockRss.test.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/default/test/tssBaseSPMockRss.test.js b/packages/default/test/tssBaseSPMockRss.test.js index db1e3242..e15ffc02 100644 --- a/packages/default/test/tssBaseSPMockRss.test.js +++ b/packages/default/test/tssBaseSPMockRss.test.js @@ -30,15 +30,14 @@ const torusSp = new ServiceProviderBase({ const metadataURL = getMetadataUrl(); const torusSL = initStorageLayer({ hostUrl: metadataURL }); -describe(`TSS Test with BaseServiceProvider Mock Rss`, function () { - const MANUAL_SYNC = true; +describe(`TSS Test with BaseServiceProvider Mock RSS`, function () { const MOCK_RSS = true; - describe(`TSS BaseServiceProvider Mock Rss with manualSync: ${MANUAL_SYNC}`, function () { + describe(`TSS BaseServiceProvider Mock RSS with manualSync: ${true}`, function () { // eslint-disable-next-line mocha/no-setup-in-describe - tssSharedTests(MANUAL_SYNC, torusSp, torusSL, MOCK_RSS); + tssSharedTests(true, torusSp, torusSL, MOCK_RSS); }); - describe(`TSS BaseServiceProvider Mock Rss with manualSync: ${false}`, function () { + describe(`TSS BaseServiceProvider Mock RSS with manualSync: ${false}`, function () { // eslint-disable-next-line mocha/no-setup-in-describe tssSharedTests(false, torusSp, torusSL, MOCK_RSS); }); From 3fcfde4744bc964aa0d2cfac50c91df58bb813a8 Mon Sep 17 00:00:00 2001 From: shubham <16849485+metallicalfa2@users.noreply.github.com> Date: Mon, 19 Jun 2023 16:24:27 +0800 Subject: [PATCH 12/12] fix: updated --- packages/default/test/tssShared.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/default/test/tssShared.js b/packages/default/test/tssShared.js index ef78245c..a0dd2933 100644 --- a/packages/default/test/tssShared.js +++ b/packages/default/test/tssShared.js @@ -21,6 +21,11 @@ export const tssSharedTests = (mode, torusSP, storageLayer, MOCK_RSS) => { let verifierId; describe("TSS tests", function () { + // TDOO: add tests + // 1. share transfer in case of TSS + // 2. Security questions in case of TSS + // 3. Metadata consistency of TSS tkey. for example, generate new share in TSS should update tkey as well, properly. + // 4. updating tkey shouldn't affect TSS. (2/3 -> 2/4 tkey shouldn't affect TSS ), add case for deletion as well before(function () { verifierId = generateVerifierId(); });